diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 2b030bab21f02faaa404bedbc4d93589fb54e9dc..1a7340fd9d033b40aa5f52df459b0c4315864e87 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -9,11 +9,38 @@ and this project adheres to `Semantic Versioning`_. Unreleased ---------- +Changed +~~~~~~~ + +* Added a `Retry` button to the server error page + Fixed ~~~~~ * The ``reset password`` button on the login site used to overflow the card on smaller devices. +`2.7.4`_ - 2022-02-09 +--------------------- + +Changed +~~~~~~~ + +* Allow disabling query caching with cachalot +* Add invitation key to success message when a person without e-mail address is invited by id + +Fixed +~~~~~ + +* Only exactly one person without e-mail address could be invited +* No person was created and linked to the PersonInvitation object when invite by e-mail is used +* No valid data in the second e-mail field of the signup form when it was disabled +* Invitation options were displayed to superusers even when the feature was disabled +* Inviting newly created persons for registration failed +* Invited person was not displayed correctly in list of sent invitations +* [Docker] Do not clear cache in migration container die to session invalidation issues +* Notification email about user changes was broken +* SQL cache invalidation could fail when hitting OOT database + `2.7.3`_ - 2022-02-03 --------------------- @@ -735,3 +762,4 @@ Fixed .. _2.7.1: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.1 .. _2.7.2: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.2 .. _2.7.3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.3 +.. _2.7.4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.7.4 diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index 58bbba7f63869e1212c50ecd7131fdcd4e72999a..ef4184812f73d22bb1dcfa1ff84f74f722c3c774 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -18,6 +18,7 @@ from dj_cleavejs import CleaveWidget from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, Select2Widget from dynamic_preferences.forms import PreferenceForm from guardian.shortcuts import assign_perm +from invitations.forms import InviteForm from material import Fieldset, Layout, Row from .mixins import ExtensibleForm, SchoolTermRelatedExtensibleForm @@ -29,6 +30,7 @@ from .models import ( GroupType, OAuthApplication, Person, + PersonInvitation, SchoolTerm, ) from .registries import ( @@ -410,6 +412,31 @@ class InvitationCodeForm(forms.Form): self.fields["code"].widget = CleaveWidget(blocks=blocks, delimiter="-", uppercase=True) +class PersonCreateInviteForm(InviteForm): + """Custom form to create a person and invite them.""" + + first_name = forms.CharField(label=_("First name"), required=True) + last_name = forms.CharField(label=_("Last name"), required=True) + + layout = Layout( + Row("first_name", "last_name"), + Row("email"), + ) + + def clean_email(self): + if Person.objects.filter(email=self.cleaned_data["email"]).exists(): + raise ValidationError(_("A person is using this e-mail address")) + return super().clean_email() + + def save(self, email): + person = Person.objects.create( + first_name=self.cleaned_data["first_name"], + last_name=self.cleaned_data["last_name"], + email=email, + ) + return PersonInvitation.create(email=email, person=person) + + class SelectPermissionForm(forms.Form): """Select a permission to assign.""" @@ -597,6 +624,7 @@ class AccountRegisterForm(SignupForm, ExtensibleForm): if person: available_fields = [field.name for field in Person._meta.get_fields()] + self.fields["email2"].initial = person.email for field in self.fields: if field in available_fields and getattr(person, field): self.fields[field].disabled = True diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po index 639948d3fae74fb482f0919b2d67f3162378c6ee..a382635f245835c9c747b72cb4b661bd39eb7e04 100644 --- a/aleksis/core/locale/ar/LC_MESSAGES/django.po +++ b/aleksis/core/locale/ar/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -38,7 +38,7 @@ msgstr "" msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #: aleksis/core/templates/core/person/full.html:250 @@ -99,145 +99,157 @@ msgstr "" msgid "Group" msgstr "" -#: aleksis/core/forms.py:48 aleksis/core/forms.py:554 +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:53 +#: aleksis/core/forms.py:55 msgid "Address" msgstr "" -#: aleksis/core/forms.py:54 aleksis/core/forms.py:563 +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:56 +#: aleksis/core/forms.py:58 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "New user" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:130 +#: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:134 +#: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:151 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:130 msgid "School term" msgstr "" -#: aleksis/core/forms.py:152 +#: aleksis/core/forms.py:154 msgid "Common data" msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/forms.py:205 +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 #: aleksis/core/menus.py:254 aleksis/core/models.py:153 #: aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" -#: aleksis/core/forms.py:154 aleksis/core/forms.py:565 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:155 aleksis/core/models.py:206 +#: aleksis/core/forms.py:157 aleksis/core/models.py:206 #: aleksis/core/models.py:514 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:197 aleksis/core/forms.py:200 +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 #: aleksis/core/models.py:73 msgid "Date" msgstr "" -#: aleksis/core/forms.py:198 aleksis/core/forms.py:201 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 #: aleksis/core/models.py:81 msgid "Time" msgstr "" -#: aleksis/core/forms.py:231 +#: aleksis/core/forms.py:233 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:234 +#: aleksis/core/forms.py:236 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:235 +#: aleksis/core/forms.py:237 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:274 +#: aleksis/core/forms.py:276 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:278 +#: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:287 +#: aleksis/core/forms.py:289 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:396 +#: aleksis/core/forms.py:398 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:397 +#: aleksis/core/forms.py:399 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:429 +#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +msgid "First name" +msgstr "" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +msgid "Last name" +msgstr "" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "" + +#: aleksis/core/forms.py:456 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:430 +#: aleksis/core/forms.py:457 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:459 +#: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:467 +#: aleksis/core/forms.py:494 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:472 +#: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." msgstr "" -#: aleksis/core/forms.py:559 +#: aleksis/core/forms.py:586 msgid "Adress data" msgstr "" -#: aleksis/core/forms.py:571 +#: aleksis/core/forms.py:598 msgid "Account data" msgstr "" -#: aleksis/core/forms.py:578 +#: aleksis/core/forms.py:605 msgid "Password" msgstr "" -#: aleksis/core/forms.py:581 +#: aleksis/core/forms.py:608 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:747 +#: aleksis/core/forms.py:775 msgid "No valid selection." msgstr "" @@ -267,7 +279,7 @@ msgstr "" msgid "Login" msgstr "" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20 +#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "" @@ -522,18 +534,10 @@ msgstr "" msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1219 +#: aleksis/core/models.py:178 aleksis/core/models.py:1227 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:181 -msgid "First name" -msgstr "" - -#: aleksis/core/models.py:182 -msgid "Last name" -msgstr "" - #: aleksis/core/models.py:184 msgid "Additional name(s)" msgstr "" @@ -822,7 +826,7 @@ msgstr "" msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1266 +#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" @@ -911,55 +915,55 @@ msgstr "" msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1169 +#: aleksis/core/models.py:1177 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1173 +#: aleksis/core/models.py:1181 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1175 +#: aleksis/core/models.py:1183 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1185 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1192 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1193 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1190 +#: aleksis/core/models.py:1198 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1201 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1205 +#: aleksis/core/models.py:1213 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1206 +#: aleksis/core/models.py:1214 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1222 +#: aleksis/core/models.py:1230 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1260 +#: aleksis/core/models.py:1268 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1270 +#: aleksis/core/models.py:1278 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" @@ -1155,11 +1159,11 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:526 +#: aleksis/core/settings.py:529 msgid "English" msgstr "" -#: aleksis/core/settings.py:527 +#: aleksis/core/settings.py:530 msgid "German" msgstr "" @@ -1173,14 +1177,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:137 +#: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:61 aleksis/core/tables.py:62 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:135 +#: aleksis/core/tables.py:136 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 @@ -2177,6 +2181,22 @@ msgstr "" msgid "Save preferences" msgstr "" +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2555,17 +2575,17 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:3 +#: aleksis/core/templates/templated_email/person_changed.email:4 #, python-format msgid "%(person)s changed their data!" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:6 +#: aleksis/core/templates/templated_email/person_changed.email:7 #, python-format msgid "the person %(person)s recently changed the following fields:" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:14 +#: aleksis/core/templates/templated_email/person_changed.email:15 #, python-format msgid "" "\n" @@ -2965,148 +2985,148 @@ msgstr "" msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:414 +#: aleksis/core/views.py:417 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:433 aleksis/core/views.py:443 +#: aleksis/core/views.py:436 aleksis/core/views.py:446 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:493 +#: aleksis/core/views.py:496 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:590 +#: aleksis/core/views.py:593 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:606 +#: aleksis/core/views.py:609 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:674 +#: aleksis/core/views.py:677 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:693 +#: aleksis/core/views.py:696 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:717 +#: aleksis/core/views.py:720 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:731 +#: aleksis/core/views.py:734 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:763 +#: aleksis/core/views.py:766 msgid "The additional_field has been saved." msgstr "" -#: aleksis/core/views.py:797 +#: aleksis/core/views.py:800 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:822 +#: aleksis/core/views.py:825 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:852 +#: aleksis/core/views.py:855 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:885 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:886 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:887 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:904 +#: aleksis/core/views.py:907 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:914 +#: aleksis/core/views.py:917 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:946 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:976 +#: aleksis/core/views.py:979 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:986 +#: aleksis/core/views.py:989 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1057 +#: aleksis/core/views.py:1060 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1059 +#: aleksis/core/views.py:1062 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1129 +#: aleksis/core/views.py:1138 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1220 +#: aleksis/core/views.py:1229 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1230 +#: aleksis/core/views.py:1239 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1240 +#: aleksis/core/views.py:1249 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1250 +#: aleksis/core/views.py:1259 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1260 +#: aleksis/core/views.py:1269 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1328 +#: aleksis/core/views.py:1337 msgid "The requested PDF file does not exist" msgstr "" -#: aleksis/core/views.py:1337 aleksis/core/views.py:1341 +#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 msgid "The requested task does not exist or is not accessible" msgstr "" -#: aleksis/core/views.py:1379 +#: aleksis/core/views.py:1388 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1386 +#: aleksis/core/views.py:1395 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1445 -msgid "Person was invited successfully." +#: aleksis/core/views.py:1466 +msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1447 +#: aleksis/core/views.py:1477 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po index 590f5ff9ab6b78cb5ebbc5738c367994cfd58aac..8a53fc2fc168227f37f344c17ae359b5d5764596 100644 --- a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po index d3dc00144fe56aebf7c76d7597bae467d0ddbadd..56ff3ab652cb345ae714d6b1eb8b54e7ae5f27a2 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" -"PO-Revision-Date: 2022-01-31 16:15+0000\n" -"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" +"PO-Revision-Date: 2022-02-08 23:24+0000\n" +"Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n" "Language-Team: German <https://translate.edugit.org/projects/aleksis/" "aleksis-core/de/>\n" "Language: de_DE\n" @@ -25,7 +25,7 @@ msgstr "OpenID-Connect-Scope" #: aleksis/core/apps.py:167 msgid "Given name, family name, link to profile and picture if existing." -msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden" +msgstr "Vorname, Nachname, Link zum Profil und Bild falls vorhanden." #: aleksis/core/apps.py:168 msgid "Full home postal address" @@ -39,7 +39,7 @@ msgstr "E-Mail-Adresse" msgid "Home and mobile phone" msgstr "Festnetz- und Mobilfunknummer" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #: aleksis/core/templates/core/person/full.html:250 @@ -100,145 +100,157 @@ msgstr "Benutzer" msgid "Group" msgstr "Gruppe" -#: aleksis/core/forms.py:48 aleksis/core/forms.py:554 +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 msgid "Base data" msgstr "Basisdaten" -#: aleksis/core/forms.py:53 +#: aleksis/core/forms.py:55 msgid "Address" msgstr "Adresse" -#: aleksis/core/forms.py:54 aleksis/core/forms.py:563 +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 msgid "Contact data" msgstr "Kontaktdaten" -#: aleksis/core/forms.py:56 +#: aleksis/core/forms.py:58 msgid "Advanced personal data" msgstr "Zusätzliche persönliche Daten" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "New user" msgstr "Neuer Benutzer" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "Create a new account" msgstr "Neues Benutzerkonto erstellen" -#: aleksis/core/forms.py:130 +#: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen." -#: aleksis/core/forms.py:134 +#: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "Dieser Benutzername wird bereits genutzt." -#: aleksis/core/forms.py:151 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:130 msgid "School term" msgstr "Schuljahr" -#: aleksis/core/forms.py:152 +#: aleksis/core/forms.py:154 msgid "Common data" msgstr "Allgemeine Daten" -#: aleksis/core/forms.py:153 aleksis/core/forms.py:205 +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 #: aleksis/core/menus.py:254 aleksis/core/models.py:153 #: aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "Personen" -#: aleksis/core/forms.py:154 aleksis/core/forms.py:565 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 msgid "Additional data" msgstr "Zusätzliche Datne" -#: aleksis/core/forms.py:155 aleksis/core/models.py:206 +#: aleksis/core/forms.py:157 aleksis/core/models.py:206 #: aleksis/core/models.py:514 msgid "Photo" msgstr "Foto" -#: aleksis/core/forms.py:197 aleksis/core/forms.py:200 +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 #: aleksis/core/models.py:73 msgid "Date" msgstr "Datum" -#: aleksis/core/forms.py:198 aleksis/core/forms.py:201 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 #: aleksis/core/models.py:81 msgid "Time" msgstr "Zeit" -#: aleksis/core/forms.py:231 +#: aleksis/core/forms.py:233 msgid "From when until when should the announcement be displayed?" msgstr "Von wann bis wann soll die Ankündigung angezeigt werden?" -#: aleksis/core/forms.py:234 +#: aleksis/core/forms.py:236 msgid "Who should see the announcement?" msgstr "Wer soll die Ankündigung sehen?" -#: aleksis/core/forms.py:235 +#: aleksis/core/forms.py:237 msgid "Write your announcement:" msgstr "Schreiben Sie ihre Ankündigung:" -#: aleksis/core/forms.py:274 +#: aleksis/core/forms.py:276 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "Sie dürfen keine Ankündigungen erstellen, die nur für die Vergangenheit gültig sind." -#: aleksis/core/forms.py:278 +#: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." msgstr "Das Startdatum und die Startzeit müssen vor dem Enddatum und der Endzeit sein." -#: aleksis/core/forms.py:287 +#: aleksis/core/forms.py:289 msgid "You need at least one recipient." msgstr "Sie benötigen mindestens einen Empfänger." -#: aleksis/core/forms.py:396 +#: aleksis/core/forms.py:398 msgid "Invitation code" msgstr "Einladungscode" -#: aleksis/core/forms.py:397 +#: aleksis/core/forms.py:399 msgid "Please enter your invitation code." msgstr "Bitte geben Sie Ihren Einladungscode ein." -#: aleksis/core/forms.py:429 +#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +msgid "First name" +msgstr "Vorname" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +msgid "Last name" +msgstr "Nachname" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "Eine Person nutzt diese E-Mail-Adresse" + +#: aleksis/core/forms.py:456 msgid "Who should get the permission?" msgstr "Wer soll die Berechtigung erhalten?" -#: aleksis/core/forms.py:430 +#: aleksis/core/forms.py:457 msgid "On what?" msgstr "Auf was?" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" msgstr "Wählen Sie die Objekte aus, für welche die Berechtigung vergeben werden soll:" -#: aleksis/core/forms.py:459 +#: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "Vergebe die Berechtigung für alle Objekte" -#: aleksis/core/forms.py:467 +#: aleksis/core/forms.py:494 msgid "You must select at least one group or person which should get the permission." msgstr "Sie müssen mindestens eine Gruppe oder Person auswählen, welche die Berechtigung erhalten soll." -#: aleksis/core/forms.py:472 +#: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." msgstr "Sie müssen die Berechtigung auf alle Objekte und/oder für einige Objekte vergeben." -#: aleksis/core/forms.py:559 +#: aleksis/core/forms.py:586 msgid "Adress data" msgstr "Adressdaten" -#: aleksis/core/forms.py:571 +#: aleksis/core/forms.py:598 msgid "Account data" msgstr "Kontodaten" -#: aleksis/core/forms.py:578 +#: aleksis/core/forms.py:605 msgid "Password" msgstr "Passwort" -#: aleksis/core/forms.py:581 +#: aleksis/core/forms.py:608 msgid "Password (again)" msgstr "Passwort wiederholen" -#: aleksis/core/forms.py:747 +#: aleksis/core/forms.py:775 msgid "No valid selection." msgstr "Keine gültige Auswahl." @@ -268,7 +280,7 @@ msgstr "Kein Backupergebnis gefunden!" msgid "Login" msgstr "Anmelden" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20 +#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "Registrieren" @@ -523,18 +535,10 @@ msgstr "weiblich" msgid "male" msgstr "männlich" -#: aleksis/core/models.py:178 aleksis/core/models.py:1219 +#: aleksis/core/models.py:178 aleksis/core/models.py:1227 msgid "Linked user" msgstr "Verknüpfter Benutzer" -#: aleksis/core/models.py:181 -msgid "First name" -msgstr "Vorname" - -#: aleksis/core/models.py:182 -msgid "Last name" -msgstr "Nachname" - #: aleksis/core/models.py:184 msgid "Additional name(s)" msgstr "Zusätzliche Namen" @@ -823,7 +827,7 @@ msgstr "Benutzerdefinierte Menüs" msgid "Menu" msgstr "Menü" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1266 +#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "Symbol" @@ -912,55 +916,55 @@ msgstr "Kann Datenprüfungsprobleme lösen" msgid "E-Mail address" msgstr "E-Mail-Adresse" -#: aleksis/core/models.py:1169 +#: aleksis/core/models.py:1177 msgid "Owner" msgstr "Leiter" -#: aleksis/core/models.py:1173 +#: aleksis/core/models.py:1181 msgid "File expires at" msgstr "Datei abgelaufen am" -#: aleksis/core/models.py:1175 +#: aleksis/core/models.py:1183 msgid "Generated HTML file" msgstr "Generierte HTML-Datei" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1185 msgid "Generated PDF file" msgstr "Generierte PDF-Datei" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1192 msgid "PDF file" msgstr "PDF-Datei" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1193 msgid "PDF files" msgstr "PDF-Dateien" -#: aleksis/core/models.py:1190 +#: aleksis/core/models.py:1198 msgid "Task result" msgstr "Task-Ergebnis" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1201 msgid "Task user" msgstr "Task-Benutzer" -#: aleksis/core/models.py:1205 +#: aleksis/core/models.py:1213 msgid "Task user assignment" msgstr "Task-Benutzer-Zuordnung" -#: aleksis/core/models.py:1206 +#: aleksis/core/models.py:1214 msgid "Task user assignments" msgstr "Task-Benutzer-Zuordnungen" -#: aleksis/core/models.py:1222 +#: aleksis/core/models.py:1230 msgid "Additional attributes" msgstr "Zusätzliche Attribute" -#: aleksis/core/models.py:1260 +#: aleksis/core/models.py:1268 msgid "Allowed scopes that clients can request" msgstr "Erlaubte Scopes, die ein Client anfordern kann" -#: aleksis/core/models.py:1270 +#: aleksis/core/models.py:1278 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "Dieses Bild wird im Autorisierungs-Vorgang als Symbol angezeigt werden. Es sollte rechteckig sein." @@ -1156,11 +1160,11 @@ msgstr "Automatisch das Dashboard und seine Widgets aktualisieren (auf der ganze msgid "Country for phone number parsing" msgstr "Land für das Einlesen von Telefonnummern" -#: aleksis/core/settings.py:526 +#: aleksis/core/settings.py:529 msgid "English" msgstr "Englisch" -#: aleksis/core/settings.py:527 +#: aleksis/core/settings.py:530 msgid "German" msgstr "Deutsch" @@ -1174,14 +1178,14 @@ msgid "Edit" msgstr "Bearbeiten" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:137 +#: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "Aktionen" #: aleksis/core/tables.py:61 aleksis/core/tables.py:62 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:135 +#: aleksis/core/tables.py:136 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 @@ -2323,6 +2327,24 @@ msgstr "Einstellungen für %(instance)s" msgid "Save preferences" msgstr "Einstellungen speichern" +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "Die Einladungsfunktion ist deaktiviert" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "Die Einladungsfunktion ist deaktiviert." + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "" +"Um sie zu aktivieren, nutzen Sie die Checkbox im Abschnitt \"Authentifikation" +"\" der " + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "Seiteneinstellungen" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "Ihre Einladung akzeptieren" @@ -2742,17 +2764,17 @@ msgstr "" " Von %(trans_sender)s um %(trans_created_at)s\n" " " -#: aleksis/core/templates/templated_email/person_changed.email:3 +#: aleksis/core/templates/templated_email/person_changed.email:4 #, python-format msgid "%(person)s changed their data!" msgstr "%(person)s hat Daten verändert!" -#: aleksis/core/templates/templated_email/person_changed.email:6 +#: aleksis/core/templates/templated_email/person_changed.email:7 #, python-format msgid "the person %(person)s recently changed the following fields:" msgstr "die Person %(person)s hat kürzlich die folgenden Felder geändert:" -#: aleksis/core/templates/templated_email/person_changed.email:14 +#: aleksis/core/templates/templated_email/person_changed.email:15 #, python-format msgid "" "\n" @@ -3255,152 +3277,157 @@ msgstr "Das Schuljahr wurde erstellt." msgid "The school term has been saved." msgstr "Das Schuljahr wurde gespeichert." -#: aleksis/core/views.py:414 +#: aleksis/core/views.py:417 msgid "The child groups were successfully saved." msgstr "Die Untergruppen wurden gespeichert." -#: aleksis/core/views.py:433 aleksis/core/views.py:443 +#: aleksis/core/views.py:436 aleksis/core/views.py:446 msgid "The person has been saved." msgstr "Die Person wurde gespeichert." -#: aleksis/core/views.py:493 +#: aleksis/core/views.py:496 msgid "The group has been saved." msgstr "Die Gruppe wurde gespeichert." -#: aleksis/core/views.py:590 +#: aleksis/core/views.py:593 msgid "The announcement has been saved." msgstr "Die Ankündigung wurde gespeichert." -#: aleksis/core/views.py:606 +#: aleksis/core/views.py:609 msgid "The announcement has been deleted." msgstr "Ankündigung wurde gelöscht." -#: aleksis/core/views.py:674 +#: aleksis/core/views.py:677 msgid "The requested preference registry does not exist" msgstr "Das angeforderte Einstellungsregister existiert nicht" -#: aleksis/core/views.py:693 +#: aleksis/core/views.py:696 msgid "The preferences have been saved successfully." msgstr "Die Einstellungen wurde gespeichert." -#: aleksis/core/views.py:717 +#: aleksis/core/views.py:720 msgid "The person has been deleted." msgstr "Die Person wurde gelöscht." -#: aleksis/core/views.py:731 +#: aleksis/core/views.py:734 msgid "The group has been deleted." msgstr "Die Gruppe wurde gelöscht." -#: aleksis/core/views.py:763 +#: aleksis/core/views.py:766 msgid "The additional_field has been saved." msgstr "Das zusätzliche Feld wurde gespeichert." -#: aleksis/core/views.py:797 +#: aleksis/core/views.py:800 msgid "The additional field has been deleted." msgstr "Das zusätzliche Feld wurde gelöscht." -#: aleksis/core/views.py:822 +#: aleksis/core/views.py:825 msgid "The group type has been saved." msgstr "Der Gruppentyp wurde gespeichert." -#: aleksis/core/views.py:852 +#: aleksis/core/views.py:855 msgid "The group type has been deleted." msgstr "Der Gruppentyp wurde gelöscht." -#: aleksis/core/views.py:885 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "Fortschritt: Datenprüfungen ausführen" -#: aleksis/core/views.py:886 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "Datenprüfungen laufen …" -#: aleksis/core/views.py:887 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "Die Datenprüfungen wurden erfolgreich ausgeführt." -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "Es gab ein Problem beim Ausführen der Datenprüfungen." -#: aleksis/core/views.py:904 +#: aleksis/core/views.py:907 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "Die Lösungsoption \"{solve_option_obj.verbose_name}\" " -#: aleksis/core/views.py:914 +#: aleksis/core/views.py:917 msgid "The requested solve option does not exist" msgstr "Die angeforderte Lösungsoption existiert nicht" -#: aleksis/core/views.py:946 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been saved." msgstr "Das Dashboard-Widget wurde gespeichert." -#: aleksis/core/views.py:976 +#: aleksis/core/views.py:979 msgid "The dashboard widget has been created." msgstr "Das Dashboard-Widget wurde erstellt." -#: aleksis/core/views.py:986 +#: aleksis/core/views.py:989 msgid "The dashboard widget has been deleted." msgstr "Das Dashboard-Widget wurde gelöscht." -#: aleksis/core/views.py:1057 +#: aleksis/core/views.py:1060 msgid "Your dashboard configuration has been saved successfully." msgstr "Ihre Dashboardkonfiguration wurde erfolgreich gespeichert." -#: aleksis/core/views.py:1059 +#: aleksis/core/views.py:1062 msgid "The configuration of the default dashboard has been saved successfully." msgstr "Die Konfiguration des Standard-Dashboardes wurde erfolgreich gespeichert." -#: aleksis/core/views.py:1129 +#: aleksis/core/views.py:1138 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "Die Einladung wurde erfolgreich erstellt. Der Einladungscode ist {code}" -#: aleksis/core/views.py:1220 +#: aleksis/core/views.py:1229 msgid "We have successfully assigned the permissions." msgstr "Wir haben die Berechtigungen erfolgreich zugewiesen." -#: aleksis/core/views.py:1230 +#: aleksis/core/views.py:1239 msgid "The global user permission has been deleted." msgstr "Die globale Benutzerberechtigung wurde gelöscht." -#: aleksis/core/views.py:1240 +#: aleksis/core/views.py:1249 msgid "The global group permission has been deleted." msgstr "Die globale Gruppenberechtigung wurde gelöscht." -#: aleksis/core/views.py:1250 +#: aleksis/core/views.py:1259 msgid "The object user permission has been deleted." msgstr "Die Objekt-Benutzerberechtigung wurde gelöscht." -#: aleksis/core/views.py:1260 +#: aleksis/core/views.py:1269 msgid "The object group permission has been deleted." msgstr "Die Objekt-Gruppenberechtigung wurde gelöscht." -#: aleksis/core/views.py:1328 +#: aleksis/core/views.py:1337 msgid "The requested PDF file does not exist" msgstr "Die angeforderte PDF-Datei existiert nicht" -#: aleksis/core/views.py:1337 aleksis/core/views.py:1341 +#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 msgid "The requested task does not exist or is not accessible" msgstr "Der angeforderte Task existiert nicht oder ist nicht abrufbar" -#: aleksis/core/views.py:1379 +#: aleksis/core/views.py:1388 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "Das Drittanbieter-Konto konnte nicht deaktiviert werden, weil es die einzige verfügbare Anmeldeoption ist." -#: aleksis/core/views.py:1386 +#: aleksis/core/views.py:1395 msgid "The third-party account has been successfully disconnected." msgstr "Das Drittanbieter-Konto wurde erfolgreich getrennt." -#: aleksis/core/views.py:1445 -msgid "Person was invited successfully." -msgstr "Person wurde erfolgreich eingeladen." +#: aleksis/core/views.py:1466 +msgid "Person was invited successfully and an email with further instructions has been send to them." +msgstr "" +"Die Person wurde erfolgreich eingeladen und eine E-Mail mit weiteren " +"Anweisungen wurde an sie verschickt." -#: aleksis/core/views.py:1447 +#: aleksis/core/views.py:1477 msgid "Person was already invited." msgstr "Person wurde bereits eingeladen." +#~ msgid "Person was invited successfully." +#~ msgstr "Person wurde erfolgreich eingeladen." + #, python-brace-format #~ msgid "Last backup {time_gone_since_backup}!" #~ msgstr "Letztes Backup: {time_gone_since_backup}!" diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po index 8ff775a37b0165883f3c2b0f3ff393c1478fd510..376788f8a7ea941b89dff0620fdbc78a40c106a5 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: 2021-10-28 14:37+0000\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis-core-js/de/>\n" diff --git a/aleksis/core/locale/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po index f6af991023e49cc6e460b705e34b730af558f233..ac9b5f99c721e75f4dd0e5bf94368eaee2c7867f 100644 --- a/aleksis/core/locale/fr/LC_MESSAGES/django.po +++ b/aleksis/core/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: 2021-06-16 12:00+0000\n" "Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" "Language-Team: French <https://translate.edugit.org/projects/aleksis/aleksis/fr/>\n" @@ -40,7 +40,7 @@ msgstr "Détails de contact" msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #: aleksis/core/templates/core/person/full.html:250 @@ -105,53 +105,53 @@ msgstr "" msgid "Group" msgstr "groupe" -#: aleksis/core/forms.py:48 aleksis/core/forms.py:554 +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:53 +#: aleksis/core/forms.py:55 msgid "Address" msgstr "" -#: aleksis/core/forms.py:54 aleksis/core/forms.py:563 +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 #, fuzzy #| msgid "Contact details" msgid "Contact data" msgstr "Détails de contact" -#: aleksis/core/forms.py:56 +#: aleksis/core/forms.py:58 #, fuzzy #| msgid "Contact details" msgid "Advanced personal data" msgstr "Détails de contact" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "New user" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:130 +#: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:134 +#: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "Cet nom est deja en utilisation." -#: aleksis/core/forms.py:151 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:130 msgid "School term" msgstr "" -#: aleksis/core/forms.py:152 +#: aleksis/core/forms.py:154 #, fuzzy #| msgid "Contact details" msgid "Common data" msgstr "Détails de contact" -#: aleksis/core/forms.py:153 aleksis/core/forms.py:205 +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 #: aleksis/core/menus.py:254 aleksis/core/models.py:153 #: aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 @@ -160,102 +160,114 @@ msgstr "Détails de contact" msgid "Persons" msgstr "Personne" -#: aleksis/core/forms.py:154 aleksis/core/forms.py:565 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 #, fuzzy #| msgid "Contact details" msgid "Additional data" msgstr "Détails de contact" -#: aleksis/core/forms.py:155 aleksis/core/models.py:206 +#: aleksis/core/forms.py:157 aleksis/core/models.py:206 #: aleksis/core/models.py:514 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:197 aleksis/core/forms.py:200 +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 #: aleksis/core/models.py:73 msgid "Date" msgstr "Date" -#: aleksis/core/forms.py:198 aleksis/core/forms.py:201 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 #: aleksis/core/models.py:81 msgid "Time" msgstr "" -#: aleksis/core/forms.py:231 +#: aleksis/core/forms.py:233 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:234 +#: aleksis/core/forms.py:236 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:235 +#: aleksis/core/forms.py:237 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:274 +#: aleksis/core/forms.py:276 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:278 +#: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:287 +#: aleksis/core/forms.py:289 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:396 +#: aleksis/core/forms.py:398 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:397 +#: aleksis/core/forms.py:399 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:429 +#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +msgid "First name" +msgstr "Prénom" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +msgid "Last name" +msgstr "Nom de famille" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "" + +#: aleksis/core/forms.py:456 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:430 +#: aleksis/core/forms.py:457 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:459 +#: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:467 +#: aleksis/core/forms.py:494 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:472 +#: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." msgstr "" -#: aleksis/core/forms.py:559 +#: aleksis/core/forms.py:586 msgid "Adress data" msgstr "" -#: aleksis/core/forms.py:571 +#: aleksis/core/forms.py:598 #, fuzzy #| msgid "Contact details" msgid "Account data" msgstr "Détails de contact" -#: aleksis/core/forms.py:578 +#: aleksis/core/forms.py:605 msgid "Password" msgstr "" -#: aleksis/core/forms.py:581 +#: aleksis/core/forms.py:608 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:747 +#: aleksis/core/forms.py:775 msgid "No valid selection." msgstr "" @@ -285,7 +297,7 @@ msgstr "" msgid "Login" msgstr "" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20 +#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "" @@ -558,18 +570,10 @@ msgstr "" msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1219 +#: aleksis/core/models.py:178 aleksis/core/models.py:1227 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:181 -msgid "First name" -msgstr "Prénom" - -#: aleksis/core/models.py:182 -msgid "Last name" -msgstr "Nom de famille" - #: aleksis/core/models.py:184 msgid "Additional name(s)" msgstr "" @@ -866,7 +870,7 @@ msgstr "" msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1266 +#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" @@ -965,59 +969,59 @@ msgstr "" msgid "E-Mail address" msgstr "Détails de contact" -#: aleksis/core/models.py:1169 +#: aleksis/core/models.py:1177 #, fuzzy #| msgid "Owners" msgid "Owner" msgstr "Propriétaires" -#: aleksis/core/models.py:1173 +#: aleksis/core/models.py:1181 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1175 +#: aleksis/core/models.py:1183 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1185 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1192 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1193 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1190 +#: aleksis/core/models.py:1198 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1201 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1205 +#: aleksis/core/models.py:1213 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1206 +#: aleksis/core/models.py:1214 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1222 +#: aleksis/core/models.py:1230 #, fuzzy #| msgid "Contact details" msgid "Additional attributes" msgstr "Détails de contact" -#: aleksis/core/models.py:1260 +#: aleksis/core/models.py:1268 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1270 +#: aleksis/core/models.py:1278 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" @@ -1221,11 +1225,11 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:526 +#: aleksis/core/settings.py:529 msgid "English" msgstr "" -#: aleksis/core/settings.py:527 +#: aleksis/core/settings.py:530 msgid "German" msgstr "" @@ -1239,14 +1243,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:137 +#: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:61 aleksis/core/tables.py:62 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:135 +#: aleksis/core/tables.py:136 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 @@ -2261,6 +2265,22 @@ msgstr "" msgid "Save preferences" msgstr "" +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2656,17 +2676,17 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:3 +#: aleksis/core/templates/templated_email/person_changed.email:4 #, python-format msgid "%(person)s changed their data!" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:6 +#: aleksis/core/templates/templated_email/person_changed.email:7 #, python-format msgid "the person %(person)s recently changed the following fields:" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:14 +#: aleksis/core/templates/templated_email/person_changed.email:15 #, python-format msgid "" "\n" @@ -3063,149 +3083,149 @@ msgstr "" msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:414 +#: aleksis/core/views.py:417 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:433 aleksis/core/views.py:443 +#: aleksis/core/views.py:436 aleksis/core/views.py:446 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:493 +#: aleksis/core/views.py:496 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:590 +#: aleksis/core/views.py:593 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:606 +#: aleksis/core/views.py:609 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:674 +#: aleksis/core/views.py:677 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:693 +#: aleksis/core/views.py:696 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:717 +#: aleksis/core/views.py:720 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:731 +#: aleksis/core/views.py:734 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:763 +#: aleksis/core/views.py:766 msgid "The additional_field has been saved." msgstr "" -#: aleksis/core/views.py:797 +#: aleksis/core/views.py:800 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:822 +#: aleksis/core/views.py:825 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:852 +#: aleksis/core/views.py:855 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:885 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:886 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:887 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:904 +#: aleksis/core/views.py:907 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:914 +#: aleksis/core/views.py:917 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:946 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:976 +#: aleksis/core/views.py:979 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:986 +#: aleksis/core/views.py:989 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1057 +#: aleksis/core/views.py:1060 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1059 +#: aleksis/core/views.py:1062 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1129 +#: aleksis/core/views.py:1138 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1220 +#: aleksis/core/views.py:1229 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1230 +#: aleksis/core/views.py:1239 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1240 +#: aleksis/core/views.py:1249 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1250 +#: aleksis/core/views.py:1259 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1260 +#: aleksis/core/views.py:1269 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1328 +#: aleksis/core/views.py:1337 msgid "The requested PDF file does not exist" msgstr "" -#: aleksis/core/views.py:1337 aleksis/core/views.py:1341 +#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 msgid "The requested task does not exist or is not accessible" msgstr "" -#: aleksis/core/views.py:1379 +#: aleksis/core/views.py:1388 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1386 +#: aleksis/core/views.py:1395 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1445 -msgid "Person was invited successfully." +#: aleksis/core/views.py:1466 +msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1447 +#: aleksis/core/views.py:1477 #, fuzzy #| msgid "This username is already in use." msgid "Person was already invited." diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po index bcaf32c82d64028ea3c98b6a83b591efd6c44e9b..9f07be2903046e41680c481bea659aa95b695df7 100644 --- a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/aleksis/core/locale/la/LC_MESSAGES/django.po b/aleksis/core/locale/la/LC_MESSAGES/django.po index 42102a24126b6d5d152efc1b08140f00b93a45f5..4b2afb73bbbc2fd8a426789859152fa2d1895395 100644 --- a/aleksis/core/locale/la/LC_MESSAGES/django.po +++ b/aleksis/core/locale/la/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: 2020-12-19 12:57+0000\n" "Last-Translator: Julian <leuckerj@gmail.com>\n" "Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/la/>\n" @@ -44,7 +44,7 @@ msgstr "Inscriptio electronica" msgid "Home and mobile phone" msgstr "Numerus telephoni mobilis" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #: aleksis/core/templates/core/person/full.html:250 @@ -109,159 +109,173 @@ msgstr "" msgid "Group" msgstr "Grex" -#: aleksis/core/forms.py:48 aleksis/core/forms.py:554 +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:53 +#: aleksis/core/forms.py:55 #, fuzzy #| msgid "E-mail address" msgid "Address" msgstr "Inscriptio electronica" -#: aleksis/core/forms.py:54 aleksis/core/forms.py:563 +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:56 +#: aleksis/core/forms.py:58 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "New user" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 #, fuzzy #| msgid "Persons and accounts" msgid "Create a new account" msgstr "Personae et computi" -#: aleksis/core/forms.py:130 +#: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:134 +#: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:151 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:130 msgid "School term" msgstr "Anus scolae" -#: aleksis/core/forms.py:152 +#: aleksis/core/forms.py:154 #, fuzzy #| msgid "Data management" msgid "Common data" msgstr "Adminstratio datarum" -#: aleksis/core/forms.py:153 aleksis/core/forms.py:205 +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 #: aleksis/core/menus.py:254 aleksis/core/models.py:153 #: aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "personae" -#: aleksis/core/forms.py:154 aleksis/core/forms.py:565 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 #, fuzzy #| msgid "Additional name(s)" msgid "Additional data" msgstr "addita nomines" -#: aleksis/core/forms.py:155 aleksis/core/models.py:206 +#: aleksis/core/forms.py:157 aleksis/core/models.py:206 #: aleksis/core/models.py:514 msgid "Photo" msgstr "Photographia" -#: aleksis/core/forms.py:197 aleksis/core/forms.py:200 +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 #: aleksis/core/models.py:73 msgid "Date" msgstr "dies" -#: aleksis/core/forms.py:198 aleksis/core/forms.py:201 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 #: aleksis/core/models.py:81 msgid "Time" msgstr "tempus" -#: aleksis/core/forms.py:231 +#: aleksis/core/forms.py:233 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:234 +#: aleksis/core/forms.py:236 msgid "Who should see the announcement?" msgstr "Quis nuntium videatne?" -#: aleksis/core/forms.py:235 +#: aleksis/core/forms.py:237 msgid "Write your announcement:" msgstr "Scribe nuntium:" -#: aleksis/core/forms.py:274 +#: aleksis/core/forms.py:276 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:278 +#: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:287 +#: aleksis/core/forms.py:289 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:396 +#: aleksis/core/forms.py:398 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:397 +#: aleksis/core/forms.py:399 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:429 +#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +msgid "First name" +msgstr "Primus nomen" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +msgid "Last name" +msgstr "Secondus nomen" + +#: aleksis/core/forms.py:428 +#, fuzzy +#| msgid "E-mail address" +msgid "A person is using this e-mail address" +msgstr "Inscriptio electronica" + +#: aleksis/core/forms.py:456 #, fuzzy #| msgid "Who should see the announcement?" msgid "Who should get the permission?" msgstr "Quis nuntium videatne?" -#: aleksis/core/forms.py:430 +#: aleksis/core/forms.py:457 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:459 +#: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:467 +#: aleksis/core/forms.py:494 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:472 +#: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." msgstr "" -#: aleksis/core/forms.py:559 +#: aleksis/core/forms.py:586 #, fuzzy #| msgid "E-mail address" msgid "Adress data" msgstr "Inscriptio electronica" -#: aleksis/core/forms.py:571 +#: aleksis/core/forms.py:598 #, fuzzy #| msgid "Data management" msgid "Account data" msgstr "Adminstratio datarum" -#: aleksis/core/forms.py:578 +#: aleksis/core/forms.py:605 msgid "Password" msgstr "" -#: aleksis/core/forms.py:581 +#: aleksis/core/forms.py:608 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:747 +#: aleksis/core/forms.py:775 msgid "No valid selection." msgstr "" @@ -293,7 +307,7 @@ msgstr "" msgid "Login" msgstr "nomen profiteri" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20 +#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "" @@ -584,18 +598,10 @@ msgstr "femininum" msgid "male" msgstr "maskulinum" -#: aleksis/core/models.py:178 aleksis/core/models.py:1219 +#: aleksis/core/models.py:178 aleksis/core/models.py:1227 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:181 -msgid "First name" -msgstr "Primus nomen" - -#: aleksis/core/models.py:182 -msgid "Last name" -msgstr "Secondus nomen" - #: aleksis/core/models.py:184 msgid "Additional name(s)" msgstr "addita nomines" @@ -920,7 +926,7 @@ msgstr "" msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1266 +#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "Nota" @@ -1023,57 +1029,57 @@ msgstr "" msgid "E-Mail address" msgstr "Inscriptio electronica" -#: aleksis/core/models.py:1169 +#: aleksis/core/models.py:1177 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1173 +#: aleksis/core/models.py:1181 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1175 +#: aleksis/core/models.py:1183 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1185 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1192 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1193 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1190 +#: aleksis/core/models.py:1198 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1201 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1205 +#: aleksis/core/models.py:1213 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1206 +#: aleksis/core/models.py:1214 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1222 +#: aleksis/core/models.py:1230 #, fuzzy #| msgid "Additional name(s)" msgid "Additional attributes" msgstr "addita nomines" -#: aleksis/core/models.py:1260 +#: aleksis/core/models.py:1268 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1270 +#: aleksis/core/models.py:1278 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" @@ -1285,11 +1291,11 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:526 +#: aleksis/core/settings.py:529 msgid "English" msgstr "Britannicus" -#: aleksis/core/settings.py:527 +#: aleksis/core/settings.py:530 msgid "German" msgstr "Germanus" @@ -1303,7 +1309,7 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:137 +#: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 #, fuzzy #| msgid "Notifications" @@ -1312,7 +1318,7 @@ msgstr "Nuntii" #: aleksis/core/tables.py:61 aleksis/core/tables.py:62 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:135 +#: aleksis/core/tables.py:136 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 @@ -2373,6 +2379,22 @@ msgstr "" msgid "Save preferences" msgstr "" +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2781,17 +2803,17 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:3 +#: aleksis/core/templates/templated_email/person_changed.email:4 #, python-format msgid "%(person)s changed their data!" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:6 +#: aleksis/core/templates/templated_email/person_changed.email:7 #, python-format msgid "the person %(person)s recently changed the following fields:" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:14 +#: aleksis/core/templates/templated_email/person_changed.email:15 #, python-format msgid "" "\n" @@ -3188,151 +3210,151 @@ msgstr "" msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:414 +#: aleksis/core/views.py:417 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:433 aleksis/core/views.py:443 +#: aleksis/core/views.py:436 aleksis/core/views.py:446 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:493 +#: aleksis/core/views.py:496 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:590 +#: aleksis/core/views.py:593 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:606 +#: aleksis/core/views.py:609 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:674 +#: aleksis/core/views.py:677 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:693 +#: aleksis/core/views.py:696 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:717 +#: aleksis/core/views.py:720 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:731 +#: aleksis/core/views.py:734 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:763 +#: aleksis/core/views.py:766 msgid "The additional_field has been saved." msgstr "" -#: aleksis/core/views.py:797 +#: aleksis/core/views.py:800 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:822 +#: aleksis/core/views.py:825 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:852 +#: aleksis/core/views.py:855 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:885 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:886 +#: aleksis/core/views.py:889 #, fuzzy #| msgid "System status" msgid "Run data checks …" msgstr "Status systemae" -#: aleksis/core/views.py:887 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:904 +#: aleksis/core/views.py:907 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:914 +#: aleksis/core/views.py:917 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:946 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:976 +#: aleksis/core/views.py:979 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:986 +#: aleksis/core/views.py:989 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1057 +#: aleksis/core/views.py:1060 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1059 +#: aleksis/core/views.py:1062 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1129 +#: aleksis/core/views.py:1138 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1220 +#: aleksis/core/views.py:1229 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1230 +#: aleksis/core/views.py:1239 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1240 +#: aleksis/core/views.py:1249 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1250 +#: aleksis/core/views.py:1259 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1260 +#: aleksis/core/views.py:1269 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1328 +#: aleksis/core/views.py:1337 msgid "The requested PDF file does not exist" msgstr "" -#: aleksis/core/views.py:1337 aleksis/core/views.py:1341 +#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 msgid "The requested task does not exist or is not accessible" msgstr "" -#: aleksis/core/views.py:1379 +#: aleksis/core/views.py:1388 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1386 +#: aleksis/core/views.py:1395 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1445 -msgid "Person was invited successfully." +#: aleksis/core/views.py:1466 +msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1447 +#: aleksis/core/views.py:1477 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po index 427b5fbc842fe8bbbc70d795633af5070b404ec7..dfec73c5c894d3d686092593be9c21a811cd0535 100644 --- a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po index 249af254d7bb7b5d21874acf1a8e96798066594e..ab1f6b974dc48a296d3eead2faacea0232b1461d 100644 --- a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po +++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -37,7 +37,7 @@ msgstr "" msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #: aleksis/core/templates/core/person/full.html:250 @@ -98,145 +98,157 @@ msgstr "" msgid "Group" msgstr "" -#: aleksis/core/forms.py:48 aleksis/core/forms.py:554 +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:53 +#: aleksis/core/forms.py:55 msgid "Address" msgstr "" -#: aleksis/core/forms.py:54 aleksis/core/forms.py:563 +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:56 +#: aleksis/core/forms.py:58 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "New user" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:130 +#: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:134 +#: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:151 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:130 msgid "School term" msgstr "" -#: aleksis/core/forms.py:152 +#: aleksis/core/forms.py:154 msgid "Common data" msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/forms.py:205 +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 #: aleksis/core/menus.py:254 aleksis/core/models.py:153 #: aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" -#: aleksis/core/forms.py:154 aleksis/core/forms.py:565 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:155 aleksis/core/models.py:206 +#: aleksis/core/forms.py:157 aleksis/core/models.py:206 #: aleksis/core/models.py:514 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:197 aleksis/core/forms.py:200 +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 #: aleksis/core/models.py:73 msgid "Date" msgstr "" -#: aleksis/core/forms.py:198 aleksis/core/forms.py:201 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 #: aleksis/core/models.py:81 msgid "Time" msgstr "" -#: aleksis/core/forms.py:231 +#: aleksis/core/forms.py:233 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:234 +#: aleksis/core/forms.py:236 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:235 +#: aleksis/core/forms.py:237 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:274 +#: aleksis/core/forms.py:276 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:278 +#: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:287 +#: aleksis/core/forms.py:289 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:396 +#: aleksis/core/forms.py:398 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:397 +#: aleksis/core/forms.py:399 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:429 +#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +msgid "First name" +msgstr "" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +msgid "Last name" +msgstr "" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "" + +#: aleksis/core/forms.py:456 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:430 +#: aleksis/core/forms.py:457 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:459 +#: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:467 +#: aleksis/core/forms.py:494 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:472 +#: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." msgstr "" -#: aleksis/core/forms.py:559 +#: aleksis/core/forms.py:586 msgid "Adress data" msgstr "" -#: aleksis/core/forms.py:571 +#: aleksis/core/forms.py:598 msgid "Account data" msgstr "" -#: aleksis/core/forms.py:578 +#: aleksis/core/forms.py:605 msgid "Password" msgstr "" -#: aleksis/core/forms.py:581 +#: aleksis/core/forms.py:608 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:747 +#: aleksis/core/forms.py:775 msgid "No valid selection." msgstr "" @@ -266,7 +278,7 @@ msgstr "" msgid "Login" msgstr "" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20 +#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "" @@ -521,18 +533,10 @@ msgstr "" msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1219 +#: aleksis/core/models.py:178 aleksis/core/models.py:1227 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:181 -msgid "First name" -msgstr "" - -#: aleksis/core/models.py:182 -msgid "Last name" -msgstr "" - #: aleksis/core/models.py:184 msgid "Additional name(s)" msgstr "" @@ -821,7 +825,7 @@ msgstr "" msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1266 +#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" @@ -910,55 +914,55 @@ msgstr "" msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1169 +#: aleksis/core/models.py:1177 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1173 +#: aleksis/core/models.py:1181 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1175 +#: aleksis/core/models.py:1183 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1185 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1192 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1193 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1190 +#: aleksis/core/models.py:1198 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1201 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1205 +#: aleksis/core/models.py:1213 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1206 +#: aleksis/core/models.py:1214 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1222 +#: aleksis/core/models.py:1230 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1260 +#: aleksis/core/models.py:1268 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1270 +#: aleksis/core/models.py:1278 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" @@ -1154,11 +1158,11 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:526 +#: aleksis/core/settings.py:529 msgid "English" msgstr "" -#: aleksis/core/settings.py:527 +#: aleksis/core/settings.py:530 msgid "German" msgstr "" @@ -1172,14 +1176,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:137 +#: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:61 aleksis/core/tables.py:62 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:135 +#: aleksis/core/tables.py:136 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 @@ -2176,6 +2180,22 @@ msgstr "" msgid "Save preferences" msgstr "" +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2554,17 +2574,17 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:3 +#: aleksis/core/templates/templated_email/person_changed.email:4 #, python-format msgid "%(person)s changed their data!" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:6 +#: aleksis/core/templates/templated_email/person_changed.email:7 #, python-format msgid "the person %(person)s recently changed the following fields:" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:14 +#: aleksis/core/templates/templated_email/person_changed.email:15 #, python-format msgid "" "\n" @@ -2960,149 +2980,149 @@ msgstr "" msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:414 +#: aleksis/core/views.py:417 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:433 aleksis/core/views.py:443 +#: aleksis/core/views.py:436 aleksis/core/views.py:446 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:493 +#: aleksis/core/views.py:496 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:590 +#: aleksis/core/views.py:593 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:606 +#: aleksis/core/views.py:609 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:674 +#: aleksis/core/views.py:677 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:693 +#: aleksis/core/views.py:696 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:717 +#: aleksis/core/views.py:720 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:731 +#: aleksis/core/views.py:734 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:763 +#: aleksis/core/views.py:766 msgid "The additional_field has been saved." msgstr "" -#: aleksis/core/views.py:797 +#: aleksis/core/views.py:800 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:822 +#: aleksis/core/views.py:825 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:852 +#: aleksis/core/views.py:855 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:885 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:886 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:887 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:904 +#: aleksis/core/views.py:907 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:914 +#: aleksis/core/views.py:917 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:946 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:976 +#: aleksis/core/views.py:979 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:986 +#: aleksis/core/views.py:989 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1057 +#: aleksis/core/views.py:1060 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1059 +#: aleksis/core/views.py:1062 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1129 +#: aleksis/core/views.py:1138 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1220 +#: aleksis/core/views.py:1229 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1230 +#: aleksis/core/views.py:1239 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1240 +#: aleksis/core/views.py:1249 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1250 +#: aleksis/core/views.py:1259 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1260 +#: aleksis/core/views.py:1269 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1328 +#: aleksis/core/views.py:1337 msgid "The requested PDF file does not exist" msgstr "" -#: aleksis/core/views.py:1337 aleksis/core/views.py:1341 +#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 msgid "The requested task does not exist or is not accessible" msgstr "" -#: aleksis/core/views.py:1379 +#: aleksis/core/views.py:1388 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1386 +#: aleksis/core/views.py:1395 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1445 -msgid "Person was invited successfully." +#: aleksis/core/views.py:1466 +msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1447 +#: aleksis/core/views.py:1477 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po index 427b5fbc842fe8bbbc70d795633af5070b404ec7..dfec73c5c894d3d686092593be9c21a811cd0535 100644 --- a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po index 9437eabc1987ac629a51e68f29b3dcc250179441..2973720cd0f3f85a06ca9d68c21a2c09a92961a5 100644 --- a/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po +++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -37,7 +37,7 @@ msgstr "" msgid "Home and mobile phone" msgstr "" -#: aleksis/core/apps.py:171 aleksis/core/forms.py:218 aleksis/core/menus.py:265 +#: aleksis/core/apps.py:171 aleksis/core/forms.py:220 aleksis/core/menus.py:265 #: aleksis/core/models.py:462 aleksis/core/templates/core/group/list.html:8 #: aleksis/core/templates/core/group/list.html:9 #: aleksis/core/templates/core/person/full.html:250 @@ -98,145 +98,157 @@ msgstr "" msgid "Group" msgstr "" -#: aleksis/core/forms.py:48 aleksis/core/forms.py:554 +#: aleksis/core/forms.py:50 aleksis/core/forms.py:581 msgid "Base data" msgstr "" -#: aleksis/core/forms.py:53 +#: aleksis/core/forms.py:55 msgid "Address" msgstr "" -#: aleksis/core/forms.py:54 aleksis/core/forms.py:563 +#: aleksis/core/forms.py:56 aleksis/core/forms.py:590 msgid "Contact data" msgstr "" -#: aleksis/core/forms.py:56 +#: aleksis/core/forms.py:58 msgid "Advanced personal data" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "New user" msgstr "" -#: aleksis/core/forms.py:104 +#: aleksis/core/forms.py:106 msgid "Create a new account" msgstr "" -#: aleksis/core/forms.py:130 +#: aleksis/core/forms.py:132 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: aleksis/core/forms.py:134 +#: aleksis/core/forms.py:136 msgid "This username is already in use." msgstr "" -#: aleksis/core/forms.py:151 aleksis/core/models.py:130 +#: aleksis/core/forms.py:153 aleksis/core/models.py:130 msgid "School term" msgstr "" -#: aleksis/core/forms.py:152 +#: aleksis/core/forms.py:154 msgid "Common data" msgstr "" -#: aleksis/core/forms.py:153 aleksis/core/forms.py:205 +#: aleksis/core/forms.py:155 aleksis/core/forms.py:207 #: aleksis/core/menus.py:254 aleksis/core/models.py:153 #: aleksis/core/templates/core/person/list.html:8 #: aleksis/core/templates/core/person/list.html:9 msgid "Persons" msgstr "" -#: aleksis/core/forms.py:154 aleksis/core/forms.py:565 +#: aleksis/core/forms.py:156 aleksis/core/forms.py:592 msgid "Additional data" msgstr "" -#: aleksis/core/forms.py:155 aleksis/core/models.py:206 +#: aleksis/core/forms.py:157 aleksis/core/models.py:206 #: aleksis/core/models.py:514 msgid "Photo" msgstr "" -#: aleksis/core/forms.py:197 aleksis/core/forms.py:200 +#: aleksis/core/forms.py:199 aleksis/core/forms.py:202 #: aleksis/core/models.py:73 msgid "Date" msgstr "" -#: aleksis/core/forms.py:198 aleksis/core/forms.py:201 +#: aleksis/core/forms.py:200 aleksis/core/forms.py:203 #: aleksis/core/models.py:81 msgid "Time" msgstr "" -#: aleksis/core/forms.py:231 +#: aleksis/core/forms.py:233 msgid "From when until when should the announcement be displayed?" msgstr "" -#: aleksis/core/forms.py:234 +#: aleksis/core/forms.py:236 msgid "Who should see the announcement?" msgstr "" -#: aleksis/core/forms.py:235 +#: aleksis/core/forms.py:237 msgid "Write your announcement:" msgstr "" -#: aleksis/core/forms.py:274 +#: aleksis/core/forms.py:276 msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: aleksis/core/forms.py:278 +#: aleksis/core/forms.py:280 msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: aleksis/core/forms.py:287 +#: aleksis/core/forms.py:289 msgid "You need at least one recipient." msgstr "" -#: aleksis/core/forms.py:396 +#: aleksis/core/forms.py:398 msgid "Invitation code" msgstr "" -#: aleksis/core/forms.py:397 +#: aleksis/core/forms.py:399 msgid "Please enter your invitation code." msgstr "" -#: aleksis/core/forms.py:429 +#: aleksis/core/forms.py:418 aleksis/core/models.py:181 +msgid "First name" +msgstr "" + +#: aleksis/core/forms.py:419 aleksis/core/models.py:182 +msgid "Last name" +msgstr "" + +#: aleksis/core/forms.py:428 +msgid "A person is using this e-mail address" +msgstr "" + +#: aleksis/core/forms.py:456 msgid "Who should get the permission?" msgstr "" -#: aleksis/core/forms.py:430 +#: aleksis/core/forms.py:457 msgid "On what?" msgstr "" -#: aleksis/core/forms.py:456 +#: aleksis/core/forms.py:483 msgid "Select objects which the permission should be granted for:" msgstr "" -#: aleksis/core/forms.py:459 +#: aleksis/core/forms.py:486 msgid "Grant the permission for all objects" msgstr "" -#: aleksis/core/forms.py:467 +#: aleksis/core/forms.py:494 msgid "You must select at least one group or person which should get the permission." msgstr "" -#: aleksis/core/forms.py:472 +#: aleksis/core/forms.py:499 msgid "You must grant the permission to all objects and/or to some objects." msgstr "" -#: aleksis/core/forms.py:559 +#: aleksis/core/forms.py:586 msgid "Adress data" msgstr "" -#: aleksis/core/forms.py:571 +#: aleksis/core/forms.py:598 msgid "Account data" msgstr "" -#: aleksis/core/forms.py:578 +#: aleksis/core/forms.py:605 msgid "Password" msgstr "" -#: aleksis/core/forms.py:581 +#: aleksis/core/forms.py:608 msgid "Password (again)" msgstr "" -#: aleksis/core/forms.py:747 +#: aleksis/core/forms.py:775 msgid "No valid selection." msgstr "" @@ -266,7 +278,7 @@ msgstr "" msgid "Login" msgstr "" -#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:20 +#: aleksis/core/menus.py:15 aleksis/core/templates/account/signup.html:22 #: aleksis/core/templates/socialaccount/signup.html:23 msgid "Sign up" msgstr "" @@ -521,18 +533,10 @@ msgstr "" msgid "male" msgstr "" -#: aleksis/core/models.py:178 aleksis/core/models.py:1219 +#: aleksis/core/models.py:178 aleksis/core/models.py:1227 msgid "Linked user" msgstr "" -#: aleksis/core/models.py:181 -msgid "First name" -msgstr "" - -#: aleksis/core/models.py:182 -msgid "Last name" -msgstr "" - #: aleksis/core/models.py:184 msgid "Additional name(s)" msgstr "" @@ -821,7 +825,7 @@ msgstr "" msgid "Menu" msgstr "" -#: aleksis/core/models.py:1026 aleksis/core/models.py:1266 +#: aleksis/core/models.py:1026 aleksis/core/models.py:1274 #: aleksis/core/templates/oauth2_provider/application/detail.html:26 msgid "Icon" msgstr "" @@ -910,55 +914,55 @@ msgstr "" msgid "E-Mail address" msgstr "" -#: aleksis/core/models.py:1169 +#: aleksis/core/models.py:1177 msgid "Owner" msgstr "" -#: aleksis/core/models.py:1173 +#: aleksis/core/models.py:1181 msgid "File expires at" msgstr "" -#: aleksis/core/models.py:1175 +#: aleksis/core/models.py:1183 msgid "Generated HTML file" msgstr "" -#: aleksis/core/models.py:1177 +#: aleksis/core/models.py:1185 msgid "Generated PDF file" msgstr "" -#: aleksis/core/models.py:1184 +#: aleksis/core/models.py:1192 msgid "PDF file" msgstr "" -#: aleksis/core/models.py:1185 +#: aleksis/core/models.py:1193 msgid "PDF files" msgstr "" -#: aleksis/core/models.py:1190 +#: aleksis/core/models.py:1198 msgid "Task result" msgstr "" -#: aleksis/core/models.py:1193 +#: aleksis/core/models.py:1201 msgid "Task user" msgstr "" -#: aleksis/core/models.py:1205 +#: aleksis/core/models.py:1213 msgid "Task user assignment" msgstr "" -#: aleksis/core/models.py:1206 +#: aleksis/core/models.py:1214 msgid "Task user assignments" msgstr "" -#: aleksis/core/models.py:1222 +#: aleksis/core/models.py:1230 msgid "Additional attributes" msgstr "" -#: aleksis/core/models.py:1260 +#: aleksis/core/models.py:1268 msgid "Allowed scopes that clients can request" msgstr "" -#: aleksis/core/models.py:1270 +#: aleksis/core/models.py:1278 msgid "This image will be shown as icon in the authorization flow. It should be squared." msgstr "" @@ -1154,11 +1158,11 @@ msgstr "" msgid "Country for phone number parsing" msgstr "" -#: aleksis/core/settings.py:526 +#: aleksis/core/settings.py:529 msgid "English" msgstr "" -#: aleksis/core/settings.py:527 +#: aleksis/core/settings.py:530 msgid "German" msgstr "" @@ -1172,14 +1176,14 @@ msgid "Edit" msgstr "" #: aleksis/core/tables.py:26 aleksis/core/tables.py:94 -#: aleksis/core/tables.py:137 +#: aleksis/core/tables.py:138 #: aleksis/core/templates/core/announcement/list.html:22 msgid "Actions" msgstr "" #: aleksis/core/tables.py:61 aleksis/core/tables.py:62 #: aleksis/core/tables.py:76 aleksis/core/tables.py:92 -#: aleksis/core/tables.py:135 +#: aleksis/core/tables.py:136 #: aleksis/core/templates/core/announcement/list.html:42 #: aleksis/core/templates/core/group/full.html:31 #: aleksis/core/templates/core/pages/delete.html:22 @@ -2176,6 +2180,22 @@ msgstr "" msgid "Save preferences" msgstr "" +#: aleksis/core/templates/invitations/disabled.html:5 +msgid "The invite feature is disabled" +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:13 +msgid "The invite feature is disabled." +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:15 +msgid "To enable it, switch on the corresponding checkbox in the authentication section of the " +msgstr "" + +#: aleksis/core/templates/invitations/disabled.html:16 +msgid "site preferences page" +msgstr "" + #: aleksis/core/templates/invitations/enter.html:21 msgid "Accept your invitation" msgstr "" @@ -2554,17 +2574,17 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:3 +#: aleksis/core/templates/templated_email/person_changed.email:4 #, python-format msgid "%(person)s changed their data!" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:6 +#: aleksis/core/templates/templated_email/person_changed.email:7 #, python-format msgid "the person %(person)s recently changed the following fields:" msgstr "" -#: aleksis/core/templates/templated_email/person_changed.email:14 +#: aleksis/core/templates/templated_email/person_changed.email:15 #, python-format msgid "" "\n" @@ -2960,148 +2980,148 @@ msgstr "" msgid "The school term has been saved." msgstr "" -#: aleksis/core/views.py:414 +#: aleksis/core/views.py:417 msgid "The child groups were successfully saved." msgstr "" -#: aleksis/core/views.py:433 aleksis/core/views.py:443 +#: aleksis/core/views.py:436 aleksis/core/views.py:446 msgid "The person has been saved." msgstr "" -#: aleksis/core/views.py:493 +#: aleksis/core/views.py:496 msgid "The group has been saved." msgstr "" -#: aleksis/core/views.py:590 +#: aleksis/core/views.py:593 msgid "The announcement has been saved." msgstr "" -#: aleksis/core/views.py:606 +#: aleksis/core/views.py:609 msgid "The announcement has been deleted." msgstr "" -#: aleksis/core/views.py:674 +#: aleksis/core/views.py:677 msgid "The requested preference registry does not exist" msgstr "" -#: aleksis/core/views.py:693 +#: aleksis/core/views.py:696 msgid "The preferences have been saved successfully." msgstr "" -#: aleksis/core/views.py:717 +#: aleksis/core/views.py:720 msgid "The person has been deleted." msgstr "" -#: aleksis/core/views.py:731 +#: aleksis/core/views.py:734 msgid "The group has been deleted." msgstr "" -#: aleksis/core/views.py:763 +#: aleksis/core/views.py:766 msgid "The additional_field has been saved." msgstr "" -#: aleksis/core/views.py:797 +#: aleksis/core/views.py:800 msgid "The additional field has been deleted." msgstr "" -#: aleksis/core/views.py:822 +#: aleksis/core/views.py:825 msgid "The group type has been saved." msgstr "" -#: aleksis/core/views.py:852 +#: aleksis/core/views.py:855 msgid "The group type has been deleted." msgstr "" -#: aleksis/core/views.py:885 +#: aleksis/core/views.py:888 msgid "Progress: Run data checks" msgstr "" -#: aleksis/core/views.py:886 +#: aleksis/core/views.py:889 msgid "Run data checks …" msgstr "" -#: aleksis/core/views.py:887 +#: aleksis/core/views.py:890 msgid "The data checks were run successfully." msgstr "" -#: aleksis/core/views.py:888 +#: aleksis/core/views.py:891 msgid "There was a problem while running data checks." msgstr "" -#: aleksis/core/views.py:904 +#: aleksis/core/views.py:907 #, python-brace-format msgid "The solve option '{solve_option_obj.verbose_name}' " msgstr "" -#: aleksis/core/views.py:914 +#: aleksis/core/views.py:917 msgid "The requested solve option does not exist" msgstr "" -#: aleksis/core/views.py:946 +#: aleksis/core/views.py:949 msgid "The dashboard widget has been saved." msgstr "" -#: aleksis/core/views.py:976 +#: aleksis/core/views.py:979 msgid "The dashboard widget has been created." msgstr "" -#: aleksis/core/views.py:986 +#: aleksis/core/views.py:989 msgid "The dashboard widget has been deleted." msgstr "" -#: aleksis/core/views.py:1057 +#: aleksis/core/views.py:1060 msgid "Your dashboard configuration has been saved successfully." msgstr "" -#: aleksis/core/views.py:1059 +#: aleksis/core/views.py:1062 msgid "The configuration of the default dashboard has been saved successfully." msgstr "" -#: aleksis/core/views.py:1129 +#: aleksis/core/views.py:1138 #, python-brace-format msgid "The invitation was successfully created. The invitation code is {code}" msgstr "" -#: aleksis/core/views.py:1220 +#: aleksis/core/views.py:1229 msgid "We have successfully assigned the permissions." msgstr "" -#: aleksis/core/views.py:1230 +#: aleksis/core/views.py:1239 msgid "The global user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1240 +#: aleksis/core/views.py:1249 msgid "The global group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1250 +#: aleksis/core/views.py:1259 msgid "The object user permission has been deleted." msgstr "" -#: aleksis/core/views.py:1260 +#: aleksis/core/views.py:1269 msgid "The object group permission has been deleted." msgstr "" -#: aleksis/core/views.py:1328 +#: aleksis/core/views.py:1337 msgid "The requested PDF file does not exist" msgstr "" -#: aleksis/core/views.py:1337 aleksis/core/views.py:1341 +#: aleksis/core/views.py:1346 aleksis/core/views.py:1350 msgid "The requested task does not exist or is not accessible" msgstr "" -#: aleksis/core/views.py:1379 +#: aleksis/core/views.py:1388 msgid "The third-party account could not be disconnected because it is the only login method available." msgstr "" -#: aleksis/core/views.py:1386 +#: aleksis/core/views.py:1395 msgid "The third-party account has been successfully disconnected." msgstr "" -#: aleksis/core/views.py:1445 -msgid "Person was invited successfully." +#: aleksis/core/views.py:1466 +msgid "Person was invited successfully and an email with further instructions has been send to them." msgstr "" -#: aleksis/core/views.py:1447 +#: aleksis/core/views.py:1477 msgid "Person was already invited." msgstr "" diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po index 427b5fbc842fe8bbbc70d795633af5070b404ec7..dfec73c5c894d3d686092593be9c21a811cd0535 100644 --- a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-31 17:03+0100\n" +"POT-Creation-Date: 2022-02-08 23:16+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" diff --git a/aleksis/core/models.py b/aleksis/core/models.py index d8f63e606073f92e8db799206012cfc9a998a5d8..812a9d254ca4bff2e9372ed7969d0cb2b811c176 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -1150,8 +1150,16 @@ class PersonInvitation(AbstractBaseInvitation, PureDjangoModel): def __str__(self) -> str: return f"{self.email} ({self.inviter})" - key_expired = Invitation.key_expired + @classmethod + def create(cls, email, inviter=None, **kwargs): + length = get_site_preferences()["auth__invite_code_length"] + packet_size = get_site_preferences()["auth__invite_code_packet_size"] + code = generate_random_code(length, packet_size) + instance = cls.objects.create(email=email, inviter=inviter, key=code, **kwargs) + return instance + + key_expired = Invitation.key_expired send_invitation = Invitation.send_invitation diff --git a/aleksis/core/rules.py b/aleksis/core/rules.py index ad1f55fcc44f470fac11c362c456451a56620785..022fa11a00671a3acb0775c2229a378bd3981342 100644 --- a/aleksis/core/rules.py +++ b/aleksis/core/rules.py @@ -329,7 +329,7 @@ rules.add_perm("core.can_change_password", can_change_password_predicate) invite_enabled_predicate = is_site_preference_set(section="auth", pref="invite_enabled") rules.add_perm("core.invite_enabled", invite_enabled_predicate) -can_invite_predicate = has_person & has_global_perm("core.invite") +can_invite_predicate = invite_enabled_predicate & has_person & has_global_perm("core.invite") rules.add_perm("core.can_invite", can_invite_predicate) # OAuth2 permissions diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index aaf341ef69d5618254053856f3d4b179db1e90c1..087762de88b667f90c942f3596a7df4991faf627 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -271,8 +271,9 @@ else: INSTALLED_APPS.append("cachalot") DEBUG_TOOLBAR_PANELS.append("cachalot.panels.CachalotPanel") CACHALOT_TIMEOUT = _settings.get("caching.cachalot.timeout", None) -CACHALOT_DATABASES = set(["default"]) +CACHALOT_DATABASES = set(["default", "default_oot"]) SILENCED_SYSTEM_CHECKS += ["cachalot.W001"] +CACHALOT_ENABLED = _settings.get("caching.query_caching", True) SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default" @@ -371,6 +372,8 @@ INVITATIONS_INVITATION_EXPIRY = _settings.get("auth.invitation.expiry", 3) INVITATIONS_EMAIL_SUBJECT_PREFIX = ACCOUNT_EMAIL_SUBJECT_PREFIX # Use custom invitation model INVITATIONS_INVITATION_MODEL = "core.PersonInvitation" +# Use custom invitation form +INVITATIONS_INVITE_FORM = "aleksis.core.forms.PersonCreateInviteForm" # Display error message if invitation code is invalid INVITATIONS_GONE_ON_ACCEPT_ERROR = False # Mark invitation as accepted after signup diff --git a/aleksis/core/tables.py b/aleksis/core/tables.py index ab19c80608f1a8966dab7ae2094eca7caf579252..f08460bd8654907cb56f655e01014342f8e59ab5 100644 --- a/aleksis/core/tables.py +++ b/aleksis/core/tables.py @@ -116,6 +116,7 @@ class InvitationCodeColumn(tables.Column): class InvitationsTable(tables.Table): """Table to list persons.""" + person_id = PersonColumn() email = tables.EmailColumn() sent = tables.DateColumn() inviter_id = PersonColumn() diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html index 2abf1445494da40885904252ecbd0aa5bffed077..bf56e08db5b6fd6d6052585ce216bd50cbea3796 100644 --- a/aleksis/core/templates/500.html +++ b/aleksis/core/templates/500.html @@ -16,6 +16,10 @@ {% endblocktrans %} </p> {% include "core/partials/admins_list.html" %} + <a href="javascript:window.location.reload()" class="btn green waves-effect waves-light"> + <i class="material-icons left">refresh</i> + {% trans "Retry" %} + </a> </div> </div> </div> diff --git a/aleksis/core/templates/account/signup.html b/aleksis/core/templates/account/signup.html index b4a74179908dafc208d34c5b2c472f3bd73c3de4..8885e3902af13c609a69a595df3d125b66dc79ce 100644 --- a/aleksis/core/templates/account/signup.html +++ b/aleksis/core/templates/account/signup.html @@ -16,7 +16,9 @@ <form method="post" action="{% url 'account_signup' %}"> {% csrf_token %} {% form form=form %}{% endform %} - <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" /> + {% if redirect_field_value %} + <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" /> + {% endif %} {% trans "Sign up" as caption %} {% include "core/partials/save_button.html" with caption=caption icon="how_to_reg" %} </form> diff --git a/aleksis/core/templates/core/person/full.html b/aleksis/core/templates/core/person/full.html index 24e267db3caf7b6a9886f10269a4db654514f696..23f8ba29b30188dd4cdf5b76af23991a0f618119 100644 --- a/aleksis/core/templates/core/person/full.html +++ b/aleksis/core/templates/core/person/full.html @@ -48,7 +48,7 @@ </a> {% endif %} - {% if can_invite and not person.user %} + {% if invite_enabled and can_invite and not person.user %} <a href="{% url "invite_person_by_id" person.id %}" class="btn waves-effect waves-light"> <i class="material-icons left">card_giftcard</i> {% trans "Invite user" %} diff --git a/aleksis/core/templates/invitations/disabled.html b/aleksis/core/templates/invitations/disabled.html new file mode 100644 index 0000000000000000000000000000000000000000..2515a01f2437c7f617cc14fcee0226bedeacd341 --- /dev/null +++ b/aleksis/core/templates/invitations/disabled.html @@ -0,0 +1,21 @@ +{% extends "core/base.html" %} + +{% load i18n %} + +{% block browser_title %}{% blocktrans %}The invite feature is disabled{% endblocktrans %}{% endblock %} +{% block no_page_title %}{% endblock %} + +{% block content %} + <div class="container"> + <div class="card red"> + <div class="card-content white-text"> + <i class="material-icons small left">disabled_by_default</i> + <span class="card-title">{% blocktrans %}The invite feature is disabled.{% endblocktrans %}</span> + <p> + {% trans "To enable it, switch on the corresponding checkbox in the authentication section of the " %} + <a href="{% url "preferences_site" %}">{% trans "site preferences page" %}</a>. + </p> + </div> + </div> + </div> +{% endblock %} diff --git a/aleksis/core/templates/templated_email/person_changed.email b/aleksis/core/templates/templated_email/person_changed.email index 068db0cc67f2b6f55e0f15a5d3e80f06a29594b4..e4cd967aebd4f3d9a0a46f5762fe86e1d019afba 100644 --- a/aleksis/core/templates/templated_email/person_changed.email +++ b/aleksis/core/templates/templated_email/person_changed.email @@ -1,5 +1,6 @@ -{% load i18n %} {% extends "templated_email/base.email" %} +{% load i18n %} + {% block subject_content %}{% blocktrans with person=person %}{{ person }} changed their data!{% endblocktrans %}{% endblock %} {% block plain_content %} diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index b5dcb004d040b64b22242b977702a104fb2ea33a..c91bae7f29c978d30e96361f92213eec7c5679d1 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -40,6 +40,7 @@ urlpatterns = [ views.GenerateInvitationCode.as_view(), name="generate_invitation_code", ), + path("invitations/disabled", views.InviteDisabledView.as_view(), name="invite_disabled"), path("invitations/", include("invitations.urls")), path( "accounts/social/connections/<int:pk>/delete", @@ -63,7 +64,7 @@ urlpatterns = [ path("person/<int:id_>/", views.person, name="person_by_id"), path("person/<int:pk>/edit/", views.EditPersonView.as_view(), name="edit_person_by_id"), path("person/<int:id_>/delete/", views.delete_person, name="delete_person_by_id"), - path("person/<int:id_>/invite/", views.InvitePersonByID.as_view(), name="invite_person_by_id"), + path("person/<int:pk>/invite/", views.InvitePersonByID.as_view(), name="invite_person_by_id"), path("groups", views.groups, name="groups"), path("groups/additional_fields", views.additional_fields, name="additional_fields"), path("groups/child_groups/", views.groups_child_groups, name="groups_child_groups"), diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py index fc83b605032013b7d0dbee06ce0b1ef8193c177d..6988dd53137f2d5ca364bcfd7091d9b1795e7f10 100644 --- a/aleksis/core/util/core_helpers.py +++ b/aleksis/core/util/core_helpers.py @@ -17,6 +17,8 @@ from django.utils.crypto import get_random_string from django.utils.functional import lazy from django.utils.module_loading import import_string +from cachalot.api import invalidate +from cachalot.signals import post_invalidation from cache_memoize import cache_memoize @@ -403,6 +405,8 @@ class OOTRouter: default_db = "default" oot_db = "default_oot" + _cachalot_invalidating = [] + @property def oot_labels(self): return settings.DATABASE_OOT_LABELS @@ -441,3 +445,20 @@ class OOTRouter: return False return None + + @classmethod + def _invalidate_cachalot(cls, sender, **kwargs): + if sender in cls._cachalot_invalidating: + return + cls._cachalot_invalidating.append(sender) + + if kwargs["db_alias"] == cls.default_db: + invalidate(sender, db_alias=cls.oot_db) + elif kwargs["db_alias"] == cls.oot_db: + invalidate(sender, db_alias=cls.default_db) + + if sender in cls._cachalot_invalidating: + cls._cachalot_invalidating.remove(sender) + + +post_invalidation.connect(OOTRouter._invalidate_cachalot) diff --git a/aleksis/core/views.py b/aleksis/core/views.py index c23498a8b611fb91872089aa3f09fb89cba0b4e9..7be99d6a0e67aa552f53822f3b9fcbc4abf9e87b 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -330,6 +330,9 @@ def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: # Get groups where person is member of context["groups"] = person.member_of.all() + # Get whether the invitation feature is enabled in the preferences + context["invite_enabled"] = get_site_preferences()["auth__invite_enabled"] + return render(request, "core/person/full.html", context) @@ -1075,6 +1078,11 @@ class InvitePerson(PermissionRequiredMixin, SingleTableView, SendInvite): table_class = InvitationsTable context = {} + def dispatch(self, request, *args, **kwargs): + if not get_site_preferences()["auth__invite_enabled"]: + return HttpResponseRedirect(reverse_lazy("invite_disabled")) + return super().dispatch(request, *args, **kwargs) + # Get queryset of invitations def get_context_data(self, **kwargs): queryset = kwargs.pop("object_list", None) @@ -1102,6 +1110,7 @@ class EnterInvitationCode(FormView): accept_invitation( invitation=invitation, request=self.request, signal_sender=self.request.user ) + self.request.session["invitation_code_entered"] = True return redirect("account_signup") return redirect("invitations:accept-invite", code) @@ -1406,11 +1415,13 @@ class AccountRegisterView(SignupView): """ form_class = AccountRegisterForm - success_url = "index" + success_url = reverse_lazy("index") def dispatch(self, request, *args, **kwargs): - if not request.user.has_perm("core.can_register") and not request.session.get( - "account_verified_email" + if ( + not request.user.has_perm("core.can_register") + and not request.session.get("account_verified_email") + and not request.session.get("invitation_code_entered") ): raise PermissionDenied() return super(AccountRegisterView, self).dispatch(request, *args, **kwargs) @@ -1421,17 +1432,22 @@ class AccountRegisterView(SignupView): return kwargs -class InvitePersonByID(View): +class InvitePersonByID(PermissionRequiredMixin, SingleObjectMixin, View): """Custom view to invite person by their ID.""" + model = Person success_url = reverse_lazy("persons") + permission_required = "core.can_invite" + + def dispatch(self, request, *args, **kwargs): + if not get_site_preferences()["auth__invite_enabled"]: + return HttpResponseRedirect(reverse_lazy("invite_disabled")) + return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): - self.object = self.get_object() - success_url = reverze_lazy("person_by_id", self.object.pk) - person = self.object + person = self.get_object() - if not PersonInvitation.objects.filter(email=person.email).exists(): + if not person.email or not PersonInvitation.objects.filter(email=person.email).exists(): length = get_site_preferences()["auth__invite_code_length"] packet_size = get_site_preferences()["auth__invite_code_packet_size"] key = generate_random_code(length, packet_size) @@ -1442,11 +1458,37 @@ class InvitePersonByID(View): invite.save() invite.send_invitation(self.request) - messages.success(self.request, _("Person was invited successfully.")) + + if person.email: + messages.success( + self.request, + _( + "Person was invited successfully and an email " + "with further instructions has been send to them." + ), + ) + else: + readable_key = "-".join(wrap(key, packet_size)) + messages.success( + self.request, + f"{_('Person was invited successfully. Their key is')} {readable_key}.", + ) else: messages.success(self.request, _("Person was already invited.")) - return HttpResponseRedirect(success_url) + return HttpResponseRedirect(person.get_absolute_url()) + + +class InviteDisabledView(PermissionRequiredMixin, TemplateView): + """View to display a notice that the invite feature is disabled and how to enable it.""" + + template_name = "invitations/disabled.html" + permission_required = "core.change_site_preferences_rule" + + def dispatch(self, request, *args, **kwargs): + if get_site_preferences()["auth__invite_enabled"]: + raise PermissionDenied() + return super().dispatch(request, *args, **kwargs) class LoginView(AllAuthLoginView): diff --git a/docker-startup.sh b/docker-startup.sh index 776b13310b1078da8d2687dd5a4af8c146c3c0df..1e02ce1d4bfdbd4373e93da8e2bd3f0c1ae02d56 100755 --- a/docker-startup.sh +++ b/docker-startup.sh @@ -48,11 +48,7 @@ wait_database() { prepare_database() { # Migrate database; should only be run in app container or job - if aleksis-admin migrate --check >/dev/null 2>&1; then - aleksis-admin migrate && \ - aleksis-admin clear_cache && \ - aleksis-admin createinitialrevisions - fi + aleksis-admin migrate && aleksis-admin createinitialrevisions } # Wait for database to be reachable under all conditions diff --git a/docs/_static/data_checks.png b/docs/_static/data_checks.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ff5b36f2773ae2dfd6839f2dbcdad8b034397f Binary files /dev/null and b/docs/_static/data_checks.png differ diff --git a/docs/conf.py b/docs/conf.py index 6e406af5c0c7d02362e47c38c7581a50a983b5e3..2acaa4acf472ffb6ea2a1124d9371644186cc5c6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ author = "The AlekSIS Team" # The short X.Y version version = "2.7" # The full version, including alpha/beta/rc tags -release = "2.7.4.dev0" +release = "2.7.5.dev0" # -- General configuration --------------------------------------------------- diff --git a/docs/dev/02_install_apps.rst b/docs/dev/02_install_apps.rst index bbfbb9b4007e533c1e910ae829ddf80f382b7d99..335f92f56735e0f1eb02eecdde626d5a074674ff 100644 --- a/docs/dev/02_install_apps.rst +++ b/docs/dev/02_install_apps.rst @@ -9,6 +9,26 @@ sub-folder of the meta repository. If you followed the documentation, they will already be checked out in the version required for the bundle you are running. +Installing a development environment for own apps +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you are developing your own app, you probably do not want to +ru na development environment from the `AlekSIS-Core` repository. + +Instead, simply install the environment using ``poetry install`` from +your app repository – it will pull in `AlekSIS-Core` as a dependency +automatically, and everything will work as described beforehand. + +.. note:: + Take care not to mix up environments, especially if using ``poetry shell``. + + +Using one virtual environment for everything +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + This method is not encouraged for most use cases. + Installing apps into the existing virtual environment of `AlekSIS-Core` can be easily done after starting `poetry shell`:: @@ -17,5 +37,6 @@ be easily done after starting `poetry shell`:: Do not forget to run the maintenance tasks described earlier after installing any app. -**Heads up:** This is not suitable for working on the core, because it -will install the `AlekSIS-Core` version used by the app using `pip` again. +.. note:: + This is not suitable for working on the core, because it + will install the `AlekSIS-Core` version used by the app using `pip` again. diff --git a/pyproject.toml b/pyproject.toml index bb8c16a3dc4f72927e18e805b75396a48a04f173..12199f73cd28724dffa7087dcb6628ea68943fe1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "AlekSIS-Core" -version = "2.7.4.dev0" +version = "2.7.5.dev0" packages = [ { include = "aleksis" } ]