make short_description field mandatory if no excursion is set

testing
Christian Merten 2 months ago
parent 010cabb4d7
commit faa33e3bff
Signed by: christian.merten
GPG Key ID: D953D69721B948B3

@ -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:

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

@ -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)

@ -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('/')

Loading…
Cancel
Save