kopia lustrzana https://github.com/OpenDroneMap/WebODM
Settings unit test
rodzic
63be0b100b
commit
ad46350efb
|
@ -71,18 +71,16 @@ def boot():
|
|||
Preset.objects.get_or_create(name='Default', system=True, options=[{'name': 'dsm', 'value': True}])
|
||||
|
||||
# Add settings
|
||||
# Setting.objects.all().delete()
|
||||
# Theme.objects.all().delete()
|
||||
|
||||
default_theme, created = Theme.objects.get_or_create(name='Default')
|
||||
if created:
|
||||
logger.info("Created default theme")
|
||||
|
||||
if Setting.objects.all().count() == 0:
|
||||
default_logo = os.path.join('app', 'static', 'app', 'img', 'logo512.png')
|
||||
|
||||
s = Setting.objects.create(
|
||||
app_name='WebODM',
|
||||
theme=default_theme)
|
||||
default_logo = os.path.join('app', 'static', 'app', 'img', 'logo512.png')
|
||||
s.app_logo.save(os.path.basename(default_logo), File(open(default_logo, 'rb')))
|
||||
|
||||
logger.info("Created settings")
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import logging
|
||||
import os
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db.models import signals
|
||||
from django.db import models
|
||||
from django.dispatch import receiver
|
||||
|
@ -8,6 +9,10 @@ from imagekit.models import ImageSpecField
|
|||
from imagekit.processors import ResizeToFit
|
||||
from pathlib import Path
|
||||
|
||||
from shutil import rmtree
|
||||
|
||||
from webodm import settings
|
||||
|
||||
from .theme import Theme
|
||||
|
||||
logger = logging.getLogger('app.logger')
|
||||
|
@ -30,20 +35,61 @@ class Setting(models.Model):
|
|||
theme = models.ForeignKey(Theme, blank=False, null=False, on_delete=models.DO_NOTHING,
|
||||
help_text="Active theme")
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Setting, self).__init__(*args, **kwargs)
|
||||
|
||||
# To help keep track of changes to the app_logo
|
||||
self.__original_app_logo_name = self.app_logo.name
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# Cleanup old logo files if needed
|
||||
if self.__original_app_logo_name != "" and \
|
||||
self.app_logo.name != self.__original_app_logo_name:
|
||||
|
||||
old_logo_path = os.path.join(settings.MEDIA_ROOT, self.__original_app_logo_name)
|
||||
old_logo_path_caches = os.path.join(settings.MEDIA_ROOT,
|
||||
"CACHE",
|
||||
"images",
|
||||
os.path.splitext(self.__original_app_logo_name)[0])
|
||||
|
||||
if os.path.exists(old_logo_path):
|
||||
try:
|
||||
os.unlink(old_logo_path)
|
||||
logger.info("Removed {}".format(old_logo_path))
|
||||
except:
|
||||
logger.warning("Cannot cleanup {}".format(old_logo_path))
|
||||
|
||||
if os.path.exists(old_logo_path_caches):
|
||||
try:
|
||||
rmtree(old_logo_path_caches)
|
||||
logger.info("Removed {}".format(old_logo_path_caches))
|
||||
except:
|
||||
logger.warning("Cannot cleanup {}".format(old_logo_path_caches))
|
||||
|
||||
self.__original_app_logo_name = self.app_logo.name
|
||||
|
||||
super(Setting, self).save(*args, **kwargs)
|
||||
|
||||
def __str__(self):
|
||||
return "Application"
|
||||
|
||||
|
||||
@receiver(signals.pre_save, sender=Setting, dispatch_uid="setting_pre_save")
|
||||
def setting_pre_save(sender, instance, **kwargs):
|
||||
if Setting.objects.count() > 0 and instance.id != Setting.objects.get().id:
|
||||
raise ValidationError("Can only create 1 %s instance" % Setting.__name__)
|
||||
|
||||
|
||||
@receiver(signals.post_save, sender=Setting, dispatch_uid="setting_post_save")
|
||||
def setting_post_save(sender, instance, created, **kwargs):
|
||||
"""
|
||||
Touch theme.scss to invalidate its cache and force
|
||||
compressor to regenerate it
|
||||
"""
|
||||
|
||||
theme_file = os.path.join('app', 'static', 'app', 'css', 'theme.scss')
|
||||
try:
|
||||
Path(theme_file).touch()
|
||||
logger.info("Touched {}".format(theme_file))
|
||||
except:
|
||||
logger.warning("Failed to touch {}".format(theme_file))
|
||||
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
import os
|
||||
|
||||
from django import db
|
||||
from django.contrib.auth.models import User
|
||||
from django.test import TestCase
|
||||
from django.test import TransactionTestCase
|
||||
from shutil import rmtree
|
||||
|
||||
from app.boot import boot
|
||||
from app.models import Project
|
||||
from webodm import settings
|
||||
|
||||
|
||||
def setupUsers():
|
||||
|
@ -36,6 +40,15 @@ def setupProjects():
|
|||
description="This is a test project"
|
||||
)
|
||||
|
||||
|
||||
def cleanup():
|
||||
if settings.TESTING and \
|
||||
os.path.exists(settings.MEDIA_ROOT) and \
|
||||
"_test" in settings.MEDIA_ROOT[-6:]:
|
||||
rmtree(settings.MEDIA_ROOT)
|
||||
print("Cleaned " + settings.MEDIA_ROOT)
|
||||
|
||||
|
||||
class BootTestCase(TestCase):
|
||||
'''
|
||||
This class provides optional default mock data as well as
|
||||
|
@ -48,6 +61,7 @@ class BootTestCase(TestCase):
|
|||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
super(BootTestCase, cls).setUpTestData()
|
||||
cleanup()
|
||||
boot()
|
||||
setupUsers()
|
||||
setupProjects()
|
||||
|
@ -63,6 +77,7 @@ class BootTransactionTestCase(TransactionTestCase):
|
|||
'''
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
cleanup()
|
||||
boot()
|
||||
setupUsers()
|
||||
setupProjects()
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
import os
|
||||
|
||||
from django.contrib.auth.models import User, Group
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.files import File
|
||||
from django.test import Client
|
||||
from shutil import rmtree
|
||||
|
||||
from app.models import Setting
|
||||
from app.models import Theme
|
||||
from .classes import BootTestCase
|
||||
|
||||
from app.contexts.settings import load as load_settings
|
||||
from webodm import settings as webodm_settings
|
||||
|
||||
class TestSettings(BootTestCase):
|
||||
|
||||
def setUp(self):
|
||||
pass
|
||||
|
||||
def tearDown(self):
|
||||
pass
|
||||
|
||||
def test_settings(self):
|
||||
# There should always be a Setting object
|
||||
self.assertTrue(Setting.objects.count() == 1, "There's a settings object")
|
||||
|
||||
# There should be "default" Theme object
|
||||
self.assertTrue(Theme.objects.filter(name="Default").count() == 1, "Default theme found")
|
||||
|
||||
# The default settings use the default theme
|
||||
self.assertTrue(Setting.objects.first().theme.id == Theme.objects.get(name="Default").id, "Default theme is associated to settings")
|
||||
|
||||
# We can create a new theme object
|
||||
second_theme = Theme.objects.create(name="Second")
|
||||
|
||||
# We cannot add another setting objects
|
||||
with self.assertRaises(ValidationError):
|
||||
Setting.objects.create(app_name="Test", theme=second_theme)
|
||||
|
||||
# We can retrieve the settings
|
||||
settings = load_settings()['SETTINGS']
|
||||
self.assertTrue(settings is not None, "Can retrieve settings")
|
||||
|
||||
# The default logo has been created in the proper destination
|
||||
default_logo_path = os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo.name)
|
||||
self.assertTrue(os.path.exists(default_logo_path), "Default logo exists in MEDIA_ROOT/settings")
|
||||
|
||||
# Access smaller logo (should generate a cached copy),
|
||||
# and check that's been created
|
||||
print("Access: " + settings.app_logo_favicon.url)
|
||||
favicon_path = os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo_favicon.name)
|
||||
self.assertTrue(os.path.exists(favicon_path), "Favicon logo exists")
|
||||
|
||||
# We can update the logo
|
||||
logo = os.path.join('app', 'static', 'app', 'img', 'favicon.png')
|
||||
settings.app_logo.save(os.path.basename(logo), File(open(logo, 'rb')))
|
||||
settings.save()
|
||||
|
||||
# The main logo has been uploaded
|
||||
self.assertTrue("favicon" in settings.app_logo.name, "Logo has been updated")
|
||||
self.assertTrue(os.path.exists(os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo.name)),
|
||||
"New logo exists in MEDIA_ROOT/settings")
|
||||
|
||||
# The old logo does not exist anymore
|
||||
self.assertFalse(os.path.exists(default_logo_path),
|
||||
"Old logo has been deleted")
|
||||
|
||||
# The old logo caches are gone also
|
||||
self.assertFalse(os.path.exists(favicon_path), "Favicon logo has been removed")
|
||||
|
||||
# Resized images have not been created yet
|
||||
self.assertFalse(os.path.exists(os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo_36.name)), "Resized logo does not exist")
|
||||
|
||||
# When we access its URL, it gets created (lazy)
|
||||
print("Access: " + settings.app_logo_36.url)
|
||||
|
||||
self.assertTrue(os.path.exists(os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo_36.name)), "Resized logo does not exist")
|
||||
|
||||
c = Client()
|
||||
|
||||
|
Ładowanie…
Reference in New Issue