From 2dbd4874aa84e957671392ea1f0866f6aef4c38c Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Tue, 12 Sep 2023 15:49:09 +0200 Subject: [PATCH 01/12] change position of calendar when it's opened in modal --- .../templates/meeting/add_or_edit.html | 21 +++++++++++++++++++ .../meeting/recurring_options_modal_form.html | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/pod/meeting/templates/meeting/add_or_edit.html b/pod/meeting/templates/meeting/add_or_edit.html index a6e079b5ad..a7f1d3a076 100644 --- a/pod/meeting/templates/meeting/add_or_edit.html +++ b/pod/meeting/templates/meeting/add_or_edit.html @@ -196,5 +196,26 @@ advanced_options_btn.click(); } }); + +const myModals = document.getElementsByClassName('modal'); +for (let i = 0; i < myModals.length; i++) { + myModals[i].addEventListener('shown.bs.modal', () => { + // console.log("OPEN"); + // looking for calendarlink + var calendarLinks = myModals[i].querySelectorAll('[id^="calendarlink"]'); + for(let i = 0; i < calendarLinks.length; i++) { + // console.log(calendarLinks[i].getAttribute("id")); + var calendarlinkid = calendarLinks[i].getAttribute("id"); + var targetNode = document.getElementById(calendarlinkid.replace('calendarlink','calendarbox')); + var observer = new MutationObserver(function(){ + if(targetNode.style.display != 'none'){ + targetNode.style.position = "fixed"; + } + }); + observer.observe(targetNode, { attributes: true, childList: true }); + } + }) +} + {% endblock more_script %} diff --git a/pod/meeting/templates/meeting/recurring_options_modal_form.html b/pod/meeting/templates/meeting/recurring_options_modal_form.html index 3128e38e7c..4422bb14ab 100644 --- a/pod/meeting/templates/meeting/recurring_options_modal_form.html +++ b/pod/meeting/templates/meeting/recurring_options_modal_form.html @@ -61,7 +61,7 @@ let recurrence = document.getElementById("id_recurrence"); // recurrence.onchange = function() { console.log("Changed!" + recurrence.value); recurrence.addEventListener('change', function(ev) { - console.log("Changed!" + recurrence.value); + // console.log("Changed!" + recurrence.value); change_weekdays_display() }) From 96db51ba1983dc4a2434d5b13f0e3bab84f65dfe Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Wed, 13 Sep 2023 14:27:10 +0200 Subject: [PATCH 02/12] dev get date start value --- pod/meeting/templates/meeting/add_or_edit.html | 6 ++++-- .../templates/meeting/recurring_options_modal_form.html | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pod/meeting/templates/meeting/add_or_edit.html b/pod/meeting/templates/meeting/add_or_edit.html index a7f1d3a076..95692c0453 100644 --- a/pod/meeting/templates/meeting/add_or_edit.html +++ b/pod/meeting/templates/meeting/add_or_edit.html @@ -196,11 +196,13 @@ advanced_options_btn.click(); } }); - +/** + * fixed calendar display in a modal + * change position from absolute to fixed +*/ const myModals = document.getElementsByClassName('modal'); for (let i = 0; i < myModals.length; i++) { myModals[i].addEventListener('shown.bs.modal', () => { - // console.log("OPEN"); // looking for calendarlink var calendarLinks = myModals[i].querySelectorAll('[id^="calendarlink"]'); for(let i = 0; i < calendarLinks.length; i++) { diff --git a/pod/meeting/templates/meeting/recurring_options_modal_form.html b/pod/meeting/templates/meeting/recurring_options_modal_form.html index 4422bb14ab..cf550113b2 100644 --- a/pod/meeting/templates/meeting/recurring_options_modal_form.html +++ b/pod/meeting/templates/meeting/recurring_options_modal_form.html @@ -78,4 +78,13 @@ } } change_weekdays_display() + + get_start_date = function() { + var start_date = document.querySelector('#id_start'); + //start_date.value + var current_lang = document.querySelector("#pod-lang-select").textContent; + var options = { year: "numeric", month: "2-digit", day: "2-digit" }; + var formatter = new Intl.DateTimeFormat(current_lang, options).formatToParts(); + return formatter + } From 89cf3e0e0f174b879d758880492d6daae1be52ce Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Thu, 14 Sep 2023 14:24:42 +0200 Subject: [PATCH 03/12] fix weekly recurring --- pod/meeting/forms.py | 32 ++++++--- .../templates/meeting/add_or_edit.html | 65 +++++++++++++++++-- .../meeting/recurring_options_modal_form.html | 19 +++--- pod/meeting/views.py | 3 +- 4 files changed, 96 insertions(+), 23 deletions(-) diff --git a/pod/meeting/forms.py b/pod/meeting/forms.py index cf8b0770d8..2b09b42773 100644 --- a/pod/meeting/forms.py +++ b/pod/meeting/forms.py @@ -179,12 +179,13 @@ def get_rounded_time(): "fields": ["start", "start_time", "expected_duration"], "additional_data": """
-
""" % ( + "see_recurring_fields", "btn btn-primary btn-sm", "modal", "#recurring_fields", @@ -242,6 +243,26 @@ def filter_fields_admin(form): else: form.remove_field("days_of_week") + def clean_start_date(self, cleaned_data): + if ("start" in cleaned_data.keys() + and "recurring_until" in cleaned_data.keys() + and cleaned_data["recurring_until"] is not None + and ( + cleaned_data["start"] > cleaned_data["recurring_until"] + )): + raise ValidationError(_("Start date must be less than recurring until date")) + + if (self.cleaned_data.get("weekdays") + and cleaned_data.get("start") + and self.cleaned_data.get("recurrence") == "weekly" + and ( + str(cleaned_data.get("start").weekday()) + not in self.cleaned_data.get("weekdays") + )): + raise ValidationError( + _("In case of weekly recurring, the day of the start date has to be selected") + ) + def clean_add_owner(self, cleaned_data): if "additional_owners" in cleaned_data.keys() and isinstance( self.cleaned_data["additional_owners"], QuerySet @@ -272,13 +293,8 @@ def clean(self): tab = self.cleaned_data["days_of_week"] self.cleaned_data["weekdays"] = "".join(tab) - if ( - "start" in cleaned_data.keys() - and "recurring_until" in cleaned_data.keys() - and cleaned_data["recurring_until"] is not None - and cleaned_data["start"] > cleaned_data["recurring_until"] - ): - raise ValidationError(_("Start date must be less than recurring until date")) + self.clean_start_date(cleaned_data) + self.clean_add_owner(cleaned_data) if ( "restrict_access_to_groups" in cleaned_data.keys() diff --git a/pod/meeting/templates/meeting/add_or_edit.html b/pod/meeting/templates/meeting/add_or_edit.html index 95692c0453..cfcd0ded12 100644 --- a/pod/meeting/templates/meeting/add_or_edit.html +++ b/pod/meeting/templates/meeting/add_or_edit.html @@ -191,11 +191,14 @@ /* Add event listener to use advanced options button with keyboard */ var advanced_options_btn = document.getElementById('advanced_options_btn'); -advanced_options_btn.addEventListener("keydown", function(event) { - if (event.key === "Enter" || event.key === " ") { - advanced_options_btn.click(); - } -}); +if (advanced_options_btn) { + advanced_options_btn.addEventListener("keydown", function(event) { + if (event.key === "Enter" || event.key === " ") { + advanced_options_btn.click(); + } + }); +} + /** * fixed calendar display in a modal * change position from absolute to fixed @@ -218,6 +221,58 @@ } }) } +var day_of_start_date = -1; +let id_start = document.querySelector("#id_start"); +let start_date_formats = {{start_date_formats|safe}}; +if(id_start) { + function setDayOfWeekForStartDate() { + let id_start_value = id_start.value; + for(let i = 0; i < start_date_formats.length; i++) { + let index_day = start_date_formats[i].indexOf('%d'); + let index_month = start_date_formats[i].indexOf('%m'); + let index_little_year = start_date_formats[i].indexOf('%y'); + let index_year = start_date_formats[i].indexOf('%Y'); + let regex_date_format = "^" + start_date_formats[i].replace('%d', '\\d{2}').replace('%m', '\\d{2}').replace('%y', '\\d{2}').replace('%Y', '\\d{4}') + "$"; + regex_date_format = regex_date_format.replace("-", "[-]").replace(".", "[.]").replace("/", "[/]"); + let match = id_start_value.match(new RegExp(regex_date_format, "g")); + if(match) { + let day = id_start_value.substring(index_day, index_day+2); + let monthIndex = parseInt(id_start_value.substring(index_month, index_month+2))-1; + let year = 0; + if(index_year == -1) { + year = id_start_value.substring(index_little_year, index_little_year+2); + } else { + year = id_start_value.substring(index_year, index_year+4); + } + let corresponding_day = [6,0,1,2,3,4,5]; + day_of_start_date = corresponding_day[new Date(year, monthIndex, day).getDay()]; + return + } + } + } + setDayOfWeekForStartDate(); +} + +var modal_recurring_fields = document.getElementById('recurring_fields'); +if(modal_recurring_fields) { + modal_recurring_fields.addEventListener('shown.bs.modal', () => { + setDayOfWeekForStartDate(); + change_weekdays_display(); + }); + modal_recurring_fields.addEventListener('hidden.bs.modal', function (e) { + setDayOfWeekForStartDate(); + var select_days = document.querySelectorAll('input[name="days_of_week"]:checked'); + let select_days_values = []; + for(let i = 0; i < select_days.length; i++) { + select_days_values.push(select_days[i].value); + } + if(recurrence.value == "weekly" && !select_days_values.includes(""+day_of_start_date)) { + alert("{% trans "In case of weekly recurring, the day of the start date have to be checked" %}"); + let see_recurring_fields_btn = document.getElementById('see_recurring_fields'); + if (see_recurring_fields_btn) see_recurring_fields_btn.click(); + } + }) +} {% endblock more_script %} diff --git a/pod/meeting/templates/meeting/recurring_options_modal_form.html b/pod/meeting/templates/meeting/recurring_options_modal_form.html index cf550113b2..86cb945ed4 100644 --- a/pod/meeting/templates/meeting/recurring_options_modal_form.html +++ b/pod/meeting/templates/meeting/recurring_options_modal_form.html @@ -68,23 +68,24 @@ change_weekdays_display = function() { if (recurrence.value == "weekly") { document.getElementById("weekdays_recurring").style.display = 'block'; + if(day_of_start_date != -1) { + let day = document.getElementById("id_days_of_week_" + day_of_start_date); + if(day) day.checked = true; + } } else { document.getElementById("weekdays_recurring").style.display = 'none'; } if (recurrence.value == "monthly") { document.getElementById("monthly_recurring").style.display = 'block'; + /* In case of monthly recurring, we unchecked all days */ + for(let i = 0; i < 7; i++) { + let day = document.getElementById("id_days_of_week_" + i); + if(day) day.checked = false; + } } else { document.getElementById("monthly_recurring").style.display = 'none'; } } - change_weekdays_display() +document.addEventListener("load", change_weekdays_display); - get_start_date = function() { - var start_date = document.querySelector('#id_start'); - //start_date.value - var current_lang = document.querySelector("#pod-lang-select").textContent; - var options = { year: "numeric", month: "2-digit", day: "2-digit" }; - var formatter = new Intl.DateTimeFormat(current_lang, options).formatToParts(); - return formatter - } diff --git a/pod/meeting/views.py b/pod/meeting/views.py index b8e84a40bd..964b749263 100644 --- a/pod/meeting/views.py +++ b/pod/meeting/views.py @@ -184,10 +184,11 @@ def add_or_edit(request, meeting_id=None): if meeting else _("Add a new meeting") ) + start_date_formats = '["%s"]' % '","'.join(form.fields["start"].input_formats) return render( request, "meeting/add_or_edit.html", - {"form": form, "page_title": mark_safe(page_title)}, + {"form": form, "start_date_formats": start_date_formats, "page_title": mark_safe(page_title)}, ) From 1afbc4eea1348470c6355c13962337bcece6ba8a Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Thu, 14 Sep 2023 15:37:05 +0200 Subject: [PATCH 04/12] fix bug with recurring weekly meeting on monday --- pod/meeting/forms.py | 42 +++++++++++++++++++++--------------------- pod/meeting/models.py | 4 +--- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/pod/meeting/forms.py b/pod/meeting/forms.py index 2b09b42773..dd5b63683a 100644 --- a/pod/meeting/forms.py +++ b/pod/meeting/forms.py @@ -243,35 +243,35 @@ def filter_fields_admin(form): else: form.remove_field("days_of_week") - def clean_start_date(self, cleaned_data): - if ("start" in cleaned_data.keys() - and "recurring_until" in cleaned_data.keys() - and cleaned_data["recurring_until"] is not None + def clean_start_date(self): + if ("start" in self.cleaned_data.keys() + and "recurring_until" in self.cleaned_data.keys() + and self.cleaned_data["recurring_until"] is not None and ( - cleaned_data["start"] > cleaned_data["recurring_until"] + self.cleaned_data["start"] > self.cleaned_data["recurring_until"] )): raise ValidationError(_("Start date must be less than recurring until date")) if (self.cleaned_data.get("weekdays") - and cleaned_data.get("start") + and self.cleaned_data.get("start") and self.cleaned_data.get("recurrence") == "weekly" and ( - str(cleaned_data.get("start").weekday()) + str(self.cleaned_data.get("start").weekday()) not in self.cleaned_data.get("weekdays") )): raise ValidationError( _("In case of weekly recurring, the day of the start date has to be selected") ) - def clean_add_owner(self, cleaned_data): - if "additional_owners" in cleaned_data.keys() and isinstance( + def clean_add_owner(self): + if "additional_owners" in self.cleaned_data.keys() and isinstance( self.cleaned_data["additional_owners"], QuerySet ): meetingowner = ( self.instance.owner if hasattr(self.instance, "owner") - else cleaned_data["owner"] - if "owner" in cleaned_data.keys() + else self.cleaned_data["owner"] + if "owner" in self.cleaned_data.keys() else self.current_user ) if ( @@ -283,26 +283,26 @@ def clean_add_owner(self, cleaned_data): ) def clean(self): - cleaned_data = super(MeetingForm, self).clean() - if "expected_duration" in cleaned_data.keys(): + self.cleaned_data = super(MeetingForm, self).clean() + if "expected_duration" in self.cleaned_data.keys(): self.cleaned_data["expected_duration"] = timezone.timedelta( hours=self.cleaned_data["expected_duration"] ) - if "days_of_week" in cleaned_data.keys(): + if "days_of_week" in self.cleaned_data.keys(): tab = self.cleaned_data["days_of_week"] self.cleaned_data["weekdays"] = "".join(tab) - self.clean_start_date(cleaned_data) + self.clean_start_date() - self.clean_add_owner(cleaned_data) + self.clean_add_owner() if ( - "restrict_access_to_groups" in cleaned_data.keys() - and len(cleaned_data["restrict_access_to_groups"]) > 0 + "restrict_access_to_groups" in self.cleaned_data.keys() + and len(self.cleaned_data["restrict_access_to_groups"]) > 0 ): - cleaned_data["is_restricted"] = True + self.cleaned_data["is_restricted"] = True - if "start_time" in cleaned_data.keys() and "start" in cleaned_data.keys(): + if "start_time" in self.cleaned_data.keys() and "start" in self.cleaned_data.keys(): start_time = datetime.datetime.strptime( self.cleaned_data["start_time"], "%H:%M:%S" ).time() @@ -312,7 +312,7 @@ def clean(self): start_datetime = timezone.make_aware(start_datetime) self.instance.start_at = start_datetime - if "voice_bridge" in cleaned_data.keys() and cleaned_data[ + if "voice_bridge" in self.cleaned_data.keys() and self.cleaned_data[ "voice_bridge" ] not in range(10000, 99999): raise ValidationError( diff --git a/pod/meeting/models.py b/pod/meeting/models.py index 1d897c045d..68aaca7504 100644 --- a/pod/meeting/models.py +++ b/pod/meeting/models.py @@ -507,15 +507,13 @@ def next_occurrence(self, current_date): # noqa: C901 + timedelta(days=increment) + timedelta(weeks=self.frequency - 1) ) - # Look in this week and be sure to find weekday = 0 - increment = 1 + increment = 0 while weekday + increment <= 6: if str(weekday + increment) in self.weekdays: return next_date + timedelta(days=increment) increment += 1 - raise RuntimeError("You should have found the next weekly occurrence by now.") if self.recurrence == Meeting.MONTHLY: From 207ed1c010d465bf278aa23f4882267540c90192 Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Thu, 14 Sep 2023 16:58:43 +0200 Subject: [PATCH 05/12] add translation --- pod/locale/fr/LC_MESSAGES/django.mo | Bin 165637 -> 165832 bytes pod/locale/fr/LC_MESSAGES/django.po | 61 +++++----- pod/locale/fr/LC_MESSAGES/djangojs.mo | Bin 17821 -> 17393 bytes pod/locale/fr/LC_MESSAGES/djangojs.po | 115 +++++++----------- pod/locale/nl/LC_MESSAGES/django.po | 23 ++-- pod/locale/nl/LC_MESSAGES/djangojs.po | 84 +++---------- pod/meeting/forms.py | 2 +- .../templates/meeting/add_or_edit.html | 2 +- 8 files changed, 114 insertions(+), 173 deletions(-) diff --git a/pod/locale/fr/LC_MESSAGES/django.mo b/pod/locale/fr/LC_MESSAGES/django.mo index c906197f3e80d05f05da65895432fa3e22b2ca99..1cb1e6f03370508c8d7ddccce1412dac141782e2 100644 GIT binary patch delta 37295 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 delta 37107 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 MqiyF-cs~5`KltkG5C8xG diff --git a/pod/locale/fr/LC_MESSAGES/django.po b/pod/locale/fr/LC_MESSAGES/django.po index 44e6bd1cea..343c6ca9ea 100644 --- a/pod/locale/fr/LC_MESSAGES/django.po +++ b/pod/locale/fr/LC_MESSAGES/django.po @@ -5,9 +5,9 @@ msgid "" msgstr "" "Project-Id-Version: Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-12 15:15+0000\n" +"POT-Creation-Date: 2023-09-14 14:46+0000\n" "PO-Revision-Date: \n" -"Last-Translator: obado \n" +"Last-Translator: ptitloup \n" "Language-Team: Pod Team pod@esup-portail.org\n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -2117,8 +2117,8 @@ msgid "" msgstr "" "Les champs \"Début\" et \"Fin\" doivent contenir des valeurs en secondes. " "Lancez la lecture de la vidéo, mettez sur pause et cliquez sur \"Récupérer " -"le temps depuis le lecteur\" pour renseigner automatiquement le champ " -"\"Début\". Vous pouvez le faire également pour remplir le champ \"Fin\"." +"le temps depuis le lecteur\" pour renseigner automatiquement le champ \"Début" +"\". Vous pouvez le faire également pour remplir le champ \"Fin\"." #: pod/enrichment/templates/enrichment/edit_enrichment.html msgid "You cannot overlap enrichments." @@ -2622,8 +2622,8 @@ msgid "" "This video was uploaded to Pod; its origin is %(type)s : %(url)s" msgstr "" -"Cette vidéo a été téléversée sur Pod ; son origine est %(type)s : %(url)s" +"Cette vidéo a été téléversée sur Pod ; son origine est %(type)s : %(url)s" #: pod/import_video/views.py pod/meeting/views.py msgid "Try changing the record type or address for this recording." @@ -2634,8 +2634,8 @@ msgstr "" #: pod/import_video/views.py #, python-format msgid "" -"This video '%(name)s' was uploaded to Pod; its origin is Youtube : %(url)s" +"This video '%(name)s' was uploaded to Pod; its origin is Youtube : %(url)s" msgstr "" "Cette vidéo « %(name)s » a été téléversée sur Pod ; son origine est " "Youtube : %(url)s" @@ -4835,16 +4835,22 @@ msgstr "Enregistrement" msgid "Recurring options" msgstr "Options de récurrence" +#: pod/meeting/forms.py pod/meeting/models.py +msgid "Start date must be less than recurring until date" +msgstr "La date de début doit être antérieure à la date de fin récurrente" + +#: pod/meeting/forms.py pod/meeting/templates/meeting/add_or_edit.html +msgid "" +"In case of weekly recurring, the day of the start date must be selected." +msgstr "" +"En cas de récurrence hebdomadaire, le jour de la date de début doit être sélectionné." + #: pod/meeting/forms.py pod/playlist/forms.py pod/video/forms.py msgid "Owner of the video cannot be an additional owner too" msgstr "" "Le propriétaire de la video ne peut pas être propriétaire additionnel en " "même temps" -#: pod/meeting/forms.py pod/meeting/models.py -msgid "Start date must be less than recurring until date" -msgstr "La date de début doit être antérieure à la date de fin récurrente" - #: pod/meeting/forms.py msgid "Voice bridge must be a 5-digit number in the range 10000 to 99999" msgstr "" @@ -5468,16 +5474,16 @@ msgid "" msgstr "" "\n" "

Bonjour,\n" -"

%(owner)s vous invite à une réunion récurrente " -"%(meeting_title)s.

\n" +"

%(owner)s vous invite à une réunion récurrente " +"%(meeting_title)s.

\n" "

Date de début : %(start_date_time)s

\n" "

Récurrent jusqu’à la date : %(end_date)s

\n" "

La réunion se tiendra tou(te)s les %(frequency)s %(recurrence)s \n" "

Voici le lien pour rejoindre la réunion :\n" " %(join_link)s

\n" -"

Vous avez besoin de ce mot de passe pour entrer : " -"%(password)s

\n" +"

Vous avez besoin de ce mot de passe pour entrer : " +"%(password)s

\n" "

Cordialement

\n" " " @@ -5503,8 +5509,8 @@ msgstr "" "

Date de fin : %(end_date)s

\n" "

Voici le lien pour rejoindre la réunion :\n" " %(join_link)s

\n" -"

Vous avez besoin de ce mot de passe pour entrer : " -"%(password)s

\n" +"

Vous avez besoin de ce mot de passe pour entrer : " +"%(password)s

\n" "

Cordialement

\n" " " @@ -6480,8 +6486,8 @@ msgstr "Prévisualisation d’enregistrement" #: pod/video/templates/videos/video-element.html msgid "" "To view this video please enable JavaScript, and consider upgrading to a web " -"browser that supports HTML5 video" +"browser that supports HTML5 video" msgstr "" "Pour visionner cette vidéo, veuillez activer JavaScript et envisager de " "passer à un navigateur Web qui un nouvel enregistrement a été ajouté sur la plateforme " "%(title_site)s à partir de l’enregistreur \"%(recorder)s\".
Pour " -"l’ajouter, cliquez sur le lien ci dessous.

%(link_url)s
Si le lien n’est pas actif, il " -"faut le copier-coller dans la barre d’adresse de votre navigateur.

Cordialement

" +"l’ajouter, cliquez sur le lien ci dessous.

" +"%(link_url)s
Si le lien n’est pas actif, il faut le copier-coller " +"dans la barre d’adresse de votre navigateur.

Cordialement

" #: pod/recorder/views.py msgid "New recording added." @@ -6911,8 +6916,8 @@ msgid "" "%(url)s

\n" msgstr "" "vous pouvez changer la date de suppression en éditant votre vidéo :

\n" -"

%(scheme)s:%(url)s

\n" +"

" +"%(scheme)s:%(url)s

\n" "\n" #: pod/video/management/commands/check_obsolete_videos.py @@ -7665,8 +7670,8 @@ msgid "" "This video is chaptered. Click the chapter button on the video player to view them." msgstr "" -"Cette vidéo est chapitrée. Cliquez sur le bouton de chapitre sur le lecteur vidéo pour les voir." +"Cette vidéo est chapitrée. Cliquez sur le bouton de chapitre sur le lecteur vidéo pour les voir." #: pod/video/templates/videos/video-all-info.html msgid "Other versions" diff --git a/pod/locale/fr/LC_MESSAGES/djangojs.mo b/pod/locale/fr/LC_MESSAGES/djangojs.mo index 5c3ce79261df81c8eb6f305597a4ce98e900c841..e64905e29b3ce9676e6b30e979aa3c1fc7692f2d 100644 GIT binary patch delta 4117 zcmYk;c~F&A7{~Dk5YPZYO}J{wMPm`s1QQor&;rrICCt*?jZ#U=H3{vixMY@TNSRBR zTZ(I5ORdTDk1(fccbT!7taPko%+#r7YSO;H_nu}v<8wdfeeZkU_nhZE=ar2s!mcd~ z3w+|yua2~=uj(@|}nAyZE z0tXicD=OzlG5?+YA?KcfcNos*i-cpv%KNT+k+4y?qkxDp@6I@E((v@p8| zb5SXO9QC_$DUbr(hVfC8IK$i`h7!CHdFLD>$K%Z$yp!IO>5H zQ4eg?$}APrQOCuo2bG~8Uqlt_PSgy~VKRnuky76VS#}$O%3LYxd20f6G=sy)VC`#X zJ@U^Yd79R?4QlN(QA?7IdSC%+d(Oc)tU%pwIjWX6qb9fuHKET@6SQQL1jYN@_L73p`V8u}4cR98?l^D%u5uqSFsr@G^9&NJxO{*UIf z8y95Y3>=RYcnZnB4Pp32ScV075LK*yBa^VUte39qi^||A)Bxt7Qoar~zWY|AFv(Iw}vc;ZkU4_ND(%|@y;^Th-af}VS_ur6?Oey)C^BJzjfcAN7c-)s3ra# z)5FaE#ReRwGK#=BI+=7>Hd}$OU@hijH}c#Q%W(w0kD6Hm(~QPWsBP5^m6^e)`%J_< zT!h7V6xsR~OM&F$J=h0JGg<%MbhdFqDZhwXf+#Al5yoQ=Y=MP1%pI@CT#nD6QXEHx z%KK6GD@W~y!>A>!L)FS@)WC0`GX75%`R5+iq(i8P_$ewAXHhr)0X5gWqW43j?rb3H0p+M|xD|Pp)nf^!@{&->%TY7j zgUZl3tj0Lfcm%hgGBKKT4#)Yu$^WBtPH}>|vn+j|5neqV^Ka0cqSm8gNO!z4U`@pwKz5USd%oX~~gE4(x@>P*H%6UKkY^i(8PFdLF|toY3(YLTxCql+b%#t(;JXwG1y4Y9!ABkMr>?p;76^|F@}h_7eLD zrC7_bnOH+?BSsVN5w*l3!cVB}Bqk8^bU;(3YXbQM$@U5pymt&s8n8z=(9E799wyW> zLfDhIl9*2HCfI4-Ry}~z2sNcutz`&rnOeKPiuE;Ot~=K5QeCMj+q1nP(V0a=5o-yx z6k<71LTo40wC)RtLxi@S+LRDB*qM#*66x+(tS25L-q!)Gl2}c=M5HPuS;Qn_D^Wu< zCkhB{oh`%*gxZ}%6)}JqMZ80(R#p(&MJlM*iQAjDnc5H{*XxB|P8IYA5_-Pv*9YxI z;tj87_8=~F{igT;p|@EX!EW{bP8f%3+IqLQgYG~(=WQZ_;1%Pw$$YLNo*?Gy`K5G< ziN=Il_YmHzw+sCs@fMLxbR-55Y9oll#75$2Laiu-_ulVMKaY5bc#c>{>>LQ zO&E^tI32riCccRI_z~t|46Vq)`Iu`gdO<-q?7~U-mg8?RmGe*khYkMIEDJn-zcc%E`}ijBT+q%b^ z!KJ7QR-+zRg&Nv>o$q^4&)tbxxCiyzv#5?cr_Cr~5t0cwc9Ms*~cn{=L!8j%{*?|M)pcwh?SPuaZ7M>&q7T6#;e-NQ;$ ziyJWtyRir#!3sQsYCt>-VJhZhU@B1ewWFTD9W^q0QNKTeGw@d_jK3~?!vzMxq+Dwc zaX#jAz690sEvT07Mz#DDs=|*^6^8JTOw2%?m!Y0}4@m%8Dtk?9Armz;2eA#wTRS;z?%^DzzS4D zHe)1ib?ig_%pf0HE2o_6Z=t0d-lL!%Ud2%S!a4sM^`KB{3&R-H+$Um|i&4T5&X+Tu zHMkO4F6JoizzgWXYFb&0dvP890oB369L7JK!fIZ~END}W+J;@Ip&CFv@F32^xAAri zVukUJF)Pu7n{fdS;e7l%Y6`Mhff0Bcsw1m#E>_`E+?~t#>%zxeD8v-@qK3TOu^08g zVVsEnL(ORvdsGchMs=VFH3bWhy3Ji!id#`VeFs^0<|?vmOcZY)-Ir%k&^x^l^~PF; z>iK%4v!(_0!#${;JnMXa2-Tz0sHu4uwOB8pp7R&y`~RRu%EeaFbCYorPDee@DyE={ zN>M#%MLl3UF2vm!jK4>1v&$HbNxUAlXs4ojwh7(%C{m|6gj%d0qDDA@6|50iiE8*R zB|ND{IGSS?m z2F^t{R-x8dH{PiIKS)7CbP6?B7tw=XA`8{bVqs+A24q8+UR;2Okv5o5Q9aHmvbSjk zs^W)G_xn+c_aoHYCo_!cSb|y9Z#GaU!Cus2JBPdqObFx0pqOc>o>rp1--1){RaDR3 zLoLS7P#uV2yjjm?25OEgQESMHx~~Z}1=}&O|NALWry0TtIEsn*DXOKRG+#GlA@3fO zk80o=)Y|DnRd5g|<1489&!C=n3ElW-)X0VMGFXVE#f(4KOfMI-y+%;0`F)JSOQ;82 zL3WP$7plTEhD-Z*8PaLfkE`%JYD&@=CXGM^Y6LAD#AEmdmeC50RFKEwWb<)IJWPnaP-k*I^l|0bY#5epCbZqu!iHkacHXL*4%gUW-YK?B5lj8nytFu+gFr zL*YTxs(upnz=Nov^y3OVhw54EVta8dMFzvPqX&;7f97*OR6*eq+d6b}-j7bobz(j)KsGy>_tsk2kO3Us0R0;3-wza+8H`tCPzpn zd7eB=dZ<6p`hHHvj#nw%M$VE|gxxiMEE_M`qqT=~O^4sP{v`g8bUWwbF`}ODBCX{6 zbY);N4DHqtQTaAa6R?Ivh13I#^%k1+tT9Vd~gmGya)I zsfuVlB~gFit=5J=B{~vp%zDRqe1se%Eo2ipOsYvOd5V08=+NRlL7pSp>n{==2S^PG zCa)76K4NLHY$au6i0G&!cacaENA{6YqGO9q;J;(d|E=Uc@(|I2)Hc<-#7%n1w~tet ztRqEan*D_pc(r!fCxQP|S%;>b-0oa^7!MI`s~?e9h>j=7VzPq#nCO^CvEbTNmY-O#j}PW3Fpz-K`xP8yo7}buCRz-sX1yipie@hc-8R8`}m764pf2)wX*# zwfH*y-3f2F!hOCL-{=De{Iil`!=hUoJ57a`Pj`FEKym8jpyv94q_p!9t2*lHylrji z{y(OD73Tj\n" "Language-Team: \n" @@ -170,16 +170,6 @@ msgstr "Veuillez entrer un texte pour le segment compris entre %s et %s :" msgid "Pause to enter caption for segment from %s to %s." msgstr "Mettez en pause pour entrer le texte du segment entre %s et %s." -#: pod/completion/static/js/caption_maker.js -#: pod/podfile/static/podfile/js/filewidget.js -msgid "Add" -msgstr "Ajouter" - -#: pod/completion/static/js/caption_maker.js -#: pod/video/static/js/comment-script.js -msgid "Delete" -msgstr "Supprimer" - #: pod/completion/static/js/caption_maker.js msgid "Caption" msgstr "Légende / Sous-titre" @@ -512,11 +502,6 @@ msgstr "Sauvegarder" msgid "Network response was not ok." msgstr "La réponse du réseau n'était pas correcte." -#: pod/podfile/static/podfile/js/filewidget.js -#: pod/video/static/js/change_video_owner.js -msgid "Loading…" -msgstr "Chargement en cours…" - #: pod/podfile/static/podfile/js/filewidget.js msgid "Change image" msgstr "Changer d’image" @@ -545,6 +530,10 @@ msgstr "Retirer" msgid "Server error" msgstr "Erreur du serveur" +#: pod/podfile/static/podfile/js/filewidget.js +msgid "Add" +msgstr "Ajouter" + #: pod/podfile/static/podfile/js/filewidget.js msgid "Are you sure you want to delete this folder?" msgstr "Êtes-vous sûr(e) de vouloir supprimer ce dossier ?" @@ -557,10 +546,6 @@ msgstr "Voir plus" msgid "This folder is empty" msgstr "Ce dossier est vide" -#: pod/video/static/js/ajax-display-channels.js -msgid "Channels" -msgstr "Chaînes" - #: pod/video/static/js/ajax-display-channels.js msgid "Channel" msgstr "Chaîne" @@ -573,14 +558,14 @@ msgstr "Aucun chaîne trouvée" msgid "videos" msgstr "vidéos" -#: pod/video/static/js/ajax-display-channels.js -msgid "video" -msgstr "vidéo" - #: pod/video/static/js/change_video_owner.js msgid "No element found" msgstr "Aucun élément trouvé" +#: pod/video/static/js/change_video_owner.js +msgid "Loading…" +msgstr "Chargement en cours…" + #: pod/video/static/js/change_video_owner.js msgid "An error occurred during the change of owner" msgstr "Une erreur s’est produite lors du changement de propriétaire" @@ -598,40 +583,21 @@ msgid "Answers" msgstr "Réponses" #: pod/video/static/js/comment-script.js -msgid "Cancel" -msgstr "Annuler" +msgid "Delete" +msgstr "Supprimer" #: pod/video/static/js/comment-script.js -#, javascript-format -msgid "%s vote" -msgid_plural "%s votes" -msgstr[0] "%s vote" -msgstr[1] "%s votes" +msgid "Cancel" +msgstr "Annuler" #: pod/video/static/js/comment-script.js msgid "Agree with the comment" msgstr "D’accord avec ce commentaire" -#: pod/video/static/js/comment-script.js -msgid "Reply to comment" -msgstr "Répondre au commentaire" - -#: pod/video/static/js/comment-script.js -msgid "Reply" -msgstr "Répondre" - #: pod/video/static/js/comment-script.js msgid "Remove this comment" msgstr "Supprimer ce commentaire" -#: pod/video/static/js/comment-script.js -msgid "Add a public comment" -msgstr "Ajouter un commentaire public" - -#: pod/video/static/js/comment-script.js -msgid "Send" -msgstr "Envoyer" - #: pod/video/static/js/comment-script.js msgid "Show answers" msgstr "Afficher les réponses" @@ -644,6 +610,13 @@ msgstr "Mauvaise réponse du serveur." msgid "Sorry, you're not allowed to vote by now." msgstr "Désolé, vous n’êtes pas autorisé à voter maintenant." +#: pod/video/static/js/comment-script.js +#, javascript-format +msgid "%s vote" +msgid_plural "%s votes" +msgstr[0] "%s vote" +msgstr[1] "%s votes" + #: pod/video/static/js/comment-script.js msgid "Sorry, you can't comment this video by now." msgstr "Désolé, vous ne pouvez pas commenter cette vidéo maintenant." @@ -664,47 +637,38 @@ msgstr[0] "%s commentaire" msgstr[1] "%s commentaires" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is password protected." msgstr "Ce contenu est protégé par mot de passe." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is chaptered." msgstr "Ce contenu est chapitré." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is in draft." msgstr "Ce contenu est en brouillon." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Video content." msgstr "Contenu vidéo." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Audio content." msgstr "Contenu audio." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Edit the video" msgstr "Éditer la vidéo" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Complete the video" msgstr "Compléter la vidéo" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Chapter the video" msgstr "Chapitrer la vidéo" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Delete the video" msgstr "Supprimer la vidéo" @@ -777,18 +741,6 @@ msgstr "Désolé, aucune vidéo trouvée" msgid "Edit the category" msgstr "Éditer la catégorie" -#: pod/video/static/js/video_category.js -msgid "Delete the category" -msgstr "Supprimer la catégorie" - -#: pod/video/static/js/video_category.js -msgid "Success!" -msgstr "Succès !" - -#: pod/video/static/js/video_category.js -msgid "Error…" -msgstr "Erreur…" - #: pod/video/static/js/video_category.js msgid "Category created successfully" msgstr "Catégorie créée avec succès" @@ -861,6 +813,33 @@ msgstr "Ajouts en favoris total depuis la création" msgid "Slug" msgstr "Titre court" +#~ msgid "Channels" +#~ msgstr "Chaînes" + +#~ msgid "video" +#~ msgstr "vidéo" + +#~ msgid "Reply to comment" +#~ msgstr "Répondre au commentaire" + +#~ msgid "Reply" +#~ msgstr "Répondre" + +#~ msgid "Add a public comment" +#~ msgstr "Ajouter un commentaire public" + +#~ msgid "Send" +#~ msgstr "Envoyer" + +#~ msgid "Delete the category" +#~ msgstr "Supprimer la catégorie" + +#~ msgid "Success!" +#~ msgstr "Succès !" + +#~ msgid "Error…" +#~ msgstr "Erreur…" + #~ msgid "Are you sure you want to delete this element?" #~ msgstr "Êtes-vous sûr(e) de vouloir supprimer cet élément ?" diff --git a/pod/locale/nl/LC_MESSAGES/django.po b/pod/locale/nl/LC_MESSAGES/django.po index 34f574ef6e..eddd4a52cc 100644 --- a/pod/locale/nl/LC_MESSAGES/django.po +++ b/pod/locale/nl/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-12 15:15+0000\n" +"POT-Creation-Date: 2023-09-14 14:46+0000\n" "PO-Revision-Date: 2023-06-08 14:37+0200\n" "Last-Translator: obado \n" "Language-Team: \n" @@ -2470,8 +2470,8 @@ msgstr "" #: pod/import_video/views.py #, python-format msgid "" -"This video '%(name)s' was uploaded to Pod; its origin is Youtube : %(url)s" +"This video '%(name)s' was uploaded to Pod; its origin is Youtube : %(url)s" msgstr "" #: pod/import_video/views.py @@ -4592,14 +4592,19 @@ msgstr "" msgid "Recurring options" msgstr "" -#: pod/meeting/forms.py pod/playlist/forms.py pod/video/forms.py -msgid "Owner of the video cannot be an additional owner too" -msgstr "" - #: pod/meeting/forms.py pod/meeting/models.py msgid "Start date must be less than recurring until date" msgstr "" +#: pod/meeting/forms.py pod/meeting/templates/meeting/add_or_edit.html +msgid "" +"In case of weekly recurring, the day of the start date has to be selected." +msgstr "" + +#: pod/meeting/forms.py pod/playlist/forms.py pod/video/forms.py +msgid "Owner of the video cannot be an additional owner too" +msgstr "" + #: pod/meeting/forms.py msgid "Voice bridge must be a 5-digit number in the range 10000 to 99999" msgstr "" @@ -6124,8 +6129,8 @@ msgstr "" #: pod/video/templates/videos/video-element.html msgid "" "To view this video please enable JavaScript, and consider upgrading to a web " -"browser that supports HTML5 video" +"browser that supports HTML5 video" msgstr "" #: pod/recorder/templates/recorder/link_record.html diff --git a/pod/locale/nl/LC_MESSAGES/djangojs.po b/pod/locale/nl/LC_MESSAGES/djangojs.po index 545901be19..970592bb6e 100644 --- a/pod/locale/nl/LC_MESSAGES/djangojs.po +++ b/pod/locale/nl/LC_MESSAGES/djangojs.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Esup-Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-01 13:56+0000\n" +"POT-Creation-Date: 2023-09-14 14:46+0000\n" "PO-Revision-Date: 2023-02-08 15:22+0100\n" "Last-Translator: obado \n" "Language-Team: \n" @@ -155,16 +155,6 @@ msgstr "" msgid "Pause to enter caption for segment from %s to %s." msgstr "" -#: pod/completion/static/js/caption_maker.js -#: pod/podfile/static/podfile/js/filewidget.js -msgid "Add" -msgstr "" - -#: pod/completion/static/js/caption_maker.js -#: pod/video/static/js/comment-script.js -msgid "Delete" -msgstr "" - #: pod/completion/static/js/caption_maker.js msgid "Caption" msgstr "" @@ -487,11 +477,6 @@ msgstr "" msgid "Network response was not ok." msgstr "" -#: pod/podfile/static/podfile/js/filewidget.js -#: pod/video/static/js/change_video_owner.js -msgid "Loading…" -msgstr "" - #: pod/podfile/static/podfile/js/filewidget.js msgid "Change image" msgstr "" @@ -520,6 +505,10 @@ msgstr "" msgid "Server error" msgstr "" +#: pod/podfile/static/podfile/js/filewidget.js +msgid "Add" +msgstr "" + #: pod/podfile/static/podfile/js/filewidget.js msgid "Are you sure you want to delete this folder?" msgstr "" @@ -532,10 +521,6 @@ msgstr "" msgid "This folder is empty" msgstr "" -#: pod/video/static/js/ajax-display-channels.js -msgid "Channels" -msgstr "" - #: pod/video/static/js/ajax-display-channels.js msgid "Channel" msgstr "" @@ -548,12 +533,12 @@ msgstr "" msgid "videos" msgstr "" -#: pod/video/static/js/ajax-display-channels.js -msgid "video" +#: pod/video/static/js/change_video_owner.js +msgid "No element found" msgstr "" #: pod/video/static/js/change_video_owner.js -msgid "No element found" +msgid "Loading…" msgstr "" #: pod/video/static/js/change_video_owner.js @@ -573,40 +558,21 @@ msgid "Answers" msgstr "" #: pod/video/static/js/comment-script.js -msgid "Cancel" -msgstr "" - -#: pod/video/static/js/comment-script.js -#, javascript-format -msgid "%s vote" -msgid_plural "%s votes" -msgstr[0] "" -msgstr[1] "" - -#: pod/video/static/js/comment-script.js -msgid "Agree with the comment" +msgid "Delete" msgstr "" #: pod/video/static/js/comment-script.js -msgid "Reply to comment" +msgid "Cancel" msgstr "" #: pod/video/static/js/comment-script.js -msgid "Reply" +msgid "Agree with the comment" msgstr "" #: pod/video/static/js/comment-script.js msgid "Remove this comment" msgstr "" -#: pod/video/static/js/comment-script.js -msgid "Add a public comment" -msgstr "" - -#: pod/video/static/js/comment-script.js -msgid "Send" -msgstr "" - #: pod/video/static/js/comment-script.js msgid "Show answers" msgstr "" @@ -619,6 +585,13 @@ msgstr "" msgid "Sorry, you're not allowed to vote by now." msgstr "" +#: pod/video/static/js/comment-script.js +#, javascript-format +msgid "%s vote" +msgid_plural "%s votes" +msgstr[0] "" +msgstr[1] "" + #: pod/video/static/js/comment-script.js msgid "Sorry, you can't comment this video by now." msgstr "" @@ -639,47 +612,38 @@ msgstr[0] "" msgstr[1] "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is password protected." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is chaptered." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is in draft." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Video content." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Audio content." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Edit the video" msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Complete the video" msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Chapter the video" msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Delete the video" msgstr "" @@ -751,18 +715,6 @@ msgstr "" msgid "Edit the category" msgstr "" -#: pod/video/static/js/video_category.js -msgid "Delete the category" -msgstr "" - -#: pod/video/static/js/video_category.js -msgid "Success!" -msgstr "" - -#: pod/video/static/js/video_category.js -msgid "Error…" -msgstr "" - #: pod/video/static/js/video_category.js msgid "Category created successfully" msgstr "" diff --git a/pod/meeting/forms.py b/pod/meeting/forms.py index dd5b63683a..1d925b9712 100644 --- a/pod/meeting/forms.py +++ b/pod/meeting/forms.py @@ -260,7 +260,7 @@ def clean_start_date(self): not in self.cleaned_data.get("weekdays") )): raise ValidationError( - _("In case of weekly recurring, the day of the start date has to be selected") + _("In case of weekly recurring, the day of the start date must be selected.") ) def clean_add_owner(self): diff --git a/pod/meeting/templates/meeting/add_or_edit.html b/pod/meeting/templates/meeting/add_or_edit.html index cfcd0ded12..df7377e031 100644 --- a/pod/meeting/templates/meeting/add_or_edit.html +++ b/pod/meeting/templates/meeting/add_or_edit.html @@ -267,7 +267,7 @@ select_days_values.push(select_days[i].value); } if(recurrence.value == "weekly" && !select_days_values.includes(""+day_of_start_date)) { - alert("{% trans "In case of weekly recurring, the day of the start date have to be checked" %}"); + alert("{% trans "In case of weekly recurring, the day of the start date must be selected." %}"); let see_recurring_fields_btn = document.getElementById('see_recurring_fields'); if (see_recurring_fields_btn) see_recurring_fields_btn.click(); } From 264ad7884a60dd5fbb6af5b6b4a98e36d3aba572 Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Fri, 15 Sep 2023 09:50:59 +0200 Subject: [PATCH 06/12] add pydoc --- pod/meeting/forms.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pod/meeting/forms.py b/pod/meeting/forms.py index 1d925b9712..9bb9548fc0 100644 --- a/pod/meeting/forms.py +++ b/pod/meeting/forms.py @@ -244,6 +244,10 @@ def filter_fields_admin(form): form.remove_field("days_of_week") def clean_start_date(self): + """Check two things: + - the start date is before the recurrence deadline. + - in the case of weekly recurrence, the start day must be selected from the list of weekdays. + The function raise a validation error if a condition is not met.""" if ("start" in self.cleaned_data.keys() and "recurring_until" in self.cleaned_data.keys() and self.cleaned_data["recurring_until"] is not None @@ -264,6 +268,7 @@ def clean_start_date(self): ) def clean_add_owner(self): + """Check if meeting owner not in additional owners.""" if "additional_owners" in self.cleaned_data.keys() and isinstance( self.cleaned_data["additional_owners"], QuerySet ): From 112881d3e695facbd99c6b0182492693cca180fb Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Mon, 18 Sep 2023 16:38:41 +0200 Subject: [PATCH 07/12] fix recurring options and computing --- pod/meeting/forms.py | 5 +++++ pod/meeting/models.py | 25 +++++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/pod/meeting/forms.py b/pod/meeting/forms.py index 9bb9548fc0..1f5112e9e3 100644 --- a/pod/meeting/forms.py +++ b/pod/meeting/forms.py @@ -267,6 +267,9 @@ def clean_start_date(self): _("In case of weekly recurring, the day of the start date must be selected.") ) + if not self.cleaned_data.get('recurring_until'): + self.instance.recurring_until = None + def clean_add_owner(self): """Check if meeting owner not in additional owners.""" if "additional_owners" in self.cleaned_data.keys() and isinstance( @@ -365,6 +368,8 @@ def __init__(self, *args, **kwargs): self.remove_field(field) # remove start_at self.remove_field("start_at") + # set min frequency to 1 + self.fields["frequency"].widget.attrs["min"] = 1 def remove_field(self, field): if self.fields.get(field): diff --git a/pod/meeting/models.py b/pod/meeting/models.py index 68aaca7504..b9e845dea2 100644 --- a/pod/meeting/models.py +++ b/pod/meeting/models.py @@ -26,6 +26,8 @@ from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from django.core.validators import MinLengthValidator +from django.core.validators import MaxValueValidator +from django.core.validators import MinValueValidator from django.db.models import F, Q @@ -208,6 +210,7 @@ class Meeting(models.Model): frequency = models.PositiveIntegerField( verbose_name=_("Repeat each time"), default=1, + validators=[MinValueValidator(1), MaxValueValidator(100)], help_text=_( "The meeting will be repeat each time of value specify." " i.e: each 3 days if recurring daily" @@ -438,7 +441,9 @@ def check_recurrence(self): # noqa: C901 self.reset_recurrence() next_occurrence = self.start for _i in range(self.nb_occurrences - 1): - next_occurrence = self.next_occurrence(next_occurrence) + next_occurrence = self.next_occurrence( + next_occurrence + timedelta(days=1) + ) self.recurring_until = next_occurrence # Infinite recurrence... do nothing else: @@ -472,15 +477,15 @@ def get_hashkey(self): # ############################## Meeting occurences def next_occurrence_from_today(self): - if self.start == timezone.now().date(): - # start_datetime = dt.combine(self.start, self.start_time) - # start_datetime = timezone.make_aware(start_datetime) + next_one = self.next_occurrence(timezone.now().date()) + if next_one == timezone.now().date(): start_datetime = self.start_at + self.expected_duration if start_datetime > timezone.now(): - return self.start - next_one = self.next_occurrence(self.start) - while next_one < timezone.now().date(): - next_one = self.next_occurrence(next_one) + return next_one + else: + return self.next_occurrence( + timezone.now().date() + timedelta(days=1) + ) return next_one def next_occurrence(self, current_date): # noqa: C901 @@ -494,7 +499,7 @@ def next_occurrence(self, current_date): # noqa: C901 return current_date + timedelta(days=self.frequency) if self.recurrence == Meeting.WEEKLY: - increment = 1 + increment = 0 # Look in the current week weekday = current_date.weekday() while weekday + increment <= 6: @@ -553,7 +558,7 @@ def get_occurrences(self, start, end=None): while new_start <= real_end: if new_start >= start: occurrences.append(new_start) - new_start = self.next_occurrence(new_start) + new_start = self.next_occurrence(new_start + timedelta(days=1)) return occurrences # check if event is in the period From cbd22c79efa749b071ae9a785c94482f52281c1e Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Tue, 19 Sep 2023 10:13:20 +0200 Subject: [PATCH 08/12] add aria-hidden in icon tags --- pod/meeting/forms.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pod/meeting/forms.py b/pod/meeting/forms.py index 1f5112e9e3..46189c1e38 100644 --- a/pod/meeting/forms.py +++ b/pod/meeting/forms.py @@ -165,7 +165,7 @@ def get_rounded_time(): ( "main_fields", { - "legend": (' %s' % _("Main fields")), + "legend": (' %s' % _("Main fields")), "fields": MEETING_MAIN_FIELDS, }, ), @@ -173,14 +173,14 @@ def get_rounded_time(): "input-group", { "legend": ( - '' + '' + " %s" % _("Date and time options") ), "fields": ["start", "start_time", "expected_duration"], "additional_data": """
""" @@ -200,7 +200,7 @@ def get_rounded_time(): "input-group", { "legend": ( - '' + '' + " %s" % _("Record session") ), "fields": MEETING_RECORD_FIELDS, @@ -213,7 +213,7 @@ def get_rounded_time(): "modal", { "legend": ( - ' ' + ' ' + " %s" % _("Recurring options") ), "id": "recurring_fields", @@ -225,7 +225,7 @@ def get_rounded_time(): "advanced_options", { "legend": ( - '' + '' + " %s" % _("Advanced options") ), "classes": "collapse border border-primary p-1 m-1", From e9018ffbd96f13ed0cb0ff6c16a0e96e30d5917e Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Tue, 19 Sep 2023 10:17:53 +0200 Subject: [PATCH 09/12] add pydoc on meeting model function --- pod/meeting/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pod/meeting/models.py b/pod/meeting/models.py index b9e845dea2..6ea3c2f824 100644 --- a/pod/meeting/models.py +++ b/pod/meeting/models.py @@ -477,6 +477,7 @@ def get_hashkey(self): # ############################## Meeting occurences def next_occurrence_from_today(self): + """Returns the date of the next occurrence for the meeting from today.""" next_one = self.next_occurrence(timezone.now().date()) if next_one == timezone.now().date(): start_datetime = self.start_at + self.expected_duration @@ -585,6 +586,7 @@ def is_active(self): # ############################## BBB API def create(self, request=None): + """Make the url with goods parameters to create the meeting on the BBB instance and call it.""" action = "create" parameters = {} for param in meeting_to_bbb: From 998f5d0714491f6470824c66ecfac2675e30d2b2 Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Tue, 19 Sep 2023 11:52:35 +0200 Subject: [PATCH 10/12] fix recurrence and test --- pod/meeting/models.py | 19 ++++++------------- pod/meeting/tests/test_models.py | 24 ++++++++++-------------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/pod/meeting/models.py b/pod/meeting/models.py index 6ea3c2f824..ca2d3239cd 100644 --- a/pod/meeting/models.py +++ b/pod/meeting/models.py @@ -441,9 +441,7 @@ def check_recurrence(self): # noqa: C901 self.reset_recurrence() next_occurrence = self.start for _i in range(self.nb_occurrences - 1): - next_occurrence = self.next_occurrence( - next_occurrence + timedelta(days=1) - ) + next_occurrence = self.next_occurrence(next_occurrence) self.recurring_until = next_occurrence # Infinite recurrence... do nothing else: @@ -478,16 +476,11 @@ def get_hashkey(self): # ############################## Meeting occurences def next_occurrence_from_today(self): """Returns the date of the next occurrence for the meeting from today.""" - next_one = self.next_occurrence(timezone.now().date()) - if next_one == timezone.now().date(): + if self.start_at == timezone.now().date(): start_datetime = self.start_at + self.expected_duration if start_datetime > timezone.now(): - return next_one - else: - return self.next_occurrence( - timezone.now().date() + timedelta(days=1) - ) - return next_one + return self.start_at + return self.next_occurrence(timezone.now().date()) def next_occurrence(self, current_date): # noqa: C901 """ @@ -500,7 +493,7 @@ def next_occurrence(self, current_date): # noqa: C901 return current_date + timedelta(days=self.frequency) if self.recurrence == Meeting.WEEKLY: - increment = 0 + increment = 1 # Look in the current week weekday = current_date.weekday() while weekday + increment <= 6: @@ -559,7 +552,7 @@ def get_occurrences(self, start, end=None): while new_start <= real_end: if new_start >= start: occurrences.append(new_start) - new_start = self.next_occurrence(new_start + timedelta(days=1)) + new_start = self.next_occurrence(new_start) return occurrences # check if event is in the period diff --git a/pod/meeting/tests/test_models.py b/pod/meeting/tests/test_models.py index 9497896a3f..4a3e13f2f2 100644 --- a/pod/meeting/tests/test_models.py +++ b/pod/meeting/tests/test_models.py @@ -9,6 +9,7 @@ from django.test import TestCase from django.template.defaultfilters import slugify from pod.authentication.models import AccessGroup +from django.utils import timezone class MeetingTestCase(TestCase): @@ -164,7 +165,7 @@ def setUp(self): def test_models_meetings_get_occurrences_no_recurrence(self): """A meeting without recurrence should return 1 occurence.""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 7, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 7, 14, 0, 0)) meeting.recurrence = None meeting.save() self.assertEqual( @@ -180,7 +181,7 @@ def test_models_meetings_get_occurrences_daily_nb_occurrences_filled(self): """Daily occurences with date of end of reccurrence filled in but not \ number of occurrences.""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 7, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 7, 14, 0, 0)) meeting.recurrence = "daily" meeting.frequency = 1 meeting.recurring_until = date(2022, 8, 2) @@ -220,7 +221,7 @@ def test_models_meetings_get_occurrences_daily_reset_recurring_until(self): """Daily occurences with date of end of reccurrence not leaving any \ possibliity of repeated occurence.""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 7, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 7, 14, 0, 0)) meeting.recurrence = "daily" meeting.frequency = 3 meeting.recurring_until = date(2022, 7, 9) @@ -242,7 +243,7 @@ def test_models_meetings_get_occurrences_daily_recurring_until_filled(self): end of occurence. The date of end of reccurrence shoud be calculated if \ the number of occurrences is repeated.""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 7, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 7, 14, 0, 0)) meeting.recurrence = "daily" meeting.frequency = 1 meeting.recurring_until = None @@ -315,25 +316,20 @@ def test_models_meetings_get_occurrences_weekly_null_weekdays_is_reset(self): def test_models_meetings_get_occurrences_weekly_weekdays_include_start(self): """For weekly recurrence, the weekday of the start date should be included \ in weekdays.""" - meeting = meeting = Meeting.objects.get(id=1) + meeting = Meeting.objects.get(id=1) with self.assertRaises(ValidationError) as context: - # 2022-7-7 is a Thursday, and weekday 2 is Tuesday - meeting.start_at = datetime(2022, 7, 7, 14, 0, 0) + # 2022-7-7 is a Thursday, and weekday 2 is not Tuesday + meeting.start_at = timezone.make_aware(datetime(2022, 7, 7, 14, 0, 0)) meeting.recurrence = "weekly" meeting.weekdays = "2" meeting.save() - msg = "The day of the start date of the meeting must be " - msg += "included in the recurrence weekdays." - self.assertEqual( - context.exception.messages, - [msg], - ) + self.assertTrue("weekdays" in context.exception.message_dict) def test_models_meetings_get_occurrences_weekly_recurring_until_filled(self): """Weekly occurences with date of end of reccurrence filled in but not \ number of occurrences.""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 7, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 7, 14, 0, 0)) meeting.recurrence = "weekly" meeting.frequency = 1 meeting.recurring_until = date(2022, 8, 2) From bc82951d41cf23e859c235c8a21ffc5eeb257dfc Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Tue, 19 Sep 2023 14:36:45 +0200 Subject: [PATCH 11/12] fix translation, add optgroup for frequency, add unit test for weekly frequency on monday --- pod/locale/fr/LC_MESSAGES/django.mo | Bin 165832 -> 165913 bytes pod/locale/fr/LC_MESSAGES/django.po | 18 ++++++++++++------ pod/locale/fr/LC_MESSAGES/djangojs.po | 2 +- pod/locale/nl/LC_MESSAGES/django.po | 17 +++++++++++------ pod/locale/nl/LC_MESSAGES/djangojs.po | 2 +- pod/meeting/models.py | 7 ++++++- pod/meeting/tests/test_models.py | 21 +++++++++++++++++++-- 7 files changed, 50 insertions(+), 17 deletions(-) diff --git a/pod/locale/fr/LC_MESSAGES/django.mo b/pod/locale/fr/LC_MESSAGES/django.mo index 1cb1e6f03370508c8d7ddccce1412dac141782e2..0b9b62f12dfe15fac0bfdf3f33ebf91fe3b4f059 100644 GIT binary patch delta 37777 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 delta 37702 zcmZYI1#}h11Ml%of(3^FK||0$&=6b$!QI{6-GVKy#ogWAwYWPJcZXudTl{^0cZUDt zoww&~KjXGDdv73ZXHJNIe0+5GPW(ty9j?1k949#@$m2Mfd>todN2NN>j!BMl(aUjm z;u8F0isQ5;J!G2Wh5T5NcsneQyHNF_&N1~0V*v3km<}gkLEMJ9@I98mjB^j*hTgae>)~2VjK1?7he$3@pNp0aTb~ME|`hwhRs>^W4@`-JF&Qqxq_`JV|2nc~ zo#&`W_5sySv}KNy2os?{X0et)4Y0v7)?YL4Y6}iUH8>mfOxIv^Jc4QQJgVW3sG0gK zH|67_W|jscVJK=qc~RwxVKl6Q1Flke^cZ8M;{;<4jDihN189!Xup?%{Ua0<-Vo`K&*#ZHp9H$ToL8uY8KvnE+?T=ci z;pmGqFe5I){CL_Lbv5q*;>EBuj>9~76;&_J8q`AsHMJ#8SpD=Mboa;qvHAJB@mN@La2POm#v%R+wG!V^1M=Nq_DXWp#KO_l%xe(P zQZ_|BqjuIFsE%CJOh?%Cg_xE2YRrT;Py>sy(UgmYsuzSBNH!ZUf*NQkRDV@Bvi`9N z)FUAP+oG0w6l&xPQ3G6Sa2vx2m#>0x6 zSpQfA8ruRLu`KaksN-=E^&*P2*_{9USb%sV48++OgnKXtKEfjCzlGSLrrKN zs{AU{04}-&h7ov#T8Xw>&0dH=J&Mt&50NPt884t3x{4b3LsSQEF)n^a%{2Npv($d5 zcmV2A1z~)whAQv2B%p?Rp_Xk8Z3|Mpapsw#stJiqLy?n z>Qi(*`rv6){qv|5ykmWYQFQ*F6VOt>MZLSfqGs;wG@phsP%}-1>L3KwV7RpkYDpWR zKXyf}&}dYLGf|s+K59UFQK#h~#@6{iK|r5s*HBCR0rie|c9~DTw3wG@aa0HWF*i;{ zKRk`Wcn?D`#%{;SjD=9oxGn1a(HAw)nWz8~O zU@9Df8o*LahC4AOUbg8UZQS=yvw|5>6U>K!SmIB6{#)9N9;nSU2=z?Ip_YCzs-w-Q zM{^9d#1~Nw-p5dUg*slT_L>zbgL#N|N3F;jOo!JoA^zOU`fElB_i@B92*Yp>4#n@- z2nX*soAd!{ulOA>n=b`cA)X$U-rG9Z=Kq0O@~Jj`1!_-h!Vuiy63{MwZVSA(1-_#; zna@G9DdV9YMIzLIgKRvXwJd6d>Y-Mq6Y7x+K<$}XsQQ~w?H)q4<6a=33J+0B{m#a{ z51Dv8)BsbVItWJXmBKdO9+MLvh-z@Ib-ncfYQ}$|9@TZ!?tg63UFRhMJ=1rn4!)xb z#yf1zdkWNE$c^ft9BM`lP&4X*DnA@mZjyC5rXaotHL)A$S!wHgjIHzk%@&Ap#59l$ zwF$GMma34o9EKCGgIck<)-|XOcB2oTLUnWwHGpfV&Grd1V$7pv6XwQ5^zYOspn}~{ z4NXKfun^PYD%30Z9BN=!t&cE(_*>LU#64yo6>3F;QLo%ws1+-Z8hCRX?}n~+=NJN7 z!g;6xtisf|3lrmQRJl)B0)3C0m8pc<^$l#i6-Fc81J&LDtc9ad1AKs5(f1e`y-u+H zTAHXQ%*aw;6yljN1Vd2+Xn}gR15kTpGOB~+7!5b08r*}vco4NoPh%wfV*QC)!AK{~ z3dK9g`umcQoCGaRdeoBULajt~)PS1Xcso?Nz8DopV=ePy-9L@tmj*3)u8Crt+Ko#FxBcCyGe@sPsM$CZaP)pn$HQ+uN9fzYDoM_W$pa!}GHIOx^ z72Aqoco_3x*#-Xnt(2jn{~;z&<$WFY}%8 z8&)Ac_!8ge@Ddip442K1WG%22@dc=I(XN;ev%0A76T8q=gYOBbV8^SBnx(pewTXYG zSFK3Z>t-oyTN|N{ZA(my{ZNl!DyGJzs2Lu&e!$$s18#{kp>=Am}`64awSWxaZv z_16pKAqlGRFDmYT$2`MKsAruEm0t)o&<3c6yP-C11ZKm*7z;O{Htl{?`BOLw?_(`& zcbA{G@Q_PDA1dkZ8QY>dT!%Wp+fW^xvR=Zt#BZa@y+-AKLY)Q40TbhXq&2}H)Rr~ynybufTgGkYfugBL(T9ks)L)T zXaCfu|BHo)M|xt8aWTwCd<^cwBd8S^_>|`#nZU%Sro-u|O)?)#cLHot|gpTpfMM7>jCPx{c36 z4R8hO*>6B?!mX%Na2>TGpHKry_`+<~Ak=`uQ0kz4nxg&BC5hX zREH~2yMHZe#z#?)?h0z4x6lV4qS||ks{aOcEWcoMjPug;lN8B!o%95}$;ghu7>a?| z5M!W=+H_-31DJ)H;bzoKj-Uo~&E`MDbi}=0nT~_7F!6$@iS$JcWFY#|zca>WOvRXF z%)(f>9M$nw)JzYfj@3!j8}JTlW*;y$`o1;;%Z#d57&Wj8s7KcTwIVHWK6b)PI{$J0 zF)x?`)^?}{XJaDVi*fKWs-efIC4Pn4-JehcjQYk5FcvDF3ROP{V`E`!1=PUnqpJqH z5a@srsHJ&|>foLAt2NSF({L=zNxmQI*_X!ZSP9k95{!qNtw(J7RU3bTamfGgE$gq2 zqP;V_Hy&y?XUBM00pnvM)L!U{I!*&nGu(=5Xg8{zQ>X!4LbdY{_3n4xn?02p)o!@8 z#(UOZE6|Dr73_ri(3yy_aHWlJM=jYo)Fyg_>hN#tJB&;GE2@K-AIv}kPy@_jEri+w z6|A*f0>wyZf?>D>v*BaxhzUQkL2;-x?k9feAU+2}G3Z~jyX#>N;ogn|BFnZ@9Y%q$F?w1Mw}Y;rO4;5|+fA#G7F*oPnNKF(xMd9220=7ZXp6Nr{JG zW-N~-F#=U?zxA@wb)FN*O2$vr$g+Ml1&gDeVI6FZJuw;HMGfRDR>Y8R=Bw2})XGHv zZqldXa^jD0EB^7rtZ=cPX0s2$%sT&X3Fz4eI9{F?P#EgNqaA97qfi4`gj%wFSPrk) z^weHno~15=SxE1MHE=FA#`l;Jt9yHSzVi*R-pBa#?-cj(@@$G)sE(STj@1CvaU6!) zY!grenrY*kP~~=`HrYYcroD*T)b~)E@foWA7mSZSk-R*cJQ2E?NXSY+4b??IY=U|e zJ#2gorYAlh^WafTfh$zP_18DDm-+Mm!6fM1PDG7# zfpsP7Q*9G!U>8v39-|)72h^J~eiXBUxvWJ{uktde@-oOIBb_zcIe-5V2qYnPOtZwG8w9aT&VnFsQj8Xy*X<0c0qMC2DMivp~@{p zt<-v(e#FKvp{oX;6VMXRHx9t%PgyC!kKjO4Oq|fZ9WMP#wR= zEa(--Z1QYalz3gtg>&L?{n`EmX=!YzKr2dHBhH-VQk2g_p!{*7ud zSwgcyp~zx66;Y3_ej@X%o1l*KAk-sUgIfBXSR2ow_C^MO^N6y$1oX^`pw4kg)b4DG zTJj#K3Nuj+F0`&gZKB;+2@j)AL4w3yo{#IKsQgN(M_b$47WIhwq4tP7k$^f}fSTcE zR70omI9|ZUI4g;n$yd}PitPo&O&M)IszB^UTws9zhw@%qpQ8tc7WDI+nscs67!Wr70iJ>W_N%DNrky9yO5= z)FW<&TG_tn1`(J@K(ExDI1n$Q8m<;-R-!Q~J^2Xhgx zifV5p>f?C|s-5kqXTJ|MfD@@*FV9ad=Sk4BO_#>JfC{22RJPVeJ-f!JnY6IBLp9jN z#`{_ap*k3Wn(;VP{rT10X zGMFXLhhfBfp*r4y8SpZG#UGdvzhpG^(*~QpRRdMNBkH{{26^SX&T0bMgwHWO#?NGS zc|NR2ydi2vYcUW{VO@NQT8UDbO$SX;@xG|tKF!9DqgL`EYDLmzF#{=%De2#7LO?Sg zgz4}qHpcH*92;i!^89GE7)ueqf?B$OZ049{$Na?ep~`p1s<;z%Y-46Od!#&;BwiCW zpt)F#{++u7w8W`H%nS;n22uxu(Z$TT3boW%F(*1Xyqs>33$?jc;yhf3+N2di%|NT6 zj&BRprtFH^v=Qi*B`}15mi{dAPIf+`o_&&>X2xYvAG?#VG@ioBm>`#z=NA-PpdQH~ z%z**9%~DsvVZ=LQCj5kYM5*(bJys|W=U*MxA|WgG#c*7OY4J7ch2xjkENLb@OMCz> z#0vS$fc`f}XHY8Z9HhQ&5}m6qZ20FfV5W*1@fKAGO5Oi<%YLg!)Ex3bkqPVqAP{ zb-jz35&NNLlmzt!A(c(fjoLH?Q7aIRYOo@n!KSEZn?2l=tB+yCn_)g&f?Dc3sB*r= z%}VFO0y_Vl38;fLr~z!Y?zSF6AJR{u9?dz_ZvTXOk$gpUkgSB6c}dhGXku-J`aaMB z)lPrZ8+H)p(fMCbKpzrMQE$HJCCz}+qMl(U48&ZhV_FmSSYpCP) z9JP1;MLqk-rOe93L&ei!Or8G_0(vHeQMrypTZz~f!h6kWzFY) zax6$Z8|vJ*M=kw)%!o@-r{WyydxB3nlb^_%yd3A>^Fpu*g;1L-95usQsHJR!8gWn5 zvm9pAr`q@;o4*M)kprmBdI}Tb71SepiGk=--sGn(@0w?yjReiODypL{sAo42HGpxb zm6&bajoQsOtx+qOfrX+TWjLzC>Zo?wq1uf=wKEb`e}zjxOLYl#3Vxs(h+NT(FcIp7 zk;=yNp*Bx(RJqEim1=_Opc|^4!B`kaS&ySmSJXJdSug3k76U%!vmNHQ&cwX)Ign6#| z60c!bOj*UuWD>R`egQLJp{l0imYA0KLDWh)l7R8t<_NzsEc|JG{LAk|1E4r z2OK~~choU^kD5_nbuXtM*2cbg8TA6GQo|fK7nQya&th;*FJ~-%Mh$30E#pQ^Py8n8 z`-XRI%F(}5n}BBU1og~f)G^PvELI?16LtQVpf>4o^t`Z8n<;u-lOBvZ_hm3EwnKeO zo`rg3*DyQ2N41l-9_L?Qt-=ZDyIB)dg9A|M^H2lZW8?Qx4gExwPg>uU%Y%B>HEg^K z>ifcY)WDBp5qxR$GdD2(lx@KISH-p@sH5SS4OgQ&x@il3LUov^p)nLSlgg->4njSW z4X8(V2M=S6M&<={9;*|N)Y$wOUI(iZ-_)4%uZ+k|Ov80?1@T^}h60Kxz3Ncb4_ihYhcwjWXF`zz{&6uFHl=a1gRlcSDbO4LBp8(pU; z0nNC+wJoY(Z`7O4wT?l}d^)PZC8+nta@0&Vpa!%LHGq>gehbykQ`C#>J*s@Pwo1>$ z-}ewuLuss;t+`MGDU6z7iOCCd`ng){2BheGbVoHg3Dxy-)EaF{>o)Ej66R>5d} z%`2=f>K!`~^=WYsJ%3+zpFnvMV)rv|^?KNd_-t&9Us3P4`u)wTX94QOpG7^ozfqeq z@&NN=ZUAN^UL3U-I^uBbX7j(`bmD>Ry_7D29R$kZHPpvS+JWX7HplkFXQ7^5)IsJQ z8V^06cbJm&aBPjua4DX~{@8V}m*@BB-k?5(iVrbAs&vO-;_K1#_vJST@ZxYDpk@|( zsCfxzMD6M@)VZ&LnsEfGkTT$PPMb#UQdf6`<#`#yp zLnOq<``8OVpuRV^A8r~LhWJWhRaYByMXHFJL+AT zY@``@@JNSPC+Nsd%#^lKoypuI^KXGxD&M*U!aa*rm?162dqfE7iz#qQS~mN z-gLK7OZ_+M<1Okqv$6@W81cfW`h&2QzAv9A(36C`NP`6pe;_tuBgo(ZK}!lM^_^aAfP4BgW60* zQOBk>YS#`$?e1x)atm#IHL8Pcs1Em{_P`OFe*sGqzlCKm-856a6KchKP2>D)=_ZjN zSJ(o3Q4JkMb$k&uu-ljpKcJRA>2!0P@}mY?0rg^Ogeun$_2OEDdUQuo1Ac^B@t4y% z|2mIRW|(K11hupw*8Hev7LGc{wNNY23hQDQ>uJ=v51MI?SxqcRd;;o2=Zy6S>NI7W zWxl6(aS4nh%KtsE#Y4_DFNodGC*Ea181Nvk+DPHfjPdQ4N1U zmG_!wRyYnSo*K0mvSXmme;)#Rma|cBq}`}pd;s<8y@wir&wO(#lB1qoebkcoL_LzF zsF|%tl|O(w|2I%8@(H!+zFQM7(9dX`zfb~dpf>7RH%0A%o@ic?rh#F^wS<45-rX}$ zGo6c?*(%h)cAy4u5w(IZQ11(8p&3wOR6Hm8(Z5rkfI4c7>9M7ak3|h^GOEG3s2OiV zHT)QZ@ryOxBJ;=Bl~En6!$Nq}#v?5@Utp4BPSVSw8%n?>ppkFJw0H*fjNhS-QM4uI zdwy2TL%a#548fJsP{m5)Bu~I1{{HEXC7+6yHUIUKI)D664l;!%#FUw&B}!>cg?G_9SIug zRMZSlqDJVw!gQ3)S_0RRUJn~!^p#%D7Ho~(FvTkK88Q*IhmKg!Vq@Z0Q3J`l+C19g zE&*+xil}E+AGM3S+XBO}F!2efU3|`_UqQ|A9;*He)baa_dZBr(F#}J4iU*@st`O=J zR7dsab|Rox1K5N* z&PPz?pCR?x|LaUc@li{b7Bzq@s0NE#%b}im4O9p1Pz{ejO<)#k)9ppg^qTb_)E*_P1oV#Xjar(OsHHuO8qhh^ro4t4*i+QZzoKRmYlG=9owXoVA-x(Z ze<^Au|HK4%27T}Wdj7ur2?6c?cc_sk*=WA=Wydh$Z7>zC!V-8I)lmFR<^>dl+Vwe6 zd!R0ApiNPq6+Ka#c?#n6h7~dG z0Xk#?-Ebjs_n?=v3R4~O^8BZZPGb||IS!i-qbca>9sQAjj$fuD=1)ErU=QNXQS;%` z6Q>j1ie0e6F@7_Ej`m?g;*n062{c1JiZ-Yf=!{yi2pL|Jewqgq6YXJ^#%((W%fb^)Tdr+)L!X{T7e6wnFpTs;@6pZWLO_(o-uz){0a3) z%A7Tuv&LE19IvJ}VFYHNz!X%$KdmQFBfgC3@jpz3DbJbBSQNDf%Ax94L(R0G&7X|g z19P!7u0d_;k1hedDB_+s1Id8PiB~{9f{)k>+g&iv{2}W75PZ>e*c;W+K-7{?w=Teh z#8;vQwhwh`j-ejW1=J>YuMyCj?l!8z8`Nfu@|Stx#6&fa3UzKX+IT)xxuQ0`6sqA` zsDU&@O{^8>M;EmMyR0XWeqHAp0naxWRD+*U?}4AF3UM!)50{jv0hB-us0QlI*8sJY zt!?@c)Xc`9+M9rBaT@A)?nVvl946NJe@Z~d%(-mLfqK(5N4+oxpgzSWpq6kcY5?m| zOTQg;tj=O9%znjmI0LH_{}Z)W;$JoCIZ+d=gGuS%X-hy24nr;BSR0>$8tEKVM_X+C zl+AyL8t4o3yt1#EAKT-gJ{=37+AEFP%#~1&rXK2%G)GrUH=lrJy32YRHRC&|J@Fn@ z(f7J(Fg~ioB&dO>vFVvmOPm8$uOw>V^-+(q8>+v-s1=xdo%7$6z&aAzV7wdV&D0lf z5Wj_LaQjX3EKi|2ynve7b<`J*d)6PAk$Cc3rsI;R52psGdLvOQIsvumSKQ+K>qBHW z2^#TT)RKNgtw@~P<_(q#wE~4u4VA=DtcZFs4MuIw^{5W^+4xn|0H2~(BJv%xvdK}8 zB*Z1)X&CjXR1($T5L5>nFb6(DZBqZc=1;%NpawD#waaIsR%AYE_b;=qMy<#O)C=qe z>W%vyHE}n~J@ZVepf*i=)U$~|?Sav#m6>nzx1x^gL7RRaHIpZ(53P5onSMg8V66LQ zfGJUXCLL@#}K?&5SUp-XCKB$KNKy|nn)xk#0id)gMGN@6hUa+>JV~ogbS|$JJPj_)FC8 z&i2H7de%jK+zv)hJE$dJh8oZY)Bq2n25=l*CEOyQC47LI@ki8>dp|YlaZ&L!I2l7w z13qHCgzD%aYVW*4mH&aYFy=E;zBzU!-VHUNC(k(l+Liy2pl6lrZ?hS5qL!`_YG5r< z1B*cIk>RLay%aT*bEs$j5Vdk%&&{8FBtlKFI;z9EsMFRSwHJCkcg?$b5(!yI*n-+z z4^T6V_re&6YA73Kz+9-MZisqc^g$h`DX59;Ks|yB*6XO1xsMv?JJdwtx-ZR$vtfD? zilb)U4mI<^sF6>_FkFr`@fqgABCpI>w;s5d_;Z|w<6fJ1x_``9xD!}{^k{F)x8jOe zmbg2DfHu=btbhsM8k?a;x)C+fbEuiWMlHSnJJWDc)Ti4(tcHtF?R`Rh%gy)Rv{MJQ zQoT^=6Oom2os9%?kZ=-f;CIw3wAu$#p`CRY7AAeZjo(2n^?#^66z`+?HIQ(&_ z^~iF3HJhmpW+L9x#us6C;`>l5l=GYU38^OP*p9op zdC^Qjoq}bkfow+Y=G*9tPi*`R>d}2h9Yg=0W;3QkZQ3lTJyix>eQ4AppiS2l6^}qY ztAVJFW?^1DZ1caPKJ6m$^NfyB0#w5xs1>Pz1+cqK-+(#|r>&Q)w;XTR^Q<3{pf}t% zn~}%M+w-a|f|_x0)OWZlsAJjFrVq1D!a&mJqXxd;dIQrD|A2ZlNxi*2D^e2GPIYhB z+w*Lik)TaC4AsC~)aKfb`o?k|wfkS7RwRLsnQ>uMy}GD+T~QtVVcmf${|L1*u_GCC zq3YFl38-Rs)RK-vJ&Ji41Gl0YJbBrxK`V)f2U;2H5yW)C*|>s)NO-_riA6X1apf)z8q=K~yuL zVAN*Jk0r4-s{DLpVw`^hTB6&iXB{<~nMnfFBglhlurg|eTA>Ek3rpi548)VDaxYK= z_4YLbOo&?goTz7B4>f?cSWf4^9|1jr1pMdVBt$!AWFh*Z@OFAAvQz zc*UdkKpcKWMvulH%VJ@dfOhLB)Dq4?eHLs-ZK7mJ%w|i4Y9K4>IORq?y6UJUZDaE% zqc+)W)XJ_#?V-ci5YO0n=A_=9Uuto45zuaqz=Sy5ItSIjCe&^{h1vtRFcW@44KQ^w zZ|5y$z>b(Sx!IJXFo5_{)SfwvdI3GL`B74M+U5Hn0WE1Lsz6&zhoey)Zm{u_7)JaJ z>fDC}m}l4r)xmz$u6}?zMXyjR^Z|X*H>FuYKa4~?8OGQ74|$2XO?(-`Yv6WoJ7 z7?9d@m>Tth3B^DxhFYO!sF{vJ4R`_;#hIwnaTDv}Pt?bB-8A;iiK;gUJ^#Jjkp$Gi zR4j>0P)q*;)llTLX0v2Oo#PI;94Da~&Y#X4+ghkSG!|8Ev5g-`ZQ4879lxOl&?Pe-#J@jIx~@fg*C6J$u1<}5))i5krY>q}o8v(2fNJ

WvvKqsdQ>>Np*06J|kus^&!v zuq5h3rvhrAjjSzPTc90khFvidjQT%^E!ie)h0jpCyK+{uXF8*H z|8~^zyn)p)O*YehFVtz7jVZl&w3t($|9@xq_I$Yv2r&)T!XOIvLT#e?SRN0fW)Lrj z+5H7kuh^!jT|Nahpnp*HIYw~%M%^6bI@-;%U?- z{e&$sMp19)7Iwv5SgDw|=kEuihnu}n2fL8oBi!}&{ClfUNf=H-m*U=@|2)lqs7Elg zgxU4?u_tl=lIDxaIMje{pmu$acw!X zciaKx&2C?e+U=)MyY?+=>AfqMcYIpZ0E?pXOQBv^wQYJg)Qlof6B>v*c4P21E=O(3 zVHM5Z+J=>N{`V5lOyX2BOWnXa8TA4=fz>fZWz#`d)IcIoZ%P-nLf(H?c9MtYN;U4@A#@FK0J_gJe8Kefq7cX+9>mp+E6+s8{e) zo1U|lw^NLG1=M%J38)v)9@OrBjD8qU+nkOZ*p_$=EQkA1-?(Dd;ry2-kfe?||4mUd zT!Gq5C#@Gyo9&v7zehcaFQ}EtUe}zOvZzN`2eoo-Q62R|l^caxk;SNQ-J9!j{x#C0 zBn09O)BwJsK73NtGYuERVB%F!&$1t?-ey!s$87vM>V5DE(_q~C=Gf-6wnx=lf?C-f zE&*+(^ETr(>P_a|z-%Ia%ul=os^fvESMzpMxqYbPb_vz-UDW%-yP=tRJk*Q>Q2k^@ z<(Eg*bL$b%u55|f;U+W;$3`U^d1LIHwm}Jvu;XL9CF$lw2 z*so-$&xlpH3{$l<$L_c_W-Iemt}$|A zFwBO5?aVix%BVfC8mr-c48;WP&E_kOnsIy73eU#$cm#E9U!q%pK;jPO*;Yp_*)r6N zLVWt&S=!q-b8IqpDt!bVW@N8993@?s^L4RcfM~|vx)Pg2GSi1sT``EYp9h?*v(kE zo9pfTL&6vmwEO#ZH=AcG4kI4g!#vZSIE{Gro@NHe@K54zP%~fG%gpF8s-rl)%^R{j z79~C&wbB<*$1qle8CWKlz#9_U;ApJd$J_I}-j7i$QM0eve9KY0eLXhCnElMhYbOjO zJ_a@8HK-4ti>Mcq)89Ob_?U=jKGY+qjIq#-AP_)c1Zw2VP$PVZ&CzRs`7mmU8bCjc zi`TIRKF4kt#!Bk*ehccfoJYMMuAyE)w^66+73wqQ1JV!sf1qhF0KLh`hANl?lVCp7 zW~+wkV4!sl>Ui!zHMj>gqvO^qHvbX&lKu=e@OKy;eFmvL`j1UOuf$-~3nm}xSd~P5 z4A(<-&;?boKdRhFjD}OK^H3cvxABeEU8pzXA=GEeP1Ho3!St*1pPYa?$b?$DJg8S^ z5!B{sf_n8XMm@Wa7#RbGm=4pTW}X$bas^R8<%ZjMebhjkp(fhiruRix&uFmC7=c>S zX{bFg3pKDEHvKT_1#=uVfN!Xk@E&S@)QW?C#7Cm?=b#3(2(>aRQSEKE@qI%%|4KMv z3tmQ5yoDOr1Jtp3ifTB`Ff+3}sCt!AGpcWGXVd$jIvj4DfO-V8P%E!Ul)Ie>@2aJD{ZDN zKby3Abm&W+U)OTVR<>mW$@A=H82(#(y+{wYgPQAA?^o6T>jc~2AvM6Yiw1kqKxN|T z$;gbor>-t^J%n0KNV`DGBZ;r$<^#t$N`4R9 z`!qX^OvKs!`~?m#3d(&ZT%Yht(j&O9PA=5h-j(XCI1$86Pu^>0P6j^R?^vQ>fR!azh~vYbjk0m65eFX z7bL#}XJ|otT1!?SMK_CL8e(8sO(BCjpH

BENc}dr` zgtR|#osH+D&V9-p;2v$;S!w%H`9PP-Z3sM};%)pwd;kSnQeh`?et*h&U@J7COk?r~ zk{5@@>XJU4GWrnybu}PA68AV;XNT={6?JYB)(=_3Y~C@_^eN)}oeB0V(%9P<= zz_fo|lgOX+TY07D=dMb*o20KHKL@s_&Qm_Eo!BHqiZ*R2^_$xPD(@TVXYm?kYm`&#k|$^IS=3;4fRL8x1re z)rW!s6ygKbiACj#`0JWMU?X*YzxcgZCk}T;>I}03Q~p`vx=LC<5uQUI2`HQ1fW$*-V+~7 z`E|C=E!y+U-=E5Ph}&G%!iX~!&{V2BS&d;Be$*%+#!Us<1yMcu}Z z+C~ynM%NwOL792f--}bo|CjU`wp?b?)!Se@pq-f4ryV2)}_uGe;0 zgK23ZwFYtbCR~I3B5DO&AU`qlpQAQ)iqmpZ(qrRK@-EsDt+r047{9dS@F%ODE3Lkr z=qhOoD13?nF>HbUq|c?Xc63nF4y-rf8n(klw%kQ)M#?->BV7NI_Kdq0ZL}hu)7F_u zd--jD{rK&;|6SGT_^plAr;sjvvusSG`yrjM1u0wi$EKJ?vl-+3?)=#Xu zrjS0$)-frp9%ZiBa=CPv?@%BIjr67Pud6QwHrNp>Z3cNeD5IZJqNA>4c$4(Qir5Bs zk#>maMO$|Vb|$`-^dOb{?V3iOXa4gD$d_4Y2*m^M;bYRt+`i`zlC^3!oHLH_wjePGR%V9qsWPlwP-1eZKV&xf62Xx8t2I? zMXjjhHNy_1k0Grq;luP2N7r>u=>=(wMG& zwu3IDH&!{5?C>k|PF8MRUnx@qPf~BYt>?+$ACo8ai{!4Pz;OzvBy&08$b_$QzazYs zTUUJU>fGn)XgYTj8jHh#3R345>3`!!;&Vvq*}4R~zEV$ZJp8R@j2Fy0UONB;QHc|f=^ZRqm6Mn)4j#T{f5Z_+?wDo(NS!Q}BG}h#lQzFM`3LD-*J0ZJM42%CNh6ubnckk z8MuF44VckU<#T({a31b8WX7|dFQ&n7glCYiYZUo)urT#z5xzuz6~el5a1SOv!iV`k zr<0}JkEyJ-;?uw)3SK2`JmEAH)HM`e*a5A!-XSfk$##0tNkY==<2}+&+JU{G%re`? z7MoUr_Two{>z|&)vfLR6>)J{K8t6TYsljmTUnuB6+C$rr%I)VaOZ*|7zEJ|#M8ZX> zSDW-0giq0sKX)v`6KSUi*06(6c{dN4kI9HnC0(h>?4gRJ=~_fOe*xm$C(hq5I7_)p zksp;i8sVR$59HoVJ8QVNQT`&GM<#DOaa~7oD`_36(~9VSasG@?gOU4#;8BCk3)VvNyozpU-Fb^ z{S#2gp9T(cm*pPBeSuEL(NSRvucwl(Ex&cJh5W7LO~Bu;Mx_0IWg}jhgoHM6EN$N* z+=jLvsjlbzVR_iz|)3}dwS0J8<^6hA2 zvTY|B@dV_>Aa4u<7)^ZY2MDXk0bn&@-=C*7kRou$;(DO1LZrSt{Rbe+U4ws zCs1J=g$d?kr*KEoo^ywC>&il%Sd>kKi?}m!ud##bPJTn;O}S?>m~FHb%XV0c zya?_x)IF~9zjoUg3bms`Q8ET_mnW~Wt@JkqYm*=Ow?TEMVO@i%6J$I7kMc*jM^V3? zO;ed@gl}RJ(kJ3++DS^e!QAej{3D3Q-u_l0f^byQ>Qmtwg>Ry+Xmobc4kDxV4fS zpzAJWTM?ek{Res9Y`I0``FTok&aC1G<(p8hiS0vaxfoCaecBAAkvl{xVvgSm@E4HI zbw>V-ynJ|rI}2&yl+$&SxUT=`JO*h2l+%?7%My=*p_G|Pcq;W`+j>n&i)xBGSzL{r zdmsh)n~?wKD$0n@kdmA9Ae%RpvJr&SllO&&QqpJ%!q>QUy(g^*#v@*ra4@$nFZBEs z7~whO#i!mYrB$^R_YrBxh`-W!E5Z+Khh?a6iue;co{aAwkVRmKT4)PtLUamhK0W$+jcZpUfl=VKsg2#+MZkveV2t4RC?gYhD) zYna;8{P(LciR&qFmc%r~6O&$mwC6Pb>-vj85#lu{vy3uV2p6Hj?u5JiDun-#mYTNy zCVh}P;d(+^1o2>i6t`e?lE01I#BPcV0djx57iKnvzTWXz2 z`6%R_w{0zC0NJ=l6HiWgZ(HsxX>~O*ZZ6mJ`;-dJVnnmKb^S%9Wu}1Rha+rw8kK)t zmk9(DAEpk;FUsAG`-Lqq*0yzpv;*7^Df^1N=eCV7ETr@Qw@pyJu%dwVBJjqpVTYJ zy?}wd#oe^6tG|BQ$Z8`g$+$qJFgx0Eri^pJ=AW`A!OoOBNcnc$XSj7$qTWUFaxkkz z+~w^6OfGLq22#Mbu^mGw(_hd3_bZ%27s$|cfQJ2u52E2in3=RtEJXTY8n{Kd1%w-r zo{e~ZJCJ><%(b6-EltoFZ3okhaw`e1Bt0GV=j)w3p1>&zC$fdt64&*LwBN5jl+_iN z272O8;!$j;N`JuMViT`~rHHSvd6y|ykG8@{`;)folD~;?RMI9N9vj#5zw#|$JM|?) zS3TkfP0*P@!E?mFQE?98*$m(ucQL}chG9xN*=gh3umfd(U3;kO!(e=fjYBv?fhg zKhk;<-_6~JTUP}dsKdRVGEpeMg7ng)Hz59q@O{!U+s+>22h!3~zL9NHZOkXl^(FB* z0bM7!GZEMIi3S=`@s6!<49}2vnzT(go%jjrHN=v{^AUbw+X}wO|F$-Ou?}emICNDboNy0H~ z1GjA%m0Lnu3-a!e=1q72X_M*Tiyg#7!nbTam2bfvh4P`4KZ3ey)U|<6bfoJlnSYz0 z=b!)3NEPy0QLZ^D_b?5O#<%rUs5NCuQKk>!I;8iSJgA>v-RiWoijw_FO-SxMTujbuC!uxH@ ei-}L3J*D{On3MlWwb^g$_$S*>&GxGJ^8WzdAMF(Y diff --git a/pod/locale/fr/LC_MESSAGES/django.po b/pod/locale/fr/LC_MESSAGES/django.po index 343c6ca9ea..122d6ef3b9 100644 --- a/pod/locale/fr/LC_MESSAGES/django.po +++ b/pod/locale/fr/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-14 14:46+0000\n" +"POT-Creation-Date: 2023-09-19 12:22+0000\n" "PO-Revision-Date: \n" "Last-Translator: ptitloup \n" "Language-Team: Pod Team pod@esup-portail.org\n" @@ -4843,7 +4843,8 @@ msgstr "La date de début doit être antérieure à la date de fin récurrente" msgid "" "In case of weekly recurring, the day of the start date must be selected." msgstr "" -"En cas de récurrence hebdomadaire, le jour de la date de début doit être sélectionné." +"En cas de récurrence hebdomadaire, le jour de la date de début doit être " +"sélectionné." #: pod/meeting/forms.py pod/playlist/forms.py pod/video/forms.py msgid "Owner of the video cannot be an additional owner too" @@ -4893,6 +4894,15 @@ msgstr "Mois" msgid "Yearly" msgstr "Année" +#: pod/meeting/models.py +msgid "Choose repeat frequency" +msgstr "choisissez la fréquence de répétition" + +#: pod/meeting/models.py +#: pod/meeting/templates/meeting/recurring_options_modal_form.html +msgid "Frequency" +msgstr "Fréquence" + #: pod/meeting/models.py msgid "Every month on this date" msgstr "Tous les mois à cette date" @@ -5363,10 +5373,6 @@ msgstr "Impossible de trouver des informations sur la réunion" msgid "End the meeting" msgstr "Terminer la réunion" -#: pod/meeting/templates/meeting/recurring_options_modal_form.html -msgid "Frequency" -msgstr "Fréquence" - #: pod/meeting/templates/meeting/recurring_options_modal_form.html msgid "Repeat every" msgstr "Répéter tou(te)s les" diff --git a/pod/locale/fr/LC_MESSAGES/djangojs.po b/pod/locale/fr/LC_MESSAGES/djangojs.po index effcf8dfe1..0b5914f280 100644 --- a/pod/locale/fr/LC_MESSAGES/djangojs.po +++ b/pod/locale/fr/LC_MESSAGES/djangojs.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Esup-Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-14 14:46+0000\n" +"POT-Creation-Date: 2023-09-19 12:22+0000\n" "PO-Revision-Date: \n" "Last-Translator: obado \n" "Language-Team: \n" diff --git a/pod/locale/nl/LC_MESSAGES/django.po b/pod/locale/nl/LC_MESSAGES/django.po index eddd4a52cc..bae4f6d043 100644 --- a/pod/locale/nl/LC_MESSAGES/django.po +++ b/pod/locale/nl/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-14 14:46+0000\n" +"POT-Creation-Date: 2023-09-19 12:22+0000\n" "PO-Revision-Date: 2023-06-08 14:37+0200\n" "Last-Translator: obado \n" "Language-Team: \n" @@ -4598,7 +4598,7 @@ msgstr "" #: pod/meeting/forms.py pod/meeting/templates/meeting/add_or_edit.html msgid "" -"In case of weekly recurring, the day of the start date has to be selected." +"In case of weekly recurring, the day of the start date must be selected." msgstr "" #: pod/meeting/forms.py pod/playlist/forms.py pod/video/forms.py @@ -4645,6 +4645,15 @@ msgstr "" msgid "Yearly" msgstr "" +#: pod/meeting/models.py +msgid "Choose repeat frequency" +msgstr "" + +#: pod/meeting/models.py +#: pod/meeting/templates/meeting/recurring_options_modal_form.html +msgid "Frequency" +msgstr "" + #: pod/meeting/models.py msgid "Every month on this date" msgstr "" @@ -5084,10 +5093,6 @@ msgstr "" msgid "End the meeting" msgstr "" -#: pod/meeting/templates/meeting/recurring_options_modal_form.html -msgid "Frequency" -msgstr "" - #: pod/meeting/templates/meeting/recurring_options_modal_form.html msgid "Repeat every" msgstr "" diff --git a/pod/locale/nl/LC_MESSAGES/djangojs.po b/pod/locale/nl/LC_MESSAGES/djangojs.po index 970592bb6e..c2472d12c4 100644 --- a/pod/locale/nl/LC_MESSAGES/djangojs.po +++ b/pod/locale/nl/LC_MESSAGES/djangojs.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Esup-Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-14 14:46+0000\n" +"POT-Creation-Date: 2023-09-19 12:22+0000\n" "PO-Revision-Date: 2023-02-08 15:22+0100\n" "Last-Translator: obado \n" "Language-Team: \n" diff --git a/pod/meeting/models.py b/pod/meeting/models.py index ca2d3239cd..18abf49bdc 100644 --- a/pod/meeting/models.py +++ b/pod/meeting/models.py @@ -142,13 +142,18 @@ class Meeting(models.Model): DAILY, WEEKLY, MONTHLY, YEARLY = "daily", "weekly", "monthly", "yearly" - INTERVAL_CHOICES = ( + INTERVAL_FREQUENCIES = ( (DAILY, _("Daily")), (WEEKLY, _("Weekly")), (MONTHLY, _("Monthly")), (YEARLY, _("Yearly")), ) + INTERVAL_CHOICES = ( + ('', '%s' % _("Choose repeat frequency")), + ('%s :' % _("Frequency"), INTERVAL_FREQUENCIES), + ) + DATE_DAY, NTH_DAY = "date_day", "nth_day" MONTHLY_TYPE_CHOICES = ( (DATE_DAY, _("Every month on this date")), diff --git a/pod/meeting/tests/test_models.py b/pod/meeting/tests/test_models.py index 4a3e13f2f2..005a42c4b6 100644 --- a/pod/meeting/tests/test_models.py +++ b/pod/meeting/tests/test_models.py @@ -384,7 +384,7 @@ def test_models_meetings_get_occurrences_weekly_nb_occurrences_filled(self): """Weekly occurences with number of occurrences filled in but not date \ of end of reccurrence.""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 6, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 6, 14, 0, 0)) meeting.recurrence = "weekly" meeting.frequency = 1 meeting.recurring_until = None @@ -432,7 +432,7 @@ def test_models_meetings_get_occurrences_weekly_nb_occurrences_filled(self): def test_models_meetings_get_occurrences_weekly_reset_weekdays(self): """reset weekdays if recurrence not equal to weekly""" meeting = Meeting.objects.get(id=1) - meeting.start_at = datetime(2022, 7, 6, 14, 0, 0) + meeting.start_at = timezone.make_aware(datetime(2022, 7, 6, 14, 0, 0)) meeting.recurrence = "weekly" meeting.frequency = 1 meeting.recurring_until = None @@ -453,6 +453,23 @@ def test_models_meetings_get_occurrences_weekly_reset_weekdays(self): meeting.refresh_from_db() self.assertEqual(meeting.weekdays, "126") + def test_models_meetings_get_occurrences_weekly_on_monday(self): + """check a recurring meeting each monday""" + meeting = Meeting.objects.get(id=1) + meeting.start_at = timezone.make_aware(datetime(2023, 9, 18, 10, 0, 0)) + meeting.recurrence = "weekly" + meeting.frequency = 1 + meeting.recurring_until = None + meeting.nb_occurrences = 12 + meeting.weekdays = "0" # on monday + meeting.save() + meeting.refresh_from_db() + occurrences = meeting.get_occurrences(meeting.start, meeting.recurring_until) + self.assertEqual(len(occurrences), 12) + next_occurrence = meeting.next_occurrence(meeting.start) + self.assertEqual(next_occurrence, date(2023, 9, 25)) + self.assertEqual(next_occurrence.weekday(), 0) + # Monthly def test_models_meetings_get_occurrences_monthly_nb_occurrences_filled_date(self): From 305088c0b2f02094b259fc072432c3d8b65cf1a8 Mon Sep 17 00:00:00 2001 From: Ptitloup Date: Wed, 20 Sep 2023 11:28:57 +0200 Subject: [PATCH 12/12] improve display of frequencies choices --- pod/locale/fr/LC_MESSAGES/django.mo | Bin 165913 -> 165913 bytes pod/locale/fr/LC_MESSAGES/django.po | 2 +- pod/meeting/models.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pod/locale/fr/LC_MESSAGES/django.mo b/pod/locale/fr/LC_MESSAGES/django.mo index 0b9b62f12dfe15fac0bfdf3f33ebf91fe3b4f059..f47d3026c6406f08c6a69a4e9c727fcfcd7e398e 100644 GIT binary patch delta 19 bcmbO^fotXju7)j)i)J%AZ(lr{vFr^1Q6mU- delta 19 bcmbO^fotXju7)j)i)J$>Z(lr{vFr^1QUeH; diff --git a/pod/locale/fr/LC_MESSAGES/django.po b/pod/locale/fr/LC_MESSAGES/django.po index 122d6ef3b9..74f4070828 100644 --- a/pod/locale/fr/LC_MESSAGES/django.po +++ b/pod/locale/fr/LC_MESSAGES/django.po @@ -4896,7 +4896,7 @@ msgstr "Année" #: pod/meeting/models.py msgid "Choose repeat frequency" -msgstr "choisissez la fréquence de répétition" +msgstr "Choisissez la fréquence de répétition" #: pod/meeting/models.py #: pod/meeting/templates/meeting/recurring_options_modal_form.html diff --git a/pod/meeting/models.py b/pod/meeting/models.py index 18abf49bdc..11c1b4f823 100644 --- a/pod/meeting/models.py +++ b/pod/meeting/models.py @@ -151,7 +151,7 @@ class Meeting(models.Model): INTERVAL_CHOICES = ( ('', '%s' % _("Choose repeat frequency")), - ('%s :' % _("Frequency"), INTERVAL_FREQUENCIES), + ('-- %s --' % _("Frequency"), INTERVAL_FREQUENCIES), ) DATE_DAY, NTH_DAY = "date_day", "nth_day"