Skip to content
Commits on Source (41)
......@@ -6,6 +6,39 @@ All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog`_,
and this project adheres to `Semantic Versioning`_.
`2.0rc6`_ - 2021-10-11
----------------------
Added
~~~~~
* OpenID Connect scope and accompanying claim ``groups``
* Support config files in JSON format
* Allow apps to dynamically generate OAuth scopes
Changed
~~~~~~~
* Do not log or e-mail ALLOWED_HOSTS violations
* Update translations.
* Use initial superuser settings as default contact and from addresses
Fixed
~~~~~
* Show link to imprint in footer
* Fix API for adding OAuth scopes in AppConfigs
* Deleting persons is possible again.
* Removed wrong changelog section
Removed
~~~~~~~
* Dropped data anonymization (django-hattori) support for now
* ``OAUTH2_SCOPES`` setting in apps is not supported anymore. Use ``get_all_scopes`` method
on ``AppConfig`` class instead.
`2.0rc5`_ - 2021-08-25
----------------------
......@@ -129,14 +162,14 @@ Added
* Allow defining several search configs for LDAP users and groups
* Use setuptools entrypoints to find apps
* Add django-cachalot as query cache
* Add `syncable_fields` property to `ExtensibleModel to discover fields
* Add ``syncable_fields`` property to ``ExtensibleModel`` to discover fields
sync backends can write to
* Add `aleksis-admin` script to wrap django-admin with pre-configured settings
* Add ``aleksis-admin`` script to wrap django-admin with pre-configured settings
* Auto-create persons for users if matching attributes are found
* Add `django-allauth` to allow authentication using OAuth, user registration,
* Add ``django-allauth`` to allow authentication using OAuth, user registration,
password changes and password reset
* Add OAuth2 and OpenID Connect provider support
* Add `django-uwsgi` to use uWSGI and Celery in development
* Add ``django-uwsgi`` to use uWSGI and Celery in development
* Add loading page for displaying Celery task progress
* Implement generic PDF generation using Chromium
* Support Amazon S3 storage for /media files
......@@ -174,7 +207,7 @@ Changed
* Default search index backend is now Whoosh with Redis storage
* Re-style search result page
* Move notifications to separate page with indicator in menu
* Move to `BigAutoField` for all AlekSIS apps
* Move to ``BigAutoField`` for all AlekSIS apps
* Require Django 3.2 and Python 3.9
* Person and group lists can now be filtered
* Allow displaying the default widget to anonymous users
......@@ -326,3 +359,4 @@ Fixed
.. _2.0rc3: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc3
.. _2.0rc4: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc4
.. _2.0rc5: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc5
.. _2.0rc6: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0rc6
from hattori.base import BaseAnonymizer, faker
from .models import Person
class PersonAnonymizer(BaseAnonymizer):
model = Person
attributes = [
("first_name", faker.first_name),
("last_name", faker.last_name),
("additional_name", ""),
("short_name", lambda **kwargs: faker.pystr(min_chars=3, max_chars=5, **kwargs)),
("street", faker.street_name),
("housenumber", faker.building_number),
("postal_code", faker.postcode),
("place", faker.city),
("phone_number", ""),
("mobile_number", ""),
("email", faker.email),
(
"date_of_birth",
lambda **kwargs: faker.date_of_birth(minimum_age=8, maximum_age=66, **kwargs),
),
("photo", ""),
]
......@@ -2,6 +2,7 @@ from typing import Any, Optional
import django.apps
from django.apps import apps
from django.conf import settings
from django.http import HttpRequest
from django.utils.module_loading import autodiscover_modules
......@@ -136,3 +137,19 @@ class CoreConfig(AppConfig):
if has_person(user):
# Save the associated person to pick up defaults
user.person.save()
@classmethod
def get_all_scopes(cls) -> dict[str, str]:
scopes = {
"read": "Read anything the resource owner can read",
"write": "Write anything the resource owner can write",
}
if settings.OAUTH2_PROVIDER.get("OIDC_ENABLED", False):
scopes |= {
"openid": _("OpenID Connect scope"),
"profile": _("Given name, family name, link to profile and picture if existing."),
"address": _("Full home postal address"),
"email": _("Email address"),
"phone": _("Home and mobile phone"),
}
return scopes
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: AlekSIS (School Information System) 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -18,6 +18,26 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
msgid "OpenID Connect scope"
msgstr ""
#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
msgid "Given name, family name, link to profile and picture if existing."
msgstr ""
#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
msgid "Full home postal address"
msgstr ""
#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
msgid "Email address"
msgstr ""
#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
msgid "Home and mobile phone"
msgstr ""
#: aleksis/core/data_checks.py:55
msgid "Ignore problem"
msgstr ""
......@@ -39,7 +59,8 @@ msgstr ""
msgid "The DashboardWidget was reported broken automatically."
msgstr ""
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:78
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
#: aleksis/core/templates/core/base.html:84
#: aleksis/core/templates/core/group/list.html:20
#: aleksis/core/templates/core/person/list.html:24
#: aleksis/core/templates/search/search.html:7
......@@ -96,7 +117,7 @@ msgid "Common data"
msgstr ""
#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
#: aleksis/core/menus.py:236 aleksis/core/models.py:139
#: aleksis/core/menus.py:238 aleksis/core/models.py:139
#: aleksis/core/templates/core/person/list.html:8
#: aleksis/core/templates/core/person/list.html:9
msgid "Persons"
......@@ -116,7 +137,7 @@ msgstr ""
msgid "Time"
msgstr ""
#: aleksis/core/forms.py:234 aleksis/core/menus.py:247
#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
#: aleksis/core/templates/core/group/list.html:9
#: aleksis/core/templates/core/person/full.html:144
......@@ -217,29 +238,30 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: aleksis/core/menus.py:30 aleksis/core/models.py:588
#: aleksis/core/menus.py:32 aleksis/core/models.py:588
#: aleksis/core/preferences.py:26
#: aleksis/core/templates/core/notifications.html:4
#: aleksis/core/templates/core/notifications.html:5
msgid "Notifications"
msgstr ""
#: aleksis/core/menus.py:39
#: aleksis/core/menus.py:41
msgid "Account"
msgstr ""
#: aleksis/core/menus.py:46
#: aleksis/core/menus.py:48
msgid "Stop impersonation"
msgstr ""
#: aleksis/core/menus.py:55 aleksis/core/templates/core/base.html:57
#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
msgid "Logout"
msgstr ""
#: aleksis/core/menus.py:61
#: aleksis/core/menus.py:63
msgid "2FA"
msgstr ""
#: aleksis/core/menus.py:67
#: aleksis/core/menus.py:69
#: aleksis/core/templates/account/password_change.html:5
#: aleksis/core/templates/account/password_change.html:6
#: aleksis/core/templates/account/password_change.html:19
......@@ -251,107 +273,107 @@ msgstr ""
msgid "Change password"
msgstr ""
#: aleksis/core/menus.py:79
#: aleksis/core/menus.py:81
msgid "Me"
msgstr ""
#: aleksis/core/menus.py:88
#: aleksis/core/menus.py:90
#: aleksis/core/templates/dynamic_preferences/form.html:5
msgid "Preferences"
msgstr ""
#: aleksis/core/menus.py:97
#: aleksis/core/menus.py:99
msgid "Third-party accounts"
msgstr ""
#: aleksis/core/menus.py:106
#: aleksis/core/menus.py:108
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
msgid "Authorized applications"
msgstr ""
#: aleksis/core/menus.py:117
#: aleksis/core/menus.py:119
msgid "Admin"
msgstr ""
#: aleksis/core/menus.py:125 aleksis/core/models.py:687
#: aleksis/core/menus.py:127 aleksis/core/models.py:687
#: aleksis/core/templates/core/announcement/list.html:7
#: aleksis/core/templates/core/announcement/list.html:8
msgid "Announcements"
msgstr ""
#: aleksis/core/menus.py:136 aleksis/core/models.py:117
#: aleksis/core/menus.py:138 aleksis/core/models.py:117
#: aleksis/core/templates/core/school_term/list.html:8
#: aleksis/core/templates/core/school_term/list.html:9
msgid "School terms"
msgstr ""
#: aleksis/core/menus.py:147
#: aleksis/core/menus.py:149
#: aleksis/core/templates/core/dashboard_widget/list.html:8
#: aleksis/core/templates/core/dashboard_widget/list.html:9
msgid "Dashboard widgets"
msgstr ""
#: aleksis/core/menus.py:158
#: aleksis/core/menus.py:160
#: aleksis/core/templates/core/management/data_management.html:6
#: aleksis/core/templates/core/management/data_management.html:7
msgid "Data management"
msgstr ""
#: aleksis/core/menus.py:169
#: aleksis/core/menus.py:171
#: aleksis/core/templates/core/pages/system_status.html:5
#: aleksis/core/templates/core/pages/system_status.html:7
msgid "System status"
msgstr ""
#: aleksis/core/menus.py:180
#: aleksis/core/menus.py:182
msgid "Impersonation"
msgstr ""
#: aleksis/core/menus.py:191
#: aleksis/core/menus.py:193
msgid "Configuration"
msgstr ""
#: aleksis/core/menus.py:202 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/templates/core/data_check/list.html:10
msgid "Data checks"
msgstr ""
#: aleksis/core/menus.py:208
#: aleksis/core/menus.py:210
msgid "Backend Admin"
msgstr ""
#: aleksis/core/menus.py:214
#: aleksis/core/menus.py:216
#: aleksis/core/templates/oauth2_provider/application_detail.html:5
#: aleksis/core/templates/oauth2_provider/application_list.html:5
msgid "OAuth2 Applications"
msgstr ""
#: aleksis/core/menus.py:227
#: aleksis/core/menus.py:229
msgid "People"
msgstr ""
#: aleksis/core/menus.py:258 aleksis/core/models.py:941
#: aleksis/core/menus.py:260 aleksis/core/models.py:941
#: aleksis/core/templates/core/group_type/list.html:8
#: aleksis/core/templates/core/group_type/list.html:9
msgid "Group types"
msgstr ""
#: aleksis/core/menus.py:269
#: aleksis/core/menus.py:271
msgid "Persons and accounts"
msgstr ""
#: aleksis/core/menus.py:280
#: aleksis/core/menus.py:282
msgid "Groups and child groups"
msgstr ""
#: aleksis/core/menus.py:291 aleksis/core/models.py:429
#: aleksis/core/menus.py:293 aleksis/core/models.py:429
#: aleksis/core/templates/core/additional_field/list.html:8
#: aleksis/core/templates/core/additional_field/list.html:9
msgid "Additional fields"
msgstr ""
#: aleksis/core/menus.py:306
#: aleksis/core/menus.py:308
#: aleksis/core/templates/core/group/child_groups.html:7
#: aleksis/core/templates/core/group/child_groups.html:9
msgid "Assign child groups to groups"
......@@ -858,46 +880,70 @@ msgstr ""
msgid "Can solve data check problems"
msgstr ""
#: aleksis/core/models.py:1040
#: aleksis/core/models.py:1044
msgid "Owner"
msgstr ""
#: aleksis/core/models.py:1043
#: aleksis/core/models.py:1048
msgid "File expires at"
msgstr ""
#: aleksis/core/models.py:1045
#: aleksis/core/models.py:1050
msgid "Generated HTML file"
msgstr ""
#: aleksis/core/models.py:1047
#: aleksis/core/models.py:1052
msgid "Generated PDF file"
msgstr ""
#: aleksis/core/models.py:1054
#: aleksis/core/models.py:1059
msgid "PDF file"
msgstr ""
#: aleksis/core/models.py:1055
#: aleksis/core/models.py:1060
msgid "PDF files"
msgstr ""
#: aleksis/core/models.py:1060
#: aleksis/core/models.py:1065
msgid "Task result"
msgstr ""
#: aleksis/core/models.py:1063
#: aleksis/core/models.py:1068
msgid "Task user"
msgstr ""
#: aleksis/core/models.py:1075
#: aleksis/core/models.py:1080
msgid "Task user assignment"
msgstr ""
#: aleksis/core/models.py:1076
#: aleksis/core/models.py:1081
msgid "Task user assignments"
msgstr ""
#: aleksis/core/preferences.py:22
msgid "General"
msgstr ""
#: aleksis/core/preferences.py:23
msgid "School"
msgstr ""
#: aleksis/core/preferences.py:24
msgid "Theme"
msgstr ""
#: aleksis/core/preferences.py:25
msgid "Mail"
msgstr ""
#: aleksis/core/preferences.py:27
msgid "Footer"
msgstr ""
#: aleksis/core/preferences.py:28
msgid "Accounts"
msgstr ""
#: aleksis/core/preferences.py:29
msgid "Authentication"
msgstr ""
......@@ -1038,11 +1084,19 @@ msgstr ""
msgid "in minutes"
msgstr ""
#: aleksis/core/settings.py:470
#: aleksis/core/preferences.py:398
msgid "Automatically update the dashboard and its widgets"
msgstr ""
#: aleksis/core/preferences.py:408
msgid "Automatically update the dashboard and its widgets sitewide"
msgstr ""
#: aleksis/core/settings.py:468
msgid "English"
msgstr ""
#: aleksis/core/settings.py:471
#: aleksis/core/settings.py:469
msgid "German"
msgstr ""
......@@ -1383,23 +1437,23 @@ msgstr ""
msgid "There are no announcements."
msgstr ""
#: aleksis/core/templates/core/base.html:55
#: aleksis/core/templates/core/base.html:60
msgid "Logged in as"
msgstr ""
#: aleksis/core/templates/core/base.html:148
#: aleksis/core/templates/core/base.html:154
msgid "About AlekSIS — The Free School Information System"
msgstr ""
#: aleksis/core/templates/core/base.html:156
#: aleksis/core/templates/core/base.html:162
msgid "Impress"
msgstr ""
#: aleksis/core/templates/core/base.html:164
#: aleksis/core/templates/core/base.html:170
msgid "Privacy Policy"
msgstr ""
#: aleksis/core/templates/core/base_print.html:67
#: aleksis/core/templates/core/base_print.html:72
msgid "Powered by AlekSIS"
msgstr ""
......@@ -1673,7 +1727,7 @@ msgstr ""
msgid "Home"
msgstr ""
#: aleksis/core/templates/core/index.html:51
#: aleksis/core/templates/core/index.html:49
msgid ""
"\n"
" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n"
......@@ -1681,24 +1735,24 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/index.html:61
#: aleksis/core/templates/core/index.html:59
msgid "Last activities"
msgstr ""
#: aleksis/core/templates/core/index.html:79
#: aleksis/core/templates/core/index.html:77
msgid "No activities available yet."
msgstr ""
#: aleksis/core/templates/core/index.html:84
#: aleksis/core/templates/core/index.html:82
msgid "Recent notifications"
msgstr ""
#: aleksis/core/templates/core/index.html:100
#: aleksis/core/templates/core/index.html:98
#: aleksis/core/templates/core/notifications.html:23
msgid "More information →"
msgstr ""
#: aleksis/core/templates/core/index.html:107
#: aleksis/core/templates/core/index.html:105
#: aleksis/core/templates/core/notifications.html:30
msgid "No notifications available yet."
msgstr ""
......@@ -1885,8 +1939,8 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:9
#: aleksis/core/templates/core/partials/announcements.html:36
#: aleksis/core/templates/core/partials/announcements.html:8
#: aleksis/core/templates/core/partials/announcements.html:35
#, python-format
msgid ""
"\n"
......@@ -1894,7 +1948,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:13
#: aleksis/core/templates/core/partials/announcements.html:12
#, python-format
msgid ""
"\n"
......@@ -1902,7 +1956,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:40
#: aleksis/core/templates/core/partials/announcements.html:39
#, python-format
msgid ""
"\n"
......@@ -2690,127 +2744,127 @@ msgstr ""
msgid "SMS"
msgstr ""
#: aleksis/core/util/pdf.py:89
#: aleksis/core/util/pdf.py:105
msgid "Progress: Generate PDF file"
msgstr ""
#: aleksis/core/util/pdf.py:90
#: aleksis/core/util/pdf.py:106
msgid "Generating PDF file …"
msgstr ""
#: aleksis/core/util/pdf.py:91
#: aleksis/core/util/pdf.py:107
msgid "The PDF file has been generated successfully."
msgstr ""
#: aleksis/core/util/pdf.py:92
#: aleksis/core/util/pdf.py:108
msgid "There was a problem while generating the PDF file."
msgstr ""
#: aleksis/core/util/pdf.py:95
#: aleksis/core/util/pdf.py:111
msgid "Download PDF"
msgstr ""
#: aleksis/core/views.py:249
#: aleksis/core/views.py:253
msgid "The school term has been created."
msgstr ""
#: aleksis/core/views.py:261
#: aleksis/core/views.py:265
msgid "The school term has been saved."
msgstr ""
#: aleksis/core/views.py:406
#: aleksis/core/views.py:410
msgid "The child groups were successfully saved."
msgstr ""
#: aleksis/core/views.py:467
#: aleksis/core/views.py:471
msgid "The person has been saved."
msgstr ""
#: aleksis/core/views.py:506
#: aleksis/core/views.py:510
msgid "The group has been saved."
msgstr ""
#: aleksis/core/views.py:603
#: aleksis/core/views.py:607
msgid "The announcement has been saved."
msgstr ""
#: aleksis/core/views.py:619
#: aleksis/core/views.py:623
msgid "The announcement has been deleted."
msgstr ""
#: aleksis/core/views.py:703
#: aleksis/core/views.py:707
msgid "The preferences have been saved successfully."
msgstr ""
#: aleksis/core/views.py:727
#: aleksis/core/views.py:731
msgid "The person has been deleted."
msgstr ""
#: aleksis/core/views.py:741
#: aleksis/core/views.py:745
msgid "The group has been deleted."
msgstr ""
#: aleksis/core/views.py:773
#: aleksis/core/views.py:777
msgid "The additional_field has been saved."
msgstr ""
#: aleksis/core/views.py:807
#: aleksis/core/views.py:811
msgid "The additional field has been deleted."
msgstr ""
#: aleksis/core/views.py:832
#: aleksis/core/views.py:836
msgid "The group type has been saved."
msgstr ""
#: aleksis/core/views.py:862
#: aleksis/core/views.py:866
msgid "The group type has been deleted."
msgstr ""
#: aleksis/core/views.py:895
#: aleksis/core/views.py:899
msgid "Progress: Run data checks"
msgstr ""
#: aleksis/core/views.py:896
#: aleksis/core/views.py:900
msgid "Run data checks …"
msgstr ""
#: aleksis/core/views.py:897
#: aleksis/core/views.py:901
msgid "The data checks were run successfully."
msgstr ""
#: aleksis/core/views.py:898
#: aleksis/core/views.py:902
msgid "There was a problem while running data checks."
msgstr ""
#: aleksis/core/views.py:914
#: aleksis/core/views.py:918
#, python-brace-format
msgid "The solve option '{solve_option_obj.verbose_name}' "
msgstr ""
#: aleksis/core/views.py:956
#: aleksis/core/views.py:960
msgid "The dashboard widget has been saved."
msgstr ""
#: aleksis/core/views.py:986
#: aleksis/core/views.py:990
msgid "The dashboard widget has been created."
msgstr ""
#: aleksis/core/views.py:996
#: aleksis/core/views.py:1000
msgid "The dashboard widget has been deleted."
msgstr ""
#: aleksis/core/views.py:1063
#: aleksis/core/views.py:1067
msgid "Your dashboard configuration has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1065
#: aleksis/core/views.py:1069
msgid "The configuration of the default dashboard has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1191
#: aleksis/core/views.py:1197
msgid "The third-party account could not be disconnected because it is the only login method available."
msgstr ""
#: aleksis/core/views.py:1198
#: aleksis/core/views.py:1204
msgid "The third-party account has been successfully disconnected."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -30,6 +30,6 @@ msgstr ""
msgid "OK"
msgstr ""
#: aleksis/core/static/js/main.js:133
#: aleksis/core/static/js/main.js:127
msgid "This page may contain outdated information since there is no internet connection."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -29,6 +29,6 @@ msgstr ""
msgid "OK"
msgstr ""
#: aleksis/core/static/js/main.js:133
#: aleksis/core/static/js/main.js:127
msgid "This page may contain outdated information since there is no internet connection."
msgstr ""
......@@ -7,16 +7,38 @@ msgid ""
msgstr ""
"Project-Id-Version: AlekSIS (School Information System) 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"PO-Revision-Date: 2020-04-27 13:03+0000\n"
"Last-Translator: Marlene Grundey <grundema@katharineum.de>\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.0.1\n"
"X-Generator: Weblate 4.4\n"
#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
msgid "OpenID Connect scope"
msgstr ""
#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
msgid "Given name, family name, link to profile and picture if existing."
msgstr ""
#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
msgid "Full home postal address"
msgstr ""
#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
#, fuzzy
#| msgid "Contact details"
msgid "Email address"
msgstr "Détails de contact"
#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
msgid "Home and mobile phone"
msgstr ""
#: aleksis/core/data_checks.py:55
msgid "Ignore problem"
......@@ -39,7 +61,8 @@ msgstr ""
msgid "The DashboardWidget was reported broken automatically."
msgstr ""
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:78
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
#: aleksis/core/templates/core/base.html:84
#: aleksis/core/templates/core/group/list.html:20
#: aleksis/core/templates/core/person/list.html:24
#: aleksis/core/templates/search/search.html:7
......@@ -63,7 +86,7 @@ msgstr ""
#: aleksis/core/forms.py:66
msgid "This username is already in use."
msgstr ""
msgstr "Cet nom est deja en utilisation."
#: aleksis/core/forms.py:90 aleksis/core/forms.py:412
msgid "Base data"
......@@ -104,7 +127,7 @@ msgid "Common data"
msgstr "Détails de contact"
#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
#: aleksis/core/menus.py:236 aleksis/core/models.py:139
#: aleksis/core/menus.py:238 aleksis/core/models.py:139
#: aleksis/core/templates/core/person/list.html:8
#: aleksis/core/templates/core/person/list.html:9
#, fuzzy
......@@ -128,7 +151,7 @@ msgstr "Date"
msgid "Time"
msgstr ""
#: aleksis/core/forms.py:234 aleksis/core/menus.py:247
#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
#: aleksis/core/templates/core/group/list.html:9
#: aleksis/core/templates/core/person/full.html:144
......@@ -233,29 +256,30 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: aleksis/core/menus.py:30 aleksis/core/models.py:588
#: aleksis/core/menus.py:32 aleksis/core/models.py:588
#: aleksis/core/preferences.py:26
#: aleksis/core/templates/core/notifications.html:4
#: aleksis/core/templates/core/notifications.html:5
msgid "Notifications"
msgstr ""
#: aleksis/core/menus.py:39
#: aleksis/core/menus.py:41
msgid "Account"
msgstr ""
#: aleksis/core/menus.py:46
#: aleksis/core/menus.py:48
msgid "Stop impersonation"
msgstr ""
#: aleksis/core/menus.py:55 aleksis/core/templates/core/base.html:57
#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
msgid "Logout"
msgstr ""
#: aleksis/core/menus.py:61
#: aleksis/core/menus.py:63
msgid "2FA"
msgstr ""
#: aleksis/core/menus.py:67
#: aleksis/core/menus.py:69
#: aleksis/core/templates/account/password_change.html:5
#: aleksis/core/templates/account/password_change.html:6
#: aleksis/core/templates/account/password_change.html:19
......@@ -267,87 +291,87 @@ msgstr ""
msgid "Change password"
msgstr ""
#: aleksis/core/menus.py:79
#: aleksis/core/menus.py:81
msgid "Me"
msgstr ""
#: aleksis/core/menus.py:88
#: aleksis/core/menus.py:90
#: aleksis/core/templates/dynamic_preferences/form.html:5
msgid "Preferences"
msgstr ""
#: aleksis/core/menus.py:97
#: aleksis/core/menus.py:99
msgid "Third-party accounts"
msgstr ""
#: aleksis/core/menus.py:106
#: aleksis/core/menus.py:108
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
msgid "Authorized applications"
msgstr ""
#: aleksis/core/menus.py:117
#: aleksis/core/menus.py:119
msgid "Admin"
msgstr ""
#: aleksis/core/menus.py:125 aleksis/core/models.py:687
#: aleksis/core/menus.py:127 aleksis/core/models.py:687
#: aleksis/core/templates/core/announcement/list.html:7
#: aleksis/core/templates/core/announcement/list.html:8
msgid "Announcements"
msgstr ""
#: aleksis/core/menus.py:136 aleksis/core/models.py:117
#: aleksis/core/menus.py:138 aleksis/core/models.py:117
#: aleksis/core/templates/core/school_term/list.html:8
#: aleksis/core/templates/core/school_term/list.html:9
msgid "School terms"
msgstr ""
#: aleksis/core/menus.py:147
#: aleksis/core/menus.py:149
#: aleksis/core/templates/core/dashboard_widget/list.html:8
#: aleksis/core/templates/core/dashboard_widget/list.html:9
msgid "Dashboard widgets"
msgstr ""
#: aleksis/core/menus.py:158
#: aleksis/core/menus.py:160
#: aleksis/core/templates/core/management/data_management.html:6
#: aleksis/core/templates/core/management/data_management.html:7
msgid "Data management"
msgstr ""
#: aleksis/core/menus.py:169
#: aleksis/core/menus.py:171
#: aleksis/core/templates/core/pages/system_status.html:5
#: aleksis/core/templates/core/pages/system_status.html:7
msgid "System status"
msgstr ""
#: aleksis/core/menus.py:180
#: aleksis/core/menus.py:182
msgid "Impersonation"
msgstr ""
#: aleksis/core/menus.py:191
#: aleksis/core/menus.py:193
msgid "Configuration"
msgstr ""
#: aleksis/core/menus.py:202 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/templates/core/data_check/list.html:10
msgid "Data checks"
msgstr ""
#: aleksis/core/menus.py:208
#: aleksis/core/menus.py:210
msgid "Backend Admin"
msgstr ""
#: aleksis/core/menus.py:214
#: aleksis/core/menus.py:216
#: aleksis/core/templates/oauth2_provider/application_detail.html:5
#: aleksis/core/templates/oauth2_provider/application_list.html:5
msgid "OAuth2 Applications"
msgstr ""
#: aleksis/core/menus.py:227
#: aleksis/core/menus.py:229
msgid "People"
msgstr ""
#: aleksis/core/menus.py:258 aleksis/core/models.py:941
#: aleksis/core/menus.py:260 aleksis/core/models.py:941
#: aleksis/core/templates/core/group_type/list.html:8
#: aleksis/core/templates/core/group_type/list.html:9
#, fuzzy
......@@ -355,21 +379,21 @@ msgstr ""
msgid "Group types"
msgstr "Groupe"
#: aleksis/core/menus.py:269
#: aleksis/core/menus.py:271
msgid "Persons and accounts"
msgstr ""
#: aleksis/core/menus.py:280
#: aleksis/core/menus.py:282
msgid "Groups and child groups"
msgstr ""
#: aleksis/core/menus.py:291 aleksis/core/models.py:429
#: aleksis/core/menus.py:293 aleksis/core/models.py:429
#: aleksis/core/templates/core/additional_field/list.html:8
#: aleksis/core/templates/core/additional_field/list.html:9
msgid "Additional fields"
msgstr ""
#: aleksis/core/menus.py:306
#: aleksis/core/menus.py:308
#: aleksis/core/templates/core/group/child_groups.html:7
#: aleksis/core/templates/core/group/child_groups.html:9
msgid "Assign child groups to groups"
......@@ -578,7 +602,7 @@ msgstr ""
#: aleksis/core/models.py:380
msgid "Group"
msgstr "Groupe"
msgstr "groupe"
#: aleksis/core/models.py:383
msgid "Can assign child groups to groups"
......@@ -904,48 +928,74 @@ msgstr ""
msgid "Can solve data check problems"
msgstr ""
#: aleksis/core/models.py:1040
#: aleksis/core/models.py:1044
#, fuzzy
#| msgid "Owners"
msgid "Owner"
msgstr "Propriétaires"
#: aleksis/core/models.py:1043
#: aleksis/core/models.py:1048
msgid "File expires at"
msgstr ""
#: aleksis/core/models.py:1045
#: aleksis/core/models.py:1050
msgid "Generated HTML file"
msgstr ""
#: aleksis/core/models.py:1047
#: aleksis/core/models.py:1052
msgid "Generated PDF file"
msgstr ""
#: aleksis/core/models.py:1054
#: aleksis/core/models.py:1059
msgid "PDF file"
msgstr ""
#: aleksis/core/models.py:1055
#: aleksis/core/models.py:1060
msgid "PDF files"
msgstr ""
#: aleksis/core/models.py:1060
#: aleksis/core/models.py:1065
msgid "Task result"
msgstr ""
#: aleksis/core/models.py:1063
#: aleksis/core/models.py:1068
msgid "Task user"
msgstr ""
#: aleksis/core/models.py:1075
#: aleksis/core/models.py:1080
msgid "Task user assignment"
msgstr ""
#: aleksis/core/models.py:1076
#: aleksis/core/models.py:1081
msgid "Task user assignments"
msgstr ""
#: aleksis/core/preferences.py:22
msgid "General"
msgstr ""
#: aleksis/core/preferences.py:23
msgid "School"
msgstr ""
#: aleksis/core/preferences.py:24
msgid "Theme"
msgstr ""
#: aleksis/core/preferences.py:25
msgid "Mail"
msgstr ""
#: aleksis/core/preferences.py:27
msgid "Footer"
msgstr ""
#: aleksis/core/preferences.py:28
#, fuzzy
#| msgid "Contact details"
msgid "Accounts"
msgstr "Détails de contact"
#: aleksis/core/preferences.py:29
msgid "Authentication"
msgstr ""
......@@ -1090,11 +1140,19 @@ msgstr ""
msgid "in minutes"
msgstr ""
#: aleksis/core/settings.py:470
#: aleksis/core/preferences.py:398
msgid "Automatically update the dashboard and its widgets"
msgstr ""
#: aleksis/core/preferences.py:408
msgid "Automatically update the dashboard and its widgets sitewide"
msgstr ""
#: aleksis/core/settings.py:468
msgid "English"
msgstr ""
#: aleksis/core/settings.py:471
#: aleksis/core/settings.py:469
msgid "German"
msgstr ""
......@@ -1435,23 +1493,23 @@ msgstr ""
msgid "There are no announcements."
msgstr ""
#: aleksis/core/templates/core/base.html:55
#: aleksis/core/templates/core/base.html:60
msgid "Logged in as"
msgstr ""
#: aleksis/core/templates/core/base.html:148
#: aleksis/core/templates/core/base.html:154
msgid "About AlekSIS — The Free School Information System"
msgstr ""
#: aleksis/core/templates/core/base.html:156
#: aleksis/core/templates/core/base.html:162
msgid "Impress"
msgstr ""
#: aleksis/core/templates/core/base.html:164
#: aleksis/core/templates/core/base.html:170
msgid "Privacy Policy"
msgstr ""
#: aleksis/core/templates/core/base_print.html:67
#: aleksis/core/templates/core/base_print.html:72
msgid "Powered by AlekSIS"
msgstr ""
......@@ -1735,7 +1793,7 @@ msgstr "Groupe"
msgid "Home"
msgstr ""
#: aleksis/core/templates/core/index.html:51
#: aleksis/core/templates/core/index.html:49
msgid ""
"\n"
" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n"
......@@ -1743,24 +1801,24 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/index.html:61
#: aleksis/core/templates/core/index.html:59
msgid "Last activities"
msgstr ""
#: aleksis/core/templates/core/index.html:79
#: aleksis/core/templates/core/index.html:77
msgid "No activities available yet."
msgstr ""
#: aleksis/core/templates/core/index.html:84
#: aleksis/core/templates/core/index.html:82
msgid "Recent notifications"
msgstr ""
#: aleksis/core/templates/core/index.html:100
#: aleksis/core/templates/core/index.html:98
#: aleksis/core/templates/core/notifications.html:23
msgid "More information →"
msgstr ""
#: aleksis/core/templates/core/index.html:107
#: aleksis/core/templates/core/index.html:105
#: aleksis/core/templates/core/notifications.html:30
msgid "No notifications available yet."
msgstr ""
......@@ -1949,8 +2007,8 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:9
#: aleksis/core/templates/core/partials/announcements.html:36
#: aleksis/core/templates/core/partials/announcements.html:8
#: aleksis/core/templates/core/partials/announcements.html:35
#, python-format
msgid ""
"\n"
......@@ -1958,7 +2016,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:13
#: aleksis/core/templates/core/partials/announcements.html:12
#, python-format
msgid ""
"\n"
......@@ -1966,7 +2024,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:40
#: aleksis/core/templates/core/partials/announcements.html:39
#, python-format
msgid ""
"\n"
......@@ -2758,127 +2816,127 @@ msgstr ""
msgid "SMS"
msgstr ""
#: aleksis/core/util/pdf.py:89
#: aleksis/core/util/pdf.py:105
msgid "Progress: Generate PDF file"
msgstr ""
#: aleksis/core/util/pdf.py:90
#: aleksis/core/util/pdf.py:106
msgid "Generating PDF file …"
msgstr ""
#: aleksis/core/util/pdf.py:91
#: aleksis/core/util/pdf.py:107
msgid "The PDF file has been generated successfully."
msgstr ""
#: aleksis/core/util/pdf.py:92
#: aleksis/core/util/pdf.py:108
msgid "There was a problem while generating the PDF file."
msgstr ""
#: aleksis/core/util/pdf.py:95
#: aleksis/core/util/pdf.py:111
msgid "Download PDF"
msgstr ""
#: aleksis/core/views.py:249
#: aleksis/core/views.py:253
msgid "The school term has been created."
msgstr ""
#: aleksis/core/views.py:261
#: aleksis/core/views.py:265
msgid "The school term has been saved."
msgstr ""
#: aleksis/core/views.py:406
#: aleksis/core/views.py:410
msgid "The child groups were successfully saved."
msgstr ""
#: aleksis/core/views.py:467
#: aleksis/core/views.py:471
msgid "The person has been saved."
msgstr ""
#: aleksis/core/views.py:506
#: aleksis/core/views.py:510
msgid "The group has been saved."
msgstr ""
#: aleksis/core/views.py:603
#: aleksis/core/views.py:607
msgid "The announcement has been saved."
msgstr ""
#: aleksis/core/views.py:619
#: aleksis/core/views.py:623
msgid "The announcement has been deleted."
msgstr ""
#: aleksis/core/views.py:703
#: aleksis/core/views.py:707
msgid "The preferences have been saved successfully."
msgstr ""
#: aleksis/core/views.py:727
#: aleksis/core/views.py:731
msgid "The person has been deleted."
msgstr ""
#: aleksis/core/views.py:741
#: aleksis/core/views.py:745
msgid "The group has been deleted."
msgstr ""
#: aleksis/core/views.py:773
#: aleksis/core/views.py:777
msgid "The additional_field has been saved."
msgstr ""
#: aleksis/core/views.py:807
#: aleksis/core/views.py:811
msgid "The additional field has been deleted."
msgstr ""
#: aleksis/core/views.py:832
#: aleksis/core/views.py:836
msgid "The group type has been saved."
msgstr ""
#: aleksis/core/views.py:862
#: aleksis/core/views.py:866
msgid "The group type has been deleted."
msgstr ""
#: aleksis/core/views.py:895
#: aleksis/core/views.py:899
msgid "Progress: Run data checks"
msgstr ""
#: aleksis/core/views.py:896
#: aleksis/core/views.py:900
msgid "Run data checks …"
msgstr ""
#: aleksis/core/views.py:897
#: aleksis/core/views.py:901
msgid "The data checks were run successfully."
msgstr ""
#: aleksis/core/views.py:898
#: aleksis/core/views.py:902
msgid "There was a problem while running data checks."
msgstr ""
#: aleksis/core/views.py:914
#: aleksis/core/views.py:918
#, python-brace-format
msgid "The solve option '{solve_option_obj.verbose_name}' "
msgstr ""
#: aleksis/core/views.py:956
#: aleksis/core/views.py:960
msgid "The dashboard widget has been saved."
msgstr ""
#: aleksis/core/views.py:986
#: aleksis/core/views.py:990
msgid "The dashboard widget has been created."
msgstr ""
#: aleksis/core/views.py:996
#: aleksis/core/views.py:1000
msgid "The dashboard widget has been deleted."
msgstr ""
#: aleksis/core/views.py:1063
#: aleksis/core/views.py:1067
msgid "Your dashboard configuration has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1065
#: aleksis/core/views.py:1069
msgid "The configuration of the default dashboard has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1191
#: aleksis/core/views.py:1197
msgid "The third-party account could not be disconnected because it is the only login method available."
msgstr ""
#: aleksis/core/views.py:1198
#: aleksis/core/views.py:1204
msgid "The third-party account has been successfully disconnected."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -30,6 +30,6 @@ msgstr ""
msgid "OK"
msgstr ""
#: aleksis/core/static/js/main.js:133
#: aleksis/core/static/js/main.js:127
msgid "This page may contain outdated information since there is no internet connection."
msgstr ""
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -18,6 +18,32 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
msgid "OpenID Connect scope"
msgstr ""
#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
msgid "Given name, family name, link to profile and picture if existing."
msgstr ""
#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
#, fuzzy
#| msgid "E-mail address"
msgid "Full home postal address"
msgstr "Inscriptio electronica"
#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
#, fuzzy
#| msgid "E-mail address"
msgid "Email address"
msgstr "Inscriptio electronica"
#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
#, fuzzy
#| msgid "Mobile phone"
msgid "Home and mobile phone"
msgstr "Numerus telephoni mobilis"
#: aleksis/core/data_checks.py:55
msgid "Ignore problem"
msgstr ""
......@@ -41,7 +67,8 @@ msgstr ""
msgid "The DashboardWidget was reported broken automatically."
msgstr ""
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:78
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
#: aleksis/core/templates/core/base.html:84
#: aleksis/core/templates/core/group/list.html:20
#: aleksis/core/templates/core/person/list.html:24
#: aleksis/core/templates/search/search.html:7
......@@ -106,7 +133,7 @@ msgid "Common data"
msgstr "Adminstratio datarum"
#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
#: aleksis/core/menus.py:236 aleksis/core/models.py:139
#: aleksis/core/menus.py:238 aleksis/core/models.py:139
#: aleksis/core/templates/core/person/list.html:8
#: aleksis/core/templates/core/person/list.html:9
msgid "Persons"
......@@ -128,7 +155,7 @@ msgstr "dies"
msgid "Time"
msgstr "tempus"
#: aleksis/core/forms.py:234 aleksis/core/menus.py:247
#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
#: aleksis/core/templates/core/group/list.html:9
#: aleksis/core/templates/core/person/full.html:144
......@@ -233,29 +260,30 @@ msgstr ""
msgid "Dashboard"
msgstr "Forum"
#: aleksis/core/menus.py:30 aleksis/core/models.py:588
#: aleksis/core/menus.py:32 aleksis/core/models.py:588
#: aleksis/core/preferences.py:26
#: aleksis/core/templates/core/notifications.html:4
#: aleksis/core/templates/core/notifications.html:5
msgid "Notifications"
msgstr "Nuntii"
#: aleksis/core/menus.py:39
#: aleksis/core/menus.py:41
msgid "Account"
msgstr ""
#: aleksis/core/menus.py:46
#: aleksis/core/menus.py:48
msgid "Stop impersonation"
msgstr "Simulandum aliquem finire"
#: aleksis/core/menus.py:55 aleksis/core/templates/core/base.html:57
#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
msgid "Logout"
msgstr "nomen retractare"
#: aleksis/core/menus.py:61
#: aleksis/core/menus.py:63
msgid "2FA"
msgstr ""
#: aleksis/core/menus.py:67
#: aleksis/core/menus.py:69
#: aleksis/core/templates/account/password_change.html:5
#: aleksis/core/templates/account/password_change.html:6
#: aleksis/core/templates/account/password_change.html:19
......@@ -267,22 +295,22 @@ msgstr ""
msgid "Change password"
msgstr ""
#: aleksis/core/menus.py:79
#: aleksis/core/menus.py:81
msgid "Me"
msgstr ""
#: aleksis/core/menus.py:88
#: aleksis/core/menus.py:90
#: aleksis/core/templates/dynamic_preferences/form.html:5
msgid "Preferences"
msgstr ""
#: aleksis/core/menus.py:97
#: aleksis/core/menus.py:99
#, fuzzy
#| msgid "Persons and accounts"
msgid "Third-party accounts"
msgstr "Personae et computi"
#: aleksis/core/menus.py:106
#: aleksis/core/menus.py:108
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
#, fuzzy
......@@ -290,23 +318,23 @@ msgstr "Personae et computi"
msgid "Authorized applications"
msgstr "Nuntii"
#: aleksis/core/menus.py:117
#: aleksis/core/menus.py:119
msgid "Admin"
msgstr "Administratio"
#: aleksis/core/menus.py:125 aleksis/core/models.py:687
#: aleksis/core/menus.py:127 aleksis/core/models.py:687
#: aleksis/core/templates/core/announcement/list.html:7
#: aleksis/core/templates/core/announcement/list.html:8
msgid "Announcements"
msgstr "Nuntii"
#: aleksis/core/menus.py:136 aleksis/core/models.py:117
#: aleksis/core/menus.py:138 aleksis/core/models.py:117
#: aleksis/core/templates/core/school_term/list.html:8
#: aleksis/core/templates/core/school_term/list.html:9
msgid "School terms"
msgstr "ani scolae"
#: aleksis/core/menus.py:147
#: aleksis/core/menus.py:149
#: aleksis/core/templates/core/dashboard_widget/list.html:8
#: aleksis/core/templates/core/dashboard_widget/list.html:9
#, fuzzy
......@@ -314,40 +342,40 @@ msgstr "ani scolae"
msgid "Dashboard widgets"
msgstr "Forum"
#: aleksis/core/menus.py:158
#: aleksis/core/menus.py:160
#: aleksis/core/templates/core/management/data_management.html:6
#: aleksis/core/templates/core/management/data_management.html:7
msgid "Data management"
msgstr "Adminstratio datarum"
#: aleksis/core/menus.py:169
#: aleksis/core/menus.py:171
#: aleksis/core/templates/core/pages/system_status.html:5
#: aleksis/core/templates/core/pages/system_status.html:7
msgid "System status"
msgstr "Status systemae"
#: aleksis/core/menus.py:180
#: aleksis/core/menus.py:182
msgid "Impersonation"
msgstr "Simulare aliquem"
#: aleksis/core/menus.py:191
#: aleksis/core/menus.py:193
#, fuzzy
#| msgid "Notification"
msgid "Configuration"
msgstr "Nuntius"
#: aleksis/core/menus.py:202 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/templates/core/data_check/list.html:10
#, fuzzy
#| msgid "System status"
msgid "Data checks"
msgstr "Status systemae"
#: aleksis/core/menus.py:208
#: aleksis/core/menus.py:210
msgid "Backend Admin"
msgstr ""
#: aleksis/core/menus.py:214
#: aleksis/core/menus.py:216
#: aleksis/core/templates/oauth2_provider/application_detail.html:5
#: aleksis/core/templates/oauth2_provider/application_list.html:5
#, fuzzy
......@@ -355,11 +383,11 @@ msgstr ""
msgid "OAuth2 Applications"
msgstr "Nuntii"
#: aleksis/core/menus.py:227
#: aleksis/core/menus.py:229
msgid "People"
msgstr "Personae"
#: aleksis/core/menus.py:258 aleksis/core/models.py:941
#: aleksis/core/menus.py:260 aleksis/core/models.py:941
#: aleksis/core/templates/core/group_type/list.html:8
#: aleksis/core/templates/core/group_type/list.html:9
#, fuzzy
......@@ -367,15 +395,15 @@ msgstr "Personae"
msgid "Group types"
msgstr "Greges"
#: aleksis/core/menus.py:269
#: aleksis/core/menus.py:271
msgid "Persons and accounts"
msgstr "Personae et computi"
#: aleksis/core/menus.py:280
#: aleksis/core/menus.py:282
msgid "Groups and child groups"
msgstr ""
#: aleksis/core/menus.py:291 aleksis/core/models.py:429
#: aleksis/core/menus.py:293 aleksis/core/models.py:429
#: aleksis/core/templates/core/additional_field/list.html:8
#: aleksis/core/templates/core/additional_field/list.html:9
#, fuzzy
......@@ -383,7 +411,7 @@ msgstr ""
msgid "Additional fields"
msgstr "addita nomines"
#: aleksis/core/menus.py:306
#: aleksis/core/menus.py:308
#: aleksis/core/templates/core/group/child_groups.html:7
#: aleksis/core/templates/core/group/child_groups.html:9
msgid "Assign child groups to groups"
......@@ -954,46 +982,72 @@ msgstr ""
msgid "Can solve data check problems"
msgstr ""
#: aleksis/core/models.py:1040
#: aleksis/core/models.py:1044
msgid "Owner"
msgstr ""
#: aleksis/core/models.py:1043
#: aleksis/core/models.py:1048
msgid "File expires at"
msgstr ""
#: aleksis/core/models.py:1045
#: aleksis/core/models.py:1050
msgid "Generated HTML file"
msgstr ""
#: aleksis/core/models.py:1047
#: aleksis/core/models.py:1052
msgid "Generated PDF file"
msgstr ""
#: aleksis/core/models.py:1054
#: aleksis/core/models.py:1059
msgid "PDF file"
msgstr ""
#: aleksis/core/models.py:1055
#: aleksis/core/models.py:1060
msgid "PDF files"
msgstr ""
#: aleksis/core/models.py:1060
#: aleksis/core/models.py:1065
msgid "Task result"
msgstr ""
#: aleksis/core/models.py:1063
#: aleksis/core/models.py:1068
msgid "Task user"
msgstr ""
#: aleksis/core/models.py:1075
#: aleksis/core/models.py:1080
msgid "Task user assignment"
msgstr ""
#: aleksis/core/models.py:1076
#: aleksis/core/models.py:1081
msgid "Task user assignments"
msgstr ""
#: aleksis/core/preferences.py:22
msgid "General"
msgstr ""
#: aleksis/core/preferences.py:23
msgid "School"
msgstr "Scola"
#: aleksis/core/preferences.py:24
msgid "Theme"
msgstr ""
#: aleksis/core/preferences.py:25
msgid "Mail"
msgstr ""
#: aleksis/core/preferences.py:27
msgid "Footer"
msgstr ""
#: aleksis/core/preferences.py:28
#, fuzzy
#| msgid "Data management"
msgid "Accounts"
msgstr "Adminstratio datarum"
#: aleksis/core/preferences.py:29
#, fuzzy
#| msgid "Notifications"
......@@ -1146,11 +1200,19 @@ msgstr ""
msgid "in minutes"
msgstr ""
#: aleksis/core/settings.py:470
#: aleksis/core/preferences.py:398
msgid "Automatically update the dashboard and its widgets"
msgstr ""
#: aleksis/core/preferences.py:408
msgid "Automatically update the dashboard and its widgets sitewide"
msgstr ""
#: aleksis/core/settings.py:468
msgid "English"
msgstr "Britannicus"
#: aleksis/core/settings.py:471
#: aleksis/core/settings.py:469
msgid "German"
msgstr "Germanus"
......@@ -1511,23 +1573,23 @@ msgstr ""
msgid "There are no announcements."
msgstr "Scribe nuntium:"
#: aleksis/core/templates/core/base.html:55
#: aleksis/core/templates/core/base.html:60
msgid "Logged in as"
msgstr ""
#: aleksis/core/templates/core/base.html:148
#: aleksis/core/templates/core/base.html:154
msgid "About AlekSIS — The Free School Information System"
msgstr ""
#: aleksis/core/templates/core/base.html:156
#: aleksis/core/templates/core/base.html:162
msgid "Impress"
msgstr ""
#: aleksis/core/templates/core/base.html:164
#: aleksis/core/templates/core/base.html:170
msgid "Privacy Policy"
msgstr ""
#: aleksis/core/templates/core/base_print.html:67
#: aleksis/core/templates/core/base_print.html:72
msgid "Powered by AlekSIS"
msgstr ""
......@@ -1821,7 +1883,7 @@ msgstr "Grex"
msgid "Home"
msgstr ""
#: aleksis/core/templates/core/index.html:51
#: aleksis/core/templates/core/index.html:49
msgid ""
"\n"
" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n"
......@@ -1829,28 +1891,28 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/index.html:61
#: aleksis/core/templates/core/index.html:59
msgid "Last activities"
msgstr ""
#: aleksis/core/templates/core/index.html:79
#: aleksis/core/templates/core/index.html:77
msgid "No activities available yet."
msgstr ""
#: aleksis/core/templates/core/index.html:84
#: aleksis/core/templates/core/index.html:82
#, fuzzy
#| msgid "Notifications"
msgid "Recent notifications"
msgstr "Nuntii"
#: aleksis/core/templates/core/index.html:100
#: aleksis/core/templates/core/index.html:98
#: aleksis/core/templates/core/notifications.html:23
#, fuzzy
#| msgid "Edit school information"
msgid "More information →"
msgstr "Muta informationes scolae"
#: aleksis/core/templates/core/index.html:107
#: aleksis/core/templates/core/index.html:105
#: aleksis/core/templates/core/notifications.html:30
msgid "No notifications available yet."
msgstr ""
......@@ -2049,8 +2111,8 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:9
#: aleksis/core/templates/core/partials/announcements.html:36
#: aleksis/core/templates/core/partials/announcements.html:8
#: aleksis/core/templates/core/partials/announcements.html:35
#, python-format
msgid ""
"\n"
......@@ -2058,7 +2120,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:13
#: aleksis/core/templates/core/partials/announcements.html:12
#, python-format
msgid ""
"\n"
......@@ -2066,7 +2128,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:40
#: aleksis/core/templates/core/partials/announcements.html:39
#, python-format
msgid ""
"\n"
......@@ -2877,130 +2939,130 @@ msgstr ""
msgid "SMS"
msgstr ""
#: aleksis/core/util/pdf.py:89
#: aleksis/core/util/pdf.py:105
msgid "Progress: Generate PDF file"
msgstr ""
#: aleksis/core/util/pdf.py:90
#: aleksis/core/util/pdf.py:106
msgid "Generating PDF file …"
msgstr ""
#: aleksis/core/util/pdf.py:91
#: aleksis/core/util/pdf.py:107
msgid "The PDF file has been generated successfully."
msgstr ""
#: aleksis/core/util/pdf.py:92
#: aleksis/core/util/pdf.py:108
msgid "There was a problem while generating the PDF file."
msgstr ""
#: aleksis/core/util/pdf.py:95
#: aleksis/core/util/pdf.py:111
msgid "Download PDF"
msgstr ""
#: aleksis/core/views.py:249
#: aleksis/core/views.py:253
msgid "The school term has been created."
msgstr ""
#: aleksis/core/views.py:261
#: aleksis/core/views.py:265
msgid "The school term has been saved."
msgstr ""
#: aleksis/core/views.py:406
#: aleksis/core/views.py:410
msgid "The child groups were successfully saved."
msgstr ""
#: aleksis/core/views.py:467
#: aleksis/core/views.py:471
msgid "The person has been saved."
msgstr ""
#: aleksis/core/views.py:506
#: aleksis/core/views.py:510
msgid "The group has been saved."
msgstr ""
#: aleksis/core/views.py:603
#: aleksis/core/views.py:607
msgid "The announcement has been saved."
msgstr ""
#: aleksis/core/views.py:619
#: aleksis/core/views.py:623
msgid "The announcement has been deleted."
msgstr ""
#: aleksis/core/views.py:703
#: aleksis/core/views.py:707
msgid "The preferences have been saved successfully."
msgstr ""
#: aleksis/core/views.py:727
#: aleksis/core/views.py:731
msgid "The person has been deleted."
msgstr ""
#: aleksis/core/views.py:741
#: aleksis/core/views.py:745
msgid "The group has been deleted."
msgstr ""
#: aleksis/core/views.py:773
#: aleksis/core/views.py:777
msgid "The additional_field has been saved."
msgstr ""
#: aleksis/core/views.py:807
#: aleksis/core/views.py:811
msgid "The additional field has been deleted."
msgstr ""
#: aleksis/core/views.py:832
#: aleksis/core/views.py:836
msgid "The group type has been saved."
msgstr ""
#: aleksis/core/views.py:862
#: aleksis/core/views.py:866
msgid "The group type has been deleted."
msgstr ""
#: aleksis/core/views.py:895
#: aleksis/core/views.py:899
msgid "Progress: Run data checks"
msgstr ""
#: aleksis/core/views.py:896
#: aleksis/core/views.py:900
#, fuzzy
#| msgid "System status"
msgid "Run data checks …"
msgstr "Status systemae"
#: aleksis/core/views.py:897
#: aleksis/core/views.py:901
msgid "The data checks were run successfully."
msgstr ""
#: aleksis/core/views.py:898
#: aleksis/core/views.py:902
msgid "There was a problem while running data checks."
msgstr ""
#: aleksis/core/views.py:914
#: aleksis/core/views.py:918
#, python-brace-format
msgid "The solve option '{solve_option_obj.verbose_name}' "
msgstr ""
#: aleksis/core/views.py:956
#: aleksis/core/views.py:960
msgid "The dashboard widget has been saved."
msgstr ""
#: aleksis/core/views.py:986
#: aleksis/core/views.py:990
msgid "The dashboard widget has been created."
msgstr ""
#: aleksis/core/views.py:996
#: aleksis/core/views.py:1000
msgid "The dashboard widget has been deleted."
msgstr ""
#: aleksis/core/views.py:1063
#: aleksis/core/views.py:1067
msgid "Your dashboard configuration has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1065
#: aleksis/core/views.py:1069
msgid "The configuration of the default dashboard has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1191
#: aleksis/core/views.py:1197
msgid "The third-party account could not be disconnected because it is the only login method available."
msgstr ""
#: aleksis/core/views.py:1198
#: aleksis/core/views.py:1204
msgid "The third-party account has been successfully disconnected."
msgstr ""
......@@ -3013,8 +3075,5 @@ msgstr ""
#~ msgid "Official name"
#~ msgstr "Officialis nomen"
#~ msgid "School"
#~ msgstr "Scola"
#~ msgid "Schools"
#~ msgstr "Scholae"
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -29,6 +29,6 @@ msgstr ""
msgid "OK"
msgstr ""
#: aleksis/core/static/js/main.js:133
#: aleksis/core/static/js/main.js:127
msgid "This page may contain outdated information since there is no internet connection."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: AlekSIS (School Information System) 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -17,6 +17,26 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
msgid "OpenID Connect scope"
msgstr ""
#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
msgid "Given name, family name, link to profile and picture if existing."
msgstr ""
#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
msgid "Full home postal address"
msgstr ""
#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
msgid "Email address"
msgstr ""
#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
msgid "Home and mobile phone"
msgstr ""
#: aleksis/core/data_checks.py:55
msgid "Ignore problem"
msgstr ""
......@@ -38,7 +58,8 @@ msgstr ""
msgid "The DashboardWidget was reported broken automatically."
msgstr ""
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:78
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
#: aleksis/core/templates/core/base.html:84
#: aleksis/core/templates/core/group/list.html:20
#: aleksis/core/templates/core/person/list.html:24
#: aleksis/core/templates/search/search.html:7
......@@ -95,7 +116,7 @@ msgid "Common data"
msgstr ""
#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
#: aleksis/core/menus.py:236 aleksis/core/models.py:139
#: aleksis/core/menus.py:238 aleksis/core/models.py:139
#: aleksis/core/templates/core/person/list.html:8
#: aleksis/core/templates/core/person/list.html:9
msgid "Persons"
......@@ -115,7 +136,7 @@ msgstr ""
msgid "Time"
msgstr ""
#: aleksis/core/forms.py:234 aleksis/core/menus.py:247
#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
#: aleksis/core/templates/core/group/list.html:9
#: aleksis/core/templates/core/person/full.html:144
......@@ -216,29 +237,30 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: aleksis/core/menus.py:30 aleksis/core/models.py:588
#: aleksis/core/menus.py:32 aleksis/core/models.py:588
#: aleksis/core/preferences.py:26
#: aleksis/core/templates/core/notifications.html:4
#: aleksis/core/templates/core/notifications.html:5
msgid "Notifications"
msgstr ""
#: aleksis/core/menus.py:39
#: aleksis/core/menus.py:41
msgid "Account"
msgstr ""
#: aleksis/core/menus.py:46
#: aleksis/core/menus.py:48
msgid "Stop impersonation"
msgstr ""
#: aleksis/core/menus.py:55 aleksis/core/templates/core/base.html:57
#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
msgid "Logout"
msgstr ""
#: aleksis/core/menus.py:61
#: aleksis/core/menus.py:63
msgid "2FA"
msgstr ""
#: aleksis/core/menus.py:67
#: aleksis/core/menus.py:69
#: aleksis/core/templates/account/password_change.html:5
#: aleksis/core/templates/account/password_change.html:6
#: aleksis/core/templates/account/password_change.html:19
......@@ -250,107 +272,107 @@ msgstr ""
msgid "Change password"
msgstr ""
#: aleksis/core/menus.py:79
#: aleksis/core/menus.py:81
msgid "Me"
msgstr ""
#: aleksis/core/menus.py:88
#: aleksis/core/menus.py:90
#: aleksis/core/templates/dynamic_preferences/form.html:5
msgid "Preferences"
msgstr ""
#: aleksis/core/menus.py:97
#: aleksis/core/menus.py:99
msgid "Third-party accounts"
msgstr ""
#: aleksis/core/menus.py:106
#: aleksis/core/menus.py:108
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
msgid "Authorized applications"
msgstr ""
#: aleksis/core/menus.py:117
#: aleksis/core/menus.py:119
msgid "Admin"
msgstr ""
#: aleksis/core/menus.py:125 aleksis/core/models.py:687
#: aleksis/core/menus.py:127 aleksis/core/models.py:687
#: aleksis/core/templates/core/announcement/list.html:7
#: aleksis/core/templates/core/announcement/list.html:8
msgid "Announcements"
msgstr ""
#: aleksis/core/menus.py:136 aleksis/core/models.py:117
#: aleksis/core/menus.py:138 aleksis/core/models.py:117
#: aleksis/core/templates/core/school_term/list.html:8
#: aleksis/core/templates/core/school_term/list.html:9
msgid "School terms"
msgstr ""
#: aleksis/core/menus.py:147
#: aleksis/core/menus.py:149
#: aleksis/core/templates/core/dashboard_widget/list.html:8
#: aleksis/core/templates/core/dashboard_widget/list.html:9
msgid "Dashboard widgets"
msgstr ""
#: aleksis/core/menus.py:158
#: aleksis/core/menus.py:160
#: aleksis/core/templates/core/management/data_management.html:6
#: aleksis/core/templates/core/management/data_management.html:7
msgid "Data management"
msgstr ""
#: aleksis/core/menus.py:169
#: aleksis/core/menus.py:171
#: aleksis/core/templates/core/pages/system_status.html:5
#: aleksis/core/templates/core/pages/system_status.html:7
msgid "System status"
msgstr ""
#: aleksis/core/menus.py:180
#: aleksis/core/menus.py:182
msgid "Impersonation"
msgstr ""
#: aleksis/core/menus.py:191
#: aleksis/core/menus.py:193
msgid "Configuration"
msgstr ""
#: aleksis/core/menus.py:202 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/templates/core/data_check/list.html:10
msgid "Data checks"
msgstr ""
#: aleksis/core/menus.py:208
#: aleksis/core/menus.py:210
msgid "Backend Admin"
msgstr ""
#: aleksis/core/menus.py:214
#: aleksis/core/menus.py:216
#: aleksis/core/templates/oauth2_provider/application_detail.html:5
#: aleksis/core/templates/oauth2_provider/application_list.html:5
msgid "OAuth2 Applications"
msgstr ""
#: aleksis/core/menus.py:227
#: aleksis/core/menus.py:229
msgid "People"
msgstr ""
#: aleksis/core/menus.py:258 aleksis/core/models.py:941
#: aleksis/core/menus.py:260 aleksis/core/models.py:941
#: aleksis/core/templates/core/group_type/list.html:8
#: aleksis/core/templates/core/group_type/list.html:9
msgid "Group types"
msgstr ""
#: aleksis/core/menus.py:269
#: aleksis/core/menus.py:271
msgid "Persons and accounts"
msgstr ""
#: aleksis/core/menus.py:280
#: aleksis/core/menus.py:282
msgid "Groups and child groups"
msgstr ""
#: aleksis/core/menus.py:291 aleksis/core/models.py:429
#: aleksis/core/menus.py:293 aleksis/core/models.py:429
#: aleksis/core/templates/core/additional_field/list.html:8
#: aleksis/core/templates/core/additional_field/list.html:9
msgid "Additional fields"
msgstr ""
#: aleksis/core/menus.py:306
#: aleksis/core/menus.py:308
#: aleksis/core/templates/core/group/child_groups.html:7
#: aleksis/core/templates/core/group/child_groups.html:9
msgid "Assign child groups to groups"
......@@ -857,46 +879,70 @@ msgstr ""
msgid "Can solve data check problems"
msgstr ""
#: aleksis/core/models.py:1040
#: aleksis/core/models.py:1044
msgid "Owner"
msgstr ""
#: aleksis/core/models.py:1043
#: aleksis/core/models.py:1048
msgid "File expires at"
msgstr ""
#: aleksis/core/models.py:1045
#: aleksis/core/models.py:1050
msgid "Generated HTML file"
msgstr ""
#: aleksis/core/models.py:1047
#: aleksis/core/models.py:1052
msgid "Generated PDF file"
msgstr ""
#: aleksis/core/models.py:1054
#: aleksis/core/models.py:1059
msgid "PDF file"
msgstr ""
#: aleksis/core/models.py:1055
#: aleksis/core/models.py:1060
msgid "PDF files"
msgstr ""
#: aleksis/core/models.py:1060
#: aleksis/core/models.py:1065
msgid "Task result"
msgstr ""
#: aleksis/core/models.py:1063
#: aleksis/core/models.py:1068
msgid "Task user"
msgstr ""
#: aleksis/core/models.py:1075
#: aleksis/core/models.py:1080
msgid "Task user assignment"
msgstr ""
#: aleksis/core/models.py:1076
#: aleksis/core/models.py:1081
msgid "Task user assignments"
msgstr ""
#: aleksis/core/preferences.py:22
msgid "General"
msgstr ""
#: aleksis/core/preferences.py:23
msgid "School"
msgstr ""
#: aleksis/core/preferences.py:24
msgid "Theme"
msgstr ""
#: aleksis/core/preferences.py:25
msgid "Mail"
msgstr ""
#: aleksis/core/preferences.py:27
msgid "Footer"
msgstr ""
#: aleksis/core/preferences.py:28
msgid "Accounts"
msgstr ""
#: aleksis/core/preferences.py:29
msgid "Authentication"
msgstr ""
......@@ -1037,11 +1083,19 @@ msgstr ""
msgid "in minutes"
msgstr ""
#: aleksis/core/settings.py:470
#: aleksis/core/preferences.py:398
msgid "Automatically update the dashboard and its widgets"
msgstr ""
#: aleksis/core/preferences.py:408
msgid "Automatically update the dashboard and its widgets sitewide"
msgstr ""
#: aleksis/core/settings.py:468
msgid "English"
msgstr ""
#: aleksis/core/settings.py:471
#: aleksis/core/settings.py:469
msgid "German"
msgstr ""
......@@ -1382,23 +1436,23 @@ msgstr ""
msgid "There are no announcements."
msgstr ""
#: aleksis/core/templates/core/base.html:55
#: aleksis/core/templates/core/base.html:60
msgid "Logged in as"
msgstr ""
#: aleksis/core/templates/core/base.html:148
#: aleksis/core/templates/core/base.html:154
msgid "About AlekSIS — The Free School Information System"
msgstr ""
#: aleksis/core/templates/core/base.html:156
#: aleksis/core/templates/core/base.html:162
msgid "Impress"
msgstr ""
#: aleksis/core/templates/core/base.html:164
#: aleksis/core/templates/core/base.html:170
msgid "Privacy Policy"
msgstr ""
#: aleksis/core/templates/core/base_print.html:67
#: aleksis/core/templates/core/base_print.html:72
msgid "Powered by AlekSIS"
msgstr ""
......@@ -1672,7 +1726,7 @@ msgstr ""
msgid "Home"
msgstr ""
#: aleksis/core/templates/core/index.html:51
#: aleksis/core/templates/core/index.html:49
msgid ""
"\n"
" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n"
......@@ -1680,24 +1734,24 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/index.html:61
#: aleksis/core/templates/core/index.html:59
msgid "Last activities"
msgstr ""
#: aleksis/core/templates/core/index.html:79
#: aleksis/core/templates/core/index.html:77
msgid "No activities available yet."
msgstr ""
#: aleksis/core/templates/core/index.html:84
#: aleksis/core/templates/core/index.html:82
msgid "Recent notifications"
msgstr ""
#: aleksis/core/templates/core/index.html:100
#: aleksis/core/templates/core/index.html:98
#: aleksis/core/templates/core/notifications.html:23
msgid "More information →"
msgstr ""
#: aleksis/core/templates/core/index.html:107
#: aleksis/core/templates/core/index.html:105
#: aleksis/core/templates/core/notifications.html:30
msgid "No notifications available yet."
msgstr ""
......@@ -1884,8 +1938,8 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:9
#: aleksis/core/templates/core/partials/announcements.html:36
#: aleksis/core/templates/core/partials/announcements.html:8
#: aleksis/core/templates/core/partials/announcements.html:35
#, python-format
msgid ""
"\n"
......@@ -1893,7 +1947,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:13
#: aleksis/core/templates/core/partials/announcements.html:12
#, python-format
msgid ""
"\n"
......@@ -1901,7 +1955,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:40
#: aleksis/core/templates/core/partials/announcements.html:39
#, python-format
msgid ""
"\n"
......@@ -2685,128 +2739,128 @@ msgstr ""
msgid "SMS"
msgstr ""
#: aleksis/core/util/pdf.py:89
#: aleksis/core/util/pdf.py:105
msgid "Progress: Generate PDF file"
msgstr ""
#: aleksis/core/util/pdf.py:90
#: aleksis/core/util/pdf.py:106
msgid "Generating PDF file …"
msgstr ""
#: aleksis/core/util/pdf.py:91
#: aleksis/core/util/pdf.py:107
msgid "The PDF file has been generated successfully."
msgstr ""
#: aleksis/core/util/pdf.py:92
#: aleksis/core/util/pdf.py:108
msgid "There was a problem while generating the PDF file."
msgstr ""
#: aleksis/core/util/pdf.py:95
#: aleksis/core/util/pdf.py:111
msgid "Download PDF"
msgstr ""
#: aleksis/core/views.py:249
#: aleksis/core/views.py:253
msgid "The school term has been created."
msgstr ""
#: aleksis/core/views.py:261
#: aleksis/core/views.py:265
msgid "The school term has been saved."
msgstr ""
#: aleksis/core/views.py:406
#: aleksis/core/views.py:410
msgid "The child groups were successfully saved."
msgstr ""
#: aleksis/core/views.py:467
#: aleksis/core/views.py:471
msgid "The person has been saved."
msgstr ""
#: aleksis/core/views.py:506
#: aleksis/core/views.py:510
msgid "The group has been saved."
msgstr ""
#: aleksis/core/views.py:603
#: aleksis/core/views.py:607
msgid "The announcement has been saved."
msgstr ""
#: aleksis/core/views.py:619
#: aleksis/core/views.py:623
msgid "The announcement has been deleted."
msgstr ""
#: aleksis/core/views.py:703
#: aleksis/core/views.py:707
msgid "The preferences have been saved successfully."
msgstr ""
#: aleksis/core/views.py:727
#: aleksis/core/views.py:731
msgid "The person has been deleted."
msgstr ""
#: aleksis/core/views.py:741
#: aleksis/core/views.py:745
msgid "The group has been deleted."
msgstr ""
#: aleksis/core/views.py:773
#: aleksis/core/views.py:777
msgid "The additional_field has been saved."
msgstr ""
#: aleksis/core/views.py:807
#: aleksis/core/views.py:811
msgid "The additional field has been deleted."
msgstr ""
#: aleksis/core/views.py:832
#: aleksis/core/views.py:836
msgid "The group type has been saved."
msgstr ""
#: aleksis/core/views.py:862
#: aleksis/core/views.py:866
msgid "The group type has been deleted."
msgstr ""
#: aleksis/core/views.py:895
#: aleksis/core/views.py:899
msgid "Progress: Run data checks"
msgstr ""
#: aleksis/core/views.py:896
#: aleksis/core/views.py:900
msgid "Run data checks …"
msgstr ""
#: aleksis/core/views.py:897
#: aleksis/core/views.py:901
msgid "The data checks were run successfully."
msgstr ""
#: aleksis/core/views.py:898
#: aleksis/core/views.py:902
msgid "There was a problem while running data checks."
msgstr ""
#: aleksis/core/views.py:914
#: aleksis/core/views.py:918
#, python-brace-format
msgid "The solve option '{solve_option_obj.verbose_name}' "
msgstr ""
#: aleksis/core/views.py:956
#: aleksis/core/views.py:960
msgid "The dashboard widget has been saved."
msgstr ""
#: aleksis/core/views.py:986
#: aleksis/core/views.py:990
msgid "The dashboard widget has been created."
msgstr ""
#: aleksis/core/views.py:996
#: aleksis/core/views.py:1000
msgid "The dashboard widget has been deleted."
msgstr ""
#: aleksis/core/views.py:1063
#: aleksis/core/views.py:1067
msgid "Your dashboard configuration has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1065
#: aleksis/core/views.py:1069
msgid "The configuration of the default dashboard has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1191
#: aleksis/core/views.py:1197
msgid "The third-party account could not be disconnected because it is the only login method available."
msgstr ""
#: aleksis/core/views.py:1198
#: aleksis/core/views.py:1204
msgid "The third-party account has been successfully disconnected."
msgstr ""
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -29,6 +29,6 @@ msgstr ""
msgid "OK"
msgstr ""
#: aleksis/core/static/js/main.js:133
#: aleksis/core/static/js/main.js:127
msgid "This page may contain outdated information since there is no internet connection."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: AlekSIS (School Information System) 0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -17,6 +17,26 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: aleksis/core/apps.py:148 aleksis/core/settings.py:343
msgid "OpenID Connect scope"
msgstr ""
#: aleksis/core/apps.py:149 aleksis/core/settings.py:344
msgid "Given name, family name, link to profile and picture if existing."
msgstr ""
#: aleksis/core/apps.py:150 aleksis/core/settings.py:345
msgid "Full home postal address"
msgstr ""
#: aleksis/core/apps.py:151 aleksis/core/settings.py:346
msgid "Email address"
msgstr ""
#: aleksis/core/apps.py:152 aleksis/core/settings.py:347
msgid "Home and mobile phone"
msgstr ""
#: aleksis/core/data_checks.py:55
msgid "Ignore problem"
msgstr ""
......@@ -38,7 +58,8 @@ msgstr ""
msgid "The DashboardWidget was reported broken automatically."
msgstr ""
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:78
#: aleksis/core/filters.py:37 aleksis/core/templates/core/base.html:83
#: aleksis/core/templates/core/base.html:84
#: aleksis/core/templates/core/group/list.html:20
#: aleksis/core/templates/core/person/list.html:24
#: aleksis/core/templates/search/search.html:7
......@@ -95,7 +116,7 @@ msgid "Common data"
msgstr ""
#: aleksis/core/forms.py:172 aleksis/core/forms.py:221
#: aleksis/core/menus.py:236 aleksis/core/models.py:139
#: aleksis/core/menus.py:238 aleksis/core/models.py:139
#: aleksis/core/templates/core/person/list.html:8
#: aleksis/core/templates/core/person/list.html:9
msgid "Persons"
......@@ -115,7 +136,7 @@ msgstr ""
msgid "Time"
msgstr ""
#: aleksis/core/forms.py:234 aleksis/core/menus.py:247
#: aleksis/core/forms.py:234 aleksis/core/menus.py:249
#: aleksis/core/models.py:381 aleksis/core/templates/core/group/list.html:8
#: aleksis/core/templates/core/group/list.html:9
#: aleksis/core/templates/core/person/full.html:144
......@@ -216,29 +237,30 @@ msgstr ""
msgid "Dashboard"
msgstr ""
#: aleksis/core/menus.py:30 aleksis/core/models.py:588
#: aleksis/core/menus.py:32 aleksis/core/models.py:588
#: aleksis/core/preferences.py:26
#: aleksis/core/templates/core/notifications.html:4
#: aleksis/core/templates/core/notifications.html:5
msgid "Notifications"
msgstr ""
#: aleksis/core/menus.py:39
#: aleksis/core/menus.py:41
msgid "Account"
msgstr ""
#: aleksis/core/menus.py:46
#: aleksis/core/menus.py:48
msgid "Stop impersonation"
msgstr ""
#: aleksis/core/menus.py:55 aleksis/core/templates/core/base.html:57
#: aleksis/core/menus.py:57 aleksis/core/templates/core/base.html:62
msgid "Logout"
msgstr ""
#: aleksis/core/menus.py:61
#: aleksis/core/menus.py:63
msgid "2FA"
msgstr ""
#: aleksis/core/menus.py:67
#: aleksis/core/menus.py:69
#: aleksis/core/templates/account/password_change.html:5
#: aleksis/core/templates/account/password_change.html:6
#: aleksis/core/templates/account/password_change.html:19
......@@ -250,107 +272,107 @@ msgstr ""
msgid "Change password"
msgstr ""
#: aleksis/core/menus.py:79
#: aleksis/core/menus.py:81
msgid "Me"
msgstr ""
#: aleksis/core/menus.py:88
#: aleksis/core/menus.py:90
#: aleksis/core/templates/dynamic_preferences/form.html:5
msgid "Preferences"
msgstr ""
#: aleksis/core/menus.py:97
#: aleksis/core/menus.py:99
msgid "Third-party accounts"
msgstr ""
#: aleksis/core/menus.py:106
#: aleksis/core/menus.py:108
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:5
#: aleksis/core/templates/oauth2_provider/authorized-tokens.html:6
msgid "Authorized applications"
msgstr ""
#: aleksis/core/menus.py:117
#: aleksis/core/menus.py:119
msgid "Admin"
msgstr ""
#: aleksis/core/menus.py:125 aleksis/core/models.py:687
#: aleksis/core/menus.py:127 aleksis/core/models.py:687
#: aleksis/core/templates/core/announcement/list.html:7
#: aleksis/core/templates/core/announcement/list.html:8
msgid "Announcements"
msgstr ""
#: aleksis/core/menus.py:136 aleksis/core/models.py:117
#: aleksis/core/menus.py:138 aleksis/core/models.py:117
#: aleksis/core/templates/core/school_term/list.html:8
#: aleksis/core/templates/core/school_term/list.html:9
msgid "School terms"
msgstr ""
#: aleksis/core/menus.py:147
#: aleksis/core/menus.py:149
#: aleksis/core/templates/core/dashboard_widget/list.html:8
#: aleksis/core/templates/core/dashboard_widget/list.html:9
msgid "Dashboard widgets"
msgstr ""
#: aleksis/core/menus.py:158
#: aleksis/core/menus.py:160
#: aleksis/core/templates/core/management/data_management.html:6
#: aleksis/core/templates/core/management/data_management.html:7
msgid "Data management"
msgstr ""
#: aleksis/core/menus.py:169
#: aleksis/core/menus.py:171
#: aleksis/core/templates/core/pages/system_status.html:5
#: aleksis/core/templates/core/pages/system_status.html:7
msgid "System status"
msgstr ""
#: aleksis/core/menus.py:180
#: aleksis/core/menus.py:182
msgid "Impersonation"
msgstr ""
#: aleksis/core/menus.py:191
#: aleksis/core/menus.py:193
msgid "Configuration"
msgstr ""
#: aleksis/core/menus.py:202 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/menus.py:204 aleksis/core/templates/core/data_check/list.html:9
#: aleksis/core/templates/core/data_check/list.html:10
msgid "Data checks"
msgstr ""
#: aleksis/core/menus.py:208
#: aleksis/core/menus.py:210
msgid "Backend Admin"
msgstr ""
#: aleksis/core/menus.py:214
#: aleksis/core/menus.py:216
#: aleksis/core/templates/oauth2_provider/application_detail.html:5
#: aleksis/core/templates/oauth2_provider/application_list.html:5
msgid "OAuth2 Applications"
msgstr ""
#: aleksis/core/menus.py:227
#: aleksis/core/menus.py:229
msgid "People"
msgstr ""
#: aleksis/core/menus.py:258 aleksis/core/models.py:941
#: aleksis/core/menus.py:260 aleksis/core/models.py:941
#: aleksis/core/templates/core/group_type/list.html:8
#: aleksis/core/templates/core/group_type/list.html:9
msgid "Group types"
msgstr ""
#: aleksis/core/menus.py:269
#: aleksis/core/menus.py:271
msgid "Persons and accounts"
msgstr ""
#: aleksis/core/menus.py:280
#: aleksis/core/menus.py:282
msgid "Groups and child groups"
msgstr ""
#: aleksis/core/menus.py:291 aleksis/core/models.py:429
#: aleksis/core/menus.py:293 aleksis/core/models.py:429
#: aleksis/core/templates/core/additional_field/list.html:8
#: aleksis/core/templates/core/additional_field/list.html:9
msgid "Additional fields"
msgstr ""
#: aleksis/core/menus.py:306
#: aleksis/core/menus.py:308
#: aleksis/core/templates/core/group/child_groups.html:7
#: aleksis/core/templates/core/group/child_groups.html:9
msgid "Assign child groups to groups"
......@@ -857,46 +879,70 @@ msgstr ""
msgid "Can solve data check problems"
msgstr ""
#: aleksis/core/models.py:1040
#: aleksis/core/models.py:1044
msgid "Owner"
msgstr ""
#: aleksis/core/models.py:1043
#: aleksis/core/models.py:1048
msgid "File expires at"
msgstr ""
#: aleksis/core/models.py:1045
#: aleksis/core/models.py:1050
msgid "Generated HTML file"
msgstr ""
#: aleksis/core/models.py:1047
#: aleksis/core/models.py:1052
msgid "Generated PDF file"
msgstr ""
#: aleksis/core/models.py:1054
#: aleksis/core/models.py:1059
msgid "PDF file"
msgstr ""
#: aleksis/core/models.py:1055
#: aleksis/core/models.py:1060
msgid "PDF files"
msgstr ""
#: aleksis/core/models.py:1060
#: aleksis/core/models.py:1065
msgid "Task result"
msgstr ""
#: aleksis/core/models.py:1063
#: aleksis/core/models.py:1068
msgid "Task user"
msgstr ""
#: aleksis/core/models.py:1075
#: aleksis/core/models.py:1080
msgid "Task user assignment"
msgstr ""
#: aleksis/core/models.py:1076
#: aleksis/core/models.py:1081
msgid "Task user assignments"
msgstr ""
#: aleksis/core/preferences.py:22
msgid "General"
msgstr ""
#: aleksis/core/preferences.py:23
msgid "School"
msgstr ""
#: aleksis/core/preferences.py:24
msgid "Theme"
msgstr ""
#: aleksis/core/preferences.py:25
msgid "Mail"
msgstr ""
#: aleksis/core/preferences.py:27
msgid "Footer"
msgstr ""
#: aleksis/core/preferences.py:28
msgid "Accounts"
msgstr ""
#: aleksis/core/preferences.py:29
msgid "Authentication"
msgstr ""
......@@ -1037,11 +1083,19 @@ msgstr ""
msgid "in minutes"
msgstr ""
#: aleksis/core/settings.py:470
#: aleksis/core/preferences.py:398
msgid "Automatically update the dashboard and its widgets"
msgstr ""
#: aleksis/core/preferences.py:408
msgid "Automatically update the dashboard and its widgets sitewide"
msgstr ""
#: aleksis/core/settings.py:468
msgid "English"
msgstr ""
#: aleksis/core/settings.py:471
#: aleksis/core/settings.py:469
msgid "German"
msgstr ""
......@@ -1382,23 +1436,23 @@ msgstr ""
msgid "There are no announcements."
msgstr ""
#: aleksis/core/templates/core/base.html:55
#: aleksis/core/templates/core/base.html:60
msgid "Logged in as"
msgstr ""
#: aleksis/core/templates/core/base.html:148
#: aleksis/core/templates/core/base.html:154
msgid "About AlekSIS — The Free School Information System"
msgstr ""
#: aleksis/core/templates/core/base.html:156
#: aleksis/core/templates/core/base.html:162
msgid "Impress"
msgstr ""
#: aleksis/core/templates/core/base.html:164
#: aleksis/core/templates/core/base.html:170
msgid "Privacy Policy"
msgstr ""
#: aleksis/core/templates/core/base_print.html:67
#: aleksis/core/templates/core/base_print.html:72
msgid "Powered by AlekSIS"
msgstr ""
......@@ -1672,7 +1726,7 @@ msgstr ""
msgid "Home"
msgstr ""
#: aleksis/core/templates/core/index.html:51
#: aleksis/core/templates/core/index.html:49
msgid ""
"\n"
" You didn't customise your dashboard so that you see the system default. Please click on \"Edit dashboard\" to\n"
......@@ -1680,24 +1734,24 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/index.html:61
#: aleksis/core/templates/core/index.html:59
msgid "Last activities"
msgstr ""
#: aleksis/core/templates/core/index.html:79
#: aleksis/core/templates/core/index.html:77
msgid "No activities available yet."
msgstr ""
#: aleksis/core/templates/core/index.html:84
#: aleksis/core/templates/core/index.html:82
msgid "Recent notifications"
msgstr ""
#: aleksis/core/templates/core/index.html:100
#: aleksis/core/templates/core/index.html:98
#: aleksis/core/templates/core/notifications.html:23
msgid "More information →"
msgstr ""
#: aleksis/core/templates/core/index.html:107
#: aleksis/core/templates/core/index.html:105
#: aleksis/core/templates/core/notifications.html:30
msgid "No notifications available yet."
msgstr ""
......@@ -1884,8 +1938,8 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:9
#: aleksis/core/templates/core/partials/announcements.html:36
#: aleksis/core/templates/core/partials/announcements.html:8
#: aleksis/core/templates/core/partials/announcements.html:35
#, python-format
msgid ""
"\n"
......@@ -1893,7 +1947,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:13
#: aleksis/core/templates/core/partials/announcements.html:12
#, python-format
msgid ""
"\n"
......@@ -1901,7 +1955,7 @@ msgid ""
" "
msgstr ""
#: aleksis/core/templates/core/partials/announcements.html:40
#: aleksis/core/templates/core/partials/announcements.html:39
#, python-format
msgid ""
"\n"
......@@ -2685,127 +2739,127 @@ msgstr ""
msgid "SMS"
msgstr ""
#: aleksis/core/util/pdf.py:89
#: aleksis/core/util/pdf.py:105
msgid "Progress: Generate PDF file"
msgstr ""
#: aleksis/core/util/pdf.py:90
#: aleksis/core/util/pdf.py:106
msgid "Generating PDF file …"
msgstr ""
#: aleksis/core/util/pdf.py:91
#: aleksis/core/util/pdf.py:107
msgid "The PDF file has been generated successfully."
msgstr ""
#: aleksis/core/util/pdf.py:92
#: aleksis/core/util/pdf.py:108
msgid "There was a problem while generating the PDF file."
msgstr ""
#: aleksis/core/util/pdf.py:95
#: aleksis/core/util/pdf.py:111
msgid "Download PDF"
msgstr ""
#: aleksis/core/views.py:249
#: aleksis/core/views.py:253
msgid "The school term has been created."
msgstr ""
#: aleksis/core/views.py:261
#: aleksis/core/views.py:265
msgid "The school term has been saved."
msgstr ""
#: aleksis/core/views.py:406
#: aleksis/core/views.py:410
msgid "The child groups were successfully saved."
msgstr ""
#: aleksis/core/views.py:467
#: aleksis/core/views.py:471
msgid "The person has been saved."
msgstr ""
#: aleksis/core/views.py:506
#: aleksis/core/views.py:510
msgid "The group has been saved."
msgstr ""
#: aleksis/core/views.py:603
#: aleksis/core/views.py:607
msgid "The announcement has been saved."
msgstr ""
#: aleksis/core/views.py:619
#: aleksis/core/views.py:623
msgid "The announcement has been deleted."
msgstr ""
#: aleksis/core/views.py:703
#: aleksis/core/views.py:707
msgid "The preferences have been saved successfully."
msgstr ""
#: aleksis/core/views.py:727
#: aleksis/core/views.py:731
msgid "The person has been deleted."
msgstr ""
#: aleksis/core/views.py:741
#: aleksis/core/views.py:745
msgid "The group has been deleted."
msgstr ""
#: aleksis/core/views.py:773
#: aleksis/core/views.py:777
msgid "The additional_field has been saved."
msgstr ""
#: aleksis/core/views.py:807
#: aleksis/core/views.py:811
msgid "The additional field has been deleted."
msgstr ""
#: aleksis/core/views.py:832
#: aleksis/core/views.py:836
msgid "The group type has been saved."
msgstr ""
#: aleksis/core/views.py:862
#: aleksis/core/views.py:866
msgid "The group type has been deleted."
msgstr ""
#: aleksis/core/views.py:895
#: aleksis/core/views.py:899
msgid "Progress: Run data checks"
msgstr ""
#: aleksis/core/views.py:896
#: aleksis/core/views.py:900
msgid "Run data checks …"
msgstr ""
#: aleksis/core/views.py:897
#: aleksis/core/views.py:901
msgid "The data checks were run successfully."
msgstr ""
#: aleksis/core/views.py:898
#: aleksis/core/views.py:902
msgid "There was a problem while running data checks."
msgstr ""
#: aleksis/core/views.py:914
#: aleksis/core/views.py:918
#, python-brace-format
msgid "The solve option '{solve_option_obj.verbose_name}' "
msgstr ""
#: aleksis/core/views.py:956
#: aleksis/core/views.py:960
msgid "The dashboard widget has been saved."
msgstr ""
#: aleksis/core/views.py:986
#: aleksis/core/views.py:990
msgid "The dashboard widget has been created."
msgstr ""
#: aleksis/core/views.py:996
#: aleksis/core/views.py:1000
msgid "The dashboard widget has been deleted."
msgstr ""
#: aleksis/core/views.py:1063
#: aleksis/core/views.py:1067
msgid "Your dashboard configuration has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1065
#: aleksis/core/views.py:1069
msgid "The configuration of the default dashboard has been saved successfully."
msgstr ""
#: aleksis/core/views.py:1191
#: aleksis/core/views.py:1197
msgid "The third-party account could not be disconnected because it is the only login method available."
msgstr ""
#: aleksis/core/views.py:1198
#: aleksis/core/views.py:1204
msgid "The third-party account has been successfully disconnected."
msgstr ""
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-06-08 16:49+0200\n"
"POT-Creation-Date: 2021-08-28 17:53+0200\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"
......@@ -29,6 +29,6 @@ msgstr ""
msgid "OK"
msgstr ""
#: aleksis/core/static/js/main.js:133
#: aleksis/core/static/js/main.js:127
msgid "This page may contain outdated information since there is no internet connection."
msgstr ""
......@@ -17,6 +17,7 @@ DIRS_FOR_DYNACONF = ["/etc/aleksis"]
SETTINGS_FILE_FOR_DYNACONF = []
for directory in DIRS_FOR_DYNACONF:
SETTINGS_FILE_FOR_DYNACONF += glob(os.path.join(directory, "*.json"))
SETTINGS_FILE_FOR_DYNACONF += glob(os.path.join(directory, "*.ini"))
SETTINGS_FILE_FOR_DYNACONF += glob(os.path.join(directory, "*.yaml"))
SETTINGS_FILE_FOR_DYNACONF += glob(os.path.join(directory, "*.toml"))
......@@ -106,7 +107,6 @@ INSTALLED_APPS = [
"debug_toolbar",
"django_prometheus",
"django_select2",
"hattori",
"templated_email",
"html2text",
"django_otp.plugins.otp_totp",
......@@ -324,13 +324,7 @@ ACCOUNT_UNIQUE_EMAIL = _settings.get("auth.login.registration.unique_email", Tru
# Configuration for OAuth2 provider
OAUTH2_PROVIDER = {
"SCOPES": {
"read": "Read anything the resource owner can read",
"write": "Write anything the resource owner can write",
}
}
merge_app_settings("OAUTH2_SCOPES", OAUTH2_PROVIDER["SCOPES"], True)
OAUTH2_PROVIDER = {"SCOPES_BACKEND_CLASS": "aleksis.core.util.auth_helpers.AppScopes"}
if _settings.get("oauth2.oidc.enabled", False):
with open(_settings.get("oauth2.oidc.rsa_key", "/etc/aleksis/oidc.pem"), "r") as f:
......@@ -351,6 +345,7 @@ if _settings.get("oauth2.oidc.enabled", False):
"address": _("Full home postal address"),
"email": _("Email address"),
"phone": _("Home and mobile phone"),
"groups": _("Groups"),
}
)
......@@ -550,10 +545,10 @@ SASS_PROCESSOR_INCLUDE_DIRS = [
STATIC_ROOT,
]
ADMINS = _settings.get("contact.admins", [])
SERVER_EMAIL = _settings.get("contact.from", "root@localhost")
DEFAULT_FROM_EMAIL = _settings.get("contact.from", "root@localhost")
MANAGERS = _settings.get("contact.admins", [])
ADMINS = _settings.get("contact.admins", [AUTH_INITIAL_SUPERUSER["email"]])
SERVER_EMAIL = _settings.get("contact.from", ADMINS[0])
DEFAULT_FROM_EMAIL = _settings.get("contact.from", ADMINS[0])
MANAGERS = _settings.get("contact.admins", ADMINS)
if _settings.get("mail.server.host", None):
EMAIL_HOST = _settings.get("mail.server.host")
......@@ -786,11 +781,21 @@ BLEACH_STRIP_COMMENTS = True
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {"console": {"class": "logging.StreamHandler", "formatter": "verbose"},},
"handlers": {
"console": {"class": "logging.StreamHandler", "formatter": "verbose"},
"null": {"class": "logging.NullHandler"},
},
"formatters": {"verbose": {"format": "%(levelname)s %(asctime)s %(module)s: %(message)s"}},
"root": {"handlers": ["console"], "level": _settings.get("logging.level", "WARNING"),},
"loggers": {},
}
if not _settings.get("logging.disallowed_host", False):
LOGGING["loggers"]["django.security.DisallowedHost"] = {
"handlers": ["null"],
"propagate": False,
}
# Rules and permissions
GUARDIAN_RAISE_403 = True
......
......@@ -157,12 +157,12 @@
</div>
<div class="right">
<span id="doit"></span>
{% if request.site.preferences.footer__impress_url %}
<a class="blue-text text-lighten-4" href="{{ request.site.preferences.footer__impress_url }}">
{% if request.site.preferences.footer__imprint_url %}
<a class="blue-text text-lighten-4" href="{{ request.site.preferences.footer__imprint_url }}">
{% trans "Impress" %}
</a>
{% endif %}
{% if request.site.preferences.footer__privacy_url and request.site.preferences.footer__impress_url %}
{% if request.site.preferences.footer__privacy_url and request.site.preferences.footer__imprint_url %}
·
{% endif %}
{% if request.site.preferences.footer__privacy_url %}
......
......@@ -9,3 +9,9 @@ def test_full_name():
_person = Person.objects.create(first_name="Jane", last_name="Doe")
assert _person.full_name == "Doe, Jane"
def test_delete():
_person = Person.objects.create(first_name="Jane", last_name="Doe")
_person.delete()
assert not Person.objects.filter(first_name="Jane", last_name="Doe").exists()
from importlib import metadata
from typing import Any, Optional, Sequence
from typing import TYPE_CHECKING, Any, Optional, Sequence
import django.apps
from django.contrib.auth.signals import user_logged_in, user_logged_out
......@@ -12,6 +12,9 @@ from spdx_license_list import LICENSES
from .core_helpers import copyright_years
if TYPE_CHECKING:
from oauth2_provider.models import AbstractApplication
class AppConfig(django.apps.AppConfig):
"""An extended version of DJango's AppConfig container."""
......@@ -214,6 +217,33 @@ class AppConfig(django.apps.AppConfig):
"""
pass
@classmethod
def get_all_scopes(cls) -> dict[str, str]:
"""Return all OAuth scopes and their descriptions for this app."""
return {}
@classmethod
def get_available_scopes(
cls,
application: Optional["AbstractApplication"] = None,
request: Optional[HttpRequest] = None,
*args,
**kwargs,
) -> list[str]:
"""Return a list of all OAuth scopes available to the request and application."""
return list(cls.get_all_scopes().keys())
@classmethod
def get_default_scopes(
cls,
application: Optional["AbstractApplication"] = None,
request: Optional[HttpRequest] = None,
*args,
**kwargs,
) -> list[str]:
"""Return a list of all OAuth scopes to always include for this request and application."""
return []
def _maintain_default_data(self):
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
......
"""Helpers/overrides for django-allauth."""
from typing import Optional
from django.conf import settings
from django.http import HttpRequest
from allauth.account.adapter import DefaultAccountAdapter
from allauth.socialaccount.adapter import DefaultSocialAccountAdapter
from oauth2_provider.models import AbstractApplication
from oauth2_provider.oauth2_validators import OAuth2Validator
from oauth2_provider.scopes import BaseScopes
from .apps import AppConfig
from .core_helpers import get_site_preferences, has_person
......@@ -72,4 +77,45 @@ class CustomOAuth2Validator(OAuth2Validator):
"postal_code": request.user.person.postal_code,
}
if "groups" in request.scopes and has_person(request.user):
claims["groups"] = request.user.person.groups.values_list("name", flat=True).all()
return claims
class AppScopes(BaseScopes):
"""Scopes backend for django-oauth-toolkit gathering scopes from apps.
Will call the respective method on all known AlekSIS app configs and
join the results.
"""
def get_all_scopes(self) -> dict[str, str]:
scopes = {}
for app in AppConfig.__subclasses__():
scopes |= app.get_all_scopes()
return scopes
def get_available_scopes(
self,
application: Optional[AbstractApplication] = None,
request: Optional[HttpRequest] = None,
*args,
**kwargs
) -> list[str]:
scopes = []
for app in AppConfig.__subclasses__():
scopes += app.get_available_scopes()
return scopes
def get_default_scopes(
self,
application: Optional[AbstractApplication] = None,
request: Optional[HttpRequest] = None,
*args,
**kwargs
) -> list[str]:
scopes = []
for app in AppConfig.__subclasses__():
scopes += app.get_default_scopes()
return scopes