diff --git a/jdav_web/finance/admin.py b/jdav_web/finance/admin.py index 14e76eb..308e9e3 100644 --- a/jdav_web/finance/admin.py +++ b/jdav_web/finance/admin.py @@ -65,7 +65,7 @@ def decorate_statement_view(model, perm=None): @admin.register(Statement) class StatementAdmin(CommonAdminMixin, admin.ModelAdmin): fields = ['short_description', 'explanation', 'excursion', 'status'] - list_display = ['__str__', 'excursion', 'total_pretty', 'created_by', 'submitted_date', 'is_valid', 'status_badge'] + list_display = ['__str__', 'total_pretty', 'created_by', 'submitted_date', 'is_valid', 'status_badge'] list_filter = ['status'] search_fields = ('excursion__name', 'short_description') ordering = ['-submitted_date'] @@ -90,6 +90,16 @@ class StatementAdmin(CommonAdminMixin, admin.ModelAdmin): obj.created_by = request.user.member super().save_model(request, obj, form, change) + def get_fields(self, request, obj=None): + if obj is not None and obj.excursion: + # if the object exists and an excursion is set, show the excursion (read only) + # instead of the short description + return ['excursion', 'explanation', 'status'] + else: + # if the object is newly created or no excursion is set, require + # a short description + return ['short_description', 'explanation', 'status'] + def get_readonly_fields(self, request, obj=None): readonly_fields = ['status', 'excursion'] if obj is not None and obj.submitted: diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index 4895706..4dfdc5a 100644 --- a/jdav_web/finance/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/finance/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-10-12 11:37+0200\n" +"POT-Creation-Date: 2025-10-16 23:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -48,10 +48,6 @@ msgstr "Kostenübersicht" msgid "Submit statement" msgstr "Rechnung einreichen" -#: finance/admin.py -msgid "Length" -msgstr "Länge" - #: finance/admin.py #, python-format msgid "%(name)s is not yet submitted." @@ -180,6 +176,10 @@ msgstr "Bestätigung zurücknehmen" msgid "Download summary" msgstr "Beleg herunterladen" +#: finance/admin.py +msgid "Length" +msgstr "Länge" + #: finance/apps.py msgid "Finance" msgstr "Finanzen" @@ -291,11 +291,6 @@ msgstr "Abrechnung" msgid "Statements" msgstr "Abrechnungen" -#: finance/models.py -#, python-format -msgid "Statement: %(excursion)s" -msgstr "Abrechnung: %(excursion)s" - #: finance/models.py #, python-format msgid "Excursion %(excursion)s" diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py index 13d68e0..4d3b946 100644 --- a/jdav_web/finance/models.py +++ b/jdav_web/finance/models.py @@ -62,7 +62,7 @@ class Statement(CommonModel): short_description = models.CharField(verbose_name=_('Short description'), max_length=30, - blank=True) + blank=False) explanation = models.TextField(verbose_name=_('Explanation'), blank=True) excursion = models.OneToOneField(Freizeit, verbose_name=_('Associated excursion'), @@ -129,12 +129,6 @@ class Statement(CommonModel): 'delete_obj': not_submitted & (is_creator | leads_excursion | has_global_perm('finance.delete_global_statement')), } - def __str__(self): - if self.excursion is not None: - return _('Statement: %(excursion)s') % {'excursion': str(self.excursion)} - else: - return self.short_description - @property def title(self): if self.excursion is not None: @@ -142,6 +136,9 @@ class Statement(CommonModel): else: return self.short_description + def __str__(self): + return str(self.title) + @property def submitted(self): return self.status == Statement.SUBMITTED or self.status == Statement.CONFIRMED @@ -664,7 +661,7 @@ class StatementConfirmed(Statement): class Bill(CommonModel): statement = models.ForeignKey(Statement, verbose_name=_('Statement'), on_delete=models.CASCADE) - short_description = models.CharField(verbose_name=_('Short description'), max_length=30) + short_description = models.CharField(verbose_name=_('Short description'), max_length=30, blank=False) explanation = models.TextField(verbose_name=_('Explanation'), blank=True) amount = models.DecimalField(verbose_name=_('Amount'), max_digits=6, decimal_places=2, default=0) diff --git a/jdav_web/finance/tests/admin.py b/jdav_web/finance/tests/admin.py index 38a62c0..996074d 100644 --- a/jdav_web/finance/tests/admin.py +++ b/jdav_web/finance/tests/admin.py @@ -102,6 +102,14 @@ class StatementUnSubmittedAdminTestCase(AdminTestCase): request.user = self.superuser self.assertTrue(self.admin.has_delete_permission(request, self.statement)) + def test_get_fields(self): + """Test get_fields when excursion is set or not set.""" + request = self.factory.post('/') + request.user = self.superuser + self.assertIn('excursion', self.admin.get_fields(request, self.statement_with_excursion)) + self.assertNotIn('excursion', self.admin.get_fields(request, self.statement)) + self.assertNotIn('excursion', self.admin.get_fields(request)) + def test_get_inlines(self): """Test get_inlines""" request = self.factory.post('/')