From 17e4c63737eb3b7d52bcf4e52417dcd955cd997c Mon Sep 17 00:00:00 2001 From: imperosol Date: Mon, 16 Dec 2024 16:32:07 +0100 Subject: [PATCH] refactor news model and creation form --- ...r_news_club_alter_news_content_and_more.py | 56 ++++++ com/models.py | 25 ++- com/templates/com/news_edit.jinja | 96 ++++++--- com/views.py | 6 +- core/static/core/forms.scss | 33 +++- core/static/core/style.scss | 15 -- locale/fr/LC_MESSAGES/django.po | 185 ++++++++++-------- 7 files changed, 276 insertions(+), 140 deletions(-) create mode 100644 com/migrations/0007_alter_news_club_alter_news_content_and_more.py diff --git a/com/migrations/0007_alter_news_club_alter_news_content_and_more.py b/com/migrations/0007_alter_news_club_alter_news_content_and_more.py new file mode 100644 index 00000000..99145cb7 --- /dev/null +++ b/com/migrations/0007_alter_news_club_alter_news_content_and_more.py @@ -0,0 +1,56 @@ +# Generated by Django 4.2.17 on 2024-12-16 14:51 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("club", "0011_auto_20180426_2013"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("com", "0006_remove_sith_index_page"), + ] + + operations = [ + migrations.AlterField( + model_name="news", + name="club", + field=models.ForeignKey( + help_text="The club which organizes the event.", + on_delete=django.db.models.deletion.CASCADE, + related_name="news", + to="club.club", + verbose_name="club", + ), + ), + migrations.AlterField( + model_name="news", + name="content", + field=models.TextField( + blank=True, + default="", + help_text="A more detailed and exhaustive description of the event.", + verbose_name="content", + ), + ), + migrations.AlterField( + model_name="news", + name="moderator", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="moderated_news", + to=settings.AUTH_USER_MODEL, + verbose_name="moderator", + ), + ), + migrations.AlterField( + model_name="news", + name="summary", + field=models.TextField( + help_text="A description of the event (what is the activity ? is there an associated clic ? is there a inscription form ?)", + verbose_name="summary", + ), + ), + ] diff --git a/com/models.py b/com/models.py index 5c1466ca..cf2cb961 100644 --- a/com/models.py +++ b/com/models.py @@ -62,16 +62,31 @@ NEWS_TYPES = [ class News(models.Model): - """The news class.""" + """News about club events.""" title = models.CharField(_("title"), max_length=64) - summary = models.TextField(_("summary")) - content = models.TextField(_("content")) + summary = models.TextField( + _("summary"), + help_text=_( + "A description of the event (what is the activity ? " + "is there an associated clic ? is there a inscription form ?)" + ), + ) + content = models.TextField( + _("content"), + blank=True, + default="", + help_text=_("A more detailed and exhaustive description of the event."), + ) type = models.CharField( _("type"), max_length=16, choices=NEWS_TYPES, default="EVENT" ) club = models.ForeignKey( - Club, related_name="news", verbose_name=_("club"), on_delete=models.CASCADE + Club, + related_name="news", + verbose_name=_("club"), + on_delete=models.CASCADE, + help_text=_("The club which organizes the event."), ) author = models.ForeignKey( User, @@ -85,7 +100,7 @@ class News(models.Model): related_name="moderated_news", verbose_name=_("moderator"), null=True, - on_delete=models.CASCADE, + on_delete=models.SET_NULL, ) def __str__(self): diff --git a/com/templates/com/news_edit.jinja b/com/templates/com/news_edit.jinja index 858ec9a8..74040dc8 100644 --- a/com/templates/com/news_edit.jinja +++ b/com/templates/com/news_edit.jinja @@ -34,43 +34,90 @@ {% csrf_token %} {{ form.non_field_errors() }} {{ form.author }} -

{{ form.type.errors }} +

+ {{ form.type.errors }} +

- {{ form.type }}

-

{{ form.start_date.errors }} {{ form.start_date }}

-

{{ form.end_date.errors }} {{ form.end_date }}

-

{{ form.until.errors }} {{ form.until }}

-

{{ form.title.errors }} {{ form.title }}

-

{{ form.club.errors }} {{ form.club }}

-

{{ form.summary.errors }} {{ form.summary }}

-

{{ form.content.errors }} {{ form.content }}

+ {{ form.type }} +

+

+ {{ form.start_date.errors }} + + {{ form.start_date }} +

+

+ {{ form.end_date.errors }} + + {{ form.end_date }} +

+

+ {{ form.until.errors }} + + {{ form.until }} +

+

+ {{ form.title.errors }} + + {{ form.title }} +

+

+ {{ form.club.errors }} + + {{ form.club.help_text }} + {{ form.club }} +

+

+ {{ form.summary.errors }} + + {{ form.summary.help_text }} + {{ form.summary }} +

+

+ {{ form.content.errors }} + + {{ form.content.help_text }} + {{ form.content }} +

{% if user.is_com_admin %} -

{{ form.automoderation.errors }} - {{ form.automoderation }}

+

+ {{ form.automoderation.errors }} + + {{ form.automoderation }} +

{% endif %} -

-

+

+

{% endblock %} {% block script %} {{ super() }} {% endblock %} diff --git a/com/views.py b/com/views.py index 69ee7221..c3835605 100644 --- a/com/views.py +++ b/com/views.py @@ -223,15 +223,13 @@ class NewsForm(forms.ModelForm): ): self.add_error( "end_date", - ValidationError( - _("You crazy? You can not finish an event before starting it.") - ), + ValidationError(_("An event cannot end before its beginning.")), ) if self.cleaned_data["type"] == "WEEKLY" and not self.cleaned_data["until"]: self.add_error("until", ValidationError(_("This field is required."))) return self.cleaned_data - def save(self): + def save(self, *args, **kwargs): ret = super().save() self.instance.dates.all().delete() if self.instance.type == "EVENT" or self.instance.type == "CALL": diff --git a/core/static/core/forms.scss b/core/static/core/forms.scss index e439bd8d..42a4d719 100644 --- a/core/static/core/forms.scss +++ b/core/static/core/forms.scss @@ -88,20 +88,37 @@ a:not(.button) { } } - form { - .row { - label { - margin: unset; - } + margin: 0 auto 10px; + + .helptext { + margin-top: .25rem; + margin-bottom: .25rem; + font-size: 80%; } fieldset { margin-bottom: 1rem; } - .helptext { - margin-top: .25rem; - font-size: 80%; + .row { + label { + margin: unset; + } + } + + label { + display: block; + margin-bottom: 8px; + + &.required:after { + margin-left: 4px; + content: "*"; + color: red; + } + } + + .choose_file_widget { + display: none; } } diff --git a/core/static/core/style.scss b/core/static/core/style.scss index dd44fda0..d7a396d1 100644 --- a/core/static/core/style.scss +++ b/core/static/core/style.scss @@ -1412,21 +1412,6 @@ footer { } } -/*---------------------------------FORMS-------------------------------*/ - -form { - margin: 0 auto; - margin-bottom: 10px; -} - -label { - display: block; - margin-bottom: 8px; -} - -.choose_file_widget { - display: none; -} .ui-dialog .ui-dialog-buttonpane { bottom: 0; diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index 8ef1ade5..ae6ed43a 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-17 17:04+0100\n" +"POT-Creation-Date: 2024-12-18 15:53+0100\n" "PO-Revision-Date: 2016-07-18\n" "Last-Translator: Maréchal \n" @@ -17,8 +17,8 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: accounting/models.py:62 accounting/models.py:101 accounting/models.py:132 -#: accounting/models.py:190 club/models.py:55 com/models.py:274 -#: com/models.py:293 counter/models.py:299 counter/models.py:330 +#: accounting/models.py:190 club/models.py:55 com/models.py:289 +#: com/models.py:308 counter/models.py:299 counter/models.py:330 #: counter/models.py:481 forum/models.py:60 launderette/models.py:29 #: launderette/models.py:80 launderette/models.py:116 msgid "name" @@ -65,7 +65,7 @@ msgid "account number" msgstr "numéro de compte" #: accounting/models.py:107 accounting/models.py:136 club/models.py:345 -#: com/models.py:74 com/models.py:259 com/models.py:299 counter/models.py:359 +#: com/models.py:87 com/models.py:274 com/models.py:314 counter/models.py:359 #: counter/models.py:483 trombi/models.py:209 msgid "club" msgstr "club" @@ -126,8 +126,8 @@ msgstr "numéro" msgid "journal" msgstr "classeur" -#: accounting/models.py:256 core/models.py:956 core/models.py:1467 -#: core/models.py:1512 core/models.py:1541 core/models.py:1565 +#: accounting/models.py:256 core/models.py:954 core/models.py:1465 +#: core/models.py:1510 core/models.py:1539 core/models.py:1563 #: counter/models.py:694 counter/models.py:798 counter/models.py:1002 #: eboutic/models.py:57 eboutic/models.py:193 forum/models.py:312 #: forum/models.py:413 @@ -165,7 +165,7 @@ msgid "accounting type" msgstr "type comptable" #: accounting/models.py:294 accounting/models.py:429 accounting/models.py:460 -#: accounting/models.py:492 core/models.py:1540 core/models.py:1566 +#: accounting/models.py:492 core/models.py:1538 core/models.py:1564 #: counter/models.py:764 msgid "label" msgstr "étiquette" @@ -760,7 +760,7 @@ msgid "Linked operation:" msgstr "Opération liée : " #: accounting/templates/accounting/operation_edit.jinja:55 -#: com/templates/com/news_edit.jinja:57 com/templates/com/poster_edit.jinja:33 +#: com/templates/com/news_edit.jinja:103 com/templates/com/poster_edit.jinja:33 #: com/templates/com/screen_edit.jinja:25 com/templates/com/weekmail.jinja:74 #: core/templates/core/create.jinja:12 core/templates/core/edit.jinja:7 #: core/templates/core/edit.jinja:15 core/templates/core/edit.jinja:20 @@ -1068,11 +1068,11 @@ msgid "Enter a valid address. Only the root of the address is needed." msgstr "" "Entrez une adresse valide. Seule la racine de l'adresse est nécessaire." -#: club/models.py:427 com/models.py:82 com/models.py:309 core/models.py:957 +#: club/models.py:427 com/models.py:97 com/models.py:324 core/models.py:955 msgid "is moderated" msgstr "est modéré" -#: club/models.py:431 com/models.py:86 com/models.py:313 +#: club/models.py:431 com/models.py:101 com/models.py:328 msgid "moderator" msgstr "modérateur" @@ -1426,80 +1426,96 @@ msgstr "Hebdomadaire" msgid "Call" msgstr "Appel" -#: com/models.py:67 com/models.py:174 com/models.py:248 +#: com/models.py:67 com/models.py:189 com/models.py:263 #: core/templates/core/macros.jinja:301 election/models.py:12 #: election/models.py:114 election/models.py:152 forum/models.py:256 #: forum/models.py:310 pedagogy/models.py:97 msgid "title" msgstr "titre" -#: com/models.py:68 +#: com/models.py:69 msgid "summary" msgstr "résumé" -#: com/models.py:69 com/models.py:249 trombi/models.py:188 +#: com/models.py:71 +msgid "" +"A description of the event (what is the activity ? is there an associated " +"clic ? is there a inscription form ?)" +msgstr "" +"Une description de l'évènement (quelle est l'activité ? Y a-t-il un clic " +"associé ? Y-a-t'il un formulaire d'inscription ?)" + +#: com/models.py:76 com/models.py:264 trombi/models.py:188 msgid "content" msgstr "contenu" -#: com/models.py:71 core/models.py:1510 launderette/models.py:88 +#: com/models.py:79 +msgid "A more detailed and exhaustive description of the event." +msgstr "Une description plus détaillée et exhaustive de l'évènement." + +#: com/models.py:82 core/models.py:1508 launderette/models.py:88 #: launderette/models.py:124 launderette/models.py:167 msgid "type" msgstr "type" -#: com/models.py:79 com/models.py:253 pedagogy/models.py:57 +#: com/models.py:89 +msgid "The club which organizes the event." +msgstr "Le club qui organise l'évènement." + +#: com/models.py:94 com/models.py:268 pedagogy/models.py:57 #: pedagogy/models.py:200 trombi/models.py:178 msgid "author" msgstr "auteur" -#: com/models.py:153 +#: com/models.py:168 msgid "news_date" msgstr "date de la nouvelle" -#: com/models.py:156 +#: com/models.py:171 msgid "start_date" msgstr "date de début" -#: com/models.py:157 +#: com/models.py:172 msgid "end_date" msgstr "date de fin" -#: com/models.py:175 +#: com/models.py:190 msgid "intro" msgstr "intro" -#: com/models.py:176 +#: com/models.py:191 msgid "joke" msgstr "blague" -#: com/models.py:177 +#: com/models.py:192 msgid "protip" msgstr "astuce" -#: com/models.py:178 +#: com/models.py:193 msgid "conclusion" msgstr "conclusion" -#: com/models.py:179 +#: com/models.py:194 msgid "sent" msgstr "envoyé" -#: com/models.py:244 +#: com/models.py:259 msgid "weekmail" msgstr "weekmail" -#: com/models.py:262 +#: com/models.py:277 msgid "rank" msgstr "rang" -#: com/models.py:295 core/models.py:922 core/models.py:972 +#: com/models.py:310 core/models.py:920 core/models.py:970 msgid "file" msgstr "fichier" -#: com/models.py:307 +#: com/models.py:322 msgid "display time" msgstr "temps d'affichage" -#: com/models.py:338 +#: com/models.py:353 msgid "Begin date should be before end date" msgstr "La date de début doit être avant celle de fin" @@ -1690,15 +1706,15 @@ msgstr "Éditer (sera soumise de nouveau à la modération)" msgid "Edit news" msgstr "Éditer la nouvelle" -#: com/templates/com/news_edit.jinja:39 +#: com/templates/com/news_edit.jinja:41 msgid "Notice: Information, election result - no date" msgstr "Information, résultat d'élection - sans date" -#: com/templates/com/news_edit.jinja:40 +#: com/templates/com/news_edit.jinja:42 msgid "Event: punctual event, associated with one date" msgstr "Événement : événement ponctuel associé à une date" -#: com/templates/com/news_edit.jinja:41 +#: com/templates/com/news_edit.jinja:44 msgid "" "Weekly: recurrent event, associated with many dates (specify the first one, " "and a deadline)" @@ -1706,14 +1722,14 @@ msgstr "" "Hebdomadaire : événement récurrent, associé à plusieurs dates (spécifier la " "première, ainsi que la date de fin)" -#: com/templates/com/news_edit.jinja:42 +#: com/templates/com/news_edit.jinja:50 msgid "" -"Call: long time event, associated with a long date (election appliance, ...)" +"Call: long time event, associated with a long date (like election appliance)" msgstr "" -"Appel : événement de longue durée, associé à une longue date (candidature, " -"concours, ...)" +"Appel : événement de longue durée, associé à une longue date (comme des " +"candidatures à une élection)" -#: com/templates/com/news_edit.jinja:56 com/templates/com/weekmail.jinja:10 +#: com/templates/com/news_edit.jinja:102 com/templates/com/weekmail.jinja:10 msgid "Preview" msgstr "Prévisualiser" @@ -1952,23 +1968,23 @@ msgstr "Jusqu'à" msgid "Automoderation" msgstr "Automodération" -#: com/views.py:213 com/views.py:217 com/views.py:231 +#: com/views.py:213 com/views.py:217 com/views.py:229 msgid "This field is required." msgstr "Ce champ est obligatoire." -#: com/views.py:227 -msgid "You crazy? You can not finish an event before starting it." -msgstr "T'es fou? Un événement ne peut pas finir avant même de commencer." +#: com/views.py:226 +msgid "An event cannot end before its beginning." +msgstr "Un évènement ne peut pas se finir avant d'avoir commencé." -#: com/views.py:451 +#: com/views.py:449 msgid "Delete and save to regenerate" msgstr "Supprimer et sauver pour régénérer" -#: com/views.py:466 +#: com/views.py:464 msgid "Weekmail of the " msgstr "Weekmail du " -#: com/views.py:570 +#: com/views.py:568 msgid "" "You must be a board member of the selected club to post in the Weekmail." msgstr "" @@ -2202,11 +2218,11 @@ msgstr "adresse des parents" msgid "is subscriber viewable" msgstr "profil visible par les cotisants" -#: core/models.py:594 +#: core/models.py:592 msgid "A user with that username already exists" msgstr "Un utilisateur de ce nom d'utilisateur existe déjà" -#: core/models.py:761 core/templates/core/macros.jinja:80 +#: core/models.py:759 core/templates/core/macros.jinja:80 #: core/templates/core/macros.jinja:84 core/templates/core/macros.jinja:85 #: core/templates/core/user_detail.jinja:100 #: core/templates/core/user_detail.jinja:101 @@ -2226,101 +2242,101 @@ msgstr "Un utilisateur de ce nom d'utilisateur existe déjà" msgid "Profile" msgstr "Profil" -#: core/models.py:872 +#: core/models.py:870 msgid "Visitor" msgstr "Visiteur" -#: core/models.py:879 +#: core/models.py:877 msgid "receive the Weekmail" msgstr "recevoir le Weekmail" -#: core/models.py:880 +#: core/models.py:878 msgid "show your stats to others" msgstr "montrez vos statistiques aux autres" -#: core/models.py:882 +#: core/models.py:880 msgid "get a notification for every click" msgstr "avoir une notification pour chaque click" -#: core/models.py:885 +#: core/models.py:883 msgid "get a notification for every refilling" msgstr "avoir une notification pour chaque rechargement" -#: core/models.py:911 sas/forms.py:81 +#: core/models.py:909 sas/forms.py:81 msgid "file name" msgstr "nom du fichier" -#: core/models.py:915 core/models.py:1268 +#: core/models.py:913 core/models.py:1266 msgid "parent" msgstr "parent" -#: core/models.py:929 +#: core/models.py:927 msgid "compressed file" msgstr "version allégée" -#: core/models.py:936 +#: core/models.py:934 msgid "thumbnail" msgstr "miniature" -#: core/models.py:944 core/models.py:961 +#: core/models.py:942 core/models.py:959 msgid "owner" msgstr "propriétaire" -#: core/models.py:948 core/models.py:1285 +#: core/models.py:946 core/models.py:1283 msgid "edit group" msgstr "groupe d'édition" -#: core/models.py:951 core/models.py:1288 +#: core/models.py:949 core/models.py:1286 msgid "view group" msgstr "groupe de vue" -#: core/models.py:953 +#: core/models.py:951 msgid "is folder" msgstr "est un dossier" -#: core/models.py:954 +#: core/models.py:952 msgid "mime type" msgstr "type mime" -#: core/models.py:955 +#: core/models.py:953 msgid "size" msgstr "taille" -#: core/models.py:966 +#: core/models.py:964 msgid "asked for removal" msgstr "retrait demandé" -#: core/models.py:968 +#: core/models.py:966 msgid "is in the SAS" msgstr "est dans le SAS" -#: core/models.py:1037 +#: core/models.py:1035 msgid "Character '/' not authorized in name" msgstr "Le caractère '/' n'est pas autorisé dans les noms de fichier" -#: core/models.py:1039 core/models.py:1043 +#: core/models.py:1037 core/models.py:1041 msgid "Loop in folder tree" msgstr "Boucle dans l'arborescence des dossiers" -#: core/models.py:1046 +#: core/models.py:1044 msgid "You can not make a file be a children of a non folder file" msgstr "" "Vous ne pouvez pas mettre un fichier enfant de quelque chose qui n'est pas " "un dossier" -#: core/models.py:1057 +#: core/models.py:1055 msgid "Duplicate file" msgstr "Un fichier de ce nom existe déjà" -#: core/models.py:1074 +#: core/models.py:1072 msgid "You must provide a file" msgstr "Vous devez fournir un fichier" -#: core/models.py:1251 +#: core/models.py:1249 msgid "page unix name" msgstr "nom unix de la page" -#: core/models.py:1257 +#: core/models.py:1255 msgid "" "Enter a valid page name. This value may contain only unaccented letters, " "numbers and ./+/-/_ characters." @@ -2328,55 +2344,55 @@ msgstr "" "Entrez un nom de page correct. Uniquement des lettres non accentuées, " "numéros, et ./+/-/_" -#: core/models.py:1275 +#: core/models.py:1273 msgid "page name" msgstr "nom de la page" -#: core/models.py:1280 +#: core/models.py:1278 msgid "owner group" msgstr "groupe propriétaire" -#: core/models.py:1293 +#: core/models.py:1291 msgid "lock user" msgstr "utilisateur bloquant" -#: core/models.py:1300 +#: core/models.py:1298 msgid "lock_timeout" msgstr "décompte du déblocage" -#: core/models.py:1350 +#: core/models.py:1348 msgid "Duplicate page" msgstr "Une page de ce nom existe déjà" -#: core/models.py:1353 +#: core/models.py:1351 msgid "Loop in page tree" msgstr "Boucle dans l'arborescence des pages" -#: core/models.py:1464 +#: core/models.py:1462 msgid "revision" msgstr "révision" -#: core/models.py:1465 +#: core/models.py:1463 msgid "page title" msgstr "titre de la page" -#: core/models.py:1466 +#: core/models.py:1464 msgid "page content" msgstr "contenu de la page" -#: core/models.py:1507 +#: core/models.py:1505 msgid "url" msgstr "url" -#: core/models.py:1508 +#: core/models.py:1506 msgid "param" msgstr "param" -#: core/models.py:1513 +#: core/models.py:1511 msgid "viewed" msgstr "vue" -#: core/models.py:1571 +#: core/models.py:1569 msgid "operation type" msgstr "type d'opération" @@ -4208,7 +4224,8 @@ msgstr "Nouveau type de produit" #: counter/templates/counter/product_type_list.jinja:25 msgid "Product types are in the same order on this page and on the eboutic." -msgstr "Les types de produit sont dans le même ordre sur cette page et sur l'eboutic." +msgstr "" +"Les types de produit sont dans le même ordre sur cette page et sur l'eboutic." #: counter/templates/counter/product_type_list.jinja:28 msgid "" @@ -4218,7 +4235,7 @@ msgstr "" "Vous pouvez les réorganiser ici. Les changements seront alors immédiatement " "appliqués globalement." -#: counter/templates/counter/product_type_list.jinja:58 +#: counter/templates/counter/product_type_list.jinja:61 msgid "There are no product types in this website." msgstr "Il n'y a pas de types de produit dans ce site web."