diff --git a/pod/locale/fr/LC_MESSAGES/django.po b/pod/locale/fr/LC_MESSAGES/django.po index fc02727223..9f30f2ee76 100644 --- a/pod/locale/fr/LC_MESSAGES/django.po +++ b/pod/locale/fr/LC_MESSAGES/django.po @@ -17,6 +17,7 @@ msgstr "" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD "POT-Creation-Date: 2023-08-30 12:33+0200\n" ======= "POT-Creation-Date: 2023-07-05 15:50+0200\n" @@ -54,8 +55,11 @@ msgstr "" ======= "POT-Creation-Date: 2023-09-12 15:15+0000\n" >>>>>>> b04f50a6 ([DONE] RGAA 10.07 (Fix focus visibility) (#940)) +======= +"POT-Creation-Date: 2023-09-19 12:22+0000\n" +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) "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" @@ -2346,8 +2350,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." @@ -2855,6 +2859,7 @@ msgstr "" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD "Cette vidéo a été téléversée sur Pod ; son origine est %(type)s : %(url)s" >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +"Cette vidéo a été téléversée sur Pod ; son origine est %(type)s : %(url)s" +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) #: pod/import_video/views.py pod/meeting/views.py msgid "Try changing the record type or address for this recording." @@ -2881,8 +2890,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 "" <<<<<<< HEAD <<<<<<< HEAD @@ -5123,6 +5132,7 @@ msgstr "Enregistrement" msgid "Recurring options" msgstr "Options de récurrence" +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD ======= @@ -5132,16 +5142,25 @@ msgstr "Options de récurrence" >>>>>>> 776d6e3f ([DONE] Fix : accessibility issues (#913)) ======= >>>>>>> 43dd9c9b ([DONE] Update : Playlist (corrections) (#923)) +======= +#: 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é." + +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) #: 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 "" @@ -5184,6 +5203,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" @@ -5654,10 +5682,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" @@ -5765,16 +5789,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" " " @@ -5800,8 +5824,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" " " @@ -7068,8 +7092,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." @@ -7499,8 +7522,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 @@ -8248,8 +8271,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 5c3ce79261..e64905e29b 100644 Binary files a/pod/locale/fr/LC_MESSAGES/djangojs.mo and b/pod/locale/fr/LC_MESSAGES/djangojs.mo differ diff --git a/pod/locale/fr/LC_MESSAGES/djangojs.po b/pod/locale/fr/LC_MESSAGES/djangojs.po index 814263b0fc..e552359f60 100644 --- a/pod/locale/fr/LC_MESSAGES/djangojs.po +++ b/pod/locale/fr/LC_MESSAGES/djangojs.po @@ -16,6 +16,7 @@ msgstr "" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD "POT-Creation-Date: 2023-08-30 12:33+0200\n" ======= "POT-Creation-Date: 2023-07-05 15:50+0200\n" @@ -50,6 +51,9 @@ msgstr "" ======= "POT-Creation-Date: 2023-09-01 13:56+0000\n" >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +"POT-Creation-Date: 2023-09-19 12:22+0000\n" +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) "PO-Revision-Date: \n" "Last-Translator: obado \n" "Language-Team: \n" @@ -214,16 +218,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" @@ -615,11 +609,6 @@ msgstr "Chargement en cours…" 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" @@ -648,6 +637,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 ?" @@ -664,6 +657,7 @@ msgstr "Ce dossier est vide" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) msgid "Channels" @@ -677,6 +671,8 @@ msgstr "Chaînes" >>>>>>> 43dd9c9b ([DONE] Update : Playlist (corrections) (#923)) ======= >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) msgid "Channel" msgstr "Chaîne" @@ -698,6 +694,7 @@ msgstr "Aucun chaîne trouvée" msgid "videos" msgstr "vidéos" +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD #: pod/video/static/js/ajax-display-channels.js @@ -714,10 +711,16 @@ msgid "video" msgstr "vidéo" >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) #: 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" @@ -735,15 +738,12 @@ 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" @@ -752,6 +752,7 @@ msgstr "D’accord avec ce commentaire" #: pod/video/static/js/comment-script.js <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD #, fuzzy #| msgid "Remove this comment" msgid "Reply to comment" @@ -771,17 +772,11 @@ msgstr "Répondre" >>>>>>> 96067166 ([DONE] Update : Displaying channels via AJAX (#910)) ======= >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) 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" @@ -794,6 +789,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." @@ -814,47 +816,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" @@ -927,18 +920,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" @@ -1011,6 +992,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 49ee9beae7..d495a584c3 100644 --- a/pod/locale/nl/LC_MESSAGES/django.po +++ b/pod/locale/nl/LC_MESSAGES/django.po @@ -17,6 +17,7 @@ msgstr "" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD "POT-Creation-Date: 2023-08-30 12:33+0200\n" ======= "POT-Creation-Date: 2023-07-05 15:50+0200\n" @@ -54,6 +55,9 @@ msgstr "" ======= "POT-Creation-Date: 2023-09-12 15:15+0000\n" >>>>>>> b04f50a6 ([DONE] RGAA 10.07 (Fix focus visibility) (#940)) +======= +"POT-Creation-Date: 2023-09-19 12:22+0000\n" +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) "PO-Revision-Date: 2023-06-08 14:37+0200\n" "Last-Translator: obado \n" "Language-Team: \n" @@ -2690,8 +2694,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 @@ -4841,6 +4845,7 @@ msgid "Recurring options" >>>>>>> 776d6e3f ([DONE] Fix : accessibility issues (#913)) msgstr "" +<<<<<<< HEAD <<<<<<< HEAD #: pod/meeting/forms.py msgid "Recurring options" @@ -4852,10 +4857,21 @@ msgstr "" msgid "Owner of the video cannot be an additional owner too" msgstr "" +======= +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) #: 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 must 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 "" @@ -4896,6 +4912,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 "" @@ -5335,10 +5360,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 "" @@ -6616,8 +6637,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 13689f247e..494186b997 100644 --- a/pod/locale/nl/LC_MESSAGES/djangojs.po +++ b/pod/locale/nl/LC_MESSAGES/djangojs.po @@ -16,6 +16,7 @@ msgstr "" <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD "POT-Creation-Date: 2023-08-30 12:33+0200\n" ======= "POT-Creation-Date: 2023-07-05 15:50+0200\n" @@ -50,6 +51,9 @@ msgstr "" ======= "POT-Creation-Date: 2023-09-01 13:56+0000\n" >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +"POT-Creation-Date: 2023-09-19 12:22+0000\n" +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) "PO-Revision-Date: 2023-02-08 15:22+0100\n" "Last-Translator: obado \n" "Language-Team: \n" @@ -199,16 +203,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 "" @@ -590,11 +584,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 "" @@ -623,6 +612,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 "" @@ -638,6 +631,7 @@ msgstr "" #: pod/video/static/js/ajax-display-channels.js <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ======= >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) msgid "Channels" @@ -649,6 +643,8 @@ msgstr "" >>>>>>> 96067166 ([DONE] Update : Displaying channels via AJAX (#910)) ======= >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) msgid "Channel" msgstr "" @@ -660,6 +656,7 @@ msgstr "" msgid "videos" msgstr "" +<<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD #: pod/video/static/js/ajax-display-channels.js @@ -687,6 +684,14 @@ msgstr "" #: pod/video/static/js/change_video_owner.js msgid "No element found" >>>>>>> 83c6f9de ([DONE] A11y for 3.4.0 (#914)) +======= +#: pod/video/static/js/change_video_owner.js +msgid "No element found" +msgstr "" + +#: pod/video/static/js/change_video_owner.js +msgid "Loading…" +>>>>>>> c3c05541 ([DONE] fix recuring date in edit meeting (#946)) msgstr "" #: pod/video/static/js/change_video_owner.js @@ -707,40 +712,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 "" @@ -753,6 +739,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 "" @@ -773,47 +766,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 "" @@ -885,18 +869,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 cf8b0770d8..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,18 +173,19 @@ def get_rounded_time(): "input-group", { "legend": ( - '' + '' + " %s" % _("Date and time options") ), "fields": ["start", "start_time", "expected_duration"], "additional_data": """
-
""" % ( + "see_recurring_fields", "btn btn-primary btn-sm", "modal", "#recurring_fields", @@ -199,7 +200,7 @@ def get_rounded_time(): "input-group", { "legend": ( - '' + '' + " %s" % _("Record session") ), "fields": MEETING_RECORD_FIELDS, @@ -212,7 +213,7 @@ def get_rounded_time(): "modal", { "legend": ( - ' ' + ' ' + " %s" % _("Recurring options") ), "id": "recurring_fields", @@ -224,7 +225,7 @@ def get_rounded_time(): "advanced_options", { "legend": ( - '' + '' + " %s" % _("Advanced options") ), "classes": "collapse border border-primary p-1 m-1", @@ -242,15 +243,43 @@ def filter_fields_admin(form): else: form.remove_field("days_of_week") - def clean_add_owner(self, cleaned_data): - if "additional_owners" in cleaned_data.keys() and isinstance( + 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 + and ( + 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 self.cleaned_data.get("start") + and self.cleaned_data.get("recurrence") == "weekly" + and ( + 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 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( 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 ( @@ -262,31 +291,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() + + self.clean_add_owner() 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_add_owner(cleaned_data) - 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() @@ -296,7 +320,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( @@ -344,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 1d897c045d..11c1b4f823 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 @@ -140,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")), @@ -208,6 +215,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" @@ -472,16 +480,12 @@ 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) + """Returns the date of the next occurrence for the meeting from today.""" + if self.start_at == 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 + return self.start_at + return self.next_occurrence(timezone.now().date()) def next_occurrence(self, current_date): # noqa: C901 """ @@ -507,15 +511,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: @@ -582,6 +584,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: diff --git a/pod/meeting/templates/meeting/add_or_edit.html b/pod/meeting/templates/meeting/add_or_edit.html index a6e079b5ad..df7377e031 100644 --- a/pod/meeting/templates/meeting/add_or_edit.html +++ b/pod/meeting/templates/meeting/add_or_edit.html @@ -191,10 +191,88 @@ /* 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 +*/ +const myModals = document.getElementsByClassName('modal'); +for (let i = 0; i < myModals.length; i++) { + myModals[i].addEventListener('shown.bs.modal', () => { + // 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 }); + } + }) +} +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 must be selected." %}"); + 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 3128e38e7c..86cb945ed4 100644 --- a/pod/meeting/templates/meeting/recurring_options_modal_form.html +++ b/pod/meeting/templates/meeting/recurring_options_modal_form.html @@ -61,21 +61,31 @@ 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() }) 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); + diff --git a/pod/meeting/tests/test_models.py b/pod/meeting/tests/test_models.py index 9497896a3f..005a42c4b6 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) @@ -388,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 @@ -436,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 @@ -457,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): 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)}, )