From da057c02a72dfe17b0c7fb3f8f9a8b2fedc20d19 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 11 Jan 2021 14:04:19 +0100 Subject: Add grammatical gender to organizations --- docs/fr/source/annexe-tech-3-variables-gen.rst | 3 +- docs/generate_values_doc.py | 5 +- ishtar_common/admin.py | 3 ++ ishtar_common/forms_common.py | 7 ++- .../migrations/0211_auto_20210111_1321.py | 25 ++++++++++ ishtar_common/models.py | 54 +++++++++++++--------- ishtar_common/models_common.py | 7 ++- 7 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 ishtar_common/migrations/0211_auto_20210111_1321.py diff --git a/docs/fr/source/annexe-tech-3-variables-gen.rst b/docs/fr/source/annexe-tech-3-variables-gen.rst index 88924c50b..5dc5a9d75 100644 --- a/docs/fr/source/annexe-tech-3-variables-gen.rst +++ b/docs/fr/source/annexe-tech-3-variables-gen.rst @@ -7,7 +7,7 @@ Annexe technique 3 - Variables ============================== :Auteurs: Étienne Loks, Ishtar team -:Date: 2021-01-08 +:Date: 2021-01-11 :Copyright: CC-BY 3.0 :Ishtar Version: v3.1.0 @@ -144,6 +144,7 @@ Chaque organisation dispose des :ref:`champs adresse `, - **cached_label** : *Texte* - Nom en cache - **files__** : *→ Dossiers archéologiques (organisation)* - **general_contractor_files__** : *→ Dossiers archéologiques (organisation de l'aménageur)* +- **grammatical_gender** : *Chaîne de caractères (1)* - Grammatical gender - "M": Male ; "F": Female ; "N": Neutral - **members__** : *→ Personnes (est rattaché à)* - **name** : *Chaîne de caractères (500)* - Nom - **operation_applicant_authority__** : *→ Opérations (autorité requérante)* diff --git a/docs/generate_values_doc.py b/docs/generate_values_doc.py index ed13f5c21..73dc41f5e 100644 --- a/docs/generate_values_doc.py +++ b/docs/generate_values_doc.py @@ -74,7 +74,10 @@ def get_values(tpl_model, model, excluded, model_types): help_text = "" if getattr(field, "help_text", None): - help_text = str(field.help_text) + h = field.help_text + if callable(h): + h = h() + help_text = str(h) if getattr(field, "related_model", None): key = field.name + "__" diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 269c12927..75e79b714 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -388,6 +388,9 @@ class OrganizationAdmin(HistorizedObjectAdmin): search_fields = ('name',) exclude = ('merge_key', 'merge_exclusion', 'merge_candidate', ) model = models.Organization + form = make_ajax_form( + model, {'precise_town': 'town'} + ) admin_site.register(models.Organization, OrganizationAdmin) diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index e15a4ef23..96a473c28 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -339,6 +339,10 @@ class OrganizationForm(ManageOldType, NewItemForm): organization_type = forms.ChoiceField(label=_("Organization type"), choices=[]) url = forms.URLField(label=_("Web address"), required=False) + grammatical_gender = forms.ChoiceField( + label=_("Grammatical gender"), + choices=[('', '--')] + list(models.GENDER), + required=False, help_text=_("Can be used by templates")) address = forms.CharField(label=_("Address"), widget=forms.Textarea, required=False) address_complement = forms.CharField(label=_("Address complement"), @@ -536,7 +540,8 @@ class BaseOrganizationForm(forms.ModelForm): class Meta: model = models.Organization - fields = ['name', 'organization_type', 'address', 'address_complement', + fields = ['name', 'organization_type', + 'grammatical_gender', 'address', 'address_complement', 'town', 'postal_code'] diff --git a/ishtar_common/migrations/0211_auto_20210111_1321.py b/ishtar_common/migrations/0211_auto_20210111_1321.py new file mode 100644 index 000000000..eb47992ad --- /dev/null +++ b/ishtar_common/migrations/0211_auto_20210111_1321.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2021-01-11 13:21 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ishtar_common', '0210_auto_20210106_1127'), + ] + + operations = [ + migrations.AddField( + model_name='historicalorganization', + name='grammatical_gender', + field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female'), ('N', 'Neutral')], default='', max_length=1, verbose_name='Grammatical gender'), + ), + migrations.AddField( + model_name='organization', + name='grammatical_gender', + field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female'), ('N', 'Neutral')], default='', max_length=1, verbose_name='Grammatical gender'), + ), + ] diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 98546c727..e9ab2b878 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -1733,10 +1733,29 @@ GENDER = ( ) -class GenderedType(GeneralType): +def documentation_get_gender_values(): + doc = "" + for idx, gender in enumerate(GENDER): + key, label = gender + if idx: + doc += " ;" + doc += ' "{}": {}'.format(key, label) + return doc + + +class BaseGenderedType(ValueGetter): + @classmethod + def get_values(self, prefix='', **kwargs): + dct = super(BaseGenderedType, self).get_values(prefix=prefix, **kwargs) + assert hasattr(self, "grammatical_gender") + dct[prefix + "grammatical_gender"] = self.grammatical_gender + return dct + + +class GenderedType(BaseGenderedType, GeneralType): grammatical_gender = models.CharField( _("Grammatical gender"), max_length=1, choices=GENDER, - blank=True, default="") + blank=True, default="", help_text=documentation_get_gender_values) class Meta: abstract = True @@ -1748,24 +1767,9 @@ class GenderedType(GeneralType): """ doc = super(GenderedType, cls).get_documentation_string() doc += ", **grammatical_gender** {} -".format(_("Grammatical gender")) - for idx, gender in enumerate(GENDER): - key, label = gender - if idx: - doc += " ;" - doc += ' "{}": {}'.format(key, label) + doc += documentation_get_gender_values() return doc - def get_values(self, prefix='', **kwargs): - dct = { - prefix: self.label, - prefix + "id": self.pk, - prefix + "txt_idx": self.txt_idx, - prefix + "grammatical_gender": self.grammatical_gender - } - if prefix: - dct[prefix[:-1]] = self.label - return dct - class OrganizationType(GenderedType): class Meta: @@ -1797,7 +1801,8 @@ organization_type_pk_lazy = lazy(OrganizationType.get_or_create_pk, str) organization_type_pks_lazy = lazy(OrganizationType.get_or_create_pks, str) -class Organization(Address, Merge, OwnPerms, ValueGetter, MainItem): +class Organization(Address, Merge, OwnPerms, BaseGenderedType, ValueGetter, + MainItem): TABLE_COLS = ('name', 'organization_type', 'town') SLUG = "organization" SHOW_URL = 'show-organization' @@ -1835,6 +1840,9 @@ class Organization(Address, Merge, OwnPerms, ValueGetter, MainItem): organization_type = models.ForeignKey(OrganizationType, verbose_name=_("Type")) url = models.URLField(verbose_name=_("Web address"), blank=True, null=True) + grammatical_gender = models.CharField( + _("Grammatical gender"), max_length=1, choices=GENDER, + blank=True, default="", help_text=documentation_get_gender_values) cached_label = models.TextField(_("Cached name"), blank=True, default="", db_index=True) @@ -1858,7 +1866,7 @@ class Organization(Address, Merge, OwnPerms, ValueGetter, MainItem): if self.name: return self.name return "{} - {}".format(self.organization_type, - self.town or "") + self.town or "") def natural_key(self): return (self.uuid,) @@ -1877,7 +1885,7 @@ class Organization(Address, Merge, OwnPerms, ValueGetter, MainItem): return " - ".join(items) def generate_merge_key(self): - self.merge_key = slugify(self.name if self.name else '') + self.merge_key = slugify(self.name or '') if not self.merge_key: self.merge_key = self.EMPTY_MERGE_KEY if self.town: @@ -2127,8 +2135,8 @@ class Person(Address, Merge, OwnPerms, ValueGetter, MainItem): @property def full_title(self): return " ".join( - [str(getattr(self, attr)) - for attr in ['title', 'salutation'] if getattr(self, attr)]) + str(getattr(self, attr)) + for attr in ['title', 'salutation'] if getattr(self, attr)) @property def current_profile(self): diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 65b90157e..3bd97e192 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -170,8 +170,11 @@ class GeneralType(Cached, models.Model): """ Used for automatic documentation generation """ - return "**label** {}, **txt_idx** {}".format(str(_("Label")), - str(_("Textual ID"))) + s = "**label** {}, **txt_idx** {}".format(str(_("Label")), + str(_("Textual ID"))) + if hasattr(cls, "extra_documentation_string"): + s += cls.extra_documentation_string() + return s @classmethod def admin_url(cls): -- cgit v1.2.3