diff --git a/src/.coveragerc b/src/.coveragerc index c87daf4d0d..0617a487c8 100644 --- a/src/.coveragerc +++ b/src/.coveragerc @@ -1,10 +1,11 @@ [run] source = pretix -omit = */migrations/*,*/urls.py,*/tests/*,*/testdummy/*,*/admin.py,*/mt940.py +omit = */migrations/*,*/urls.py,*/tests/*,*/testdummy/*,*/admin.py,*/mt940.py,pretix/wsgi.py,pretix/settings.py [report] exclude_lines = pragma: no cover def __str__ + der __repr__ if settings.DEBUG NOQA diff --git a/src/pretix/base/i18n.py b/src/pretix/base/i18n.py index 8a2e2f9f35..fdca837d32 100644 --- a/src/pretix/base/i18n.py +++ b/src/pretix/base/i18n.py @@ -56,7 +56,7 @@ class LazyI18nString: def __repr__(self): return '' % repr(self.data) - def __lt__(self, other): + def __lt__(self, other): # NOQA return str(self) < str(other) @@ -209,7 +209,7 @@ class I18nFieldMixin: return json.dumps({k: v for k, v in value.items() if v}, sort_keys=True) return value - def get_prep_lookup(self, lookup_type, value): + def get_prep_lookup(self, lookup_type, value): # NOQA raise TypeError('Lookups on i18n string currently not supported.') def formfield(self, **kwargs): diff --git a/src/pretix/base/middleware.py b/src/pretix/base/middleware.py index 427c0a566f..14c6c4fe96 100644 --- a/src/pretix/base/middleware.py +++ b/src/pretix/base/middleware.py @@ -32,7 +32,7 @@ class LocaleMiddleware(BaseLocaleMiddleware): else: language = request.event.settings.locale for lang in request.event.settings.locales: - if lang == firstpart or lang.startswith(firstpart + '-'): + if lang.startswith(firstpart + '-'): language = lang break translation.activate(language) @@ -107,7 +107,7 @@ def get_language_from_browser(request) -> str: def get_default_language(): try: return get_supported_language_variant(settings.LANGUAGE_CODE) - except LookupError: + except LookupError: # NOQA return settings.LANGUAGE_CODE diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index b13aa883f6..ab1c10d02d 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -38,10 +38,10 @@ class Versionable(BaseVersionable): a performance optimization for cases in which we have to handle the Many2Many relations by hand anyways. """ - if not self.pk: + if not self.pk: # NOQA raise ValueError('Instance must be saved before it can be cloned') - if self.version_end_date: + if self.version_end_date: # NOQA raise ValueError('This is a historical item and can not be cloned.') if forced_version_date: @@ -112,7 +112,8 @@ class UserManager(BaseUserManager): user.save() return user - def create_superuser(self, identifier, password=None): + def create_superuser(self, identifier, password=None): # NOQA + # Not used in the software but required by Django if password is None: raise Exception("You must provide a password") user = self.model(identifier=identifier, email=identifier) @@ -287,7 +288,7 @@ class User(AbstractBaseUser, PermissionsMixin): return self.username if self.email: return self.email - return self.identifier + return self.identifier # NOQA class Organizer(Versionable): diff --git a/src/tests/base/test_middleware.py b/src/tests/base/test_middleware.py index 375a832892..f7a61a6d48 100644 --- a/src/tests/base/test_middleware.py +++ b/src/tests/base/test_middleware.py @@ -70,3 +70,39 @@ class LocaleDeterminationTest(TestCase): response = c.get('/control/login') language = response['Content-Language'] self.assertEqual(language, self.TEST_LOCALE) + + def test_event_allowed(self): + self.event.settings.set('locales', ['de', 'en']) + c = Client() + cookies = c.cookies + cookies[settings.LANGUAGE_COOKIE_NAME] = 'de' + response = c.get('/dummy/dummy/') + language = response['Content-Language'] + self.assertEqual(language, 'de') + + def test_event_fallback_to_short(self): + self.event.settings.set('locales', ['de']) + c = Client() + cookies = c.cookies + cookies[settings.LANGUAGE_COOKIE_NAME] = 'de-informal' + response = c.get('/dummy/dummy/') + language = response['Content-Language'] + self.assertEqual(language, 'de') + + def test_event_fallback_to_long(self): + self.event.settings.set('locales', ['de-informal']) + c = Client() + cookies = c.cookies + cookies[settings.LANGUAGE_COOKIE_NAME] = 'de' + response = c.get('/dummy/dummy/') + language = response['Content-Language'] + self.assertEqual(language, 'de-informal') + + def test_event_not_allowed(self): + self.event.settings.set('locales', ['en']) + c = Client() + cookies = c.cookies + cookies[settings.LANGUAGE_COOKIE_NAME] = 'de' + response = c.get('/dummy/dummy/') + language = response['Content-Language'] + self.assertEqual(language, 'en') diff --git a/src/tests/base/test_models.py b/src/tests/base/test_models.py index 64d1295608..7f7b1a3fac 100644 --- a/src/tests/base/test_models.py +++ b/src/tests/base/test_models.py @@ -177,6 +177,34 @@ class UserTestCase(TestCase): u.save() self.assertEqual(u.identifier, "test@example.com") + def test_name(self): + o = Organizer.objects.create(name='Dummy', slug='dummy') + event = Event.objects.create( + organizer=o, name='Dummy', slug='dummy', + date_from=now(), + ) + u = User.objects.create_local_user(event, 'test', 'test') + self.assertEqual(u.get_local_name(), 'test') + u.givenname = "Christopher" + u.familyname = "Nolan" + u.set_password("test") + u.save() + self.assertEqual(u.get_full_name(), 'Nolan, Christopher') + self.assertEqual(u.get_short_name(), 'Christopher') + u.givenname = None + u.save() + self.assertEqual(u.get_full_name(), 'Nolan') + self.assertEqual(u.get_short_name(), 'Nolan') + u.givenname = "Christopher" + u.familyname = None + u.save() + self.assertEqual(u.get_full_name(), 'Christopher') + self.assertEqual(u.get_short_name(), 'Christopher') + u.givenname = None + u.save() + self.assertEqual(u.get_full_name(), 'test') + self.assertEqual(u.get_short_name(), 'test') + class BaseQuotaTestCase(TestCase): diff --git a/src/tests/base/test_settings.py b/src/tests/base/test_settings.py index eca0e3ad72..b3dd452016 100644 --- a/src/tests/base/test_settings.py +++ b/src/tests/base/test_settings.py @@ -1,6 +1,8 @@ from datetime import date, datetime, time from decimal import Decimal +from django.core.files import File +from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase from django.utils.timezone import now @@ -22,6 +24,14 @@ class SettingsTestCase(TestCase): date_from=now(), ) + def test_organizer_set_explicit(self): + self.organizer.settings.test = 'foo' + self.assertEqual(self.organizer.settings.test, 'foo') + + # Reload object + self.organizer = Organizer.objects.get(identity=self.organizer.identity) + self.assertEqual(self.organizer.settings.test, 'foo') + def test_event_set_explicit(self): self.event.settings.test = 'foo' self.assertEqual(self.event.settings.test, 'foo') @@ -153,6 +163,20 @@ class SettingsTestCase(TestCase): except TypeError: pass + def test_serialize_file(self): + val = SimpleUploadedFile("sample_invalid_image.jpg", b"file_content", content_type="image/jpeg") + self.event.settings.set('test', val) + self.event.settings._flush() + self.assertIsInstance(self.event.settings.get('test', as_type=File), File) + self.assertTrue(self.event.settings.get('test', as_type=File).name.endswith(val.name)) + + def test_detect_file_value(self): + val = SimpleUploadedFile("sample_invalid_image.jpg", b"file_content", content_type="image/jpeg") + self.event.settings.set('test', val) + self.event.settings._flush() + self.assertIsInstance(self.event.settings.get('test'), File) + self.assertTrue(self.event.settings.get('test').name.endswith(val.name)) + def _test_serialization(self, val, as_type): self.event.settings.set('test', val) self.event.settings._flush() diff --git a/src/tests/media/.gitkeep b/src/tests/media/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/tests/media/sample_invalid_image.jpg b/src/tests/media/sample_invalid_image.jpg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/tests/settings.py b/src/tests/settings.py index 9181c0646a..0de54939d1 100644 --- a/src/tests/settings.py +++ b/src/tests/settings.py @@ -7,3 +7,5 @@ TEMPLATES[0]['DIRS'].append(os.path.join(TEST_DIR, 'templates')) INSTALLED_APPS = INSTALLED_APPS + ( 'tests.testdummy', ) + +MEDIA_ROOT = os.path.join(TEST_DIR, 'media')