diff --git a/src/fellchensammlung/forms.py b/src/fellchensammlung/forms.py index dfd1571..cc52933 100644 --- a/src/fellchensammlung/forms.py +++ b/src/fellchensammlung/forms.py @@ -5,9 +5,8 @@ from .models import AdoptionNotice, Animal, Image, ReportAdoptionNotice, ReportC Comment, SexChoicesWithAll, DistanceChoices, SpeciesSpecificURL, RescueOrganization from django_registration.forms import RegistrationForm from crispy_forms.helper import FormHelper -from crispy_forms.layout import Submit, Layout, Fieldset, HTML, Row, Column, Field, Hidden +from crispy_forms.layout import Submit, Layout, Fieldset from django.utils.translation import gettext_lazy as _ -from notfellchen.settings import MEDIA_URL from crispy_forms.layout import Div from .tools.model_helpers import reason_for_signup_label, reason_for_signup_help_text, AdoptionNoticeStatusChoices diff --git a/src/fellchensammlung/migrations/0074_alter_animal_date_of_birth_and_more.py b/src/fellchensammlung/migrations/0074_alter_animal_date_of_birth_and_more.py new file mode 100644 index 0000000..10c0d11 --- /dev/null +++ b/src/fellchensammlung/migrations/0074_alter_animal_date_of_birth_and_more.py @@ -0,0 +1,104 @@ +# Generated by Django 5.2.8 on 2026-01-20 21:09 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("fellchensammlung", "0073_adoption_notice_status_successful"), + ] + + operations = [ + migrations.AlterField( + model_name="animal", + name="date_of_birth", + field=models.DateField(blank=True, null=True, verbose_name="Geburtsdatum"), + ), + migrations.AlterField( + model_name="historicalanimal", + name="date_of_birth", + field=models.DateField(blank=True, null=True, verbose_name="Geburtsdatum"), + ), + migrations.AlterField( + model_name="historicalrescueorganization", + name="external_object_identifier", + field=models.CharField( + blank=True, + help_text="Id des Objekts in der externen Datenbank (kann leer gelassen werden)", + max_length=200, + null=True, + verbose_name="External Object Identifier", + ), + ), + migrations.AlterField( + model_name="historicalrescueorganization", + name="external_source_identifier", + field=models.CharField( + blank=True, + choices=[("OSM", "Open Street Map")], + help_text="Name der Datenbank aus der die Tierschutzorganisation importiert wurde (kann leer gelassen werden)", + max_length=200, + null=True, + verbose_name="External Source Identifier", + ), + ), + migrations.AlterField( + model_name="historicalrescueorganization", + name="parent_org", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="fellchensammlung.rescueorganization", + verbose_name="Übergeordnete Organisation", + ), + ), + migrations.AlterField( + model_name="rescueorganization", + name="external_object_identifier", + field=models.CharField( + blank=True, + help_text="Id des Objekts in der externen Datenbank (kann leer gelassen werden)", + max_length=200, + null=True, + verbose_name="External Object Identifier", + ), + ), + migrations.AlterField( + model_name="rescueorganization", + name="external_source_identifier", + field=models.CharField( + blank=True, + choices=[("OSM", "Open Street Map")], + help_text="Name der Datenbank aus der die Tierschutzorganisation importiert wurde (kann leer gelassen werden)", + max_length=200, + null=True, + verbose_name="External Source Identifier", + ), + ), + migrations.AlterField( + model_name="rescueorganization", + name="parent_org", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="fellchensammlung.rescueorganization", + verbose_name="Übergeordnete Organisation", + ), + ), + migrations.AlterField( + model_name="speciesspecificurl", + name="rescue_organization", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="species_specific_urls", + to="fellchensammlung.rescueorganization", + verbose_name="Tierschutzorganisation", + ), + ), + ] diff --git a/src/fellchensammlung/models.py b/src/fellchensammlung/models.py index 0d15d93..d8a0b43 100644 --- a/src/fellchensammlung/models.py +++ b/src/fellchensammlung/models.py @@ -168,11 +168,13 @@ class RescueOrganization(models.Model): description = models.TextField(null=True, blank=True, verbose_name=_('Beschreibung')) # Markdown allowed external_object_identifier = models.CharField(max_length=200, null=True, blank=True, verbose_name=_('External Object Identifier'), - help_text=_("Id des Objekts in der externen Datenbank (kann leer gelassen werden)")) + help_text=_( + "Id des Objekts in der externen Datenbank (kann leer gelassen werden)")) external_source_identifier = models.CharField(max_length=200, null=True, blank=True, choices=ExternalSourceChoices.choices, verbose_name=_('External Source Identifier'), - help_text=_("Name der Datenbank aus der die Tierschutzorganisation importiert wurde (kann leer gelassen werden)")) + help_text=_( + "Name der Datenbank aus der die Tierschutzorganisation importiert wurde (kann leer gelassen werden)")) exclude_from_check = models.BooleanField(default=False, verbose_name=_('Von Prüfung ausschließen'), help_text=_("Organisation von der manuellen Überprüfung ausschließen, " "z.B. weil Tiere nicht online geführt werden")) @@ -185,7 +187,8 @@ class RescueOrganization(models.Model): ongoing_communication = models.BooleanField(default=False, verbose_name=_('In aktiver Kommunikation'), help_text=_( "Es findet gerade Kommunikation zwischen Notfellchen und der Organisation statt.")) - parent_org = models.ForeignKey("RescueOrganization", on_delete=models.PROTECT, blank=True, null=True, verbose_name=_("Übergeordnete Organisation")) + parent_org = models.ForeignKey("RescueOrganization", on_delete=models.PROTECT, blank=True, null=True, + verbose_name=_("Übergeordnete Organisation")) # allows to specify if a rescue organization has a specialization for dedicated species specializations = models.ManyToManyField(Species, blank=True) twenty_id = models.UUIDField(verbose_name=_("Twenty-ID"), null=True, blank=True, @@ -634,7 +637,7 @@ class Animal(models.Model): verbose_name = _('Tier') verbose_name_plural = _('Tiere') - date_of_birth = models.DateField(verbose_name=_('Geburtsdatum')) + date_of_birth = models.DateField(verbose_name=_('Geburtsdatum'), null=True, blank=True) name = models.CharField(max_length=200, verbose_name=_('Name')) description = models.TextField(null=True, blank=True, verbose_name=_('Beschreibung')) species = models.ForeignKey(Species, on_delete=models.PROTECT, verbose_name=_("Tierart")) @@ -655,12 +658,18 @@ class Animal(models.Model): @property def age(self): - return timezone.now().today().date() - self.date_of_birth + if self.date_of_birth: + return timezone.now().today().date() - self.date_of_birth + else: + return None @property def hr_age(self): """Returns a human-readable age based on the date of birth.""" - return misc.age_as_hr_string(self.age) + if self.date_of_birth: + return misc.age_as_hr_string(self.age) + else: + return _("Unbekannt") def get_photo(self): """