diff --git a/.gitignore b/.gitignore index ed90f2f7a841da90717ad986c7bb57dbc86a8876..70d2c1202e645fc31260a0fdd6bac90fdd25e15a 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,8 @@ docs/_build/ # Generated files aleksis/node_modules/ aleksis/static/ +aleksis/whoosh_index/ +aleksis/xapian_index/ .coverage .mypy_cache/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0fbcadf4c406631f4ac1de9cca65415362a53da3..1b40df197dd94deb70e14407da9b5c0a6f7175ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: registry.edugit.org/teckids/docker-images/python-pimped:master +image: registry.edugit.org/teckids/team-sysadmin/docker-images/python-pimped:master stages: - test @@ -28,6 +28,8 @@ test: - adduser --disabled-password --gecos "Test User" testuser - chown -R testuser . script: + - sudo apt update + - sudo apt install python3-ldap libldap2-dev libssl-dev libsasl2-dev python3.7-dev -y - sudo -u testuser env TEST_SELENIUM_HUB=http://selenium:4444/wd/hub TEST_SELENIUM_BROWSERS=firefox @@ -58,17 +60,18 @@ pages: before_script: - cp -r .tox/screenshots/firefox docs/screenshots script: + - export LC_ALL=en_GB.utf8 - tox -e docs -- BUILDDIR=../public/docs artifacts: paths: - public/ only: - - master + - master build_docker: stage: build image: - name: gcr.io/kaniko-project/executor:debug + name: gcr.io/kaniko-project/executor:v0.19.0 entrypoint: [""] script: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" >/kaniko/.docker/config.json diff --git a/.gitmodules b/.gitmodules index 473e630164971d3e1620a9d67eb6810d839c441e..0b1ff289423a93278ac8d274890a2b5ae0788e1a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,16 +1,15 @@ -[submodule "apps/official/AlekSIS-App-Alsijil"] - path = apps/official/AlekSIS-App-Alsijil - url = https://edugit.org/AlekSIS/AlekSIS-App-Alsijil - ignore = untracked [submodule "apps/official/AlekSIS-App-Chronos"] path = apps/official/AlekSIS-App-Chronos - url = https://edugit.org/AlekSIS/AlekSIS-App-Chronos + url = https://edugit.org/AlekSIS/Official/AlekSIS-App-Chronos ignore = untracked [submodule "apps/official/AlekSIS-App-Exlibris"] path = apps/official/AlekSIS-App-Exlibris - url = https://edugit.org/AlekSIS/AlekSIS-App-Exlibris + url = https://edugit.org/AlekSIS/Official/AlekSIS-App-Exlibris ignore = untracked [submodule "apps/official/AlekSIS-App-DashboardFeeds"] path = apps/official/AlekSIS-App-DashboardFeeds - url = https://edugit.org/AlekSIS/AlekSIS-App-DashboardFeeds.git + url = https://edugit.org/AlekSIS/Official/AlekSIS-App-DashboardFeeds.git ignore = untracked +[submodule "apps/official/AlekSIS-App-LDAP"] + path = apps/official/AlekSIS-App-LDAP + url = https://edugit.org/AlekSIS/official/AlekSIS-App-LDAP diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f9abfd94ff084768f78d32258f06afa0a67b6609..cf7ceac6515f4b7d61b10afa664fc43f42a9c48f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -75,7 +75,7 @@ Minor changes * Use bootstrap buttons everywhere -_`1.0a1`: https://edugit.org/Teckids/AlekSIS/AlekSIS/-/tags/1.0a1 -_`1.0a2`: https://edugit.org/Teckids/AlekSIS/AlekSIS/-/tags/1.0a2 -_`1.0a4`: https://edugit.org/Teckids/AlekSIS/AlekSIS/-/tags/1.0a4 -_`2.0a1`: https://edugit.org/Teckids/AlekSIS/AlekSIS/-/tags/2.0a1 +_`1.0a1`: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/1.0a1 +_`1.0a2`: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/1.0a2 +_`1.0a4`: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/1.0a4 +_`2.0a1`: https://edugit.org/AlekSIS/Official/AlekSIS/-/tags/2.0a1 diff --git a/Dockerfile b/Dockerfile index 5c27542638c3dd55a33cbbe92c62060d18606d91..0c4f3b52ededb87de3ea36f7814d155aaa20026d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8-buster +FROM python:3.8-buster AS core # Configure Python to be nice inside Docker and pip to stfu ENV PYTHONUNBUFFERED 1 @@ -34,9 +34,38 @@ RUN set -e; \ eatmydata pip install poetry; \ poetry config virtualenvs.create false; \ eatmydata poetry install; \ - eatmydata pip install gunicorn + eatmydata pip install gunicorn django-compressor + +# Declare a persistent volume for all data +VOLUME /var/lib/aleksis + +# Define entrypoint and gunicorn running on port 8000 +EXPOSE 8000 +COPY docker/entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] + +# Install core extras +FROM core AS core-extras +ARG EXTRA_LDAP=1 +ARG EXTRA_CELERY=1 +WORKDIR /usr/src/app + +# LDAP +RUN if [ $EXTRA_LDAP = 1 ] ; then \ + eatmydata apt-get install -y --no-install-recommends \ + libldap2-dev \ + libsasl2-dev \ + ldap-utils; \ + eatmydata poetry install -E ldap; \ + fi; + +# Celery +RUN if [ $EXTRA_CELERY = 1 ] ; then \ + eatmydata poetry install -E celery; \ + fi; # Install official apps +FROM core-extras AS apps COPY apps ./apps/ RUN set -e; \ for d in apps/official/*; do \ @@ -47,11 +76,13 @@ RUN set -e; \ done # Build messages and assets +FROM apps as assets RUN eatmydata python manage.py compilemessages && \ eatmydata python manage.py yarn install && \ eatmydata python manage.py collectstatic --no-input --clear # Clean up build dependencies +FROM assets AS clean RUN set -e; \ eatmydata apt-get remove --purge -y \ build-essential \ @@ -64,11 +95,3 @@ RUN set -e; \ eatmydata pip uninstall -y poetry; \ rm -f /var/lib/apt/lists/*_*; \ rm -rf /root/.cache - -# Declare a persistent volume for all data -VOLUME /var/lib/aleksis - -# Define entrypoint and gunicorn running on port 8000 -EXPOSE 8000 -COPY docker/entrypoint.sh /usr/local/bin/ -ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/README.rst b/README.rst index 08e39a68d743d4e0974a4fd2b64b29e69eb604db..36ba5325a73f06493b8c3a862188516c17039a17 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -AlekSIS (School Information System) — Core -========================================== +AlekSIS — All-libre extensible kit for school information systems +================================================================= Warning ------- @@ -50,5 +50,5 @@ full licence text or on the `European Union Public Licence`_ website https://joinup.ec.europa.eu/collection/eupl/guidelines-users-and-developers (including all other official language versions). -.. _AlekSIS: https://edugit.org/AlekSIS/AlekSIS +.. _AlekSIS: https://edugit.org/AlekSIS/Official/AlekSIS .. _European Union Public Licence: https://eupl.eu/ diff --git a/aleksis/core/admin.py b/aleksis/core/admin.py index 0725c0aa5545797317a3bfac955cd854d28f227e..29a48d1517db6661fafd7ddd81bc0f975faa2d5a 100644 --- a/aleksis/core/admin.py +++ b/aleksis/core/admin.py @@ -1,6 +1,16 @@ from django.contrib import admin -from .models import Group, Person, School, SchoolTerm, Activity, Notification +from .models import ( + Group, + Person, + School, + SchoolTerm, + Activity, + Notification, + Announcement, + AnnouncementRecipient, + CustomMenuItem, +) admin.site.register(Person) admin.site.register(Group) @@ -8,3 +18,17 @@ admin.site.register(School) admin.site.register(SchoolTerm) admin.site.register(Activity) admin.site.register(Notification) +admin.site.register(CustomMenuItem) + + +class AnnouncementRecipientInline(admin.StackedInline): + model = AnnouncementRecipient + + +class AnnouncementAdmin(admin.ModelAdmin): + inlines = [ + AnnouncementRecipientInline, + ] + + +admin.site.register(Announcement, AnnouncementAdmin) diff --git a/aleksis/core/apps.py b/aleksis/core/apps.py index aaee34bc1439fb045626ec07768f7b9555c67ef7..13e3b3ddcf1083e1cff0f8c5e3461103bb12f4b2 100644 --- a/aleksis/core/apps.py +++ b/aleksis/core/apps.py @@ -1,14 +1,41 @@ -from django.apps import AppConfig, apps +from typing import Any, List, Optional, Tuple -from constance.signals import config_updated +import django.apps +from django.contrib.auth.signals import user_logged_in +from django.http import HttpRequest from .signals import clean_scss +from .util.apps import AppConfig +from .util.core_helpers import has_person class CoreConfig(AppConfig): name = "aleksis.core" verbose_name = "AlekSIS — The Free School Information System" - def ready(self) -> None: + def config_updated(self, *args, **kwargs) -> None: clean_scss() - config_updated.connect(clean_scss) + + def post_migrate( + self, + app_config: django.apps.AppConfig, + verbosity: int, + interactive: bool, + using: str, + plan: List[Tuple], + apps: django.apps.registry.Apps, + **kwargs, + ) -> None: + super().post_migrate(app_config, verbosity, interactive, using, plan, apps) + + # Ensure presence of a OTP YubiKey default config + apps.get_model("otp_yubikey", "ValidationService").objects.using(using).update_or_create( + name="default", defaults={"use_ssl": True, "param_sl": "", "param_timeout": ""} + ) + + def user_logged_in( + self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs + ) -> None: + if has_person(user): + # Save the associated person to pick up defaults + user.person.save() diff --git a/aleksis/core/checks.py b/aleksis/core/checks.py new file mode 100644 index 0000000000000000000000000000000000000000..e52290eb3a48ae4d7e7efe90fbec61d8f86ed365 --- /dev/null +++ b/aleksis/core/checks.py @@ -0,0 +1,58 @@ +from typing import Optional + +import django.apps +from django.core.checks import Tags, Warning, register + +from .mixins import ExtensibleModel, PureDjangoModel +from .util.apps import AppConfig + + +@register(Tags.compatibility) +def check_app_configs_base_class( + app_configs: Optional[django.apps.registry.Apps] = None, **kwargs +) -> list: + """ Checks whether all apps derive from AlekSIS's base app config """ + + results = [] + + if app_configs is None: + app_configs = django.apps.apps.get_app_configs() + + for app_config in filter(lambda c: c.name.startswith("aleksis."), app_configs): + if not isinstance(app_config, AppConfig): + results.append( + Warning( + "App config %s does not derive from aleksis.core.util.apps.AppConfig." % app_config.name, + hint="Ensure the app uses the correct base class for all registry functionality to work.", + obj=app_config, + id="aleksis.core.W001", + ) + ) + + return results + + +@register(Tags.compatibility) +def check_app_models_base_class( + app_configs: Optional[django.apps.registry.Apps] = None, **kwargs +) -> list: + """ Checks whether all app models derive from AlekSIS's base ExtensibleModel """ + + results = [] + + if app_configs is None: + app_configs = django.apps.apps.get_app_configs() + + for app_config in filter(lambda c: c.name.startswith("aleksis."), app_configs): + for model in app_config.get_models(): + if ExtensibleModel not in model.__mro__ and PureDjangoModel not in model.__mro__: + results.append( + Warning( + "Model %s in app config %s does not derive from aleksis.core.mixins.ExtensibleModel." % (model._meta.object_name, app_config.name), + hint="Ensure all models in AlekSIS use ExtensibleModel as base. If your deviation is intentional, you can add the PureDjangoModel mixin instead to silence this warning.", + obj=model, + id="aleksis.core.W002", + ) + ) + + return results diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index cef045d867bd838acc8443c17eb695a48e90b31a..fd331592f24d3527c3edfb2726cce25ec83095fe 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -1,10 +1,18 @@ +from datetime import time, datetime +from typing import Optional + from django import forms from django.contrib.auth import get_user_model -from django.utils.translation import ugettext_lazy as _ +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from django_select2.forms import ModelSelect2MultipleWidget, Select2Widget +from material import Layout, Fieldset, Row -from .models import Group, Person, School, SchoolTerm +from .mixins import ExtensibleForm +from .models import Group, Person, School, SchoolTerm, Announcement, AnnouncementRecipient class PersonAccountForm(forms.ModelForm): @@ -47,7 +55,25 @@ PersonsAccountsFormSet = forms.modelformset_factory( ) -class EditPersonForm(forms.ModelForm): +class EditPersonForm(ExtensibleForm): + layout = Layout( + Fieldset( + _("Base data"), + "short_name", + Row("user", "primary_group"), + "is_active", + Row("first_name", "additional_name", "last_name"), + ), + Fieldset(_("Address"), Row("street", "housenumber"), Row("postal_code", "place")), + Fieldset(_("Contact data"), "email", Row("phone_number", "mobile_number")), + Fieldset( + _("Advanced personal data"), + Row("sex", "date_of_birth"), + Row("photo", "photo_cropping"), + "guardians", + ), + ) + class Meta: model = Person fields = [ @@ -68,6 +94,8 @@ class EditPersonForm(forms.ModelForm): "sex", "photo", "photo_cropping", + "guardians", + "primary_group", ] widgets = {"user": Select2Widget} @@ -97,10 +125,15 @@ class EditPersonForm(forms.ModelForm): self.cleaned_data["user"] = new_user_obj -class EditGroupForm(forms.ModelForm): +class EditGroupForm(ExtensibleForm): + layout = Layout( + Fieldset(_("Common data"), "name", "short_name"), + Fieldset(_("Persons"), "members", "owners", "parent_groups"), + ) + class Meta: model = Group - fields = ["name", "short_name", "members", "owners", "parent_groups"] + exclude = [] widgets = { "members": ModelSelect2MultipleWidget( search_fields=[ @@ -122,13 +155,124 @@ class EditGroupForm(forms.ModelForm): } -class EditSchoolForm(forms.ModelForm): +class EditSchoolForm(ExtensibleForm): + layout = Layout( + Fieldset(_("School name"), "name", "name_official"), + Fieldset(_("School logo"), Row("logo", "logo_cropping")), + ) + class Meta: model = School fields = ["name", "name_official", "logo", "logo_cropping"] -class EditTermForm(forms.ModelForm): +class EditTermForm(ExtensibleForm): + layout = Layout("caption", Row("date_start", "date_end")) + class Meta: model = SchoolTerm fields = ["caption", "date_start", "date_end"] + + +class AnnouncementForm(ExtensibleForm): + valid_from = forms.DateTimeField(required=False) + valid_until = forms.DateTimeField(required=False) + + valid_from_date = forms.DateField(label=_("Date")) + valid_from_time = forms.TimeField(label=_("Time")) + + valid_until_date = forms.DateField(label=_("Date")) + valid_until_time = forms.TimeField(label=_("Time")) + + persons = forms.ModelMultipleChoiceField( + Person.objects.all(), label=_("Persons"), required=False + ) + groups = forms.ModelMultipleChoiceField(Group.objects.all(), label=_("Groups"), required=False) + + layout = Layout( + Fieldset( + _("From when until when should the announcement be displayed?"), + Row("valid_from_date", "valid_from_time", "valid_until_date", "valid_until_time"), + ), + Fieldset(_("Who should see the announcement?"), Row("groups", "persons")), + Fieldset(_("Write your announcement:"), "title", "description"), + ) + + def __init__(self, *args, **kwargs): + if "instance" not in kwargs: + kwargs["initial"] = { + "valid_from_date": datetime.now(), + "valid_from_time": time(0, 0), + "valid_until_date": datetime.now(), + "valid_until_time": time(23, 59), + } + else: + announcement = kwargs["instance"] + + # Fill special fields from given announcement instance + kwargs["initial"] = { + "valid_from_date": announcement.valid_from.date(), + "valid_from_time": announcement.valid_from.time(), + "valid_until_date": announcement.valid_until.date(), + "valid_until_time": announcement.valid_until.time(), + "groups": announcement.get_recipients_for_model(Group), + "persons": announcement.get_recipients_for_model(Person), + } + super().__init__(*args, **kwargs) + + def clean(self): + data = super().clean() + + # Check date and time + from_date = data["valid_from_date"] + from_time = data["valid_from_time"] + until_date = data["valid_until_date"] + until_time = data["valid_until_time"] + + valid_from = datetime.combine(from_date, from_time) + valid_until = datetime.combine(until_date, until_time) + + if valid_until < datetime.now(): + raise ValidationError( + _("You are not allowed to create announcements which are only valid in the past.") + ) + elif valid_from > valid_until: + raise ValidationError( + _("The from date and time must be earlier then the until date and time.") + ) + + data["valid_from"] = valid_from + data["valid_until"] = valid_until + + # Check recipients + if "groups" not in data and "persons" not in data: + raise ValidationError(_("You need at least one recipient.")) + + recipients = [] + recipients += data.get("groups", []) + recipients += data.get("persons", []) + + data["recipients"] = recipients + + return data + + def save(self, _=False): + # Save announcement + a = self.instance if self.instance is not None else Announcement() + a.valid_from = self.cleaned_data["valid_from"] + a.valid_until = self.cleaned_data["valid_until"] + a.title = self.cleaned_data["title"] + a.description = self.cleaned_data["description"] + a.save() + + # Save recipients + a.recipients.all().delete() + for recipient in self.cleaned_data["recipients"]: + a.recipients.create(recipient=recipient) + a.save() + + return a + + class Meta: + model = Announcement + exclude = [] diff --git a/aleksis/core/locale/ar/LC_MESSAGES/django.po b/aleksis/core/locale/ar/LC_MESSAGES/django.po index 55d74712759f1d4b7f69d86bc87acf10b6f1c0e1..8beda63fdc77717855d4c52f3ede65395fa9fcf9 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: 2019-11-23 10:06+0100\n" +"POT-Creation-Date: 2020-03-30 09:18+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" @@ -16,445 +16,697 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "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" +"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" -#: forms.py:30 forms.py:66 +#: forms.py:38 forms.py:93 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: forms.py:32 forms.py:68 +#: forms.py:41 forms.py:96 msgid "This username is already in use." msgstr "" -#: forms.py:57 +#: forms.py:83 msgid "New user" msgstr "" -#: forms.py:58 +#: forms.py:83 msgid "Create a new account" msgstr "" -#: menus.py:6 -msgid "Account" +#: forms.py:149 forms.py:152 +msgid "Date" msgstr "" -#: menus.py:11 -msgid "Stop impersonation" +#: forms.py:150 forms.py:153 +msgid "Time" msgstr "" -#: menus.py:16 templates/registration/login.html:21 -msgid "Login" +#: forms.py:155 menus.py:127 models.py:95 templates/core/persons.html:8 +#: templates/core/persons.html:9 +msgid "Persons" msgstr "" -#: menus.py:21 -msgid "Logout" +#: forms.py:156 menus.py:133 models.py:232 templates/core/groups.html:8 +#: templates/core/groups.html:9 templates/core/person_full.html:79 +msgid "Groups" msgstr "" -#: menus.py:28 -msgid "Admin" +#: forms.py:160 +msgid "From when until when should the announcement be displayed?" msgstr "" -#: menus.py:33 templates/core/data_management.html:5 -#: templates/core/data_management.html:7 -msgid "Data management" +#: forms.py:163 +msgid "Who should see the announcement?" msgstr "" -#: menus.py:38 templates/core/system_status.html:5 -#: templates/core/system_status.html:7 -msgid "System status" +#: forms.py:164 +msgid "Write your announcement:" msgstr "" -#: menus.py:43 -msgid "Impersonation" +#: forms.py:203 +msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: menus.py:48 -msgid "Manage school" +#: forms.py:207 +msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: menus.py:55 -msgid "People" +#: forms.py:215 +msgid "You need at least one recipient." msgstr "" -#: menus.py:61 templates/core/persons.html:8 templates/core/persons.html:10 -msgid "Persons" +#: menus.py:7 templates/registration/login.html:21 +#: templates/two_factor/core/login.html:6 +#: templates/two_factor/core/login.html:10 +#: templates/two_factor/core/login.html:64 +msgid "Login" msgstr "" -#: menus.py:66 templates/core/groups.html:8 templates/core/groups.html:10 -#: templates/core/person_full.html:66 -msgid "Groups" +#: menus.py:13 +msgid "Dashboard" msgstr "" -#: menus.py:71 -msgid "Persons and accounts" +#: menus.py:19 +msgid "Account" msgstr "" -#: menus.py:80 -msgid "AlekSIS Software" +#: menus.py:26 +msgid "Stop impersonation" msgstr "" -#: menus.py:84 -msgid "Website" +#: menus.py:35 templates/core/base.html:56 +msgid "Logout" msgstr "" -#: menus.py:94 -msgid "Support" +#: menus.py:41 +msgid "Two factor auth" msgstr "" -#: menus.py:98 templates/contact_form/contact_form.html:8 -msgid "Get support" +#: menus.py:52 +msgid "Admin" msgstr "" -#: menus.py:108 -msgid "Edit school information" +#: menus.py:61 models.py:395 templates/core/announcement/list.html:7 +#: templates/core/announcement/list.html:8 +msgid "Announcements" msgstr "" -#: menus.py:112 templates/core/edit_schoolterm.html:7 -#: templates/core/edit_schoolterm.html:9 -msgid "Edit school term" +#: menus.py:70 templates/core/data_management.html:6 +#: templates/core/data_management.html:7 +msgid "Data management" msgstr "" -#: migrations/0001_initial.py:15 -msgid "Default school" +#: menus.py:79 templates/core/system_status.html:5 +#: templates/core/system_status.html:7 +msgid "System status" msgstr "" -#: migrations/0002_school_term.py:16 -msgid "Default term" +#: menus.py:88 +msgid "Impersonation" +msgstr "" + +#: menus.py:97 +msgid "Manage school" +msgstr "" + +#: menus.py:106 +msgid "Backend Admin" +msgstr "" + +#: menus.py:117 +msgid "People" +msgstr "" + +#: menus.py:139 +msgid "Persons and accounts" +msgstr "" + +#: menus.py:152 +msgid "Edit school information" msgstr "" -#: models.py:20 +#: menus.py:153 templates/core/edit_schoolterm.html:8 +#: templates/core/edit_schoolterm.html:9 +msgid "Edit school term" +msgstr "" + +#: models.py:31 models.py:517 msgid "Name" msgstr "" -#: models.py:21 +#: models.py:33 msgid "Official name" msgstr "" -#: models.py:22 +#: models.py:35 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: models.py:24 +#: models.py:38 msgid "School logo" msgstr "" -#: models.py:38 +#: models.py:51 +msgid "School" +msgstr "" + +#: models.py:52 +msgid "Schools" +msgstr "" + +#: models.py:60 msgid "Visible caption of the term" msgstr "" -#: models.py:42 +#: models.py:62 msgid "Effective start date of term" msgstr "" -#: models.py:44 +#: models.py:63 msgid "Effective end date of term" msgstr "" -#: models.py:57 +#: models.py:83 +msgid "School term" +msgstr "" + +#: models.py:84 +msgid "School terms" +msgstr "" + +#: models.py:94 templates/core/persons_accounts.html:36 +msgid "Person" +msgstr "" + +#: models.py:97 msgid "female" msgstr "" -#: models.py:58 +#: models.py:97 msgid "male" msgstr "" -#: models.py:65 +#: models.py:102 msgid "Is person active?" msgstr "" -#: models.py:67 +#: models.py:104 msgid "First name" msgstr "" -#: models.py:68 +#: models.py:105 msgid "Last name" msgstr "" -#: models.py:70 +#: models.py:107 msgid "Additional name(s)" msgstr "" -#: models.py:73 +#: models.py:111 msgid "Short name" msgstr "" -#: models.py:76 +#: models.py:114 msgid "Street" msgstr "" -#: models.py:78 +#: models.py:115 msgid "Street number" msgstr "" -#: models.py:80 +#: models.py:116 msgid "Postal code" msgstr "" -#: models.py:82 +#: models.py:117 msgid "Place" msgstr "" -#: models.py:84 +#: models.py:119 msgid "Home phone" msgstr "" -#: models.py:86 +#: models.py:120 msgid "Mobile phone" msgstr "" -#: models.py:88 +#: models.py:122 msgid "E-mail address" msgstr "" -#: models.py:91 +#: models.py:124 msgid "Date of birth" msgstr "" -#: models.py:93 +#: models.py:125 msgid "Sex" msgstr "" -#: models.py:95 +#: models.py:127 msgid "Photo" msgstr "" -#: models.py:99 +#: models.py:131 models.py:249 msgid "Reference ID of import source" msgstr "" -#: models.py:101 +#: models.py:140 msgid "Guardians / Parents" msgstr "" -#: models.py:145 +#: models.py:231 +msgid "Group" +msgstr "" + +#: models.py:234 msgid "Long name of group" msgstr "" -#: models.py:147 +#: models.py:235 msgid "Short name of group" msgstr "" -#: models.py:153 +#: models.py:244 msgid "Parent groups" msgstr "" -#: settings.py:218 +#: models.py:268 models.py:285 models.py:363 +#: templates/core/announcement/list.html:18 +msgid "Title" +msgstr "" + +#: models.py:269 models.py:286 models.py:364 +msgid "Description" +msgstr "" + +#: models.py:271 +msgid "Application" +msgstr "" + +#: models.py:277 +msgid "Activity" +msgstr "" + +#: models.py:278 +msgid "Activities" +msgstr "" + +#: models.py:282 +msgid "Sender" +msgstr "" + +#: models.py:287 models.py:365 models.py:518 +msgid "Link" +msgstr "" + +#: models.py:289 +msgid "Read" +msgstr "" + +#: models.py:290 +msgid "Sent" +msgstr "" + +#: models.py:301 +msgid "Notification" +msgstr "" + +#: models.py:302 +msgid "Notifications" +msgstr "" + +#: models.py:368 +msgid "Date and time from when to show" +msgstr "" + +#: models.py:371 +msgid "Date and time until when to show" +msgstr "" + +#: models.py:394 +msgid "Announcement" +msgstr "" + +#: models.py:422 +msgid "Announcement recipient" +msgstr "" + +#: models.py:423 +msgid "Announcement recipients" +msgstr "" + +#: models.py:473 +msgid "Widget Title" +msgstr "" + +#: models.py:474 +msgid "Activate Widget" +msgstr "" + +#: models.py:486 +msgid "Dashboard Widget" +msgstr "" + +#: models.py:487 +msgid "Dashboard Widgets" +msgstr "" + +#: models.py:491 +msgid "Menu ID" +msgstr "" + +#: models.py:492 +msgid "Menu name" +msgstr "" + +#: models.py:509 +msgid "Custom menu" +msgstr "" + +#: models.py:510 +msgid "Custom menus" +msgstr "" + +#: models.py:515 +msgid "Menu" +msgstr "" + +#: models.py:520 +msgid "Icon" +msgstr "" + +#: models.py:527 +msgid "Custom menu item" +msgstr "" + +#: models.py:528 +msgid "Custom menu items" +msgstr "" + +#: settings.py:254 msgid "German" msgstr "" -#: settings.py:219 +#: settings.py:255 msgid "English" msgstr "" -#: templates/403.html:5 -msgid "Forbidden" +#: settings.py:373 +msgid "Site title" msgstr "" -#: templates/403.html:12 -msgid "You are not allowed to access the requested page or object." +#: settings.py:374 +msgid "Site description" msgstr "" -#: templates/403.html:16 templates/404.html:20 -msgid "" -"\n" -" If you think this is an error in AlekSIS, please contact your site\n" -" administrators.\n" -" " +#: settings.py:375 +msgid "Primary colour" msgstr "" -#: templates/404.html:5 -msgid "Not found" +#: settings.py:376 +msgid "Secondary colour" msgstr "" -#: templates/404.html:12 -msgid "The requested page or object was not found." +#: settings.py:377 +msgid "Mail out name" msgstr "" -#: templates/404.html:16 +#: settings.py:378 +msgid "Mail out address" +msgstr "" + +#: settings.py:379 +msgid "Link to privacy policy" +msgstr "" + +#: settings.py:380 +msgid "Link to imprint" +msgstr "" + +#: settings.py:381 +msgid "Name format of adresses" +msgstr "" + +#: settings.py:382 +msgid "Channels to allow for notifications" +msgstr "" + +#: settings.py:383 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "" + +#: templates/403.html:10 +msgid "Error (403): You are not allowed to access the requested page or object." +msgstr "" + +#: templates/403.html:12 msgid "" "\n" -" If you were redirected by a link on an external page,\n" -" it is possible that that link was outdated.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/500.html:5 -msgid "Internal Server Error" +#: templates/404.html:10 +msgid "Error (404): The requested page or object was not found." msgstr "" -#: templates/500.html:12 +#: templates/404.html:12 msgid "" "\n" -" An unexpected error has occured.\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" " " msgstr "" -#: templates/500.html:18 +#: templates/404.html:16 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" -" error.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/503.html:5 -msgid "Maintenance mode" +#: templates/500.html:10 +msgid "Error (500): An unexpected error has occured.." msgstr "" -#: templates/503.html:12 +#: templates/500.html:12 msgid "" "\n" -" The maintenance mode is currently enabled. Please try again later.\n" -" " +" Your site administrators will automatically be notified about this\n" +" error.\n" +" " msgstr "" -#: templates/contact_form/contact_form.html:14 -msgid "Send" +#: templates/503.html:10 +msgid "The maintenance mode is currently enabled. Please try again later." msgstr "" -#: templates/contact_form/contact_form_sent.html:9 +#: templates/503.html:12 msgid "" "\n" -" The message was successfully submitted.\n" -" " +" This page is currently unavailable. If this error stays, contact your site administrators:\n" +" " msgstr "" -#: templates/core/edit_group.html:16 templates/core/edit_group.html:18 -#: templates/core/group_full.html:16 -msgid "Edit group" +#: templates/core/announcement/form.html:10 +#: templates/core/announcement/form.html:17 +msgid "Edit announcement" msgstr "" -#: templates/core/edit_group.html:26 templates/core/edit_person.html:28 -#: templates/core/edit_school.html:22 templates/core/edit_schoolterm.html:22 -msgid "Edit" +#: templates/core/announcement/form.html:12 +msgid "Publish announcement" msgstr "" -#: templates/core/edit_person.html:7 templates/core/edit_person.html:9 -#: templates/core/person_full.html:16 -msgid "Edit person" +#: templates/core/announcement/form.html:19 +#: templates/core/announcement/list.html:13 +msgid "Publish new announcement" msgstr "" -#: templates/core/edit_school.html:7 templates/core/edit_school.html:9 -msgid "Edit school" +#: templates/core/announcement/form.html:30 +msgid "Save und publish announcement" msgstr "" -#: templates/core/footer-menu.html:26 -msgid "Assorted" +#: templates/core/announcement/list.html:19 +msgid "Valid from" msgstr "" -#: templates/core/group_full.html:8 -msgid "Group" +#: templates/core/announcement/list.html:20 +msgid "Valid until" msgstr "" -#: templates/core/group_full.html:19 -msgid "Details" +#: templates/core/announcement/list.html:21 +msgid "Recipients" msgstr "" -#: templates/core/group_full.html:28 -msgid "Owners" +#: templates/core/announcement/list.html:22 +msgid "Actions" msgstr "" -#: templates/core/group_full.html:31 -msgid "Members" +#: templates/core/announcement/list.html:36 templates/core/group_full.html:15 +#: templates/core/person_full.html:15 +msgid "Edit" +msgstr "" + +#: templates/core/announcement/list.html:42 +msgid "Delete" msgstr "" -#: templates/core/group_full.html:35 -msgid "Group not found" +#: templates/core/announcement/list.html:50 +msgid "There are no announcements." msgstr "" -#: templates/core/group_full.html:38 +#: templates/core/announcements.html:9 templates/core/announcements.html:36 +#, python-format msgid "" "\n" -" There is no group with this id.\n" -" " +" Valid for %(from)s\n" +" " msgstr "" -#: templates/core/index.html:8 +#: templates/core/announcements.html:13 +#, python-format msgid "" "\n" -" AlekSIS (School Information System)\n" -" " +" Valid from %(from)s until %(until)s\n" +" " msgstr "" -#: templates/core/index.html:16 +#: templates/core/announcements.html:40 +#, python-format msgid "" "\n" -" AlekSIS is a web-based school information system (SIS) which can be " -"used to\n" -" manage and/or publish organisational data of educational " -"institutions.\n" -" " +" Valid for %(from)s – %(until)s\n" +" " msgstr "" -#: templates/core/language_form.html:5 -msgid "Language" +#: templates/core/base.html:54 +msgid "Logged in as" msgstr "" -#: templates/core/no_person.html:8 -msgid "" -"\n" -" You are not linked to a person\n" -" " +#: templates/core/base.html:146 +msgid "Impress" msgstr "" -#: templates/core/no_person.html:13 -msgid "" -"\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +#: templates/core/base.html:154 +msgid "Privacy Policy" msgstr "" -#: templates/core/person_full.html:8 templates/core/persons_accounts.html:41 -msgid "Person" +#: templates/core/base_print.html:60 +msgid "Powered by AlekSIS" msgstr "" -#: templates/core/person_full.html:19 -msgid "Contact details" +#: templates/core/edit_group.html:6 templates/core/edit_group.html:7 +msgid "Edit group" +msgstr "" + +#: templates/core/edit_person.html:8 templates/core/edit_person.html:9 +msgid "Edit person" +msgstr "" + +#: templates/core/edit_school.html:8 templates/core/edit_school.html:9 +msgid "Edit school" +msgstr "" + +#: templates/core/group_full.html:19 +msgid "Owners" +msgstr "" + +#: templates/core/group_full.html:22 +msgid "Members" +msgstr "" + +#: templates/core/groups.html:14 +msgid "Create group" +msgstr "" + +#: templates/core/index.html:4 +msgid "Home" +msgstr "" + +#: templates/core/index.html:11 +msgid "AlekSIS (School Information System)" +msgstr "" + +#: templates/core/index.html:43 +msgid "Last activities" +msgstr "" + +#: templates/core/index.html:61 +msgid "No activities available yet." +msgstr "" + +#: templates/core/index.html:66 +msgid "Recent notifications" +msgstr "" + +#: templates/core/index.html:82 +msgid "More information →" msgstr "" -#: templates/core/person_full.html:70 -msgid "Person not found" +#: templates/core/index.html:89 +msgid "No notifications available yet." msgstr "" -#: templates/core/person_full.html:73 +#: templates/core/no_person.html:11 msgid "" "\n" -" There is no person with this id.\n" +" Your user account is not linked to a person. This means you\n" +" cannot access any school-related information. Please contact\n" +" the managers of AlekSIS at your school.\n" " " msgstr "" -#: templates/core/persons_accounts.html:17 -#: templates/core/persons_accounts.html:20 +#: templates/core/offline.html:6 +msgid "No internet connection." +msgstr "" + +#: templates/core/offline.html:9 +msgid "" +"\n" +" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators:\n" +" " +msgstr "" + +#: templates/core/person_full.html:19 +msgid "Contact details" +msgstr "" + +#: templates/core/persons_accounts.html:7 +#: templates/core/persons_accounts.html:9 msgid "Link persons to accounts" msgstr "" -#: templates/core/persons_accounts.html:26 +#: templates/core/persons_accounts.html:16 msgid "" "\n" " You can use this form to assign user accounts to persons. Use the\n" -" dropdowns to select existing accounts; use the text fields to create " -"new\n" +" dropdowns to select existing accounts; use the text fields to create new\n" " accounts on-the-fly. The latter will create a new account with the\n" " entered username and copy all other details from the person.\n" " " msgstr "" -#: templates/core/persons_accounts.html:42 +#: templates/core/persons_accounts.html:31 +#: templates/core/persons_accounts.html:55 +msgid "Update" +msgstr "" + +#: templates/core/persons_accounts.html:37 msgid "Existing account" msgstr "" -#: templates/core/persons_accounts.html:43 +#: templates/core/persons_accounts.html:38 msgid "New account" msgstr "" -#: templates/core/persons_accounts.html:59 -msgid "Update" +#: templates/core/save_button.html:3 +msgid "Save" msgstr "" -#: templates/core/school_management.html:5 +#: templates/core/school_management.html:6 #: templates/core/school_management.html:7 msgid "School management" msgstr "" @@ -463,60 +715,514 @@ msgstr "" msgid "System checks" msgstr "" -#: templates/core/system_status.html:18 +#: templates/core/system_status.html:21 msgid "Maintenance mode enabled" msgstr "" -#: templates/core/system_status.html:19 -msgid "Only admin and visitors from internal IPs can access the site." +#: templates/core/system_status.html:23 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access thesite.\n" +" " msgstr "" -#: templates/core/system_status.html:24 +#: templates/core/system_status.html:34 msgid "Maintenance mode disabled" msgstr "" -#: templates/core/system_status.html:25 +#: templates/core/system_status.html:35 msgid "Everyone can access the site." msgstr "" -#: templates/core/system_status.html:33 +#: templates/core/system_status.html:45 msgid "Debug mode enabled" msgstr "" -#: templates/core/system_status.html:34 +#: templates/core/system_status.html:47 msgid "" -"The web server throws back debug information on errors. Do not use in " -"production!" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " msgstr "" -#: templates/core/system_status.html:39 +#: templates/core/system_status.html:54 msgid "Debug mode disabled" msgstr "" -#: templates/core/system_status.html:40 -msgid "Debug mode is disabled. Default error pages are displayed on errors." -msgstr "" - -#: templates/core/system_status.html:50 -msgid "Recent backup cron jobs" +#: templates/core/system_status.html:56 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " msgstr "" #: templates/impersonate/list_users.html:8 msgid "Impersonate user" msgstr "" -#: views.py:143 +#: templates/martor/editor.html:27 +msgid "Uploading... please wait..." +msgstr "" + +#: templates/martor/editor.html:36 +msgid "Nothing to preview" +msgstr "" + +#: templates/martor/emoji.html:4 +msgid "Select Emoji to Insert" +msgstr "" + +#: templates/martor/emoji.html:8 +msgid "Preparing emojis..." +msgstr "" + +#: templates/martor/guide.html:8 +msgid "Markdown Guide" +msgstr "" + +#: templates/martor/guide.html:9 +#, python-format +msgid "" +"This site is powered by Markdown. For full\n" +" documentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">click here</a>" +msgstr "" + +#: templates/martor/guide.html:15 templates/martor/toolbar.html:42 +msgid "Code" +msgstr "" + +#: templates/martor/guide.html:16 +msgid "Or" +msgstr "" + +#: templates/martor/guide.html:19 +msgid "... to Get" +msgstr "" + +#: templates/martor/toolbar.html:3 +msgid "Bold" +msgstr "" + +#: templates/martor/toolbar.html:6 +msgid "Italic" +msgstr "" + +#: templates/martor/toolbar.html:10 +msgid "Horizontal Line" +msgstr "" + +#: templates/martor/toolbar.html:15 +msgid "Heading" +msgstr "" + +#: templates/martor/toolbar.html:20 templates/martor/toolbar.html:23 +#: templates/martor/toolbar.html:26 +msgid "H" +msgstr "" + +#: templates/martor/toolbar.html:31 +msgid "Pre or Code" +msgstr "" + +#: templates/martor/toolbar.html:38 +msgid "Pre" +msgstr "" + +#: templates/martor/toolbar.html:48 +msgid "Quote" +msgstr "" + +#: templates/martor/toolbar.html:52 +msgid "Unordered List" +msgstr "" + +#: templates/martor/toolbar.html:56 +msgid "Ordered List" +msgstr "" + +#: templates/martor/toolbar.html:60 +msgid "URL/Link" +msgstr "" + +#: templates/martor/toolbar.html:82 +msgid "Full Screen" +msgstr "" + +#: templates/martor/toolbar.html:86 +msgid "Markdown Guide (Help)" +msgstr "" + +#: templates/two_factor/_base_focus.html:6 +#: templates/two_factor/core/otp_required.html:22 +#: templates/two_factor/core/setup.html:5 +#: templates/two_factor/profile/profile.html:87 +msgid "Enable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:15 +#: templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:5 +#: templates/two_factor/core/backup_tokens.html:9 +#: templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "" + +#: templates/two_factor/core/login.html:17 +msgid "Enter your credentials." +msgstr "" + +#: templates/two_factor/core/login.html:20 +msgid "" +"We are calling your phone right now, please enter the\n" +" digits you hear." +msgstr "" + +#: templates/two_factor/core/login.html:23 +msgid "" +"We sent you a text message, please enter the tokens we\n" +" sent." +msgstr "" + +#: templates/two_factor/core/login.html:26 +msgid "" +"Please enter the tokens generated by your token\n" +" generator." +msgstr "" + +#: templates/two_factor/core/login.html:30 +msgid "" +"Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account." +msgstr "" + +#: templates/two_factor/core/login.html:47 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "" + +#: templates/two_factor/core/login.html:57 +msgid "As a last resort, you can use a backup token:" +msgstr "" + +#: templates/two_factor/core/login.html:60 +msgid "Use Backup Token" +msgstr "" + +#: templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "" + +#: templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" + +#: templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" + +#: templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + +#: templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "" + +#: templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" + +#: templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" + +#: templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" smartphone to scan the QR code below. For example, use Google\n" +" Authenticator. Then, enter the token generated by the app.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:5 +#: templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:24 +#: templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:28 +#: templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:52 +#: templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "" + +#: templates/two_factor/profile/disable.html:5 +#: templates/two_factor/profile/disable.html:9 +#: templates/two_factor/profile/profile.html:63 +#: templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "" + +#: templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "" + +#: templates/two_factor/profile/profile.html:5 +#: templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "" + +#: templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "" + +#: templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "" + +#: templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "" + +#: templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "" + +#: templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" + +#: templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "" + +#: templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" + +#: templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + +#: templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "" + +#: templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" + +#: templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" + +#: util/notifications.py:66 +msgid "E-Mail" +msgstr "" + +#: util/notifications.py:67 +msgid "SMS" +msgstr "" + +#: views.py:172 msgid "The person has been saved." msgstr "" -#: views.py:166 +#: views.py:195 msgid "The group has been saved." msgstr "" -#: views.py:211 +#: views.py:236 msgid "The school has been saved." msgstr "" -#: views.py:230 +#: views.py:255 msgid "The term has been saved." msgstr "" + +#: views.py:272 +msgid "You are not allowed to mark notifications from other users as read!" +msgstr "" + +#: views.py:307 +msgid "The announcement has been saved." +msgstr "" + +#: views.py:320 +msgid "The announcement has been deleted." +msgstr "" diff --git a/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po b/aleksis/core/locale/ar/LC_MESSAGES/djangojs.po index 335d14ad4e58736619502c3176135bb205d8dbe2..f20797d98cc1b2033821636f574477d9e07e1adb 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: 2020-01-21 21:04+0000\n" +"POT-Creation-Date: 2020-03-30 09:18+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" @@ -16,8 +16,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "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" +"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" #: static/js/main.js:21 msgid "Today" diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po index 9ae328e185525ff9f6860c63a2b5811c8c70cb89..ccd9c971f5d0615838e6d81eb5b9c56f6344601a 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/django.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/django.po @@ -7,10 +7,11 @@ msgid "" msgstr "" "Project-Id-Version: AlekSIS (School Information System) 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-01-01 20:19+0000\n" -"PO-Revision-Date: 2019-09-17 21:08+0000\n" +"POT-Creation-Date: 2020-03-30 09:18+0000\n" +"PO-Revision-Date: 2020-04-14 18:42+0000\n" "Last-Translator: Tom Teichler <tom.teichler@teckids.org>\n" -"Language-Team: German <https://translate.edugit.org/projects/aleksis/biscuit-ng/de/>\n" +"Language-Team: German <https://translate.edugit.org/projects/aleksis/aleksis/" +"de/>\n" "Language: de_DE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,394 +19,685 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.8\n" -#: aleksis/core/forms.py:30 aleksis/core/forms.py:85 +#: forms.py:38 forms.py:93 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." +msgstr "Sie können keine neuen Benutzer erstellen, wenn Sie gleichzeitig einen existierenden Benutzer auswählen." -#: aleksis/core/forms.py:33 aleksis/core/forms.py:88 +#: forms.py:41 forms.py:96 msgid "This username is already in use." msgstr "Dieser Benutzername wird bereits genutzt." -#: aleksis/core/forms.py:75 +#: forms.py:83 msgid "New user" msgstr "Neuer Benutzer" -#: aleksis/core/forms.py:75 +#: forms.py:83 msgid "Create a new account" msgstr "Neues Benutzerkonto erstellen" -#: aleksis/core/menus.py:7 aleksis/core/templates/registration/login.html:21 -#: aleksis/core/templates/two_factor/core/login.html:6 -#: aleksis/core/templates/two_factor/core/login.html:59 +#: forms.py:149 forms.py:152 +msgid "Date" +msgstr "Datum" + +#: forms.py:150 forms.py:153 +msgid "Time" +msgstr "Zeit" + +#: forms.py:155 menus.py:127 models.py:95 templates/core/persons.html:8 +#: templates/core/persons.html:9 +msgid "Persons" +msgstr "Personen" + +#: forms.py:156 menus.py:133 models.py:232 templates/core/groups.html:8 +#: templates/core/groups.html:9 templates/core/person_full.html:79 +msgid "Groups" +msgstr "Gruppen" + +#: forms.py:160 +msgid "From when until when should the announcement be displayed?" +msgstr "Von wann bis wann soll die Ankündigung angezeigt werden?" + +#: forms.py:163 +msgid "Who should see the announcement?" +msgstr "Wer soll die Ankündigung sehen?" + +#: forms.py:164 +msgid "Write your announcement:" +msgstr "Schreiben Sie ihre Ankündigung:" + +#: forms.py:203 +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." + +#: forms.py:207 +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." + +#: forms.py:215 +msgid "You need at least one recipient." +msgstr "Sie benötigen mindestens einen Empfänger." + +#: menus.py:7 templates/registration/login.html:21 +#: templates/two_factor/core/login.html:6 +#: templates/two_factor/core/login.html:10 +#: templates/two_factor/core/login.html:64 msgid "Login" msgstr "Anmelden" -#: aleksis/core/menus.py:13 +#: menus.py:13 +msgid "Dashboard" +msgstr "Dashboard" + +#: menus.py:19 msgid "Account" msgstr "Konto" -#: aleksis/core/menus.py:20 +#: menus.py:26 msgid "Stop impersonation" msgstr "Verkleidung beenden" -#: aleksis/core/menus.py:29 aleksis/core/templates/core/base.html:49 +#: menus.py:35 templates/core/base.html:56 msgid "Logout" msgstr "Abmelden" -#: aleksis/core/menus.py:35 +#: menus.py:41 msgid "Two factor auth" -msgstr "" +msgstr "Zwei-Faktor-Authentifizierung" -#: aleksis/core/menus.py:46 +#: menus.py:52 msgid "Admin" msgstr "Admin" -#: aleksis/core/menus.py:55 aleksis/core/templates/core/data_management.html:6 +#: menus.py:61 models.py:395 templates/core/announcement/list.html:7 +#: templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "Ankündigungen" + +#: menus.py:70 templates/core/data_management.html:6 +#: templates/core/data_management.html:7 msgid "Data management" msgstr "Datenverwaltung" -#: aleksis/core/menus.py:64 aleksis/core/templates/core/system_status.html:7 +#: menus.py:79 templates/core/system_status.html:5 +#: templates/core/system_status.html:7 msgid "System status" msgstr "System-Status" -#: aleksis/core/menus.py:73 +#: menus.py:88 msgid "Impersonation" msgstr "Verkleidung" -#: aleksis/core/menus.py:82 +#: menus.py:97 msgid "Manage school" msgstr "Schulverwaltung" -#: aleksis/core/menus.py:93 +#: menus.py:106 +msgid "Backend Admin" +msgstr "Backend-Administration" + +#: menus.py:117 msgid "People" msgstr "Leute" -#: aleksis/core/menus.py:102 aleksis/core/templates/core/persons.html:8 -#: aleksis/core/templates/core/persons.html:10 -msgid "Persons" -msgstr "Personen" - -#: aleksis/core/menus.py:107 aleksis/core/templates/core/groups.html:8 -#: aleksis/core/templates/core/groups.html:10 -#: aleksis/core/templates/core/person_full.html:66 -msgid "Groups" -msgstr "Gruppen" - -#: aleksis/core/menus.py:112 +#: menus.py:139 msgid "Persons and accounts" msgstr "Personen und Konten" -#: aleksis/core/menus.py:123 -msgid "Website" -msgstr "Website" - -#: aleksis/core/menus.py:129 +#: menus.py:152 msgid "Edit school information" msgstr "Schulinformationen bearbeiten" -#: aleksis/core/menus.py:130 aleksis/core/templates/core/edit_schoolterm.html:8 +#: menus.py:153 templates/core/edit_schoolterm.html:8 +#: templates/core/edit_schoolterm.html:9 msgid "Edit school term" msgstr "Schuljahr bearbeiten" -#: aleksis/core/migrations/0001_initial.py:15 -msgid "Default school" -msgstr "Standardschule" - -#: aleksis/core/migrations/0002_school_term.py:15 -msgid "Default term" -msgstr "Standardschuljahr" - -#: aleksis/core/models.py:35 +#: models.py:31 models.py:517 msgid "Name" msgstr "Name" -#: aleksis/core/models.py:37 +#: models.py:33 msgid "Official name" msgstr "Offizieller Name" -#: aleksis/core/models.py:39 +#: models.py:35 msgid "Official name of the school, e.g. as given by supervisory authority" -msgstr "" -"Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist" +msgstr "Offizieller Name der Schule, wie er z.B. von der Behörde vorgegeben ist" -#: aleksis/core/models.py:42 +#: models.py:38 msgid "School logo" msgstr "Schullogo" -#: aleksis/core/models.py:58 +#: models.py:51 +msgid "School" +msgstr "Schule" + +#: models.py:52 +msgid "Schools" +msgstr "Schulen" + +#: models.py:60 msgid "Visible caption of the term" msgstr "Sichtbare Beschriftung des Schuljahres" -#: aleksis/core/models.py:60 +#: models.py:62 msgid "Effective start date of term" msgstr "Startdatum des Schuljahres" -#: aleksis/core/models.py:61 +#: models.py:63 msgid "Effective end date of term" msgstr "Enddatum des Schuljahres" -#: aleksis/core/models.py:79 +#: models.py:83 +msgid "School term" +msgstr "Schuljahr" + +#: models.py:84 +msgid "School terms" +msgstr "Schuljahre" + +#: models.py:94 templates/core/persons_accounts.html:36 +msgid "Person" +msgstr "Person" + +#: models.py:97 msgid "female" msgstr "weiblich" -#: aleksis/core/models.py:79 +#: models.py:97 msgid "male" msgstr "männlich" -#: aleksis/core/models.py:84 +#: models.py:102 msgid "Is person active?" msgstr "Ist die Person aktiv?" -#: aleksis/core/models.py:86 +#: models.py:104 msgid "First name" msgstr "Vorname" -#: aleksis/core/models.py:87 +#: models.py:105 msgid "Last name" msgstr "Nachname" -#: aleksis/core/models.py:89 +#: models.py:107 msgid "Additional name(s)" msgstr "Zusätzliche Namen" -#: aleksis/core/models.py:93 +#: models.py:111 msgid "Short name" msgstr "Kurzname" -#: aleksis/core/models.py:96 +#: models.py:114 msgid "Street" msgstr "Straße" -#: aleksis/core/models.py:97 +#: models.py:115 msgid "Street number" msgstr "Hausnummer" -#: aleksis/core/models.py:98 +#: models.py:116 msgid "Postal code" msgstr "Postleitzahl" -#: aleksis/core/models.py:99 +#: models.py:117 msgid "Place" msgstr "Ort" -#: aleksis/core/models.py:101 +#: models.py:119 msgid "Home phone" msgstr "Festnetz" -#: aleksis/core/models.py:102 +#: models.py:120 msgid "Mobile phone" msgstr "Handy" -#: aleksis/core/models.py:104 +#: models.py:122 msgid "E-mail address" msgstr "E-Mail-Adresse" -#: aleksis/core/models.py:106 +#: models.py:124 msgid "Date of birth" msgstr "Geburtsdatum" -#: aleksis/core/models.py:107 +#: models.py:125 msgid "Sex" msgstr "Geschlecht" -#: aleksis/core/models.py:109 +#: models.py:127 msgid "Photo" msgstr "Foto" -#: aleksis/core/models.py:113 +#: models.py:131 models.py:249 msgid "Reference ID of import source" msgstr "Referenz-ID der Import-Quelle" -#: aleksis/core/models.py:122 +#: models.py:140 msgid "Guardians / Parents" msgstr "Erziehungsberechtigte / Eltern" -#: aleksis/core/models.py:163 +#: models.py:231 +msgid "Group" +msgstr "Gruppe" + +#: models.py:234 msgid "Long name of group" msgstr "Langer Name der Gruppe" -#: aleksis/core/models.py:164 +#: models.py:235 msgid "Short name of group" msgstr "Kurzer Name der Gruppe" -#: aleksis/core/models.py:173 +#: models.py:244 msgid "Parent groups" msgstr "Übergeordnete Gruppen" -#: aleksis/core/settings.py:213 +#: models.py:268 models.py:285 models.py:363 +#: templates/core/announcement/list.html:18 +msgid "Title" +msgstr "Titel" + +#: models.py:269 models.py:286 models.py:364 +msgid "Description" +msgstr "Beschreibung" + +#: models.py:271 +msgid "Application" +msgstr "Anwendung" + +#: models.py:277 +msgid "Activity" +msgstr "Aktivität" + +#: models.py:278 +msgid "Activities" +msgstr "Aktivitäten" + +#: models.py:282 +msgid "Sender" +msgstr "Absender" + +#: models.py:287 models.py:365 models.py:518 +msgid "Link" +msgstr "Link" + +#: models.py:289 +msgid "Read" +msgstr "Gelesen" + +#: models.py:290 +msgid "Sent" +msgstr "Versandt" + +#: models.py:301 +msgid "Notification" +msgstr "Benachrichtigung" + +#: models.py:302 +msgid "Notifications" +msgstr "Benachrichtigungen" + +#: models.py:368 +msgid "Date and time from when to show" +msgstr "Datum und Uhrzeit des Anzeigestarts" + +#: models.py:371 +msgid "Date and time until when to show" +msgstr "" + +#: models.py:394 +msgid "Announcement" +msgstr "Ankündigung" + +#: models.py:422 +msgid "Announcement recipient" +msgstr "Empfänger der Ankündigung" + +#: models.py:423 +msgid "Announcement recipients" +msgstr "Empfänger der Ankündigung" + +#: models.py:473 +msgid "Widget Title" +msgstr "Widget-Titel" + +#: models.py:474 +msgid "Activate Widget" +msgstr "Widget aktivieren" + +#: models.py:486 +msgid "Dashboard Widget" +msgstr "Dashboard-Widget" + +#: models.py:487 +msgid "Dashboard Widgets" +msgstr "Dashboard-Widgets" + +#: models.py:491 +msgid "Menu ID" +msgstr "Menü-ID" + +#: models.py:492 +msgid "Menu name" +msgstr "Menü-Name" + +#: models.py:509 +msgid "Custom menu" +msgstr "Benutzerdefiniertes Menü" + +#: models.py:510 +msgid "Custom menus" +msgstr "Benutzerdefinierte Menüs" + +#: models.py:515 +msgid "Menu" +msgstr "Menü" + +#: models.py:520 +msgid "Icon" +msgstr "Icon" + +#: models.py:527 +msgid "Custom menu item" +msgstr "Benutzerdefiniertes Menüelement" + +#: models.py:528 +msgid "Custom menu items" +msgstr "Benutzerdefinierte Menüelemente" + +#: settings.py:254 msgid "German" msgstr "Deutsch" -#: aleksis/core/settings.py:214 +#: settings.py:255 msgid "English" msgstr "Englisch" -#: aleksis/core/templates/403.html:5 -msgid "Forbidden" -msgstr "Verboten" +#: settings.py:373 +msgid "Site title" +msgstr "Seitentitel" + +#: settings.py:374 +msgid "Site description" +msgstr "Seitenbeschreibung" + +#: settings.py:375 +msgid "Primary colour" +msgstr "Primärfarbe" + +#: settings.py:376 +msgid "Secondary colour" +msgstr "Akzentfarbe" + +#: settings.py:377 +msgid "Mail out name" +msgstr "Ausgangsmailname" + +#: settings.py:378 +msgid "Mail out address" +msgstr "E-Mail-Ausgangsadresse" + +#: settings.py:379 +msgid "Link to privacy policy" +msgstr "Link zur Datenschutzerklärung" -#: aleksis/core/templates/403.html:12 -msgid "You are not allowed to access the requested page or object." +#: settings.py:380 +msgid "Link to imprint" +msgstr "Link zum Impressum" + +#: settings.py:381 +msgid "Name format of adresses" +msgstr "Namensformat von Anreden" + +#: settings.py:382 +msgid "Channels to allow for notifications" +msgstr "Kanäle, welche für Benachrichtigungen erlaubt sind" + +#: settings.py:383 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "Regulärer Ausdruck um Primärgruppen zu finden, z. B. '^Class .*'" + +#: templates/403.html:10 +msgid "Error (403): You are not allowed to access the requested page or object." msgstr "" -"Es ist Ihnen nicht erlaubt, auf die angefragte Seite oder das angefragte " -"Objekt zuzugreifen." +"Fehler(403): Es ist Ihnen nicht erlaubt, auf die angefragte Seite oder das " +"angefragte Objekt zuzugreifen." -#: aleksis/core/templates/403.html:16 aleksis/core/templates/404.html:20 +#: templates/403.html:12 msgid "" "\n" -" If you think this is an error in AlekSIS, please contact your site\n" -" administrators.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" "\n" -" Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS " +" Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS " "handelt, kontaktieren Sie bitte einen Ihrer\n" " Systemadministratoren:\n" -" " - -#: aleksis/core/templates/404.html:5 -msgid "Not found" -msgstr "Nicht gefunden" +" " -#: aleksis/core/templates/404.html:12 -msgid "The requested page or object was not found." -msgstr "Die angefragte Seite oder das angefragte Objekt wurde nicht gefunden." +#: templates/404.html:10 +msgid "Error (404): The requested page or object was not found." +msgstr "" +"Fehler (404): Die angefragte Seite oder das angefragte Objekt wurde nicht " +"gefunden." -#: aleksis/core/templates/404.html:16 +#: templates/404.html:12 +#, fuzzy +#| msgid "" +#| "\n" +#| " If you were redirected by a link on an external page,\n" +#| " it is possible that that link was outdated.\n" +#| " " msgid "" "\n" -" If you were redirected by a link on an external page,\n" -" it is possible that that link was outdated.\n" -" " +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" +" " msgstr "" "\n" -" Wenn Sie über einen Link auf einer externen Seite hierher gelangt sind, " -"ist es möglich, dass dieser veraltet war.\n" -" " - -#: aleksis/core/templates/500.html:5 -msgid "Internal Server Error" -msgstr "Interner Serverfehler" +" Wenn Sie über einen Link auf einer externen Seite hierher gelangt " +"sind, ist es möglich, dass dieser veraltet war.\n" +" " -#: aleksis/core/templates/500.html:12 +#: templates/404.html:16 msgid "" "\n" -" An unexpected error has occured.\n" +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" " " msgstr "" "\n" -" Ein unerwarteter Fehler ist aufgetreten.\n" +" Wenn Sie der Meinung sind, dass es sich um einen Fehler in AlekSIS " +"handelt, kontaktieren Sie bitte einen Ihrer\n" +" Systemadministratoren:\n" " " -#: aleksis/core/templates/500.html:18 +#: templates/500.html:10 +msgid "Error (500): An unexpected error has occured.." +msgstr "Error (500): Ein unerwarteter Fehler ist aufgetreten.." + +#: templates/500.html:12 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" +" Your site administrators will automatically be notified about this\n" " error.\n" -" " +" " msgstr "" "\n" -" Ihre Administratoren werden automatisch über diesen Fehler informiert.\n" -" " +" Ihre Administratoren werden automatisch über diesen Fehler informiert." +"\n" +" " -#: aleksis/core/templates/503.html:5 -msgid "Maintenance mode" -msgstr "Wartungsmodus" +#: templates/503.html:10 +msgid "The maintenance mode is currently enabled. Please try again later." +msgstr "Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später erneut." -#: aleksis/core/templates/503.html:12 +#: templates/503.html:12 msgid "" "\n" -" The maintenance mode is currently enabled. Please try again later.\n" -" " +" This page is currently unavailable. If this error stays, contact your site administrators:\n" +" " msgstr "" "\n" -" Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später " -"erneut.\n" -" " +" Diese Seite ist aktuell nicht erreichbar. Wenn dieser Fehler bestehen " +"bleibt, kontaktieren Sie bitte einen Ihrer\n" +" Systemadministratoren:\n" +" " -#: aleksis/core/templates/core/base.html:47 -msgid "Logged in as" -msgstr "" +#: templates/core/announcement/form.html:10 +#: templates/core/announcement/form.html:17 +msgid "Edit announcement" +msgstr "Ankündigung bearbeiten" -#: aleksis/core/templates/core/edit_group.html:16 -#: aleksis/core/templates/core/edit_group.html:18 -msgid "Edit group" -msgstr "Gruppe editieren" +#: templates/core/announcement/form.html:12 +msgid "Publish announcement" +msgstr "Ankündigung veröffentlichen" -#: aleksis/core/templates/core/edit_person.html:7 -#: aleksis/core/templates/core/edit_person.html:9 -msgid "Edit person" -msgstr "Person editieren" +#: templates/core/announcement/form.html:19 +#: templates/core/announcement/list.html:13 +msgid "Publish new announcement" +msgstr "Neue Ankündigung veröffentlichen" -#: aleksis/core/templates/core/edit_school.html:8 -msgid "Edit school" -msgstr "Schule bearbeiten" +#: templates/core/announcement/form.html:30 +msgid "Save und publish announcement" +msgstr "Ankündigung speichern und veröffentlichen" -#: aleksis/core/templates/core/group_full.html:8 -msgid "Group" -msgstr "Gruppe" +#: templates/core/announcement/list.html:19 +msgid "Valid from" +msgstr "Gültig von" -#: aleksis/core/templates/core/group_full.html:19 -msgid "Details" -msgstr "Details" +#: templates/core/announcement/list.html:20 +msgid "Valid until" +msgstr "Gültig bis" -#: aleksis/core/templates/core/group_full.html:28 -msgid "Owners" -msgstr "Leiter/-innen" +#: templates/core/announcement/list.html:21 +msgid "Recipients" +msgstr "Empfänger" -#: aleksis/core/templates/core/group_full.html:31 -msgid "Members" -msgstr "Mitglieder" +#: templates/core/announcement/list.html:22 +msgid "Actions" +msgstr "Aktionen" + +#: templates/core/announcement/list.html:36 templates/core/group_full.html:15 +#: templates/core/person_full.html:15 +msgid "Edit" +msgstr "Bearbeiten" -#: aleksis/core/templates/core/group_full.html:35 -msgid "Group not found" -msgstr "Gruppe nicht gefunden" +#: templates/core/announcement/list.html:42 +msgid "Delete" +msgstr "Löschen" -#: aleksis/core/templates/core/group_full.html:38 +#: templates/core/announcement/list.html:50 +msgid "There are no announcements." +msgstr "Es gibt aktuell keine Ankündigungen." + +#: templates/core/announcements.html:9 templates/core/announcements.html:36 +#, python-format msgid "" "\n" -" There is no group with this id.\n" -" " +" Valid for %(from)s\n" +" " msgstr "" "\n" -" Es existiert keine Gruppe mit dieser ID.\n" -" " +" Gültig für %(from)s\n" +" " -#: aleksis/core/templates/core/index.html:8 +#: templates/core/announcements.html:13 +#, python-format msgid "" "\n" -" AlekSIS (School Information System)\n" -" " +" Valid from %(from)s until %(until)s\n" +" " msgstr "" "\n" -" AlekSIS (Schulinformationssystem)\n" -" " +" Gültig von %(from)s bis %(until)s\n" +" " -#: aleksis/core/templates/core/index.html:16 +#: templates/core/announcements.html:40 +#, python-format msgid "" "\n" -" AlekSIS is a web-based school information system (SIS) which can be " -"used to\n" -" manage and/or publish organisational data of educational " -"institutions.\n" -" " +" Valid for %(from)s – %(until)s\n" +" " msgstr "" "\n" -" AlekSIS ist ein webbasiertes Schul-Informations-System (SIS), das " -"verwendet werden kann, um organisatorische Daten von Bildungseinrichten zu " -"verwalten oder zu publizieren.\n" -" " +" Gültig von %(from)s – %(until)s\n" +" " -#: aleksis/core/templates/core/no_person.html:11 -#, fuzzy -#| msgid "" -#| "\n" -#| " Your user account is not linked to a person. This means you\n" -#| " cannot access any school-related information. Please contact\n" -#| " the managers of AlekSIS at your school.\n" -#| " " +#: templates/core/base.html:54 +msgid "Logged in as" +msgstr "Angemeldet als" + +#: templates/core/base.html:146 +msgid "Impress" +msgstr "Impressum" + +#: templates/core/base.html:154 +msgid "Privacy Policy" +msgstr "Datenschutzerklärung" + +#: templates/core/base_print.html:60 +msgid "Powered by AlekSIS" +msgstr "Betrieben mit AlekSIS" + +#: templates/core/edit_group.html:6 templates/core/edit_group.html:7 +msgid "Edit group" +msgstr "Gruppe editieren" + +#: templates/core/edit_person.html:8 templates/core/edit_person.html:9 +msgid "Edit person" +msgstr "Person editieren" + +#: templates/core/edit_school.html:8 templates/core/edit_school.html:9 +msgid "Edit school" +msgstr "Schule bearbeiten" + +#: templates/core/group_full.html:19 +msgid "Owners" +msgstr "Leiter/-innen" + +#: templates/core/group_full.html:22 +msgid "Members" +msgstr "Mitglieder" + +#: templates/core/groups.html:14 +msgid "Create group" +msgstr "Gruppe erstellen" + +#: templates/core/index.html:4 +msgid "Home" +msgstr "Startseite" + +#: templates/core/index.html:11 +msgid "AlekSIS (School Information System)" +msgstr "AlekSIS (Schulinformationssystem)" + +#: templates/core/index.html:43 +msgid "Last activities" +msgstr "Letzte Aktivitäten" + +#: templates/core/index.html:61 +msgid "No activities available yet." +msgstr "Aktuell keine Aktivitäten verfügbar." + +#: templates/core/index.html:66 +msgid "Recent notifications" +msgstr "Letzte Benachrichtigungen" + +#: templates/core/index.html:82 +msgid "More information →" +msgstr "Mehr Informationen →" + +#: templates/core/index.html:89 +msgid "No notifications available yet." +msgstr "Aktuell keine Benachrichtigungen verfügbar." + +#: templates/core/no_person.html:11 msgid "" "\n" " Your user account is not linked to a person. This means you\n" @@ -414,298 +706,392 @@ msgid "" " " msgstr "" "\n" -" Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das " +" Ihr Benutzerkonto ist nicht mit einer Person verknüpft. Das " "bedeutet, dass Sie\n" -" keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie " +" keine schulbezogenen Informationen aufrufen können. Bitte wenden Sie " "sich an\n" -" die Verwaltenden von AlekSIS an Ihrer Schule.\n" -" " - -#: aleksis/core/templates/core/person_full.html:8 -#: aleksis/core/templates/core/persons_accounts.html:41 -msgid "Person" -msgstr "Person" - -#: aleksis/core/templates/core/person_full.html:19 -msgid "Contact details" -msgstr "Kontaktdetails" +" die Verwaltenden von AlekSIS an Ihrer Schule.\n" +" " -#: aleksis/core/templates/core/person_full.html:70 -msgid "Person not found" -msgstr "Person nicht gefunden" +#: templates/core/offline.html:6 +msgid "No internet connection." +msgstr "Keine Internetverbindung." -#: aleksis/core/templates/core/person_full.html:73 +#: templates/core/offline.html:9 msgid "" "\n" -" There is no person with this id.\n" -" " +" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators:\n" +" " msgstr "" "\n" -" Es existiert keine Person mit dieser ID.\n" -" " +" Es ist ein Fehler beim Aufrufen der Seite aufgetreten. Eventuell " +"haben Sie keine Internetverbindung. Bitte prüfen Sie, ob WLAN oder mobile " +"Daten aktiv sind, und probieren Sie es erneut. Wenn Sie der Meinung sind, " +"dass Sie mit dem Internet verbunden sind, kontaktieren Sie bitte einen Ihrer " +"Systemadministratoren:\n" +" " -#: aleksis/core/templates/core/persons_accounts.html:17 -#: aleksis/core/templates/core/persons_accounts.html:20 +#: templates/core/person_full.html:19 +msgid "Contact details" +msgstr "Kontaktdetails" + +#: templates/core/persons_accounts.html:7 +#: templates/core/persons_accounts.html:9 msgid "Link persons to accounts" msgstr "Personen mit Benutzerkonten verknüpfen" -#: aleksis/core/templates/core/persons_accounts.html:26 +#: templates/core/persons_accounts.html:16 msgid "" "\n" " You can use this form to assign user accounts to persons. Use the\n" -" dropdowns to select existing accounts; use the text fields to create " -"new\n" +" dropdowns to select existing accounts; use the text fields to create new\n" " accounts on-the-fly. The latter will create a new account with the\n" " entered username and copy all other details from the person.\n" " " msgstr "" "\n" -" Sie können dieses Formular nutzen, um Benutzerkonten Personen " -"zuzuweisen. Nutzen Sie das\n" -" Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie " -"das Textfeld, um einen neuen Benutzer zu\n" +" Sie können dieses Formular nutzen, um Benutzerkonten Personen zuzuweisen. Nutzen Sie das\n" +" Auswahlfeld um ein existierendes Benutzerkonto auszuwählen; nutzen Sie das Textfeld, um einen neuen Benutzer zu\n" " erstellen. Letzteres erstellt ein neues Benutzerkonto mit dem\n" " eingegebenen Benutzernamen und kopiert alle anderen Daten der Person.\n" " " -#: aleksis/core/templates/core/persons_accounts.html:42 +#: templates/core/persons_accounts.html:31 +#: templates/core/persons_accounts.html:55 +msgid "Update" +msgstr "Aktualisieren" + +#: templates/core/persons_accounts.html:37 msgid "Existing account" msgstr "Existierendes Konto" -#: aleksis/core/templates/core/persons_accounts.html:43 +#: templates/core/persons_accounts.html:38 msgid "New account" msgstr "Neues Konto" -#: aleksis/core/templates/core/persons_accounts.html:59 -msgid "Update" -msgstr "Aktualisieren" - -#: aleksis/core/templates/core/save_button.html:3 +#: templates/core/save_button.html:3 msgid "Save" -msgstr "" +msgstr "Speichern" -#: aleksis/core/templates/core/school_management.html:6 +#: templates/core/school_management.html:6 +#: templates/core/school_management.html:7 msgid "School management" msgstr "Schulverwaltung" -#: aleksis/core/templates/core/system_status.html:12 +#: templates/core/system_status.html:12 msgid "System checks" msgstr "Systemprüfungen" -#: aleksis/core/templates/core/system_status.html:21 +#: templates/core/system_status.html:21 msgid "Maintenance mode enabled" msgstr "Wartungsmodus aktiviert" -#: aleksis/core/templates/core/system_status.html:23 -#, fuzzy -#| msgid "Only admin and visitors from internal IPs can access the site." +#: templates/core/system_status.html:23 msgid "" "\n" -" Only admin and visitors from internal IPs can access " -"thesite.\n" +" Only admin and visitors from internal IPs can access thesite.\n" " " msgstr "" -"Nur Administratoren und Besucher von internen IP-Adressen können die Seite " -"aufrufen." +"\n" +" Nur Administratoren und Besucher von internen IP-Adressen " +"können die Seite aufrufen.\n" +" " -#: aleksis/core/templates/core/system_status.html:34 +#: templates/core/system_status.html:34 msgid "Maintenance mode disabled" msgstr "Wartungsmodus deaktiviert" -#: aleksis/core/templates/core/system_status.html:35 +#: templates/core/system_status.html:35 msgid "Everyone can access the site." msgstr "Jeder kann die Seite aufrufen." -#: aleksis/core/templates/core/system_status.html:45 +#: templates/core/system_status.html:45 msgid "Debug mode enabled" msgstr "Debug-Modus aktiviert" -#: aleksis/core/templates/core/system_status.html:47 -#, fuzzy -#| msgid "" -#| "The web server throws back debug information on errors. Do not use in " -#| "production!" +#: templates/core/system_status.html:47 msgid "" "\n" -" The web server throws back debug information on errors. Do " -"not use in production!\n" +" The web server throws back debug information on errors. Do not use in production!\n" " " msgstr "" -"Der Server gibt Debug-Informationen bei Fehlern zurück. Nicht im " -"Produktivbetrieb nutzen!" +"\n" +" Der Server gibt Debug-Informationen bei Fehlern zurück. " +"Nicht im Produktivbetrieb nutzen!\n" +" " -#: aleksis/core/templates/core/system_status.html:54 +#: templates/core/system_status.html:54 msgid "Debug mode disabled" msgstr "Debug-Modus deaktivert" -#: aleksis/core/templates/core/system_status.html:56 -#, fuzzy -#| msgid "Debug mode is disabled. Default error pages are displayed on errors." +#: templates/core/system_status.html:56 msgid "" "\n" -" Debug mode is disabled. Default error pages are displayed on " -"errors.\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" " " msgstr "" -"Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden bei Fehlern " -"angezeigt." - -#: aleksis/core/templates/core/system_status.html:69 -msgid "Recent backup cron jobs" -msgstr "Letzte Backup-Cron-Jobs" +"\n" +" Debug-Modus ist deaktiviert. Standard-Fehlerseiten werden " +"bei Fehlern angezeigt.\n" +" " -#: aleksis/core/templates/impersonate/list_users.html:8 +#: templates/impersonate/list_users.html:8 msgid "Impersonate user" msgstr "Als Benutzer verkleiden" -#: aleksis/core/templates/two_factor/_wizard_actions.html:6 -msgid "Cancel" +#: templates/martor/editor.html:27 +msgid "Uploading... please wait..." +msgstr "Lädt hoch… bitte warten…" + +#: templates/martor/editor.html:36 +msgid "Nothing to preview" +msgstr "Keine Vorschau" + +#: templates/martor/emoji.html:4 +msgid "Select Emoji to Insert" +msgstr "Wählen Sie ein Emoji zum Einfügen aus" + +#: templates/martor/emoji.html:8 +msgid "Preparing emojis..." +msgstr "Bereite Emoji vor…" + +#: templates/martor/guide.html:8 +msgid "Markdown Guide" +msgstr "Markdown-Anleitung" + +#: templates/martor/guide.html:9 +#, python-format +msgid "" +"This site is powered by Markdown. For full\n" +" documentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">click here</a>" msgstr "" +"Diese Seite wird mit Markdown betrieben. Für komplette\n" +" Dokumentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">hier klicken</a>" -#: aleksis/core/templates/two_factor/_wizard_actions.html:14 -#: aleksis/core/templates/two_factor/_wizard_actions.html:19 -msgid "Back" +#: templates/martor/guide.html:15 templates/martor/toolbar.html:42 +msgid "Code" +msgstr "Code" + +#: templates/martor/guide.html:16 +msgid "Or" +msgstr "oder" + +#: templates/martor/guide.html:19 +msgid "... to Get" msgstr "" -#: aleksis/core/templates/two_factor/_wizard_actions.html:24 +#: templates/martor/toolbar.html:3 +msgid "Bold" +msgstr "Fett" + +#: templates/martor/toolbar.html:6 +msgid "Italic" +msgstr "kursiv" + +#: templates/martor/toolbar.html:10 +msgid "Horizontal Line" +msgstr "horizontale Linie" + +#: templates/martor/toolbar.html:15 +msgid "Heading" +msgstr "Überschrift" + +#: templates/martor/toolbar.html:20 templates/martor/toolbar.html:23 +#: templates/martor/toolbar.html:26 +msgid "H" +msgstr "H" + +#: templates/martor/toolbar.html:31 +msgid "Pre or Code" +msgstr "Pre oder Code" + +#: templates/martor/toolbar.html:38 +msgid "Pre" +msgstr "Pre" + +#: templates/martor/toolbar.html:48 +msgid "Quote" +msgstr "Zitat" + +#: templates/martor/toolbar.html:52 +msgid "Unordered List" +msgstr "Unsortierte Liste" + +#: templates/martor/toolbar.html:56 +msgid "Ordered List" +msgstr "Sortierte Liste" + +#: templates/martor/toolbar.html:60 +msgid "URL/Link" +msgstr "URL/Link" + +#: templates/martor/toolbar.html:82 +msgid "Full Screen" +msgstr "Vollbild" + +#: templates/martor/toolbar.html:86 +msgid "Markdown Guide (Help)" +msgstr "Markdown-Anleitung (Hilfe)" + +#: templates/two_factor/_base_focus.html:6 +#: templates/two_factor/core/otp_required.html:22 +#: templates/two_factor/core/setup.html:5 +#: templates/two_factor/profile/profile.html:87 +msgid "Enable Two-Factor Authentication" +msgstr "Zwei-Faktor-Authentifizierung aktivieren" + +#: templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "Abbrechen" + +#: templates/two_factor/_wizard_actions.html:15 +#: templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "Zurück" + +#: templates/two_factor/_wizard_actions.html:26 msgid "Next" -msgstr "" +msgstr "Weiter" -#: aleksis/core/templates/two_factor/core/backup_tokens.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:42 +#: templates/two_factor/core/backup_tokens.html:5 +#: templates/two_factor/core/backup_tokens.html:9 +#: templates/two_factor/profile/profile.html:46 msgid "Backup Tokens" -msgstr "" +msgstr "Backup-Token" -#: aleksis/core/templates/two_factor/core/backup_tokens.html:10 +#: templates/two_factor/core/backup_tokens.html:14 msgid "" "\n" " Backup tokens can be used when your primary and backup\n" " phone numbers aren't available. The backup tokens below can be used\n" -" for login verification. If you've used up all your backup tokens, " -"you\n" -" can generate a new set of backup tokens. Only the backup tokens " -"shown\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" " below will be valid.\n" " " msgstr "" +"\n" +" Backup-Token können genutzt werden, wenn Ihre primären und Backup-\n" +" Telefonnummern nicht verfügbar sind. Die Backup-Tokens unten können " +"für\n" +" die Anmeldungsverifizierung genutzt werden. Wenn Sie alle Backup-" +"Tokens genutzt haben,\n" +" müssen Sie neue generieren. Nur gültige Backup-Tokens werden " +"angezeigt.\n" +" " -#: aleksis/core/templates/two_factor/core/backup_tokens.html:29 -#, fuzzy -#| msgid "" -#| "\n" -#| " There is no person with this id.\n" -#| " " +#: templates/two_factor/core/backup_tokens.html:33 msgid "" "\n" " Print these tokens and keep them somewhere safe.\n" " " msgstr "" "\n" -" Es existiert keine Person mit dieser ID.\n" +" Drucken Sie diese Tokens aus und bewahren Sie sie gut auf.\n" " " -#: aleksis/core/templates/two_factor/core/backup_tokens.html:35 +#: templates/two_factor/core/backup_tokens.html:39 msgid "You don't have any backup codes yet." -msgstr "" +msgstr "Sie haben aktuell keine Backup-Codes." -#: aleksis/core/templates/two_factor/core/backup_tokens.html:41 +#: templates/two_factor/core/backup_tokens.html:45 msgid "Back to Account Security" -msgstr "" +msgstr "Zurück zur Kontosicherheit" -#: aleksis/core/templates/two_factor/core/backup_tokens.html:45 +#: templates/two_factor/core/backup_tokens.html:49 msgid "Generate Tokens" -msgstr "" +msgstr "Tokens generieren" -#: aleksis/core/templates/two_factor/core/login.html:13 +#: templates/two_factor/core/login.html:17 msgid "Enter your credentials." -msgstr "" +msgstr "Geben Sie Ihre Zugangsdaten ein." -#: aleksis/core/templates/two_factor/core/login.html:16 +#: templates/two_factor/core/login.html:20 msgid "" "We are calling your phone right now, please enter the\n" " digits you hear." msgstr "" +"Wir rufen Ihr Telefon jetzt an, bitte geben Sie die\n" +" Zahlen ein, die Sie hören." -#: aleksis/core/templates/two_factor/core/login.html:19 +#: templates/two_factor/core/login.html:23 msgid "" "We sent you a text message, please enter the tokens we\n" " sent." msgstr "" +"Wir haben Ihnen eine Textnachricht geschickt. Bitte geben Sie die Tokens ein," +"\n" +" die wir Ihnen geschickt haben." -#: aleksis/core/templates/two_factor/core/login.html:22 +#: templates/two_factor/core/login.html:26 msgid "" "Please enter the tokens generated by your token\n" " generator." msgstr "" +"Bitte geben Sie den von Ihrem Token-Generator\n" +" generierten Token ein." -#: aleksis/core/templates/two_factor/core/login.html:26 +#: templates/two_factor/core/login.html:30 msgid "" "Use this form for entering backup tokens for logging in.\n" -" These tokens have been generated for you to print and keep safe. " -"Please\n" +" These tokens have been generated for you to print and keep safe. Please\n" " enter one of these backup tokens to login to your account." msgstr "" -#: aleksis/core/templates/two_factor/core/login.html:42 +#: templates/two_factor/core/login.html:47 msgid "Or, alternatively, use one of your backup phones:" -msgstr "" +msgstr "Oder, alternativ, nutzen Sie eins Ihrer Backup-Telefone:" -#: aleksis/core/templates/two_factor/core/login.html:52 +#: templates/two_factor/core/login.html:57 msgid "As a last resort, you can use a backup token:" -msgstr "" +msgstr "Als letzte Möglichkeit können Sie einen Backup-Token nutzen:" -#: aleksis/core/templates/two_factor/core/login.html:55 +#: templates/two_factor/core/login.html:60 msgid "Use Backup Token" -msgstr "" +msgstr "Backup-Token nutzen" -#: aleksis/core/templates/two_factor/core/otp_required.html:5 +#: templates/two_factor/core/otp_required.html:9 msgid "Permission Denied" -msgstr "" +msgstr "Zugriff verwehrt" -#: aleksis/core/templates/two_factor/core/otp_required.html:7 +#: templates/two_factor/core/otp_required.html:10 msgid "" "The page you requested, enforces users to verify using\n" -" two-factor authentication for security reasons. You need to enable " -"these\n" -" security features in order to access this page." +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." msgstr "" -#: aleksis/core/templates/two_factor/core/otp_required.html:11 +#: templates/two_factor/core/otp_required.html:14 msgid "" "Two-factor authentication is not enabled for your\n" -" account. Enable two-factor authentication for enhanced account\n" -" security." +" account. Enable two-factor authentication for enhanced account\n" +" security." msgstr "" -#: aleksis/core/templates/two_factor/core/otp_required.html:16 +#: templates/two_factor/core/otp_required.html:19 msgid "Go back" -msgstr "" +msgstr "Zurück" -#: aleksis/core/templates/two_factor/core/otp_required.html:18 -#: aleksis/core/templates/two_factor/core/setup.html:5 -#: aleksis/core/templates/two_factor/core/setup_complete.html:5 -#: aleksis/core/templates/two_factor/profile/profile.html:82 -msgid "Enable Two-Factor Authentication" -msgstr "" - -#: aleksis/core/templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:9 msgid "Add Backup Phone" -msgstr "" +msgstr "Backup-Telefon hinzufügen" -#: aleksis/core/templates/two_factor/core/phone_register.html:8 +#: templates/two_factor/core/phone_register.html:12 msgid "" "You'll be adding a backup phone number to your\n" -" account. This number will be used if your primary method of\n" -" registration is not available." +" account. This number will be used if your primary method of\n" +" registration is not available." msgstr "" -#: aleksis/core/templates/two_factor/core/phone_register.html:12 +#: templates/two_factor/core/phone_register.html:16 msgid "" "We've sent a token to your phone number. Please\n" -" enter the token you've received." +" enter the token you've received." msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:8 +#: templates/two_factor/core/setup.html:9 msgid "" "\n" " You are about to take your account security to the\n" @@ -714,14 +1100,14 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:16 +#: templates/two_factor/core/setup.html:17 msgid "" "\n" -" Please select which authentication method you would like to use.\n" +" Please select which authentication method you would like to use:\n" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:22 +#: templates/two_factor/core/setup.html:23 msgid "" "\n" " To start using a token generator, please use your\n" @@ -730,7 +1116,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:33 +#: templates/two_factor/core/setup.html:34 msgid "" "\n" " Please enter the phone number you wish to receive the\n" @@ -738,7 +1124,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:40 +#: templates/two_factor/core/setup.html:41 msgid "" "\n" " Please enter the phone number you wish to be called on.\n" @@ -746,35 +1132,31 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:49 +#: templates/two_factor/core/setup.html:50 msgid "" "\n" -" We are calling your phone right now, please enter the digits you " -"hear.\n" +" We are calling your phone right now, please enter the digits you hear.\n" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:55 +#: templates/two_factor/core/setup.html:56 msgid "" "\n" " We sent you a text message, please enter the tokens we sent.\n" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:62 +#: templates/two_factor/core/setup.html:63 msgid "" "\n" -" We've encountered an issue with the selected authentication " -"method. Please\n" -" go back and verify that you entered your information correctly, " -"try\n" -" again, or use a different authentication method instead. If the " -"issue\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" " persists, contact the site administrator.\n" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup.html:72 +#: templates/two_factor/core/setup.html:73 msgid "" "\n" " To identify and verify your YubiKey, please insert a\n" @@ -783,86 +1165,103 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup_complete.html:10 +#: templates/two_factor/core/setup_complete.html:5 +#: templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "Zwei-Faktor-Authentifizierung erfolgreich aktiviert" + +#: templates/two_factor/core/setup_complete.html:14 msgid "" "\n" -" Congratulations, you've successfully enabled two-factor " -"authentication.\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" " " msgstr "" +"\n" +" Gratulation, Sie haben die Zwei-Faktor-Authentifizierung erfolgreich " +"aktiviert.\n" +" " -#: aleksis/core/templates/two_factor/core/setup_complete.html:20 -#: aleksis/core/templates/two_factor/core/setup_complete.html:40 +#: templates/two_factor/core/setup_complete.html:24 +#: templates/two_factor/core/setup_complete.html:44 msgid "Back to Profile" -msgstr "" +msgstr "Zurück zum Profil" -#: aleksis/core/templates/two_factor/core/setup_complete.html:24 -#: aleksis/core/templates/two_factor/core/setup_complete.html:44 -#, fuzzy -#| msgid "Recent backup cron jobs" +#: templates/two_factor/core/setup_complete.html:28 +#: templates/two_factor/core/setup_complete.html:48 msgid "Generate backup codes" -msgstr "Letzte Backup-Cron-Jobs" +msgstr "Backup-Codes generieren" -#: aleksis/core/templates/two_factor/core/setup_complete.html:30 +#: templates/two_factor/core/setup_complete.html:34 msgid "" "\n" " However, it might happen that you don't have access to\n" -" your primary token device. To enable account recovery, generate " -"backup codes\n" +" your primary token device. To enable account recovery, generate backup codes\n" " or add a phone number.\n" " " msgstr "" -#: aleksis/core/templates/two_factor/core/setup_complete.html:48 -#: aleksis/core/templates/two_factor/profile/profile.html:37 +#: templates/two_factor/core/setup_complete.html:52 +#: templates/two_factor/profile/profile.html:41 msgid "Add Phone Number" +msgstr "Telefonnummer hinzufügen" + +#: templates/two_factor/profile/disable.html:5 +#: templates/two_factor/profile/disable.html:9 +#: templates/two_factor/profile/profile.html:63 +#: templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "Zwei-Faktor-Authentifizierung deaktiveren" + +#: templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" msgstr "" +"Sie sind dabei, Zwei-Faktor-Authentifizierung zu deaktivieren. Das " +"verschlechtert Ihre Kontosicherheit. Sind Sie sicher?" -#: aleksis/core/templates/two_factor/profile/profile.html:6 -#, fuzzy -#| msgid "Account" +#: templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "Deaktivieren" + +#: templates/two_factor/profile/profile.html:5 +#: templates/two_factor/profile/profile.html:10 msgid "Account Security" -msgstr "Konto" +msgstr "Kontosicherheit" -#: aleksis/core/templates/two_factor/profile/profile.html:11 +#: templates/two_factor/profile/profile.html:15 msgid "Tokens will be generated by your token generator." -msgstr "" +msgstr "Tokens werden von Ihrem Token-Generator generiert." -#: aleksis/core/templates/two_factor/profile/profile.html:13 +#: templates/two_factor/profile/profile.html:17 #, python-format msgid "Primary method: %(primary)s" -msgstr "" +msgstr "Primäre Methode: %(primary)s" -#: aleksis/core/templates/two_factor/profile/profile.html:15 +#: templates/two_factor/profile/profile.html:19 msgid "Tokens will be generated by your YubiKey." -msgstr "" +msgstr "Tokens werden von Ihrem YubiKey generiert." -#: aleksis/core/templates/two_factor/profile/profile.html:19 +#: templates/two_factor/profile/profile.html:23 msgid "Backup Phone Numbers" -msgstr "" +msgstr "Backup-Telefonnummern" -#: aleksis/core/templates/two_factor/profile/profile.html:20 +#: templates/two_factor/profile/profile.html:24 msgid "" "If your primary method is not available, we are able to\n" " send backup tokens to the phone numbers listed below." msgstr "" -#: aleksis/core/templates/two_factor/profile/profile.html:29 +#: templates/two_factor/profile/profile.html:33 msgid "Unregister" -msgstr "" +msgstr "Abmelden" -#: aleksis/core/templates/two_factor/profile/profile.html:44 +#: templates/two_factor/profile/profile.html:48 msgid "" "If you don't have any device with you, you can access\n" " your account using backup tokens." msgstr "" -#: aleksis/core/templates/two_factor/profile/profile.html:46 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " You are not linked to a person\n" -#| " " +#: templates/two_factor/profile/profile.html:50 +#, python-format msgid "" "\n" " You have only one backup token remaining.\n" @@ -873,23 +1272,18 @@ msgid_plural "" " " msgstr[0] "" "\n" -" Sie sind nicht mit einer Person verknüpft\n" +" Sie haben keinen Backup-Token übrig.\n" " " msgstr[1] "" "\n" -" Sie sind nicht mit einer Person verknüpft\n" +" Sie haben %(counter)s Backup-Tokens übrig.\n" " " -#: aleksis/core/templates/two_factor/profile/profile.html:55 +#: templates/two_factor/profile/profile.html:59 msgid "Show Codes" -msgstr "" - -#: aleksis/core/templates/two_factor/profile/profile.html:59 -#: aleksis/core/templates/two_factor/profile/profile.html:69 -msgid "Disable Two-Factor Authentication" -msgstr "" +msgstr "Codes anzeigen" -#: aleksis/core/templates/two_factor/profile/profile.html:61 +#: templates/two_factor/profile/profile.html:65 msgid "" "\n" " However we strongly discourage you to do so, you can\n" @@ -897,7 +1291,7 @@ msgid "" " " msgstr "" -#: aleksis/core/templates/two_factor/profile/profile.html:74 +#: templates/two_factor/profile/profile.html:78 msgid "" "\n" " Two-factor authentication is not enabled for your\n" @@ -906,22 +1300,114 @@ msgid "" " " msgstr "" -#: aleksis/core/views.py:148 +#: util/notifications.py:66 +msgid "E-Mail" +msgstr "E-Mail" + +#: util/notifications.py:67 +msgid "SMS" +msgstr "SMS" + +#: views.py:172 msgid "The person has been saved." msgstr "Die Person wurde gespeichert." -#: aleksis/core/views.py:171 +#: views.py:195 msgid "The group has been saved." msgstr "Die Gruppe wurde gespeichert." -#: aleksis/core/views.py:216 +#: views.py:236 msgid "The school has been saved." msgstr "Die Schule wurde gespeichert." -#: aleksis/core/views.py:235 +#: views.py:255 msgid "The term has been saved." msgstr "Das Schuljahr wurde gespeichert." +#: views.py:272 +msgid "You are not allowed to mark notifications from other users as read!" +msgstr "" +"Es ist Ihnen nicht erlaubt, Benachrichtigungen von anderen Benutzern als " +"gelesen zu markieren!" + +#: views.py:307 +msgid "The announcement has been saved." +msgstr "Die Ankündigung wurde gespeichert." + +#: views.py:320 +msgid "The announcement has been deleted." +msgstr "Ankündigung wurde gelöscht." + +#~ msgid "Website" +#~ msgstr "Website" + +#~ msgid "Default school" +#~ msgstr "Standardschule" + +#~ msgid "Default term" +#~ msgstr "Standardschuljahr" + +#~ msgid "Forbidden" +#~ msgstr "Verboten" + +#~ msgid "Not found" +#~ msgstr "Nicht gefunden" + +#~ msgid "Internal Server Error" +#~ msgstr "Interner Serverfehler" + +#~ msgid "Maintenance mode" +#~ msgstr "Wartungsmodus" + +#~ msgid "" +#~ "\n" +#~ " The maintenance mode is currently enabled. Please try again later.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später erneut.\n" +#~ " " + +#~ msgid "Details" +#~ msgstr "Details" + +#~ msgid "Group not found" +#~ msgstr "Gruppe nicht gefunden" + +#~ msgid "" +#~ "\n" +#~ " There is no group with this id.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Es existiert keine Gruppe mit dieser ID.\n" +#~ " " + +#~ msgid "" +#~ "\n" +#~ " AlekSIS is a web-based school information system (SIS) which can be used to\n" +#~ " manage and/or publish organisational data of educational institutions.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " AlekSIS ist ein webbasiertes Schul-Informations-System (SIS), das verwendet werden kann, um organisatorische Daten von Bildungseinrichten zu verwalten oder zu publizieren.\n" +#~ " " + +#~ msgid "Person not found" +#~ msgstr "Person nicht gefunden" + +#~ msgid "" +#~ "\n" +#~ " There is no person with this id.\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Es existiert keine Person mit dieser ID.\n" +#~ " " + +#~ msgid "Recent backup cron jobs" +#~ msgstr "Letzte Backup-Cron-Jobs" + #~ msgid "AlekSIS Software" #~ msgstr "AlekSIS-Software" @@ -931,9 +1417,6 @@ msgstr "Das Schuljahr wurde gespeichert." #~ msgid "Get support" #~ msgstr "Unterstützung erhalten" -#~ msgid "Send" -#~ msgstr "Absenden" - #~ msgid "" #~ "\n" #~ " The message was successfully submitted.\n" @@ -943,9 +1426,6 @@ msgstr "Das Schuljahr wurde gespeichert." #~ " Die Nachricht wurde erfolgreich übermittelt.\n" #~ " " -#~ msgid "Edit" -#~ msgstr "Bearbeiten" - #~ msgid "Assorted" #~ msgstr "Unsortiert" @@ -960,8 +1440,3 @@ msgstr "Das Schuljahr wurde gespeichert." #~ msgid "List of all persons" #~ msgstr "Liste aller Personen" - -#~ msgid "The maintenance mode is currently enabled. Please try again later." -#~ msgstr "" -#~ "Der Wartungsmodus ist aktuell aktiviert. Bitte versuchen Sie es später " -#~ "erneut." diff --git a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po index 01864b41af67222125210762c072fb23302fda3a..d62e52377a4ce6af7272b5568c5da2a4698fb057 100644 --- a/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po +++ b/aleksis/core/locale/de_DE/LC_MESSAGES/djangojs.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-01-21 21:04+0000\n" +"POT-Creation-Date: 2020-03-30 09:18+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/fr/LC_MESSAGES/django.po b/aleksis/core/locale/fr/LC_MESSAGES/django.po index 773da185f0b03c5ca21f2819cd0cd0fb72c6bf04..eab71180f8738fad60e761f7a4f138c350b056fd 100644 --- a/aleksis/core/locale/fr/LC_MESSAGES/django.po +++ b/aleksis/core/locale/fr/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: 2019-11-23 10:06+0100\n" +"POT-Creation-Date: 2020-03-30 09:18+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" @@ -18,442 +18,695 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: forms.py:30 forms.py:66 +#: forms.py:38 forms.py:93 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: forms.py:32 forms.py:68 +#: forms.py:41 forms.py:96 msgid "This username is already in use." msgstr "" -#: forms.py:57 +#: forms.py:83 msgid "New user" msgstr "" -#: forms.py:58 +#: forms.py:83 msgid "Create a new account" msgstr "" -#: menus.py:6 -msgid "Account" +#: forms.py:149 forms.py:152 +msgid "Date" msgstr "" -#: menus.py:11 -msgid "Stop impersonation" +#: forms.py:150 forms.py:153 +msgid "Time" msgstr "" -#: menus.py:16 templates/registration/login.html:21 -msgid "Login" +#: forms.py:155 menus.py:127 models.py:95 templates/core/persons.html:8 +#: templates/core/persons.html:9 +msgid "Persons" msgstr "" -#: menus.py:21 -msgid "Logout" +#: forms.py:156 menus.py:133 models.py:232 templates/core/groups.html:8 +#: templates/core/groups.html:9 templates/core/person_full.html:79 +msgid "Groups" msgstr "" -#: menus.py:28 -msgid "Admin" +#: forms.py:160 +msgid "From when until when should the announcement be displayed?" msgstr "" -#: menus.py:33 templates/core/data_management.html:5 -#: templates/core/data_management.html:7 -msgid "Data management" +#: forms.py:163 +msgid "Who should see the announcement?" msgstr "" -#: menus.py:38 templates/core/system_status.html:5 -#: templates/core/system_status.html:7 -msgid "System status" +#: forms.py:164 +msgid "Write your announcement:" msgstr "" -#: menus.py:43 -msgid "Impersonation" +#: forms.py:203 +msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: menus.py:48 -msgid "Manage school" +#: forms.py:207 +msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: menus.py:55 -msgid "People" +#: forms.py:215 +msgid "You need at least one recipient." msgstr "" -#: menus.py:61 templates/core/persons.html:8 templates/core/persons.html:10 -msgid "Persons" +#: menus.py:7 templates/registration/login.html:21 +#: templates/two_factor/core/login.html:6 +#: templates/two_factor/core/login.html:10 +#: templates/two_factor/core/login.html:64 +msgid "Login" msgstr "" -#: menus.py:66 templates/core/groups.html:8 templates/core/groups.html:10 -#: templates/core/person_full.html:66 -msgid "Groups" +#: menus.py:13 +msgid "Dashboard" msgstr "" -#: menus.py:71 -msgid "Persons and accounts" +#: menus.py:19 +msgid "Account" msgstr "" -#: menus.py:80 -msgid "AlekSIS Software" +#: menus.py:26 +msgid "Stop impersonation" msgstr "" -#: menus.py:84 -msgid "Website" +#: menus.py:35 templates/core/base.html:56 +msgid "Logout" msgstr "" -#: menus.py:94 -msgid "Support" +#: menus.py:41 +msgid "Two factor auth" msgstr "" -#: menus.py:98 templates/contact_form/contact_form.html:8 -msgid "Get support" +#: menus.py:52 +msgid "Admin" msgstr "" -#: menus.py:108 -msgid "Edit school information" +#: menus.py:61 models.py:395 templates/core/announcement/list.html:7 +#: templates/core/announcement/list.html:8 +msgid "Announcements" msgstr "" -#: menus.py:112 templates/core/edit_schoolterm.html:7 -#: templates/core/edit_schoolterm.html:9 -msgid "Edit school term" +#: menus.py:70 templates/core/data_management.html:6 +#: templates/core/data_management.html:7 +msgid "Data management" msgstr "" -#: migrations/0001_initial.py:15 -msgid "Default school" +#: menus.py:79 templates/core/system_status.html:5 +#: templates/core/system_status.html:7 +msgid "System status" msgstr "" -#: migrations/0002_school_term.py:16 -msgid "Default term" +#: menus.py:88 +msgid "Impersonation" +msgstr "" + +#: menus.py:97 +msgid "Manage school" +msgstr "" + +#: menus.py:106 +msgid "Backend Admin" +msgstr "" + +#: menus.py:117 +msgid "People" +msgstr "" + +#: menus.py:139 +msgid "Persons and accounts" +msgstr "" + +#: menus.py:152 +msgid "Edit school information" msgstr "" -#: models.py:20 +#: menus.py:153 templates/core/edit_schoolterm.html:8 +#: templates/core/edit_schoolterm.html:9 +msgid "Edit school term" +msgstr "" + +#: models.py:31 models.py:517 msgid "Name" msgstr "" -#: models.py:21 +#: models.py:33 msgid "Official name" msgstr "" -#: models.py:22 +#: models.py:35 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: models.py:24 +#: models.py:38 msgid "School logo" msgstr "" -#: models.py:38 +#: models.py:51 +msgid "School" +msgstr "" + +#: models.py:52 +msgid "Schools" +msgstr "" + +#: models.py:60 msgid "Visible caption of the term" msgstr "" -#: models.py:42 +#: models.py:62 msgid "Effective start date of term" msgstr "" -#: models.py:44 +#: models.py:63 msgid "Effective end date of term" msgstr "" -#: models.py:57 +#: models.py:83 +msgid "School term" +msgstr "" + +#: models.py:84 +msgid "School terms" +msgstr "" + +#: models.py:94 templates/core/persons_accounts.html:36 +msgid "Person" +msgstr "" + +#: models.py:97 msgid "female" msgstr "" -#: models.py:58 +#: models.py:97 msgid "male" msgstr "" -#: models.py:65 +#: models.py:102 msgid "Is person active?" msgstr "" -#: models.py:67 +#: models.py:104 msgid "First name" msgstr "" -#: models.py:68 +#: models.py:105 msgid "Last name" msgstr "" -#: models.py:70 +#: models.py:107 msgid "Additional name(s)" msgstr "" -#: models.py:73 +#: models.py:111 msgid "Short name" msgstr "" -#: models.py:76 +#: models.py:114 msgid "Street" msgstr "" -#: models.py:78 +#: models.py:115 msgid "Street number" msgstr "" -#: models.py:80 +#: models.py:116 msgid "Postal code" msgstr "" -#: models.py:82 +#: models.py:117 msgid "Place" msgstr "" -#: models.py:84 +#: models.py:119 msgid "Home phone" msgstr "" -#: models.py:86 +#: models.py:120 msgid "Mobile phone" msgstr "" -#: models.py:88 +#: models.py:122 msgid "E-mail address" msgstr "" -#: models.py:91 +#: models.py:124 msgid "Date of birth" msgstr "" -#: models.py:93 +#: models.py:125 msgid "Sex" msgstr "" -#: models.py:95 +#: models.py:127 msgid "Photo" msgstr "" -#: models.py:99 +#: models.py:131 models.py:249 msgid "Reference ID of import source" msgstr "" -#: models.py:101 +#: models.py:140 msgid "Guardians / Parents" msgstr "" -#: models.py:145 +#: models.py:231 +msgid "Group" +msgstr "" + +#: models.py:234 msgid "Long name of group" msgstr "" -#: models.py:147 +#: models.py:235 msgid "Short name of group" msgstr "" -#: models.py:153 +#: models.py:244 msgid "Parent groups" msgstr "" -#: settings.py:218 +#: models.py:268 models.py:285 models.py:363 +#: templates/core/announcement/list.html:18 +msgid "Title" +msgstr "" + +#: models.py:269 models.py:286 models.py:364 +msgid "Description" +msgstr "" + +#: models.py:271 +msgid "Application" +msgstr "" + +#: models.py:277 +msgid "Activity" +msgstr "" + +#: models.py:278 +msgid "Activities" +msgstr "" + +#: models.py:282 +msgid "Sender" +msgstr "" + +#: models.py:287 models.py:365 models.py:518 +msgid "Link" +msgstr "" + +#: models.py:289 +msgid "Read" +msgstr "" + +#: models.py:290 +msgid "Sent" +msgstr "" + +#: models.py:301 +msgid "Notification" +msgstr "" + +#: models.py:302 +msgid "Notifications" +msgstr "" + +#: models.py:368 +msgid "Date and time from when to show" +msgstr "" + +#: models.py:371 +msgid "Date and time until when to show" +msgstr "" + +#: models.py:394 +msgid "Announcement" +msgstr "" + +#: models.py:422 +msgid "Announcement recipient" +msgstr "" + +#: models.py:423 +msgid "Announcement recipients" +msgstr "" + +#: models.py:473 +msgid "Widget Title" +msgstr "" + +#: models.py:474 +msgid "Activate Widget" +msgstr "" + +#: models.py:486 +msgid "Dashboard Widget" +msgstr "" + +#: models.py:487 +msgid "Dashboard Widgets" +msgstr "" + +#: models.py:491 +msgid "Menu ID" +msgstr "" + +#: models.py:492 +msgid "Menu name" +msgstr "" + +#: models.py:509 +msgid "Custom menu" +msgstr "" + +#: models.py:510 +msgid "Custom menus" +msgstr "" + +#: models.py:515 +msgid "Menu" +msgstr "" + +#: models.py:520 +msgid "Icon" +msgstr "" + +#: models.py:527 +msgid "Custom menu item" +msgstr "" + +#: models.py:528 +msgid "Custom menu items" +msgstr "" + +#: settings.py:254 msgid "German" msgstr "" -#: settings.py:219 +#: settings.py:255 msgid "English" msgstr "" -#: templates/403.html:5 -msgid "Forbidden" +#: settings.py:373 +msgid "Site title" msgstr "" -#: templates/403.html:12 -msgid "You are not allowed to access the requested page or object." +#: settings.py:374 +msgid "Site description" msgstr "" -#: templates/403.html:16 templates/404.html:20 -msgid "" -"\n" -" If you think this is an error in AlekSIS, please contact your site\n" -" administrators.\n" -" " +#: settings.py:375 +msgid "Primary colour" msgstr "" -#: templates/404.html:5 -msgid "Not found" +#: settings.py:376 +msgid "Secondary colour" msgstr "" -#: templates/404.html:12 -msgid "The requested page or object was not found." +#: settings.py:377 +msgid "Mail out name" msgstr "" -#: templates/404.html:16 +#: settings.py:378 +msgid "Mail out address" +msgstr "" + +#: settings.py:379 +msgid "Link to privacy policy" +msgstr "" + +#: settings.py:380 +msgid "Link to imprint" +msgstr "" + +#: settings.py:381 +msgid "Name format of adresses" +msgstr "" + +#: settings.py:382 +msgid "Channels to allow for notifications" +msgstr "" + +#: settings.py:383 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "" + +#: templates/403.html:10 +msgid "Error (403): You are not allowed to access the requested page or object." +msgstr "" + +#: templates/403.html:12 msgid "" "\n" -" If you were redirected by a link on an external page,\n" -" it is possible that that link was outdated.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/500.html:5 -msgid "Internal Server Error" +#: templates/404.html:10 +msgid "Error (404): The requested page or object was not found." msgstr "" -#: templates/500.html:12 +#: templates/404.html:12 msgid "" "\n" -" An unexpected error has occured.\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" " " msgstr "" -#: templates/500.html:18 +#: templates/404.html:16 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" -" error.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/503.html:5 -msgid "Maintenance mode" +#: templates/500.html:10 +msgid "Error (500): An unexpected error has occured.." msgstr "" -#: templates/503.html:12 +#: templates/500.html:12 msgid "" "\n" -" The maintenance mode is currently enabled. Please try again later.\n" -" " +" Your site administrators will automatically be notified about this\n" +" error.\n" +" " msgstr "" -#: templates/contact_form/contact_form.html:14 -msgid "Send" +#: templates/503.html:10 +msgid "The maintenance mode is currently enabled. Please try again later." msgstr "" -#: templates/contact_form/contact_form_sent.html:9 +#: templates/503.html:12 msgid "" "\n" -" The message was successfully submitted.\n" -" " +" This page is currently unavailable. If this error stays, contact your site administrators:\n" +" " msgstr "" -#: templates/core/edit_group.html:16 templates/core/edit_group.html:18 -#: templates/core/group_full.html:16 -msgid "Edit group" +#: templates/core/announcement/form.html:10 +#: templates/core/announcement/form.html:17 +msgid "Edit announcement" msgstr "" -#: templates/core/edit_group.html:26 templates/core/edit_person.html:28 -#: templates/core/edit_school.html:22 templates/core/edit_schoolterm.html:22 -msgid "Edit" +#: templates/core/announcement/form.html:12 +msgid "Publish announcement" msgstr "" -#: templates/core/edit_person.html:7 templates/core/edit_person.html:9 -#: templates/core/person_full.html:16 -msgid "Edit person" +#: templates/core/announcement/form.html:19 +#: templates/core/announcement/list.html:13 +msgid "Publish new announcement" msgstr "" -#: templates/core/edit_school.html:7 templates/core/edit_school.html:9 -msgid "Edit school" +#: templates/core/announcement/form.html:30 +msgid "Save und publish announcement" msgstr "" -#: templates/core/footer-menu.html:26 -msgid "Assorted" +#: templates/core/announcement/list.html:19 +msgid "Valid from" msgstr "" -#: templates/core/group_full.html:8 -msgid "Group" +#: templates/core/announcement/list.html:20 +msgid "Valid until" msgstr "" -#: templates/core/group_full.html:19 -msgid "Details" +#: templates/core/announcement/list.html:21 +msgid "Recipients" msgstr "" -#: templates/core/group_full.html:28 -msgid "Owners" +#: templates/core/announcement/list.html:22 +msgid "Actions" msgstr "" -#: templates/core/group_full.html:31 -msgid "Members" +#: templates/core/announcement/list.html:36 templates/core/group_full.html:15 +#: templates/core/person_full.html:15 +msgid "Edit" +msgstr "" + +#: templates/core/announcement/list.html:42 +msgid "Delete" msgstr "" -#: templates/core/group_full.html:35 -msgid "Group not found" +#: templates/core/announcement/list.html:50 +msgid "There are no announcements." msgstr "" -#: templates/core/group_full.html:38 +#: templates/core/announcements.html:9 templates/core/announcements.html:36 +#, python-format msgid "" "\n" -" There is no group with this id.\n" -" " +" Valid for %(from)s\n" +" " msgstr "" -#: templates/core/index.html:8 +#: templates/core/announcements.html:13 +#, python-format msgid "" "\n" -" AlekSIS (School Information System)\n" -" " +" Valid from %(from)s until %(until)s\n" +" " msgstr "" -#: templates/core/index.html:16 +#: templates/core/announcements.html:40 +#, python-format msgid "" "\n" -" AlekSIS is a web-based school information system (SIS) which can be " -"used to\n" -" manage and/or publish organisational data of educational " -"institutions.\n" -" " +" Valid for %(from)s – %(until)s\n" +" " msgstr "" -#: templates/core/language_form.html:5 -msgid "Language" +#: templates/core/base.html:54 +msgid "Logged in as" msgstr "" -#: templates/core/no_person.html:8 -msgid "" -"\n" -" You are not linked to a person\n" -" " +#: templates/core/base.html:146 +msgid "Impress" msgstr "" -#: templates/core/no_person.html:13 -msgid "" -"\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +#: templates/core/base.html:154 +msgid "Privacy Policy" msgstr "" -#: templates/core/person_full.html:8 templates/core/persons_accounts.html:41 -msgid "Person" +#: templates/core/base_print.html:60 +msgid "Powered by AlekSIS" msgstr "" -#: templates/core/person_full.html:19 -msgid "Contact details" +#: templates/core/edit_group.html:6 templates/core/edit_group.html:7 +msgid "Edit group" +msgstr "" + +#: templates/core/edit_person.html:8 templates/core/edit_person.html:9 +msgid "Edit person" +msgstr "" + +#: templates/core/edit_school.html:8 templates/core/edit_school.html:9 +msgid "Edit school" +msgstr "" + +#: templates/core/group_full.html:19 +msgid "Owners" +msgstr "" + +#: templates/core/group_full.html:22 +msgid "Members" +msgstr "" + +#: templates/core/groups.html:14 +msgid "Create group" +msgstr "" + +#: templates/core/index.html:4 +msgid "Home" +msgstr "" + +#: templates/core/index.html:11 +msgid "AlekSIS (School Information System)" +msgstr "" + +#: templates/core/index.html:43 +msgid "Last activities" +msgstr "" + +#: templates/core/index.html:61 +msgid "No activities available yet." +msgstr "" + +#: templates/core/index.html:66 +msgid "Recent notifications" +msgstr "" + +#: templates/core/index.html:82 +msgid "More information →" msgstr "" -#: templates/core/person_full.html:70 -msgid "Person not found" +#: templates/core/index.html:89 +msgid "No notifications available yet." msgstr "" -#: templates/core/person_full.html:73 +#: templates/core/no_person.html:11 msgid "" "\n" -" There is no person with this id.\n" +" Your user account is not linked to a person. This means you\n" +" cannot access any school-related information. Please contact\n" +" the managers of AlekSIS at your school.\n" " " msgstr "" -#: templates/core/persons_accounts.html:17 -#: templates/core/persons_accounts.html:20 +#: templates/core/offline.html:6 +msgid "No internet connection." +msgstr "" + +#: templates/core/offline.html:9 +msgid "" +"\n" +" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators:\n" +" " +msgstr "" + +#: templates/core/person_full.html:19 +msgid "Contact details" +msgstr "" + +#: templates/core/persons_accounts.html:7 +#: templates/core/persons_accounts.html:9 msgid "Link persons to accounts" msgstr "" -#: templates/core/persons_accounts.html:26 +#: templates/core/persons_accounts.html:16 msgid "" "\n" " You can use this form to assign user accounts to persons. Use the\n" -" dropdowns to select existing accounts; use the text fields to create " -"new\n" +" dropdowns to select existing accounts; use the text fields to create new\n" " accounts on-the-fly. The latter will create a new account with the\n" " entered username and copy all other details from the person.\n" " " msgstr "" -#: templates/core/persons_accounts.html:42 +#: templates/core/persons_accounts.html:31 +#: templates/core/persons_accounts.html:55 +msgid "Update" +msgstr "" + +#: templates/core/persons_accounts.html:37 msgid "Existing account" msgstr "" -#: templates/core/persons_accounts.html:43 +#: templates/core/persons_accounts.html:38 msgid "New account" msgstr "" -#: templates/core/persons_accounts.html:59 -msgid "Update" +#: templates/core/save_button.html:3 +msgid "Save" msgstr "" -#: templates/core/school_management.html:5 +#: templates/core/school_management.html:6 #: templates/core/school_management.html:7 msgid "School management" msgstr "" @@ -462,60 +715,510 @@ msgstr "" msgid "System checks" msgstr "" -#: templates/core/system_status.html:18 +#: templates/core/system_status.html:21 msgid "Maintenance mode enabled" msgstr "" -#: templates/core/system_status.html:19 -msgid "Only admin and visitors from internal IPs can access the site." +#: templates/core/system_status.html:23 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access thesite.\n" +" " msgstr "" -#: templates/core/system_status.html:24 +#: templates/core/system_status.html:34 msgid "Maintenance mode disabled" msgstr "" -#: templates/core/system_status.html:25 +#: templates/core/system_status.html:35 msgid "Everyone can access the site." msgstr "" -#: templates/core/system_status.html:33 +#: templates/core/system_status.html:45 msgid "Debug mode enabled" msgstr "" -#: templates/core/system_status.html:34 +#: templates/core/system_status.html:47 msgid "" -"The web server throws back debug information on errors. Do not use in " -"production!" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " msgstr "" -#: templates/core/system_status.html:39 +#: templates/core/system_status.html:54 msgid "Debug mode disabled" msgstr "" -#: templates/core/system_status.html:40 -msgid "Debug mode is disabled. Default error pages are displayed on errors." -msgstr "" - -#: templates/core/system_status.html:50 -msgid "Recent backup cron jobs" +#: templates/core/system_status.html:56 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " msgstr "" #: templates/impersonate/list_users.html:8 msgid "Impersonate user" msgstr "" -#: views.py:143 +#: templates/martor/editor.html:27 +msgid "Uploading... please wait..." +msgstr "" + +#: templates/martor/editor.html:36 +msgid "Nothing to preview" +msgstr "" + +#: templates/martor/emoji.html:4 +msgid "Select Emoji to Insert" +msgstr "" + +#: templates/martor/emoji.html:8 +msgid "Preparing emojis..." +msgstr "" + +#: templates/martor/guide.html:8 +msgid "Markdown Guide" +msgstr "" + +#: templates/martor/guide.html:9 +#, python-format +msgid "" +"This site is powered by Markdown. For full\n" +" documentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">click here</a>" +msgstr "" + +#: templates/martor/guide.html:15 templates/martor/toolbar.html:42 +msgid "Code" +msgstr "" + +#: templates/martor/guide.html:16 +msgid "Or" +msgstr "" + +#: templates/martor/guide.html:19 +msgid "... to Get" +msgstr "" + +#: templates/martor/toolbar.html:3 +msgid "Bold" +msgstr "" + +#: templates/martor/toolbar.html:6 +msgid "Italic" +msgstr "" + +#: templates/martor/toolbar.html:10 +msgid "Horizontal Line" +msgstr "" + +#: templates/martor/toolbar.html:15 +msgid "Heading" +msgstr "" + +#: templates/martor/toolbar.html:20 templates/martor/toolbar.html:23 +#: templates/martor/toolbar.html:26 +msgid "H" +msgstr "" + +#: templates/martor/toolbar.html:31 +msgid "Pre or Code" +msgstr "" + +#: templates/martor/toolbar.html:38 +msgid "Pre" +msgstr "" + +#: templates/martor/toolbar.html:48 +msgid "Quote" +msgstr "" + +#: templates/martor/toolbar.html:52 +msgid "Unordered List" +msgstr "" + +#: templates/martor/toolbar.html:56 +msgid "Ordered List" +msgstr "" + +#: templates/martor/toolbar.html:60 +msgid "URL/Link" +msgstr "" + +#: templates/martor/toolbar.html:82 +msgid "Full Screen" +msgstr "" + +#: templates/martor/toolbar.html:86 +msgid "Markdown Guide (Help)" +msgstr "" + +#: templates/two_factor/_base_focus.html:6 +#: templates/two_factor/core/otp_required.html:22 +#: templates/two_factor/core/setup.html:5 +#: templates/two_factor/profile/profile.html:87 +msgid "Enable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:15 +#: templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:5 +#: templates/two_factor/core/backup_tokens.html:9 +#: templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "" + +#: templates/two_factor/core/login.html:17 +msgid "Enter your credentials." +msgstr "" + +#: templates/two_factor/core/login.html:20 +msgid "" +"We are calling your phone right now, please enter the\n" +" digits you hear." +msgstr "" + +#: templates/two_factor/core/login.html:23 +msgid "" +"We sent you a text message, please enter the tokens we\n" +" sent." +msgstr "" + +#: templates/two_factor/core/login.html:26 +msgid "" +"Please enter the tokens generated by your token\n" +" generator." +msgstr "" + +#: templates/two_factor/core/login.html:30 +msgid "" +"Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account." +msgstr "" + +#: templates/two_factor/core/login.html:47 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "" + +#: templates/two_factor/core/login.html:57 +msgid "As a last resort, you can use a backup token:" +msgstr "" + +#: templates/two_factor/core/login.html:60 +msgid "Use Backup Token" +msgstr "" + +#: templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "" + +#: templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" + +#: templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" + +#: templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + +#: templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "" + +#: templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" + +#: templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" + +#: templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" smartphone to scan the QR code below. For example, use Google\n" +" Authenticator. Then, enter the token generated by the app.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:5 +#: templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:24 +#: templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:28 +#: templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:52 +#: templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "" + +#: templates/two_factor/profile/disable.html:5 +#: templates/two_factor/profile/disable.html:9 +#: templates/two_factor/profile/profile.html:63 +#: templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "" + +#: templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "" + +#: templates/two_factor/profile/profile.html:5 +#: templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "" + +#: templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "" + +#: templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "" + +#: templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "" + +#: templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "" + +#: templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" + +#: templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "" + +#: templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" + +#: templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "" + +#: templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" + +#: templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" + +#: util/notifications.py:66 +msgid "E-Mail" +msgstr "" + +#: util/notifications.py:67 +msgid "SMS" +msgstr "" + +#: views.py:172 msgid "The person has been saved." msgstr "" -#: views.py:166 +#: views.py:195 msgid "The group has been saved." msgstr "" -#: views.py:211 +#: views.py:236 msgid "The school has been saved." msgstr "" -#: views.py:230 +#: views.py:255 msgid "The term has been saved." msgstr "" + +#: views.py:272 +msgid "You are not allowed to mark notifications from other users as read!" +msgstr "" + +#: views.py:307 +msgid "The announcement has been saved." +msgstr "" + +#: views.py:320 +msgid "The announcement has been deleted." +msgstr "" diff --git a/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po b/aleksis/core/locale/fr/LC_MESSAGES/djangojs.po index d714559929037c311183f5533697aef73d8b6a12..bebbb1f20d222d57029259420b0d5092f1969c14 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: 2020-01-21 21:04+0000\n" +"POT-Creation-Date: 2020-03-30 09:18+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 new file mode 100644 index 0000000000000000000000000000000000000000..753ec75d839f32e2238bca0315c607df5559d70e --- /dev/null +++ b/aleksis/core/locale/la/LC_MESSAGES/django.po @@ -0,0 +1,1225 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-03-30 09:18+0000\n" +"PO-Revision-Date: 2020-04-14 18:42+0000\n" +"Last-Translator: Jonathan Weth <teckids@jonathanweth.de>\n" +"Language-Team: Latin <https://translate.edugit.org/projects/aleksis/aleksis/" +"la/>\n" +"Language: la\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 3.8\n" + +#: forms.py:38 forms.py:93 +msgid "You cannot set a new username when also selecting an existing user." +msgstr "" + +#: forms.py:41 forms.py:96 +msgid "This username is already in use." +msgstr "" + +#: forms.py:83 +msgid "New user" +msgstr "" + +#: forms.py:83 +msgid "Create a new account" +msgstr "" + +#: forms.py:149 forms.py:152 +msgid "Date" +msgstr "dies" + +#: forms.py:150 forms.py:153 +msgid "Time" +msgstr "tempus" + +#: forms.py:155 menus.py:127 models.py:95 templates/core/persons.html:8 +#: templates/core/persons.html:9 +msgid "Persons" +msgstr "personae" + +#: forms.py:156 menus.py:133 models.py:232 templates/core/groups.html:8 +#: templates/core/groups.html:9 templates/core/person_full.html:79 +msgid "Groups" +msgstr "" + +#: forms.py:160 +msgid "From when until when should the announcement be displayed?" +msgstr "" + +#: forms.py:163 +msgid "Who should see the announcement?" +msgstr "" + +#: forms.py:164 +msgid "Write your announcement:" +msgstr "Scribe nuntium:" + +#: forms.py:203 +msgid "You are not allowed to create announcements which are only valid in the past." +msgstr "" + +#: forms.py:207 +msgid "The from date and time must be earlier then the until date and time." +msgstr "" + +#: forms.py:215 +msgid "You need at least one recipient." +msgstr "" + +#: menus.py:7 templates/registration/login.html:21 +#: templates/two_factor/core/login.html:6 +#: templates/two_factor/core/login.html:10 +#: templates/two_factor/core/login.html:64 +msgid "Login" +msgstr "" + +#: menus.py:13 +msgid "Dashboard" +msgstr "Forum" + +#: menus.py:19 +msgid "Account" +msgstr "" + +#: menus.py:26 +msgid "Stop impersonation" +msgstr "" + +#: menus.py:35 templates/core/base.html:56 +msgid "Logout" +msgstr "" + +#: menus.py:41 +msgid "Two factor auth" +msgstr "" + +#: menus.py:52 +msgid "Admin" +msgstr "Administratio" + +#: menus.py:61 models.py:395 templates/core/announcement/list.html:7 +#: templates/core/announcement/list.html:8 +msgid "Announcements" +msgstr "Nuntii" + +#: menus.py:70 templates/core/data_management.html:6 +#: templates/core/data_management.html:7 +msgid "Data management" +msgstr "Adminstratio datarum" + +#: menus.py:79 templates/core/system_status.html:5 +#: templates/core/system_status.html:7 +msgid "System status" +msgstr "Status systemae" + +#: menus.py:88 +msgid "Impersonation" +msgstr "" + +#: menus.py:97 +msgid "Manage school" +msgstr "Administra scholam" + +#: menus.py:106 +msgid "Backend Admin" +msgstr "" + +#: menus.py:117 +msgid "People" +msgstr "Personae" + +#: menus.py:139 +msgid "Persons and accounts" +msgstr "Personae et computi" + +#: menus.py:152 +msgid "Edit school information" +msgstr "Muta informationes scolae" + +#: menus.py:153 templates/core/edit_schoolterm.html:8 +#: templates/core/edit_schoolterm.html:9 +msgid "Edit school term" +msgstr "Muta anum scolae" + +#: models.py:31 models.py:517 +msgid "Name" +msgstr "Nomen" + +#: models.py:33 +msgid "Official name" +msgstr "Officialis nomen" + +#: models.py:35 +msgid "Official name of the school, e.g. as given by supervisory authority" +msgstr "Officialis nomen scolae, e. g." + +#: models.py:38 +msgid "School logo" +msgstr "Imago scolae" + +#: models.py:51 +msgid "School" +msgstr "Scola" + +#: models.py:52 +msgid "Schools" +msgstr "" + +#: models.py:60 +msgid "Visible caption of the term" +msgstr "" + +#: models.py:62 +msgid "Effective start date of term" +msgstr "" + +#: models.py:63 +msgid "Effective end date of term" +msgstr "" + +#: models.py:83 +msgid "School term" +msgstr "Anus scolae" + +#: models.py:84 +msgid "School terms" +msgstr "ani scolae" + +#: models.py:94 templates/core/persons_accounts.html:36 +msgid "Person" +msgstr "Persona" + +#: models.py:97 +msgid "female" +msgstr "femininum" + +#: models.py:97 +msgid "male" +msgstr "maskulinum" + +#: models.py:102 +msgid "Is person active?" +msgstr "" + +#: models.py:104 +msgid "First name" +msgstr "Primus nomen" + +#: models.py:105 +msgid "Last name" +msgstr "Secondus nomen" + +#: models.py:107 +msgid "Additional name(s)" +msgstr "addita nomines" + +#: models.py:111 +msgid "Short name" +msgstr "Breve nomen" + +#: models.py:114 +msgid "Street" +msgstr "Via" + +#: models.py:115 +msgid "Street number" +msgstr "Numerus domini" + +#: models.py:116 +msgid "Postal code" +msgstr "Numerus directorius" + +#: models.py:117 +msgid "Place" +msgstr "Urbs" + +#: models.py:119 +msgid "Home phone" +msgstr "Numerus telephoni domi" + +#: models.py:120 +msgid "Mobile phone" +msgstr "Numerus telephoni mobilis" + +#: models.py:122 +msgid "E-mail address" +msgstr "Inscriptio electronica" + +#: models.py:124 +msgid "Date of birth" +msgstr "" + +#: models.py:125 +msgid "Sex" +msgstr "" + +#: models.py:127 +msgid "Photo" +msgstr "" + +#: models.py:131 models.py:249 +msgid "Reference ID of import source" +msgstr "" + +#: models.py:140 +msgid "Guardians / Parents" +msgstr "" + +#: models.py:231 +msgid "Group" +msgstr "" + +#: models.py:234 +msgid "Long name of group" +msgstr "" + +#: models.py:235 +msgid "Short name of group" +msgstr "" + +#: models.py:244 +msgid "Parent groups" +msgstr "" + +#: models.py:268 models.py:285 models.py:363 +#: templates/core/announcement/list.html:18 +msgid "Title" +msgstr "" + +#: models.py:269 models.py:286 models.py:364 +msgid "Description" +msgstr "" + +#: models.py:271 +msgid "Application" +msgstr "" + +#: models.py:277 +msgid "Activity" +msgstr "" + +#: models.py:278 +msgid "Activities" +msgstr "" + +#: models.py:282 +msgid "Sender" +msgstr "" + +#: models.py:287 models.py:365 models.py:518 +msgid "Link" +msgstr "" + +#: models.py:289 +msgid "Read" +msgstr "" + +#: models.py:290 +msgid "Sent" +msgstr "" + +#: models.py:301 +msgid "Notification" +msgstr "" + +#: models.py:302 +msgid "Notifications" +msgstr "" + +#: models.py:368 +msgid "Date and time from when to show" +msgstr "" + +#: models.py:371 +msgid "Date and time until when to show" +msgstr "" + +#: models.py:394 +msgid "Announcement" +msgstr "" + +#: models.py:422 +msgid "Announcement recipient" +msgstr "" + +#: models.py:423 +msgid "Announcement recipients" +msgstr "" + +#: models.py:473 +msgid "Widget Title" +msgstr "" + +#: models.py:474 +msgid "Activate Widget" +msgstr "" + +#: models.py:486 +msgid "Dashboard Widget" +msgstr "" + +#: models.py:487 +msgid "Dashboard Widgets" +msgstr "" + +#: models.py:491 +msgid "Menu ID" +msgstr "" + +#: models.py:492 +msgid "Menu name" +msgstr "" + +#: models.py:509 +msgid "Custom menu" +msgstr "" + +#: models.py:510 +msgid "Custom menus" +msgstr "" + +#: models.py:515 +msgid "Menu" +msgstr "" + +#: models.py:520 +msgid "Icon" +msgstr "" + +#: models.py:527 +msgid "Custom menu item" +msgstr "" + +#: models.py:528 +msgid "Custom menu items" +msgstr "" + +#: settings.py:254 +msgid "German" +msgstr "" + +#: settings.py:255 +msgid "English" +msgstr "" + +#: settings.py:373 +msgid "Site title" +msgstr "" + +#: settings.py:374 +msgid "Site description" +msgstr "" + +#: settings.py:375 +msgid "Primary colour" +msgstr "" + +#: settings.py:376 +msgid "Secondary colour" +msgstr "" + +#: settings.py:377 +msgid "Mail out name" +msgstr "" + +#: settings.py:378 +msgid "Mail out address" +msgstr "" + +#: settings.py:379 +msgid "Link to privacy policy" +msgstr "" + +#: settings.py:380 +msgid "Link to imprint" +msgstr "" + +#: settings.py:381 +msgid "Name format of adresses" +msgstr "" + +#: settings.py:382 +msgid "Channels to allow for notifications" +msgstr "" + +#: settings.py:383 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "" + +#: templates/403.html:10 +msgid "Error (403): You are not allowed to access the requested page or object." +msgstr "" + +#: templates/403.html:12 +msgid "" +"\n" +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " +msgstr "" + +#: templates/404.html:10 +msgid "Error (404): The requested page or object was not found." +msgstr "" + +#: templates/404.html:12 +msgid "" +"\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" +" " +msgstr "" + +#: templates/404.html:16 +msgid "" +"\n" +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " +msgstr "" + +#: templates/500.html:10 +msgid "Error (500): An unexpected error has occured.." +msgstr "" + +#: templates/500.html:12 +msgid "" +"\n" +" Your site administrators will automatically be notified about this\n" +" error.\n" +" " +msgstr "" + +#: templates/503.html:10 +msgid "The maintenance mode is currently enabled. Please try again later." +msgstr "" + +#: templates/503.html:12 +msgid "" +"\n" +" This page is currently unavailable. If this error stays, contact your site administrators:\n" +" " +msgstr "" + +#: templates/core/announcement/form.html:10 +#: templates/core/announcement/form.html:17 +msgid "Edit announcement" +msgstr "" + +#: templates/core/announcement/form.html:12 +msgid "Publish announcement" +msgstr "" + +#: templates/core/announcement/form.html:19 +#: templates/core/announcement/list.html:13 +msgid "Publish new announcement" +msgstr "" + +#: templates/core/announcement/form.html:30 +msgid "Save und publish announcement" +msgstr "" + +#: templates/core/announcement/list.html:19 +msgid "Valid from" +msgstr "" + +#: templates/core/announcement/list.html:20 +msgid "Valid until" +msgstr "" + +#: templates/core/announcement/list.html:21 +msgid "Recipients" +msgstr "" + +#: templates/core/announcement/list.html:22 +msgid "Actions" +msgstr "" + +#: templates/core/announcement/list.html:36 templates/core/group_full.html:15 +#: templates/core/person_full.html:15 +msgid "Edit" +msgstr "" + +#: templates/core/announcement/list.html:42 +msgid "Delete" +msgstr "" + +#: templates/core/announcement/list.html:50 +msgid "There are no announcements." +msgstr "" + +#: templates/core/announcements.html:9 templates/core/announcements.html:36 +#, python-format +msgid "" +"\n" +" Valid for %(from)s\n" +" " +msgstr "" + +#: templates/core/announcements.html:13 +#, python-format +msgid "" +"\n" +" Valid from %(from)s until %(until)s\n" +" " +msgstr "" + +#: templates/core/announcements.html:40 +#, python-format +msgid "" +"\n" +" Valid for %(from)s – %(until)s\n" +" " +msgstr "" + +#: templates/core/base.html:54 +msgid "Logged in as" +msgstr "" + +#: templates/core/base.html:146 +msgid "Impress" +msgstr "" + +#: templates/core/base.html:154 +msgid "Privacy Policy" +msgstr "" + +#: templates/core/base_print.html:60 +msgid "Powered by AlekSIS" +msgstr "" + +#: templates/core/edit_group.html:6 templates/core/edit_group.html:7 +msgid "Edit group" +msgstr "" + +#: templates/core/edit_person.html:8 templates/core/edit_person.html:9 +msgid "Edit person" +msgstr "" + +#: templates/core/edit_school.html:8 templates/core/edit_school.html:9 +msgid "Edit school" +msgstr "" + +#: templates/core/group_full.html:19 +msgid "Owners" +msgstr "" + +#: templates/core/group_full.html:22 +msgid "Members" +msgstr "" + +#: templates/core/groups.html:14 +msgid "Create group" +msgstr "" + +#: templates/core/index.html:4 +msgid "Home" +msgstr "" + +#: templates/core/index.html:11 +msgid "AlekSIS (School Information System)" +msgstr "" + +#: templates/core/index.html:43 +msgid "Last activities" +msgstr "" + +#: templates/core/index.html:61 +msgid "No activities available yet." +msgstr "" + +#: templates/core/index.html:66 +msgid "Recent notifications" +msgstr "" + +#: templates/core/index.html:82 +msgid "More information →" +msgstr "" + +#: templates/core/index.html:89 +msgid "No notifications available yet." +msgstr "" + +#: templates/core/no_person.html:11 +msgid "" +"\n" +" Your user account is not linked to a person. This means you\n" +" cannot access any school-related information. Please contact\n" +" the managers of AlekSIS at your school.\n" +" " +msgstr "" + +#: templates/core/offline.html:6 +msgid "No internet connection." +msgstr "" + +#: templates/core/offline.html:9 +msgid "" +"\n" +" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators:\n" +" " +msgstr "" + +#: templates/core/person_full.html:19 +msgid "Contact details" +msgstr "" + +#: templates/core/persons_accounts.html:7 +#: templates/core/persons_accounts.html:9 +msgid "Link persons to accounts" +msgstr "" + +#: templates/core/persons_accounts.html:16 +msgid "" +"\n" +" You can use this form to assign user accounts to persons. Use the\n" +" dropdowns to select existing accounts; use the text fields to create new\n" +" accounts on-the-fly. The latter will create a new account with the\n" +" entered username and copy all other details from the person.\n" +" " +msgstr "" + +#: templates/core/persons_accounts.html:31 +#: templates/core/persons_accounts.html:55 +msgid "Update" +msgstr "" + +#: templates/core/persons_accounts.html:37 +msgid "Existing account" +msgstr "" + +#: templates/core/persons_accounts.html:38 +msgid "New account" +msgstr "" + +#: templates/core/save_button.html:3 +msgid "Save" +msgstr "" + +#: templates/core/school_management.html:6 +#: templates/core/school_management.html:7 +msgid "School management" +msgstr "" + +#: templates/core/system_status.html:12 +msgid "System checks" +msgstr "" + +#: templates/core/system_status.html:21 +msgid "Maintenance mode enabled" +msgstr "" + +#: templates/core/system_status.html:23 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access thesite.\n" +" " +msgstr "" + +#: templates/core/system_status.html:34 +msgid "Maintenance mode disabled" +msgstr "" + +#: templates/core/system_status.html:35 +msgid "Everyone can access the site." +msgstr "" + +#: templates/core/system_status.html:45 +msgid "Debug mode enabled" +msgstr "" + +#: templates/core/system_status.html:47 +msgid "" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " +msgstr "" + +#: templates/core/system_status.html:54 +msgid "Debug mode disabled" +msgstr "" + +#: templates/core/system_status.html:56 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " +msgstr "" + +#: templates/impersonate/list_users.html:8 +msgid "Impersonate user" +msgstr "" + +#: templates/martor/editor.html:27 +msgid "Uploading... please wait..." +msgstr "" + +#: templates/martor/editor.html:36 +msgid "Nothing to preview" +msgstr "" + +#: templates/martor/emoji.html:4 +msgid "Select Emoji to Insert" +msgstr "" + +#: templates/martor/emoji.html:8 +msgid "Preparing emojis..." +msgstr "" + +#: templates/martor/guide.html:8 +msgid "Markdown Guide" +msgstr "" + +#: templates/martor/guide.html:9 +#, python-format +msgid "" +"This site is powered by Markdown. For full\n" +" documentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">click here</a>" +msgstr "" + +#: templates/martor/guide.html:15 templates/martor/toolbar.html:42 +msgid "Code" +msgstr "" + +#: templates/martor/guide.html:16 +msgid "Or" +msgstr "" + +#: templates/martor/guide.html:19 +msgid "... to Get" +msgstr "" + +#: templates/martor/toolbar.html:3 +msgid "Bold" +msgstr "" + +#: templates/martor/toolbar.html:6 +msgid "Italic" +msgstr "" + +#: templates/martor/toolbar.html:10 +msgid "Horizontal Line" +msgstr "" + +#: templates/martor/toolbar.html:15 +msgid "Heading" +msgstr "" + +#: templates/martor/toolbar.html:20 templates/martor/toolbar.html:23 +#: templates/martor/toolbar.html:26 +msgid "H" +msgstr "" + +#: templates/martor/toolbar.html:31 +msgid "Pre or Code" +msgstr "" + +#: templates/martor/toolbar.html:38 +msgid "Pre" +msgstr "" + +#: templates/martor/toolbar.html:48 +msgid "Quote" +msgstr "" + +#: templates/martor/toolbar.html:52 +msgid "Unordered List" +msgstr "" + +#: templates/martor/toolbar.html:56 +msgid "Ordered List" +msgstr "" + +#: templates/martor/toolbar.html:60 +msgid "URL/Link" +msgstr "" + +#: templates/martor/toolbar.html:82 +msgid "Full Screen" +msgstr "" + +#: templates/martor/toolbar.html:86 +msgid "Markdown Guide (Help)" +msgstr "" + +#: templates/two_factor/_base_focus.html:6 +#: templates/two_factor/core/otp_required.html:22 +#: templates/two_factor/core/setup.html:5 +#: templates/two_factor/profile/profile.html:87 +msgid "Enable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:15 +#: templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:5 +#: templates/two_factor/core/backup_tokens.html:9 +#: templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "" + +#: templates/two_factor/core/login.html:17 +msgid "Enter your credentials." +msgstr "" + +#: templates/two_factor/core/login.html:20 +msgid "" +"We are calling your phone right now, please enter the\n" +" digits you hear." +msgstr "" + +#: templates/two_factor/core/login.html:23 +msgid "" +"We sent you a text message, please enter the tokens we\n" +" sent." +msgstr "" + +#: templates/two_factor/core/login.html:26 +msgid "" +"Please enter the tokens generated by your token\n" +" generator." +msgstr "" + +#: templates/two_factor/core/login.html:30 +msgid "" +"Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account." +msgstr "" + +#: templates/two_factor/core/login.html:47 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "" + +#: templates/two_factor/core/login.html:57 +msgid "As a last resort, you can use a backup token:" +msgstr "" + +#: templates/two_factor/core/login.html:60 +msgid "Use Backup Token" +msgstr "" + +#: templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "" + +#: templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" + +#: templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" + +#: templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + +#: templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "" + +#: templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" + +#: templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" + +#: templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" smartphone to scan the QR code below. For example, use Google\n" +" Authenticator. Then, enter the token generated by the app.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:5 +#: templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:24 +#: templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:28 +#: templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:52 +#: templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "" + +#: templates/two_factor/profile/disable.html:5 +#: templates/two_factor/profile/disable.html:9 +#: templates/two_factor/profile/profile.html:63 +#: templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "" + +#: templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "" + +#: templates/two_factor/profile/profile.html:5 +#: templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "" + +#: templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "" + +#: templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "" + +#: templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "" + +#: templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "" + +#: templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" + +#: templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "" + +#: templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" + +#: templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "" + +#: templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" + +#: templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" + +#: util/notifications.py:66 +msgid "E-Mail" +msgstr "" + +#: util/notifications.py:67 +msgid "SMS" +msgstr "" + +#: views.py:172 +msgid "The person has been saved." +msgstr "" + +#: views.py:195 +msgid "The group has been saved." +msgstr "" + +#: views.py:236 +msgid "The school has been saved." +msgstr "" + +#: views.py:255 +msgid "The term has been saved." +msgstr "" + +#: views.py:272 +msgid "You are not allowed to mark notifications from other users as read!" +msgstr "" + +#: views.py:307 +msgid "The announcement has been saved." +msgstr "" + +#: views.py:320 +msgid "The announcement has been deleted." +msgstr "" diff --git a/aleksis/core/locale/la/LC_MESSAGES/djangojs.po b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po new file mode 100644 index 0000000000000000000000000000000000000000..d62e52377a4ce6af7272b5568c5da2a4698fb057 --- /dev/null +++ b/aleksis/core/locale/la/LC_MESSAGES/djangojs.po @@ -0,0 +1,30 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-03-30 09:18+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" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: static/js/main.js:21 +msgid "Today" +msgstr "" + +#: static/js/main.js:22 +msgid "Cancel" +msgstr "" + +#: static/js/main.js:23 +msgid "OK" +msgstr "" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/django.po index 69bb82a70bf5f966a3713a451cee8f554f48cacf..495b614c5c6694495737ed677af23b37c0e15153 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: 2019-11-23 10:06+0100\n" +"POT-Creation-Date: 2020-03-30 09:18+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" @@ -17,442 +17,695 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: forms.py:30 forms.py:66 +#: forms.py:38 forms.py:93 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: forms.py:32 forms.py:68 +#: forms.py:41 forms.py:96 msgid "This username is already in use." msgstr "" -#: forms.py:57 +#: forms.py:83 msgid "New user" msgstr "" -#: forms.py:58 +#: forms.py:83 msgid "Create a new account" msgstr "" -#: menus.py:6 -msgid "Account" +#: forms.py:149 forms.py:152 +msgid "Date" msgstr "" -#: menus.py:11 -msgid "Stop impersonation" +#: forms.py:150 forms.py:153 +msgid "Time" msgstr "" -#: menus.py:16 templates/registration/login.html:21 -msgid "Login" +#: forms.py:155 menus.py:127 models.py:95 templates/core/persons.html:8 +#: templates/core/persons.html:9 +msgid "Persons" msgstr "" -#: menus.py:21 -msgid "Logout" +#: forms.py:156 menus.py:133 models.py:232 templates/core/groups.html:8 +#: templates/core/groups.html:9 templates/core/person_full.html:79 +msgid "Groups" msgstr "" -#: menus.py:28 -msgid "Admin" +#: forms.py:160 +msgid "From when until when should the announcement be displayed?" msgstr "" -#: menus.py:33 templates/core/data_management.html:5 -#: templates/core/data_management.html:7 -msgid "Data management" +#: forms.py:163 +msgid "Who should see the announcement?" msgstr "" -#: menus.py:38 templates/core/system_status.html:5 -#: templates/core/system_status.html:7 -msgid "System status" +#: forms.py:164 +msgid "Write your announcement:" msgstr "" -#: menus.py:43 -msgid "Impersonation" +#: forms.py:203 +msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: menus.py:48 -msgid "Manage school" +#: forms.py:207 +msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: menus.py:55 -msgid "People" +#: forms.py:215 +msgid "You need at least one recipient." msgstr "" -#: menus.py:61 templates/core/persons.html:8 templates/core/persons.html:10 -msgid "Persons" +#: menus.py:7 templates/registration/login.html:21 +#: templates/two_factor/core/login.html:6 +#: templates/two_factor/core/login.html:10 +#: templates/two_factor/core/login.html:64 +msgid "Login" msgstr "" -#: menus.py:66 templates/core/groups.html:8 templates/core/groups.html:10 -#: templates/core/person_full.html:66 -msgid "Groups" +#: menus.py:13 +msgid "Dashboard" msgstr "" -#: menus.py:71 -msgid "Persons and accounts" +#: menus.py:19 +msgid "Account" msgstr "" -#: menus.py:80 -msgid "AlekSIS Software" +#: menus.py:26 +msgid "Stop impersonation" msgstr "" -#: menus.py:84 -msgid "Website" +#: menus.py:35 templates/core/base.html:56 +msgid "Logout" msgstr "" -#: menus.py:94 -msgid "Support" +#: menus.py:41 +msgid "Two factor auth" msgstr "" -#: menus.py:98 templates/contact_form/contact_form.html:8 -msgid "Get support" +#: menus.py:52 +msgid "Admin" msgstr "" -#: menus.py:108 -msgid "Edit school information" +#: menus.py:61 models.py:395 templates/core/announcement/list.html:7 +#: templates/core/announcement/list.html:8 +msgid "Announcements" msgstr "" -#: menus.py:112 templates/core/edit_schoolterm.html:7 -#: templates/core/edit_schoolterm.html:9 -msgid "Edit school term" +#: menus.py:70 templates/core/data_management.html:6 +#: templates/core/data_management.html:7 +msgid "Data management" msgstr "" -#: migrations/0001_initial.py:15 -msgid "Default school" +#: menus.py:79 templates/core/system_status.html:5 +#: templates/core/system_status.html:7 +msgid "System status" msgstr "" -#: migrations/0002_school_term.py:16 -msgid "Default term" +#: menus.py:88 +msgid "Impersonation" +msgstr "" + +#: menus.py:97 +msgid "Manage school" +msgstr "" + +#: menus.py:106 +msgid "Backend Admin" +msgstr "" + +#: menus.py:117 +msgid "People" +msgstr "" + +#: menus.py:139 +msgid "Persons and accounts" +msgstr "" + +#: menus.py:152 +msgid "Edit school information" msgstr "" -#: models.py:20 +#: menus.py:153 templates/core/edit_schoolterm.html:8 +#: templates/core/edit_schoolterm.html:9 +msgid "Edit school term" +msgstr "" + +#: models.py:31 models.py:517 msgid "Name" msgstr "" -#: models.py:21 +#: models.py:33 msgid "Official name" msgstr "" -#: models.py:22 +#: models.py:35 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: models.py:24 +#: models.py:38 msgid "School logo" msgstr "" -#: models.py:38 +#: models.py:51 +msgid "School" +msgstr "" + +#: models.py:52 +msgid "Schools" +msgstr "" + +#: models.py:60 msgid "Visible caption of the term" msgstr "" -#: models.py:42 +#: models.py:62 msgid "Effective start date of term" msgstr "" -#: models.py:44 +#: models.py:63 msgid "Effective end date of term" msgstr "" -#: models.py:57 +#: models.py:83 +msgid "School term" +msgstr "" + +#: models.py:84 +msgid "School terms" +msgstr "" + +#: models.py:94 templates/core/persons_accounts.html:36 +msgid "Person" +msgstr "" + +#: models.py:97 msgid "female" msgstr "" -#: models.py:58 +#: models.py:97 msgid "male" msgstr "" -#: models.py:65 +#: models.py:102 msgid "Is person active?" msgstr "" -#: models.py:67 +#: models.py:104 msgid "First name" msgstr "" -#: models.py:68 +#: models.py:105 msgid "Last name" msgstr "" -#: models.py:70 +#: models.py:107 msgid "Additional name(s)" msgstr "" -#: models.py:73 +#: models.py:111 msgid "Short name" msgstr "" -#: models.py:76 +#: models.py:114 msgid "Street" msgstr "" -#: models.py:78 +#: models.py:115 msgid "Street number" msgstr "" -#: models.py:80 +#: models.py:116 msgid "Postal code" msgstr "" -#: models.py:82 +#: models.py:117 msgid "Place" msgstr "" -#: models.py:84 +#: models.py:119 msgid "Home phone" msgstr "" -#: models.py:86 +#: models.py:120 msgid "Mobile phone" msgstr "" -#: models.py:88 +#: models.py:122 msgid "E-mail address" msgstr "" -#: models.py:91 +#: models.py:124 msgid "Date of birth" msgstr "" -#: models.py:93 +#: models.py:125 msgid "Sex" msgstr "" -#: models.py:95 +#: models.py:127 msgid "Photo" msgstr "" -#: models.py:99 +#: models.py:131 models.py:249 msgid "Reference ID of import source" msgstr "" -#: models.py:101 +#: models.py:140 msgid "Guardians / Parents" msgstr "" -#: models.py:145 +#: models.py:231 +msgid "Group" +msgstr "" + +#: models.py:234 msgid "Long name of group" msgstr "" -#: models.py:147 +#: models.py:235 msgid "Short name of group" msgstr "" -#: models.py:153 +#: models.py:244 msgid "Parent groups" msgstr "" -#: settings.py:218 +#: models.py:268 models.py:285 models.py:363 +#: templates/core/announcement/list.html:18 +msgid "Title" +msgstr "" + +#: models.py:269 models.py:286 models.py:364 +msgid "Description" +msgstr "" + +#: models.py:271 +msgid "Application" +msgstr "" + +#: models.py:277 +msgid "Activity" +msgstr "" + +#: models.py:278 +msgid "Activities" +msgstr "" + +#: models.py:282 +msgid "Sender" +msgstr "" + +#: models.py:287 models.py:365 models.py:518 +msgid "Link" +msgstr "" + +#: models.py:289 +msgid "Read" +msgstr "" + +#: models.py:290 +msgid "Sent" +msgstr "" + +#: models.py:301 +msgid "Notification" +msgstr "" + +#: models.py:302 +msgid "Notifications" +msgstr "" + +#: models.py:368 +msgid "Date and time from when to show" +msgstr "" + +#: models.py:371 +msgid "Date and time until when to show" +msgstr "" + +#: models.py:394 +msgid "Announcement" +msgstr "" + +#: models.py:422 +msgid "Announcement recipient" +msgstr "" + +#: models.py:423 +msgid "Announcement recipients" +msgstr "" + +#: models.py:473 +msgid "Widget Title" +msgstr "" + +#: models.py:474 +msgid "Activate Widget" +msgstr "" + +#: models.py:486 +msgid "Dashboard Widget" +msgstr "" + +#: models.py:487 +msgid "Dashboard Widgets" +msgstr "" + +#: models.py:491 +msgid "Menu ID" +msgstr "" + +#: models.py:492 +msgid "Menu name" +msgstr "" + +#: models.py:509 +msgid "Custom menu" +msgstr "" + +#: models.py:510 +msgid "Custom menus" +msgstr "" + +#: models.py:515 +msgid "Menu" +msgstr "" + +#: models.py:520 +msgid "Icon" +msgstr "" + +#: models.py:527 +msgid "Custom menu item" +msgstr "" + +#: models.py:528 +msgid "Custom menu items" +msgstr "" + +#: settings.py:254 msgid "German" msgstr "" -#: settings.py:219 +#: settings.py:255 msgid "English" msgstr "" -#: templates/403.html:5 -msgid "Forbidden" +#: settings.py:373 +msgid "Site title" msgstr "" -#: templates/403.html:12 -msgid "You are not allowed to access the requested page or object." +#: settings.py:374 +msgid "Site description" msgstr "" -#: templates/403.html:16 templates/404.html:20 -msgid "" -"\n" -" If you think this is an error in AlekSIS, please contact your site\n" -" administrators.\n" -" " +#: settings.py:375 +msgid "Primary colour" msgstr "" -#: templates/404.html:5 -msgid "Not found" +#: settings.py:376 +msgid "Secondary colour" msgstr "" -#: templates/404.html:12 -msgid "The requested page or object was not found." +#: settings.py:377 +msgid "Mail out name" msgstr "" -#: templates/404.html:16 +#: settings.py:378 +msgid "Mail out address" +msgstr "" + +#: settings.py:379 +msgid "Link to privacy policy" +msgstr "" + +#: settings.py:380 +msgid "Link to imprint" +msgstr "" + +#: settings.py:381 +msgid "Name format of adresses" +msgstr "" + +#: settings.py:382 +msgid "Channels to allow for notifications" +msgstr "" + +#: settings.py:383 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "" + +#: templates/403.html:10 +msgid "Error (403): You are not allowed to access the requested page or object." +msgstr "" + +#: templates/403.html:12 msgid "" "\n" -" If you were redirected by a link on an external page,\n" -" it is possible that that link was outdated.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/500.html:5 -msgid "Internal Server Error" +#: templates/404.html:10 +msgid "Error (404): The requested page or object was not found." msgstr "" -#: templates/500.html:12 +#: templates/404.html:12 msgid "" "\n" -" An unexpected error has occured.\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" " " msgstr "" -#: templates/500.html:18 +#: templates/404.html:16 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" -" error.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/503.html:5 -msgid "Maintenance mode" +#: templates/500.html:10 +msgid "Error (500): An unexpected error has occured.." msgstr "" -#: templates/503.html:12 +#: templates/500.html:12 msgid "" "\n" -" The maintenance mode is currently enabled. Please try again later.\n" -" " +" Your site administrators will automatically be notified about this\n" +" error.\n" +" " msgstr "" -#: templates/contact_form/contact_form.html:14 -msgid "Send" +#: templates/503.html:10 +msgid "The maintenance mode is currently enabled. Please try again later." msgstr "" -#: templates/contact_form/contact_form_sent.html:9 +#: templates/503.html:12 msgid "" "\n" -" The message was successfully submitted.\n" -" " +" This page is currently unavailable. If this error stays, contact your site administrators:\n" +" " msgstr "" -#: templates/core/edit_group.html:16 templates/core/edit_group.html:18 -#: templates/core/group_full.html:16 -msgid "Edit group" +#: templates/core/announcement/form.html:10 +#: templates/core/announcement/form.html:17 +msgid "Edit announcement" msgstr "" -#: templates/core/edit_group.html:26 templates/core/edit_person.html:28 -#: templates/core/edit_school.html:22 templates/core/edit_schoolterm.html:22 -msgid "Edit" +#: templates/core/announcement/form.html:12 +msgid "Publish announcement" msgstr "" -#: templates/core/edit_person.html:7 templates/core/edit_person.html:9 -#: templates/core/person_full.html:16 -msgid "Edit person" +#: templates/core/announcement/form.html:19 +#: templates/core/announcement/list.html:13 +msgid "Publish new announcement" msgstr "" -#: templates/core/edit_school.html:7 templates/core/edit_school.html:9 -msgid "Edit school" +#: templates/core/announcement/form.html:30 +msgid "Save und publish announcement" msgstr "" -#: templates/core/footer-menu.html:26 -msgid "Assorted" +#: templates/core/announcement/list.html:19 +msgid "Valid from" msgstr "" -#: templates/core/group_full.html:8 -msgid "Group" +#: templates/core/announcement/list.html:20 +msgid "Valid until" msgstr "" -#: templates/core/group_full.html:19 -msgid "Details" +#: templates/core/announcement/list.html:21 +msgid "Recipients" msgstr "" -#: templates/core/group_full.html:28 -msgid "Owners" +#: templates/core/announcement/list.html:22 +msgid "Actions" msgstr "" -#: templates/core/group_full.html:31 -msgid "Members" +#: templates/core/announcement/list.html:36 templates/core/group_full.html:15 +#: templates/core/person_full.html:15 +msgid "Edit" +msgstr "" + +#: templates/core/announcement/list.html:42 +msgid "Delete" msgstr "" -#: templates/core/group_full.html:35 -msgid "Group not found" +#: templates/core/announcement/list.html:50 +msgid "There are no announcements." msgstr "" -#: templates/core/group_full.html:38 +#: templates/core/announcements.html:9 templates/core/announcements.html:36 +#, python-format msgid "" "\n" -" There is no group with this id.\n" -" " +" Valid for %(from)s\n" +" " msgstr "" -#: templates/core/index.html:8 +#: templates/core/announcements.html:13 +#, python-format msgid "" "\n" -" AlekSIS (School Information System)\n" -" " +" Valid from %(from)s until %(until)s\n" +" " msgstr "" -#: templates/core/index.html:16 +#: templates/core/announcements.html:40 +#, python-format msgid "" "\n" -" AlekSIS is a web-based school information system (SIS) which can be " -"used to\n" -" manage and/or publish organisational data of educational " -"institutions.\n" -" " +" Valid for %(from)s – %(until)s\n" +" " msgstr "" -#: templates/core/language_form.html:5 -msgid "Language" +#: templates/core/base.html:54 +msgid "Logged in as" msgstr "" -#: templates/core/no_person.html:8 -msgid "" -"\n" -" You are not linked to a person\n" -" " +#: templates/core/base.html:146 +msgid "Impress" msgstr "" -#: templates/core/no_person.html:13 -msgid "" -"\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +#: templates/core/base.html:154 +msgid "Privacy Policy" msgstr "" -#: templates/core/person_full.html:8 templates/core/persons_accounts.html:41 -msgid "Person" +#: templates/core/base_print.html:60 +msgid "Powered by AlekSIS" msgstr "" -#: templates/core/person_full.html:19 -msgid "Contact details" +#: templates/core/edit_group.html:6 templates/core/edit_group.html:7 +msgid "Edit group" +msgstr "" + +#: templates/core/edit_person.html:8 templates/core/edit_person.html:9 +msgid "Edit person" +msgstr "" + +#: templates/core/edit_school.html:8 templates/core/edit_school.html:9 +msgid "Edit school" +msgstr "" + +#: templates/core/group_full.html:19 +msgid "Owners" +msgstr "" + +#: templates/core/group_full.html:22 +msgid "Members" +msgstr "" + +#: templates/core/groups.html:14 +msgid "Create group" +msgstr "" + +#: templates/core/index.html:4 +msgid "Home" +msgstr "" + +#: templates/core/index.html:11 +msgid "AlekSIS (School Information System)" +msgstr "" + +#: templates/core/index.html:43 +msgid "Last activities" +msgstr "" + +#: templates/core/index.html:61 +msgid "No activities available yet." +msgstr "" + +#: templates/core/index.html:66 +msgid "Recent notifications" +msgstr "" + +#: templates/core/index.html:82 +msgid "More information →" msgstr "" -#: templates/core/person_full.html:70 -msgid "Person not found" +#: templates/core/index.html:89 +msgid "No notifications available yet." msgstr "" -#: templates/core/person_full.html:73 +#: templates/core/no_person.html:11 msgid "" "\n" -" There is no person with this id.\n" +" Your user account is not linked to a person. This means you\n" +" cannot access any school-related information. Please contact\n" +" the managers of AlekSIS at your school.\n" " " msgstr "" -#: templates/core/persons_accounts.html:17 -#: templates/core/persons_accounts.html:20 +#: templates/core/offline.html:6 +msgid "No internet connection." +msgstr "" + +#: templates/core/offline.html:9 +msgid "" +"\n" +" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators:\n" +" " +msgstr "" + +#: templates/core/person_full.html:19 +msgid "Contact details" +msgstr "" + +#: templates/core/persons_accounts.html:7 +#: templates/core/persons_accounts.html:9 msgid "Link persons to accounts" msgstr "" -#: templates/core/persons_accounts.html:26 +#: templates/core/persons_accounts.html:16 msgid "" "\n" " You can use this form to assign user accounts to persons. Use the\n" -" dropdowns to select existing accounts; use the text fields to create " -"new\n" +" dropdowns to select existing accounts; use the text fields to create new\n" " accounts on-the-fly. The latter will create a new account with the\n" " entered username and copy all other details from the person.\n" " " msgstr "" -#: templates/core/persons_accounts.html:42 +#: templates/core/persons_accounts.html:31 +#: templates/core/persons_accounts.html:55 +msgid "Update" +msgstr "" + +#: templates/core/persons_accounts.html:37 msgid "Existing account" msgstr "" -#: templates/core/persons_accounts.html:43 +#: templates/core/persons_accounts.html:38 msgid "New account" msgstr "" -#: templates/core/persons_accounts.html:59 -msgid "Update" +#: templates/core/save_button.html:3 +msgid "Save" msgstr "" -#: templates/core/school_management.html:5 +#: templates/core/school_management.html:6 #: templates/core/school_management.html:7 msgid "School management" msgstr "" @@ -461,60 +714,510 @@ msgstr "" msgid "System checks" msgstr "" -#: templates/core/system_status.html:18 +#: templates/core/system_status.html:21 msgid "Maintenance mode enabled" msgstr "" -#: templates/core/system_status.html:19 -msgid "Only admin and visitors from internal IPs can access the site." +#: templates/core/system_status.html:23 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access thesite.\n" +" " msgstr "" -#: templates/core/system_status.html:24 +#: templates/core/system_status.html:34 msgid "Maintenance mode disabled" msgstr "" -#: templates/core/system_status.html:25 +#: templates/core/system_status.html:35 msgid "Everyone can access the site." msgstr "" -#: templates/core/system_status.html:33 +#: templates/core/system_status.html:45 msgid "Debug mode enabled" msgstr "" -#: templates/core/system_status.html:34 +#: templates/core/system_status.html:47 msgid "" -"The web server throws back debug information on errors. Do not use in " -"production!" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " msgstr "" -#: templates/core/system_status.html:39 +#: templates/core/system_status.html:54 msgid "Debug mode disabled" msgstr "" -#: templates/core/system_status.html:40 -msgid "Debug mode is disabled. Default error pages are displayed on errors." -msgstr "" - -#: templates/core/system_status.html:50 -msgid "Recent backup cron jobs" +#: templates/core/system_status.html:56 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " msgstr "" #: templates/impersonate/list_users.html:8 msgid "Impersonate user" msgstr "" -#: views.py:143 +#: templates/martor/editor.html:27 +msgid "Uploading... please wait..." +msgstr "" + +#: templates/martor/editor.html:36 +msgid "Nothing to preview" +msgstr "" + +#: templates/martor/emoji.html:4 +msgid "Select Emoji to Insert" +msgstr "" + +#: templates/martor/emoji.html:8 +msgid "Preparing emojis..." +msgstr "" + +#: templates/martor/guide.html:8 +msgid "Markdown Guide" +msgstr "" + +#: templates/martor/guide.html:9 +#, python-format +msgid "" +"This site is powered by Markdown. For full\n" +" documentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">click here</a>" +msgstr "" + +#: templates/martor/guide.html:15 templates/martor/toolbar.html:42 +msgid "Code" +msgstr "" + +#: templates/martor/guide.html:16 +msgid "Or" +msgstr "" + +#: templates/martor/guide.html:19 +msgid "... to Get" +msgstr "" + +#: templates/martor/toolbar.html:3 +msgid "Bold" +msgstr "" + +#: templates/martor/toolbar.html:6 +msgid "Italic" +msgstr "" + +#: templates/martor/toolbar.html:10 +msgid "Horizontal Line" +msgstr "" + +#: templates/martor/toolbar.html:15 +msgid "Heading" +msgstr "" + +#: templates/martor/toolbar.html:20 templates/martor/toolbar.html:23 +#: templates/martor/toolbar.html:26 +msgid "H" +msgstr "" + +#: templates/martor/toolbar.html:31 +msgid "Pre or Code" +msgstr "" + +#: templates/martor/toolbar.html:38 +msgid "Pre" +msgstr "" + +#: templates/martor/toolbar.html:48 +msgid "Quote" +msgstr "" + +#: templates/martor/toolbar.html:52 +msgid "Unordered List" +msgstr "" + +#: templates/martor/toolbar.html:56 +msgid "Ordered List" +msgstr "" + +#: templates/martor/toolbar.html:60 +msgid "URL/Link" +msgstr "" + +#: templates/martor/toolbar.html:82 +msgid "Full Screen" +msgstr "" + +#: templates/martor/toolbar.html:86 +msgid "Markdown Guide (Help)" +msgstr "" + +#: templates/two_factor/_base_focus.html:6 +#: templates/two_factor/core/otp_required.html:22 +#: templates/two_factor/core/setup.html:5 +#: templates/two_factor/profile/profile.html:87 +msgid "Enable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:15 +#: templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:5 +#: templates/two_factor/core/backup_tokens.html:9 +#: templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "" + +#: templates/two_factor/core/login.html:17 +msgid "Enter your credentials." +msgstr "" + +#: templates/two_factor/core/login.html:20 +msgid "" +"We are calling your phone right now, please enter the\n" +" digits you hear." +msgstr "" + +#: templates/two_factor/core/login.html:23 +msgid "" +"We sent you a text message, please enter the tokens we\n" +" sent." +msgstr "" + +#: templates/two_factor/core/login.html:26 +msgid "" +"Please enter the tokens generated by your token\n" +" generator." +msgstr "" + +#: templates/two_factor/core/login.html:30 +msgid "" +"Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account." +msgstr "" + +#: templates/two_factor/core/login.html:47 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "" + +#: templates/two_factor/core/login.html:57 +msgid "As a last resort, you can use a backup token:" +msgstr "" + +#: templates/two_factor/core/login.html:60 +msgid "Use Backup Token" +msgstr "" + +#: templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "" + +#: templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" + +#: templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" + +#: templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + +#: templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "" + +#: templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" + +#: templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" + +#: templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" smartphone to scan the QR code below. For example, use Google\n" +" Authenticator. Then, enter the token generated by the app.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:5 +#: templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:24 +#: templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:28 +#: templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:52 +#: templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "" + +#: templates/two_factor/profile/disable.html:5 +#: templates/two_factor/profile/disable.html:9 +#: templates/two_factor/profile/profile.html:63 +#: templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "" + +#: templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "" + +#: templates/two_factor/profile/profile.html:5 +#: templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "" + +#: templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "" + +#: templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "" + +#: templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "" + +#: templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "" + +#: templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" + +#: templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "" + +#: templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" + +#: templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "" + +#: templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" + +#: templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" + +#: util/notifications.py:66 +msgid "E-Mail" +msgstr "" + +#: util/notifications.py:67 +msgid "SMS" +msgstr "" + +#: views.py:172 msgid "The person has been saved." msgstr "" -#: views.py:166 +#: views.py:195 msgid "The group has been saved." msgstr "" -#: views.py:211 +#: views.py:236 msgid "The school has been saved." msgstr "" -#: views.py:230 +#: views.py:255 msgid "The term has been saved." msgstr "" + +#: views.py:272 +msgid "You are not allowed to mark notifications from other users as read!" +msgstr "" + +#: views.py:307 +msgid "The announcement has been saved." +msgstr "" + +#: views.py:320 +msgid "The announcement has been deleted." +msgstr "" diff --git a/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po b/aleksis/core/locale/nb_NO/LC_MESSAGES/djangojs.po index 01864b41af67222125210762c072fb23302fda3a..d62e52377a4ce6af7272b5568c5da2a4698fb057 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: 2020-01-21 21:04+0000\n" +"POT-Creation-Date: 2020-03-30 09:18+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 69bb82a70bf5f966a3713a451cee8f554f48cacf..495b614c5c6694495737ed677af23b37c0e15153 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: 2019-11-23 10:06+0100\n" +"POT-Creation-Date: 2020-03-30 09:18+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" @@ -17,442 +17,695 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: forms.py:30 forms.py:66 +#: forms.py:38 forms.py:93 msgid "You cannot set a new username when also selecting an existing user." msgstr "" -#: forms.py:32 forms.py:68 +#: forms.py:41 forms.py:96 msgid "This username is already in use." msgstr "" -#: forms.py:57 +#: forms.py:83 msgid "New user" msgstr "" -#: forms.py:58 +#: forms.py:83 msgid "Create a new account" msgstr "" -#: menus.py:6 -msgid "Account" +#: forms.py:149 forms.py:152 +msgid "Date" msgstr "" -#: menus.py:11 -msgid "Stop impersonation" +#: forms.py:150 forms.py:153 +msgid "Time" msgstr "" -#: menus.py:16 templates/registration/login.html:21 -msgid "Login" +#: forms.py:155 menus.py:127 models.py:95 templates/core/persons.html:8 +#: templates/core/persons.html:9 +msgid "Persons" msgstr "" -#: menus.py:21 -msgid "Logout" +#: forms.py:156 menus.py:133 models.py:232 templates/core/groups.html:8 +#: templates/core/groups.html:9 templates/core/person_full.html:79 +msgid "Groups" msgstr "" -#: menus.py:28 -msgid "Admin" +#: forms.py:160 +msgid "From when until when should the announcement be displayed?" msgstr "" -#: menus.py:33 templates/core/data_management.html:5 -#: templates/core/data_management.html:7 -msgid "Data management" +#: forms.py:163 +msgid "Who should see the announcement?" msgstr "" -#: menus.py:38 templates/core/system_status.html:5 -#: templates/core/system_status.html:7 -msgid "System status" +#: forms.py:164 +msgid "Write your announcement:" msgstr "" -#: menus.py:43 -msgid "Impersonation" +#: forms.py:203 +msgid "You are not allowed to create announcements which are only valid in the past." msgstr "" -#: menus.py:48 -msgid "Manage school" +#: forms.py:207 +msgid "The from date and time must be earlier then the until date and time." msgstr "" -#: menus.py:55 -msgid "People" +#: forms.py:215 +msgid "You need at least one recipient." msgstr "" -#: menus.py:61 templates/core/persons.html:8 templates/core/persons.html:10 -msgid "Persons" +#: menus.py:7 templates/registration/login.html:21 +#: templates/two_factor/core/login.html:6 +#: templates/two_factor/core/login.html:10 +#: templates/two_factor/core/login.html:64 +msgid "Login" msgstr "" -#: menus.py:66 templates/core/groups.html:8 templates/core/groups.html:10 -#: templates/core/person_full.html:66 -msgid "Groups" +#: menus.py:13 +msgid "Dashboard" msgstr "" -#: menus.py:71 -msgid "Persons and accounts" +#: menus.py:19 +msgid "Account" msgstr "" -#: menus.py:80 -msgid "AlekSIS Software" +#: menus.py:26 +msgid "Stop impersonation" msgstr "" -#: menus.py:84 -msgid "Website" +#: menus.py:35 templates/core/base.html:56 +msgid "Logout" msgstr "" -#: menus.py:94 -msgid "Support" +#: menus.py:41 +msgid "Two factor auth" msgstr "" -#: menus.py:98 templates/contact_form/contact_form.html:8 -msgid "Get support" +#: menus.py:52 +msgid "Admin" msgstr "" -#: menus.py:108 -msgid "Edit school information" +#: menus.py:61 models.py:395 templates/core/announcement/list.html:7 +#: templates/core/announcement/list.html:8 +msgid "Announcements" msgstr "" -#: menus.py:112 templates/core/edit_schoolterm.html:7 -#: templates/core/edit_schoolterm.html:9 -msgid "Edit school term" +#: menus.py:70 templates/core/data_management.html:6 +#: templates/core/data_management.html:7 +msgid "Data management" msgstr "" -#: migrations/0001_initial.py:15 -msgid "Default school" +#: menus.py:79 templates/core/system_status.html:5 +#: templates/core/system_status.html:7 +msgid "System status" msgstr "" -#: migrations/0002_school_term.py:16 -msgid "Default term" +#: menus.py:88 +msgid "Impersonation" +msgstr "" + +#: menus.py:97 +msgid "Manage school" +msgstr "" + +#: menus.py:106 +msgid "Backend Admin" +msgstr "" + +#: menus.py:117 +msgid "People" +msgstr "" + +#: menus.py:139 +msgid "Persons and accounts" +msgstr "" + +#: menus.py:152 +msgid "Edit school information" msgstr "" -#: models.py:20 +#: menus.py:153 templates/core/edit_schoolterm.html:8 +#: templates/core/edit_schoolterm.html:9 +msgid "Edit school term" +msgstr "" + +#: models.py:31 models.py:517 msgid "Name" msgstr "" -#: models.py:21 +#: models.py:33 msgid "Official name" msgstr "" -#: models.py:22 +#: models.py:35 msgid "Official name of the school, e.g. as given by supervisory authority" msgstr "" -#: models.py:24 +#: models.py:38 msgid "School logo" msgstr "" -#: models.py:38 +#: models.py:51 +msgid "School" +msgstr "" + +#: models.py:52 +msgid "Schools" +msgstr "" + +#: models.py:60 msgid "Visible caption of the term" msgstr "" -#: models.py:42 +#: models.py:62 msgid "Effective start date of term" msgstr "" -#: models.py:44 +#: models.py:63 msgid "Effective end date of term" msgstr "" -#: models.py:57 +#: models.py:83 +msgid "School term" +msgstr "" + +#: models.py:84 +msgid "School terms" +msgstr "" + +#: models.py:94 templates/core/persons_accounts.html:36 +msgid "Person" +msgstr "" + +#: models.py:97 msgid "female" msgstr "" -#: models.py:58 +#: models.py:97 msgid "male" msgstr "" -#: models.py:65 +#: models.py:102 msgid "Is person active?" msgstr "" -#: models.py:67 +#: models.py:104 msgid "First name" msgstr "" -#: models.py:68 +#: models.py:105 msgid "Last name" msgstr "" -#: models.py:70 +#: models.py:107 msgid "Additional name(s)" msgstr "" -#: models.py:73 +#: models.py:111 msgid "Short name" msgstr "" -#: models.py:76 +#: models.py:114 msgid "Street" msgstr "" -#: models.py:78 +#: models.py:115 msgid "Street number" msgstr "" -#: models.py:80 +#: models.py:116 msgid "Postal code" msgstr "" -#: models.py:82 +#: models.py:117 msgid "Place" msgstr "" -#: models.py:84 +#: models.py:119 msgid "Home phone" msgstr "" -#: models.py:86 +#: models.py:120 msgid "Mobile phone" msgstr "" -#: models.py:88 +#: models.py:122 msgid "E-mail address" msgstr "" -#: models.py:91 +#: models.py:124 msgid "Date of birth" msgstr "" -#: models.py:93 +#: models.py:125 msgid "Sex" msgstr "" -#: models.py:95 +#: models.py:127 msgid "Photo" msgstr "" -#: models.py:99 +#: models.py:131 models.py:249 msgid "Reference ID of import source" msgstr "" -#: models.py:101 +#: models.py:140 msgid "Guardians / Parents" msgstr "" -#: models.py:145 +#: models.py:231 +msgid "Group" +msgstr "" + +#: models.py:234 msgid "Long name of group" msgstr "" -#: models.py:147 +#: models.py:235 msgid "Short name of group" msgstr "" -#: models.py:153 +#: models.py:244 msgid "Parent groups" msgstr "" -#: settings.py:218 +#: models.py:268 models.py:285 models.py:363 +#: templates/core/announcement/list.html:18 +msgid "Title" +msgstr "" + +#: models.py:269 models.py:286 models.py:364 +msgid "Description" +msgstr "" + +#: models.py:271 +msgid "Application" +msgstr "" + +#: models.py:277 +msgid "Activity" +msgstr "" + +#: models.py:278 +msgid "Activities" +msgstr "" + +#: models.py:282 +msgid "Sender" +msgstr "" + +#: models.py:287 models.py:365 models.py:518 +msgid "Link" +msgstr "" + +#: models.py:289 +msgid "Read" +msgstr "" + +#: models.py:290 +msgid "Sent" +msgstr "" + +#: models.py:301 +msgid "Notification" +msgstr "" + +#: models.py:302 +msgid "Notifications" +msgstr "" + +#: models.py:368 +msgid "Date and time from when to show" +msgstr "" + +#: models.py:371 +msgid "Date and time until when to show" +msgstr "" + +#: models.py:394 +msgid "Announcement" +msgstr "" + +#: models.py:422 +msgid "Announcement recipient" +msgstr "" + +#: models.py:423 +msgid "Announcement recipients" +msgstr "" + +#: models.py:473 +msgid "Widget Title" +msgstr "" + +#: models.py:474 +msgid "Activate Widget" +msgstr "" + +#: models.py:486 +msgid "Dashboard Widget" +msgstr "" + +#: models.py:487 +msgid "Dashboard Widgets" +msgstr "" + +#: models.py:491 +msgid "Menu ID" +msgstr "" + +#: models.py:492 +msgid "Menu name" +msgstr "" + +#: models.py:509 +msgid "Custom menu" +msgstr "" + +#: models.py:510 +msgid "Custom menus" +msgstr "" + +#: models.py:515 +msgid "Menu" +msgstr "" + +#: models.py:520 +msgid "Icon" +msgstr "" + +#: models.py:527 +msgid "Custom menu item" +msgstr "" + +#: models.py:528 +msgid "Custom menu items" +msgstr "" + +#: settings.py:254 msgid "German" msgstr "" -#: settings.py:219 +#: settings.py:255 msgid "English" msgstr "" -#: templates/403.html:5 -msgid "Forbidden" +#: settings.py:373 +msgid "Site title" msgstr "" -#: templates/403.html:12 -msgid "You are not allowed to access the requested page or object." +#: settings.py:374 +msgid "Site description" msgstr "" -#: templates/403.html:16 templates/404.html:20 -msgid "" -"\n" -" If you think this is an error in AlekSIS, please contact your site\n" -" administrators.\n" -" " +#: settings.py:375 +msgid "Primary colour" msgstr "" -#: templates/404.html:5 -msgid "Not found" +#: settings.py:376 +msgid "Secondary colour" msgstr "" -#: templates/404.html:12 -msgid "The requested page or object was not found." +#: settings.py:377 +msgid "Mail out name" msgstr "" -#: templates/404.html:16 +#: settings.py:378 +msgid "Mail out address" +msgstr "" + +#: settings.py:379 +msgid "Link to privacy policy" +msgstr "" + +#: settings.py:380 +msgid "Link to imprint" +msgstr "" + +#: settings.py:381 +msgid "Name format of adresses" +msgstr "" + +#: settings.py:382 +msgid "Channels to allow for notifications" +msgstr "" + +#: settings.py:383 +msgid "Regular expression to match primary group, e.g. '^Class .*'" +msgstr "" + +#: templates/403.html:10 +msgid "Error (403): You are not allowed to access the requested page or object." +msgstr "" + +#: templates/403.html:12 msgid "" "\n" -" If you were redirected by a link on an external page,\n" -" it is possible that that link was outdated.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/500.html:5 -msgid "Internal Server Error" +#: templates/404.html:10 +msgid "Error (404): The requested page or object was not found." msgstr "" -#: templates/500.html:12 +#: templates/404.html:12 msgid "" "\n" -" An unexpected error has occured.\n" +" If you were redirected by a link on an external page,\n" +" it is possible that that link was outdated.\n" " " msgstr "" -#: templates/500.html:18 +#: templates/404.html:16 msgid "" "\n" -" Your site administrators will automatically be notified about this\n" -" error.\n" -" " +" If you think this is an error in AlekSIS, please contact your site\n" +" administrators:\n" +" " msgstr "" -#: templates/503.html:5 -msgid "Maintenance mode" +#: templates/500.html:10 +msgid "Error (500): An unexpected error has occured.." msgstr "" -#: templates/503.html:12 +#: templates/500.html:12 msgid "" "\n" -" The maintenance mode is currently enabled. Please try again later.\n" -" " +" Your site administrators will automatically be notified about this\n" +" error.\n" +" " msgstr "" -#: templates/contact_form/contact_form.html:14 -msgid "Send" +#: templates/503.html:10 +msgid "The maintenance mode is currently enabled. Please try again later." msgstr "" -#: templates/contact_form/contact_form_sent.html:9 +#: templates/503.html:12 msgid "" "\n" -" The message was successfully submitted.\n" -" " +" This page is currently unavailable. If this error stays, contact your site administrators:\n" +" " msgstr "" -#: templates/core/edit_group.html:16 templates/core/edit_group.html:18 -#: templates/core/group_full.html:16 -msgid "Edit group" +#: templates/core/announcement/form.html:10 +#: templates/core/announcement/form.html:17 +msgid "Edit announcement" msgstr "" -#: templates/core/edit_group.html:26 templates/core/edit_person.html:28 -#: templates/core/edit_school.html:22 templates/core/edit_schoolterm.html:22 -msgid "Edit" +#: templates/core/announcement/form.html:12 +msgid "Publish announcement" msgstr "" -#: templates/core/edit_person.html:7 templates/core/edit_person.html:9 -#: templates/core/person_full.html:16 -msgid "Edit person" +#: templates/core/announcement/form.html:19 +#: templates/core/announcement/list.html:13 +msgid "Publish new announcement" msgstr "" -#: templates/core/edit_school.html:7 templates/core/edit_school.html:9 -msgid "Edit school" +#: templates/core/announcement/form.html:30 +msgid "Save und publish announcement" msgstr "" -#: templates/core/footer-menu.html:26 -msgid "Assorted" +#: templates/core/announcement/list.html:19 +msgid "Valid from" msgstr "" -#: templates/core/group_full.html:8 -msgid "Group" +#: templates/core/announcement/list.html:20 +msgid "Valid until" msgstr "" -#: templates/core/group_full.html:19 -msgid "Details" +#: templates/core/announcement/list.html:21 +msgid "Recipients" msgstr "" -#: templates/core/group_full.html:28 -msgid "Owners" +#: templates/core/announcement/list.html:22 +msgid "Actions" msgstr "" -#: templates/core/group_full.html:31 -msgid "Members" +#: templates/core/announcement/list.html:36 templates/core/group_full.html:15 +#: templates/core/person_full.html:15 +msgid "Edit" +msgstr "" + +#: templates/core/announcement/list.html:42 +msgid "Delete" msgstr "" -#: templates/core/group_full.html:35 -msgid "Group not found" +#: templates/core/announcement/list.html:50 +msgid "There are no announcements." msgstr "" -#: templates/core/group_full.html:38 +#: templates/core/announcements.html:9 templates/core/announcements.html:36 +#, python-format msgid "" "\n" -" There is no group with this id.\n" -" " +" Valid for %(from)s\n" +" " msgstr "" -#: templates/core/index.html:8 +#: templates/core/announcements.html:13 +#, python-format msgid "" "\n" -" AlekSIS (School Information System)\n" -" " +" Valid from %(from)s until %(until)s\n" +" " msgstr "" -#: templates/core/index.html:16 +#: templates/core/announcements.html:40 +#, python-format msgid "" "\n" -" AlekSIS is a web-based school information system (SIS) which can be " -"used to\n" -" manage and/or publish organisational data of educational " -"institutions.\n" -" " +" Valid for %(from)s – %(until)s\n" +" " msgstr "" -#: templates/core/language_form.html:5 -msgid "Language" +#: templates/core/base.html:54 +msgid "Logged in as" msgstr "" -#: templates/core/no_person.html:8 -msgid "" -"\n" -" You are not linked to a person\n" -" " +#: templates/core/base.html:146 +msgid "Impress" msgstr "" -#: templates/core/no_person.html:13 -msgid "" -"\n" -" Your user account is not linked to a person. This means you\n" -" cannot access any school-related information. Please contact\n" -" the managers of AlekSIS at your school.\n" -" " +#: templates/core/base.html:154 +msgid "Privacy Policy" msgstr "" -#: templates/core/person_full.html:8 templates/core/persons_accounts.html:41 -msgid "Person" +#: templates/core/base_print.html:60 +msgid "Powered by AlekSIS" msgstr "" -#: templates/core/person_full.html:19 -msgid "Contact details" +#: templates/core/edit_group.html:6 templates/core/edit_group.html:7 +msgid "Edit group" +msgstr "" + +#: templates/core/edit_person.html:8 templates/core/edit_person.html:9 +msgid "Edit person" +msgstr "" + +#: templates/core/edit_school.html:8 templates/core/edit_school.html:9 +msgid "Edit school" +msgstr "" + +#: templates/core/group_full.html:19 +msgid "Owners" +msgstr "" + +#: templates/core/group_full.html:22 +msgid "Members" +msgstr "" + +#: templates/core/groups.html:14 +msgid "Create group" +msgstr "" + +#: templates/core/index.html:4 +msgid "Home" +msgstr "" + +#: templates/core/index.html:11 +msgid "AlekSIS (School Information System)" +msgstr "" + +#: templates/core/index.html:43 +msgid "Last activities" +msgstr "" + +#: templates/core/index.html:61 +msgid "No activities available yet." +msgstr "" + +#: templates/core/index.html:66 +msgid "Recent notifications" +msgstr "" + +#: templates/core/index.html:82 +msgid "More information →" msgstr "" -#: templates/core/person_full.html:70 -msgid "Person not found" +#: templates/core/index.html:89 +msgid "No notifications available yet." msgstr "" -#: templates/core/person_full.html:73 +#: templates/core/no_person.html:11 msgid "" "\n" -" There is no person with this id.\n" +" Your user account is not linked to a person. This means you\n" +" cannot access any school-related information. Please contact\n" +" the managers of AlekSIS at your school.\n" " " msgstr "" -#: templates/core/persons_accounts.html:17 -#: templates/core/persons_accounts.html:20 +#: templates/core/offline.html:6 +msgid "No internet connection." +msgstr "" + +#: templates/core/offline.html:9 +msgid "" +"\n" +" There was an error accessing this page. You probably don't have an internet connection. Check to see if your WiFi or mobile data is turned on and try again. If you think you are connected, please contact the system administrators:\n" +" " +msgstr "" + +#: templates/core/person_full.html:19 +msgid "Contact details" +msgstr "" + +#: templates/core/persons_accounts.html:7 +#: templates/core/persons_accounts.html:9 msgid "Link persons to accounts" msgstr "" -#: templates/core/persons_accounts.html:26 +#: templates/core/persons_accounts.html:16 msgid "" "\n" " You can use this form to assign user accounts to persons. Use the\n" -" dropdowns to select existing accounts; use the text fields to create " -"new\n" +" dropdowns to select existing accounts; use the text fields to create new\n" " accounts on-the-fly. The latter will create a new account with the\n" " entered username and copy all other details from the person.\n" " " msgstr "" -#: templates/core/persons_accounts.html:42 +#: templates/core/persons_accounts.html:31 +#: templates/core/persons_accounts.html:55 +msgid "Update" +msgstr "" + +#: templates/core/persons_accounts.html:37 msgid "Existing account" msgstr "" -#: templates/core/persons_accounts.html:43 +#: templates/core/persons_accounts.html:38 msgid "New account" msgstr "" -#: templates/core/persons_accounts.html:59 -msgid "Update" +#: templates/core/save_button.html:3 +msgid "Save" msgstr "" -#: templates/core/school_management.html:5 +#: templates/core/school_management.html:6 #: templates/core/school_management.html:7 msgid "School management" msgstr "" @@ -461,60 +714,510 @@ msgstr "" msgid "System checks" msgstr "" -#: templates/core/system_status.html:18 +#: templates/core/system_status.html:21 msgid "Maintenance mode enabled" msgstr "" -#: templates/core/system_status.html:19 -msgid "Only admin and visitors from internal IPs can access the site." +#: templates/core/system_status.html:23 +msgid "" +"\n" +" Only admin and visitors from internal IPs can access thesite.\n" +" " msgstr "" -#: templates/core/system_status.html:24 +#: templates/core/system_status.html:34 msgid "Maintenance mode disabled" msgstr "" -#: templates/core/system_status.html:25 +#: templates/core/system_status.html:35 msgid "Everyone can access the site." msgstr "" -#: templates/core/system_status.html:33 +#: templates/core/system_status.html:45 msgid "Debug mode enabled" msgstr "" -#: templates/core/system_status.html:34 +#: templates/core/system_status.html:47 msgid "" -"The web server throws back debug information on errors. Do not use in " -"production!" +"\n" +" The web server throws back debug information on errors. Do not use in production!\n" +" " msgstr "" -#: templates/core/system_status.html:39 +#: templates/core/system_status.html:54 msgid "Debug mode disabled" msgstr "" -#: templates/core/system_status.html:40 -msgid "Debug mode is disabled. Default error pages are displayed on errors." -msgstr "" - -#: templates/core/system_status.html:50 -msgid "Recent backup cron jobs" +#: templates/core/system_status.html:56 +msgid "" +"\n" +" Debug mode is disabled. Default error pages are displayed on errors.\n" +" " msgstr "" #: templates/impersonate/list_users.html:8 msgid "Impersonate user" msgstr "" -#: views.py:143 +#: templates/martor/editor.html:27 +msgid "Uploading... please wait..." +msgstr "" + +#: templates/martor/editor.html:36 +msgid "Nothing to preview" +msgstr "" + +#: templates/martor/emoji.html:4 +msgid "Select Emoji to Insert" +msgstr "" + +#: templates/martor/emoji.html:8 +msgid "Preparing emojis..." +msgstr "" + +#: templates/martor/guide.html:8 +msgid "Markdown Guide" +msgstr "" + +#: templates/martor/guide.html:9 +#, python-format +msgid "" +"This site is powered by Markdown. For full\n" +" documentation,\n" +" <a href=\"%(doc_url)s\" target=\"_blank\">click here</a>" +msgstr "" + +#: templates/martor/guide.html:15 templates/martor/toolbar.html:42 +msgid "Code" +msgstr "" + +#: templates/martor/guide.html:16 +msgid "Or" +msgstr "" + +#: templates/martor/guide.html:19 +msgid "... to Get" +msgstr "" + +#: templates/martor/toolbar.html:3 +msgid "Bold" +msgstr "" + +#: templates/martor/toolbar.html:6 +msgid "Italic" +msgstr "" + +#: templates/martor/toolbar.html:10 +msgid "Horizontal Line" +msgstr "" + +#: templates/martor/toolbar.html:15 +msgid "Heading" +msgstr "" + +#: templates/martor/toolbar.html:20 templates/martor/toolbar.html:23 +#: templates/martor/toolbar.html:26 +msgid "H" +msgstr "" + +#: templates/martor/toolbar.html:31 +msgid "Pre or Code" +msgstr "" + +#: templates/martor/toolbar.html:38 +msgid "Pre" +msgstr "" + +#: templates/martor/toolbar.html:48 +msgid "Quote" +msgstr "" + +#: templates/martor/toolbar.html:52 +msgid "Unordered List" +msgstr "" + +#: templates/martor/toolbar.html:56 +msgid "Ordered List" +msgstr "" + +#: templates/martor/toolbar.html:60 +msgid "URL/Link" +msgstr "" + +#: templates/martor/toolbar.html:82 +msgid "Full Screen" +msgstr "" + +#: templates/martor/toolbar.html:86 +msgid "Markdown Guide (Help)" +msgstr "" + +#: templates/two_factor/_base_focus.html:6 +#: templates/two_factor/core/otp_required.html:22 +#: templates/two_factor/core/setup.html:5 +#: templates/two_factor/profile/profile.html:87 +msgid "Enable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:6 +msgid "Cancel" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:15 +#: templates/two_factor/_wizard_actions.html:20 +msgid "Back" +msgstr "" + +#: templates/two_factor/_wizard_actions.html:26 +msgid "Next" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:5 +#: templates/two_factor/core/backup_tokens.html:9 +#: templates/two_factor/profile/profile.html:46 +msgid "Backup Tokens" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:14 +msgid "" +"\n" +" Backup tokens can be used when your primary and backup\n" +" phone numbers aren't available. The backup tokens below can be used\n" +" for login verification. If you've used up all your backup tokens, you\n" +" can generate a new set of backup tokens. Only the backup tokens shown\n" +" below will be valid.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:33 +msgid "" +"\n" +" Print these tokens and keep them somewhere safe.\n" +" " +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:39 +msgid "You don't have any backup codes yet." +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:45 +msgid "Back to Account Security" +msgstr "" + +#: templates/two_factor/core/backup_tokens.html:49 +msgid "Generate Tokens" +msgstr "" + +#: templates/two_factor/core/login.html:17 +msgid "Enter your credentials." +msgstr "" + +#: templates/two_factor/core/login.html:20 +msgid "" +"We are calling your phone right now, please enter the\n" +" digits you hear." +msgstr "" + +#: templates/two_factor/core/login.html:23 +msgid "" +"We sent you a text message, please enter the tokens we\n" +" sent." +msgstr "" + +#: templates/two_factor/core/login.html:26 +msgid "" +"Please enter the tokens generated by your token\n" +" generator." +msgstr "" + +#: templates/two_factor/core/login.html:30 +msgid "" +"Use this form for entering backup tokens for logging in.\n" +" These tokens have been generated for you to print and keep safe. Please\n" +" enter one of these backup tokens to login to your account." +msgstr "" + +#: templates/two_factor/core/login.html:47 +msgid "Or, alternatively, use one of your backup phones:" +msgstr "" + +#: templates/two_factor/core/login.html:57 +msgid "As a last resort, you can use a backup token:" +msgstr "" + +#: templates/two_factor/core/login.html:60 +msgid "Use Backup Token" +msgstr "" + +#: templates/two_factor/core/otp_required.html:9 +msgid "Permission Denied" +msgstr "" + +#: templates/two_factor/core/otp_required.html:10 +msgid "" +"The page you requested, enforces users to verify using\n" +" two-factor authentication for security reasons. You need to enable these\n" +" security features in order to access this page." +msgstr "" + +#: templates/two_factor/core/otp_required.html:14 +msgid "" +"Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security." +msgstr "" + +#: templates/two_factor/core/otp_required.html:19 +msgid "Go back" +msgstr "" + +#: templates/two_factor/core/phone_register.html:5 +#: templates/two_factor/core/phone_register.html:9 +msgid "Add Backup Phone" +msgstr "" + +#: templates/two_factor/core/phone_register.html:12 +msgid "" +"You'll be adding a backup phone number to your\n" +" account. This number will be used if your primary method of\n" +" registration is not available." +msgstr "" + +#: templates/two_factor/core/phone_register.html:16 +msgid "" +"We've sent a token to your phone number. Please\n" +" enter the token you've received." +msgstr "" + +#: templates/two_factor/core/setup.html:9 +msgid "" +"\n" +" You are about to take your account security to the\n" +" next level. Follow the steps in this wizard to enable two-factor\n" +" authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:17 +msgid "" +"\n" +" Please select which authentication method you would like to use:\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:23 +msgid "" +"\n" +" To start using a token generator, please use your\n" +" smartphone to scan the QR code below. For example, use Google\n" +" Authenticator. Then, enter the token generated by the app.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:34 +msgid "" +"\n" +" Please enter the phone number you wish to receive the\n" +" text messages on. This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:41 +msgid "" +"\n" +" Please enter the phone number you wish to be called on.\n" +" This number will be validated in the next step.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:50 +msgid "" +"\n" +" We are calling your phone right now, please enter the digits you hear.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:56 +msgid "" +"\n" +" We sent you a text message, please enter the tokens we sent.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:63 +msgid "" +"\n" +" We've encountered an issue with the selected authentication method. Please\n" +" go back and verify that you entered your information correctly, try\n" +" again, or use a different authentication method instead. If the issue\n" +" persists, contact the site administrator.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup.html:73 +msgid "" +"\n" +" To identify and verify your YubiKey, please insert a\n" +" token in the field below. Your YubiKey will be linked to your\n" +" account.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:5 +#: templates/two_factor/core/setup_complete.html:9 +msgid "Two-Factor Authentication successfully enabled" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:14 +msgid "" +"\n" +" Congratulations, you've successfully enabled two-factor authentication.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:24 +#: templates/two_factor/core/setup_complete.html:44 +msgid "Back to Profile" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:28 +#: templates/two_factor/core/setup_complete.html:48 +msgid "Generate backup codes" +msgstr "" + +#: templates/two_factor/core/setup_complete.html:34 +msgid "" +"\n" +" However, it might happen that you don't have access to\n" +" your primary token device. To enable account recovery, generate backup codes\n" +" or add a phone number.\n" +" " +msgstr "" + +#: templates/two_factor/core/setup_complete.html:52 +#: templates/two_factor/profile/profile.html:41 +msgid "Add Phone Number" +msgstr "" + +#: templates/two_factor/profile/disable.html:5 +#: templates/two_factor/profile/disable.html:9 +#: templates/two_factor/profile/profile.html:63 +#: templates/two_factor/profile/profile.html:73 +msgid "Disable Two-Factor Authentication" +msgstr "" + +#: templates/two_factor/profile/disable.html:12 +msgid "You are about to disable two-factor authentication. This weakens your account security, are you sure?" +msgstr "" + +#: templates/two_factor/profile/disable.html:26 +msgid "Disable" +msgstr "" + +#: templates/two_factor/profile/profile.html:5 +#: templates/two_factor/profile/profile.html:10 +msgid "Account Security" +msgstr "" + +#: templates/two_factor/profile/profile.html:15 +msgid "Tokens will be generated by your token generator." +msgstr "" + +#: templates/two_factor/profile/profile.html:17 +#, python-format +msgid "Primary method: %(primary)s" +msgstr "" + +#: templates/two_factor/profile/profile.html:19 +msgid "Tokens will be generated by your YubiKey." +msgstr "" + +#: templates/two_factor/profile/profile.html:23 +msgid "Backup Phone Numbers" +msgstr "" + +#: templates/two_factor/profile/profile.html:24 +msgid "" +"If your primary method is not available, we are able to\n" +" send backup tokens to the phone numbers listed below." +msgstr "" + +#: templates/two_factor/profile/profile.html:33 +msgid "Unregister" +msgstr "" + +#: templates/two_factor/profile/profile.html:48 +msgid "" +"If you don't have any device with you, you can access\n" +" your account using backup tokens." +msgstr "" + +#: templates/two_factor/profile/profile.html:50 +#, python-format +msgid "" +"\n" +" You have only one backup token remaining.\n" +" " +msgid_plural "" +"\n" +" You have %(counter)s backup tokens remaining.\n" +" " +msgstr[0] "" +msgstr[1] "" + +#: templates/two_factor/profile/profile.html:59 +msgid "Show Codes" +msgstr "" + +#: templates/two_factor/profile/profile.html:65 +msgid "" +"\n" +" However we strongly discourage you to do so, you can\n" +" also disable two-factor authentication for your account.\n" +" " +msgstr "" + +#: templates/two_factor/profile/profile.html:78 +msgid "" +"\n" +" Two-factor authentication is not enabled for your\n" +" account. Enable two-factor authentication for enhanced account\n" +" security.\n" +" " +msgstr "" + +#: util/notifications.py:66 +msgid "E-Mail" +msgstr "" + +#: util/notifications.py:67 +msgid "SMS" +msgstr "" + +#: views.py:172 msgid "The person has been saved." msgstr "" -#: views.py:166 +#: views.py:195 msgid "The group has been saved." msgstr "" -#: views.py:211 +#: views.py:236 msgid "The school has been saved." msgstr "" -#: views.py:230 +#: views.py:255 msgid "The term has been saved." msgstr "" + +#: views.py:272 +msgid "You are not allowed to mark notifications from other users as read!" +msgstr "" + +#: views.py:307 +msgid "The announcement has been saved." +msgstr "" + +#: views.py:320 +msgid "The announcement has been deleted." +msgstr "" diff --git a/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po b/aleksis/core/locale/tr_TR/LC_MESSAGES/djangojs.po index 01864b41af67222125210762c072fb23302fda3a..d62e52377a4ce6af7272b5568c5da2a4698fb057 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: 2020-01-21 21:04+0000\n" +"POT-Creation-Date: 2020-03-30 09:18+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/menus.py b/aleksis/core/menus.py index 42bfffe43cee2f3cc7543a19dd28fb484c6f13ea..1ed63d98fe397c11836350d0d11bea8e2750ffaf 100644 --- a/aleksis/core/menus.py +++ b/aleksis/core/menus.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ MENUS = { "NAV_MENU_CORE": [ @@ -9,6 +9,12 @@ MENUS = { "icon": "lock_open", "validators": ["menu_generator.validators.is_anonymous"], }, + { + "name": _("Dashboard"), + "url": "index", + "icon": "home", + "validators": ["menu_generator.validators.is_authenticated"], + }, { "name": _("Account"), "url": "#", @@ -40,6 +46,12 @@ MENUS = { lambda request: "two_factor" in settings.INSTALLED_APPS, ], }, + { + "name": _("Me"), + "url": "person", + "icon": "insert_emoticon", + "validators": ["menu_generator.validators.is_authenticated"], + }, ], }, { @@ -51,6 +63,15 @@ MENUS = { "menu_generator.validators.is_superuser", ], "submenu": [ + { + "name": _("Announcements"), + "url": "announcements", + "icon": "announcement", + "validators": [ + "menu_generator.validators.is_authenticated", + "menu_generator.validators.is_superuser", + ], + }, { "name": _("Data management"), "url": "data_management", @@ -132,11 +153,6 @@ MENUS = { ], }, ], - "FOOTER_MENU_CORE": [ - {"name": _("Website"), "url": "https://aleksis.edugit.io/"}, - {"name": "Teckids e.V.", "url": "https://www.teckids.org/"}, - {"name": "Katharineum zu Lübeck", "url": "https://katharineum-zu-luebeck.de"} - ], "DATA_MANAGEMENT_MENU": [], "SCHOOL_MANAGEMENT_MENU": [ {"name": _("Edit school information"), "url": "edit_school_information", }, diff --git a/aleksis/core/migrations/0001_initial.py b/aleksis/core/migrations/0001_initial.py index 2d330f9504b8c4fa389ec50bc091e9b814c73a29..15eb9d297b01a571c60120dd9ce64fb8bbeca446 100644 --- a/aleksis/core/migrations/0001_initial.py +++ b/aleksis/core/migrations/0001_initial.py @@ -14,6 +14,7 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('otp_yubikey', '0001_initial'), ] operations = [ diff --git a/aleksis/core/migrations/0002_activity_notification.py b/aleksis/core/migrations/0002_activity_notification.py index 9679e4707063223fbc5fe5f9fdc5bcf926566874..0b05696e31ab754c009dd64743b06cd2d73deaa1 100644 --- a/aleksis/core/migrations/0002_activity_notification.py +++ b/aleksis/core/migrations/0002_activity_notification.py @@ -20,9 +20,9 @@ class Migration(migrations.Migration): ('title', models.CharField(max_length=150)), ('description', models.TextField(max_length=500)), ('link', models.URLField(blank=True)), - ('app', models.CharField(max_length=100)), + ('app', models.CharField(max_length=100, verbose_name='Sender')), ('read', models.BooleanField(default=False)), - ('mailed', models.BooleanField(default=False)), + ('mailed', models.BooleanField(default=False, verbose_name='Sent')), ('created_at', models.DateTimeField(default=django.utils.timezone.now)), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL)), diff --git a/aleksis/core/migrations/0006_create_default_term.py b/aleksis/core/migrations/0006_create_default_term.py deleted file mode 100644 index 724da0cd4bdbafab986d6b072930ccdf9f1050f4..0000000000000000000000000000000000000000 --- a/aleksis/core/migrations/0006_create_default_term.py +++ /dev/null @@ -1,27 +0,0 @@ -from django.db import migrations, models - -from datetime import date - -def create_or_mark_current_term(apps, schema_editor): - db_alias = schema_editor.connection.alias - - SchoolTerm = apps.get_model('core', 'SchoolTerm') # noqa - - if not SchoolTerm.objects.filter(current=True).exists(): - if SchoolTerm.objects.using(db_alias).exists(): - term = SchoolTerm.objects.using(db_alias).latest('date_start') - term.current=True - term.save() - else: - SchoolTerm.objects.using(db_alias).create(date_start=date.today(), current=True) - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0005_add_verbose_names_meta'), - ] - - operations = [ - migrations.RunPython(create_or_mark_current_term) - ] diff --git a/aleksis/core/migrations/0007_create_admin_user.py b/aleksis/core/migrations/0007_create_admin_user.py deleted file mode 100644 index 384e7cc10f2a474817d0386faade842aea72541d..0000000000000000000000000000000000000000 --- a/aleksis/core/migrations/0007_create_admin_user.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.contrib.auth import get_user_model -from django.db import migrations - - -def create_superuser(apps, schema_editor): - User = get_user_model() - - if not User.objects.filter(is_superuser=True).exists(): - User.objects.create_superuser( - username='admin', - email='root@example.com', - password='admin' - ).save() - - -class Migration(migrations.Migration): - - dependencies = [ - ('core', '0006_create_default_term'), - ] - - operations = [ - migrations.RunPython(create_superuser) - ] - diff --git a/aleksis/core/migrations/0008_rename_fields_notification_activity.py b/aleksis/core/migrations/0008_rename_fields_notification_activity.py index 4197d0feda366e3f3a4af3489f23763b1ed7104d..fdec9870b58cfd0f5769319e22f447b8555ba35a 100644 --- a/aleksis/core/migrations/0008_rename_fields_notification_activity.py +++ b/aleksis/core/migrations/0008_rename_fields_notification_activity.py @@ -7,7 +7,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('core', '0007_create_admin_user'), + ('core', '0005_add_verbose_names_meta'), ] operations = [ diff --git a/aleksis/core/migrations/0011_make_primary_group_optional.py b/aleksis/core/migrations/0011_make_primary_group_optional.py new file mode 100644 index 0000000000000000000000000000000000000000..0d28af2f4c01013a139328851aba9f5881e1d883 --- /dev/null +++ b/aleksis/core/migrations/0011_make_primary_group_optional.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.2 on 2020-02-03 22:41 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_dashboard_widget'), + ] + + operations = [ + migrations.AlterField( + model_name='person', + name='primary_group', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='core.Group'), + ), + ] diff --git a/aleksis/core/migrations/0012_announcement.py b/aleksis/core/migrations/0012_announcement.py new file mode 100644 index 0000000000000000000000000000000000000000..7cfd66158d4565fed228194e753c56f516fd4b6b --- /dev/null +++ b/aleksis/core/migrations/0012_announcement.py @@ -0,0 +1,29 @@ +# Generated by Django 3.0.3 on 2020-02-10 14:22 + +import datetime +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('core', '0011_make_primary_group_optional'), + ] + + operations = [ + migrations.CreateModel( + name='Announcement', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=150, verbose_name='Title')), + ('description', models.TextField(max_length=500, verbose_name='Description')), + ('link', models.URLField(blank=True, verbose_name='Link')), + ('valid_from', models.DateTimeField(default=datetime.datetime.now, verbose_name='Date and time from when to show')), + ('valid_until', models.DateTimeField(blank=True, null=True, verbose_name='Date and time until when to show')), + ('recipient_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + ), + ] diff --git a/aleksis/core/migrations/0013_extensible_model_as_default.py b/aleksis/core/migrations/0013_extensible_model_as_default.py new file mode 100644 index 0000000000000000000000000000000000000000..4e23d86f49c0fcc53d92813b794c4083e475a6e3 --- /dev/null +++ b/aleksis/core/migrations/0013_extensible_model_as_default.py @@ -0,0 +1,38 @@ +# Generated by Django 3.0.3 on 2020-02-20 12:24 + +import aleksis.core.util.core_helpers +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0012_announcement'), + ] + + operations = [ + migrations.RemoveField( + model_name='activity', + name='created_at', + ), + migrations.RemoveField( + model_name='notification', + name='created_at', + ), + migrations.AddField( + model_name='activity', + name='extended_data', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False), + ), + migrations.AddField( + model_name='announcement', + name='extended_data', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False), + ), + migrations.AddField( + model_name='notification', + name='extended_data', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False), + ), + ] diff --git a/aleksis/core/migrations/0014_accouncement_recipients.py b/aleksis/core/migrations/0014_accouncement_recipients.py new file mode 100644 index 0000000000000000000000000000000000000000..50e78da8fbb67c81fade2cd3e8923ada4653cc08 --- /dev/null +++ b/aleksis/core/migrations/0014_accouncement_recipients.py @@ -0,0 +1,57 @@ +# Generated by Django 3.0.3 on 2020-03-11 18:43 + +import aleksis.core.models +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('core', '0013_extensible_model_as_default'), + ] + + operations = [ + migrations.AlterModelOptions( + name='announcement', + options={'verbose_name': 'Announcement', 'verbose_name_plural': 'Announcements'}, + ), + migrations.RemoveField( + model_name='announcement', + name='content_type', + ), + migrations.RemoveField( + model_name='announcement', + name='recipient_id', + ), + migrations.AlterField( + model_name='announcement', + name='description', + field=models.TextField(blank=True, max_length=500, verbose_name='Description'), + ), + migrations.AlterField( + model_name='announcement', + name='valid_until', + field=models.DateTimeField(default=aleksis.core.util.core_helpers.now_tomorrow, verbose_name='Date and time until when to show'), + ), + migrations.CreateModel( + name='AnnouncementRecipient', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('recipient_id', models.PositiveIntegerField()), + ('announcement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipients', to='core.Announcement')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + ), + migrations.AlterModelOptions( + name='announcementrecipient', + options={'verbose_name': 'Announcement recipient', 'verbose_name_plural': 'Announcement recipients'}, + ), + migrations.AddField( + model_name='announcementrecipient', + name='extended_data', + field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False), + ), + ] diff --git a/aleksis/core/migrations/0015_add_import_ref_to_group.py b/aleksis/core/migrations/0015_add_import_ref_to_group.py new file mode 100644 index 0000000000000000000000000000000000000000..280e7a5565b622e1ea164dda848b4c70f5a95e02 --- /dev/null +++ b/aleksis/core/migrations/0015_add_import_ref_to_group.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.4 on 2020-03-26 23:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0014_accouncement_recipients'), + ] + + operations = [ + migrations.AddField( + model_name='group', + name='import_ref', + field=models.CharField(blank=True, editable=False, max_length=200, null=True, unique=True, verbose_name='Reference ID of import source'), + ), + ] diff --git a/aleksis/core/migrations/0016_custom_menus.py b/aleksis/core/migrations/0016_custom_menus.py new file mode 100644 index 0000000000000000000000000000000000000000..4961d51c6b2e3e34da2245c288e06864bbef3090 --- /dev/null +++ b/aleksis/core/migrations/0016_custom_menus.py @@ -0,0 +1,42 @@ +# Generated by Django 3.0.4 on 2020-03-21 16:39 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0015_add_import_ref_to_group'), + ] + + operations = [ + migrations.CreateModel( + name='CustomMenu', + fields=[ + ('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)), + ('id', models.CharField(max_length=100, primary_key=True, serialize=False, verbose_name='Menu ID')), + ('name', models.CharField(max_length=150, verbose_name='Menu name')), + ], + options={ + 'verbose_name': 'Custom menu', + 'verbose_name_plural': 'Custom menus', + }, + ), + migrations.CreateModel( + name='CustomMenuItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)), + ('name', models.CharField(max_length=150, verbose_name='Name')), + ('url', models.URLField(verbose_name='Link')), + ('icon', models.CharField(blank=True, choices=[('3d_rotation', '3d_rotation'), ('ac_unit', 'ac_unit'), ('access_alarm', 'access_alarm'), ('access_alarms', 'access_alarms'), ('access_time', 'access_time'), ('accessibility', 'accessibility'), ('accessible', 'accessible'), ('account_balance', 'account_balance'), ('account_balance_wallet', 'account_balance_wallet'), ('account_box', 'account_box'), ('account_circle', 'account_circle'), ('adb', 'adb'), ('add', 'add'), ('add_a_photo', 'add_a_photo'), ('add_alarm', 'add_alarm'), ('add_alert', 'add_alert'), ('add_box', 'add_box'), ('add_circle', 'add_circle'), ('add_circle_outline', 'add_circle_outline'), ('add_location', 'add_location'), ('add_shopping_cart', 'add_shopping_cart'), ('add_to_photos', 'add_to_photos'), ('add_to_queue', 'add_to_queue'), ('adjust', 'adjust'), ('airline_seat_flat', 'airline_seat_flat'), ('airline_seat_flat_angled', 'airline_seat_flat_angled'), ('airline_seat_individual_suite', 'airline_seat_individual_suite'), ('airline_seat_legroom_extra', 'airline_seat_legroom_extra'), ('airline_seat_legroom_normal', 'airline_seat_legroom_normal'), ('airline_seat_legroom_reduced', 'airline_seat_legroom_reduced'), ('airline_seat_recline_extra', 'airline_seat_recline_extra'), ('airline_seat_recline_normal', 'airline_seat_recline_normal'), ('airplanemode_active', 'airplanemode_active'), ('airplanemode_inactive', 'airplanemode_inactive'), ('airplay', 'airplay'), ('airport_shuttle', 'airport_shuttle'), ('alarm', 'alarm'), ('alarm_add', 'alarm_add'), ('alarm_off', 'alarm_off'), ('alarm_on', 'alarm_on'), ('album', 'album'), ('all_inclusive', 'all_inclusive'), ('all_out', 'all_out'), ('android', 'android'), ('announcement', 'announcement'), ('apps', 'apps'), ('archive', 'archive'), ('arrow_back', 'arrow_back'), ('arrow_downward', 'arrow_downward'), ('arrow_drop_down', 'arrow_drop_down'), ('arrow_drop_down_circle', 'arrow_drop_down_circle'), ('arrow_drop_up', 'arrow_drop_up'), ('arrow_forward', 'arrow_forward'), ('arrow_upward', 'arrow_upward'), ('art_track', 'art_track'), ('aspect_ratio', 'aspect_ratio'), ('assessment', 'assessment'), ('assignment', 'assignment'), ('assignment_ind', 'assignment_ind'), ('assignment_late', 'assignment_late'), ('assignment_return', 'assignment_return'), ('assignment_returned', 'assignment_returned'), ('assignment_turned_in', 'assignment_turned_in'), ('assistant', 'assistant'), ('assistant_photo', 'assistant_photo'), ('attach_file', 'attach_file'), ('attach_money', 'attach_money'), ('attachment', 'attachment'), ('audiotrack', 'audiotrack'), ('autorenew', 'autorenew'), ('av_timer', 'av_timer'), ('backspace', 'backspace'), ('backup', 'backup'), ('battery_alert', 'battery_alert'), ('battery_charging_full', 'battery_charging_full'), ('battery_full', 'battery_full'), ('battery_std', 'battery_std'), ('battery_unknown', 'battery_unknown'), ('beach_access', 'beach_access'), ('beenhere', 'beenhere'), ('block', 'block'), ('bluetooth', 'bluetooth'), ('bluetooth_audio', 'bluetooth_audio'), ('bluetooth_connected', 'bluetooth_connected'), ('bluetooth_disabled', 'bluetooth_disabled'), ('bluetooth_searching', 'bluetooth_searching'), ('blur_circular', 'blur_circular'), ('blur_linear', 'blur_linear'), ('blur_off', 'blur_off'), ('blur_on', 'blur_on'), ('book', 'book'), ('bookmark', 'bookmark'), ('bookmark_border', 'bookmark_border'), ('border_all', 'border_all'), ('border_bottom', 'border_bottom'), ('border_clear', 'border_clear'), ('border_color', 'border_color'), ('border_horizontal', 'border_horizontal'), ('border_inner', 'border_inner'), ('border_left', 'border_left'), ('border_outer', 'border_outer'), ('border_right', 'border_right'), ('border_style', 'border_style'), ('border_top', 'border_top'), ('border_vertical', 'border_vertical'), ('branding_watermark', 'branding_watermark'), ('brightness_1', 'brightness_1'), ('brightness_2', 'brightness_2'), ('brightness_3', 'brightness_3'), ('brightness_4', 'brightness_4'), ('brightness_5', 'brightness_5'), ('brightness_6', 'brightness_6'), ('brightness_7', 'brightness_7'), ('brightness_auto', 'brightness_auto'), ('brightness_high', 'brightness_high'), ('brightness_low', 'brightness_low'), ('brightness_medium', 'brightness_medium'), ('broken_image', 'broken_image'), ('brush', 'brush'), ('bubble_chart', 'bubble_chart'), ('bug_report', 'bug_report'), ('build', 'build'), ('burst_mode', 'burst_mode'), ('business', 'business'), ('business_center', 'business_center'), ('cached', 'cached'), ('cake', 'cake'), ('call', 'call'), ('call_end', 'call_end'), ('call_made', 'call_made'), ('call_merge', 'call_merge'), ('call_missed', 'call_missed'), ('call_missed_outgoing', 'call_missed_outgoing'), ('call_received', 'call_received'), ('call_split', 'call_split'), ('call_to_action', 'call_to_action'), ('camera', 'camera'), ('camera_alt', 'camera_alt'), ('camera_enhance', 'camera_enhance'), ('camera_front', 'camera_front'), ('camera_rear', 'camera_rear'), ('camera_roll', 'camera_roll'), ('cancel', 'cancel'), ('card_giftcard', 'card_giftcard'), ('card_membership', 'card_membership'), ('card_travel', 'card_travel'), ('casino', 'casino'), ('cast', 'cast'), ('cast_connected', 'cast_connected'), ('center_focus_strong', 'center_focus_strong'), ('center_focus_weak', 'center_focus_weak'), ('change_history', 'change_history'), ('chat', 'chat'), ('chat_bubble', 'chat_bubble'), ('chat_bubble_outline', 'chat_bubble_outline'), ('check', 'check'), ('check_box', 'check_box'), ('check_box_outline_blank', 'check_box_outline_blank'), ('check_circle', 'check_circle'), ('chevron_left', 'chevron_left'), ('chevron_right', 'chevron_right'), ('child_care', 'child_care'), ('child_friendly', 'child_friendly'), ('chrome_reader_mode', 'chrome_reader_mode'), ('class', 'class'), ('clear', 'clear'), ('clear_all', 'clear_all'), ('close', 'close'), ('closed_caption', 'closed_caption'), ('cloud', 'cloud'), ('cloud_circle', 'cloud_circle'), ('cloud_done', 'cloud_done'), ('cloud_download', 'cloud_download'), ('cloud_off', 'cloud_off'), ('cloud_queue', 'cloud_queue'), ('cloud_upload', 'cloud_upload'), ('code', 'code'), ('collections', 'collections'), ('collections_bookmark', 'collections_bookmark'), ('color_lens', 'color_lens'), ('colorize', 'colorize'), ('comment', 'comment'), ('compare', 'compare'), ('compare_arrows', 'compare_arrows'), ('computer', 'computer'), ('confirmation_number', 'confirmation_number'), ('contact_mail', 'contact_mail'), ('contact_phone', 'contact_phone'), ('contacts', 'contacts'), ('content_copy', 'content_copy'), ('content_cut', 'content_cut'), ('content_paste', 'content_paste'), ('control_point', 'control_point'), ('control_point_duplicate', 'control_point_duplicate'), ('copyright', 'copyright'), ('create', 'create'), ('create_new_folder', 'create_new_folder'), ('credit_card', 'credit_card'), ('crop', 'crop'), ('crop_16_9', 'crop_16_9'), ('crop_3_2', 'crop_3_2'), ('crop_5_4', 'crop_5_4'), ('crop_7_5', 'crop_7_5'), ('crop_din', 'crop_din'), ('crop_free', 'crop_free'), ('crop_landscape', 'crop_landscape'), ('crop_original', 'crop_original'), ('crop_portrait', 'crop_portrait'), ('crop_rotate', 'crop_rotate'), ('crop_square', 'crop_square'), ('dashboard', 'dashboard'), ('data_usage', 'data_usage'), ('date_range', 'date_range'), ('dehaze', 'dehaze'), ('delete', 'delete'), ('delete_forever', 'delete_forever'), ('delete_sweep', 'delete_sweep'), ('description', 'description'), ('desktop_mac', 'desktop_mac'), ('desktop_windows', 'desktop_windows'), ('details', 'details'), ('developer_board', 'developer_board'), ('developer_mode', 'developer_mode'), ('device_hub', 'device_hub'), ('devices', 'devices'), ('devices_other', 'devices_other'), ('dialer_sip', 'dialer_sip'), ('dialpad', 'dialpad'), ('directions', 'directions'), ('directions_bike', 'directions_bike'), ('directions_boat', 'directions_boat'), ('directions_bus', 'directions_bus'), ('directions_car', 'directions_car'), ('directions_railway', 'directions_railway'), ('directions_run', 'directions_run'), ('directions_subway', 'directions_subway'), ('directions_transit', 'directions_transit'), ('directions_walk', 'directions_walk'), ('disc_full', 'disc_full'), ('dns', 'dns'), ('do_not_disturb', 'do_not_disturb'), ('do_not_disturb_alt', 'do_not_disturb_alt'), ('do_not_disturb_off', 'do_not_disturb_off'), ('do_not_disturb_on', 'do_not_disturb_on'), ('dock', 'dock'), ('domain', 'domain'), ('done', 'done'), ('done_all', 'done_all'), ('donut_large', 'donut_large'), ('donut_small', 'donut_small'), ('drafts', 'drafts'), ('drag_handle', 'drag_handle'), ('drive_eta', 'drive_eta'), ('dvr', 'dvr'), ('edit', 'edit'), ('edit_location', 'edit_location'), ('eject', 'eject'), ('email', 'email'), ('enhanced_encryption', 'enhanced_encryption'), ('equalizer', 'equalizer'), ('error', 'error'), ('error_outline', 'error_outline'), ('euro_symbol', 'euro_symbol'), ('ev_station', 'ev_station'), ('event', 'event'), ('event_available', 'event_available'), ('event_busy', 'event_busy'), ('event_note', 'event_note'), ('event_seat', 'event_seat'), ('exit_to_app', 'exit_to_app'), ('expand_less', 'expand_less'), ('expand_more', 'expand_more'), ('explicit', 'explicit'), ('explore', 'explore'), ('exposure', 'exposure'), ('exposure_neg_1', 'exposure_neg_1'), ('exposure_neg_2', 'exposure_neg_2'), ('exposure_plus_1', 'exposure_plus_1'), ('exposure_plus_2', 'exposure_plus_2'), ('exposure_zero', 'exposure_zero'), ('extension', 'extension'), ('face', 'face'), ('fast_forward', 'fast_forward'), ('fast_rewind', 'fast_rewind'), ('favorite', 'favorite'), ('favorite_border', 'favorite_border'), ('featured_play_list', 'featured_play_list'), ('featured_video', 'featured_video'), ('feedback', 'feedback'), ('fiber_dvr', 'fiber_dvr'), ('fiber_manual_record', 'fiber_manual_record'), ('fiber_new', 'fiber_new'), ('fiber_pin', 'fiber_pin'), ('fiber_smart_record', 'fiber_smart_record'), ('file_download', 'file_download'), ('file_upload', 'file_upload'), ('filter', 'filter'), ('filter_1', 'filter_1'), ('filter_2', 'filter_2'), ('filter_3', 'filter_3'), ('filter_4', 'filter_4'), ('filter_5', 'filter_5'), ('filter_6', 'filter_6'), ('filter_7', 'filter_7'), ('filter_8', 'filter_8'), ('filter_9', 'filter_9'), ('filter_9_plus', 'filter_9_plus'), ('filter_b_and_w', 'filter_b_and_w'), ('filter_center_focus', 'filter_center_focus'), ('filter_drama', 'filter_drama'), ('filter_frames', 'filter_frames'), ('filter_hdr', 'filter_hdr'), ('filter_list', 'filter_list'), ('filter_none', 'filter_none'), ('filter_tilt_shift', 'filter_tilt_shift'), ('filter_vintage', 'filter_vintage'), ('find_in_page', 'find_in_page'), ('find_replace', 'find_replace'), ('fingerprint', 'fingerprint'), ('first_page', 'first_page'), ('fitness_center', 'fitness_center'), ('flag', 'flag'), ('flare', 'flare'), ('flash_auto', 'flash_auto'), ('flash_off', 'flash_off'), ('flash_on', 'flash_on'), ('flight', 'flight'), ('flight_land', 'flight_land'), ('flight_takeoff', 'flight_takeoff'), ('flip', 'flip'), ('flip_to_back', 'flip_to_back'), ('flip_to_front', 'flip_to_front'), ('folder', 'folder'), ('folder_open', 'folder_open'), ('folder_shared', 'folder_shared'), ('folder_special', 'folder_special'), ('font_download', 'font_download'), ('format_align_center', 'format_align_center'), ('format_align_justify', 'format_align_justify'), ('format_align_left', 'format_align_left'), ('format_align_right', 'format_align_right'), ('format_bold', 'format_bold'), ('format_clear', 'format_clear'), ('format_color_fill', 'format_color_fill'), ('format_color_reset', 'format_color_reset'), ('format_color_text', 'format_color_text'), ('format_indent_decrease', 'format_indent_decrease'), ('format_indent_increase', 'format_indent_increase'), ('format_italic', 'format_italic'), ('format_line_spacing', 'format_line_spacing'), ('format_list_bulleted', 'format_list_bulleted'), ('format_list_numbered', 'format_list_numbered'), ('format_paint', 'format_paint'), ('format_quote', 'format_quote'), ('format_shapes', 'format_shapes'), ('format_size', 'format_size'), ('format_strikethrough', 'format_strikethrough'), ('format_textdirection_l_to_r', 'format_textdirection_l_to_r'), ('format_textdirection_r_to_l', 'format_textdirection_r_to_l'), ('format_underlined', 'format_underlined'), ('forum', 'forum'), ('forward', 'forward'), ('forward_10', 'forward_10'), ('forward_30', 'forward_30'), ('forward_5', 'forward_5'), ('free_breakfast', 'free_breakfast'), ('fullscreen', 'fullscreen'), ('fullscreen_exit', 'fullscreen_exit'), ('functions', 'functions'), ('g_translate', 'g_translate'), ('gamepad', 'gamepad'), ('games', 'games'), ('gavel', 'gavel'), ('gesture', 'gesture'), ('get_app', 'get_app'), ('gif', 'gif'), ('golf_course', 'golf_course'), ('gps_fixed', 'gps_fixed'), ('gps_not_fixed', 'gps_not_fixed'), ('gps_off', 'gps_off'), ('grade', 'grade'), ('gradient', 'gradient'), ('grain', 'grain'), ('graphic_eq', 'graphic_eq'), ('grid_off', 'grid_off'), ('grid_on', 'grid_on'), ('group', 'group'), ('group_add', 'group_add'), ('group_work', 'group_work'), ('hd', 'hd'), ('hdr_off', 'hdr_off'), ('hdr_on', 'hdr_on'), ('hdr_strong', 'hdr_strong'), ('hdr_weak', 'hdr_weak'), ('headset', 'headset'), ('headset_mic', 'headset_mic'), ('healing', 'healing'), ('hearing', 'hearing'), ('help', 'help'), ('help_outline', 'help_outline'), ('high_quality', 'high_quality'), ('highlight', 'highlight'), ('highlight_off', 'highlight_off'), ('history', 'history'), ('home', 'home'), ('hot_tub', 'hot_tub'), ('hotel', 'hotel'), ('hourglass_empty', 'hourglass_empty'), ('hourglass_full', 'hourglass_full'), ('http', 'http'), ('https', 'https'), ('image', 'image'), ('image_aspect_ratio', 'image_aspect_ratio'), ('import_contacts', 'import_contacts'), ('import_export', 'import_export'), ('important_devices', 'important_devices'), ('inbox', 'inbox'), ('indeterminate_check_box', 'indeterminate_check_box'), ('info', 'info'), ('info_outline', 'info_outline'), ('input', 'input'), ('insert_chart', 'insert_chart'), ('insert_comment', 'insert_comment'), ('insert_drive_file', 'insert_drive_file'), ('insert_emoticon', 'insert_emoticon'), ('insert_invitation', 'insert_invitation'), ('insert_link', 'insert_link'), ('insert_photo', 'insert_photo'), ('invert_colors', 'invert_colors'), ('invert_colors_off', 'invert_colors_off'), ('iso', 'iso'), ('keyboard', 'keyboard'), ('keyboard_arrow_down', 'keyboard_arrow_down'), ('keyboard_arrow_left', 'keyboard_arrow_left'), ('keyboard_arrow_right', 'keyboard_arrow_right'), ('keyboard_arrow_up', 'keyboard_arrow_up'), ('keyboard_backspace', 'keyboard_backspace'), ('keyboard_capslock', 'keyboard_capslock'), ('keyboard_hide', 'keyboard_hide'), ('keyboard_return', 'keyboard_return'), ('keyboard_tab', 'keyboard_tab'), ('keyboard_voice', 'keyboard_voice'), ('kitchen', 'kitchen'), ('label', 'label'), ('label_outline', 'label_outline'), ('landscape', 'landscape'), ('language', 'language'), ('laptop', 'laptop'), ('laptop_chromebook', 'laptop_chromebook'), ('laptop_mac', 'laptop_mac'), ('laptop_windows', 'laptop_windows'), ('last_page', 'last_page'), ('launch', 'launch'), ('layers', 'layers'), ('layers_clear', 'layers_clear'), ('leak_add', 'leak_add'), ('leak_remove', 'leak_remove'), ('lens', 'lens'), ('library_add', 'library_add'), ('library_books', 'library_books'), ('library_music', 'library_music'), ('lightbulb_outline', 'lightbulb_outline'), ('line_style', 'line_style'), ('line_weight', 'line_weight'), ('linear_scale', 'linear_scale'), ('link', 'link'), ('linked_camera', 'linked_camera'), ('list', 'list'), ('live_help', 'live_help'), ('live_tv', 'live_tv'), ('local_activity', 'local_activity'), ('local_airport', 'local_airport'), ('local_atm', 'local_atm'), ('local_bar', 'local_bar'), ('local_cafe', 'local_cafe'), ('local_car_wash', 'local_car_wash'), ('local_convenience_store', 'local_convenience_store'), ('local_dining', 'local_dining'), ('local_drink', 'local_drink'), ('local_florist', 'local_florist'), ('local_gas_station', 'local_gas_station'), ('local_grocery_store', 'local_grocery_store'), ('local_hospital', 'local_hospital'), ('local_hotel', 'local_hotel'), ('local_laundry_service', 'local_laundry_service'), ('local_library', 'local_library'), ('local_mall', 'local_mall'), ('local_movies', 'local_movies'), ('local_offer', 'local_offer'), ('local_parking', 'local_parking'), ('local_pharmacy', 'local_pharmacy'), ('local_phone', 'local_phone'), ('local_pizza', 'local_pizza'), ('local_play', 'local_play'), ('local_post_office', 'local_post_office'), ('local_printshop', 'local_printshop'), ('local_see', 'local_see'), ('local_shipping', 'local_shipping'), ('local_taxi', 'local_taxi'), ('location_city', 'location_city'), ('location_disabled', 'location_disabled'), ('location_off', 'location_off'), ('location_on', 'location_on'), ('location_searching', 'location_searching'), ('lock', 'lock'), ('lock_open', 'lock_open'), ('lock_outline', 'lock_outline'), ('looks', 'looks'), ('looks_3', 'looks_3'), ('looks_4', 'looks_4'), ('looks_5', 'looks_5'), ('looks_6', 'looks_6'), ('looks_one', 'looks_one'), ('looks_two', 'looks_two'), ('loop', 'loop'), ('loupe', 'loupe'), ('low_priority', 'low_priority'), ('loyalty', 'loyalty'), ('mail', 'mail'), ('mail_outline', 'mail_outline'), ('map', 'map'), ('markunread', 'markunread'), ('markunread_mailbox', 'markunread_mailbox'), ('memory', 'memory'), ('menu', 'menu'), ('merge_type', 'merge_type'), ('message', 'message'), ('mic', 'mic'), ('mic_none', 'mic_none'), ('mic_off', 'mic_off'), ('mms', 'mms'), ('mode_comment', 'mode_comment'), ('mode_edit', 'mode_edit'), ('monetization_on', 'monetization_on'), ('money_off', 'money_off'), ('monochrome_photos', 'monochrome_photos'), ('mood', 'mood'), ('mood_bad', 'mood_bad'), ('more', 'more'), ('more_horiz', 'more_horiz'), ('more_vert', 'more_vert'), ('motorcycle', 'motorcycle'), ('mouse', 'mouse'), ('move_to_inbox', 'move_to_inbox'), ('movie', 'movie'), ('movie_creation', 'movie_creation'), ('movie_filter', 'movie_filter'), ('multiline_chart', 'multiline_chart'), ('music_note', 'music_note'), ('music_video', 'music_video'), ('my_location', 'my_location'), ('nature', 'nature'), ('nature_people', 'nature_people'), ('navigate_before', 'navigate_before'), ('navigate_next', 'navigate_next'), ('navigation', 'navigation'), ('near_me', 'near_me'), ('network_cell', 'network_cell'), ('network_check', 'network_check'), ('network_locked', 'network_locked'), ('network_wifi', 'network_wifi'), ('new_releases', 'new_releases'), ('next_week', 'next_week'), ('nfc', 'nfc'), ('no_encryption', 'no_encryption'), ('no_sim', 'no_sim'), ('not_interested', 'not_interested'), ('note', 'note'), ('note_add', 'note_add'), ('notifications', 'notifications'), ('notifications_active', 'notifications_active'), ('notifications_none', 'notifications_none'), ('notifications_off', 'notifications_off'), ('notifications_paused', 'notifications_paused'), ('offline_pin', 'offline_pin'), ('ondemand_video', 'ondemand_video'), ('opacity', 'opacity'), ('open_in_browser', 'open_in_browser'), ('open_in_new', 'open_in_new'), ('open_with', 'open_with'), ('pages', 'pages'), ('pageview', 'pageview'), ('palette', 'palette'), ('pan_tool', 'pan_tool'), ('panorama', 'panorama'), ('panorama_fish_eye', 'panorama_fish_eye'), ('panorama_horizontal', 'panorama_horizontal'), ('panorama_vertical', 'panorama_vertical'), ('panorama_wide_angle', 'panorama_wide_angle'), ('party_mode', 'party_mode'), ('pause', 'pause'), ('pause_circle_filled', 'pause_circle_filled'), ('pause_circle_outline', 'pause_circle_outline'), ('payment', 'payment'), ('people', 'people'), ('people_outline', 'people_outline'), ('perm_camera_mic', 'perm_camera_mic'), ('perm_contact_calendar', 'perm_contact_calendar'), ('perm_data_setting', 'perm_data_setting'), ('perm_device_information', 'perm_device_information'), ('perm_identity', 'perm_identity'), ('perm_media', 'perm_media'), ('perm_phone_msg', 'perm_phone_msg'), ('perm_scan_wifi', 'perm_scan_wifi'), ('person', 'person'), ('person_add', 'person_add'), ('person_outline', 'person_outline'), ('person_pin', 'person_pin'), ('person_pin_circle', 'person_pin_circle'), ('personal_video', 'personal_video'), ('pets', 'pets'), ('phone', 'phone'), ('phone_android', 'phone_android'), ('phone_bluetooth_speaker', 'phone_bluetooth_speaker'), ('phone_forwarded', 'phone_forwarded'), ('phone_in_talk', 'phone_in_talk'), ('phone_iphone', 'phone_iphone'), ('phone_locked', 'phone_locked'), ('phone_missed', 'phone_missed'), ('phone_paused', 'phone_paused'), ('phonelink', 'phonelink'), ('phonelink_erase', 'phonelink_erase'), ('phonelink_lock', 'phonelink_lock'), ('phonelink_off', 'phonelink_off'), ('phonelink_ring', 'phonelink_ring'), ('phonelink_setup', 'phonelink_setup'), ('photo', 'photo'), ('photo_album', 'photo_album'), ('photo_camera', 'photo_camera'), ('photo_filter', 'photo_filter'), ('photo_library', 'photo_library'), ('photo_size_select_actual', 'photo_size_select_actual'), ('photo_size_select_large', 'photo_size_select_large'), ('photo_size_select_small', 'photo_size_select_small'), ('picture_as_pdf', 'picture_as_pdf'), ('picture_in_picture', 'picture_in_picture'), ('picture_in_picture_alt', 'picture_in_picture_alt'), ('pie_chart', 'pie_chart'), ('pie_chart_outlined', 'pie_chart_outlined'), ('pin_drop', 'pin_drop'), ('place', 'place'), ('play_arrow', 'play_arrow'), ('play_circle_filled', 'play_circle_filled'), ('play_circle_outline', 'play_circle_outline'), ('play_for_work', 'play_for_work'), ('playlist_add', 'playlist_add'), ('playlist_add_check', 'playlist_add_check'), ('playlist_play', 'playlist_play'), ('plus_one', 'plus_one'), ('poll', 'poll'), ('polymer', 'polymer'), ('pool', 'pool'), ('portable_wifi_off', 'portable_wifi_off'), ('portrait', 'portrait'), ('power', 'power'), ('power_input', 'power_input'), ('power_settings_new', 'power_settings_new'), ('pregnant_woman', 'pregnant_woman'), ('present_to_all', 'present_to_all'), ('print', 'print'), ('priority_high', 'priority_high'), ('public', 'public'), ('publish', 'publish'), ('query_builder', 'query_builder'), ('question_answer', 'question_answer'), ('queue', 'queue'), ('queue_music', 'queue_music'), ('queue_play_next', 'queue_play_next'), ('radio', 'radio'), ('radio_button_checked', 'radio_button_checked'), ('radio_button_unchecked', 'radio_button_unchecked'), ('rate_review', 'rate_review'), ('receipt', 'receipt'), ('recent_actors', 'recent_actors'), ('record_voice_over', 'record_voice_over'), ('redeem', 'redeem'), ('redo', 'redo'), ('refresh', 'refresh'), ('remove', 'remove'), ('remove_circle', 'remove_circle'), ('remove_circle_outline', 'remove_circle_outline'), ('remove_from_queue', 'remove_from_queue'), ('remove_red_eye', 'remove_red_eye'), ('remove_shopping_cart', 'remove_shopping_cart'), ('reorder', 'reorder'), ('repeat', 'repeat'), ('repeat_one', 'repeat_one'), ('replay', 'replay'), ('replay_10', 'replay_10'), ('replay_30', 'replay_30'), ('replay_5', 'replay_5'), ('reply', 'reply'), ('reply_all', 'reply_all'), ('report', 'report'), ('report_problem', 'report_problem'), ('restaurant', 'restaurant'), ('restaurant_menu', 'restaurant_menu'), ('restore', 'restore'), ('restore_page', 'restore_page'), ('ring_volume', 'ring_volume'), ('room', 'room'), ('room_service', 'room_service'), ('rotate_90_degrees_ccw', 'rotate_90_degrees_ccw'), ('rotate_left', 'rotate_left'), ('rotate_right', 'rotate_right'), ('rounded_corner', 'rounded_corner'), ('router', 'router'), ('rowing', 'rowing'), ('rss_feed', 'rss_feed'), ('rv_hookup', 'rv_hookup'), ('satellite', 'satellite'), ('save', 'save'), ('scanner', 'scanner'), ('schedule', 'schedule'), ('school', 'school'), ('screen_lock_landscape', 'screen_lock_landscape'), ('screen_lock_portrait', 'screen_lock_portrait'), ('screen_lock_rotation', 'screen_lock_rotation'), ('screen_rotation', 'screen_rotation'), ('screen_share', 'screen_share'), ('sd_card', 'sd_card'), ('sd_storage', 'sd_storage'), ('search', 'search'), ('security', 'security'), ('select_all', 'select_all'), ('send', 'send'), ('sentiment_dissatisfied', 'sentiment_dissatisfied'), ('sentiment_neutral', 'sentiment_neutral'), ('sentiment_satisfied', 'sentiment_satisfied'), ('sentiment_very_dissatisfied', 'sentiment_very_dissatisfied'), ('sentiment_very_satisfied', 'sentiment_very_satisfied'), ('settings', 'settings'), ('settings_applications', 'settings_applications'), ('settings_backup_restore', 'settings_backup_restore'), ('settings_bluetooth', 'settings_bluetooth'), ('settings_brightness', 'settings_brightness'), ('settings_cell', 'settings_cell'), ('settings_ethernet', 'settings_ethernet'), ('settings_input_antenna', 'settings_input_antenna'), ('settings_input_component', 'settings_input_component'), ('settings_input_composite', 'settings_input_composite'), ('settings_input_hdmi', 'settings_input_hdmi'), ('settings_input_svideo', 'settings_input_svideo'), ('settings_overscan', 'settings_overscan'), ('settings_phone', 'settings_phone'), ('settings_power', 'settings_power'), ('settings_remote', 'settings_remote'), ('settings_system_daydream', 'settings_system_daydream'), ('settings_voice', 'settings_voice'), ('share', 'share'), ('shop', 'shop'), ('shop_two', 'shop_two'), ('shopping_basket', 'shopping_basket'), ('shopping_cart', 'shopping_cart'), ('short_text', 'short_text'), ('show_chart', 'show_chart'), ('shuffle', 'shuffle'), ('signal_cellular_4_bar', 'signal_cellular_4_bar'), ('signal_cellular_connected_no_internet_4_bar', 'signal_cellular_connected_no_internet_4_bar'), ('signal_cellular_no_sim', 'signal_cellular_no_sim'), ('signal_cellular_null', 'signal_cellular_null'), ('signal_cellular_off', 'signal_cellular_off'), ('signal_wifi_4_bar', 'signal_wifi_4_bar'), ('signal_wifi_4_bar_lock', 'signal_wifi_4_bar_lock'), ('signal_wifi_off', 'signal_wifi_off'), ('sim_card', 'sim_card'), ('sim_card_alert', 'sim_card_alert'), ('skip_next', 'skip_next'), ('skip_previous', 'skip_previous'), ('slideshow', 'slideshow'), ('slow_motion_video', 'slow_motion_video'), ('smartphone', 'smartphone'), ('smoke_free', 'smoke_free'), ('smoking_rooms', 'smoking_rooms'), ('sms', 'sms'), ('sms_failed', 'sms_failed'), ('snooze', 'snooze'), ('sort', 'sort'), ('sort_by_alpha', 'sort_by_alpha'), ('spa', 'spa'), ('space_bar', 'space_bar'), ('speaker', 'speaker'), ('speaker_group', 'speaker_group'), ('speaker_notes', 'speaker_notes'), ('speaker_notes_off', 'speaker_notes_off'), ('speaker_phone', 'speaker_phone'), ('spellcheck', 'spellcheck'), ('star', 'star'), ('star_border', 'star_border'), ('star_half', 'star_half'), ('stars', 'stars'), ('stay_current_landscape', 'stay_current_landscape'), ('stay_current_portrait', 'stay_current_portrait'), ('stay_primary_landscape', 'stay_primary_landscape'), ('stay_primary_portrait', 'stay_primary_portrait'), ('stop', 'stop'), ('stop_screen_share', 'stop_screen_share'), ('storage', 'storage'), ('store', 'store'), ('store_mall_directory', 'store_mall_directory'), ('straighten', 'straighten'), ('streetview', 'streetview'), ('strikethrough_s', 'strikethrough_s'), ('style', 'style'), ('subdirectory_arrow_left', 'subdirectory_arrow_left'), ('subdirectory_arrow_right', 'subdirectory_arrow_right'), ('subject', 'subject'), ('subscriptions', 'subscriptions'), ('subtitles', 'subtitles'), ('subway', 'subway'), ('supervisor_account', 'supervisor_account'), ('surround_sound', 'surround_sound'), ('swap_calls', 'swap_calls'), ('swap_horiz', 'swap_horiz'), ('swap_vert', 'swap_vert'), ('swap_vertical_circle', 'swap_vertical_circle'), ('switch_camera', 'switch_camera'), ('switch_video', 'switch_video'), ('sync', 'sync'), ('sync_disabled', 'sync_disabled'), ('sync_problem', 'sync_problem'), ('system_update', 'system_update'), ('system_update_alt', 'system_update_alt'), ('tab', 'tab'), ('tab_unselected', 'tab_unselected'), ('tablet', 'tablet'), ('tablet_android', 'tablet_android'), ('tablet_mac', 'tablet_mac'), ('tag_faces', 'tag_faces'), ('tap_and_play', 'tap_and_play'), ('terrain', 'terrain'), ('text_fields', 'text_fields'), ('text_format', 'text_format'), ('textsms', 'textsms'), ('texture', 'texture'), ('theaters', 'theaters'), ('thumb_down', 'thumb_down'), ('thumb_up', 'thumb_up'), ('thumbs_up_down', 'thumbs_up_down'), ('time_to_leave', 'time_to_leave'), ('timelapse', 'timelapse'), ('timeline', 'timeline'), ('timer', 'timer'), ('timer_10', 'timer_10'), ('timer_3', 'timer_3'), ('timer_off', 'timer_off'), ('title', 'title'), ('toc', 'toc'), ('today', 'today'), ('toll', 'toll'), ('tonality', 'tonality'), ('touch_app', 'touch_app'), ('toys', 'toys'), ('track_changes', 'track_changes'), ('traffic', 'traffic'), ('train', 'train'), ('tram', 'tram'), ('transfer_within_a_station', 'transfer_within_a_station'), ('transform', 'transform'), ('translate', 'translate'), ('trending_down', 'trending_down'), ('trending_flat', 'trending_flat'), ('trending_up', 'trending_up'), ('tune', 'tune'), ('turned_in', 'turned_in'), ('turned_in_not', 'turned_in_not'), ('tv', 'tv'), ('unarchive', 'unarchive'), ('undo', 'undo'), ('unfold_less', 'unfold_less'), ('unfold_more', 'unfold_more'), ('update', 'update'), ('usb', 'usb'), ('verified_user', 'verified_user'), ('vertical_align_bottom', 'vertical_align_bottom'), ('vertical_align_center', 'vertical_align_center'), ('vertical_align_top', 'vertical_align_top'), ('vibration', 'vibration'), ('video_call', 'video_call'), ('video_label', 'video_label'), ('video_library', 'video_library'), ('videocam', 'videocam'), ('videocam_off', 'videocam_off'), ('videogame_asset', 'videogame_asset'), ('view_agenda', 'view_agenda'), ('view_array', 'view_array'), ('view_carousel', 'view_carousel'), ('view_column', 'view_column'), ('view_comfy', 'view_comfy'), ('view_compact', 'view_compact'), ('view_day', 'view_day'), ('view_headline', 'view_headline'), ('view_list', 'view_list'), ('view_module', 'view_module'), ('view_quilt', 'view_quilt'), ('view_stream', 'view_stream'), ('view_week', 'view_week'), ('vignette', 'vignette'), ('visibility', 'visibility'), ('visibility_off', 'visibility_off'), ('voice_chat', 'voice_chat'), ('voicemail', 'voicemail'), ('volume_down', 'volume_down'), ('volume_mute', 'volume_mute'), ('volume_off', 'volume_off'), ('volume_up', 'volume_up'), ('vpn_key', 'vpn_key'), ('vpn_lock', 'vpn_lock'), ('wallpaper', 'wallpaper'), ('warning', 'warning'), ('watch', 'watch'), ('watch_later', 'watch_later'), ('wb_auto', 'wb_auto'), ('wb_cloudy', 'wb_cloudy'), ('wb_incandescent', 'wb_incandescent'), ('wb_iridescent', 'wb_iridescent'), ('wb_sunny', 'wb_sunny'), ('wc', 'wc'), ('web', 'web'), ('web_asset', 'web_asset'), ('weekend', 'weekend'), ('whatshot', 'whatshot'), ('widgets', 'widgets'), ('wifi', 'wifi'), ('wifi_lock', 'wifi_lock'), ('wifi_tethering', 'wifi_tethering'), ('work', 'work'), ('wrap_text', 'wrap_text'), ('youtube_searched_for', 'youtube_searched_for'), ('zoom_in', 'zoom_in'), ('zoom_out', 'zoom_out'), ('zoom_out_map', 'zoom_out_map')], max_length=50, null=True, verbose_name='Icon')), + ('menu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.CustomMenu', verbose_name='Menu')), + ], + options={ + 'verbose_name': 'Custom menu item', + 'verbose_name_plural': 'Custom menu items' + }, + ), + ] diff --git a/aleksis/core/migrations/0017_make_group_short_name_optional.py b/aleksis/core/migrations/0017_make_group_short_name_optional.py new file mode 100644 index 0000000000000000000000000000000000000000..80c45b922b35706e3e33a2c432150d2ec87e9b14 --- /dev/null +++ b/aleksis/core/migrations/0017_make_group_short_name_optional.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.4 on 2020-03-28 16:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0016_custom_menus'), + ] + + operations = [ + migrations.AlterField( + model_name='group', + name='short_name', + field=models.CharField(blank=True, max_length=16, null=True, unique=True, verbose_name='Short name of group'), + ), + ] diff --git a/aleksis/core/migrations/0018_increase_length_of_group_shortname.py b/aleksis/core/migrations/0018_increase_length_of_group_shortname.py new file mode 100644 index 0000000000000000000000000000000000000000..f8a0e15106f90f4e3616202207456907adb26a2a --- /dev/null +++ b/aleksis/core/migrations/0018_increase_length_of_group_shortname.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.4 on 2020-03-29 13:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0017_make_group_short_name_optional'), + ] + + operations = [ + migrations.AlterField( + model_name='group', + name='short_name', + field=models.CharField(blank=True, max_length=30, null=True, unique=True, verbose_name='Short name of group'), + ), + ] diff --git a/aleksis/core/migrations/0019_drop_import_refs.py b/aleksis/core/migrations/0019_drop_import_refs.py new file mode 100644 index 0000000000000000000000000000000000000000..493eb1217964b5ca99b80981e998d05be637c0b6 --- /dev/null +++ b/aleksis/core/migrations/0019_drop_import_refs.py @@ -0,0 +1,21 @@ +# Generated by Django 3.0.4 on 2020-03-30 12:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0018_increase_length_of_group_shortname'), + ] + + operations = [ + migrations.RemoveField( + model_name='group', + name='import_ref', + ), + migrations.RemoveField( + model_name='person', + name='import_ref', + ), + ] diff --git a/aleksis/core/migrations/0020_incease_length_of_fields.py b/aleksis/core/migrations/0020_incease_length_of_fields.py new file mode 100644 index 0000000000000000000000000000000000000000..d6346f123e62df628166de205d033935c04142e4 --- /dev/null +++ b/aleksis/core/migrations/0020_incease_length_of_fields.py @@ -0,0 +1,88 @@ +# Generated by Django 3.0.4 on 2020-03-31 12:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0019_drop_import_refs'), + ] + + operations = [ + migrations.AlterField( + model_name='group', + name='name', + field=models.CharField(max_length=255, unique=True, verbose_name='Long name of group'), + ), + migrations.AlterField( + model_name='group', + name='short_name', + field=models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='Short name of group'), + ), + migrations.AlterField( + model_name='notification', + name='sender', + field=models.CharField(max_length=100, verbose_name='Sender'), + ), + migrations.AlterField( + model_name='notification', + name='sent', + field=models.BooleanField(default=False, verbose_name='Sent'), + ), + migrations.AlterField( + model_name='person', + name='additional_name', + field=models.CharField(blank=True, max_length=255, verbose_name='Additional name(s)'), + ), + migrations.AlterField( + model_name='person', + name='first_name', + field=models.CharField(max_length=255, verbose_name='First name'), + ), + migrations.AlterField( + model_name='person', + name='housenumber', + field=models.CharField(blank=True, max_length=255, verbose_name='Street number'), + ), + migrations.AlterField( + model_name='person', + name='last_name', + field=models.CharField(max_length=255, verbose_name='Last name'), + ), + migrations.AlterField( + model_name='person', + name='place', + field=models.CharField(blank=True, max_length=255, verbose_name='Place'), + ), + migrations.AlterField( + model_name='person', + name='postal_code', + field=models.CharField(blank=True, max_length=255, verbose_name='Postal code'), + ), + migrations.AlterField( + model_name='person', + name='short_name', + field=models.CharField(blank=True, max_length=255, null=True, unique=True, verbose_name='Short name'), + ), + migrations.AlterField( + model_name='person', + name='street', + field=models.CharField(blank=True, max_length=255, verbose_name='Street'), + ), + migrations.AlterField( + model_name='school', + name='name', + field=models.CharField(max_length=255, verbose_name='Name'), + ), + migrations.AlterField( + model_name='school', + name='name_official', + field=models.CharField(help_text='Official name of the school, e.g. as given by supervisory authority', max_length=255, verbose_name='Official name'), + ), + migrations.AlterField( + model_name='schoolterm', + name='caption', + field=models.CharField(max_length=255, verbose_name='Visible caption of the term'), + ), + ] diff --git a/aleksis/core/migrations/0021_person_description_field.py b/aleksis/core/migrations/0021_person_description_field.py new file mode 100644 index 0000000000000000000000000000000000000000..6e8aa927c1b04a2b5812dd54b86d0a0a67397cb1 --- /dev/null +++ b/aleksis/core/migrations/0021_person_description_field.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2020-04-13 13:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0020_incease_length_of_fields'), + ] + + operations = [ + migrations.AddField( + model_name='person', + name='description', + field=models.TextField(blank=True, null=True, verbose_name='Description'), + ), + ] diff --git a/aleksis/core/migrations/0022_group_types.py b/aleksis/core/migrations/0022_group_types.py new file mode 100644 index 0000000000000000000000000000000000000000..c521da4a6f5a5d6f6c314ee0b34e57cb374c9e7c --- /dev/null +++ b/aleksis/core/migrations/0022_group_types.py @@ -0,0 +1,33 @@ +# Generated by Django 3.0.5 on 2020-04-13 13:44 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0021_person_description_field'), + ] + + operations = [ + migrations.CreateModel( + name='GroupType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)), + ('name', models.CharField(max_length=50, verbose_name='Title of type')), + ('description', models.CharField(max_length=500, verbose_name='Description')), + ], + options={ + 'verbose_name': 'Group type', + 'verbose_name_plural': 'Group types', + }, + ), + migrations.AddField( + model_name='group', + name='type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='type', to='core.GroupType', verbose_name='Type of group'), + ), + ] diff --git a/aleksis/core/mixins.py b/aleksis/core/mixins.py index ff79940ea9e5e091b381a99a85b2d1f8a9587d1a..574cf185cc2350e3e7b45f7723c8e9313a631790 100644 --- a/aleksis/core/mixins.py +++ b/aleksis/core/mixins.py @@ -1,16 +1,44 @@ -from typing import Any, Callable, Optional +from datetime import datetime +from typing import Any, Callable, Optional, Union from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import QuerySet +from django.forms.models import ModelFormMetaclass, ModelForm from easyaudit.models import CRUDEvent from jsonstore.fields import JSONField, JSONFieldMixin +from material.base import LayoutNode, Layout -class ExtensibleModel(models.Model): - """ Allow injection of fields and code from AlekSIS apps to extend - model functionality. +class CRUDMixin(models.Model): + class Meta: + abstract = True + + @property + def crud_events(self) -> QuerySet: + """Get all CRUD events connected to this object from easyaudit.""" + + content_type = ContentType.objects.get_for_model(self) + + return CRUDEvent.objects.filter( + object_id=self.pk, content_type=content_type + ).select_related("user") + + +class ExtensibleModel(CRUDMixin): + """ Base model for all objects in AlekSIS apps + + This base model ensures all objects in AlekSIS apps fulfill the + following properties: + + * crud_events property to retrieve easyaudit's CRUD event log + * created_at and updated_at properties based n CRUD events + * Allow injection of fields and code from AlekSIS apps to extend + model functionality. + + Injection of fields and code + ============================ After all apps have been loaded, the code in the `model_extensions` module in every app is executed. All code that shall be injected into a model goes there. @@ -43,8 +71,55 @@ class ExtensibleModel(models.Model): - Dominik George <dominik.george@teckids.org> """ + # Defines a material design icon associated with this type of model + icon_ = "radio_button_unchecked" + + def get_absolute_url(self) -> str: + """ Get the URL o a view representing this model instance """ + pass + + @property + def crud_event_create(self) -> Optional[CRUDEvent]: + """ Return create event of this object """ + return self.crud_events.filter(event_type=CRUDEvent.CREATE).latest("datetime") + + @property + def crud_event_update(self) -> Optional[CRUDEvent]: + """ Return last event of this object """ + return self.crud_events.latest("datetime") + + @property + def created_at(self) -> Optional[datetime]: + """ Determine creation timestamp from CRUD log """ + + if self.crud_event_create: + return self.crud_event_create.datetime + + @property + def updated_at(self) -> Optional[datetime]: + """ Determine last timestamp from CRUD log """ + + if self.crud_event_update: + return self.crud_event_update.datetime + extended_data = JSONField(default=dict, editable=False) - + + @property + def created_by(self) -> Optional[models.Model]: + """ Determine user who created this object from CRUD log """ + + if self.crud_event_create: + return self.crud_event_create.user + + @property + def updated_by(self) -> Optional[models.Model]: + """ Determine user who last updated this object from CRUD log """ + + if self.crud_event_update: + return self.crud_event_update.user + + extended_data = JSONField(default=dict, editable=False) + @classmethod def _safe_add(cls, obj: Any, name: Optional[str]) -> None: # Decide the name for the attribute @@ -75,6 +150,12 @@ class ExtensibleModel(models.Model): cls._safe_add(func, func.__name__) + @classmethod + def class_method(cls, func: Callable[[], Any], name: Optional[str] = None) -> None: + """ Adds the passed callable as a classmethod. """ + + cls._safe_add(classmethod(func), func.__name__) + @classmethod def field(cls, **kwargs) -> None: """ Adds the passed jsonstore field. Must be one of the fields in @@ -101,17 +182,54 @@ class ExtensibleModel(models.Model): class Meta: abstract = True +class PureDjangoModel(object): + """ No-op mixin to mark a model as deliberately not using ExtensibleModel """ + pass -class CRUDMixin(models.Model): - class Meta: - abstract = True - @property - def crud_events(self) -> QuerySet: - """Get all CRUD events connected to this object from easyaudit.""" +class _ExtensibleFormMetaclass(ModelFormMetaclass): + def __new__(mcs, name, bases, dct): + x = super().__new__(mcs, name, bases, dct) - content_type = ContentType.objects.get_for_model(self) + if hasattr(x, "layout"): + base_layout = x.layout.elements + else: + base_layout = [] - return CRUDEvent.objects.filter( - object_id=self.pk, content_type=content_type - ).select_related("user") + x.base_layout = base_layout + x.layout = Layout(*base_layout) + + return x + + +class ExtensibleForm(ModelForm, metaclass=_ExtensibleFormMetaclass): + """ Base model for extensible forms + + This mixin adds functionality which allows + - apps to add layout nodes to the layout used by django-material + + Add layout nodes + ================ + + ``` + from material import Fieldset + + from aleksis.core.forms import ExampleForm + + node = Fieldset("field_name") + ExampleForm.add_node_to_layout(node) + ``` + + """ + + @classmethod + def add_node_to_layout(cls, node: Union[LayoutNode, str]): + """ + Add a node to `layout` attribute + + :param node: django-material layout node (Fieldset, Row etc.) + :type node: LayoutNode + """ + + cls.base_layout.append(node) + cls.layout = Layout(*cls.base_layout) diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 40b0b53339b90311fa8f7aaaa459e91b7db0cdb4..8d9991f03e26a70c965e597acf05a1d189f65767 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -1,15 +1,24 @@ -from typing import Optional +from datetime import date, datetime +from typing import Optional, Iterable, Union, Sequence, List from django.contrib.auth import get_user_model -from django.contrib.auth.models import User +from django.contrib.auth.models import Group as DjangoGroup +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.db.models import QuerySet +from django.forms.widgets import Media +from django.urls import reverse +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from image_cropping import ImageCropField, ImageRatioField from phonenumber_field.modelfields import PhoneNumberField from polymorphic.models import PolymorphicModel -from .mixins import ExtensibleModel -from .util.notifications import send_notification +from .mixins import ExtensibleModel, PureDjangoModel +from .tasks import send_notification +from .util.core_helpers import now_tomorrow +from .util.model_helpers import ICONS from constance import config @@ -21,10 +30,10 @@ class School(ExtensibleModel): currently logged-in user. """ - name = models.CharField(verbose_name=_("Name"), max_length=30) + name = models.CharField(verbose_name=_("Name"), max_length=255) name_official = models.CharField( verbose_name=_("Official name"), - max_length=200, + max_length=255, help_text=_("Official name of the school, e.g. as given by supervisory authority"), ) @@ -50,7 +59,7 @@ class SchoolTerm(ExtensibleModel): be linked to. """ - caption = models.CharField(verbose_name=_("Visible caption of the term"), max_length=30) + caption = models.CharField(verbose_name=_("Visible caption of the term"), max_length=255) date_start = models.DateField(verbose_name=_("Effective start date of term"), null=True) date_end = models.DateField(verbose_name=_("Effective end date of term"), null=True) @@ -62,6 +71,16 @@ class SchoolTerm(ExtensibleModel): self.current = None super().save(*args, **kwargs) + @classmethod + def maintain_default_data(cls): + if not cls.objects.filter(current=True).exists(): + if cls.objects.exists(): + term = cls.objects.latest('date_start') + term.current=True + term.save() + else: + cls.objects.create(date_start=date.today(), current=True) + class Meta: verbose_name = _("School term") verbose_name_plural = _("School terms") @@ -77,6 +96,8 @@ class Person(ExtensibleModel): verbose_name = _("Person") verbose_name_plural = _("Persons") + icon_ = "person" + SEX_CHOICES = [("f", _("female")), ("m", _("male"))] user = models.OneToOneField( @@ -84,20 +105,20 @@ class Person(ExtensibleModel): ) is_active = models.BooleanField(verbose_name=_("Is person active?"), default=True) - first_name = models.CharField(verbose_name=_("First name"), max_length=30) - last_name = models.CharField(verbose_name=_("Last name"), max_length=30) + first_name = models.CharField(verbose_name=_("First name"), max_length=255) + last_name = models.CharField(verbose_name=_("Last name"), max_length=255) additional_name = models.CharField( - verbose_name=_("Additional name(s)"), max_length=30, blank=True + verbose_name=_("Additional name(s)"), max_length=255, blank=True ) short_name = models.CharField( - verbose_name=_("Short name"), max_length=5, blank=True, null=True, unique=True + verbose_name=_("Short name"), max_length=255, blank=True, null=True, unique=True ) - street = models.CharField(verbose_name=_("Street"), max_length=30, blank=True) - housenumber = models.CharField(verbose_name=_("Street number"), max_length=10, blank=True) - postal_code = models.CharField(verbose_name=_("Postal code"), max_length=5, blank=True) - place = models.CharField(verbose_name=_("Place"), max_length=30, blank=True) + street = models.CharField(verbose_name=_("Street"), max_length=255, blank=True) + housenumber = models.CharField(verbose_name=_("Street number"), max_length=255, blank=True) + postal_code = models.CharField(verbose_name=_("Postal code"), max_length=255, blank=True) + place = models.CharField(verbose_name=_("Place"), max_length=255, blank=True) phone_number = PhoneNumberField(verbose_name=_("Home phone"), blank=True) mobile_number = PhoneNumberField(verbose_name=_("Mobile phone"), blank=True) @@ -110,20 +131,17 @@ class Person(ExtensibleModel): photo = ImageCropField(verbose_name=_("Photo"), blank=True, null=True) photo_cropping = ImageRatioField("photo", "600x800", size_warning=True) - import_ref = models.CharField( - verbose_name=_("Reference ID of import source"), - max_length=64, - blank=True, - null=True, - editable=False, - unique=True, - ) - guardians = models.ManyToManyField( "self", verbose_name=_("Guardians / Parents"), symmetrical=False, related_name="children", blank=True ) - primary_group = models.ForeignKey("Group", models.SET_NULL, null=True) + primary_group = models.ForeignKey("Group", models.SET_NULL, null=True, blank=True) + + description = models.TextField(verbose_name=_("Description"), blank=True, null=True) + + + def get_absolute_url(self) -> str: + return reverse("person_by_id", args=[self.id]) @property def primary_group_short_name(self) -> Optional[str]: @@ -158,9 +176,68 @@ class Person(ExtensibleModel): else: return f"{self.first_name} {self.last_name}" + @property + def age(self): + return self.age_at(timezone.datetime.now().date()) + + def age_at(self, today): + years = today.year - self.date_of_birth.year + if (self.date_of_birth.month > today.month + or (self.date_of_birth.month == today.month + and self.date_of_birth.day > today.day)): + years -= 1 + return years + + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + + # Synchronise user fields to linked User object to keep it up to date + if self.user: + self.user.first_name = self.first_name + self.user.last_name = self.last_name + self.user.email = self.email + self.user.save() + + # Save all related groups once to keep synchronisation with Django + for group in self.member_of.union(self.owner_of.all()).all(): + group.save() + + self.auto_select_primary_group() + def __str__(self) -> str: return self.full_name + @classmethod + def maintain_default_data(cls): + # First, ensure we have an admin user + User = get_user_model() + if not User.objects.filter(is_superuser=True).exists(): + admin = User.objects.create_superuser( + username='admin', + email='root@example.com', + password='admin' + ) + admin.save() + + # Ensure this admin user has a person linked to it + person = Person(user=admin) + person.save() + + def auto_select_primary_group(self, pattern: Optional[str] = None, force: bool = False) -> None: + """ Auto-select the primary group among the groups the person is member of + + Uses either the pattern passed as argument, or the pattern configured system-wide. + + Does not do anything if either no pattern is defined or the user already has + a primary group, unless force is True. + """ + + pattern = pattern or config.PRIMARY_GROUP_PATTERN + + if pattern: + if force or not self.primary_group: + self.primary_group = self.member_of.filter(name__regex=pattern).first() + class Group(ExtensibleModel): """Any kind of group of persons in a school, including, but not limited @@ -172,8 +249,10 @@ class Group(ExtensibleModel): verbose_name = _("Group") verbose_name_plural = _("Groups") - name = models.CharField(verbose_name=_("Long name of group"), max_length=60, unique=True) - short_name = models.CharField(verbose_name=_("Short name of group"), max_length=16, unique=True) + icon_ = "group" + + name = models.CharField(verbose_name=_("Long name of group"), max_length=255, unique=True) + short_name = models.CharField(verbose_name=_("Short name of group"), max_length=255, unique=True, blank=True, null=True) members = models.ManyToManyField("Person", related_name="member_of", blank=True) owners = models.ManyToManyField("Person", related_name="owner_of", blank=True) @@ -186,11 +265,35 @@ class Group(ExtensibleModel): blank=True, ) + type = models.ForeignKey("GroupType", on_delete=models.CASCADE, related_name="type", verbose_name=_("Type of group"), null=True, blank=True) + + + def get_absolute_url(self) -> str: + return reverse("group_by_id", args=[self.id]) + + @property + def announcement_recipients(self): + return list(self.members.all()) + list(self.owners.all()) + def __str__(self) -> str: return "%s (%s)" % (self.name, self.short_name) + def save(self, *args, **kwargs): + super().save(*args, **kwargs) + + # Synchronise group to Django group with same name + dj_group, _ = DjangoGroup.objects.get_or_create(name=self.name) + dj_group.user_set.set( + list( + self.members.filter(user__isnull=False).values_list("user", flat=True).union( + self.owners.filter(user__isnull=False).values_list("user", flat=True) + ) + ) + ) + dj_group.save() + -class Activity(models.Model): +class Activity(ExtensibleModel): user = models.ForeignKey("Person", on_delete=models.CASCADE, related_name="activities") title = models.CharField(max_length=150, verbose_name=_("Title")) @@ -198,8 +301,6 @@ class Activity(models.Model): app = models.CharField(max_length=100, verbose_name=_("Application")) - created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) - def __str__(self): return self.title @@ -208,7 +309,7 @@ class Activity(models.Model): verbose_name_plural = _("Activities") -class Notification(models.Model): +class Notification(ExtensibleModel): sender = models.CharField(max_length=100, verbose_name=_("Sender")) recipient = models.ForeignKey("Person", on_delete=models.CASCADE, related_name="notifications") @@ -219,13 +320,12 @@ class Notification(models.Model): read = models.BooleanField(default=False, verbose_name=_("Read")) sent = models.BooleanField(default=False, verbose_name=_("Sent")) - created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created at")) - def __str__(self): - return self.title + return str(self.title) def save(self, **kwargs): - send_notification(self) + if not self.sent: + send_notification(self.pk, resend=True) self.sent = True super().save(**kwargs) @@ -234,7 +334,128 @@ class Notification(models.Model): verbose_name_plural = _("Notifications") -class DashboardWidget(PolymorphicModel): +class AnnouncementQuerySet(models.QuerySet): + def relevant_for(self, obj: Union[models.Model, models.QuerySet]) -> models.QuerySet: + """ Get a QuerySet with all announcements relevant for a certain Model (e.g. a Group) + or a set of models in a QuerySet. + """ + + if isinstance(obj, models.QuerySet): + ct = ContentType.objects.get_for_model(obj.model) + pks = list(obj.values_list('pk', flat=True)) + else: + ct = ContentType.objects.get_for_model(obj) + pks = [obj.pk] + + return self.filter(recipients__content_type=ct, recipients__recipient_id__in=pks) + + def at_time(self,when: Optional[datetime] = None ) -> models.QuerySet: + """ Get all announcements at a certain time """ + + when = when or timezone.datetime.now() + + # Get announcements by time + announcements = self.filter(valid_from__lte=when, valid_until__gte=when) + + return announcements + + def on_date(self, when: Optional[date] = None) -> models.QuerySet: + """ Get all announcements at a certain date """ + + when = when or timezone.datetime.now().date() + + # Get announcements by time + announcements = self.filter(valid_from__date__lte=when, valid_until__date__gte=when) + + return announcements + + def within_days(self, start: date, stop: date) -> models.QuerySet: + """ Get all announcements valid for a set of days """ + + # Get announcements + announcements = self.filter(valid_from__date__lte=stop, valid_until__date__gte=start) + + return announcements + + def for_person(self, person: Person) -> List: + """ Get all announcements for one person """ + + # Filter by person + announcements_for_person = [] + for announcement in self: + if person in announcement.recipient_persons: + announcements_for_person.append(announcement) + + return announcements_for_person + + +class Announcement(ExtensibleModel): + objects = models.Manager.from_queryset(AnnouncementQuerySet)() + + title = models.CharField(max_length=150, verbose_name=_("Title")) + description = models.TextField(max_length=500, verbose_name=_("Description"), blank=True) + link = models.URLField(blank=True, verbose_name=_("Link")) + + valid_from = models.DateTimeField( + verbose_name=_("Date and time from when to show"), default=timezone.datetime.now + ) + valid_until = models.DateTimeField( + verbose_name=_("Date and time until when to show"), + default=now_tomorrow, + ) + + @property + def recipient_persons(self) -> Sequence[Person]: + """ Return a list of Persons this announcement is relevant for """ + + persons = [] + for recipient in self.recipients.all(): + persons += recipient.persons + return persons + + def get_recipients_for_model(self, obj: Union[models.Model]) -> Sequence[models.Model]: + """ Get all recipients for this announcement with a special content type (provided through model) """ + + ct = ContentType.objects.get_for_model(obj) + return [r.recipient for r in self.recipients.filter(content_type=ct)] + + def __str__(self): + return self.title + + class Meta: + verbose_name = _("Announcement") + verbose_name_plural = _("Announcements") + + +class AnnouncementRecipient(ExtensibleModel): + announcement = models.ForeignKey(Announcement, on_delete=models.CASCADE, related_name="recipients") + + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + recipient_id = models.PositiveIntegerField() + recipient = GenericForeignKey("content_type", "recipient_id") + + @property + def persons(self) -> Sequence[Person]: + """ Return a list of Persons selected by this recipient object + + If the recipient is a Person, return that object. If not, it returns the list + from the announcement_recipients field on the target model. + """ + + if isinstance(self.recipient, Person): + return [self.recipient] + else: + return getattr(self.recipient, "announcement_recipients", []) + + def __str__(self): + return str(self.recipient) + + class Meta: + verbose_name = _("Announcement recipient") + verbose_name_plural = _("Announcement recipients") + + +class DashboardWidget(PolymorphicModel, PureDjangoModel): """ Base class for dashboard widgets on the index page To implement a widget, add a model that subclasses DashboardWidget, sets the template @@ -243,8 +464,13 @@ class DashboardWidget(PolymorphicModel): If your widget does not add any database fields, you should mark it as a proxy model. + You can provide a Media meta class with custom JS and CSS files which will be added to html head. + For further information on media definition see https://docs.djangoproject.com/en/3.0/topics/forms/media/ + Example:: - + + from django.forms.widgets import Media + from aleksis.core.models import DashboardWidget class MyWidget(DhasboardWIdget): @@ -256,9 +482,25 @@ class DashboardWidget(PolymorphicModel): class Meta: proxy = True + + media = Media(css={ + 'all': ('pretty.css',) + }, + js=('animations.js', 'actions.js') + ) """ + @staticmethod + def get_media(widgets: Union[QuerySet, Iterable]): + """ Return all media required to render the selected widgets. """ + + media = Media() + for widget in widgets: + media = media + widget.media + return media + template = None + media = Media() title = models.CharField(max_length=150, verbose_name=_("Widget Title")) active = models.BooleanField(blank=True, verbose_name=_("Activate Widget")) @@ -275,3 +517,52 @@ class DashboardWidget(PolymorphicModel): class Meta: verbose_name = _("Dashboard Widget") verbose_name_plural = _("Dashboard Widgets") + + +class CustomMenu(ExtensibleModel): + id = models.CharField(max_length=100, verbose_name=_("Menu ID"), primary_key=True) + name = models.CharField(max_length=150, verbose_name=_("Menu name")) + + def __str__(self): + return self.name if self.name != "" else self.id + + @classmethod + def maintain_default_data(cls): + menus = ["footer"] + for menu in menus: + cls.get_default(menu) + + @classmethod + def get_default(cls, name): + menu, _ = cls.objects.get_or_create(id=name, defaults={"name": name}) + return menu + + class Meta: + verbose_name = _("Custom menu") + verbose_name_plural = _("Custom menus") + + +class CustomMenuItem(ExtensibleModel): + menu = models.ForeignKey( + CustomMenu, models.CASCADE, verbose_name=_("Menu"), related_name="items" + ) + name = models.CharField(max_length=150, verbose_name=_("Name")) + url = models.URLField(verbose_name=_("Link")) + icon = models.CharField( + max_length=50, blank=True, null=True, choices=ICONS, verbose_name=_("Icon") + ) + + def __str__(self): + return "[{}] {}".format(self.menu, self.name) + + class Meta: + verbose_name = _("Custom menu item") + verbose_name_plural = _("Custom menu items") + +class GroupType(ExtensibleModel): + name = models.CharField(verbose_name=_("Title of type"), max_length=50) + description = models.CharField(verbose_name=_("Description"), max_length=500) + + class Meta: + verbose_name = _("Group type") + verbose_name_plural = _("Group types") diff --git a/aleksis/core/search_indexes.py b/aleksis/core/search_indexes.py new file mode 100644 index 0000000000000000000000000000000000000000..5828e0c52391423cc6dd0bad43f6a15310a85e1f --- /dev/null +++ b/aleksis/core/search_indexes.py @@ -0,0 +1,10 @@ +from .models import Person, Group +from .util.search import Indexable, SearchIndex + + +class PersonIndex(SearchIndex, Indexable): + model = Person + + +class GroupIndex(SearchIndex, Indexable): + model = Group diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index a1371369b5658af9eee726089f3f57937267221f..81c00f57599429b58494b7e38fb5a6f5651fdbb1 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -52,9 +52,13 @@ INSTALLED_APPS = [ "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", + "django.contrib.sites", "django.contrib.staticfiles", + "django.contrib.humanize", + "haystack", "polymorphic", "django_global_request", + "dbbackup", "settings_context_processor", "sass_processor", "easyaudit", @@ -84,6 +88,8 @@ INSTALLED_APPS = [ "pwa", "ckeditor", "django_js_reverse", + "colorfield", + "django_bleach", ] merge_app_settings("INSTALLED_APPS", INSTALLED_APPS, True) @@ -132,7 +138,7 @@ TEMPLATES = [ "maintenance_mode.context_processors.maintenance_mode", "settings_context_processor.context_processors.settings", "constance.context_processors.config", - "aleksis.core.util.core_helpers.school_information_processor", + "aleksis.core.util.core_helpers.custom_information_processor", ], }, }, @@ -164,7 +170,7 @@ DATABASES = { merge_app_settings("DATABASES", DATABASES, False) -if _settings.get("caching.memcached.enabled", True): +if _settings.get("caching.memcached.enabled", False): CACHES = { "default": { "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", @@ -188,7 +194,7 @@ AUTHENTICATION_BACKENDS = [] if _settings.get("ldap.uri", None): # LDAP dependencies are not necessarily installed, so import them here import ldap # noqa - from django_auth_ldap.config import LDAPSearch, GroupOfNamesType # noqa + from django_auth_ldap.config import LDAPSearch, NestedGroupOfNamesType, NestedGroupOfUniqueNamesType, PosixGroupType # noqa # Enable Django's integration to LDAP AUTHENTICATION_BACKENDS.append("django_auth_ldap.backend.LDAPBackend") @@ -210,10 +216,37 @@ if _settings.get("ldap.uri", None): # Mapping of LDAP attributes to Django model fields AUTH_LDAP_USER_ATTR_MAP = { "first_name": _settings.get("ldap.map.first_name", "givenName"), - "last_name": _settings.get("ldap.map.first_name", "sn"), + "last_name": _settings.get("ldap.map.last_name", "sn"), "email": _settings.get("ldap.map.email", "mail"), } + # Discover flags by LDAP groups + if _settings.get("ldap.groups.base", None): + AUTH_LDAP_GROUP_SEARCH = LDAPSearch( + _settings.get("ldap.groups.base"), + ldap.SCOPE_SUBTREE, + _settings.get("ldap.groups.filter", "(objectClass=%s)" % _settings.get("ldap.groups.type", "groupOfNames")), + ) + + _group_type = _settings.get("ldap.groups.type", "groupOfNames").lower() + if _group_type == "groupofnames": + AUTH_LDAP_GROUP_TYPE = NestedGroupOfNamesType() + elif _group_type == "groupofuniquenames": + AUTH_LDAP_GROUP_TYPE = NestedGroupOfUniqueNamesType() + elif _group_type == "posixgroup": + AUTH_LDAP_GROUP_TYPE = PosixGroupType() + + AUTH_LDAP_USER_FLAGS_BY_GROUP = { + } + for _flag in ["is_active", "is_staff", "is_superuser"]: + _dn = _settings.get("ldap.groups.flags.%s" % _flag, None) + if _dn: + AUTH_LDAP_USER_FLAGS_BY_GROUP[_flag] = _dn + + # Backend admin requires superusers to also be staff members + if "is_superuser" in AUTH_LDAP_USER_FLAGS_BY_GROUP and "is_staff" not in AUTH_LDAP_USER_FLAGS_BY_GROUP: + AUTH_LDAP_USER_FLAGS_BY_GROUP["is_staff"] = AUTH_LDAP_USER_FLAGS_BY_GROUP["is_superuser"] + # Add ModelBckend last so all other backends get a chance # to verify passwords first AUTHENTICATION_BACKENDS.append("django.contrib.auth.backends.ModelBackend") @@ -251,6 +284,7 @@ YARN_INSTALLED_APPS = [ "materialize-css", "material-design-icons-iconfont", "select2", + "select2-materialize", "paper-css", ] @@ -271,10 +305,12 @@ ANY_JS = { "css_url": JS_URL + "/material-design-icons-iconfont/dist/material-design-icons.css" }, "paper-css": {"css_url": JS_URL + "/paper-css/paper.min.css"}, + "select2-materialize": {"css_url": JS_URL + "/select2-materialize/select2-materialize.css", "js_url": JS_URL + "/select2-materialize/index.js"}, } merge_app_settings("ANY_JS", ANY_JS, True) +SASS_PROCESSOR_ENABLED = True SASS_PROCESSOR_AUTO_INCLUDE = False SASS_PROCESSOR_CUSTOM_FUNCTIONS = { "get-colour": "aleksis.core.util.sass_helpers.get_colour", @@ -335,26 +371,33 @@ CONSTANCE_ADDITIONAL_FIELDS = { 'widget': 'django.forms.Select', "choices": i18n_day_name_choices_lazy }], + "colour_field": ["django.forms.CharField", { + "widget": "colorfield.widgets.ColorWidget" + }], } CONSTANCE_CONFIG = { "SITE_TITLE": ("AlekSIS", _("Site title"), "char_field"), - "COLOUR_PRIMARY": ("#007bff", _("Primary colour")), - "COLOUR_SECONDARY": ("#007bff", _("Secondary colour")), + "SITE_DESCRIPTION": ("The Free School Information System", _("Site description")), + "COLOUR_PRIMARY": ("#0d5eaf", _("Primary colour"), "colour_field"), + "COLOUR_SECONDARY": ("#0d5eaf", _("Secondary colour"), "colour_field"), "MAIL_OUT_NAME": ("AlekSIS", _("Mail out name")), "MAIL_OUT": (DEFAULT_FROM_EMAIL, _("Mail out address"), "email_field"), "PRIVACY_URL": ("", _("Link to privacy policy"), "url_field"), "IMPRINT_URL": ("", _("Link to imprint"), "url_field"), "ADRESSING_NAME_FORMAT": ("german", _("Name format of adresses"), "adressing-select"), "NOTIFICATION_CHANNELS": (["email"], _("Channels to allow for notifications"), "notifications-select"), + "PRIMARY_GROUP_PATTERN": ("", _("Regular expression to match primary group, e.g. '^Class .*'"), str), } CONSTANCE_CONFIG_FIELDSETS = { - "General settings": ("SITE_TITLE",), + "General settings": ("SITE_TITLE", "SITE_DESCRIPTION"), "Theme settings": ("COLOUR_PRIMARY", "COLOUR_SECONDARY"), "Mail settings": ("MAIL_OUT_NAME", "MAIL_OUT"), "Notification settings": ("NOTIFICATION_CHANNELS", "ADRESSING_NAME_FORMAT"), "Footer settings": ("PRIVACY_URL", "IMPRINT_URL"), + "Account settings": ("PRIMARY_GROUP_PATTERN",), } +merge_app_settings("CONSTANCE_ADDITIONAL_FIELDS", CONSTANCE_ADDITIONAL_FIELDS, False) merge_app_settings("CONSTANCE_CONFIG", CONSTANCE_CONFIG, False) merge_app_settings("CONSTANCE_CONFIG_FIELDSETS", CONSTANCE_CONFIG_FIELDSETS, False) @@ -368,6 +411,16 @@ MAINTENANCE_MODE_STATE_FILE_PATH = _settings.get( "maintenance.statefile", "maintenance_mode_state.txt" ) +DBBACKUP_STORAGE = _settings.get("backup.storage", "django.core.files.storage.FileSystemStorage") +DBBACKUP_STORAGE_OPTIONS = {"location": _settings.get("backup.location", "/var/backups/aleksis")} +DBBACKUP_CLEANUP_KEEP = _settings.get("backup.database.keep", 10) +DBBACKUP_CLEANUP_KEEP_MEDIA = _settings.get("backup.media.keep", 10) +DBBACKUP_GPG_RECIPIENT = _settings.get("backup.gpg_recipient", None) +DBBACKUP_COMPRESS_DB = _settings.get("backup.database.compress", True) +DBBACKUP_ENCRYPT_DB = _settings.get("backup.database.encrypt", DBBACKUP_GPG_RECIPIENT is not None) +DBBACKUP_COMPRESS_MEDIA = _settings.get("backup.media.compress", True) +DBBACKUP_ENCRYPT_MEDIA = _settings.get("backup.media.encrypt", DBBACKUP_GPG_RECIPIENT is not None) + IMPERSONATE = {"USE_HTTP_REFERER": True, "REQUIRE_SUPERUSER": True, "ALLOW_SUPERUSER": True} DJANGO_TABLES2_TEMPLATE = "django_tables2/materialize.html" @@ -399,7 +452,7 @@ if _settings.get("twilio.sid", None): if _settings.get("celery.enabled", False): INSTALLED_APPS += ("django_celery_beat", "django_celery_results") - CELERY_BROKER_URL = "redis://localhost" + CELERY_BROKER_URL = _settings.get("celery.broker", "redis://localhost") CELERY_RESULT_BACKEND = "django-db" CELERY_CACHE_BACKEND = "django-cache" CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" @@ -408,8 +461,8 @@ if _settings.get("celery.enabled", False): INSTALLED_APPS += ("djcelery_email",) EMAIL_BACKEND = "djcelery_email.backends.CeleryEmailBackend" -PWA_APP_NAME = "AlekSIS" # dbsettings -PWA_APP_DESCRIPTION = "AlekSIS – The free school information system" # dbsettings +PWA_APP_NAME = lazy_config("SITE_TITLE") +PWA_APP_DESCRIPTION = lazy_config("SITE_DESCRIPTION") PWA_APP_THEME_COLOR = lazy_config("COLOUR_PRIMARY") PWA_APP_BACKGROUND_COLOR = "#ffffff" PWA_APP_DISPLAY = "standalone" @@ -432,6 +485,8 @@ PWA_APP_SPLASH_SCREEN = [ ] PWA_SERVICE_WORKER_PATH = os.path.join(STATIC_ROOT, "js", "serviceworker.js") +SITE_ID = 1 + CKEDITOR_CONFIGS = { 'default': { 'toolbar_Basic': [ @@ -480,3 +535,73 @@ CKEDITOR_CONFIGS = { ]), } } + +# Which HTML tags are allowed +BLEACH_ALLOWED_TAGS = ['p', 'b', 'i', 'u', 'em', 'strong', 'a', 'div'] + +# Which HTML attributes are allowed +BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'style'] + +# Which CSS properties are allowed in 'style' attributes (assuming +# style is an allowed attribute) +BLEACH_ALLOWED_STYLES = [ + 'font-family', 'font-weight', 'text-decoration', 'font-variant' +] + +# Strip unknown tags if True, replace with HTML escaped characters if +# False +BLEACH_STRIP_TAGS = True + +# Strip comments, or leave them in. +BLEACH_STRIP_COMMENTS = True + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'console': { + 'class': 'logging.StreamHandler', + 'formatter': "verbose" + }, + }, + 'formatters': { + 'verbose': { + 'format': '%(levelname)s %(asctime)s %(module)s: %(message)s' + } + }, + 'root': { + 'handlers': ['console'], + 'level': _settings.get("logging.level", "WARNING"), + }, +} + +HAYSTACK_BACKEND_SHORT = _settings.get("search.backend", "simple") + +if HAYSTACK_BACKEND_SHORT == "simple": + HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.simple_backend.SimpleEngine', + }, + } +elif HAYSTACK_BACKEND_SHORT == "xapian": + HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'xapian_backend.XapianEngine', + 'PATH': _settings.get("search.index", os.path.join(BASE_DIR, "xapian_index")), + }, + } +elif HAYSTACK_BACKEND_SHORT == "whoosh": + HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', + 'PATH': _settings.get("search.index", os.path.join(BASE_DIR, "whoosh_index")), + }, + } + +if _settings.get("celery.enabled", False) and _settings.get("search.celery", True): + INSTALLED_APPS.append("celery_haystack") + HAYSTACK_SIGNAL_PROCESSOR = 'celery_haystack.signals.CelerySignalProcessor' +else: + HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' + +HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10 diff --git a/aleksis/core/static/img/aleksis-icon.png b/aleksis/core/static/img/aleksis-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1feec27917ec8ee6b5dbd01f2e9f9388952bf8d5 Binary files /dev/null and b/aleksis/core/static/img/aleksis-icon.png differ diff --git a/aleksis/core/static/img/aleksis-icon.svg b/aleksis/core/static/img/aleksis-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..e1ef059e37be7bf5bad544496e45eef08c98b6ce --- /dev/null +++ b/aleksis/core/static/img/aleksis-icon.svg @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg id="svg8" width="256" height="256" version="1.1" viewBox="0 0 67.73 67.73" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xlink="http://www.w3.org/1999/xlink"> + <title id="title32">AlekSIS icon</title> + <defs id="defs2"> + <linearGradient id="shadow-gradient" x1="-19.53" x2="165.4" y1="-19.53" y2="165.4" gradientUnits="userSpaceOnUse"> + <stop id="stop9444" offset="0"/> + <stop id="stop9446" stop-opacity="0" offset="1"/> + </linearGradient> + </defs> + <metadata id="metadata5"> + <rdf:RDF> + <cc:Work rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> + <dc:title>AlekSIS icon</dc:title> + <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/"/> + <dc:date>2020-02-29</dc:date> + <dc:creator> + <cc:Agent> + <dc:title>Dominik George</dc:title> + </cc:Agent> + </dc:creator> + <dc:contributor> + <cc:Agent> + <dc:title>Julian Leucker</dc:title> + </cc:Agent> + </dc:contributor> + </cc:Work> + <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/4.0/"> + <cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/> + <cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/> + <cc:requires rdf:resource="http://creativecommons.org/ns#Notice"/> + <cc:requires rdf:resource="http://creativecommons.org/ns#Attribution"/> + <cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/> + <cc:requires rdf:resource="http://creativecommons.org/ns#ShareAlike"/> + </cc:License> + </rdf:RDF> + </metadata> + <g id="background-with-glow"> + <rect id="background" y="-3.357e-6" width="67.73" height="67.73" rx="3.307" ry="3.307" fill="#0d5eaf" stroke-width=".4104"/> + <path id="glow" transform="scale(.2646)" d="m9.959 0.2578c-5.698 1.168-9.959 6.189-9.959 12.24v52.31a234.1 86.8 0 0 0 188.9 35.71 234.1 86.8 0 0 0 67.09-3.715v-84.3c0-4.319-2.17-8.112-5.482-10.36-0.01554-0.01049-0.03129-0.02083-0.04688-0.03125-0.2971-0.1993-0.6034-0.3849-0.918-0.5586-0.05211-0.02867-0.1037-0.05799-0.1562-0.08594-0.2939-0.1568-0.5968-0.3001-0.9043-0.4336-0.05654-0.02442-0.111-0.05257-0.168-0.07617-0.3308-0.1378-0.6709-0.2577-1.016-0.3672-0.03502-0.01105-0.06836-0.02636-0.1035-0.03711-0.3806-0.1172-0.7687-0.2158-1.164-0.2969h-236.1z" fill="#fff" opacity=".2" stroke-width="1.551"/> + </g> + <g id="widgets-with-shadow"> + <path id="shadow" transform="scale(.2646)" d="m188.2 20.16c-11.17 0.2955-4.441 16.25-17.54 12.56-17.31 4.576-18.64 24.39-17.21 39.1 1.565 6.747-1.9 1.315-3.715-0.1367-5.666-3.203-12.24 3.777-8.709 9.107 1.178 1.172 2.354 2.349 3.529 3.525-1.648-0.1733-2.722 0.18-3.406 0.8867-20.9-20.89-41.81-41.78-62.73-62.66-1.667-1.362-3.817-2.142-5.979-2.131-9.823 2.627-15.3 12.67-22.91 19-8.327 8.601-17.24 16.68-25.2 25.61-4.688 8.603 4.095 13.55 8.873 18.91 1.473 2.302 7.219 4.605 2.852 6.906-7.332 4.874-9.54 15.75-2.365 21.36 15.49 15.49 30.97 30.98 46.46 46.46-0.4584 0.6368-1.044 1.194-1.809 1.637-3.106 4.526-4.08-0.9818-6.254-1.748-5.859-6.192-12.02-12.08-17.95-18.21h-22.08c-12.43 0.00454-12.65 13.69-12 22.8 0.3378 21.38-0.6904 42.86 0.541 64.18 3.053 6.838 9.872 10.98 14.65 16.58 4.034 4.029 8.064 8.062 12.1 12.09h196.1c6.925 0 12.5-5.575 12.5-12.5v-162.7c-13.85-14.24-27.68-28.5-41.44-42.83-4.585-4.531-11.77-4.442-15.49-9.955-3.38-2.915-5.87-7.7-10.88-7.838z" fill="url(#shadow-gradient)" stroke-width="1.551"/> + <g id="widgets" fill="#fff"> + <path id="schoolbag" d="m44.52 19.7h10.45a0.4353 0.4353 0 0 1 0.4353 0.4353v3.917a0.4353 0.4353 0 0 1-0.4353 0.4353h-10.45a0.4353 0.4353 0 0 1-0.4353-0.4353v-3.917a0.4353 0.4353 0 0 1 0.4353-0.4353zm10.88-1.306v-0.8705a0.4353 0.4353 0 0 0-0.4353-0.4353h-10.45a0.4353 0.4353 0 0 0-0.4353 0.4353v0.8705a0.4353 0.4353 0 0 0 0.4353 0.4353h10.45a0.4353 0.4353 0 0 0 0.4353-0.4353zm-14.8 10.01v0.8705a2.176 2.176 0 0 0 2.176 2.176h13.93a2.176 2.176 0 0 0 2.176-2.176v-0.8705a0.4353 0.4353 0 0 0-0.4353-0.4353h-17.41a0.4353 0.4353 0 0 0-0.4353 0.4353zm-0.8705-7.4v-1.741a0.4353 0.4353 0 0 0-0.4353-0.4353h-0.8705a1.306 1.306 0 0 0-1.306 1.306v0.8706a0.4353 0.4353 0 0 0 0.4353 0.4353h1.741a0.4353 0.4353 0 0 0 0.4353-0.4353zm-2.612 1.741v4.788a1.306 1.306 0 0 0 1.306 1.306h0.8705a0.4353 0.4353 0 0 0 0.4353-0.4353v-5.659a0.4353 0.4353 0 0 0-0.4353-0.4353h-1.741a0.4353 0.4353 0 0 0-0.4353 0.4353zm22.63 0v5.659a0.4353 0.4353 0 0 0 0.4353 0.4353h0.8705a1.306 1.306 0 0 0 1.306-1.306v-4.788a0.4353 0.4353 0 0 0-0.4353-0.4353h-1.741a0.4353 0.4353 0 0 0-0.4353 0.4353zm2.612-1.741v-0.8706a1.306 1.306 0 0 0-1.306-1.306h-0.8705a0.4353 0.4353 0 0 0-0.4353 0.4353v1.741a0.4353 0.4353 0 0 0 0.4353 0.4353h1.741a0.4353 0.4353 0 0 0 0.4353-0.4353zm-3.482-6.203v11.86a0.4353 0.4353 0 0 1-0.4353 0.4353h-17.41a0.4353 0.4353 0 0 1-0.4353-0.4353v-11.86a6.42 6.42 0 0 1 6.42-6.42h0.3809a0.1632 0.1632 0 0 0 0.1632-0.1632v-0.7073a2.179 2.179 0 0 1 2.229-2.176c1.188 0.0282 2.124 1.028 2.124 2.217v0.6664a0.1632 0.1632 0 0 0 0.1632 0.1632h0.3809a6.42 6.42 0 0 1 6.42 6.42zm-10.45-6.583a0.1632 0.1632 0 0 0 0.1632 0.1632h2.285a0.1632 0.1632 0 0 0 0.1632-0.1632v-0.6776c0-0.7306-0.5978-1.348-1.328-1.336a1.307 1.307 0 0 0-1.283 1.306zm-0.4353 4.081a1.741 1.741 0 1 0 1.741-1.741 1.741 1.741 0 0 0-1.741 1.741zm8.27 5.223a1.307 1.307 0 0 0-1.306-1.306h-10.45a1.307 1.307 0 0 0-1.306 1.306v6.529a1.307 1.307 0 0 0 1.306 1.306h10.45a1.307 1.307 0 0 0 1.306-1.306z" stroke-width=".05441"/> + <path id="puzzle-ll" d="m8.484 37.13c-1.759 0-3.175 1.416-3.175 3.175v18.89c0 1.759 1.416 3.175 3.175 3.175h18.93c1.759 0 3.175-1.416 3.175-3.175v-18.89c0-1.759-1.416-3.175-3.175-3.175h-5.842v2.798h-0.01188c0.0052 0.0528 0.01281 0.1048 0.01447 0.1586 0 2.002-1.623 3.625-3.625 3.625-2.002 0-3.625-1.623-3.625-3.625 0.01013-0.0551 0.02494-0.1053 0.03669-0.1586h-0.03514v-2.798zm28.69 12.62c3e-6 2.002-1.623 3.625-3.625 3.625-4.515-0.8302-3.163-7.154 0-7.251 2.002 0 3.625 1.623 3.625 3.625zm-6.582-3.623h2.798v7.247h-2.798z"/> + <path id="puzzle-lr" d="m37.31 59.24c0 1.759 1.416 3.175 3.175 3.175h18.89c1.759 0 3.175-1.416 3.175-3.175v-18.93c0-1.759-1.416-3.175-3.175-3.175h-18.89c-1.759 0-3.175 1.416-3.175 3.175v5.842h2.798v0.0119c0.0528-5e-3 0.1048-0.0128 0.1586-0.0145 2.002 0 3.625 1.623 3.625 3.625 0 2.002-1.623 3.625-3.625 3.625-0.0551-0.0101-0.1053-0.0249-0.1586-0.0367v0.0351h-2.798z"/> + <path id="puzzle-ul" d="m31.48 20.23c0.9818-0.9818 0.9818-2.563 0-3.544l-10.54-10.54c-0.9818-0.9819-2.563-0.9819-3.545 0l-10.57 10.57c-0.9818 0.9818-0.9818 2.563 6e-6 3.544l10.54 10.54c0.9818 0.9819 2.563 0.9819 3.545 0l3.261-3.261-1.562-1.562 0.0064-0.0069c-0.03229-0.02696-0.06563-0.05145-0.09668-0.08057-1.118-1.118-1.118-2.93 0-4.048 1.118-1.118 2.93-1.118 4.048 0 0.02514 0.0363 0.04485 0.07241 0.0681 0.109l0.0196-0.01948 1.562 1.562zm-23.06 8.969c-1.118-1.118-1.118-2.93-6.1e-6 -4.048 2.984-2.057 5.759 2.228 4.048 4.048-1.118 1.118-2.93 1.118-4.048 0zm5.697-1.652-1.562 1.562-4.045-4.045 1.562-1.562z"/> + </g> + </g> +</svg> diff --git a/aleksis/core/static/img/aleksis-logo.png b/aleksis/core/static/img/aleksis-logo.png deleted file mode 100644 index 3de63ed87e9a3c6389b8cbf686922d5d2b1d38ec..0000000000000000000000000000000000000000 Binary files a/aleksis/core/static/img/aleksis-logo.png and /dev/null differ diff --git a/aleksis/core/static/img/aleksis-logo.svg b/aleksis/core/static/img/aleksis-logo.svg deleted file mode 100644 index a01842b83e398d2e02b3d723747bfe1524ad970e..0000000000000000000000000000000000000000 --- a/aleksis/core/static/img/aleksis-logo.svg +++ /dev/null @@ -1,799 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape (http://www.inkscape.org/) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="195mm" - height="195mm" - viewBox="0 0 195 195" - version="1.1" - id="svg144" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - sodipodi:docname="aleksis-logo.svg" - inkscape:export-filename="/home/nik/Teckids/AlekSIS/AlekSIS/aleksis/core/static/img/aleksis-logo.png" - inkscape:export-xdpi="66.690002" - inkscape:export-ydpi="66.690002"> - <defs - id="defs138" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.46278628" - inkscape:cx="368.4206" - inkscape:cy="299.43621" - inkscape:document-units="mm" - inkscape:current-layer="layer1" - showgrid="false" - fit-margin-top="0" - fit-margin-left="0" - fit-margin-right="0" - fit-margin-bottom="0" - inkscape:window-width="956" - inkscape:window-height="1028" - inkscape:window-x="2880" - inkscape:window-y="24" - inkscape:window-maximized="0" /> - <metadata - id="metadata141"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Layer 1" - inkscape:groupmode="layer" - id="layer1" - transform="translate(67.307379,-88.184202)"> - <g - id="g1175" - transform="translate(0,-16.933338)"> - <path - sodipodi:nodetypes="csssssssscsssscssscssssssssssssssssssssssssssc" - inkscape:connector-curvature="0" - id="path4190" - d="m 71.761246,231.91826 c 0,0 -2.965709,2.20952 -4.5614,3.13596 -2.646471,1.53651 -5.324283,3.15342 -8.267539,3.99122 -3.492328,0.99411 -7.205204,1.28641 -10.833323,1.14035 -3.091423,-0.12445 -7.602864,0.51062 -10.029947,-1.40814 -0.734207,-0.58043 -1.241572,-1.38748 -0.803382,-2.2145 2.260332,-4.26599 10.456935,-1.16233 14.824552,-3.21946 5.856114,-2.75819 10.734461,-7.52659 14.82455,-12.54385 3.009426,-3.69162 5.303238,-8.03645 6.842102,-12.54385 1.554712,-4.55381 2.2807,-14.25437 2.2807,-14.25437 0,0 -10.208754,6.87178 -15.964902,8.83771 -7.096975,2.42388 -14.737405,3.45147 -22.236826,3.42105 -3.56198,-0.0145 -7.07403,-0.92452 -10.548236,-1.71053 -8.593913,-1.94428 -17.6188602,-3.22751 -25.372789,-7.41227 -2.966119,-1.6008 -7.6973602,-6.55701 -7.6973602,-6.55701 0,0 2.4545545,-12.81755 5.41666025,-18.53069 2.73928565,-5.28338 6.92532435,-9.74604 11.11841295,-13.96929 2.237726,-2.25382 4.58472,-4.54044 7.412276,-5.98684 6.752336,-3.45405 21.951736,-5.98683 21.951736,-5.98683 0,0 18.086968,-0.8727 26.798226,1.14035 7.173121,1.6576 14.40988,4.34362 20.241212,8.83771 6.43016,4.9556 11.647326,11.75802 15.109641,19.10086 3.27507,6.94575 4.34703,14.85902 4.84649,22.52191 0.37829,5.80391 -0.21395,11.7017 -1.42544,17.39034 -0.77627,3.64505 -2.25224,7.11675 -3.70614,10.54824 -1.57505,3.71744 -3.414173,7.32759 -5.416661,10.83333 -0.954383,1.67083 -3.232551,2.92472 -3.135963,4.84648 0.03054,0.60772 0.582873,1.18157 1.14035,1.42544 2.443976,1.06913 5.472414,-1.4734 7.982454,-0.57017 2.71948,0.97859 5.08768,3.35039 6.27192,5.98683 1.09095,2.42875 -0.49448,5.43662 0.28509,7.98245 0.26249,0.85722 0.69342,1.76314 1.42544,2.2807 0.71537,0.5058 1.71436,0.77676 2.56578,0.57018 3.60637,-0.87503 5.31069,-5.32124 8.55263,-7.12719 1.0501,-0.58496 2.33059,-1.6461 3.42105,-1.14035 1.39274,0.64595 1.82649,2.74545 1.71052,4.27631 -0.42472,5.60674 -4.79415,10.35738 -8.55262,14.53947 -2.45193,2.72828 -5.26767,5.71423 -8.83771,6.55701 -3.19315,0.7538 -6.91519,0.0354 -9.692978,-1.71052 -3.170646,-1.99286 -2.942511,-8.14311 -6.557013,-9.12281 -5.420008,-1.46907 -10.085076,5.01391 -15.394726,6.84211 -3.33423,1.14802 -6.864765,3.50708 -10.26315,2.56578 -4.403516,-1.2197 -8.261615,-5.35364 -9.692976,-9.69297 -2.016577,-6.11348 1.593599,-12.78736 2.850876,-19.10087 0.612191,-3.07416 -0.389856,-4.47389 1.524748,-6.95573 2.052199,-2.6602 9.593665,-7.01355 9.593665,-7.01355 z" - style="fill:#508227;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="sssssssss" - inkscape:connector-curvature="0" - id="path4188" - d="m 64.34897,129.85693 c -5.501118,-0.23071 -10.715391,1.81403 -15.109636,5.13157 -3.139889,2.37054 -5.483846,6.97882 -6.271926,10.83333 -1.02031,4.99036 -0.219403,9.33486 2.850876,13.39911 2.643003,3.49865 7.05857,5.96744 11.4035,6.55702 6.417826,0.87085 13.632479,-0.96315 18.815775,-4.84649 3.717245,-2.78497 6.227231,-8.19588 6.557011,-12.82894 0.350847,-4.92905 -1.743646,-9.23164 -5.131574,-12.82894 -3.263482,-3.46516 -8.358203,-5.21721 -13.114026,-5.41666 z" - style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="sssssssss" - inkscape:connector-curvature="0" - id="path4186" - d="m 28.713032,125.58062 c -4.592546,0.0623 -9.411779,2.34236 -12.54385,5.70175 -3.526855,3.78282 -5.547592,9.36923 -5.416663,14.53946 0.133618,5.27649 2.498677,10.84869 6.271926,14.53946 2.712266,2.65298 6.754998,4.19866 10.548237,4.27632 5.349282,0.10951 11.431236,-1.53129 15.109639,-5.41667 3.203959,-3.38424 4.093136,-8.73992 3.991223,-13.39911 -0.114356,-5.22794 -1.558504,-11.00648 -5.131573,-14.82455 -3.171749,-3.38923 -8.187504,-5.47959 -12.828939,-5.41666 z" - style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="csc" - inkscape:connector-curvature="0" - id="path4202" - d="m 53.606695,150.50792 c 0,0 2.542647,-7.17032 5.442856,-6.85397 3.04726,0.33239 4.031747,8.26508 4.031747,8.26508" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - sodipodi:nodetypes="cacc" - inkscape:connector-curvature="0" - id="path4200" - d="m 27.400345,148.29046 c 0,0 2.841132,-5.89471 5.442857,-5.64445 2.949862,0.28376 4.838096,7.45873 4.838096,7.45873 v 0" - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <path - id="path4204" - d="m 94.397414,163.00813 c -1.560201,0.97023 -3.243321,2.08872 -4.303339,3.02177 -2.182918,1.92144 -4.562568,3.95323 -5.644445,6.65261 -1.277112,3.18651 -2.33746,7.31722 -0.604683,10.28072 1.547244,2.64619 5.278173,3.3425 8.264923,4.03214 2.880817,0.66518 5.934284,0.35419 8.8696,0 1.29185,-0.15588 3.04499,-0.54933 4.71786,-0.974 -0.73908,-3.74958 -1.81687,-7.41071 -3.43187,-10.83579 -2.04593,-4.33899 -4.708405,-8.48542 -7.868046,-12.17745 z" - style="fill:#6b4849;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <path - id="path4207" - d="m 105.80867,199.03557 c -2.1112,0.009 -4.28515,0.1217 -5.836817,0.45805 -2.793896,0.60564 -5.727686,1.52496 -7.861983,3.42691 -1.79832,1.60255 -2.910033,3.95006 -3.62865,6.24913 -0.502773,1.60851 -0.932267,3.43978 -0.40294,5.03976 0.448714,1.3563 2.334489,3.71621 3.426906,4.63682 2.167851,1.82691 3.977254,2.08397 6.652066,3.02342 1.296413,0.45532 3.228708,0.73629 5.017718,0.91612 1.02058,-2.50569 1.95035,-5.0511 2.51188,-7.6878 1.11857,-5.25231 1.70696,-10.68267 1.49325,-16.05304 -0.45075,-0.007 -0.90735,-0.0114 -1.37143,-0.009 z" - style="fill:#6b4849;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <path - id="path4210" - d="m 101.34052,241.9835 c -2.115001,0.001 -4.451073,1.49773 -6.444809,0.88691 -0.629392,1.29078 -1.246257,2.87074 -1.172986,3.99631 0.109389,1.68036 1.226357,3.28887 2.620478,4.23334 1.400765,0.94896 3.146233,0.82981 4.838017,0.80642 1.83391,-0.0253 3.73695,-0.13241 5.4427,-0.80642 0.75141,-0.29692 1.68832,-0.89314 2.56205,-1.5175 -0.0499,-0.48708 -0.15956,-0.96094 -0.36325,-1.41442 -1.18425,-2.63644 -3.5528,-5.00815 -6.27228,-5.98675 -0.39219,-0.14113 -0.79662,-0.19808 -1.20992,-0.19789 z" - style="fill:#6b4849;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - inkscape:connector-curvature="0" /> - <path - sodipodi:nodetypes="ssssssscssssssscccss" - inkscape:connector-curvature="0" - id="path4198" - d="m 41.923922,212.60373 c -2.433495,0.015 -4.866877,0.10962 -7.266672,0.19458 -4.957564,0.17551 -9.986468,0.7203 -14.715793,2.21754 -5.013646,1.58725 -10.2278207,3.50927 -14.1111111,7.05555 -2.45099,2.23828 -4.4089603,5.25341 -5.24095711,8.46667 -0.35410988,1.36761 -0.42883668,2.96889 0.2011934,4.23333 0.82877661,1.66332 4.82442811,-1.43717 8.87007821,-2.62047 2.8406066,-0.83085 8.8696856,-1.51319 8.8696856,-0.40349 0,0 -3.83816,1.87821 -4.838017,3.62865 -1.207211,2.11345 -1.688061,4.98865 -0.806427,7.2573 0.517477,1.33158 1.80336,2.95574 3.225709,2.82222 3.145091,-0.29523 3.750646,-5.09478 5.845638,-7.45905 2.079769,-2.34708 3.968976,-5.02962 6.652619,-6.65206 4.637879,-2.80391 10.14885,-4.13182 15.522223,-4.83802 3.267238,-0.42939 6.634378,-0.17981 9.877778,0.40294 1.494087,0.26845 3.658681,0.97326 5.450967,1.6112 2.740739,-2.3076 5.216305,-4.97581 7.454084,-7.72087 0.09639,-0.11824 0.190057,-0.23873 0.28498,-0.35829 -2.553499,-1.93977 -6.664503,-4.85088 -9.561382,-5.82855 -5.005476,-1.68931 -10.360908,-2.04216 -15.714596,-2.00918 z" - style="fill:#cf2257;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <g - transform="matrix(-0.13715945,0.01913589,-0.01913589,-0.13715945,64.819508,267.78454)" - id="layer1-3"> - <g - transform="translate(-12.728,-156.98)" - id="g3391"> - <path - d="m 364.71,986.9 c -31.969,-3.4937 -38.105,-1.179 -47.568,-24.822 1.1282,-4.9931 -0.59168,-18.407 -5.1782,-24.986 -9.34,-13.399 -12.9,-13.577 -13.346,-21.12 -0.27164,-4.5967 8.0734,-16.83 9.5642,-21.939 1.4608,-5.006 6.3117,-5.9267 3.8583,-10.345 -2.5102,-4.5204 -0.46281,-3.6361 -12.25,-9.7703 -7.1387,-3.7152 -23.672,6.5907 -25.355,-1.5293 -1.7647,-8.5099 13.851,-15.7 -0.0553,-31.457 -7.0161,-7.9499 -17.231,8.618 -23.025,0.16415 -6.999,-10.212 3.3245,-19.954 -6.1629,-28.053 -4.7476,-4.053 -20.595,2.8812 -31.128,-3.1044 -9.6646,-5.4919 -3.3967,-30.39 -16.245,-31.331 -9.6539,-0.70726 -15.637,13.908 -25.392,1.8834 -5.1944,-6.4028 -5.4728,-3.1798 -15.004,-17.011 -13.045,-1.889 -17.664,18.153 -22.315,8.8145 -3.479,-6.9852 -15.359,-16.773 -19.045,-15.285 -19.612,10.813 -25.712,12.196 -32.329,-3.4101 -4.9657,-8.7812 -3.4621,-8.9705 -8.5919,-33.885 -3.0419,-17.195 1.6327,-9.2937 -2.91,-50.202 -1.8851,-16.975 -15.236,-36.333 -8.4242,-51.549 19.366,-43.258 5.6524,-96.045 31.352,-116.41 37.936,-26.704 37.241,-76.487 71.904,-94.503 32.233,-16.753 57.18,-27.571 86.63,-51.406 30.932,-25.034 68.696,-31.292 102.34,-34.696 50.254,-5.0846 91.133,4.0922 143.63,3.1026 48.56,-0.9154 69.528,22.63 98.349,54.58 17.461,19.357 34.187,35.334 46.632,45.768 30.172,25.296 34.676,43.569 42.853,70.565 5.6092,18.516 45.018,64.158 40.034,104.35 -1.2057,9.7238 -7.3101,34.007 -1.0523,56.727 3.2435,11.776 5.0369,31.749 6.0876,41.753 2.161,20.575 -3.7473,55.974 -11.447,64.117 -12.319,13.029 -33.816,69.488 -44.885,78.793 -20.505,17.238 -6.8555,41.223 -35.673,53.695 -42.369,18.336 -51.778,36.383 -77.745,44.062 -81.773,24.182 -56.934,32.381 -106.72,35.491 -26.153,1.6338 -67.557,15.555 -91.389,12.951 z m 8.7446,-27.624 c -3.7788,-10.71 2.3789,-22.143 10.118,-29.363 13.071,-12.194 12.367,-8.3565 29.568,-18.93 2.6809,-1.6481 10.48,0.71041 23.647,15.086 8.8933,9.7093 7.948,22.99 1.6757,37.62 -1.114,2.5984 -0.35136,3.0273 4.1459,2.3316 9.8113,-1.5179 25.241,-22.538 50.527,-22.329 20.711,0.17096 42.9,-14.275 50.359,-18.487 44.889,-25.349 45.174,-1.765 74.216,-47.483 6.1406,-9.6666 14.989,-32.335 19.999,-38.965 8.3489,-11.049 26.079,-22.428 39.699,-44.577 22.781,-37.045 45.972,-64.886 37.634,-104.91 -4.9664,-23.838 -9.5777,-39.539 -9.3633,-61.453 0.0863,-8.8208 4.6129,-26.253 2.9291,-35.648 -5.16,-28.792 -16.247,-62.823 -41.618,-94.561 -5.5782,-6.9782 -13.023,-31.268 -19.125,-38.592 -9.5402,-11.45 -29.57,-25.882 -40.811,-36.13 -6.7901,-6.1896 -25.945,-23.747 -31.555,-29.365 -27.037,-27.075 -19.981,-36.3 -68.918,-45.897 -23.855,-4.6781 -65.378,-7.4056 -82.236,-8.212 -21.687,0.58594 -30.486,-3.1041 -29.207,-0.47034 l 0.58552,1.2066 c 4.889,10.075 11.582,14.083 7.7008,33.25 -5.3242,26.293 -34.993,30.518 -37.107,30.518 -19.614,0 -38.212,-9.5819 -41.75,-15.161 -9.3196,-14.694 -2.1662,-33.252 9.2454,-45.026 l 6.2229,-6.4204 11.891,0.54223 c 15.585,0.71066 -40.209,8.1232 -59.803,17.416 -24.328,11.537 -22.411,14.022 -38.651,26.009 -13.204,9.7462 -56.993,35.148 -73.409,43.517 -9.875,5.0346 -17.407,9.5558 -22.943,18.619 -5.6574,9.2624 -15.852,24.834 -21.155,33.285 -2.9286,4.6669 -11.331,15.469 -16.699,25.547 -3.297,6.1903 -9.3703,14.194 -12.097,20.095 -5.988,12.959 -7.3074,18.224 -9.5675,25.172 -1.6457,5.0591 -3.2376,24.137 -4.7535,28.961 -4.7493,15.114 -4.9653,28.122 -7.545,41.401 -3.2027,16.486 -0.12895,13.032 2.9743,28.363 3.5327,17.453 0.46645,43.559 7.7138,66.887 7.1374,19.056 13.012,30.424 30.184,28.88 9.1748,-1.4224 14.641,1.202 24.156,-1.2293 16.845,-4.3043 17.438,-0.58178 27.736,6.1947 8.0753,5.3144 21.07,5.1295 28.277,12.616 3.1253,3.2463 6.1728,8.1762 12.218,10.952 9.4689,4.3487 19.407,-3.4152 27.261,4.0149 8.1905,3.6954 10.984,15.781 17.759,22.812 5.0828,5.2751 16.352,2.2137 20.946,8.4851 19.748,26.958 66.643,74.35 45.48,95.792 -5.7692,5.8453 -5.5003,15.685 -4.1643,19.422 2.5416,8.7119 5.1109,22.856 9.2861,27.098 12.179,12.372 0.91796,11.152 32.932,19.032 l 8.2539,0.17604 -2.8568,-8.0971 z m -65.957,-85.874 c -27.333,-35.566 -21.826,-78.737 23.102,-78.737 9.5796,0 13.402,1.0456 20.669,5.6544 28.373,17.993 28.373,55.089 0,73.083 -7.5072,4.761 -10.608,12.083 -21.529,12.083 -10.92,0 -14.736,-2.3145 -22.243,-12.083 z m 43.468,-8.3862 c 8.1626,-11.268 10.592,-21.196 7.6164,-31.128 -3.4001,-11.349 -10.074,-28.17 -14.635,-22.125 -1.2705,1.6844 3.316,5.6303 5.8857,10.878 2.8862,5.8947 3.8886,13.168 4.0578,15.578 0.36381,5.1813 0.34826,10.267 1.1293,14.676 3.0184,17.041 -12.514,23.797 -4.0544,12.119 z m 187.25,-72.146 c 16.005,-10.894 30.123,-0.31393 42.182,15.97 4.3625,5.8909 18.963,29.388 17.044,39.616 -2.5912,13.812 -7.0305,34.089 -22.366,34.089 -41.797,-3.098 -66.567,-66.653 -36.86,-89.675 z m 46.305,42.673 c 0,-7.6646 -4.0867,-15.365 -8.1545,-15.365 -2.8926,0 -0.002,10.107 3.2969,15.142 4.5886,7.0032 4.8576,9.5388 4.8576,0.22239 z m -405.34,-82.28 c -24.946,-23.592 -10.977,-48.16 -5.8679,-58.494 16.239,-32.454 42.337,-12.368 60.936,18.965 18.929,31.888 -31.767,57.235 -55.068,39.529 z m 40.834,-24.345 c 3.9214,-42.824 -40.062,-60.572 -23.245,-34.607 2.7884,3.7236 22.493,39.551 23.245,34.607 z m 164.99,-69.158 c 12.269,24.203 12.452,60.49 -13.438,65.886 -11.184,2.3309 -27.217,2.9483 -37.448,-1.7643 -71.159,-50.014 14.074,-129.87 50.886,-64.121 z m -24.009,-7.4448 c 1.3454,8.2529 15.321,33.642 24.056,34.283 -0.45457,-14.513 -13.79,-51.425 -24.056,-34.283 z m 198.4,42.46 c -19.134,-6.6089 -30.461,-22.739 -30.461,-43.379 0,-17.45 10.444,-28.862 23.552,-36.058 9.1,-4.9956 18.699,-9.2676 30.238,-6.6852 19.225,4.3023 32.977,14.604 37.325,34.03 4.9837,22.27 -9.4172,46.102 -31.891,52.776 -12.875,3.8235 -15.922,3.751 -28.763,-0.68428 z m -22.84,-49.774 c -2.7066,19.564 2.0935,8.19 7.8177,15.659 26.329,32.297 -1.0816,-45.27 -7.8177,-15.659 z m 72.539,-57.581 c -9.0876,-3.3263 -13.772,-14.394 -18.777,-22.381 -4.4342,-7.0759 -5.1725,-19.288 -5.1725,-28.209 0,-13.739 4.0468,-17.113 14.064,-26.729 11.951,-11.472 24.428,-12.469 40.504,-6.7969 17.777,6.2722 29.202,22.748 29.202,42.112 0,31.489 -30.342,52.794 -59.821,42.003 z m 33.98,-23.27 c 3.6002,-3.2946 7.7952,-8.375 9.3223,-11.29 3.023,-5.7702 3.8177,-26.208 1.0848,-27.897 -2.6645,-1.6468 -18.266,16.164 -21.095,24.082 -1.4053,3.9336 -2.5939,11.455 -2.6413,16.715 -0.0964,10.696 -0.12187,10.699 13.329,-1.6099 z m -404.26,-51.16 c -34.373,-17.902 -23.523,-54.726 11.656,-70.287 24.147,-10.681 45.807,-10.209 53.13,14.232 4.9873,16.646 -0.16113,37.981 -11.729,48.605 -13.791,12.665 -36.832,15.901 -53.057,7.4504 z m 29.883,-7.8392 c 6.7836,-1.8839 18.759,-10.216 15.554,-9.024 -13.571,5.0488 -23.933,2.971 -32.067,3.0832 -7.7015,0.10637 -16.611,-7.5648 -19.497,-4.9426 -2.546,2.313 5.7464,8.2824 16.68,12.008 12.718,4.3332 10.542,1.316 19.33,-1.1243 z m 156.8,434.25 c 2.699,-4.8466 -1.2296,-5.5904 -3.9286,-10.437 -4.1465,-7.446 -6.4955,-6.874 -11.073,-0.33817 -5.7392,6.1214 -5.1149,2.157 -5.3571,12.899 6.7207,2.9644 16.213,5.3221 20.359,-2.1239 z m -64.96,-584.2 c 7.0196,-2.9214 20.05,-16.291 20.05,-19.494 0,-2.1692 -11.565,1.717 -22.122,4.1421 -9.3597,2.1499 -13.154,3.6138 -17.438,15.849 l 0.39521,6.4686 c 9.7533,12.059 11.502,-3.1154 19.115,-6.9654 z" - inkscape:connector-curvature="0" - id="path3822" /> - <path - d="m 96.301,591.28 c 0.84927,-21.344 6.8717,-33.87 7.1828,-41.651 0.23829,-5.9595 3.2881,-16.039 7.6027,-24.096 5.3841,-17.02 25.195,-38.582 27.59,-43.046 7.6018,-6.9615 15.945,-18.151 19.767,-18.528 3.5907,1.2747 -6.9412,26.211 -8.1384,28.957 -3.405,7.811 -21.438,18.296 -23.214,25.154 -2.3974,9.2603 -1.1578,20.836 -3.0228,28.128 -2.2678,8.8671 -5.8294,12.712 -8.4836,19.575 -3.1982,8.2688 -0.0593,7.2292 -5.7267,16.453 -1.9622,3.1933 -9.5075,8.2438 -13.557,9.055 z" - inkscape:connector-curvature="0" - style="stroke-width:0" - id="path3828" /> - <path - d="m 100.54,638.94 c -0.82616,-0.41308 -6.0251,5.0001 -6.1835,9.3715 -0.52598,14.517 -0.48066,14.476 -0.27048,22.57 -0.86634,10.026 3.2476,41.513 7.6379,44.431 2.5895,3.0479 3.1462,6.0958 3.8975,9.1437 l 3.862,8.3106 c 8.2759,12.068 16.078,6.1528 20.825,3.5968 6.2795,-2.506 -17.764,-3.9307 -15.928,-14.025 -3.3359,-10.768 -10.815,-19.878 -9.8004,-32.386 3.302,-17.004 -2.2675,-34.008 -4.0406,-51.013 z" - inkscape:connector-curvature="0" - style="stroke-width:0" - id="path3830" /> - <path - d="m 140.89,730.04 c 3.023,-0.35081 4.8791,-0.1181 10.536,-1.7857 3.8505,0.4872 8.6672,-0.63587 11.25,1.9643 0.95368,0.57221 -4.0538,3.5284 -6.6071,3.0357 -1.7034,-0.32872 -6.8395,4.616 -6.0714,5 -3.2788,-2.414 -8.3725,-2.4081 -9.1071,-8.2143 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:1px" - id="path3832" /> - <path - d="m 600.87,400.6 c -12.522,-6.7483 -27.087,-11.316 -48.819,-34.641 -24.665,-9.7898 -51.729,-17.42 -85.863,-18.688 -4.8423,0.11021 -9.6473,0.32316 -12.627,5.5558 37.287,0.87404 102.36,21.666 103.95,29.203 73.195,44.458 42.656,23.76 59.582,32.875 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:1px" - id="path3834" /> - <path - d="m 692.62,541.55 c 3.4688,16.785 9.002,28.245 11.869,48.74 2.2547,10.834 3.3818,23.732 -3.0399,30.561 -2.7528,9.3398 -4.7748,10.373 -1.6918,23.433 12.029,17.433 7.9425,34.225 13.318,50.051 -9.7648,-20.035 -41.754,-56.625 -30.557,-60.357 8.1792,-4.3992 11.546,-13.284 11.112,-28.284 0.0432,-13.105 -5.3768,-66.869 -1.0102,-64.145 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:1px" - id="path3855" /> - <path - d="m 454.29,950.93 c 6.9159,-8.5714 6.7976,-17.143 28.571,-25.714 15.867,-4.3619 30.723,-10.022 40,-22.857 -1.4234,7.258 -7.4713,13.699 1.4286,13.214 l 35,-19.286 c 21.426,-13.228 48.947,-19.28 47.857,-41.071 24.89,-62.16 15.64,-19.701 47.5,-66.429 31.352,-31.034 29.814,-44.059 33.929,-63.571 -3.4415,-23.602 3.5996,-27.737 6.0714,-40.357 16.893,0.21109 7.75,22.373 9.6429,30.357 -1.6377,29.547 -5.1601,31.512 -10.357,43.571 -7.8684,17.586 -19.802,35.866 -33.75,50.179 -39.251,33.773 -20.59,18.38 -48.036,65.714 -5.1405,10.418 -6.8395,5.1328 -12.143,17.321 -1.8558,9.5759 -29.361,18.343 -52.857,23.214 -13.825,6.5277 -29.622,10.591 -40,21.429 -15.956,-2.9978 -34.062,4.0336 -52.857,14.286 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:1px" - id="path3857" /> - <path - d="m 259.35,776.28 c 4.8181,4.0534 10.034,6.8804 10.156,11.169 13.076,4.7856 18.315,3.6093 19.931,3.2669 -3.1464,-1.9104 -10.907,-7.7353 -7.6708,-13.428 -6.9908,-3.8548 -14.737,-2.2035 -22.416,-1.0075 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:0.70523px" - id="path3859" /> - <path - d="m 408.61,496.78 c -18.723,2.9447 -35.534,21.271 -39.396,37.881 -7.4374,13.275 4.852,45.987 8.2075,47.098 2.0203,6.0609 22.602,13.511 22.602,13.511 31.961,8.6108 45.377,-9.4228 54.043,-29.8 4.2821,-11.138 9.2066,-33.645 5.4296,-39.901 -8.7833,-17.094 -14.038,-21.148 -28.284,-26.769 -7.344,-2.9788 -13.601,-3.7994 -22.602,-2.0203 z" - inkscape:connector-curvature="0" - style="stroke:#000000;stroke-width:1px" - id="path3063" /> - <path - d="m 412.1,506.37 c -1.2437,1.0671 7.7545,4.1375 16.455,6.4474 13.518,3.3567 14.576,16.031 15.219,21.657 -0.79972,7.374 8.2113,0.53903 4.9845,-6.5047 -7.4515,-21.357 -11.345,-16.579 -20.582,-23.486 -4.9851,-1.484 -6.9728,-2.3798 -16.076,1.8864 z" - inkscape:connector-curvature="0" - style="fill:#ffffff;stroke-width:0" - id="path3833" /> - <path - d="m 357.49,964.44 c -11.736,-3.3148 -13.191,-4.294 -20.412,-13.733 -4.4089,-5.7633 -5.4851,-8.3376 -9.16,-21.911 -3.8793,-14.328 -3.3031,-20.346 2.6705,-27.888 1.9327,-2.4402 3.504,-6.0543 4.2745,-9.8313 1.3215,-6.4785 -0.002,-5.0726 16.897,-17.947 15.733,-11.985 22.372,-25.921 20.11,-42.211 -1.7607,-12.678 -12.243,-26.63 -24.746,-32.938 -4.533,-2.287 -6.1498,-2.5206 -17.127,-2.4753 -10.049,0.0415 -13.085,0.43147 -17.758,2.2809 -6.9374,2.746 -13.223,7.9998 -16.73,13.983 -1.4594,2.4903 -2.955,4.1567 -3.3235,3.7033 -9.9894,-12.291 -9.7912,-12.133 -17.476,-13.962 -10.767,-2.5629 -10.102,-1.977 -20.539,-18.071 -2.3354,-3.6011 -5.6591,-7.0943 -8.4099,-8.8388 -4.2088,-2.6692 -5.2906,-2.8845 -14.492,-2.8845 -11.435,0 -14.958,-1.3047 -21.344,-7.9044 -3.8679,-3.9976 -4.1574,-6.2377 -0.80607,-6.2377 3.382,0 16.233,-6.9768 20.25,-10.994 8.2556,-8.2556 10.727,-17.084 7.4151,-26.493 -4.4259,-12.576 -20.827,-32.482 -31.409,-38.123 -6.7171,-3.5802 -14.302,-4.2646 -19.199,-1.7325 -9.4308,4.8769 -21.34,28.586 -21.34,42.484 0,3.8177 1.7648,11.859 3.4828,15.869 0.63909,1.4917 0.25135,1.64 -2.9353,1.1229 -2.0194,-0.3277 -7.628,-0.0919 -12.464,0.52386 -13.447,1.7125 -32.531,2.3889 -32.531,1.1529 0,-0.57547 0.79549,-1.2925 1.7678,-1.5934 4.109,-1.2717 8.3338,-3.463 8.3338,-4.3224 0,-0.50877 -2.2574,-1.7368 -5.0164,-2.7289 -7.3245,-2.6338 -9.6891,-5.101 -12.504,-13.046 -1.3779,-3.8891 -3.7772,-10.026 -5.3318,-13.637 -2.7134,-6.3032 -2.8197,-7.1724 -2.6541,-21.718 0.17961,-15.777 -3.1893,-44.062 -5.2641,-44.197 -0.53396,-0.0347 -1.8977,1.1815 -3.0305,2.7027 -1.9348,2.5981 -2.0541,4.1229 -1.9684,25.16 0.10292,25.272 2.2571,40.181 6.7996,47.06 1.3145,1.9905 2.9771,5.4374 3.6947,7.6597 2.2442,6.9505 4.8786,11.31 8.7744,14.522 4.2571,3.5091 4.0307,5.0829 -0.40154,2.7909 -5.0754,-2.6246 -9.7965,-8.9238 -14.127,-18.849 -5.3011,-12.15 -6.9669,-20.504 -8.3548,-41.9 -1.5712,-24.222 -2.7059,-33.246 -5.2643,-41.87 l -2.2324,-7.5248 2.8366,-19.743 c 1.5601,-10.859 3.7143,-23.155 4.7871,-27.325 1.0728,-4.1703 2.8287,-13.526 3.9021,-20.79 1.814,-12.276 4.9867,-23.348 10.125,-35.335 2.7908,-6.5106 16.143,-28.564 29.701,-49.056 6.1529,-9.2998 14.565,-22.177 18.693,-28.616 8.9672,-13.987 11.569,-16.174 33.538,-28.204 36.725,-20.109 59.425,-34.214 75.395,-46.847 18.293,-14.471 30.565,-20.435 53.714,-26.103 8.0878,-1.9803 15.313,-3.7952 16.055,-4.033 0.74255,-0.23786 -0.2829,1.7921 -2.2788,4.511 -10.979,14.956 -12.565,32.507 -3.7848,41.875 4.9977,5.3322 17.734,10.651 30.8,12.861 13.095,2.2156 26.228,-2.3242 36.623,-12.66 7.3348,-7.2933 9.4528,-12.428 10.226,-24.793 l 0.53719,-8.5863 -4.6639,-9.0453 c -2.5651,-4.9749 -4.6639,-9.2163 -4.6639,-9.4252 0,-0.20895 6.2503,-0.0977 13.89,0.24725 71.082,3.2095 110.54,8.8316 129.48,18.452 9.0688,4.604 10.983,7.419 2.9402,4.3237 -17.007,-6.5452 -43.515,-12.294 -65.023,-14.101 -13.554,-1.1387 -17.993,-0.45013 -21.557,3.3436 l -2.2402,2.3846 8.8398,0.71725 c 29.895,2.4257 84.399,17.735 93.645,26.304 1.3942,1.2921 6.5081,4.7492 11.364,7.6824 5.8736,3.5478 13.756,9.9384 23.547,19.091 8.0946,7.5667 21.991,19.941 30.88,27.499 26.281,22.345 27.407,23.691 36.675,43.825 4.83,10.493 10.099,20.189 13.448,24.749 7.4149,10.094 12.937,19.022 18.028,29.148 3.3188,6.6008 3.9474,8.6129 2.8943,9.2648 -1.6446,1.018 -1.5922,11.184 0.23724,46.067 1.6661,31.769 0.56407,37.839 -8.1181,44.716 -6.7902,5.3779 -5.5483,9.2964 10.733,33.864 5.5228,8.3338 11.726,17.942 13.786,21.353 2.4459,4.0506 4.3556,6.1521 5.5074,6.0609 1.6004,-0.12667 1.757,1.1198 1.6959,13.498 -0.11438,23.153 -4.4854,33.571 -32.845,78.287 -11.082,17.474 -18.787,26.968 -33.613,41.416 -11.258,10.972 -12.306,12.513 -22.67,33.335 -12.822,25.76 -24.328,41.199 -34.648,46.49 -2.5548,1.3098 -8.3982,3.3398 -12.985,4.511 -12.767,3.2596 -19.68,6.1606 -40.747,17.097 -21.632,11.231 -30.986,14.371 -47.745,16.029 -12.438,1.2308 -17.594,3.283 -32.351,12.877 -11.065,7.1942 -17.659,10.272 -19.53,9.1153 -0.56562,-0.34958 0.0824,-3.6118 1.5695,-7.9005 3.7105,-10.701 3.6423,-19.874 -0.20027,-26.934 -4.9118,-9.0245 -18.609,-20.272 -24.688,-20.272 -4.059,0 -23.209,11.317 -30.375,17.95 -11.258,10.422 -14.65,20.902 -10.538,32.557 0.83338,2.362 1.5152,4.692 1.5152,5.1778 0,1.677 -7.6127,0.70277 -18.469,-2.3637 z m 123.02,-24.579 c 6.1291,-2.1083 10.38,-2.8473 17.599,-3.0592 9.0964,-0.26703 9.7223,-0.43399 14.142,-3.7721 9.2485,-6.985 29.584,-15.847 45.75,-19.938 15.669,-3.9652 27.471,-8.3142 34.51,-12.717 4.5702,-2.8587 6.3489,-4.7732 8.6468,-9.3069 1.5912,-3.1393 4.1084,-6.8413 5.5939,-8.2265 3.179,-2.9646 9.6,-14.139 19.628,-34.158 7.8698,-15.711 8.347,-16.291 28.886,-35.14 12.153,-11.153 22.639,-24.418 31.341,-39.648 6.6985,-11.724 13.436,-26.957 15.218,-34.41 1.6626,-6.9511 3.924,-42.164 3.018,-46.993 -0.74472,-3.9697 -4.6949,-7.6474 -8.2141,-7.6474 -2.0156,0 -2.7252,1.2398 -5.6373,9.849 -3.0586,9.0422 -3.3453,10.966 -3.5006,23.486 -0.33078,26.671 -6.3917,41.159 -26.289,62.841 -3.7086,4.0411 -8.9815,10.306 -11.718,13.922 -7.127,9.4191 -13.216,15.598 -19.447,19.734 -3.2465,2.1549 -6.7557,5.6665 -8.7171,8.7232 -4.5657,7.1151 -15.047,31.79 -15.047,35.424 0,8.3379 -8.4298,16.61 -26.467,25.971 -6.8329,3.5462 -20.833,11.103 -31.111,16.792 -10.278,5.6893 -20.397,11.157 -22.486,12.151 -6.2977,2.995 -7.0588,0.33245 -3.0164,-10.552 0.33962,-0.91444 -2.3222,1.0648 -5.9152,4.3983 -7.2987,6.7716 -14,10.376 -28.162,15.147 -12.041,4.0566 -17.188,6.6711 -22.397,11.377 -3.3888,3.0616 -8.9261,10.297 -12.325,16.104 -0.39011,0.66662 3.5082,-0.76401 8.6629,-3.1792 5.1547,-2.41519 13.009,-5.6421 17.453,-7.171 z m 98.758,-58.037 c 1.2144,0 4.1284,-2.0801 6.8067,-4.8589 6.2041,-6.4366 10.603,-19.094 10.603,-30.511 0,-6.9659 -0.38645,-8.3897 -4.6973,-17.306 -8.9616,-18.536 -20.892,-33.27 -30.658,-37.863 -22.652,-10.653 -42.142,15.563 -33.901,45.601 4.8503,17.68 16.998,33.645 30.761,40.426 7.0524,3.4751 14.963,5.6771 17.617,4.9038 0.73992,-0.21558 2.3008,-0.39197 3.4687,-0.39197 z m -293.68,-94.917 c -2.7787,-2.8457 -3.9089,-4.8785 -3.9089,-7.0309 0,-2.4522 -0.57285,-3.2276 -3.0128,-4.0782 -3.3825,-1.1792 -10.372,-1.3479 -16.167,-0.3904 l -3.859,0.63765 5.1217,4.4803 c 2.8169,2.4642 5.1217,5.1005 5.1217,5.8585 0,1.8586 8.3115,4.2912 15.105,4.4209 l 5.5083,0.10518 -3.9089,-4.0031 z m -132.69,-51.04 c 1.6507,-1.389 3.7886,-2.5254 4.751,-2.5254 0.96235,0 2.6321,-0.67322 3.7106,-1.496 3.5009,-2.671 -0.003,-3.7338 -10.506,-3.1868 -5.1903,0.27027 -9.6638,0.71838 -9.9412,0.99577 -1.2813,1.2813 1.1884,4.9099 4.5505,6.6858 4.6327,2.447 3.9104,2.493 7.4357,-0.47332 z m 222.27,-11.589 c 11.753,-4.4136 17.422,-14.808 17.371,-31.848 -0.0784,-25.991 -13.873,-49.291 -32.931,-55.621 -8.0538,-2.675 -18.97,-1.733 -27.269,2.3534 -11.766,5.7928 -21.934,18.416 -24.562,30.49 -2.4375,11.2 0.33893,24.561 7.3027,35.142 3.9242,5.9627 16.629,18.171 20.473,19.672 8.7943,3.4349 30.238,3.3324 39.616,-0.18938 z m 208.53,-27.7 c 17.662,-4.7025 31.39,-17.697 35.661,-33.754 2.69,-10.114 0.82455,-24.008 -4.4262,-32.968 -3.0245,-5.1608 -11.128,-12.842 -16.355,-15.5 -6.0034,-3.0543 -17.288,-6.2685 -22.008,-6.2685 -16.06,0 -37.39,13.197 -43.899,27.16 -2.0628,4.4254 -2.7241,7.6236 -3.014,14.575 -0.5767,13.83 3.0011,24.268 11.265,32.867 5.771,6.0047 10.863,9.1131 20.389,12.446 8.9864,3.1441 14.629,3.5076 22.386,1.4423 z m -159.55,-99.77 c 10.668,-2.6863 19.906,-10.878 26.774,-23.739 5.0129,-9.3888 9.8803,-28.297 9.8803,-38.382 0,-6.8803 -0.3532,-8.2306 -3.7472,-14.326 -5.5777,-10.018 -12.334,-16.27 -22.012,-20.373 -27.327,-11.583 -55.549,2.99 -66.298,34.234 -2.4482,7.1159 -2.4234,17.52 0.0665,27.896 4.1896,17.46 8.3174,23.033 21.785,29.412 12.854,6.0886 23.613,7.7812 33.552,5.2785 h 2e-5 z m -319.63,-9.7538 c 4.4915,-2.9724 8.344,-9.0856 9.3488,-14.835 0.3884,-2.2223 2.2828,-7.4499 4.2099,-11.617 5.7077,-12.342 6.3999,-15.031 7.3796,-28.674 0.65896,-9.1757 1.4351,-13.796 2.6299,-15.657 0.93228,-1.4521 6.1439,-6.859 11.581,-12.015 9.2413,-8.7635 10.096,-9.9167 13.095,-17.678 5.9437,-15.377 7.3559,-21.94 4.7212,-21.94 -3.3764,0 -24.163,23.851 -36.095,41.416 -6.374,9.3834 -15.068,29.181 -16.819,38.302 -0.80911,4.213 -2.764,13.797 -4.3441,21.297 -1.5802,7.5004 -3.1155,16.272 -3.412,19.492 -0.52011,5.6501 -0.46233,5.8305 1.6524,5.1593 1.2053,-0.38253 3.9285,-1.8451 6.0517,-3.2501 z m 539.54,-1.5586 c 26.778,-13.234 33.074,-48.392 12.665,-70.723 -11.959,-13.085 -33.673,-18.264 -47.732,-11.383 -6.0429,2.9573 -18.834,15.06 -21.211,20.069 -2.3804,5.0162 -3.1192,15.387 -1.8015,25.289 1.34,10.069 2.4528,13.068 8.6016,23.176 8.8951,14.623 15.586,18.298 32.146,17.654 8.8996,-0.34613 10.57,-0.7395 17.332,-4.0816 z m -371.07,-69.96 c 21.598,-6.408 33.445,-24.146 31.971,-47.87 -0.71057,-11.44 -3.079,-17.492 -9.312,-23.795 -6.2596,-6.3289 -11.501,-8.0498 -22.081,-7.2496 -20.809,1.5738 -43.952,15.74 -51.789,31.701 -2.5424,5.1778 -2.9013,7.0335 -2.9013,15 0,8.0408 0.31275,9.6234 2.7066,13.695 4.9088,8.3497 14.219,15.447 24.568,18.729 5.8229,1.8464 20.286,1.7324 26.838,-0.2115 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3163" /> - <path - d="m 705.84,655.28 c -0.40467,-1.0804 -2.0013,-4.5357 -3.5481,-7.6786 -3.8034,-7.728 -4.4033,-13.681 -2.1322,-21.158 0.87749,-2.889 2.1979,-6.0987 2.9342,-7.1328 0.73631,-1.034 1.6602,-2.7256 2.0531,-3.7591 0.9706,-2.5528 2.4888,-2.4839 1.8773,0.0853 -1.1884,4.9928 -1.2665,22.815 -0.1352,30.864 0.63277,4.5021 1.1505,8.761 1.1505,9.4643 0,1.9511 -1.3723,1.5234 -2.1997,-0.6856 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3165" /> - <path - d="m 714.18,724.94 c 0,-0.0512 0.058,-0.37314 0.12894,-0.71552 0.38069,-1.8379 0.82802,-4.9303 1.0353,-7.1569 0.31873,-3.4241 0.41336,-6.4128 0.41283,-13.037 -5.6e-4,-7.13 -0.10757,-8.9508 -0.5799,-9.8687 -0.21957,-0.42666 -0.39847,-0.52962 -1.0098,-0.58118 -0.73596,-0.0621 -0.84031,-0.12435 -0.99207,-0.5921 -0.39264,-1.2102 -0.92423,-3.2794 -1.2587,-4.8995 -0.64655,-3.1317 -0.99877,-5.538 -1.7142,-11.711 -0.57472,-4.9592 -1.0382,-8.4099 -1.3906,-10.354 -0.61887,-3.4136 -1.2458,-6.005 -2.1074,-8.7104 -0.12127,-0.38079 -0.20812,-0.70471 -0.19301,-0.71982 0.0151,-0.0151 0.16875,0.10467 0.34141,0.26618 0.36711,0.34339 0.66197,0.395 0.88556,0.155 0.12876,-0.13821 0.25352,-0.48333 0.25419,-0.70314 2e-4,-0.0644 0.0354,-0.10411 0.0793,-0.0895 0.0434,0.0144 0.11525,0.23697 0.15966,0.49455 0.67512,3.9161 2.0273,10.503 4.0298,19.63 2.5868,11.79 3.2811,15.202 3.7134,18.246 1.1622,8.1831 1.0599,16.086 -0.31182,24.092 -0.44098,2.5738 -1.2631,6.2768 -1.4039,6.3234 -0.0434,0.0144 -0.0789,-0.0158 -0.0789,-0.0669 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3167" /> - <path - d="m 705.65,614.03 c 0.0591,-0.15412 0.27317,-1.093 0.47562,-2.0865 0.95697,-4.6959 0.67993,-12.113 -0.72862,-19.508 -0.18707,-0.98215 -0.6619,-3.7143 -1.0552,-6.0714 -1.3407,-8.0353 -2.4729,-12.813 -5.6498,-23.839 -2.801,-9.7217 -3.8632,-13.613 -4.7158,-17.277 -0.78542,-3.3751 -0.80411,-3.496 -0.52633,-3.4034 0.23109,0.077 1.0054,1.8313 2.7507,6.2323 4.988,12.578 8.7723,25.587 11.631,39.984 1.2325,6.2072 1.3884,8.7982 0.86871,14.442 -0.26546,2.8832 -1.2756,10.952 -1.4284,11.41 -0.0604,0.18099 -0.14734,0.18261 -0.42706,0.008 -0.2895,-0.18079 -0.41033,-0.16581 -0.68775,0.0852 -0.42076,0.38078 -0.64793,0.3917 -0.50697,0.0244 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3169" /> - <path - d="m 292.43,816.1 c -0.8131,-1.02 -1.5801,-1.9879 -2.2663,-2.8597 -0.57185,-0.72662 -1.099,-1.3995 -1.099,-1.4028 0,-10e-4 0.0344,-0.002 0.0766,-0.002 h 0.0766 l 0.28169,0.34428 c 0.41905,0.51216 0.9291,1.1383 1.8586,2.2817 0.67074,0.82507 0.83874,1.0295 0.85807,1.0442 0.072,0.0546 0.17665,0.0515 0.311,-0.009 0.12726,-0.0574 0.26381,-0.15315 0.44591,-0.3127 0.0753,-0.066 0.29796,-0.28733 0.38928,-0.387 0.38101,-0.4158 0.81553,-0.97856 1.2461,-1.6139 0.0353,-0.0521 0.0666,-0.0973 0.0696,-0.10038 0.0147,-0.0155 0.007,0.005 -0.0213,0.0597 -0.04,0.0763 -0.1868,0.37687 -0.28973,0.5931 -0.45819,0.96253 -0.88833,1.9954 -1.2481,2.9969 -0.03,0.0835 -0.0556,0.1532 -0.0569,0.15477 -10e-4,0.002 -0.28578,-0.35267 -0.63218,-0.78721 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3171" /> - <path - d="m 288.72,811.4 c -0.67104,-0.86275 -1.6016,-2.0705 -1.6079,-2.0868 -10e-4,-0.003 -2e-4,-0.005 0.002,-0.005 0.0118,0 1.2242,1.4574 1.9368,2.328 l 0.16638,0.20329 -0.0697,0.002 c -0.0383,10e-4 -0.0717,0.003 -0.0742,0.005 -0.003,0.002 -0.1324,-0.16162 -0.3535,-0.44589 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3173" /> - <path - d="m 271.48,800.77 c -1.0349,-0.19257 -2.113,-0.4377 -2.8571,-0.64964 -2.2896,-0.65206 -3.8974,-1.5394 -5.113,-2.8218 -0.88948,-0.93832 -1.7053,-1.9342 -2.526,-3.0834 -0.0942,-0.13197 -0.18859,-0.26381 -0.20964,-0.29297 l -0.0383,-0.053 h 0.37913 l 0.1377,0.18694 c 0.4208,0.57124 1.0481,1.3646 1.4406,1.822 1.0049,1.1709 1.909,1.9957 2.8938,2.6398 1.1603,0.75892 2.4472,1.2905 4.481,1.8509 0.33086,0.0912 1.0617,0.28203 1.4055,0.36705 0.0579,0.0143 0.10728,0.0321 0.10975,0.0395 0.005,0.0156 0.0113,0.0159 -0.10341,-0.005 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3175" /> - <path - d="m 260.71,793.83 c -0.0174,-0.0244 -0.15787,-0.23032 -0.31223,-0.45759 -0.76799,-1.1307 -1.5706,-2.4241 -2.5419,-4.0962 -0.45657,-0.786 -0.60306,-1.0446 -0.59589,-1.0517 0.0118,-0.0118 0.0309,0.0143 0.18223,0.24817 1.1826,1.8279 2.7494,4.1368 3.515,5.1803 0.0818,0.11143 0.14868,0.20537 0.14868,0.20874 0,0.003 -0.082,0.008 -0.18218,0.009 l -0.18217,0.003 -0.0316,-0.0444 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3177" /> - <path - d="m 269.03,786.85 c -0.10336,-0.15979 -0.14148,-0.27022 -0.1598,-0.46292 -0.006,-0.0614 -0.0215,-0.14676 -0.0349,-0.18973 -0.11756,-0.37835 -0.62056,-1.1092 -1.3327,-1.9364 -0.47702,-0.55409 -0.90378,-1.0095 -1.5909,-1.6975 -1.0407,-1.0422 -1.2347,-1.2192 -3.6974,-3.3736 -0.77798,-0.68059 -1.4145,-1.2424 -1.4145,-1.2484 0,-0.006 0.006,-0.008 0.0143,-0.005 0.008,0.003 0.19747,0.14819 0.42132,0.3226 0.22385,0.17441 0.64053,0.49735 0.92596,0.71766 1.7782,1.3724 2.476,1.9281 3.1808,2.533 0.97481,0.83658 1.7578,1.6231 2.3117,2.3221 0.72625,0.91649 1.1648,1.7668 1.3756,2.6674 0.0286,0.12212 0.0738,0.37289 0.0739,0.41015 1.1e-4,0.0375 -0.0231,0.0189 -0.0734,-0.0588 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3179" /> - <path - d="m 260.8,775.69 c 10e-4,-0.003 0.26748,-0.0489 0.8099,-0.13858 1.3887,-0.22969 1.7469,-0.28393 2.5691,-0.38899 0.006,-8.3e-4 0.0103,2.9e-4 0.009,0.003 -7.9e-4,0.002 -0.11277,0.0206 -0.25889,0.0422 -0.59411,0.0877 -1.3303,0.20218 -2.4313,0.37799 -0.37702,0.0602 -0.68874,0.10946 -0.69271,0.10946 -0.004,0 -0.007,-0.002 -0.006,-0.005 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3181" /> - <path - d="m 287.17,788.73 c -2.1346,-1.6386 -3.8236,-3.457 -4.7989,-5.1666 -0.65571,-1.1494 -0.94242,-2.0598 -0.99221,-3.1506 -0.0348,-0.76286 0.0737,-1.6579 0.19611,-1.6174 0.0432,0.0143 0.0866,0.37099 0.11638,0.95527 0.13504,2.6534 1.0731,4.24 4.6994,7.9481 0.74798,0.76484 1.3346,1.3906 1.3036,1.3906 -0.031,0 -0.26698,-0.16172 -0.52447,-0.35937 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3183" /> - <path - d="m 224.85,771.95 c -0.76798,-0.0384 -1.0894,-0.0624 -1.5625,-0.11668 -1.655,-0.19 -3.0827,-0.56718 -4.5312,-1.1971 -0.31779,-0.1382 -1.1381,-0.54468 -1.4922,-0.73939 -1.6402,-0.90195 -3.1152,-1.9796 -4.6015,-3.3619 -0.50467,-0.46935 -0.64112,-0.60265 -0.6294,-0.61487 0.016,-0.0166 0.0355,-6.4e-4 0.37369,0.30563 3.6818,3.3344 6.8576,4.7148 12.021,5.2253 1.2376,0.12236 2.808,0.20875 4.2734,0.2351 0.63876,0.0115 0.95445,0.0243 0.94574,0.0384 -0.004,0.006 -0.0584,0.0161 -0.121,0.0215 -0.0626,0.005 -0.31419,0.0277 -0.55912,0.0496 -1.2931,0.11532 -1.9697,0.14925 -3.0938,0.15514 -0.50273,0.003 -0.96328,0.002 -1.0234,-6.7e-4 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3185" /> - <path - d="m 207.19,760.51 c -0.64264,-0.72439 -1.2592,-1.354 -1.7856,-1.8235 -0.10072,-0.0898 -0.17788,-0.16776 -0.17146,-0.17318 0.006,-0.005 0.16988,-0.0364 0.36323,-0.069 0.28378,-0.0477 1.2554,-0.22879 1.4423,-0.26881 l 0.0438,-0.009 -0.0695,0.0996 c -0.26222,0.37608 -0.27373,0.89213 -0.0343,1.5371 0.0724,0.1951 0.25433,0.57426 0.38092,0.79402 0.0529,0.0918 0.0961,0.17039 0.0961,0.1747 0,0.0299 -0.0549,-0.0242 -0.26556,-0.26169 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3187" /> - <path - d="m 169.37,741 c -0.63206,-0.36971 -1.3318,-0.72138 -1.955,-0.98253 -0.0361,-0.0151 -0.0673,-0.0325 -0.0693,-0.0385 -0.002,-0.007 0.10441,-0.011 0.30321,-0.0111 0.23909,-5e-5 0.33008,-0.004 0.41185,-0.0187 0.32169,-0.0572 0.4696,-0.17687 0.49758,-0.40253 0.008,-0.0671 -0.002,-0.21916 -0.0189,-0.2879 -0.0193,-0.0769 0.0326,0.0114 0.17121,0.29111 0.17032,0.34375 0.45205,0.88398 0.66169,1.2688 0.0756,0.1388 0.13585,0.25384 0.13387,0.25564 -0.002,0.002 -0.0633,-0.0316 -0.13618,-0.0743 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3189" /> - <path - d="m 140.63,741.86 c -0.69681,-0.0138 -2.3014,-0.0721 -2.856,-0.10391 -0.10331,-0.006 -0.19404,-0.0108 -0.20164,-0.0109 -0.009,-1.1e-4 -0.0138,-0.0196 -0.0138,-0.0601 v -0.0599 l 0.0691,-0.006 c 0.038,-0.003 0.11629,-0.009 0.17402,-0.0122 2.0332,-0.11762 5.244,-0.36041 7.6787,-0.58064 2.1753,-0.19676 5.0222,-0.49416 6.3419,-0.66252 0.32529,-0.0415 0.29967,-0.026 -0.12706,0.0771 -0.1823,0.044 -0.68724,0.1688 -1.1221,0.27729 -1.167,0.29118 -1.5977,0.38807 -2.4008,0.54011 -1.7785,0.33669 -3.474,0.52163 -5.3767,0.58646 -0.32441,0.011 -1.8392,0.0218 -2.1655,0.0153 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3191" /> - <path - d="m 150.74,737.63 c 0,-0.0114 0.15923,-0.20717 0.30542,-0.37559 0.41028,-0.47268 1.0379,-1.0871 1.629,-1.5948 0.59759,-0.51324 1.1708,-0.94054 1.7669,-1.3171 0.33265,-0.21013 0.75257,-0.41839 1.03,-0.51084 0.25441,-0.0848 0.38874,-0.10157 0.58126,-0.0727 l 0.0921,0.0138 -0.31306,0.15667 c -0.61376,0.30715 -1.1778,0.64184 -1.766,1.0478 -0.5634,0.38893 -0.85111,0.61617 -1.75,1.3821 -0.87516,0.74577 -1.1319,0.95879 -1.3913,1.1542 -0.15145,0.11411 -0.18436,0.13487 -0.18436,0.1163 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3193" /> - <path - d="m 122.16,742.12 c -1.4356,-0.05 -2.6449,-0.19036 -3.9668,-0.46055 -0.92758,-0.1896 -1.9651,-0.47021 -1.9872,-0.53746 -0.0117,-0.0355 0.0802,-0.0504 0.30285,-0.049 0.29354,0.002 0.32799,-0.008 0.42212,-0.11716 0.12215,-0.142 0.12709,-0.22717 0.0277,-0.47794 -0.11004,-0.27768 -0.3283,-0.60344 -0.70556,-1.0531 -0.18428,-0.21964 -0.32592,-0.40848 -0.31476,-0.41964 0.0112,-0.0112 0.21718,0.0717 0.45781,0.18416 0.84904,0.39676 1.881,0.68975 2.8691,0.81461 0.46387,0.0586 1.631,0.0738 2.0771,0.027 l 0.30936,-0.0324 -0.2358,0.1401 c -0.28768,0.17093 -0.72154,0.56633 -0.85067,0.77526 -0.14483,0.23434 -0.18407,0.46101 -0.0966,0.55772 0.22983,0.25395 1.6258,0.42775 4.0252,0.50112 0.56513,0.0173 0.9695,0.0467 0.94729,0.0689 -0.0213,0.0213 -0.45509,0.0489 -0.96395,0.0612 -0.50886,0.0123 -1.0445,0.028 -1.1904,0.0348 -0.14584,0.007 -0.65297,-10e-4 -1.127,-0.0176 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3195" /> - <path - d="m 116.04,741.11 c -3.9784,-1.2926 -7.2158,-3.7024 -10.16,-7.5629 -1.2306,-1.6135 -2.5174,-3.6679 -3.6659,-5.853 l -0.0799,-0.15192 0.21342,1.6e-4 0.21342,1.5e-4 0.10414,0.19043 c 0.17054,0.31184 0.50804,0.90459 0.74964,1.3166 3.1202,5.321 6.4259,8.939 9.8964,10.832 1.0927,0.59588 2.1742,1.045 2.8395,1.1791 0.11285,0.0228 0.11928,0.0254 0.09,0.0372 -0.0429,0.0172 -0.0248,0.0378 0.0608,0.069 0.0665,0.0243 0.0932,0.0437 0.0571,0.0415 -0.011,-6.5e-4 -0.15423,-0.0448 -0.3183,-0.0981 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3197" /> - <path - d="m 120.93,730.88 c -2.813,-1.3492 -4.6774,-2.7811 -5.7292,-4.4003 -0.57433,-0.88417 -0.87456,-1.8212 -0.91721,-2.8627 -0.0218,-0.53148 0.006,-0.60093 0.12287,-0.3125 0.11611,0.28542 0.82252,1.6793 1.0571,2.0859 1.4613,2.5328 3.2426,4.218 5.9334,5.6137 0.20244,0.105 0.31242,0.19953 0.23088,0.19845 -0.0143,-1.9e-4 -0.32838,-0.14535 -0.69791,-0.32258 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3199" /> - <path - d="m 141.58,729.46 c 0.003,-0.008 0.15402,-0.034 0.49582,-0.0841 0.88241,-0.12922 2.2449,-0.2716 3.8587,-0.40324 0.51907,-0.0423 0.56071,-0.0454 0.56071,-0.0406 0,0.006 -0.0188,0.01 -0.26792,0.0511 -0.88822,0.14689 -1.7302,0.24543 -2.903,0.33977 -0.11394,0.009 -0.35134,0.028 -0.52757,0.0418 -0.45749,0.0359 -0.8289,0.0667 -1.033,0.0857 -0.20634,0.0192 -0.18657,0.0182 -0.18372,0.01 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3201" /> - <path - d="m 100.76,724.77 c -1.1962,-2.5532 -2.3489,-5.3063 -3.7819,-9.0329 -0.16854,-0.43828 -0.37244,-0.97178 -0.45311,-1.1856 l -0.14666,-0.38867 h 0.29288 l 0.07251,0.20508 c 0.6545,1.8511 1.5256,4.0527 2.4752,6.2559 0.6712,1.5572 1.2062,2.7223 1.9383,4.2212 0.0563,0.11524 0.10233,0.21104 0.10233,0.21289 0,0.002 -0.0817,0.003 -0.18164,0.003 l -0.18164,-2.6e-4 -0.13622,-0.29076 v 1e-5 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3203" /> - <path - d="m 105.08,722.34 c -0.0361,-0.10699 -0.1901,-0.52452 -0.26449,-0.71728 -0.68039,-1.7631 -1.7247,-3.9252 -2.6901,-5.5698 -0.11315,-0.19274 -0.34723,-0.57687 -0.43213,-0.70913 -0.0861,-0.13415 -0.008,-0.0746 0.1463,0.11192 1.0418,1.2572 1.8315,2.6182 2.4277,4.184 0.26604,0.69868 0.48029,1.3756 0.72993,2.3062 0.10484,0.39082 0.10791,0.40389 0.0951,0.40389 -0.005,0 -0.0104,-0.004 -0.0122,-0.01 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3205" /> - <path - d="m 102.02,727.32 c -0.2349,-0.45264 -0.62385,-1.2299 -0.86874,-1.7362 l -0.25133,-0.51953 0.16906,-0.004 c 0.093,-0.002 0.17336,-0.007 0.17863,-0.0101 0.007,-0.004 0.0449,0.0644 0.13177,0.23828 0.32179,0.64373 0.94345,1.83 1.1609,2.2152 l 0.0232,0.041 -0.21346,-1.7e-4 -0.21347,-1.7e-4 -0.11648,-0.22444 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3207" /> - <path - d="m 108.1,729.83 c -0.0871,-0.1628 -0.35683,-0.69878 -0.47516,-0.94433 -0.24168,-0.50149 -0.46588,-0.99263 -0.67849,-1.4863 -0.0268,-0.0623 -0.0497,-0.11559 -0.0509,-0.11842 -0.002,-0.004 0.002,-0.005 0.0148,-0.004 l 0.0169,10e-4 0.60084,1.293 c 0.33046,0.71113 0.60084,1.2943 0.60084,1.2959 2e-5,0.0108 -0.0103,-0.003 -0.0288,-0.0371 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3209" /> - <path - d="m 95.582,711.79 c 0,-0.003 -0.04952,-0.17732 -0.11005,-0.38672 -1.4196,-4.9113 -2.5388,-10.519 -3.3125,-16.597 -0.18924,-1.4866 -0.53015,-4.5482 -0.5305,-4.7642 l -6.9e-5,-0.043 h 0.15625 c 0.13836,0 0.15626,0.003 0.15633,0.0274 3.55e-4,0.11766 0.27481,2.779 0.40565,3.9336 0.79901,7.0505 1.8879,12.584 3.4626,17.595 0.03803,0.12104 0.06915,0.22475 0.06915,0.23047 0,0.006 -0.0668,0.0104 -0.14844,0.0104 -0.08164,0 -0.14844,-0.003 -0.14844,-0.006 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3211" /> - <path - d="m 96.184,713.65 c -0.1085,-0.28789 -0.20689,-0.55508 -0.21865,-0.59375 -0.0159,-0.0523 -0.30591,-1.0142 -0.37873,-1.2563 -0.0082,-0.0273 -0.0022,-0.029 0.07542,-0.021 0.0464,0.005 0.11392,0.003 0.15004,-0.003 l 0.06568,-0.012 0.05624,0.18146 c 0.09268,0.29905 0.5187,1.5811 0.6338,1.9073 0.05898,0.16716 0.10724,0.30554 0.10724,0.30752 0,0.002 -0.0661,0.006 -0.14688,0.009 l -0.14688,0.005 -0.19726,-0.52344 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3213" /> - <path - d="m 91.776,690.01 -0.15625,-0.016 -0.05286,-0.54687 c -0.15599,-1.614 -0.36184,-4.2019 -0.50834,-6.3906 -0.2123,-3.1718 -0.68359,-12.797 -0.62925,-12.851 0.01079,-0.0108 0.03157,-0.006 0.04617,0.01 0.02844,0.0312 0.14224,1.6198 0.53603,7.4823 0.40628,6.0485 0.54064,7.8635 0.79448,10.732 0.07746,0.87542 0.13756,1.5928 0.13355,1.5941 -0.004,0.001 -0.0776,-0.005 -0.16353,-0.0136 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3215" /> - <path - d="m 105.24,698.91 c -0.0345,-0.0963 -0.24247,-1.1421 -0.32803,-1.65 -0.39116,-2.3218 -0.51317,-4.5516 -0.37185,-6.7954 0.0364,-0.57733 0.2991,-2.1736 0.36117,-2.1943 0.0238,-0.008 0.0389,0.89139 0.0516,3.0759 0.0169,2.9042 0.0349,3.6797 0.11674,5.009 0.0434,0.70508 0.14394,1.7762 0.20278,2.16 0.0253,0.16533 0.0461,0.33056 0.0461,0.36718 0,0.0719 -0.0556,0.0914 -0.0785,0.0275 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3217" /> - <path - d="m 109.37,710.27 c -0.007,-0.0127 -0.26858,-0.59133 -0.36196,-0.7998 -0.68934,-1.5389 -1.2107,-2.7659 -1.6689,-3.9277 -0.10796,-0.27374 -0.25487,-0.65289 -0.25487,-0.65778 0,-10e-4 0.0125,-0.002 0.0278,-0.002 l 0.0278,0.001 0.0917,0.21679 c 0.0504,0.11924 0.21301,0.50069 0.36132,0.84766 0.35804,0.83757 0.33584,0.78531 0.51601,1.2148 0.3575,0.8523 0.85577,2.0679 1.2185,2.9727 0.0566,0.14114 0.0564,0.14063 0.0505,0.14063 -0.002,0 -0.006,-0.003 -0.008,-0.007 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3219" /> - <path - d="m 107.07,704.86 c -0.0833,-0.2171 -0.33275,-0.89276 -0.40206,-1.089 -0.0184,-0.0522 -0.0219,-0.0695 -0.0119,-0.0591 0.002,0.002 0.0195,0.0446 0.0391,0.0947 0.0559,0.14304 0.2377,0.58941 0.34441,0.84551 0.0535,0.12836 0.0972,0.23412 0.0972,0.23503 0,9e-4 -0.0123,0.002 -0.0274,0.003 l -0.0274,10e-4 -0.012,-0.0312 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3221" /> - <path - d="m 95.735,557.93 c 1.11e-4,-0.0315 0.07673,-0.5987 0.17027,-1.2604 0.69511,-4.9175 1.2065,-7.6374 1.7627,-9.375 0.08527,-0.2664 0.50681,-1.5883 0.93674,-2.9375 1.7668,-5.5445 2.6089,-7.956 4.0362,-11.557 0.38112,-0.96169 0.41613,-1.0363 0.4862,-1.0363 h 0.0755 l -0.0647,0.16407 c -0.22484,0.57008 -0.67126,1.7513 -1.0068,2.6641 -2.6853,7.3046 -4.663,14.471 -6.067,21.984 -0.12686,0.67891 -0.23529,1.2684 -0.24095,1.3101 -0.01216,0.0894 -0.0885,0.12762 -0.08821,0.0441 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3223" /> - <path - d="m 101.52,559.45 c 0,-0.0216 0.25386,-1.2735 0.56412,-2.782 0.31027,-1.5085 0.72256,-3.5266 0.91621,-4.4848 0.23457,-1.1607 0.36587,-1.7468 0.39339,-1.756 0.0332,-0.0111 0.0369,0.0376 0.019,0.24811 -0.0618,0.72768 -0.2692,2.0704 -0.48877,3.165 -0.31719,1.5814 -1.2939,5.6123 -1.3657,5.6362 -0.0211,0.007 -0.0383,-0.005 -0.0383,-0.0265 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3225" /> - <path - d="m 113.98,571.39 c 0,-0.0716 0.1595,-0.88446 0.26788,-1.3652 0.57515,-2.5512 1.8003,-5.7086 3.5194,-9.0701 0.54645,-1.0686 0.64581,-1.25 0.68449,-1.25 0.0437,0 0.0339,0.0539 -0.0338,0.18663 -0.1442,0.28265 -1.0824,2.3969 -1.4218,3.204 -1.1721,2.7874 -2.1961,5.6262 -2.7651,7.6655 -0.0988,0.35419 -0.19575,0.64934 -0.21539,0.65589 -0.0196,0.007 -0.0357,-0.006 -0.0357,-0.0268 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3227" /> - <path - d="m 125.63,528.33 c 0.20665,-3.6795 0.85274,-8.1155 1.5144,-10.398 0.5805,-2.0024 2.537,-4.4866 6.2021,-7.875 1.5798,-1.4606 3.2506,-2.9352 3.3255,-2.9352 0.0298,0 -0.97097,1.0292 -2.2239,2.287 -3.2987,3.3116 -5.1803,5.329 -6.1109,6.5518 -1.1242,1.477 -1.8287,4.6912 -2.455,11.2 -0.12258,1.2737 -0.17588,1.6809 -0.22205,1.6963 -0.0505,0.0168 -0.0555,-0.0726 -0.03,-0.52701 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3229" /> - <path - d="m 105.9,525.16 c 0,-0.0707 1.1974,-2.6778 1.6573,-3.6083 0.76053,-1.5389 1.5586,-2.9501 2.8868,-5.1044 0.91101,-1.4777 2.2447,-3.5743 2.3316,-3.6655 0.2127,-0.22299 -0.0107,0.20213 -0.96836,1.8427 -2.4204,4.1463 -4.2803,7.4981 -5.3797,9.6948 -0.37995,0.75918 -0.5276,0.99446 -0.5276,0.84074 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3231" /> - <path - d="m 120.46,500.11 c 0.0822,-0.21682 1.6856,-2.9161 2.642,-4.4478 1.238,-1.9826 2.4338,-3.8134 3.9403,-6.0323 0.60839,-0.89614 0.78067,-1.1166 0.78067,-0.99919 0,0.0156 -0.62636,1.0059 -1.3919,2.2008 -0.76556,1.1948 -2.4013,3.7808 -3.635,5.7466 -1.9466,3.1019 -2.477,3.9037 -2.336,3.5319 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3233" /> - <path - d="m 331.65,346.02 c 0,-0.0138 0.0394,-0.0876 0.0876,-0.16406 0.41987,-0.66635 0.81296,-1.5256 0.85609,-1.8712 0.009,-0.0723 0.0397,-0.0827 0.61886,-0.20975 0.33516,-0.0735 0.62771,-0.13423 0.65012,-0.13488 0.0224,-6.6e-4 -0.20839,0.26248 -0.51287,0.58475 -0.30449,0.32226 -0.79976,0.86367 -1.1006,1.2031 -0.5027,0.5672 -0.59914,0.6625 -0.59914,0.59206 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3235" /> - <path - d="m 265.27,371.83 c 0,-0.06 2.3122,-1.992 3.7952,-3.1711 4.1393,-3.291 8.3105,-5.9169 14.72,-9.2668 2.0688,-1.0812 7.1893,-3.6025 8.953,-4.4084 1.872,-0.85539 4.1847,-1.7461 6.9064,-2.66 6.4758,-2.1745 14.671,-4.344 25.953,-6.8708 1.2891,-0.2887 2.3498,-0.51908 2.3573,-0.51196 0.007,0.007 0,0.0266 -0.0167,0.0432 -0.0292,0.0292 -4.9673,1.2636 -10.497,2.6239 -7.7406,1.9042 -12.64,3.2999 -17.562,5.0029 -10.504,3.634 -18.919,7.9941 -28.484,14.759 -1.7424,1.2323 -4.8694,3.5414 -5.9164,4.369 -0.15237,0.12044 -0.20863,0.14492 -0.20863,0.0908 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3237" /> - <path - d="m 404.28,358.83 c -0.01,-0.057 -0.0389,-0.2442 -0.0653,-0.41607 -0.1242,-0.80986 -0.39652,-2.0538 -0.61011,-2.787 -0.089,-0.30555 -0.0989,-0.40726 -0.0327,-0.33589 0.0149,0.016 0.22629,0.41589 0.46981,0.88854 l 0.44276,0.85938 -0.0563,0.93494 c -0.0393,0.6529 -0.0675,0.93868 -0.0935,0.94732 -0.0219,0.007 -0.0444,-0.0303 -0.0546,-0.0912 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3239" /> - <path - d="m 396.97,342.55 c -0.19272,-0.30092 -1.1838,-2.2352 -1.6692,-3.2578 -0.27838,-0.58648 -0.32893,-0.78189 -0.24451,-0.94515 0.21072,-0.40748 1.1252,-0.44613 3.8791,-0.16397 2.1845,0.22382 3.3174,0.35042 3.375,0.37719 0.0394,0.0183 -0.18543,0.0227 -0.60938,0.0119 -4.0322,-0.10256 -6.3972,-0.0984 -6.507,0.0114 -0.0196,0.0196 0.0139,0.13398 0.095,0.32366 0.1504,0.35202 0.9013,1.9109 1.4159,2.9393 0.20417,0.40807 0.37121,0.74909 0.37121,0.75782 0,0.042 -0.066,0.008 -0.10608,-0.0544 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3241" /> - <path - d="m 490.22,345.24 c -1.1602,-0.16498 -5.2351,-0.6814 -7.4844,-0.94851 -15.638,-1.8572 -34.856,-3.4116 -57.183,-4.6251 -1.3981,-0.076 -2.5491,-0.14529 -2.5578,-0.154 -0.1152,-0.1152 1.0739,-0.11132 3.4614,0.0113 14.652,0.75245 31.582,2.0204 45.466,3.4052 6.1606,0.61442 13.229,1.4201 17.838,2.0334 0.6414,0.0853 1.1793,0.15515 1.1953,0.15515 0.016,0 0.0291,0.0492 0.0291,0.10938 0,0.13201 0.0621,0.13094 -0.76562,0.0133 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3243" /> - <path - d="m 547.93,363.84 c -0.90395,-0.34607 -1.769,-0.67549 -1.9224,-0.73203 -0.31226,-0.11511 -0.39214,-0.34517 -0.0926,-0.26685 0.10244,0.0268 0.28063,0.0128 0.39596,-0.031 0.16547,-0.0629 0.1954,-0.11838 0.1419,-0.26301 -0.33423,-0.9035 -3.8114,-3.1447 -8.5023,-5.48 -2.03,-1.0106 -4.7036,-2.1442 -7.1082,-3.0138 -0.32817,-0.11868 -0.53658,-0.34429 -0.31804,-0.34429 0.0558,0 0.86455,0.28308 1.7972,0.62906 6.5451,2.428 11.576,5.2038 15.75,8.689 1.2932,1.08 1.5961,1.3544 1.5468,1.4006 -0.0243,0.0228 -0.78378,-0.24171 -1.6877,-0.58779 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3245" /> - <path - d="m 530.34,353.84 c -0.46397,-0.17498 -2.3926,-0.81528 -3.551,-1.1789 -7.4483,-2.338 -16.6,-4.361 -27.719,-6.1271 -2.1015,-0.33381 -5.3705,-0.82022 -6.9531,-1.0346 -0.57579,-0.078 -1.075,-0.14801 -1.1094,-0.15558 -0.0478,-0.0105 -0.0625,-0.0392 -0.0625,-0.12216 0,-0.0985 0.007,-0.10712 0.0781,-0.0945 0.043,0.008 0.79063,0.11231 1.6615,0.23257 5.5328,0.76409 10.272,1.5501 14.901,2.4711 8.9522,1.7813 15.844,3.5112 21.734,5.4556 1.1124,0.36719 1.3259,0.44716 1.1938,0.44716 -0.0668,0 -0.0672,0.0264 -0.001,0.0993 0.0285,0.0315 0.0461,0.0629 0.0391,0.0697 -0.007,0.007 -0.1024,-0.0214 -0.21188,-0.0627 h 2e-5 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3247" /> - <path - d="m 531.25,369.46 c -1.6714,-0.56045 -4.8554,-1.5785 -6.8594,-2.1932 -19.956,-6.1214 -42.617,-11.101 -58.597,-12.877 -2.0946,-0.23276 -3.417,-0.35457 -7.1031,-0.65425 -2.3342,-0.18978 -2.9379,-0.24759 -2.9495,-0.28244 -0.0172,-0.0517 0.42133,-0.039 2.1032,0.061 12.668,0.75274 28.718,3.4934 46.297,7.9058 9.2566,2.3234 19.288,5.2698 27.172,7.9808 0.97811,0.33634 1.1451,0.40198 1.1073,0.43522 -0.007,0.007 -0.53385,-0.16257 -1.1698,-0.37582 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3249" /> - <path - d="m 556.29,381.21 c -0.52257,-0.39993 -0.85524,-0.67099 -1.2969,-1.0567 -0.53824,-0.47006 -1.1481,-0.92744 -1.8594,-1.3944 -0.69647,-0.45726 -0.69247,-0.45436 -0.66469,-0.48283 0.0248,-0.0254 0.3112,0.13393 0.94594,0.52612 1.3789,0.85199 2.3949,1.6399 2.989,2.3178 0.36423,0.41569 0.33833,0.43613 -0.11399,0.09 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3251" /> - <path - d="m 580.41,398.41 c -3.2908,-2.8259 -6.9102,-5.6865 -9.689,-7.6578 -0.47217,-0.33496 -0.53038,-0.38375 -0.49732,-0.4168 0.009,-0.009 1.1714,0.67707 2.5822,1.5255 l 2.5651,1.5426 1.1475,1.121 c 0.63111,0.61653 1.9033,1.8388 2.8272,2.7161 0.92383,0.87733 1.6797,1.6069 1.6797,1.6212 0,0.0649 -0.0938,-0.004 -0.61533,-0.45183 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3253" /> - <path - d="m 656.07,475.1 c -4.0092,-8.6072 -6.3825,-12.741 -9.6994,-16.893 -3.4025,-4.2597 -8.2794,-8.9444 -18.003,-17.294 -0.6016,-0.51658 -1.0938,-0.9585 -1.0938,-0.98205 0,-0.0235 0.0194,-0.0428 0.0431,-0.0428 0.095,0 5.2408,4.3456 7.8455,6.6255 5.3755,4.7051 9.803,9.0492 12.484,12.248 2.031,2.4238 3.9474,5.9042 6.8919,12.517 0.75783,1.7018 1.8156,4.1453 1.8156,4.194 0,0.0199 -0.021,0.0361 -0.0468,0.0361 -0.0257,0 -0.13244,-0.18395 -0.23717,-0.40879 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3255" /> - <path - d="m 686.67,731.65 c 1.9e-4,-0.0458 0.0694,-0.75833 0.1538,-1.5833 0.25951,-2.5366 0.53083,-6.6337 0.53393,-8.0625 0.001,-0.61475 0.062,-0.87564 0.17444,-0.74948 0.0304,0.0341 0.0873,0.35729 0.12649,0.71823 0.0392,0.36094 0.14655,1.2349 0.23856,1.9421 l 0.16728,1.2858 -0.44697,2.2767 c -0.24583,1.2522 -0.52476,2.7103 -0.61983,3.2404 -0.10344,0.57664 -0.20403,0.97411 -0.25045,0.98958 -0.0427,0.0142 -0.0774,-0.0116 -0.0772,-0.0575 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3257" /> - <path - d="m 631.14,813.94 c 0,-0.0179 0.25664,-0.21915 0.57032,-0.44729 5.0269,-3.6562 10.09,-8.7801 15.682,-15.871 0.31854,-0.4039 1.098,-1.4094 1.7321,-2.2344 1.578,-2.053 2.1697,-2.7969 2.2246,-2.7969 0.0327,0 0.0145,0.0442 -0.0611,0.14844 -0.0592,0.0816 -0.39533,0.54922 -0.74688,1.0391 -5.5868,7.7846 -10.432,13.38 -14.604,16.863 -1.3793,1.1516 -2.8578,2.2 -4.3664,3.0959 -0.37774,0.22434 -0.43051,0.24924 -0.43051,0.20315 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3259" /> - <path - d="m 656.72,819.39 c 7e-5,-0.0182 0.49934,-0.56017 1.1095,-1.2043 7.8732,-8.3116 13.489,-15.343 20.164,-25.246 0.79246,-1.1757 1.0004,-1.453 1.0004,-1.3339 0,0.0295 -1.1996,1.9682 -2.2679,3.6652 -4.3335,6.8839 -9.6343,13.565 -16.058,20.241 -1.8099,1.8807 -3.8331,3.9146 -3.8923,3.9128 -0.0304,-9.2e-4 -0.0552,-0.0166 -0.0551,-0.0348 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3261" /> - <path - d="m 658.44,784.11 c 0,-0.0522 0.9069,-1.076 3.094,-3.4928 3.219,-3.557 5.0235,-5.6478 7.228,-8.3748 5.5846,-6.908 9.7665,-13.549 12.481,-19.821 0.17358,-0.40106 0.334,-0.74776 0.35648,-0.77045 0.10098,-0.1019 0.0898,0.043 -0.0243,0.31695 -1.2153,2.9153 -2.7678,5.9942 -4.4518,8.8283 -3.3515,5.6405 -7.9745,11.732 -13.859,18.261 -1.8777,2.0833 -4.7076,5.096 -4.7868,5.096 -0.0207,0 -0.0376,-0.0192 -0.0376,-0.0427 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3263" /> - <path - d="m 581.62,910.41 c 0.007,-0.0209 0.23726,-0.10361 0.51178,-0.18386 3.2268,-0.94329 7.3565,-2.4405 9.3693,-3.3967 5.0759,-2.4115 10.659,-7.5689 16.382,-15.131 2.4623,-3.2541 5.0319,-7.0405 7.4914,-11.039 l 0.14898,-0.24219 h 0.21653 c 0.11909,0 0.21653,0.006 0.21653,0.0137 0,0.0426 -1.7061,2.6215 -2.8232,4.2675 -7.6605,11.288 -13.608,17.757 -19.583,21.302 -3.0744,1.8241 -6.3022,3.0535 -11.303,4.3053 -0.62393,0.15618 -0.64503,0.15969 -0.62663,0.10449 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3265" /> - <path - d="m 615.75,880.44 c -0.10742,-0.0159 -0.19531,-0.0378 -0.19531,-0.0486 0,-0.0108 0.0442,-0.0892 0.0982,-0.1742 0.054,-0.085 0.40739,-0.66784 0.78534,-1.2952 2.3143,-3.8414 4.7402,-8.1832 7.1938,-12.875 0.67024,-1.2817 2.1968,-4.2568 2.5054,-4.8828 0.0826,-0.16758 0.16963,-0.30469 0.19337,-0.30469 0.0528,0 0.1101,-0.13271 -0.5191,1.2031 -3.5798,7.6001 -5.9472,12.201 -7.8718,15.297 -0.30563,0.4917 -1.4314,2.2516 -1.7791,2.7812 l -0.2154,0.32812 -0.19531,-0.0289 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3267" /> - <path - d="m 600.46,892.25 c 0,-0.11073 0.91767,-2.0936 1.4275,-3.0844 0.9469,-1.8404 1.7811,-3.1478 2.7317,-4.2812 0.4689,-0.55913 1.9261,-1.9688 2.0353,-1.9688 0.0212,0 -0.0682,0.10898 -0.19864,0.24219 -1.4008,1.4307 -3.6092,4.7154 -5.1527,7.6641 -0.21142,0.40391 -0.4707,0.89514 -0.57616,1.0916 -0.17927,0.33399 -0.26693,0.44452 -0.26693,0.33656 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3269" /> - <path - d="m 578.78,885.35 c 0.007,-0.0215 0.50384,-0.29661 1.1042,-0.6114 1.4847,-0.7785 2.7813,-1.4761 3.9185,-2.1081 8.8217,-4.9033 14.887,-9.483 18.488,-13.96 2.1234,-2.64 3.3956,-5.2814 3.8081,-7.9062 0.0763,-0.48557 0.11484,-0.91797 0.17268,-1.9375 0.0302,-0.53228 0.0891,-0.89382 0.25441,-1.5625 0.0638,-0.25818 0.10211,-0.3427 0.13864,-0.30618 0.0229,0.0229 -0.036,1.0542 -0.096,1.6812 -0.33289,3.4798 -1.525,6.6972 -3.5894,9.6875 -1.6219,2.3493 -3.8409,4.6124 -6.7063,6.8395 -3.2607,2.5344 -7.4986,5.1079 -13.578,8.2455 -1.3822,0.71333 -3.8784,1.9775 -3.9048,1.9775 -0.0123,0 -0.0166,-0.0176 -0.01,-0.0391 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3271" /> - <path - d="m 629.82,841.54 c 0.46167,-0.99946 1.3567,-2.7787 1.8333,-3.6445 2.5573,-4.6456 5.5524,-8.0247 13.262,-14.962 1.2849,-1.1562 3.0821,-2.7488 3.102,-2.7488 0.008,0 0.0152,0.007 0.0152,0.0148 0,0.008 -0.53261,0.51245 -1.1836,1.1208 -2.4563,2.2952 -3.8338,3.6164 -5.4939,5.2693 -5.2628,5.2399 -7.7834,8.5138 -10.846,14.087 -0.16526,0.30079 -0.35217,0.64356 -0.41535,0.76172 l -0.11489,0.21485 h -0.21138 l 0.0523,-0.11328 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3273" /> - <path - d="m 522.12,915.02 c -0.77679,-0.10575 -1.3445,-0.33351 -1.6683,-0.66927 -0.49061,-0.50877 -0.55158,-1.2408 -0.21311,-2.5588 0.22516,-0.87671 0.8679,-2.6716 0.96872,-2.7052 0.0651,-0.0217 0.0599,0.0365 -0.0379,0.42622 -0.12763,0.5087 -0.34851,1.6593 -0.39991,2.0833 -0.0624,0.5146 -0.0543,1.5143 0.0148,1.8352 0.14242,0.66118 0.47831,1.1084 0.98058,1.3056 0.38474,0.15107 1.1021,0.14566 1.7434,-0.0132 1.0816,-0.26782 2.2724,-0.77321 4.2569,-1.8067 1.2184,-0.6345 1.5537,-0.7821 1.3531,-0.59562 -0.035,0.0326 -1.1718,0.66848 -2.5262,1.4132 l -2.4626,1.354 -0.7857,-0.005 c -0.43214,-0.003 -0.98289,-0.0314 -1.2239,-0.0642 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3275" /> - <path - d="m 487.9,923.17 c 0.01,-0.03 0.6729,-0.2783 1.4731,-0.55187 10.654,-3.6423 16.524,-6.3577 21.805,-10.086 2.0035,-1.4147 3.5764,-2.7004 6.0562,-4.9504 2.1482,-1.9492 2.2539,-2.0382 2.2539,-1.8998 0,0.0663 -1.0154,1.1384 -1.8397,1.9423 -3.544,3.4565 -7.5388,6.2855 -12.59,8.9156 -4.5339,2.3609 -9.6675,4.3847 -16.554,6.5259 -0.5581,0.17353 -0.632,0.1863 -0.60474,0.10454 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3277" /> - <path - d="m 542.65,917.85 c 0.0141,-0.043 0.43133,-0.25474 0.92709,-0.47062 0.49575,-0.21587 1.5482,-0.68617 2.3389,-1.0451 l 1.4375,-0.65262 2.2188,-0.4733 c 1.2203,-0.26031 2.2563,-0.48612 2.3021,-0.5018 0.0458,-0.0157 0.0722,0.005 0.0586,0.0458 -0.0136,0.0409 -0.83863,0.33336 -1.8333,0.64994 -2.1072,0.67064 -4.4252,1.4536 -6.1625,2.0816 -0.6759,0.24431 -1.2478,0.44421 -1.2708,0.44421 -0.0231,0 -0.0304,-0.0352 -0.0162,-0.0781 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3279" /> - <path - d="m 497.58,943.42 c 0.0178,-0.0535 0.23258,-0.11457 0.58601,-0.16661 2.1614,-0.31823 5.7377,-1.0346 7.9998,-1.6024 7.6307,-1.9154 14.563,-4.6789 25.926,-10.335 2.2306,-1.1103 4.0711,-2.0032 4.09,-1.9843 0.07,0.07 -0.18291,0.22732 -1.8332,1.1406 -13.269,7.3432 -24.263,11.432 -34.312,12.762 -1.8821,0.24897 -2.4928,0.29517 -2.4564,0.18583 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3281" /> - <path - d="m 441.68,966.12 c 0.004,-0.0124 0.21129,-0.0907 0.46035,-0.17416 2.537,-0.84956 6.2883,-2.7809 11.04,-5.6837 0.4144,-0.25317 0.77124,-0.46714 0.79299,-0.47549 0.18576,-0.0713 -0.30567,0.29017 -1.8447,1.3568 -3.6686,2.5426 -5.9695,3.8378 -7.9913,4.4985 -0.62706,0.20491 -1.1696,0.32606 -1.9931,0.4451 -0.42789,0.0619 -0.47445,0.0652 -0.46369,0.0329 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3283" /> - <path - d="m 438.47,966.11 c -0.14748,-0.0734 -0.30453,-0.22692 -0.36945,-0.3612 -0.14864,-0.30749 -0.11085,-0.74469 0.12404,-1.4349 0.0945,-0.27758 0.63397,-1.589 0.66748,-1.6225 0.0442,-0.0442 0.0441,0.0113 -4.4e-4,0.18557 -0.1212,0.47471 -0.30962,1.4641 -0.36413,1.912 -0.0648,0.53254 -0.0505,1.0769 0.0332,1.2661 0.0242,0.0548 0.0408,0.103 0.0367,0.10707 -0.004,0.004 -0.0614,-0.0194 -0.12732,-0.0522 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3285" /> - <path - d="m 469.6,944.02 v -0.11992 l 0.0107,-0.005 c 0.0704,-0.0321 0.67508,-0.2935 1.0108,-0.43695 3.3892,-1.4485 6.6071,-2.6614 9.6907,-3.6528 l 0.0618,-0.0199 h 0.21431 v 0.0534 l -0.23926,0.0831 c -2.5925,0.90065 -6.297,2.3483 -10.154,3.9681 l -0.59473,0.24975 v -0.11992 z m 10.99,-0.004 c 0,-0.0677 5.3e-4,-0.0954 0.001,-0.0615 6.5e-4,0.0338 6.5e-4,0.0892 0,0.12304 -6.5e-4,0.0338 -0.001,0.006 -0.001,-0.0615 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3287" /> - <path - d="m 463.01,947.01 v -0.0467 l 0.10059,-0.0497 c 0.79834,-0.39415 2.1828,-1.0566 3.1572,-1.5106 1.0746,-0.50074 2.5777,-1.1799 3.3057,-1.4936 l 0.0303,-0.013 v 0.24019 l -0.52246,0.2223 c -1.8726,0.79677 -3.7748,1.6363 -5.2998,2.339 -0.23107,0.10648 -0.76181,0.35306 -0.76855,0.35707 -0.002,9.6e-4 -0.003,-0.0193 -0.003,-0.0449 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3289" /> - <path - d="m 480.59,939.81 v -0.0254 h -0.096 c -0.0751,0 -0.0957,-10e-4 -0.0944,-0.005 0.002,-0.005 0.0832,-0.0319 0.47559,-0.15513 1.989,-0.62461 3.9089,-1.1522 5.7871,-1.5902 0.1375,-0.0321 0.25405,-0.0593 0.259,-0.0604 0.009,-0.002 0.009,-0.001 0.008,0.0182 l -10e-4,0.0204 -0.28711,0.0654 c -1.816,0.4134 -3.6637,0.94737 -5.8569,1.6926 -0.105,0.0357 -0.19157,0.0649 -0.19238,0.0649 -8.1e-4,0 -0.001,-0.0114 -0.001,-0.0254 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3291" /> - <path - d="m 486.91,937.99 c 0,-0.0122 0.003,-0.0221 0.006,-0.0221 0.003,0 0.14933,-0.0323 0.32418,-0.0717 5.2856,-1.1921 10.283,-1.6495 14.906,-1.3642 0.60934,0.0376 0.86696,0.059 0.8548,0.071 -0.007,0.006 -0.54553,0.0374 -1.1697,0.067 -0.71211,0.0338 -1.7721,0.0733 -2.9555,0.11012 -1.9737,0.0614 -2.8338,0.0977 -3.9388,0.16624 -2.9422,0.18246 -5.3796,0.49852 -7.7132,1.0002 -0.16783,0.0361 -0.30722,0.0656 -0.30975,0.0656 -0.003,0 -0.005,-0.01 -0.005,-0.0221 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3293" /> - <path - d="m 495.96,943.61 c 0.002,-0.006 0.0605,-0.0174 0.16276,-0.0313 0.34791,-0.0475 0.95581,-0.13381 1.2288,-0.17457 0.15841,-0.0236 0.29154,-0.0418 0.29584,-0.0404 0.004,10e-4 -0.007,0.0123 -0.0249,0.0242 -0.0242,0.016 -0.032,0.026 -0.0302,0.0385 0.005,0.0312 0.0541,0.0392 0.24058,0.0387 0.0923,-2.6e-4 0.16262,0.002 0.15625,0.006 -0.006,0.003 -0.0608,0.0102 -0.12096,0.0154 -0.5218,0.0447 -0.69072,0.0583 -0.97656,0.0787 -0.39703,0.0283 -0.82708,0.0548 -0.88932,0.0549 -0.0325,2e-5 -0.0447,-0.003 -0.0424,-0.01 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3295" /> - <path - d="m 512.63,932.46 c 0.0383,-0.0329 0.61094,-0.45495 0.88112,-0.64942 3.3207,-2.3902 7.1879,-4.5731 12.17,-6.8694 l 0.36992,-0.1705 h 0.29044 v 0.0478 l -0.21959,0.10687 c -4.3281,2.1063 -8.2364,4.2817 -11.235,6.2533 -0.62039,0.40791 -1.4161,0.95342 -1.8318,1.2558 l -0.0585,0.0426 -0.19285,-2.2e-4 -0.19285,-2.3e-4 0.0193,-0.0166 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3297" /> - <path - d="m 509.87,934.73 c 0,-0.003 0.0503,-0.0501 0.11187,-0.10438 0.71326,-0.62985 1.5785,-1.3393 2.3879,-1.9579 l 0.24859,-0.19 0.18944,0.002 c 0.11314,9.1e-4 0.18819,0.004 0.18631,0.007 -0.002,0.003 -0.0658,0.0505 -0.14248,0.106 -0.17003,0.12316 -0.45989,0.33853 -0.98457,0.73157 -0.84643,0.63407 -1.4048,1.0322 -1.8727,1.3353 -0.1175,0.0761 -0.1243,0.08 -0.1243,0.0713 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3299" /> - <path - d="m 526.34,924.8 v -0.0232 h -0.13704 c -0.10165,0 -0.13666,-10e-4 -0.13555,-0.005 8.3e-4,-0.002 0.14643,-0.0702 0.32357,-0.15057 1.5628,-0.70882 3.3044,-1.4631 5.2847,-2.2887 0.25442,-0.10607 0.46348,-0.19196 0.46458,-0.19087 10e-4,10e-4 3.5e-4,0.004 -0.002,0.006 -0.002,0.002 -0.0915,0.0422 -0.19896,0.0893 -1.7388,0.76274 -3.7651,1.6979 -5.5186,2.5469 l -0.0811,0.0393 v -0.0232 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3301" /> - <path - d="m 539.99,918.91 c 8.3e-4,-0.003 0.15698,-0.0694 0.347,-0.14865 0.83851,-0.34974 1.9407,-0.8171 2.5813,-1.0945 0.0674,-0.0292 0.12318,-0.053 0.12402,-0.053 8.3e-4,0 0.002,0.002 0.002,0.004 0,0.002 -0.0497,0.029 -0.11035,0.0599 -0.15923,0.0813 -0.25286,0.1359 -0.27637,0.16103 -0.009,0.009 -0.01,0.0142 -0.0106,0.0443 l -8.1e-4,0.0338 -0.29216,0.10788 c -0.6104,0.22541 -1.5601,0.58328 -2.1335,0.80399 -0.1233,0.0475 -0.22584,0.0863 -0.22786,0.0863 -0.002,0 -0.003,-0.002 -0.002,-0.005 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3303" /> - <path - d="m 535.8,929.66 c 9.8e-4,-0.003 0.0328,-0.0241 0.0707,-0.0472 0.21975,-0.13348 0.32309,-0.2152 0.32309,-0.2555 0,-0.0226 -0.007,-0.0236 -0.0476,-0.007 -0.0413,0.0165 -0.28821,0.12926 -0.38758,0.17701 -0.062,0.0298 -0.0728,0.0338 -0.0672,0.0246 10e-4,-0.002 0.13196,-0.0701 0.29043,-0.15126 0.4294,-0.21985 1.3356,-0.68713 2.0102,-1.0366 0.32842,-0.17012 0.59814,-0.3083 0.59938,-0.30706 10e-4,10e-4 -2.8e-4,0.005 -0.003,0.008 -0.0146,0.0136 -1.6202,0.9392 -2.3025,1.3273 -0.5219,0.29688 -0.48896,0.27865 -0.48563,0.26864 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3305" /> - <path - d="m 528.97,912.42 c 8.7e-4,-0.003 0.0226,-0.0172 0.0483,-0.0322 0.0824,-0.0483 0.10634,-0.0644 0.12938,-0.0875 0.0267,-0.0267 0.0364,-0.0424 0.029,-0.0469 -0.0105,-0.006 -0.0716,0.01 -0.1251,0.0334 -0.0229,0.0101 -0.0278,0.0111 -0.0278,0.006 0,-0.002 0.0242,-0.0163 0.0537,-0.0319 1.1961,-0.62961 3.6855,-1.9638 5.8779,-3.1503 0.38242,-0.20695 0.69863,-0.37754 0.70268,-0.37908 0.005,-0.002 0.007,-0.001 0.006,0.003 -0.002,0.005 -6.684,3.6905 -6.692,3.6909 -0.002,9e-5 -0.003,-0.002 -0.002,-0.005 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3307" /> - <path - d="m 335.36,887.58 c 0,-0.29232 -0.0328,-0.96263 -0.0729,-1.4896 -0.0401,-0.52695 -0.0752,-1.0381 -0.0781,-1.136 -0.005,-0.1729 0.0185,-0.18631 0.83851,-0.47712 0.97472,-0.34567 1.1456,-0.41689 1.8991,-0.79148 0.30546,-0.15184 0.56702,-0.26444 0.58125,-0.25022 0.0142,0.0142 -0.2785,0.3315 -0.65051,0.70504 -1.1637,1.1685 -1.7566,2.0612 -2.1517,3.2399 -0.12644,0.37713 -0.26043,0.69588 -0.29778,0.70833 -0.0453,0.0151 -0.0679,-0.15415 -0.0679,-0.50885 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3309" /> - <path - d="m 326.62,923.91 c -0.007,-0.0215 -0.0786,-0.28516 -0.15835,-0.58594 -0.21183,-0.79933 -0.59484,-2.152 -0.71896,-2.5391 -0.33577,-1.0473 -0.58421,-2.5914 -0.67247,-4.1796 -0.0403,-0.72452 -0.023,-2.3114 0.0328,-3.0156 0.3314,-4.1834 1.5594,-7.714 3.6493,-10.492 0.25243,-0.33557 0.8589,-1.0579 0.98821,-1.1771 0.16523,-0.15221 0.11023,-0.0327 -0.14737,0.32018 -0.85702,1.1741 -1.7232,2.6046 -2.264,3.739 -1.1038,2.3152 -1.6616,4.4958 -1.8213,7.1192 -0.0473,0.77754 -0.0204,2.8779 0.0469,3.663 0.17187,2.0035 0.47889,3.9968 0.97279,6.3155 0.0937,0.43995 0.17038,0.81613 0.17038,0.83594 0,0.0484 -0.061,0.046 -0.0779,-0.003 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3311" /> - <path - d="m 358.62,964.81 c -6.5944,-1.7498 -10.426,-3.0335 -12.64,-4.2346 -1.674,-0.9084 -2.667,-1.801 -3.8157,-3.4304 -0.29935,-0.42457 -0.42457,-0.61737 -0.41025,-0.63169 0.007,-0.007 0.37878,0.35454 0.82653,0.80307 0.79342,0.79479 1.1994,1.1682 1.7864,1.6432 1.6088,1.3018 3.3963,2.2806 5.8557,3.2063 1.705,0.64173 4.7526,1.5808 8.2846,2.5527 0.25423,0.0699 0.46636,0.13962 0.4714,0.15481 0.012,0.036 0.0241,0.0382 -0.35912,-0.0635 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3313" /> - <path - d="m 335.06,948.1 c -0.76511,-0.82453 -1.3999,-1.7969 -2.0948,-3.209 -1.2618,-2.5637 -2.4364,-6.0313 -3.8999,-11.513 -0.43095,-1.614 -0.84865,-3.258 -0.83201,-3.2746 0.0313,-0.0313 0.0576,0.0406 0.17928,0.49041 0.208,0.76907 0.70387,2.5445 1.0091,3.6129 1.574,5.51 2.7268,8.6616 4.0839,11.165 0.43237,0.79751 1.1528,1.9703 1.6606,2.7034 0.12024,0.17358 0.21862,0.32113 0.21862,0.32789 0,0.0379 -0.0611,-0.0191 -0.32473,-0.30325 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3315" /> - <path - d="m 368.68,967.21 -0.625,-0.0142 -1.4219,-0.35219 c -2.5229,-0.62491 -5.2759,-1.3232 -7.0717,-1.7936 -0.31876,-0.0835 -0.58184,-0.15182 -0.58464,-0.15182 -0.003,0 -0.003,-0.004 -0.002,-0.01 0.002,-0.005 -0.002,-0.0159 -0.008,-0.0235 -0.007,-0.008 -0.0104,-0.0153 -0.008,-0.0172 0.002,-0.002 0.093,0.021 0.20243,0.051 0.33453,0.0916 1.2337,0.32941 1.727,0.45673 3.1163,0.80436 6.0018,1.4315 8.304,1.8049 0.17832,0.0289 0.32756,0.0556 0.33164,0.0593 0.01,0.009 -0.0863,0.008 -0.84336,-0.01 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3317" /> - <path - d="m 375.9,967.37 c -0.20303,-0.004 -0.36914,-0.0102 -0.36914,-0.0135 0,-0.003 0.0237,-0.0191 0.0527,-0.0351 0.087,-0.0478 0.13549,-0.0827 0.19911,-0.14331 0.0715,-0.0681 0.11529,-0.13424 0.14418,-0.21761 0.0187,-0.054 0.021,-0.0717 0.0205,-0.15843 -8.7e-4,-0.14476 -0.0365,-0.34881 -0.12402,-0.7102 -0.0328,-0.13552 -0.0364,-0.16209 -0.0195,-0.14474 0.006,0.006 0.50825,1.4204 0.50825,1.4304 0,10e-4 -0.01,0.002 -0.0215,10e-4 -0.0118,-7.7e-4 -0.1876,-0.005 -0.39063,-0.009 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3319" /> - <path - d="m 628.13,845.18 c 0.002,-0.007 0.4999,-1.0877 0.85541,-1.857 0.2049,-0.44338 0.51756,-1.1147 0.66189,-1.4212 l 0.11648,-0.24734 0.10136,4e-4 c 0.0557,2.2e-4 0.10202,10e-4 0.10283,0.002 8.1e-4,8.1e-4 -0.0195,0.0408 -0.0452,0.0888 -0.46374,0.86697 -1.1227,2.1354 -1.689,3.251 -0.0522,0.10295 -0.0975,0.188 -0.10048,0.189 -0.004,10e-4 -0.005,-3.9e-4 -0.003,-0.006 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3321" /> - <path - d="m 654.21,821.95 c 0,-0.002 0.0857,-0.0904 0.1905,-0.19629 0.58859,-0.59496 1.6211,-1.653 2.1903,-2.2443 0.075,-0.0779 0.13773,-0.1416 0.13949,-0.1416 0.005,0 0.004,0.004 -0.005,0.0144 -0.006,0.008 -0.007,0.0116 -0.004,0.0172 0.006,0.0109 0.0209,0.0195 0.0379,0.0218 0.0128,0.002 0.0177,-7e-5 0.0343,-0.0126 0.0375,-0.0283 0.16099,-0.14192 0.26187,-0.24083 0.0494,-0.0484 0.0641,-0.0602 0.0641,-0.051 0,0.006 -0.55873,0.55825 -1.1992,1.1846 -0.69012,0.67481 -1.6999,1.6524 -1.7069,1.6524 -0.002,0 -0.004,-0.002 -0.004,-0.004 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3323" /> - <path - d="m 701.5,646.04 c -0.0369,-0.058 -0.11745,-0.18633 -0.17891,-0.28516 -0.1655,-0.26614 -0.60427,-0.93703 -0.86835,-1.3277 l -0.23181,-0.34297 -0.11673,-0.50449 c -0.71699,-3.0987 -1.1559,-5.6626 -1.3167,-7.692 -0.0613,-0.77388 -0.0714,-1.0493 -0.0704,-1.9297 0.001,-0.91717 0.0214,-1.3251 0.10094,-2.0234 0.035,-0.3074 0.10465,-0.81198 0.11802,-0.85547 0.007,-0.0215 0.0259,-0.0273 0.0901,-0.0273 h 0.0817 l -0.0433,0.32422 c -0.27181,2.0372 -0.29368,3.959 -0.0675,5.9275 0.3048,2.6524 1.1358,5.52 2.4668,8.512 0.0741,0.16653 0.13469,0.30891 0.13469,0.3164 0,0.0384 -0.0385,0.003 -0.0986,-0.0919 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3325" /> - <path - d="m 698.94,631.04 c 0,-0.10375 0.18159,-0.98827 0.31179,-1.5187 0.13884,-0.56567 0.42357,-1.5795 0.49915,-1.7773 0.0144,-0.0378 0.0484,-0.0607 0.0484,-0.0326 0,0.006 -0.0453,0.19028 -0.10074,0.41015 -0.2317,0.91946 -0.44141,1.9366 -0.55601,2.6966 l -0.0353,0.23437 -0.0836,0.003 c -0.0583,0.002 -0.0837,-0.002 -0.0837,-0.016 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3327" /> - <path - d="m 683.4,632.86 c 0,-0.0141 0.2906,-0.25505 1.0938,-0.90671 1.9153,-1.554 3.2807,-2.9651 4.3733,-4.5196 0.11652,-0.16579 0.15799,-0.21031 0.15799,-0.16962 0,0.0233 -0.52712,0.80516 -0.71739,1.0642 -1.1128,1.5146 -2.3498,2.7502 -3.8513,3.8466 -0.25146,0.18363 -1.0202,0.70029 -1.0419,0.70029 -0.008,0 -0.0144,-0.007 -0.0144,-0.0151 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3329" /> - <path - d="m 701.27,623.12 c 0,-0.0123 0.0145,-0.0638 0.0321,-0.11458 0.0527,-0.15145 0.3465,-1.0951 0.46892,-1.5064 0.0994,-0.33382 0.1211,-0.39113 0.16974,-0.4478 0.35787,-0.41704 0.45421,-0.51922 0.45421,-0.48175 0,0.004 -0.0535,0.12215 -0.11879,0.26172 -0.18232,0.38949 -0.47232,1.0677 -0.73277,1.7136 -0.20837,0.51679 -0.27344,0.65364 -0.27344,0.57512 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3331" /> - <path - d="m 691.58,621.28 c 0,-0.01 0.0172,-0.0861 0.0382,-0.16927 0.48921,-1.9372 0.86253,-4.6255 1.0398,-7.4872 0.0657,-1.061 0.13308,-2.7136 0.15048,-3.6914 l 0.0108,-0.60547 h 0.332 l -0.004,0.21484 c -0.07,3.44 -0.34253,6.2801 -0.85569,8.918 -0.21608,1.1107 -0.63169,2.8121 -0.69185,2.8321 -0.0106,0.004 -0.0193,-0.002 -0.0193,-0.0116 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3333" /> - <path - d="m 692.99,609.33 -0.16406,-0.004 0.0125,-0.90186 c 0.0376,-2.7174 -0.0397,-6.9415 -0.20803,-11.361 -0.0257,-0.67379 -0.0466,-1.2697 -0.0466,-1.3242 v -0.0991 h 0.1496 l 0.0273,0.48828 c 0.29114,5.2023 0.37292,7.6243 0.39638,11.738 0.004,0.75625 0.005,1.3961 0.002,1.4219 l -0.005,0.0469 -0.16406,-0.004 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3335" /> - <path - d="m 692.52,594.45 c -0.0582,-1.3555 -0.17883,-3.8977 -0.26023,-5.4838 -0.0631,-1.2296 -0.0619,-1.189 -0.0356,-1.1803 0.0226,0.008 0.0429,0.3082 0.27694,4.1055 0.186,3.0183 0.21915,3.5741 0.21915,3.6744 v 0.0756 h -0.1492 l -0.0512,-1.1914 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3337" /> - <path - d="m 705.43,614.87 c 0,-0.008 0.16013,-0.52545 0.17976,-0.58101 0.006,-0.016 0.0131,-0.0161 0.0387,-1.3e-4 0.0261,0.0163 0.0446,0.0151 0.10526,-0.007 0.0405,-0.0146 0.0755,-0.0246 0.0778,-0.0223 0.002,0.002 -0.0537,0.0916 -0.12444,0.19857 -0.0707,0.10693 -0.15533,0.24536 -0.18803,0.30761 -0.0327,0.0623 -0.0661,0.11319 -0.0742,0.11319 -0.008,0 -0.0148,-0.004 -0.0148,-0.009 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3339" /> - <path - d="m 707.16,614.46 c -0.006,-0.006 -0.0105,-0.0391 -0.0107,-0.0742 -2.5e-4,-0.0578 -0.032,-0.23535 -0.0551,-0.30818 -0.007,-0.0233 -10e-4,-0.0291 0.0314,-0.0291 0.0224,0 0.0582,-0.0115 0.0797,-0.0255 0.0214,-0.0141 0.0424,-0.0222 0.0466,-0.018 0.004,0.004 -0.007,0.10393 -0.0239,0.22172 -0.0173,0.1178 -0.0315,0.22082 -0.0315,0.22895 0,0.0171 -0.0212,0.0196 -0.0364,0.004 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3341" /> - <path - d="m 708.89,595.13 c -0.004,-0.006 -0.0114,-0.0891 -0.0172,-0.18359 -0.0389,-0.63721 -0.184,-1.8631 -0.36421,-3.0763 -0.007,-0.0477 -0.004,-0.0591 0.0129,-0.0534 0.0345,0.0115 0.1577,0.72004 0.23982,1.3797 0.10284,0.82622 0.19057,1.9453 0.15249,1.9453 -0.009,0 -0.0201,-0.005 -0.0238,-0.0117 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3343" /> - <path - d="m 708.34,605.78 c 0,-10e-4 0.009,-0.0773 0.0194,-0.16894 0.1102,-0.9443 0.23762,-2.1187 0.30462,-2.8077 0.061,-0.62725 0.13165,-1.4533 0.16915,-1.9777 0.006,-0.088 0.0102,-0.12319 0.0136,-0.12435 0.007,-0.002 0.006,0.006 -0.005,0.17979 -0.0775,1.1738 -0.20424,2.5768 -0.36542,4.0438 -0.032,0.29088 -0.0917,0.8163 -0.0958,0.84277 -0.002,0.0146 -0.002,0.0146 -0.0215,0.0146 -0.0106,0 -0.0192,-0.001 -0.0192,-0.002 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3345" /> - <path - d="m 707.93,609.21 c 0,-0.004 0.0264,-0.21983 0.0587,-0.47949 0.1061,-0.85361 0.24962,-2.0438 0.32401,-2.687 0.0347,-0.30017 0.0296,-0.26891 0.0438,-0.26606 0.006,10e-4 0.015,5.2e-4 0.0191,-0.002 0.006,-0.003 0.007,-0.003 0.007,0.002 0,0.005 -0.0209,0.18258 -0.0681,0.57639 -0.0859,0.71723 -0.2587,2.056 -0.35391,2.7422 -0.009,0.0612 -0.0155,0.11352 -0.0155,0.11621 -10e-6,0.003 -0.004,0.005 -0.008,0.005 -0.005,0 -0.008,-0.003 -0.008,-0.007 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3347" /> - <path - d="m 708.97,596.73 c -10e-4,-10e-4 -0.003,-0.0247 -0.003,-0.0518 -1.5e-4,-0.22383 -0.0331,-0.97013 -0.0605,-1.3714 -0.0124,-0.18091 -0.0123,-0.17519 -5.7e-4,-0.17294 0.0109,0.002 0.0141,-0.006 0.0142,-0.0354 4e-5,-0.0133 10e-4,-0.0184 0.005,-0.0173 0.005,0.002 0.006,0.008 0.0183,0.27638 0.0232,0.49969 0.0436,1.375 0.0321,1.375 -0.002,0 -0.004,-10e-4 -0.006,-0.003 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3349" /> - <path - d="m 693.62,542.09 c -0.0951,-0.15323 -0.1762,-0.22656 -0.2504,-0.22656 -0.0604,0 -0.0727,0.0163 -0.0727,0.0964 0,0.20308 -0.0765,0.0611 -0.14552,-0.2702 -0.0392,-0.18798 -0.0787,-0.37246 -0.0879,-0.40996 -0.02,-0.0815 -0.38281,-0.27366 -0.57971,-0.30693 -0.11806,-0.0199 -0.12784,-0.0286 -0.1104,-0.0981 0.0433,-0.17251 0.021,-0.69075 -0.0432,-1.0037 -0.15286,-0.74494 -0.57914,-1.9191 -1.1763,-3.24 -0.17845,-0.39472 -0.1879,-0.42362 -0.13852,-0.42362 0.017,0 0.0786,0.0949 0.13701,0.21093 0.34059,0.67675 2.5821,5.6529 2.5821,5.7322 0,0.0549 -0.0637,0.0214 -0.11442,-0.0603 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3351" /> - <path - d="m 693.83,544.76 c -0.14289,-0.6008 -0.63441,-2.8405 -0.62535,-2.8496 0.004,-0.004 0.009,0.004 0.016,0.0264 0.0214,0.0676 0.0474,0.1156 0.0605,0.11216 0.006,-0.002 0.007,0.002 0.009,0.028 0.0237,0.27123 0.1587,0.91524 0.50213,2.3947 0.0366,0.15774 0.0666,0.28913 0.0666,0.29199 0,0.003 -0.005,0.005 -0.0136,0.005 -0.0109,0 -0.014,-0.002 -0.0157,-0.009 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3353" /> - <path - d="m 694.4,543.69 c -0.002,-0.004 -0.0362,-0.0818 -0.0761,-0.17334 -0.24179,-0.55594 -0.46001,-1.0194 -0.61096,-1.2976 -0.0161,-0.0296 -0.0285,-0.0547 -0.0275,-0.0557 9.8e-4,-9.8e-4 0.007,10e-4 0.0145,0.005 0.01,0.005 0.0148,0.005 0.0221,0.002 0.0133,-0.006 0.0123,-0.0206 -0.005,-0.0655 -0.0128,-0.0342 -0.0148,-0.0476 -0.006,-0.0383 0.004,0.004 0.0112,0.0205 0.21795,0.49974 0.17138,0.39736 0.47724,1.1129 0.48044,1.124 10e-4,0.004 7e-5,0.007 -0.002,0.007 -0.002,0 -0.006,-0.003 -0.008,-0.007 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3355" /> - <path - d="m 678.15,513.3 c -10e-4,-0.003 -0.14929,-0.2285 -0.32913,-0.50097 -0.96944,-1.4688 -2.0523,-3.0642 -3.0808,-4.5393 -0.15165,-0.2175 -0.27684,-0.39723 -0.27819,-0.39941 -0.002,-0.003 0.0293,-0.004 0.093,-0.004 h 0.0954 l 0.11904,0.17089 c 1.0583,1.5192 2.2767,3.3286 3.2954,4.8936 0.10209,0.15684 0.20021,0.30757 0.21805,0.33496 l 0.0324,0.0498 h -0.0815 c -0.067,0 -0.0819,-10e-4 -0.0837,-0.006 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3357" /> - <path - d="m 683.09,521.26 c -0.0216,-0.0412 -0.65889,-1.115 -0.89144,-1.502 -1.2204,-2.0309 -2.5248,-4.1127 -3.7962,-6.0586 -0.12213,-0.18691 -0.22962,-0.35215 -0.23888,-0.36718 l -0.0168,-0.0274 h 0.1612 l 0.23693,0.36719 c 1.5437,2.3924 3.2996,5.2535 4.5812,7.4648 0.0336,0.058 0.0662,0.11338 0.0725,0.12305 l 0.0113,0.0176 h -0.0553 c -0.0494,0 -0.0563,-0.002 -0.0645,-0.0176 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3359" /> - <path - d="m 687.25,528.73 c -1.2062,-2.2905 -2.5752,-4.7555 -3.9213,-7.0605 -0.13229,-0.22654 -0.23084,-0.40324 -0.22555,-0.40438 0.005,-10e-4 0.0301,6.4e-4 0.0554,0.004 l 0.046,0.006 0.0819,0.14063 c 0.94821,1.6272 2.1375,3.7551 3.1329,5.6054 0.36768,0.68348 1.0253,1.9239 1.0253,1.934 0,0.002 -0.0167,0.004 -0.0371,0.004 h -0.0371 l -0.12034,-0.22852 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3361" /> - <path - d="m 691.05,536.25 c -0.0281,-0.0374 -0.0346,-0.0415 -0.0512,-0.0326 -0.007,0.004 -0.0152,0.005 -0.0172,10e-4 -0.002,-0.003 -0.0774,-0.16584 -0.16751,-0.36135 -0.72627,-1.5749 -2.1862,-4.5015 -3.3197,-6.655 -0.0664,-0.12609 -0.11954,-0.22995 -0.11815,-0.23081 10e-4,-8.5e-4 0.0167,-0.005 0.0341,-0.009 l 0.0316,-0.008 0.0729,0.13715 c 0.39672,0.7468 1.493,2.9056 2.0909,4.1176 0.4557,0.92364 1.4176,2.916 1.4777,3.0605 0.009,0.0207 -0.0124,0.008 -0.0334,-0.0195 z" - inkscape:connector-curvature="0" - style="fill:#a05a2c" - id="path3363" /> - <path - d="m 137.05,741.72 c -0.2313,-0.012 -0.42267,-0.0239 -0.42526,-0.0265 -0.003,-0.003 -0.001,-0.008 0.003,-0.0111 0.004,-0.004 0.20768,-0.0176 0.45261,-0.0314 0.24492,-0.0137 0.45417,-0.0264 0.46499,-0.0281 0.0184,-0.003 0.0195,-10e-4 0.017,0.0257 -0.001,0.0158 7.3e-4,0.0437 0.005,0.0619 l 0.008,0.0332 -0.0519,-10e-4 c -0.0286,-5.7e-4 -0.24115,-0.0108 -0.47245,-0.0228 z" - inkscape:connector-curvature="0" - style="fill:#ff9955" - id="path3365" /> - <path - d="m 217.24,727 c -2.1506,-2.5833 -6.2584,-9.0986 -15.549,-24.662 -10.628,-17.805 -11.037,-23.174 -1.3991,-18.405 10.893,5.3894 20.017,23.598 20.077,40.067 0.0185,5.0571 -0.77988,5.8224 -3.1296,3 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3367" /> - <path - d="m 212.98,721 c -1.6421,-2.5026 -5.4296,-8.7258 -9.6091,-15.788 -4.1643,-7.0369 -5.4918,-9.2367 -6.3205,-10.474 -2.2545,-3.3661 -3.6661,-6.3809 -4.0419,-8.6323 -0.0892,-0.53423 -0.0904,-1.4836 -0.002,-1.8976 0.21389,-1.007 0.86479,-1.6873 1.8222,-1.9048 0.4135,-0.0939 1.2816,-0.0945 1.8286,-0.001 3.6441,0.62141 8.6474,4.2869 12.752,9.3423 3.272,4.0298 5.8989,8.7186 7.7499,13.833 1.4611,4.0368 2.4103,8.2918 2.8491,12.772 0.0859,0.87705 0.24528,2.6928 0.24528,2.7946 0,0.074 -0.18841,0.078 -3.5967,0.078 h -3.5967 l -0.0797,-0.12153 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3369" /> - <path - d="m 219.38,729.31 c -1.2185,-0.52876 -4.4136,-4.9914 -9.4908,-13.256 -1.6073,-2.6163 -3.5171,-5.7943 -6.1482,-10.231 -4.5774,-7.7188 -5.818,-9.7782 -6.5441,-10.863 -1.3034,-1.9477 -2.4398,-3.952 -3.0942,-5.4573 -0.12459,-0.28659 -0.22653,-0.53027 -0.22653,-0.54152 0,-0.0112 2.9672,-0.0154 6.5939,-0.009 l 6.5939,0.0112 0.59143,0.64082 c 5.8239,6.3103 9.9663,14.725 11.65,23.666 0.65726,3.4908 1.0411,7.4703 1.0428,10.81 7.5e-4,1.5242 -0.0409,2.3386 -0.15355,3.0045 -0.0353,0.20877 -0.085,0.66618 -0.11031,1.0165 -0.0662,0.91499 -0.0808,0.99604 -0.20605,1.1449 -0.12622,0.15001 -0.25984,0.16713 -0.49792,0.0638 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3371" /> - <path - d="m 384.36,686.5 c -3.5155,-0.73861 -8.2225,-5.3054 -13.207,-12.813 -4.7714,-7.1873 -9.0898,-16.129 -10.042,-20.794 l -0.11739,-0.57483 0.23903,-0.37534 c 1.4385,-2.2588 2.9451,-3.5517 4.6171,-3.9624 0.39256,-0.0964 1.4148,-0.10724 1.8562,-0.0197 3.5528,0.70513 7.4546,5.6423 11.058,13.992 3.2925,7.6299 5.8594,17.414 6.2437,23.799 0.0241,0.40106 0.0441,0.75406 0.0443,0.78445 5.5e-4,0.0764 -0.20781,0.0656 -0.69142,-0.036 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3373" /> - <path - d="m 444.66,537.54 c -0.65954,-0.30599 -0.90625,-0.96644 -0.90625,-2.4261 0,-0.95737 -0.22918,-3.0349 -0.53667,-4.8648 -1.3188,-7.8483 -4.701,-13.033 -10.34,-15.849 -1.4654,-0.73196 -2.3526,-1.0402 -5.4668,-1.8995 -8.215,-2.2668 -13.896,-4.323 -15.138,-5.4788 -0.22421,-0.20873 -0.27409,-0.29344 -0.25762,-0.4375 0.019,-0.16647 0.0972,-0.21363 1.1454,-0.69091 4.4683,-2.0346 7.5377,-2.8263 10.022,-2.5853 1.1945,0.11586 2.0683,0.31091 4.1692,0.93073 0.76094,0.22448 0.86315,0.27391 1.5,0.72534 1.5683,1.1117 2.5999,1.6986 5.7772,3.2868 3.6403,1.8197 4.2591,2.2145 5.7727,3.6833 2.7717,2.6896 4.9775,6.7897 7.8358,14.565 0.36015,0.97969 0.73336,2.0093 0.82935,2.288 0.51206,1.4868 0.50082,3.2252 -0.0311,4.8164 -0.40491,1.2112 -0.90863,2.0322 -1.7775,2.8971 -0.76907,0.76555 -1.313,1.0703 -1.9704,1.1038 -0.28821,0.0147 -0.5049,-0.008 -0.62767,-0.0645 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3375" /> - <path - d="m 257.22,508.39 c -1.8729,-0.27598 -3.3726,-0.65404 -6.3438,-1.5993 -9.193,-2.9246 -17.256,-7.6365 -18.522,-10.824 -0.14038,-0.35339 -0.14419,-0.93102 -0.008,-1.218 0.1549,-0.32643 0.58531,-0.69047 0.99964,-0.84549 0.45801,-0.17137 1.3399,-0.18826 2.0479,-0.0392 1.2079,0.25424 2.1759,0.61789 5.5453,2.0832 4.068,1.7692 5.345,2.2505 7.2583,2.7358 1.666,0.42254 2.0302,0.46325 4.7106,0.52651 1.3407,0.0316 3.5485,0.10326 4.9062,0.15916 8.5201,0.35074 12.726,0.15153 17.949,-0.85028 2.363,-0.45315 5.4528,-1.2898 7.5543,-2.0455 1.2232,-0.43987 1.4336,-0.49484 1.4336,-0.37453 0,0.25038 -1.3272,1.2898 -3.375,2.6433 -2.3602,1.5599 -4.6984,2.9173 -7.0625,4.1 -2.3161,1.1587 -3.5224,1.6619 -5.375,2.2425 -2.6607,0.83382 -3.493,1.1422 -5.4062,2.0033 -1.9403,0.87323 -2.5443,1.0919 -3.5225,1.2752 -0.57391,0.10758 -2.1419,0.12309 -2.79,0.0276 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3377" /> - <path - d="m 346.76,366.57 c -1.333,-0.42687 -2.8646,-1.582 -4.4467,-3.3538 l -0.87004,-0.97433 -0.0741,-0.89602 c -0.0407,-0.49281 -0.13791,-1.9664 -0.21593,-3.2746 l -0.14185,-2.3786 0.71702,-1.8714 c 2.3881,-6.2327 4.813,-9.4481 8.5638,-11.355 1.7638,-0.89696 3.7938,-1.5417 8.311,-2.6396 2.0625,-0.50131 6.2812,-1.5588 9.375,-2.3499 7.728,-1.9762 9.4669,-2.3414 11.117,-2.3349 1.1539,0.005 1.4458,0.14871 1.4458,0.71408 0,0.86591 -1.4471,3.1432 -3.6703,5.776 -1.3204,1.5636 -5.9211,6.1538 -7.6422,7.6246 -3.1506,2.6924 -5.7629,4.5173 -8.2156,5.7392 -2.2947,1.1432 -3.6309,2.4387 -6.7222,6.5175 -2.2127,2.9195 -3.4588,4.2157 -4.5866,4.7709 -0.94252,0.464 -2.0522,0.57194 -2.9439,0.28638 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3379" /> - <path - d="m 630.51,573.35 c -0.26287,-0.18552 -0.40706,-0.64349 -0.48245,-0.91334 -0.16068,-0.27559 -0.40648,-2.7302 -0.28847,-5.6558 0.002,-3.9058 0.23248,-5.635 0.47085,-7.386 0.79183,-5.816 1.6137,-9.4978 2.9456,-12.22 4.1631,-8.5081 17.439,-23.282 20.051,-22.28 0.43326,0.16626 0.82268,0.43091 1.3966,2.0804 0.76973,2.2122 0.54661,9.443 0.32506,13.001 -0.33477,5.3768 -1.209,10.072 -2.245,12.362 -1.479,3.2692 -5.8413,8.6883 -11.832,13.857 -7.4189,6.4003 -9.3731,8.1218 -10.341,7.1543 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3381" /> - <path - d="m 552.67,668.43 c -1.775,-0.69444 -4.1238,-2.8571 -7.835,-7.2142 -2.2981,-2.698 -3.1975,-3.2391 -5.9968,-3.6079 -1.8844,-0.24826 -2.2743,-0.46379 -2.7205,-1.5039 -0.49155,-1.1457 -0.35253,-5.636 0.31542,-10.188 0.55299,-3.7681 2.1477,-6.9336 3.8134,-7.5698 0.78861,-0.30118 1.8308,-0.20138 2.7491,0.26325 0.87995,0.44521 2.2816,1.7301 3.386,3.1041 3.661,4.5544 7.6653,13.808 8.8768,20.515 0.31487,1.743 0.31925,4.41 0.009,5.2152 -0.44861,1.1626 -1.3096,1.4894 -2.597,0.98575 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3383" /> - <path - d="m 583.58,841.33 c -0.56847,-0.56848 -4.412,-6.7237 -5.2508,-8.4089 -0.8612,-1.7302 -1.6883,-3.839 -2.2515,-5.7405 -1.0641,-3.5926 -1.181,-5.9564 -0.3336,-6.7418 0.2925,-0.27107 0.40413,-0.2974 0.95624,-0.2255 3.3157,0.43183 6.4083,5.3018 7.5841,11.943 0.21797,1.2311 0.22259,8.5209 0.006,9.0312 -0.16502,0.38838 -0.41454,0.4386 -0.7102,0.14295 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3385" /> - <path - d="m 415.69,944.36 c -2.4446,-0.11737 -5.3266,-0.78418 -8.3789,-1.9386 -0.53851,-0.20368 -2.1262,-0.85001 -2.1742,-0.88506 -0.022,-0.016 0.0776,-4.3216 0.12452,-5.3846 0.0937,-2.1228 0.29807,-2.7868 1.1094,-3.6036 0.1548,-0.15586 0.71899,-0.67236 1.2537,-1.1478 0.53475,-0.47542 1.3903,-1.2826 1.9012,-1.7938 0.74585,-0.74617 1.0202,-1.0556 1.3921,-1.5698 1.4938,-2.0656 2.6543,-3.3121 3.6777,-3.9499 0.94589,-0.58955 1.9308,-0.67409 2.7924,-0.23969 0.47015,0.23705 0.78555,0.47877 1.3098,1.0039 0.81497,0.81624 1.5109,1.8032 2.7137,3.8483 1.0229,1.7393 1.3607,2.1991 3.0029,4.088 1.1497,1.3224 1.685,2.1629 1.8833,2.957 0.22037,0.88267 0.0525,1.8912 -0.51055,3.0673 -1.7055,3.5625 -4.7608,5.4422 -9.0144,5.5459 -0.41321,0.0101 -0.90045,0.0112 -1.0828,0.002 v 10e-6 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3387" /> - <path - d="m 355.39,856.93 c 0,-1.1122 -0.0875,-2.0422 -0.37601,-3.9951 -0.48918,-3.3116 -0.58544,-4.4231 -0.87685,-10.125 -0.17565,-3.4368 -0.29441,-5.2179 -0.40631,-6.0938 -0.6341,-4.9631 -1.9512,-9.8583 -3.6266,-13.479 -0.85522,-1.848 -1.8158,-3.4041 -3.8825,-6.2892 -1.423,-1.9866 -2.0889,-3.0427 -2.3109,-3.6653 -0.31228,-0.87577 -0.23937,-1.2461 0.37213,-1.8898 0.60452,-0.6364 1.0697,-0.86464 1.7624,-0.86464 0.588,0 0.92992,0.11167 1.5398,0.5029 3.0232,1.9393 6.9365,9.887 10.554,21.435 1.0776,3.44 1.4771,5.4879 1.6214,8.3125 0.065,1.2718 0.0159,2.9785 -0.12248,4.2558 -0.29599,2.7329 -1.1015,5.8402 -2.2552,8.6995 -0.66795,1.6554 -1.8055,4.0135 -1.9361,4.0135 -0.0313,0 -0.0568,-0.36782 -0.0568,-0.81737 z" - inkscape:connector-curvature="0" - style="fill:#d38d5f" - id="path3389" /> - </g> - </g> - <path - inkscape:connector-curvature="0" - id="path959" - d="m 51.887826,204.93421 a 88.368795,85.640517 0 0 0 -3.29334,-7.13238 88.368795,85.640517 0 0 0 -4.3956,-7.42538 88.368795,85.640517 0 0 0 -5.13767,-6.9634 88.368795,85.640517 0 0 0 -5.83014,-6.43113 88.368795,85.640517 0 0 0 -6.46317,-5.83531 88.368795,85.640517 0 0 0 -7.03161,-5.18056 88.368795,85.640517 0 0 0 -7.53081,-4.47466 88.368795,85.640517 0 0 0 -3.2731802,-1.53221 c -3.55387,3.67771 -6.95823,7.57765 -9.29813,12.09074 -2.96211,5.71314 -5.41673,18.53065 -5.41673,18.53065 0,0 4.73109,4.95591 7.6972,6.5567 7.75393,4.18476 16.7787002,5.46819 25.3726102,7.41247 3.47421,0.78601 6.98621,1.69599 10.5482,1.71049 4.68913,0.019 9.42029,-0.43507 14.05237,-1.32602 z" - style="fill:#508227;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69333339;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> - <text - transform="skewX(51.366807)" - id="text963" - y="278.88849" - x="-300.14066" - style="font-style:normal;font-weight:normal;font-size:6.09108257px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a05a2c;fill-opacity:1;stroke:none;stroke-width:0.15227707" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.23719788px;font-family:'Tetricide BRK';-inkscape-font-specification:'Tetricide BRK';fill:#a05a2c;fill-opacity:1;stroke-width:0.15227707" - y="278.88849" - x="-300.14066" - id="tspan961" - sodipodi:role="line">1</tspan></text> - <text - transform="skewX(28.3)" - id="text963-5" - y="282.9393" - x="-135.29172" - style="font-style:normal;font-weight:normal;font-size:5.36366177px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.13409154" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:25.74557686px;font-family:'Tetricide BRK';-inkscape-font-specification:'Tetricide BRK';fill:#000000;fill-opacity:1;stroke-width:0.13409154" - y="282.9393" - x="-135.29172" - id="tspan961-1" - sodipodi:role="line">0</tspan></text> - <text - transform="skewX(-32.423271)" - id="text963-2" - y="283.1842" - x="154.74008" - style="font-style:normal;font-weight:normal;font-size:6.09108257px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a05a2c;fill-opacity:1;stroke:none;stroke-width:0.15227707" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.23719978px;font-family:'Tetricide BRK';-inkscape-font-specification:'Tetricide BRK';fill:#a05a2c;fill-opacity:1;stroke-width:0.15227707" - y="283.1842" - x="154.74008" - id="tspan961-13" - sodipodi:role="line">1</tspan></text> - <text - transform="skewX(-56.604244)" - id="text963-2-4" - y="275.01749" - x="349.84576" - style="font-style:normal;font-weight:normal;font-size:6.09108257px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#a05a2c;fill-opacity:1;stroke:none;stroke-width:0.15227707" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:29.23719978px;font-family:'Tetricide BRK';-inkscape-font-specification:'Tetricide BRK';fill:#a05a2c;fill-opacity:1;stroke-width:0.15227707" - y="275.01749" - x="349.84576" - id="tspan961-13-5" - sodipodi:role="line">1</tspan></text> - </g> - </g> -</svg> diff --git a/aleksis/core/static/js/main.js b/aleksis/core/static/js/main.js index f3439d2a573a93a094e189c142e0d9fc6ee41cf8..403837da22d351d8e97ed3cf6c27c79e30514497 100644 --- a/aleksis/core/static/js/main.js +++ b/aleksis/core/static/js/main.js @@ -64,4 +64,20 @@ $(document).ready( function () { "paging": false }); }); + + // Initialise auto-completion for search bar + window.autocomplete = new Autocomplete({}); + window.autocomplete.setup(); + + // Initialize text collapsibles [MAT, own work] + $(".text-collapsible").addClass("closed").removeClass("opened"); + + $(".text-collapsible .open-icon").click(function (e) { + var el = $(e.target).parent(); + el.addClass("opened").removeClass("closed"); + }); + $(".text-collapsible .close-icon").click(function (e) { + var el = $(e.target).parent(); + el.addClass("closed").removeClass("opened"); + }); }); diff --git a/aleksis/core/static/js/search.js b/aleksis/core/static/js/search.js new file mode 100644 index 0000000000000000000000000000000000000000..7943d2ebfaa07123bf0174b24c055884ceb0bd36 --- /dev/null +++ b/aleksis/core/static/js/search.js @@ -0,0 +1,121 @@ +/* + * Based on: https://django-haystack.readthedocs.io/en/master/autocomplete.html + * + * © Copyright 2009-2016, Daniel Lindsley + * Licensed under the 3-clause BSD license + */ + +var Autocomplete = function (options) { + this.form_selector = options.form_selector || '.autocomplete'; + this.url = options.url || Urls.searchbarSnippets(); + this.delay = parseInt(options.delay || 300); + this.minimum_length = parseInt(options.minimum_length || 3); + this.form_elem = null; + this.query_box = null; + this.selected_element = null; +}; + +Autocomplete.prototype.setup = function () { + var self = this; + + this.form_elem = $(this.form_selector); + this.query_box = this.form_elem.find('input[name=q]'); + + + $("#search-form").focusout(function (e) { + if (!$(e.relatedTarget).hasClass("search-item")) { + e.preventDefault(); + $("#search-results").remove(); + } + }); + + // Trigger the "keyup" event if input gets focused + + this.query_box.focus(function () { + self.query_box.trigger("keydown"); + }); + + // Watch the input box. + this.query_box.keydown(function (e) { + var query = self.query_box.val(); + + if (e.which === 38) { // Keypress Up + if (!self.selected_element) { + self.setSelectedResult($("#search-collection").children().last()); + return false; + } + + let prev = self.selected_element.prev(); + if (prev.length > 0) { + self.setSelectedResult(prev); + } + return false; + } + + if (e.which === 40) { // Keypress Down + if (!self.selected_element) { + self.setSelectedResult($("#search-collection").children().first()); + return false; + } + + let next = self.selected_element.next(); + if (next.length > 0) { + self.setSelectedResult(next); + } + return false; + } + + if (self.selected_element && e.which === 13) { + e.preventDefault(); + window.location.href = self.selected_element.attr("href"); + } + + if (query.length < self.minimum_length) { + $("#search-results").remove(); + return true; + } + + self.fetch(query); + return true; + }); + + // // On selecting a result, remove result box + // this.form_elem.on('click', '#search-results', function (ev) { + // $('#search-results').remove(); + // return true; + // }); + + // Disable browser's own autocomplete + // We do this here so users without JavaScript can keep it enabled + this.query_box.attr('autocomplete', 'off'); +}; + +Autocomplete.prototype.fetch = function (query) { + var self = this; + + $.ajax({ + url: this.url + , data: { + 'q': query + } + , success: function (data) { + self.show_results(data); + } + }) +}; + +Autocomplete.prototype.show_results = function (data) { + $('#search-results').remove(); + var results_wrapper = $('<div id="search-results">' + data + '</div>'); + this.query_box.after(results_wrapper); + this.selected_element = null; +}; + +Autocomplete.prototype.setSelectedResult = function (element) { + if (this.selected_element) { + this.selected_element.removeClass("active"); + } + element.addClass("active"); + this.selected_element = element; + console.log("New element: ", element); +}; diff --git a/aleksis/core/static/style.scss b/aleksis/core/static/style.scss index c9421f5a31e7d20e8befa3409e009ad956b9232a..e1edc75561fb4fe57568f1b148b8ab0f955c1b58 100644 --- a/aleksis/core/static/style.scss +++ b/aleksis/core/static/style.scss @@ -8,6 +8,18 @@ color: $primary-color !important; } +.secondary-color { + background-color: $secondary-color !important; +} + +.secondary-color-text, .secondary-color-text a { + color: $secondary-color !important; +} + +rect#background { + fill: $primary-color !important; +} + .waves-effect.waves-primary .waves-ripple { background-color: lighten($primary-color, 5%); } @@ -66,6 +78,11 @@ header, main, footer { margin-left: 10px; } +#sidenav-logo { + height: 70px; + width: auto; +} + @media only screen and (max-width: 993px) { header div.nav-wrapper { z-index: -5; @@ -120,6 +137,66 @@ li.active > a > .sidenav-badge { color: $primary-color !important; } +.sidenav li.search { + position: relative; + z-index: 2; +} + +.sidenav li.search:hover { + background-color: #fff; +} + +.sidenav li.search .search-wrapper { + color: #777; + margin-top: -1px; + border-top: 1px solid rgba(0, 0, 0, 0.14); + border-bottom: 1px solid rgba(0, 0, 0, 0.14); + + -webkit-transition: margin .25s ease; + transition: margin .25s ease; +} + +.sidenav li.search .search-wrapper input#search { + color: #777; + display: block; + font-size: 16px; + font-weight: 300; + width: 100%; + height: 62px; + margin: 0; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0 45px 0 30px; + border: 0; +} + +.sidenav li.search .search-wrapper input#search:focus { + outline: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.sidenav li.search .search-wrapper > i.material-icons { + position: absolute; + top: 21px; + right: 10px; + cursor: pointer; +} + +a.collection-item.search-item { + padding: 20px 10px; +} + +div#search-results { + position: absolute; + width: 100%; +} + +.search-result-icon { + position: absolute; + right: 10px; +} + // Sidenav trigger @@ -195,6 +272,43 @@ form .row { margin-bottom: 0; } +label.chips-checkbox { + &.active { + outline: none; + background-color: $chip-selected-color; + color: #fff; + } + + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, .6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: $chip-bg-color; + margin-bottom: $chip-margin; + margin-right: $chip-margin; + + > img { + float: left; + margin: 0 8px 0 -12px; + height: 32px; + width: 32px; + border-radius: 50%; + } +} + +input[type="checkbox"].chips-checkbox + span { + padding-left: 0; + + &:before { + display: none; + width: 0; + } +} + // Badges span.badge.new::after { @@ -252,7 +366,7 @@ span.badge .material-icons { /* Table*/ -table.striped > tbody > tr:nth-child(odd), table tr.striped, table tbody.striped tr { +table.striped > tbody > tr:nth-child(odd), table tr.striped, table tbody.striped tr { background-color: rgba(208, 208, 208, 0.5); } @@ -359,6 +473,27 @@ main .alert p:first-child, main .alert div:first-child { margin-right: -10px; } +// Text collapsible + +.text-collapsible > .material-icons { + font-size: 20px; + line-height: 15px; + margin-bottom: 2px; + margin-left: -1px; + vertical-align: middle; + cursor: pointer; + color: #6d6d6d; +} + +.text-collapsible.opened .a, +.text-collapsible.opened > .material-icons.open-icon { + display: none; +} + +.text-collapsible.closed .b, +.text-collapsible.closed > .material-icons.close-icon { + display: none; +} // Helpers @@ -477,4 +612,3 @@ main .alert p:first-child, main .alert div:first-child { overflow: visible; width: 100%; } - diff --git a/aleksis/core/static/theme.scss b/aleksis/core/static/theme.scss index 36d3e3f55a0e37595f3dcc27230947875cd2648b..907c444f5bf99ef3616ae47a4c6df8b2e82b011e 100644 --- a/aleksis/core/static/theme.scss +++ b/aleksis/core/static/theme.scss @@ -127,7 +127,7 @@ $collapsible-border-color: #ddd !default; $chip-bg-color: #e4e4e4 !default; $chip-border-color: #9e9e9e !default; -$chip-selected-color: #26a69a !default; +$chip-selected-color: $primary-color !default; $chip-margin: 5px !default; diff --git a/aleksis/core/tasks.py b/aleksis/core/tasks.py new file mode 100644 index 0000000000000000000000000000000000000000..2c4c40a8f218d95efa0c26c2e30a8388cce305dd --- /dev/null +++ b/aleksis/core/tasks.py @@ -0,0 +1,18 @@ +from django.core import management + +from .util.core_helpers import celery_optional +from .util.notifications import send_notification as _send_notification + + +@celery_optional +def send_notification(notification: int, resend: bool = False) -> None: + _send_notification(notification, resend) + + +@celery_optional +def backup_data() -> None: + db_options = "-z " * settings.DBBACKUP_COMPRESS_DB + "-e" * settings.DBBACKUP_ENCRYPT_DB + media_options = "-z " * settings.DBBACKUP_COMPRESS_MEDIA + "-e" * settings.DBBACKUP_ENCRYPT_MEDIA + + management.call_command("dbbackup", db_options) + management.call_command("mediabackup", media_options) diff --git a/aleksis/core/templates/403.html b/aleksis/core/templates/403.html index 07e4eb31b59ba6eb20d467407e12d84744a7a0b7..62ecac05226406b8ba79b61f299ca038c4a17b05 100644 --- a/aleksis/core/templates/403.html +++ b/aleksis/core/templates/403.html @@ -4,9 +4,9 @@ {% block content %} <div class="container"> - <div class="card-panel red"> - <div class="card-content white-text"> - <div class="material-icons">error_outline</div> + <div class="card red"> + <div class="card white-text"> + <i class="material-icons small">error_outline</i> <span class="card-title">{% blocktrans %}Error (403): You are not allowed to access the requested page or object.{% endblocktrans %}</span> <p> {% blocktrans %} @@ -14,18 +14,14 @@ administrators: {% endblocktrans %} </p> - <div class="card-caction"> + <ul> {% for admin in ADMINS %} <li> {{ admin.0 }} - < - <a href="mailto:{{ admin.1 }}"> - {{ admin.1 }} - </a> - > + <<a class="blue-text text-lighten-2" href="mailto:{{ admin.1 }}">{{ admin.1 }}</a>> </li> {% endfor %} - </div> + </ul> </div> </div> </div> diff --git a/aleksis/core/templates/404.html b/aleksis/core/templates/404.html index 5b6ca7c9f07751fb4797c6841aed6428046163ac..4acb9e13f10840fefd44b583b1f1fa71b040171d 100644 --- a/aleksis/core/templates/404.html +++ b/aleksis/core/templates/404.html @@ -4,9 +4,9 @@ {% block content %} <div class="container"> - <div class="card-panel red"> + <div class="card red"> <div class="card-content white-text"> - <div class="material-icons">error_outline</div> + <i class="material-icons small left">error_outline</i> <span class="card-title">{% blocktrans %}Error (404): The requested page or object was not found.{% endblocktrans %}</span> <p> {% blocktrans %} @@ -18,18 +18,14 @@ administrators: {% endblocktrans %} </p> - <div class="card-caction"> + <ul> {% for admin in ADMINS %} <li> {{ admin.0 }} - < - <a href="mailto:{{ admin.1 }}"> - {{ admin.1 }} - </a> - > + <<a class="blue-text text-lighten-2" href="mailto:{{ admin.1 }}">{{ admin.1 }}</a>> </li> {% endfor %} - </div> + </ul> </div> </div> </div> diff --git a/aleksis/core/templates/500.html b/aleksis/core/templates/500.html index 185028e069d3faa51a5f1234a576377ecd507a41..195c4348769fb399a050e14e622dc51fde0f1a1c 100644 --- a/aleksis/core/templates/500.html +++ b/aleksis/core/templates/500.html @@ -4,9 +4,9 @@ {% block content %} <div class="container"> - <div class="card-panel red"> + <div class="card red"> <div class="card-content white-text"> - <div class="material-icons">error_outline</div> + <div class="material-icons small">error_outline</div> <span class="card-title">{% blocktrans %}Error (500): An unexpected error has occured..{% endblocktrans %}</span> <p> {% blocktrans %} diff --git a/aleksis/core/templates/503.html b/aleksis/core/templates/503.html index 7bc68a3159d1ab0dec9bd8685338a2a7e9a9049c..01f94395e38c363e771aa8b31f31ac84343ab824 100644 --- a/aleksis/core/templates/503.html +++ b/aleksis/core/templates/503.html @@ -4,27 +4,23 @@ {% block content %} <div class="container"> - <div class="card-panel red"> + <div class="card red"> <div class="card-content white-text"> - <div class="material-icons">error_outline</div> + <div class="material-icons small">error_outline</div> <span class="card-title">{% blocktrans %}The maintenance mode is currently enabled. Please try again later.{% endblocktrans %}</span> <p> {% blocktrans %} This page is currently unavailable. If this error stays, contact your site administrators: {% endblocktrans %} </p> - <div class="card-caction"> + <ul> {% for admin in ADMINS %} <li> {{ admin.0 }} - < - <a href="mailto:{{ admin.1 }}"> - {{ admin.1 }} - </a> - > + <<a class="blue-text text-lighten-2" href="mailto:{{ admin.1 }}">{{ admin.1 }}</a>> </li> {% endfor %} - </div> + </ul> </div> </div> </div> diff --git a/aleksis/core/templates/common/about.html b/aleksis/core/templates/common/about.html deleted file mode 100644 index 1cb16028bc60620525ad311638ff5c8f9d78804d..0000000000000000000000000000000000000000 --- a/aleksis/core/templates/common/about.html +++ /dev/null @@ -1,51 +0,0 @@ -{% load martortags %} - -{% include "partials/header.html" %} -<main> - - <div class="card"> - <div class="card-content"> - <span class="card-title">Entwickler und Copyright</span> - <p>{{ COPYRIGHT|linebreaksbr|safe_markdown }}</p> - <br> - <p> - GitHub: - <a href="https://github.com/Katharineum/school-apps">https://github.com/Katharineum/school-apps</a> - </p> - <p> - Kontakt: - <a href="mailto:support@katharineum.de">support@katharineum.de</a> - </p> - </div> - </div> - - <div class="card"> - <div class="card-content"> - <span class="card-title">Lizenz</span> -EUPL v1.2 or later - </div> - </div> - <div class="card"> - <div class="card-content"> - <span class="card-title">Verwendete Open-Source-Komponenten</span> - Folgende Open-Source-Komponenten wurden in SchoolApps benutzt: - - <ul class="collection"> - {% for component in components %} - <li class="collection-item"> - <h6>{{ component.0 }}</h6> - <p style="margin-bottom: 10px;"> - <a href="{{ component.1 }}">{{ component.1 }}</a> - · Lizensiert unter der - <a href="{{ component.3 }}">{{ component.2 }}</a> - </p> - </li> - {% endfor %} - </ul> - - Ein Anspruch auf Vollständigkeit wird nicht erhoben. - </div> - </div> -</main> - -{% include "partials/footer.html" %} diff --git a/aleksis/core/templates/components/text_collapsible.html b/aleksis/core/templates/components/text_collapsible.html new file mode 100644 index 0000000000000000000000000000000000000000..7096e8e9311d7fdcd5f6cffb6af0934fa9d56977 --- /dev/null +++ b/aleksis/core/templates/components/text_collapsible.html @@ -0,0 +1,13 @@ +<span class="text-collapsible opened"> + <span class="a"> + {% include template with item=qs.first %} – + {% include template with item=qs.last %} + </span> + <i class="material-icons open-icon" title="Show more">add_circle_outline</i> + <span class="b"> + {% for item in qs %} + {% include template with item=item %} + {% endfor %} + </span> + <i class="material-icons close-icon" title="Show less">remove_circle_outline</i> +</span> diff --git a/aleksis/core/templates/core/announcement/form.html b/aleksis/core/templates/core/announcement/form.html new file mode 100644 index 0000000000000000000000000000000000000000..0cd31cdefc11e8f1a2d29a30fb72a001357a946f --- /dev/null +++ b/aleksis/core/templates/core/announcement/form.html @@ -0,0 +1,33 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n material_form %} + + +{% block browser_title %} + {% if mode == "edit" %} + {% blocktrans %}Edit announcement{% endblocktrans %} + {% else %} + {% blocktrans %}Publish announcement{% endblocktrans %} + {% endif %} +{% endblock %} +{% block page_title %} + {% if mode == "edit" %} + {% blocktrans %}Edit announcement{% endblocktrans %} + {% else %} + {% blocktrans %}Publish new announcement{% endblocktrans %} + {% endif %} +{% endblock %} + +{% block content %} + <form action="" method="post"> + {% csrf_token %} + {% form form=form %}{% endform %} + + <button type="submit" class="btn green waves-effect waves-light"> + <i class="material-icons left">save</i> + {% trans "Save und publish announcement" %} + </button> + </form> +{% endblock %} diff --git a/aleksis/core/templates/core/announcement/list.html b/aleksis/core/templates/core/announcement/list.html new file mode 100644 index 0000000000000000000000000000000000000000..9f84617e255c78b7ee37e502c212e0704aa1da5e --- /dev/null +++ b/aleksis/core/templates/core/announcement/list.html @@ -0,0 +1,56 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n %} + +{% block browser_title %}{% blocktrans %}Announcements{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Announcements{% endblocktrans %}{% endblock %} + +{% block content %} + <a class="btn green waves-effect waves-light" href="{% url "add_announcement" %}"> + <i class="material-icons left">add</i> + {% trans "Publish new announcement" %} + </a> + <table class="highlight"> + <thead> + <tr> + <th>{% trans "Title" %}</th> + <th>{% trans "Valid from" %}</th> + <th>{% trans "Valid until" %}</th> + <th>{% trans "Recipients" %}</th> + <th>{% trans "Actions" %}</th> + </tr> + </thead> + <tbody> + {% for announcement in announcements %} + <tr> + <td>{{ announcement.title }}</td> + <td>{{ announcement.valid_from }}</td> + <td>{{ announcement.valid_until }}</td> + <td>{{ announcement.recipients.all|join:", " }}</td> + <td> + <a class="btn-flat waves-effect waves-orange orange-text" + href="{% url "edit_announcement" announcement.id %}"> + <i class="material-icons left">edit</i> + {% trans "Edit" %} + </a> + <form action="{% url "delete_announcement" announcement.id %}" method="post"> + {% csrf_token %} + <button class="btn-flat waves-effect waves-re red-text" type="submit"> + <i class="material-icons left">delete</i> + {% trans "Delete" %} + </button> + </form> + </td> + </tr> + {% empty %} + <tr> + <td colspan="5"> + <p class="flow-text center-align">{% trans "There are no announcements." %}</p> + </td> + </tr> + {% endfor %} + </tbody> + </table> +{% endblock %} diff --git a/aleksis/core/templates/core/announcements.html b/aleksis/core/templates/core/announcements.html new file mode 100644 index 0000000000000000000000000000000000000000..2c74bead64e6c0f0f9da1753114d76357c2994e1 --- /dev/null +++ b/aleksis/core/templates/core/announcements.html @@ -0,0 +1,48 @@ +{% load i18n humanize %} + +{% for announcement in announcements %} + <div class="alert primary"> + <div> + {% if show_interval %} + <em class="right hide-on-small-and-down"> + {% if announcement.valid_from.date == announcement.valid_until.date %} + {% blocktrans with from=announcement.valid_from|naturalday %} + Valid for {{ from }} + {% endblocktrans %} + {% else %} + {% blocktrans with from=announcement.valid_from|naturalday until=announcement.valid_until|naturalday %} + Valid from {{ from }} until {{ until }} + {% endblocktrans %} + {% endif %} + </em> + {% endif %} + + <i class="material-icons left">announcement</i> + + {% if show_recipients and announcement.recipients %} + <p> + {{ announcement.recipients.all|join:", " }}: + </p> + {% endif %} + + <p> + <strong>{{ announcement.title }}</strong> <br/> + {{ announcement.description }} + </p> + + {% if show_interval %} + <em class="hide-on-med-and-up"> + {% if announcement.valid_from.date == announcement.valid_until.date %} + {% blocktrans with from=announcement.valid_from|naturalday %} + Valid for {{ from }} + {% endblocktrans %} + {% else %} + {% blocktrans with from=announcement.valid_from|naturalday until=announcement.valid_until|naturalday %} + Valid for {{ from }} – {{ until }} + {% endblocktrans %} + {% endif %} + </em> + {% endif %} + </div> + </div> +{% endfor %} diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html index fb2408cfd940141982dd3e53a687b2f2c1908992..fe536557737d05a04c93d9bfbedfcc63f1bbe60b 100644 --- a/aleksis/core/templates/core/base.html +++ b/aleksis/core/templates/core/base.html @@ -32,6 +32,8 @@ {# Include jQuery to provide $(document).ready #} {% include_js "jQuery" %} + <script type="text/javascript" src="{% static 'js/search.js' %}"></script> + {% block extra_head %}{% endblock %} </head> <body> @@ -64,9 +66,21 @@ <ul id="slide-out" class="sidenav sidenav-fixed"> <li class="logo"> <a id="logo-container" href="/" class="brand-logo"> - <img src="{% static 'img/aleksis-logo.png' %}" alt="AlekSIS Logo" style="height: 70px; width:auto;"> + <object type="image/svg+xml" data="{% static 'img/aleksis-icon.svg' %}" class="aleksis-logo-svg" id="sidenav-logo"> + <img src="{% static 'img/aleksis-icon.png' %}" alt="AlekSIS icon" /> + </object> </a> </li> + {% if user.is_authenticated %} + <li class="search"> + <form method="get" action="{% url "haystack_search" %}" id="search-form" class="autocomplete"> + <div class="search-wrapper"> + <input id="search" name="q" placeholder="{% trans "Search" %}"> + <i class="material-icons">search</i> + </div> + </form> + </li> + {% endif %} <li class="no-padding"> {% include "core/sidenav.html" %} </li> @@ -135,14 +149,7 @@ <a class="blue-text text-lighten-4" href="{% url "about_aleksis" %}"> {% trans "About AlekSIS — The Free School Information System" %} </a> - © The AlekSIS Team @ - <a class="blue-text text-lighten-4" href="https://www.teckids.org"> - Teckids e.V. - </a> - and - <a class="blue-text text-lighten-4" href="https://katharineum-zu-luebeck.de"> - Katharineum zu Lübeck - </a> + © The AlekSIS Team </div> <div class="right"> <span id="doit"></span> diff --git a/aleksis/core/templates/core/footer-menu.html b/aleksis/core/templates/core/footer-menu.html index 47ca6bf4e62457a7d60a120606d816673b127379..5a1d268ea2916899bb3d5bddd47e26d4962734ba 100644 --- a/aleksis/core/templates/core/footer-menu.html +++ b/aleksis/core/templates/core/footer-menu.html @@ -1,20 +1,10 @@ {# -*- engine:django -*- #} -{% load menu_generator i18n %} - -{% get_menu "FOOTER_MENU_CORE" as footer_menu %} -{% regroup footer_menu by submenu|length_is:"0" as footer_menus %} - -{% for menu in footer_menus %} - {% if not menu.grouper %} - {% for item in menu.list %} - <a class="blue-text text-lighten-4 btn-flat" href="{{ item.url }}"> - {% if item.icon %} - <i class="material-icons footer-icon left">{{ item.icon }}</i> - {% endif %} - {{ item.name }} - </a> - {% endfor %} - {% endif %} +{% for item in FOOTER_MENU.items.all %} + <a class="blue-text text-lighten-4 btn-flat" href="{{ item.url }}"> + {% if item.icon %} + <i class="material-icons footer-icon left">{{ item.icon }}</i> + {% endif %} + {{ item.name }} + </a> {% endfor %} - diff --git a/aleksis/core/templates/core/index.html b/aleksis/core/templates/core/index.html index 22d0d4013929f402276f9a960450c4f2f99725e8..2ace14e98652ded4e56c840c180b10690b1fb7d6 100644 --- a/aleksis/core/templates/core/index.html +++ b/aleksis/core/templates/core/index.html @@ -3,6 +3,10 @@ {% block browser_title %}{% blocktrans %}Home{% endblocktrans %}{% endblock %} +{% block extra_head %} + {{ media }} +{% endblock %} + {% block content %} <p class="flow-text">{% blocktrans %}AlekSIS (School Information System){% endblocktrans %}</p> @@ -24,6 +28,8 @@ </div> {% endfor %} + {% include "core/announcements.html" with announcements=announcements %} + <div class="row" id="live_load"> {% for widget in widgets %} <div class="col s12 m12 l6 xl4"> diff --git a/aleksis/core/templates/core/meta.html b/aleksis/core/templates/core/meta.html index 4b0be929e8f421a3df4b3d5efedd5909ccc542b4..c4364430ce15a888e2f5d610ade92d26244b4856 100644 --- a/aleksis/core/templates/core/meta.html +++ b/aleksis/core/templates/core/meta.html @@ -4,8 +4,7 @@ <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1"> -<meta name="description" - content="{% blocktrans %}AlekSIS is a web-based school information system (SIS) which can be used to manage and/or publish organisational data of educational in titutions.{% endblocktrans %}"> +<meta name="description" content="{{ config.SITE_DESCRIPTION }}"> {# Favicons #} <link href="{% static "icons/favicon_16.png" %}" rel="icon" type="image/png" sizes="16x16"> diff --git a/aleksis/core/templates/material/field_errors.html b/aleksis/core/templates/material/field_errors.html new file mode 100644 index 0000000000000000000000000000000000000000..3100407ef6ec7bc0dcad9d37323bf102c2462aa4 --- /dev/null +++ b/aleksis/core/templates/material/field_errors.html @@ -0,0 +1,5 @@ +{% if bound_field.errors %} + <div class="errors"> + {% for error in bound_field.errors %}<small class="error-text">{{ error }}</small>{% endfor %} + </div> +{% endif %} diff --git a/aleksis/core/templates/material/non_field_errors.html b/aleksis/core/templates/material/non_field_errors.html new file mode 100644 index 0000000000000000000000000000000000000000..c8a92eb7ef813325580738a7819fccf6da2dfa70 --- /dev/null +++ b/aleksis/core/templates/material/non_field_errors.html @@ -0,0 +1,7 @@ +{% if form.non_field_errors %} + <div class="alert error"> + {% for error in form.non_field_errors %} + <div><i class="material-icons left">error</i> {{ error }}</div> + {% endfor %} + </div> +{% endif %} diff --git a/aleksis/core/templates/search/indexes/core/group_text.txt b/aleksis/core/templates/search/indexes/core/group_text.txt new file mode 100644 index 0000000000000000000000000000000000000000..165c30e8c240ddecc872520626cccb598a6ad7a0 --- /dev/null +++ b/aleksis/core/templates/search/indexes/core/group_text.txt @@ -0,0 +1,2 @@ +{{ object.name }} +{{ object.short_name }} diff --git a/aleksis/core/templates/search/indexes/core/person_text.txt b/aleksis/core/templates/search/indexes/core/person_text.txt new file mode 100644 index 0000000000000000000000000000000000000000..210e1755e071a6ced9807790f54403ee5bc85f19 --- /dev/null +++ b/aleksis/core/templates/search/indexes/core/person_text.txt @@ -0,0 +1,3 @@ +{{ object.full_name }} +{{ object.user.username }} +{{ object.email }} diff --git a/aleksis/core/templates/search/search.html b/aleksis/core/templates/search/search.html new file mode 100644 index 0000000000000000000000000000000000000000..babbd70d945f26cbf777ae46ca0add15a24e442d --- /dev/null +++ b/aleksis/core/templates/search/search.html @@ -0,0 +1,108 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n material_form_internal %} + +{% block browser_title %}{% blocktrans %}Search{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Global Search{% endblocktrans %}{% endblock %} + +{% block content %} + <form method="get"> + {# {% form form=form %}{% endform %}#} + + <input type="text" name="{{ form.q.name }}" id="{{ form.q.id }}" value="{% firstof form.q.value "" %}" + placeholder="{% trans "Search Term" %}"> + + <h6>{{ form.models.label }}</h6> + <div> + {% for group, items in form.models|select_options %} + {% for choice, value, selected in items %} + <label class="{% if selected %} active{% endif %}"> + <input type="checkbox" + {% if value == None or value == '' %}disabled{% else %}value="{{ value }}"{% endif %} + {% if selected %} checked="checked"{% endif %} name="{{ form.models.name }}"> + <span> {{ choice }} </span> + </label> + {% endfor %} + {% endfor %} + </div> + + <button type="submit" class="btn waves-effect waves-light green"> + <i class="material-icons left">search</i> + {% blocktrans %}Search{% endblocktrans %} + </button> + + <h5>{% trans "Results" %}</h5> + + {% if query %} + <div class="collection"> + {% for result in page.object_list %} + <a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item"> + <i class="material-icons left">{{ result.object.icon_ }}</i> + {{ result.object }} + </a> + {% empty %} + <li class="collection-item"> + {% trans "No search results could be found to your search" %} + </li> + {% endfor %} + </div> + + {% if page.has_other_pages %} + <ul class="pagination"> + {% if page.has_previous %} + <li class="waves-effect"> + <a href="?q={{ query }}&page={{ page.previous_page_number }}"> + <i class="material-icons">chevron_left</i> + </a> + </li> + {% else %} + <li class="disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li> + {% endif %} + + {% for page_num in page.paginator.page_range %} + {% if page.number == page_num %} + <li class="active"><a href="#">{{ page_num }}</a></li> + {% else %} + <li class="waves-effect"><a href="?q={{ query }}&page={{ page_num }}">{{ page_num }}</a></li> + {% endif %} + {% endfor %} + + {% if page.has_next %} + <li class="waves-effect"> + <a href="?q={{ query }}&page={{ page.next_page_number }}"> + <i class="material-icons">chevron_right</i> + </a> + </li> + {% else %} + <li class="disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li> + {% endif %} + </ul> + {% endif %} + {% else %} + <div class="collection"> + <li class="collection-item"> + {% trans "Please enter a search term above" %} + </li> + </div> + {% endif %} + + + </form> + + <script> + $(document).ready(function () { + $("input[type='checkbox']").each(function () { + $(this).addClass("chips-checkbox"); + $(this).parent("label").addClass("chips-checkbox"); + }); + + $("label.chips-checkbox > span").click(function () { + $(this).parent("label.chips-checkbox").toggleClass("active"); + let input = $(this).next("input[type='checkbox']"); + input.prop("checked", !input.prop("checked")); + }); + }); + </script> +{% endblock %} diff --git a/aleksis/core/templates/search/searchbar_snippet.html b/aleksis/core/templates/search/searchbar_snippet.html new file mode 100644 index 0000000000000000000000000000000000000000..b5b7188c6a1e0381fd30f41b6fccc7e587949a30 --- /dev/null +++ b/aleksis/core/templates/search/searchbar_snippet.html @@ -0,0 +1,4 @@ +<a href="{{ result.object.get_absolute_url|default:"#" }}" class="collection-item search-item"> + {{ result.object }} + <i class="material-icons secondary-content search-result-icon">{{ result.object.icon_ }}</i> +</a> diff --git a/aleksis/core/templates/search/searchbar_snippets.html b/aleksis/core/templates/search/searchbar_snippets.html new file mode 100644 index 0000000000000000000000000000000000000000..373c93a7ec5d9311167abab0655d3444b3e57e73 --- /dev/null +++ b/aleksis/core/templates/search/searchbar_snippets.html @@ -0,0 +1,5 @@ +<div class="collection" id="search-collection"> + {% for result in results %} + {% include "search/searchbar_snippet.html" %} + {% endfor %} +</div> diff --git a/aleksis/core/templates/two_factor/_base_focus.html b/aleksis/core/templates/two_factor/_base_focus.html index 7c5985c645ef47abb9f32c936439078a8e893d90..ae61c5b73a8b4860d06ec70db5bb0459fb063ade 100644 --- a/aleksis/core/templates/two_factor/_base_focus.html +++ b/aleksis/core/templates/two_factor/_base_focus.html @@ -1,5 +1,11 @@ {% extends "core/base.html" %} +{% load i18n %} + +{% block browser_title %} + {% trans "Enable Two-Factor Authentication" %} +{% endblock %} + {% block content_wrapper %} - {% block content %}{% endblock %} + {% block content %}{% endblock %} {% endblock %} diff --git a/aleksis/core/templates/two_factor/_wizard_actions.html b/aleksis/core/templates/two_factor/_wizard_actions.html index 973b2317a2002b1b67620e0a7b598f76aa36751f..95be950552fe6abf47e481bd507e6c28899986b0 100644 --- a/aleksis/core/templates/two_factor/_wizard_actions.html +++ b/aleksis/core/templates/two_factor/_wizard_actions.html @@ -2,15 +2,16 @@ {% if cancel_url %} <a href="{{ cancel_url }}" class="btn red waves-effect waves-light"> - <i class="material-icons left">cancel</i> + <i class="material-icons left">cancel</i> {% trans "Cancel" %} </a> {% endif %} + {% if wizard.steps.prev %} <button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}" class="btn grey waves-effect waves-light"> - <i class="material-icons left">arrow_back</i> + <i class="material-icons left">arrow_back</i> {% trans "Back" %} </button> {% else %} @@ -19,7 +20,8 @@ {% trans "Back" %} </button> {% endif %} + <button type="submit" class="btn green waves-effect waves-light"> - <i class="material-icons right">arrow_forward</i> + <i class="material-icons right">arrow_forward</i> {% trans "Next" %} </button> diff --git a/aleksis/core/templates/two_factor/_wizard_forms.html b/aleksis/core/templates/two_factor/_wizard_forms.html index 75071a9dd366b4bea11a050c9cad1ffdf3d26889..ee0e582eb9d09e525531ba61c99b7aa54dd54d5c 100644 --- a/aleksis/core/templates/two_factor/_wizard_forms.html +++ b/aleksis/core/templates/two_factor/_wizard_forms.html @@ -1,4 +1,4 @@ {% load material_form %} - {% form form=wizard.management_form %}{% endform %} - {% form form=wizard.form %}{% endform %} +{% form form=wizard.management_form %}{% endform %} +{% form form=wizard.form %}{% endform %} diff --git a/aleksis/core/templates/two_factor/core/backup_tokens.html b/aleksis/core/templates/two_factor/core/backup_tokens.html index 29ded93974b9ab7bf54bdb055c02f643b48be315..84d6ef6802d5d6e85459eb662fe1d99f65a0dcf9 100644 --- a/aleksis/core/templates/two_factor/core/backup_tokens.html +++ b/aleksis/core/templates/two_factor/core/backup_tokens.html @@ -1,6 +1,10 @@ {% extends "core/base.html" %} {% load i18n %} +{% block browser_title %} + {% trans "Backup Tokens" %} +{% endblock %} + {% block content %} <h4>{% block title %}{% trans "Backup Tokens" %}{% endblock %}</h4> diff --git a/aleksis/core/templates/two_factor/core/login.html b/aleksis/core/templates/two_factor/core/login.html index 3d789b38dbc403dcd10d42e01082615de79c2e0c..3357221f0fa5b1c2d2093d742fd399afe3a2d74c 100644 --- a/aleksis/core/templates/two_factor/core/login.html +++ b/aleksis/core/templates/two_factor/core/login.html @@ -2,6 +2,10 @@ {% extends "two_factor/_base_focus.html" %} {% load i18n two_factor %} +{% block browser_title %} + {% trans "Login" %} +{% endblock %} + {% block content %} <h4>{% trans "Login" %}</h4> @@ -27,7 +31,6 @@ These tokens have been generated for you to print and keep safe. Please enter one of these backup tokens to login to your account.{% endblocktrans %} {% endif %} - </> </div> @@ -36,7 +39,9 @@ {% include "two_factor/_wizard_forms.html" %} {# hidden submit button to enable [enter] key #} - <div style="margin-left: -9999px"><input type="submit" value=""/></div> + <div style="margin-left: -9999px"> + <input type="submit" value=""/> + </div> {% if other_devices %} <p>{% trans "Or, alternatively, use one of your backup phones:" %}</p> diff --git a/aleksis/core/templates/two_factor/core/otp_required.html b/aleksis/core/templates/two_factor/core/otp_required.html index 0ed49da0ac083b2ae71e7c048d1d46b57fb466fc..734b0a9c8193eedef6989cae00ffe9bacf1277d6 100644 --- a/aleksis/core/templates/two_factor/core/otp_required.html +++ b/aleksis/core/templates/two_factor/core/otp_required.html @@ -2,19 +2,26 @@ {% load i18n %} {% block content %} - <h1>{% block title %}{% trans "Permission Denied" %}{% endblock %}</h1> + <div class="container"> + <div class="card red"> + <div class="card-content white-text"> + <i class="material-icons small left">error_outline</i> + <span class="card-title">{% blocktrans %}Permission Denied{% endblocktrans %}</span> + <p>{% blocktrans %}The page you requested, enforces users to verify using + two-factor authentication for security reasons. You need to enable these + security features in order to access this page.{% endblocktrans %}</p> - <p>{% blocktrans %}The page you requested, enforces users to verify using - two-factor authentication for security reasons. You need to enable these - security features in order to access this page.{% endblocktrans %}</p> - - <p>{% blocktrans %}Two-factor authentication is not enabled for your - account. Enable two-factor authentication for enhanced account - security.{% endblocktrans %}</p> - <p> - <a href="javascript:history.go(-1)" - class="pull-right btn btn-dark">{% trans "Go back" %}</a> - <a href="{% url 'two_factor:setup' %}" class="btn btn-dark"> - {% trans "Enable Two-Factor Authentication" %}</a> - </p> + <p>{% blocktrans %}Two-factor authentication is not enabled for your + account. Enable two-factor authentication for enhanced account + security.{% endblocktrans %}</p> + <p> + <a href="javascript:history.go(-1)" class="pull-right btn waves-effect waves-light"> + {% trans "Go back" %} + </a> + <a href="{% url 'two_factor:setup' %}" class="btn green waves-effect waves-light"> + {% trans "Enable Two-Factor Authentication" %}</a> + </p> + </div> + </div> + </div> {% endblock %} diff --git a/aleksis/core/templates/two_factor/core/phone_register.html b/aleksis/core/templates/two_factor/core/phone_register.html index 304ef4674f35b6d259c7d568f90845a08bd26d85..4eae9ebfac173a6b4fc37ed3a21b5941cc28eb71 100644 --- a/aleksis/core/templates/two_factor/core/phone_register.html +++ b/aleksis/core/templates/two_factor/core/phone_register.html @@ -1,23 +1,29 @@ {% extends "two_factor/_base_focus.html" %} {% load i18n %} +{% block browser_title %} + {% trans "Add Backup Phone" %} +{% endblock %} + {% block content %} - <h1>{% block title %}{% trans "Add Backup Phone" %}{% endblock %}</h1> + <h4>{% block title %}{% trans "Add Backup Phone" %}{% endblock %}</h4> {% if wizard.steps.current == 'setup' %} - <p>{% blocktrans %}You'll be adding a backup phone number to your - account. This number will be used if your primary method of - registration is not available.{% endblocktrans %}</p> + <p>{% blocktrans %}You'll be adding a backup phone number to your + account. This number will be used if your primary method of + registration is not available.{% endblocktrans %}</p> {% elif wizard.steps.current == 'validation' %} - <p>{% blocktrans %}We've sent a token to your phone number. Please - enter the token you've received.{% endblocktrans %}</p> + <p>{% blocktrans %}We've sent a token to your phone number. Please + enter the token you've received.{% endblocktrans %}</p> {% endif %} <form action="" method="post">{% csrf_token %} {% include "two_factor/_wizard_forms.html" %} {# hidden submit button to enable [enter] key #} - <div style="margin-left: -9999px"><input type="submit" value=""/></div> + <div style="margin-left: -9999px"> + <input type="submit" value=""/> + </div> {% include "two_factor/_wizard_actions.html" %} </form> diff --git a/aleksis/core/templates/two_factor/core/setup.html b/aleksis/core/templates/two_factor/core/setup.html index 54f4faa536cd9473292bb732bbc7e68c6632ba13..304a3eb7f9b6702ccc0a6886367ccf81ca82444a 100644 --- a/aleksis/core/templates/two_factor/core/setup.html +++ b/aleksis/core/templates/two_factor/core/setup.html @@ -3,8 +3,9 @@ {% block content %} <h4>{% block title %}{% trans "Enable Two-Factor Authentication" %}{% endblock %}</h4> + {% if wizard.steps.current == 'welcome' %} - <p> + <p class="flow-text"> {% blocktrans %} You are about to take your account security to the next level. Follow the steps in this wizard to enable two-factor @@ -14,7 +15,7 @@ {% elif wizard.steps.current == 'method' %} <p> {% blocktrans %} - Please select which authentication method you would like to use. + Please select which authentication method you would like to use: {% endblocktrans %} </p> {% elif wizard.steps.current == 'generator' %} @@ -58,7 +59,7 @@ </p> {% endif %} {% else %} - <p class="alert alert-warning" role="alert"> + <p class="alert warning" role="alert"> {% blocktrans %} We've encountered an issue with the selected authentication method. Please go back and verify that you entered your information correctly, try @@ -76,6 +77,7 @@ {% endblocktrans %} </p> {% endif %} + <form action="" method="post"> {% csrf_token %} diff --git a/aleksis/core/templates/two_factor/core/setup_complete.html b/aleksis/core/templates/two_factor/core/setup_complete.html index f494a4f25ae175295cfb188f2572861ad0dc76da..6520694bb0fbeda769573fa86e17bae89b514cf3 100644 --- a/aleksis/core/templates/two_factor/core/setup_complete.html +++ b/aleksis/core/templates/two_factor/core/setup_complete.html @@ -1,8 +1,12 @@ {% extends "two_factor/_base_focus.html" %} {% load i18n %} +{% block browser_title %} + {% trans "Two-Factor Authentication successfully enabled" %} +{% endblock %} + {% block content %} - <h4>{% block title %}{% trans "Enable Two-Factor Authentication" %}{% endblock %}</h4> + <h4>{% block title %}{% trans "Two-Factor Authentication successfully enabled" %}{% endblock %}</h4> <div class="alert success"> <p> diff --git a/aleksis/core/templates/two_factor/profile/disable.html b/aleksis/core/templates/two_factor/profile/disable.html new file mode 100644 index 0000000000000000000000000000000000000000..36fa472b7550a11c6b0d2d0d17364e11820bb5ec --- /dev/null +++ b/aleksis/core/templates/two_factor/profile/disable.html @@ -0,0 +1,29 @@ +{% extends "two_factor/_base_focus.html" %} +{% load i18n material_form %} + +{% block browser_title %} + {% trans "Disable Two-Factor Authentication" %} +{% endblock %} + +{% block content %} + <h4>{% block title %}{% trans "Disable Two-Factor Authentication" %}{% endblock %}</h4> + + <p class="flow-text"> + {% blocktrans trimmed %} + You are about to disable two-factor authentication. This + weakens your account security, are you sure? + {% endblocktrans %} + </p> + + <form method="post"> + {% csrf_token %} + <p> + {% form form=form %}{% endform %} + </p> + + <button class="btn red waves-effect waves-light" type="submit"> + <i class="material-icons left">power_settings_new</i> + {% trans "Disable" %} + </button> + </form> +{% endblock %} diff --git a/aleksis/core/templates/two_factor/profile/profile.html b/aleksis/core/templates/two_factor/profile/profile.html index b74c62223a533884d995435ebf022a465ba02465..4161becad1bb418d62115634edd07a128afecf22 100644 --- a/aleksis/core/templates/two_factor/profile/profile.html +++ b/aleksis/core/templates/two_factor/profile/profile.html @@ -1,6 +1,10 @@ {% extends "two_factor/_base_focus.html" %} {% load i18n two_factor %} +{% block browser_title %} + {% trans "Account Security" %} +{% endblock %} + {% block content %} <h4> {% block title %}{% trans "Account Security" %}{% endblock %} @@ -77,6 +81,7 @@ security. {% endblocktrans %} </p> + <p> <a href="{% url 'two_factor:setup' %}" class="green btn waves-effect waves-light "> {% trans "Enable Two-Factor Authentication" %} diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index e4fbe082e95c6722ea85f50082ee52d61297f4ba..5de76472c91da9243edfa13c57c5ce29a7782e08 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -36,6 +36,12 @@ urlpatterns = [ path("group/<int:id_>/edit", views.edit_group, name="edit_group_by_id"), path("", views.index, name="index"), path("notifications/mark-read/<int:id_>", views.notification_mark_read, name="notification_mark_read"), + path("announcements/", views.announcements, name="announcements"), + path("announcement/create/", views.announcement_form, name="add_announcement"), + path("announcement/edit/<int:pk>/", views.announcement_form, name="edit_announcement"), + path("announcement/delete/<int:pk>/", views.delete_announcement, name="delete_announcement"), + path("search/searchbar/", views.searchbar_snippets, name="searchbar_snippets"), + path("search/", include("haystack.urls")), path("maintenance-mode/", include("maintenance_mode.urls")), path("impersonate/", include("impersonate.urls")), path("__i18n__/", include("django.conf.urls.i18n")), diff --git a/aleksis/core/util/apps.py b/aleksis/core/util/apps.py index f98649cdc261b21443cfc1696af2453c119b6f79..7eef538ae05265d3492bda331eaf75875229a4ae 100644 --- a/aleksis/core/util/apps.py +++ b/aleksis/core/util/apps.py @@ -1,6 +1,12 @@ from importlib import import_module +from typing import Any, List, Optional, Tuple import django.apps +from django.contrib.auth.signals import user_logged_in, user_logged_out +from django.db.models.signals import post_migrate, pre_migrate +from django.http import HttpRequest + +from constance.signals import config_updated class AppConfig(django.apps.AppConfig): @@ -17,3 +23,93 @@ class AppConfig(django.apps.AppConfig): except ImportError: # ImportErrors are non-fatal because model extensions are optional. pass + + # Register default listeners + pre_migrate.connect(self.pre_migrate, sender=self) + post_migrate.connect(self.post_migrate, sender=self) + config_updated.connect(self.config_updated) + user_logged_in.connect(self.user_logged_in) + user_logged_out.connect(self.user_logged_out) + + # Getting an app ready means it should look at its config once + self.config_updated() + + # Register system checks of this app + try: + import_module(".".join(self.__class__.__module__.split(".")[:-1] + ["checks"])) + except ImportError: + # ImportErrors are non-fatal because checks are optional. + pass + + def config_updated( + self, + key: Optional[str] = "", + old_value: Optional[Any] = None, + new_value: Optional[Any] = None, + **kwargs, + ) -> None: + """ Called on every app instance if a Constance config chagnes, and once on startup + + By default, it does nothing. + """ + pass + + def pre_migrate( + self, + app_config: django.apps.AppConfig, + verbosity: int, + interactive: bool, + using: str, + plan: List[Tuple], + apps: django.apps.registry.Apps, + **kwargs, + ) -> None: + """ Called on every app instance before its models are migrated + + By default, it does nothing. + """ + pass + + def post_migrate( + self, + app_config: django.apps.AppConfig, + verbosity: int, + interactive: bool, + using: str, + plan: List[Tuple], + apps: django.apps.registry.Apps, + **kwargs, + ) -> None: + """ Called on every app instance after its models have been migrated + + By default, asks all models to do maintenance on their default data. + """ + self._maintain_default_data() + + def user_logged_in( + self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs + ) -> None: + """ Called after a user logged in + + By default, it does nothing. + """ + pass + + def user_logged_out( + self, sender: type, request: Optional[HttpRequest], user: "User", **kwargs + ) -> None: + """ Called after a user logged out + + By default, it does nothing. + """ + pass + + def _maintain_default_data(self): + if not self.models_module: + # This app does not have any models, so bail out early + return + + for model in self.get_models(): + if hasattr(model, "maintain_default_data"): + # Method implemented by each model object; can be left out + model.maintain_default_data() diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py index 55c329bf383357625fe6e650ff604c8430141b04..4ab3a1ee8fbb12aa5149529cfbbd1a6be77d18a2 100644 --- a/aleksis/core/util/core_helpers.py +++ b/aleksis/core/util/core_helpers.py @@ -1,3 +1,4 @@ +from datetime import datetime, timedelta import os import pkgutil from importlib import import_module @@ -7,6 +8,7 @@ from uuid import uuid4 from django.conf import settings from django.db.models import Model from django.http import HttpRequest +from django.utils import timezone from django.utils.functional import lazy @@ -114,11 +116,12 @@ def celery_optional(orig: Callable) -> Callable: and it is executed synchronously. """ + if hasattr(settings, "CELERY_RESULT_BACKEND"): + from ..celery import app # noqa + task = app.task(orig) + def wrapped(*args, **kwargs): if hasattr(settings, "CELERY_RESULT_BACKEND"): - from ..celery import app # noqa - task = app.task(orig) - task.delay(*args, **kwargs) else: orig(*args, **kwargs) @@ -141,12 +144,13 @@ def path_and_rename(instance, filename: str, upload_to: str = "files") -> str: return os.path.join(upload_to, new_filename) -def school_information_processor(request: HttpRequest) -> dict: - """ Provides default School object in all templates """ +def custom_information_processor(request: HttpRequest) -> dict: + """ Provides custom information in all templates """ - from ..models import School + from ..models import School, CustomMenu return { "SCHOOL": School.get_default, + "FOOTER_MENU": CustomMenu.get_default("footer"), } @@ -168,3 +172,8 @@ def get_app_licence_information() -> List[dict]: pass return licence_information + + +def now_tomorrow() -> datetime: + """ Return current time tomorrow """ + return timezone.now() + timedelta(days=1) diff --git a/aleksis/core/util/model_helpers.py b/aleksis/core/util/model_helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..57fab43ab14b787b9300b523e963efbcb0cee121 --- /dev/null +++ b/aleksis/core/util/model_helpers.py @@ -0,0 +1,961 @@ +# Materialize colors (without accent, darken and lighten classes) +COLOURS = [ + ("red", "red"), + ("pink", "pink"), + ("purple", "purple"), + ("deep-purple", "deep-purple"), + ("indigo", "indigo"), + ("blue", "blue"), + ("light-blue", "light-blue"), + ("cyan", "cyan"), + ("teal", "teal"), + ("green", "green"), + ("light-green", "light-green"), + ("lime", "lime"), + ("yellow", "yellow"), + ("amber", "amber"), + ("orange", "orange"), + ("deep-orange", "deep-orange"), + ("brown", "brown"), + ("grey", "grey"), + ("blue-grey", "blue-grey"), + ("black", "black"), + ("white", "white"), + ("transparent", "transparent"), +] + +# About 1000 icon names from Google's github repository +ICONS = [ + ("3d_rotation", "3d_rotation"), + ("ac_unit", "ac_unit"), + ("access_alarm", "access_alarm"), + ("access_alarms", "access_alarms"), + ("access_time", "access_time"), + ("accessibility", "accessibility"), + ("accessible", "accessible"), + ("account_balance", "account_balance"), + ("account_balance_wallet", "account_balance_wallet"), + ("account_box", "account_box"), + ("account_circle", "account_circle"), + ("adb", "adb"), + ("add", "add"), + ("add_a_photo", "add_a_photo"), + ("add_alarm", "add_alarm"), + ("add_alert", "add_alert"), + ("add_box", "add_box"), + ("add_circle", "add_circle"), + ("add_circle_outline", "add_circle_outline"), + ("add_location", "add_location"), + ("add_shopping_cart", "add_shopping_cart"), + ("add_to_photos", "add_to_photos"), + ("add_to_queue", "add_to_queue"), + ("adjust", "adjust"), + ("airline_seat_flat", "airline_seat_flat"), + ("airline_seat_flat_angled", "airline_seat_flat_angled"), + ("airline_seat_individual_suite", "airline_seat_individual_suite"), + ("airline_seat_legroom_extra", "airline_seat_legroom_extra"), + ("airline_seat_legroom_normal", "airline_seat_legroom_normal"), + ("airline_seat_legroom_reduced", "airline_seat_legroom_reduced"), + ("airline_seat_recline_extra", "airline_seat_recline_extra"), + ("airline_seat_recline_normal", "airline_seat_recline_normal"), + ("airplanemode_active", "airplanemode_active"), + ("airplanemode_inactive", "airplanemode_inactive"), + ("airplay", "airplay"), + ("airport_shuttle", "airport_shuttle"), + ("alarm", "alarm"), + ("alarm_add", "alarm_add"), + ("alarm_off", "alarm_off"), + ("alarm_on", "alarm_on"), + ("album", "album"), + ("all_inclusive", "all_inclusive"), + ("all_out", "all_out"), + ("android", "android"), + ("announcement", "announcement"), + ("apps", "apps"), + ("archive", "archive"), + ("arrow_back", "arrow_back"), + ("arrow_downward", "arrow_downward"), + ("arrow_drop_down", "arrow_drop_down"), + ("arrow_drop_down_circle", "arrow_drop_down_circle"), + ("arrow_drop_up", "arrow_drop_up"), + ("arrow_forward", "arrow_forward"), + ("arrow_upward", "arrow_upward"), + ("art_track", "art_track"), + ("aspect_ratio", "aspect_ratio"), + ("assessment", "assessment"), + ("assignment", "assignment"), + ("assignment_ind", "assignment_ind"), + ("assignment_late", "assignment_late"), + ("assignment_return", "assignment_return"), + ("assignment_returned", "assignment_returned"), + ("assignment_turned_in", "assignment_turned_in"), + ("assistant", "assistant"), + ("assistant_photo", "assistant_photo"), + ("attach_file", "attach_file"), + ("attach_money", "attach_money"), + ("attachment", "attachment"), + ("audiotrack", "audiotrack"), + ("autorenew", "autorenew"), + ("av_timer", "av_timer"), + ("backspace", "backspace"), + ("backup", "backup"), + ("battery_alert", "battery_alert"), + ("battery_charging_full", "battery_charging_full"), + ("battery_full", "battery_full"), + ("battery_std", "battery_std"), + ("battery_unknown", "battery_unknown"), + ("beach_access", "beach_access"), + ("beenhere", "beenhere"), + ("block", "block"), + ("bluetooth", "bluetooth"), + ("bluetooth_audio", "bluetooth_audio"), + ("bluetooth_connected", "bluetooth_connected"), + ("bluetooth_disabled", "bluetooth_disabled"), + ("bluetooth_searching", "bluetooth_searching"), + ("blur_circular", "blur_circular"), + ("blur_linear", "blur_linear"), + ("blur_off", "blur_off"), + ("blur_on", "blur_on"), + ("book", "book"), + ("bookmark", "bookmark"), + ("bookmark_border", "bookmark_border"), + ("border_all", "border_all"), + ("border_bottom", "border_bottom"), + ("border_clear", "border_clear"), + ("border_color", "border_color"), + ("border_horizontal", "border_horizontal"), + ("border_inner", "border_inner"), + ("border_left", "border_left"), + ("border_outer", "border_outer"), + ("border_right", "border_right"), + ("border_style", "border_style"), + ("border_top", "border_top"), + ("border_vertical", "border_vertical"), + ("branding_watermark", "branding_watermark"), + ("brightness_1", "brightness_1"), + ("brightness_2", "brightness_2"), + ("brightness_3", "brightness_3"), + ("brightness_4", "brightness_4"), + ("brightness_5", "brightness_5"), + ("brightness_6", "brightness_6"), + ("brightness_7", "brightness_7"), + ("brightness_auto", "brightness_auto"), + ("brightness_high", "brightness_high"), + ("brightness_low", "brightness_low"), + ("brightness_medium", "brightness_medium"), + ("broken_image", "broken_image"), + ("brush", "brush"), + ("bubble_chart", "bubble_chart"), + ("bug_report", "bug_report"), + ("build", "build"), + ("burst_mode", "burst_mode"), + ("business", "business"), + ("business_center", "business_center"), + ("cached", "cached"), + ("cake", "cake"), + ("call", "call"), + ("call_end", "call_end"), + ("call_made", "call_made"), + ("call_merge", "call_merge"), + ("call_missed", "call_missed"), + ("call_missed_outgoing", "call_missed_outgoing"), + ("call_received", "call_received"), + ("call_split", "call_split"), + ("call_to_action", "call_to_action"), + ("camera", "camera"), + ("camera_alt", "camera_alt"), + ("camera_enhance", "camera_enhance"), + ("camera_front", "camera_front"), + ("camera_rear", "camera_rear"), + ("camera_roll", "camera_roll"), + ("cancel", "cancel"), + ("card_giftcard", "card_giftcard"), + ("card_membership", "card_membership"), + ("card_travel", "card_travel"), + ("casino", "casino"), + ("cast", "cast"), + ("cast_connected", "cast_connected"), + ("center_focus_strong", "center_focus_strong"), + ("center_focus_weak", "center_focus_weak"), + ("change_history", "change_history"), + ("chat", "chat"), + ("chat_bubble", "chat_bubble"), + ("chat_bubble_outline", "chat_bubble_outline"), + ("check", "check"), + ("check_box", "check_box"), + ("check_box_outline_blank", "check_box_outline_blank"), + ("check_circle", "check_circle"), + ("chevron_left", "chevron_left"), + ("chevron_right", "chevron_right"), + ("child_care", "child_care"), + ("child_friendly", "child_friendly"), + ("chrome_reader_mode", "chrome_reader_mode"), + ("class", "class"), + ("clear", "clear"), + ("clear_all", "clear_all"), + ("close", "close"), + ("closed_caption", "closed_caption"), + ("cloud", "cloud"), + ("cloud_circle", "cloud_circle"), + ("cloud_done", "cloud_done"), + ("cloud_download", "cloud_download"), + ("cloud_off", "cloud_off"), + ("cloud_queue", "cloud_queue"), + ("cloud_upload", "cloud_upload"), + ("code", "code"), + ("collections", "collections"), + ("collections_bookmark", "collections_bookmark"), + ("color_lens", "color_lens"), + ("colorize", "colorize"), + ("comment", "comment"), + ("compare", "compare"), + ("compare_arrows", "compare_arrows"), + ("computer", "computer"), + ("confirmation_number", "confirmation_number"), + ("contact_mail", "contact_mail"), + ("contact_phone", "contact_phone"), + ("contacts", "contacts"), + ("content_copy", "content_copy"), + ("content_cut", "content_cut"), + ("content_paste", "content_paste"), + ("control_point", "control_point"), + ("control_point_duplicate", "control_point_duplicate"), + ("copyright", "copyright"), + ("create", "create"), + ("create_new_folder", "create_new_folder"), + ("credit_card", "credit_card"), + ("crop", "crop"), + ("crop_16_9", "crop_16_9"), + ("crop_3_2", "crop_3_2"), + ("crop_5_4", "crop_5_4"), + ("crop_7_5", "crop_7_5"), + ("crop_din", "crop_din"), + ("crop_free", "crop_free"), + ("crop_landscape", "crop_landscape"), + ("crop_original", "crop_original"), + ("crop_portrait", "crop_portrait"), + ("crop_rotate", "crop_rotate"), + ("crop_square", "crop_square"), + ("dashboard", "dashboard"), + ("data_usage", "data_usage"), + ("date_range", "date_range"), + ("dehaze", "dehaze"), + ("delete", "delete"), + ("delete_forever", "delete_forever"), + ("delete_sweep", "delete_sweep"), + ("description", "description"), + ("desktop_mac", "desktop_mac"), + ("desktop_windows", "desktop_windows"), + ("details", "details"), + ("developer_board", "developer_board"), + ("developer_mode", "developer_mode"), + ("device_hub", "device_hub"), + ("devices", "devices"), + ("devices_other", "devices_other"), + ("dialer_sip", "dialer_sip"), + ("dialpad", "dialpad"), + ("directions", "directions"), + ("directions_bike", "directions_bike"), + ("directions_boat", "directions_boat"), + ("directions_bus", "directions_bus"), + ("directions_car", "directions_car"), + ("directions_railway", "directions_railway"), + ("directions_run", "directions_run"), + ("directions_subway", "directions_subway"), + ("directions_transit", "directions_transit"), + ("directions_walk", "directions_walk"), + ("disc_full", "disc_full"), + ("dns", "dns"), + ("do_not_disturb", "do_not_disturb"), + ("do_not_disturb_alt", "do_not_disturb_alt"), + ("do_not_disturb_off", "do_not_disturb_off"), + ("do_not_disturb_on", "do_not_disturb_on"), + ("dock", "dock"), + ("domain", "domain"), + ("done", "done"), + ("done_all", "done_all"), + ("donut_large", "donut_large"), + ("donut_small", "donut_small"), + ("drafts", "drafts"), + ("drag_handle", "drag_handle"), + ("drive_eta", "drive_eta"), + ("dvr", "dvr"), + ("edit", "edit"), + ("edit_location", "edit_location"), + ("eject", "eject"), + ("email", "email"), + ("enhanced_encryption", "enhanced_encryption"), + ("equalizer", "equalizer"), + ("error", "error"), + ("error_outline", "error_outline"), + ("euro_symbol", "euro_symbol"), + ("ev_station", "ev_station"), + ("event", "event"), + ("event_available", "event_available"), + ("event_busy", "event_busy"), + ("event_note", "event_note"), + ("event_seat", "event_seat"), + ("exit_to_app", "exit_to_app"), + ("expand_less", "expand_less"), + ("expand_more", "expand_more"), + ("explicit", "explicit"), + ("explore", "explore"), + ("exposure", "exposure"), + ("exposure_neg_1", "exposure_neg_1"), + ("exposure_neg_2", "exposure_neg_2"), + ("exposure_plus_1", "exposure_plus_1"), + ("exposure_plus_2", "exposure_plus_2"), + ("exposure_zero", "exposure_zero"), + ("extension", "extension"), + ("face", "face"), + ("fast_forward", "fast_forward"), + ("fast_rewind", "fast_rewind"), + ("favorite", "favorite"), + ("favorite_border", "favorite_border"), + ("featured_play_list", "featured_play_list"), + ("featured_video", "featured_video"), + ("feedback", "feedback"), + ("fiber_dvr", "fiber_dvr"), + ("fiber_manual_record", "fiber_manual_record"), + ("fiber_new", "fiber_new"), + ("fiber_pin", "fiber_pin"), + ("fiber_smart_record", "fiber_smart_record"), + ("file_download", "file_download"), + ("file_upload", "file_upload"), + ("filter", "filter"), + ("filter_1", "filter_1"), + ("filter_2", "filter_2"), + ("filter_3", "filter_3"), + ("filter_4", "filter_4"), + ("filter_5", "filter_5"), + ("filter_6", "filter_6"), + ("filter_7", "filter_7"), + ("filter_8", "filter_8"), + ("filter_9", "filter_9"), + ("filter_9_plus", "filter_9_plus"), + ("filter_b_and_w", "filter_b_and_w"), + ("filter_center_focus", "filter_center_focus"), + ("filter_drama", "filter_drama"), + ("filter_frames", "filter_frames"), + ("filter_hdr", "filter_hdr"), + ("filter_list", "filter_list"), + ("filter_none", "filter_none"), + ("filter_tilt_shift", "filter_tilt_shift"), + ("filter_vintage", "filter_vintage"), + ("find_in_page", "find_in_page"), + ("find_replace", "find_replace"), + ("fingerprint", "fingerprint"), + ("first_page", "first_page"), + ("fitness_center", "fitness_center"), + ("flag", "flag"), + ("flare", "flare"), + ("flash_auto", "flash_auto"), + ("flash_off", "flash_off"), + ("flash_on", "flash_on"), + ("flight", "flight"), + ("flight_land", "flight_land"), + ("flight_takeoff", "flight_takeoff"), + ("flip", "flip"), + ("flip_to_back", "flip_to_back"), + ("flip_to_front", "flip_to_front"), + ("folder", "folder"), + ("folder_open", "folder_open"), + ("folder_shared", "folder_shared"), + ("folder_special", "folder_special"), + ("font_download", "font_download"), + ("format_align_center", "format_align_center"), + ("format_align_justify", "format_align_justify"), + ("format_align_left", "format_align_left"), + ("format_align_right", "format_align_right"), + ("format_bold", "format_bold"), + ("format_clear", "format_clear"), + ("format_color_fill", "format_color_fill"), + ("format_color_reset", "format_color_reset"), + ("format_color_text", "format_color_text"), + ("format_indent_decrease", "format_indent_decrease"), + ("format_indent_increase", "format_indent_increase"), + ("format_italic", "format_italic"), + ("format_line_spacing", "format_line_spacing"), + ("format_list_bulleted", "format_list_bulleted"), + ("format_list_numbered", "format_list_numbered"), + ("format_paint", "format_paint"), + ("format_quote", "format_quote"), + ("format_shapes", "format_shapes"), + ("format_size", "format_size"), + ("format_strikethrough", "format_strikethrough"), + ("format_textdirection_l_to_r", "format_textdirection_l_to_r"), + ("format_textdirection_r_to_l", "format_textdirection_r_to_l"), + ("format_underlined", "format_underlined"), + ("forum", "forum"), + ("forward", "forward"), + ("forward_10", "forward_10"), + ("forward_30", "forward_30"), + ("forward_5", "forward_5"), + ("free_breakfast", "free_breakfast"), + ("fullscreen", "fullscreen"), + ("fullscreen_exit", "fullscreen_exit"), + ("functions", "functions"), + ("g_translate", "g_translate"), + ("gamepad", "gamepad"), + ("games", "games"), + ("gavel", "gavel"), + ("gesture", "gesture"), + ("get_app", "get_app"), + ("gif", "gif"), + ("golf_course", "golf_course"), + ("gps_fixed", "gps_fixed"), + ("gps_not_fixed", "gps_not_fixed"), + ("gps_off", "gps_off"), + ("grade", "grade"), + ("gradient", "gradient"), + ("grain", "grain"), + ("graphic_eq", "graphic_eq"), + ("grid_off", "grid_off"), + ("grid_on", "grid_on"), + ("group", "group"), + ("group_add", "group_add"), + ("group_work", "group_work"), + ("hd", "hd"), + ("hdr_off", "hdr_off"), + ("hdr_on", "hdr_on"), + ("hdr_strong", "hdr_strong"), + ("hdr_weak", "hdr_weak"), + ("headset", "headset"), + ("headset_mic", "headset_mic"), + ("healing", "healing"), + ("hearing", "hearing"), + ("help", "help"), + ("help_outline", "help_outline"), + ("high_quality", "high_quality"), + ("highlight", "highlight"), + ("highlight_off", "highlight_off"), + ("history", "history"), + ("home", "home"), + ("hot_tub", "hot_tub"), + ("hotel", "hotel"), + ("hourglass_empty", "hourglass_empty"), + ("hourglass_full", "hourglass_full"), + ("http", "http"), + ("https", "https"), + ("image", "image"), + ("image_aspect_ratio", "image_aspect_ratio"), + ("import_contacts", "import_contacts"), + ("import_export", "import_export"), + ("important_devices", "important_devices"), + ("inbox", "inbox"), + ("indeterminate_check_box", "indeterminate_check_box"), + ("info", "info"), + ("info_outline", "info_outline"), + ("input", "input"), + ("insert_chart", "insert_chart"), + ("insert_comment", "insert_comment"), + ("insert_drive_file", "insert_drive_file"), + ("insert_emoticon", "insert_emoticon"), + ("insert_invitation", "insert_invitation"), + ("insert_link", "insert_link"), + ("insert_photo", "insert_photo"), + ("invert_colors", "invert_colors"), + ("invert_colors_off", "invert_colors_off"), + ("iso", "iso"), + ("keyboard", "keyboard"), + ("keyboard_arrow_down", "keyboard_arrow_down"), + ("keyboard_arrow_left", "keyboard_arrow_left"), + ("keyboard_arrow_right", "keyboard_arrow_right"), + ("keyboard_arrow_up", "keyboard_arrow_up"), + ("keyboard_backspace", "keyboard_backspace"), + ("keyboard_capslock", "keyboard_capslock"), + ("keyboard_hide", "keyboard_hide"), + ("keyboard_return", "keyboard_return"), + ("keyboard_tab", "keyboard_tab"), + ("keyboard_voice", "keyboard_voice"), + ("kitchen", "kitchen"), + ("label", "label"), + ("label_outline", "label_outline"), + ("landscape", "landscape"), + ("language", "language"), + ("laptop", "laptop"), + ("laptop_chromebook", "laptop_chromebook"), + ("laptop_mac", "laptop_mac"), + ("laptop_windows", "laptop_windows"), + ("last_page", "last_page"), + ("launch", "launch"), + ("layers", "layers"), + ("layers_clear", "layers_clear"), + ("leak_add", "leak_add"), + ("leak_remove", "leak_remove"), + ("lens", "lens"), + ("library_add", "library_add"), + ("library_books", "library_books"), + ("library_music", "library_music"), + ("lightbulb_outline", "lightbulb_outline"), + ("line_style", "line_style"), + ("line_weight", "line_weight"), + ("linear_scale", "linear_scale"), + ("link", "link"), + ("linked_camera", "linked_camera"), + ("list", "list"), + ("live_help", "live_help"), + ("live_tv", "live_tv"), + ("local_activity", "local_activity"), + ("local_airport", "local_airport"), + ("local_atm", "local_atm"), + ("local_bar", "local_bar"), + ("local_cafe", "local_cafe"), + ("local_car_wash", "local_car_wash"), + ("local_convenience_store", "local_convenience_store"), + ("local_dining", "local_dining"), + ("local_drink", "local_drink"), + ("local_florist", "local_florist"), + ("local_gas_station", "local_gas_station"), + ("local_grocery_store", "local_grocery_store"), + ("local_hospital", "local_hospital"), + ("local_hotel", "local_hotel"), + ("local_laundry_service", "local_laundry_service"), + ("local_library", "local_library"), + ("local_mall", "local_mall"), + ("local_movies", "local_movies"), + ("local_offer", "local_offer"), + ("local_parking", "local_parking"), + ("local_pharmacy", "local_pharmacy"), + ("local_phone", "local_phone"), + ("local_pizza", "local_pizza"), + ("local_play", "local_play"), + ("local_post_office", "local_post_office"), + ("local_printshop", "local_printshop"), + ("local_see", "local_see"), + ("local_shipping", "local_shipping"), + ("local_taxi", "local_taxi"), + ("location_city", "location_city"), + ("location_disabled", "location_disabled"), + ("location_off", "location_off"), + ("location_on", "location_on"), + ("location_searching", "location_searching"), + ("lock", "lock"), + ("lock_open", "lock_open"), + ("lock_outline", "lock_outline"), + ("looks", "looks"), + ("looks_3", "looks_3"), + ("looks_4", "looks_4"), + ("looks_5", "looks_5"), + ("looks_6", "looks_6"), + ("looks_one", "looks_one"), + ("looks_two", "looks_two"), + ("loop", "loop"), + ("loupe", "loupe"), + ("low_priority", "low_priority"), + ("loyalty", "loyalty"), + ("mail", "mail"), + ("mail_outline", "mail_outline"), + ("map", "map"), + ("markunread", "markunread"), + ("markunread_mailbox", "markunread_mailbox"), + ("memory", "memory"), + ("menu", "menu"), + ("merge_type", "merge_type"), + ("message", "message"), + ("mic", "mic"), + ("mic_none", "mic_none"), + ("mic_off", "mic_off"), + ("mms", "mms"), + ("mode_comment", "mode_comment"), + ("mode_edit", "mode_edit"), + ("monetization_on", "monetization_on"), + ("money_off", "money_off"), + ("monochrome_photos", "monochrome_photos"), + ("mood", "mood"), + ("mood_bad", "mood_bad"), + ("more", "more"), + ("more_horiz", "more_horiz"), + ("more_vert", "more_vert"), + ("motorcycle", "motorcycle"), + ("mouse", "mouse"), + ("move_to_inbox", "move_to_inbox"), + ("movie", "movie"), + ("movie_creation", "movie_creation"), + ("movie_filter", "movie_filter"), + ("multiline_chart", "multiline_chart"), + ("music_note", "music_note"), + ("music_video", "music_video"), + ("my_location", "my_location"), + ("nature", "nature"), + ("nature_people", "nature_people"), + ("navigate_before", "navigate_before"), + ("navigate_next", "navigate_next"), + ("navigation", "navigation"), + ("near_me", "near_me"), + ("network_cell", "network_cell"), + ("network_check", "network_check"), + ("network_locked", "network_locked"), + ("network_wifi", "network_wifi"), + ("new_releases", "new_releases"), + ("next_week", "next_week"), + ("nfc", "nfc"), + ("no_encryption", "no_encryption"), + ("no_sim", "no_sim"), + ("not_interested", "not_interested"), + ("note", "note"), + ("note_add", "note_add"), + ("notifications", "notifications"), + ("notifications_active", "notifications_active"), + ("notifications_none", "notifications_none"), + ("notifications_off", "notifications_off"), + ("notifications_paused", "notifications_paused"), + ("offline_pin", "offline_pin"), + ("ondemand_video", "ondemand_video"), + ("opacity", "opacity"), + ("open_in_browser", "open_in_browser"), + ("open_in_new", "open_in_new"), + ("open_with", "open_with"), + ("pages", "pages"), + ("pageview", "pageview"), + ("palette", "palette"), + ("pan_tool", "pan_tool"), + ("panorama", "panorama"), + ("panorama_fish_eye", "panorama_fish_eye"), + ("panorama_horizontal", "panorama_horizontal"), + ("panorama_vertical", "panorama_vertical"), + ("panorama_wide_angle", "panorama_wide_angle"), + ("party_mode", "party_mode"), + ("pause", "pause"), + ("pause_circle_filled", "pause_circle_filled"), + ("pause_circle_outline", "pause_circle_outline"), + ("payment", "payment"), + ("people", "people"), + ("people_outline", "people_outline"), + ("perm_camera_mic", "perm_camera_mic"), + ("perm_contact_calendar", "perm_contact_calendar"), + ("perm_data_setting", "perm_data_setting"), + ("perm_device_information", "perm_device_information"), + ("perm_identity", "perm_identity"), + ("perm_media", "perm_media"), + ("perm_phone_msg", "perm_phone_msg"), + ("perm_scan_wifi", "perm_scan_wifi"), + ("person", "person"), + ("person_add", "person_add"), + ("person_outline", "person_outline"), + ("person_pin", "person_pin"), + ("person_pin_circle", "person_pin_circle"), + ("personal_video", "personal_video"), + ("pets", "pets"), + ("phone", "phone"), + ("phone_android", "phone_android"), + ("phone_bluetooth_speaker", "phone_bluetooth_speaker"), + ("phone_forwarded", "phone_forwarded"), + ("phone_in_talk", "phone_in_talk"), + ("phone_iphone", "phone_iphone"), + ("phone_locked", "phone_locked"), + ("phone_missed", "phone_missed"), + ("phone_paused", "phone_paused"), + ("phonelink", "phonelink"), + ("phonelink_erase", "phonelink_erase"), + ("phonelink_lock", "phonelink_lock"), + ("phonelink_off", "phonelink_off"), + ("phonelink_ring", "phonelink_ring"), + ("phonelink_setup", "phonelink_setup"), + ("photo", "photo"), + ("photo_album", "photo_album"), + ("photo_camera", "photo_camera"), + ("photo_filter", "photo_filter"), + ("photo_library", "photo_library"), + ("photo_size_select_actual", "photo_size_select_actual"), + ("photo_size_select_large", "photo_size_select_large"), + ("photo_size_select_small", "photo_size_select_small"), + ("picture_as_pdf", "picture_as_pdf"), + ("picture_in_picture", "picture_in_picture"), + ("picture_in_picture_alt", "picture_in_picture_alt"), + ("pie_chart", "pie_chart"), + ("pie_chart_outlined", "pie_chart_outlined"), + ("pin_drop", "pin_drop"), + ("place", "place"), + ("play_arrow", "play_arrow"), + ("play_circle_filled", "play_circle_filled"), + ("play_circle_outline", "play_circle_outline"), + ("play_for_work", "play_for_work"), + ("playlist_add", "playlist_add"), + ("playlist_add_check", "playlist_add_check"), + ("playlist_play", "playlist_play"), + ("plus_one", "plus_one"), + ("poll", "poll"), + ("polymer", "polymer"), + ("pool", "pool"), + ("portable_wifi_off", "portable_wifi_off"), + ("portrait", "portrait"), + ("power", "power"), + ("power_input", "power_input"), + ("power_settings_new", "power_settings_new"), + ("pregnant_woman", "pregnant_woman"), + ("present_to_all", "present_to_all"), + ("print", "print"), + ("priority_high", "priority_high"), + ("public", "public"), + ("publish", "publish"), + ("query_builder", "query_builder"), + ("question_answer", "question_answer"), + ("queue", "queue"), + ("queue_music", "queue_music"), + ("queue_play_next", "queue_play_next"), + ("radio", "radio"), + ("radio_button_checked", "radio_button_checked"), + ("radio_button_unchecked", "radio_button_unchecked"), + ("rate_review", "rate_review"), + ("receipt", "receipt"), + ("recent_actors", "recent_actors"), + ("record_voice_over", "record_voice_over"), + ("redeem", "redeem"), + ("redo", "redo"), + ("refresh", "refresh"), + ("remove", "remove"), + ("remove_circle", "remove_circle"), + ("remove_circle_outline", "remove_circle_outline"), + ("remove_from_queue", "remove_from_queue"), + ("remove_red_eye", "remove_red_eye"), + ("remove_shopping_cart", "remove_shopping_cart"), + ("reorder", "reorder"), + ("repeat", "repeat"), + ("repeat_one", "repeat_one"), + ("replay", "replay"), + ("replay_10", "replay_10"), + ("replay_30", "replay_30"), + ("replay_5", "replay_5"), + ("reply", "reply"), + ("reply_all", "reply_all"), + ("report", "report"), + ("report_problem", "report_problem"), + ("restaurant", "restaurant"), + ("restaurant_menu", "restaurant_menu"), + ("restore", "restore"), + ("restore_page", "restore_page"), + ("ring_volume", "ring_volume"), + ("room", "room"), + ("room_service", "room_service"), + ("rotate_90_degrees_ccw", "rotate_90_degrees_ccw"), + ("rotate_left", "rotate_left"), + ("rotate_right", "rotate_right"), + ("rounded_corner", "rounded_corner"), + ("router", "router"), + ("rowing", "rowing"), + ("rss_feed", "rss_feed"), + ("rv_hookup", "rv_hookup"), + ("satellite", "satellite"), + ("save", "save"), + ("scanner", "scanner"), + ("schedule", "schedule"), + ("school", "school"), + ("screen_lock_landscape", "screen_lock_landscape"), + ("screen_lock_portrait", "screen_lock_portrait"), + ("screen_lock_rotation", "screen_lock_rotation"), + ("screen_rotation", "screen_rotation"), + ("screen_share", "screen_share"), + ("sd_card", "sd_card"), + ("sd_storage", "sd_storage"), + ("search", "search"), + ("security", "security"), + ("select_all", "select_all"), + ("send", "send"), + ("sentiment_dissatisfied", "sentiment_dissatisfied"), + ("sentiment_neutral", "sentiment_neutral"), + ("sentiment_satisfied", "sentiment_satisfied"), + ("sentiment_very_dissatisfied", "sentiment_very_dissatisfied"), + ("sentiment_very_satisfied", "sentiment_very_satisfied"), + ("settings", "settings"), + ("settings_applications", "settings_applications"), + ("settings_backup_restore", "settings_backup_restore"), + ("settings_bluetooth", "settings_bluetooth"), + ("settings_brightness", "settings_brightness"), + ("settings_cell", "settings_cell"), + ("settings_ethernet", "settings_ethernet"), + ("settings_input_antenna", "settings_input_antenna"), + ("settings_input_component", "settings_input_component"), + ("settings_input_composite", "settings_input_composite"), + ("settings_input_hdmi", "settings_input_hdmi"), + ("settings_input_svideo", "settings_input_svideo"), + ("settings_overscan", "settings_overscan"), + ("settings_phone", "settings_phone"), + ("settings_power", "settings_power"), + ("settings_remote", "settings_remote"), + ("settings_system_daydream", "settings_system_daydream"), + ("settings_voice", "settings_voice"), + ("share", "share"), + ("shop", "shop"), + ("shop_two", "shop_two"), + ("shopping_basket", "shopping_basket"), + ("shopping_cart", "shopping_cart"), + ("short_text", "short_text"), + ("show_chart", "show_chart"), + ("shuffle", "shuffle"), + ("signal_cellular_4_bar", "signal_cellular_4_bar"), + ("signal_cellular_connected_no_internet_4_bar", "signal_cellular_connected_no_internet_4_bar"), + ("signal_cellular_no_sim", "signal_cellular_no_sim"), + ("signal_cellular_null", "signal_cellular_null"), + ("signal_cellular_off", "signal_cellular_off"), + ("signal_wifi_4_bar", "signal_wifi_4_bar"), + ("signal_wifi_4_bar_lock", "signal_wifi_4_bar_lock"), + ("signal_wifi_off", "signal_wifi_off"), + ("sim_card", "sim_card"), + ("sim_card_alert", "sim_card_alert"), + ("skip_next", "skip_next"), + ("skip_previous", "skip_previous"), + ("slideshow", "slideshow"), + ("slow_motion_video", "slow_motion_video"), + ("smartphone", "smartphone"), + ("smoke_free", "smoke_free"), + ("smoking_rooms", "smoking_rooms"), + ("sms", "sms"), + ("sms_failed", "sms_failed"), + ("snooze", "snooze"), + ("sort", "sort"), + ("sort_by_alpha", "sort_by_alpha"), + ("spa", "spa"), + ("space_bar", "space_bar"), + ("speaker", "speaker"), + ("speaker_group", "speaker_group"), + ("speaker_notes", "speaker_notes"), + ("speaker_notes_off", "speaker_notes_off"), + ("speaker_phone", "speaker_phone"), + ("spellcheck", "spellcheck"), + ("star", "star"), + ("star_border", "star_border"), + ("star_half", "star_half"), + ("stars", "stars"), + ("stay_current_landscape", "stay_current_landscape"), + ("stay_current_portrait", "stay_current_portrait"), + ("stay_primary_landscape", "stay_primary_landscape"), + ("stay_primary_portrait", "stay_primary_portrait"), + ("stop", "stop"), + ("stop_screen_share", "stop_screen_share"), + ("storage", "storage"), + ("store", "store"), + ("store_mall_directory", "store_mall_directory"), + ("straighten", "straighten"), + ("streetview", "streetview"), + ("strikethrough_s", "strikethrough_s"), + ("style", "style"), + ("subdirectory_arrow_left", "subdirectory_arrow_left"), + ("subdirectory_arrow_right", "subdirectory_arrow_right"), + ("subject", "subject"), + ("subscriptions", "subscriptions"), + ("subtitles", "subtitles"), + ("subway", "subway"), + ("supervisor_account", "supervisor_account"), + ("surround_sound", "surround_sound"), + ("swap_calls", "swap_calls"), + ("swap_horiz", "swap_horiz"), + ("swap_vert", "swap_vert"), + ("swap_vertical_circle", "swap_vertical_circle"), + ("switch_camera", "switch_camera"), + ("switch_video", "switch_video"), + ("sync", "sync"), + ("sync_disabled", "sync_disabled"), + ("sync_problem", "sync_problem"), + ("system_update", "system_update"), + ("system_update_alt", "system_update_alt"), + ("tab", "tab"), + ("tab_unselected", "tab_unselected"), + ("tablet", "tablet"), + ("tablet_android", "tablet_android"), + ("tablet_mac", "tablet_mac"), + ("tag_faces", "tag_faces"), + ("tap_and_play", "tap_and_play"), + ("terrain", "terrain"), + ("text_fields", "text_fields"), + ("text_format", "text_format"), + ("textsms", "textsms"), + ("texture", "texture"), + ("theaters", "theaters"), + ("thumb_down", "thumb_down"), + ("thumb_up", "thumb_up"), + ("thumbs_up_down", "thumbs_up_down"), + ("time_to_leave", "time_to_leave"), + ("timelapse", "timelapse"), + ("timeline", "timeline"), + ("timer", "timer"), + ("timer_10", "timer_10"), + ("timer_3", "timer_3"), + ("timer_off", "timer_off"), + ("title", "title"), + ("toc", "toc"), + ("today", "today"), + ("toll", "toll"), + ("tonality", "tonality"), + ("touch_app", "touch_app"), + ("toys", "toys"), + ("track_changes", "track_changes"), + ("traffic", "traffic"), + ("train", "train"), + ("tram", "tram"), + ("transfer_within_a_station", "transfer_within_a_station"), + ("transform", "transform"), + ("translate", "translate"), + ("trending_down", "trending_down"), + ("trending_flat", "trending_flat"), + ("trending_up", "trending_up"), + ("tune", "tune"), + ("turned_in", "turned_in"), + ("turned_in_not", "turned_in_not"), + ("tv", "tv"), + ("unarchive", "unarchive"), + ("undo", "undo"), + ("unfold_less", "unfold_less"), + ("unfold_more", "unfold_more"), + ("update", "update"), + ("usb", "usb"), + ("verified_user", "verified_user"), + ("vertical_align_bottom", "vertical_align_bottom"), + ("vertical_align_center", "vertical_align_center"), + ("vertical_align_top", "vertical_align_top"), + ("vibration", "vibration"), + ("video_call", "video_call"), + ("video_label", "video_label"), + ("video_library", "video_library"), + ("videocam", "videocam"), + ("videocam_off", "videocam_off"), + ("videogame_asset", "videogame_asset"), + ("view_agenda", "view_agenda"), + ("view_array", "view_array"), + ("view_carousel", "view_carousel"), + ("view_column", "view_column"), + ("view_comfy", "view_comfy"), + ("view_compact", "view_compact"), + ("view_day", "view_day"), + ("view_headline", "view_headline"), + ("view_list", "view_list"), + ("view_module", "view_module"), + ("view_quilt", "view_quilt"), + ("view_stream", "view_stream"), + ("view_week", "view_week"), + ("vignette", "vignette"), + ("visibility", "visibility"), + ("visibility_off", "visibility_off"), + ("voice_chat", "voice_chat"), + ("voicemail", "voicemail"), + ("volume_down", "volume_down"), + ("volume_mute", "volume_mute"), + ("volume_off", "volume_off"), + ("volume_up", "volume_up"), + ("vpn_key", "vpn_key"), + ("vpn_lock", "vpn_lock"), + ("wallpaper", "wallpaper"), + ("warning", "warning"), + ("watch", "watch"), + ("watch_later", "watch_later"), + ("wb_auto", "wb_auto"), + ("wb_cloudy", "wb_cloudy"), + ("wb_incandescent", "wb_incandescent"), + ("wb_iridescent", "wb_iridescent"), + ("wb_sunny", "wb_sunny"), + ("wc", "wc"), + ("web", "web"), + ("web_asset", "web_asset"), + ("weekend", "weekend"), + ("whatshot", "whatshot"), + ("widgets", "widgets"), + ("wifi", "wifi"), + ("wifi_lock", "wifi_lock"), + ("wifi_tethering", "wifi_tethering"), + ("work", "work"), + ("wrap_text", "wrap_text"), + ("youtube_searched_for", "youtube_searched_for"), + ("zoom_in", "zoom_in"), + ("zoom_out", "zoom_out"), + ("zoom_out_map", "zoom_out_map"), +] diff --git a/aleksis/core/util/notifications.py b/aleksis/core/util/notifications.py index 5f6f8fded9a00323b2695e27268d4d4a744c0525..7f309d1cc2e0a0a046334683f5e2100f28fdae2c 100644 --- a/aleksis/core/util/notifications.py +++ b/aleksis/core/util/notifications.py @@ -68,7 +68,6 @@ _CHANNELS_MAP = { } -@celery_optional def send_notification(notification: Union[int, "Notification"], resend: bool = False) -> None: """ Send a notification through enabled channels. diff --git a/aleksis/core/util/search.py b/aleksis/core/util/search.py new file mode 100644 index 0000000000000000000000000000000000000000..6720fb6b4236f10d3bfb1932969483d4d4db6d8f --- /dev/null +++ b/aleksis/core/util/search.py @@ -0,0 +1,23 @@ +from django.conf import settings + +from haystack import indexes + +# Not used here, but simplifies imports for apps +Indexable = indexes.Indexable # noqa + +if settings.HAYSTACK_SIGNAL_PROCESSOR == 'celery_haystack.signals.CelerySignalProcessor': + from haystack.indexes import SearchIndex as BaseSearchIndex +else: + from celery_haystack.indexes import CelerySearchIndex as BaseSearchIndex + +class SearchIndex(BaseSearchIndex): + """ Base class for search indexes on AlekSIS models + + It provides a default document field caleld text and exects + the related model in the model attribute. + """ + + text = indexes.EdgeNgramField(document=True, use_template=True) + + def get_model(self): + return self.model diff --git a/aleksis/core/views.py b/aleksis/core/views.py index 6391a23638aa76aaf18d29348313f95753b6c727..29301905d20871c77dd8395291b44eb089d7a449 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -5,9 +5,11 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.http import Http404, HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, render -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_tables2 import RequestConfig +from haystack.inputs import AutoQuery +from haystack.query import SearchQuerySet from .decorators import admin_required, person_required from .forms import ( @@ -16,8 +18,9 @@ from .forms import ( EditSchoolForm, EditTermForm, PersonsAccountsFormSet, + AnnouncementForm, ) -from .models import Activity, Group, Notification, Person, School, DashboardWidget +from .models import Activity, Group, Notification, Person, School, DashboardWidget, Announcement from .tables import GroupsTable, PersonsTable from .util import messages from .util.core_helpers import get_app_licence_information @@ -35,7 +38,14 @@ def index(request: HttpRequest) -> HttpResponse: context["notifications"] = notifications context["unread_notifications"] = unread_notifications - context["widgets"] = DashboardWidget.objects.filter(active=True) + announcements = Announcement.objects.at_time().for_person(request.user.person) + context["announcements"] = announcements + + widgets = DashboardWidget.objects.filter(active=True) + media = DashboardWidget.get_media(widgets) + + context["widgets"] = widgets + context["media"] = media return render(request, "core/index.html", context) @@ -68,12 +78,15 @@ def persons(request: HttpRequest) -> HttpResponse: @login_required -def person(request: HttpRequest, id_: int) -> HttpResponse: +def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: context = {} # Get person and check access try: - person = Person.objects.get(pk=id_) + if id_ is None: + person = request.user.person + else: + person = Person.objects.get(pk=id_) except Person.DoesNotExist as e: # Turn not-found object into a 404 error raise Http404 from e @@ -81,7 +94,7 @@ def person(request: HttpRequest, id_: int) -> HttpResponse: context["person"] = person # Get groups where person is member of - groups = Group.objects.filter(members=id_) + groups = Group.objects.filter(members=person) # Build table groups_table = GroupsTable(groups) @@ -274,3 +287,62 @@ def notification_mark_read(request: HttpRequest, id_: int) -> HttpResponse: raise PermissionDenied(_("You are not allowed to mark notifications from other users as read!")) return redirect("index") + + +@admin_required +def announcements(request: HttpRequest) -> HttpResponse: + context = {} + + # Get all persons + announcements = Announcement.objects.all() + context["announcements"] = announcements + + return render(request, "core/announcement/list.html", context) + + +@admin_required +def announcement_form(request: HttpRequest, pk: Optional[int] = None) -> HttpResponse: + context = {} + + if pk: + announcement = get_object_or_404(Announcement, pk=pk) + form = AnnouncementForm( + request.POST or None, + instance=announcement + ) + context["mode"] = "edit" + else: + form = AnnouncementForm(request.POST or None) + context["mode"] = "add" + + if request.method == "POST": + if form.is_valid(): + form.save() + + messages.success(request, _("The announcement has been saved.")) + return redirect("announcements") + + context["form"] = form + + return render(request, "core/announcement/form.html", context) + + +@admin_required +def delete_announcement(request: HttpRequest, pk: int) -> HttpResponse: + if request.method == "POST": + announcement = get_object_or_404(Announcement, pk=pk) + announcement.delete() + messages.success(request, _("The announcement has been deleted.")) + + return redirect("announcements") + + +@login_required +def searchbar_snippets(request: HttpRequest) -> HttpResponse: + query = request.GET.get('q', '') + limit = int(request.GET.get('limit', '5')) + + results = SearchQuerySet().filter(text=AutoQuery(query))[:limit] + context = {"results": results} + + return render(request, "search/searchbar_snippets.html", context) diff --git a/apps/official/AlekSIS-App-Alsijil b/apps/official/AlekSIS-App-Alsijil deleted file mode 160000 index f2864132ab58b3d171049fd23679c84a68573e4b..0000000000000000000000000000000000000000 --- a/apps/official/AlekSIS-App-Alsijil +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f2864132ab58b3d171049fd23679c84a68573e4b diff --git a/apps/official/AlekSIS-App-Chronos b/apps/official/AlekSIS-App-Chronos index 0e9264b3e366f8e36c606601668a5a4b86411e45..6b05dfc0613ff143fa292aa67eb349c90439d7ee 160000 --- a/apps/official/AlekSIS-App-Chronos +++ b/apps/official/AlekSIS-App-Chronos @@ -1 +1 @@ -Subproject commit 0e9264b3e366f8e36c606601668a5a4b86411e45 +Subproject commit 6b05dfc0613ff143fa292aa67eb349c90439d7ee diff --git a/apps/official/AlekSIS-App-DashboardFeeds b/apps/official/AlekSIS-App-DashboardFeeds index 19bbfa0f5fbf5b5cad38b8c4d80d782dde67106f..894dc89ac4fd4f6c33b51020288eabe9b6169256 160000 --- a/apps/official/AlekSIS-App-DashboardFeeds +++ b/apps/official/AlekSIS-App-DashboardFeeds @@ -1 +1 @@ -Subproject commit 19bbfa0f5fbf5b5cad38b8c4d80d782dde67106f +Subproject commit 894dc89ac4fd4f6c33b51020288eabe9b6169256 diff --git a/apps/official/AlekSIS-App-Exlibris b/apps/official/AlekSIS-App-Exlibris index 5feea48c37a1b49a1ba676aa124a2d28f6638427..736a7ea53be4e0fa7de7bf3dd66cd47965e36bed 160000 --- a/apps/official/AlekSIS-App-Exlibris +++ b/apps/official/AlekSIS-App-Exlibris @@ -1 +1 @@ -Subproject commit 5feea48c37a1b49a1ba676aa124a2d28f6638427 +Subproject commit 736a7ea53be4e0fa7de7bf3dd66cd47965e36bed diff --git a/apps/official/AlekSIS-App-LDAP b/apps/official/AlekSIS-App-LDAP new file mode 160000 index 0000000000000000000000000000000000000000..c0bc552d9a7e04560b54c261b5e8d690958d2968 --- /dev/null +++ b/apps/official/AlekSIS-App-LDAP @@ -0,0 +1 @@ +Subproject commit c0bc552d9a7e04560b54c261b5e8d690958d2968 diff --git a/dev.sh b/dev.sh index a9bae65132dd9c9d48ac8a38f67053e4af476886..ffe8aee433c1e1bcd93ba229bedea74b8e6dc86d 100755 --- a/dev.sh +++ b/dev.sh @@ -25,7 +25,7 @@ case "$1" in "makemessages") cd "$(dirname "$0")" manage_py=$(realpath manage.py) - locales="-l ar -l de_DE -l fr -l nb_NO -l tr_TR" + locales="-l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la" for d in aleksis/core apps/official/*/aleksis/apps/*; do echo; echo "Entering $d." poetry run sh -c "cd $d; $manage_py makemessages --no-wrap -i static $locales" @@ -53,7 +53,7 @@ case "$1" in "gource") for d in . apps/official/*; do gource --output-custom-log - "$d" - done | sort -n | gource --log-format custom --background-image aleksis/core/static/img/aleksis-logo.png - + done | sort -n | gource --log-format custom --background-image aleksis/core/static/img/aleksis-icon.png - exit ;; diff --git a/docker-compose.yml b/docker-compose.yml index f2348e385604e66f444e51e0789d9c4bffcebfb7..56d9d1edb57546360eaf73a18d2a95097b950288 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,22 +12,57 @@ services: image: memcached:latest app: build: . - image: registry.edugit.org/aleksis/aleksis:${ALEKSIS_IMAGE_TAG:-latest} + image: registry.edugit.org/aleksis/official/aleksis:${ALEKSIS_IMAGE_TAG:-latest} volumes: - aleksis_data:/var/lib/aleksis/ + - aleksis_static:/usr/share/aleksis/static/ environment: - ALEKSIS_http__allowed_hosts="['*']" - ALEKSIS_caching__memcached__address=memcached:11211 + - ALEKSIS_caching__memcached__enabled=true - ALEKSIS_database__host=db - ALEKSIS_maintenance__debug=${ALEKSIS_maintenance__debug:-false} + - ALEKSIS_backup__location=/var/lib/aleksis/backups depends_on: - db - memcached + worker: + build: . + image: registry.edugit.org/aleksis/official/aleksis:${ALEKSIS_IMAGE_TAG:-latest} + volumes: + - aleksis_data:/var/lib/aleksis/ + - aleksis_static:/usr/share/aleksis/static/ + command: celery_worker + environment: + - ALEKSIS_http__allowed_hosts="['*']" + - ALEKSIS_caching__memcached__address=memcached:11211 + - ALEKSIS_caching__memcached__enabled=true + - ALEKSIS_database__host=db + - ALEKSIS_maintenance__debug=${ALEKSIS_maintenance__debug:-false} + - ALEKSIS_backup__location=/var/lib/aleksis/backups + depends_on: + - app + scheduler: + build: . + image: registry.edugit.org/aleksis/official/aleksis:${ALEKSIS_IMAGE_TAG:-latest} + volumes: + - aleksis_data:/var/lib/aleksis/ + - aleksis_static:/usr/share/aleksis/static/ + command: celery_beat + environment: + - ALEKSIS_http__allowed_hosts="['*']" + - ALEKSIS_caching__memcached__address=memcached:11211 + - ALEKSIS_caching__memcached__enabled=true + - ALEKSIS_database__host=db + - ALEKSIS_maintenance__debug=${ALEKSIS_maintenance__debug:-false} + depends_on: + - worker web: build: ./docker/nginx - image: registry.edugit.org/aleksis/aleksis/nginx:${ALEKSIS_IMAGE_TAG:-latest} + image: registry.edugit.org/aleksis/official/aleksis/nginx:${ALEKSIS_IMAGE_TAG:-latest} volumes: - aleksis_data:/var/lib/aleksis/ + - aleksis_static:/usr/share/aleksis/static/:ro ports: - ${NGINX_HTTP_PORT:-8080}:80 depends_on: @@ -36,3 +71,4 @@ services: volumes: postgres_data: aleksis_data: + aleksis_static: diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index bb5eca2a1b901797ef2cbaa7f4d4ff2670ef9811..8c9c64e55abb848ae6d67d42f99e5434f9916a94 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -17,10 +17,16 @@ while ! nc -z $ALEKSIS_database__host $ALEKSIS_database__port; do sleep 0.1 done +python manage.py compilescss +python manage.py collectstatic --no-input --clear python manage.py migrate -if [[ -n "$@" ]]; then - exec "$@" +ARG=${$1:-"gunicorn"} + +if [ $ARG = "celery_worker" ]; then + exec celery -A aleksis.core worker -l info +elif [ $ARG = "celery_beat" ]; then + exec celery -A aleksis.core beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler else exec gunicorn aleksis.core.wsgi --bind ${GUNICORN_BIND} fi diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf index 49c1f9a7573fc5e5cf60c85dc6b5d87cc3744e2f..759f385041ce7bd7dc06b487ff2dfb2c43635482 100644 --- a/docker/nginx/nginx.conf +++ b/docker/nginx/nginx.conf @@ -5,6 +5,14 @@ upstream aleksis { server { listen 80; + location /media/ { + alias /var/lib/aleksis/media/; + } + + location /static/ { + alias /usr/share/aleksis/static/; + } + location / { proxy_pass http://aleksis; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -12,7 +20,4 @@ server { proxy_redirect off; } - location /media/ { - alias /var/lib/aleksis/media/; - } } diff --git a/docs/conf.py b/docs/conf.py index 41bf9587177ccec3a10fd1242a9eadd791cc442c..24652c53867fe91709e0616105cb54f2fd88f59e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,13 +24,13 @@ django.setup() # -- Project information ----------------------------------------------------- project = 'AlekSIS' -copyright = '2019, AlekSIS team @ Teckids e.V.' -author = 'AlekSIS team @ Teckids e.V.' +copyright = '2019, 2020, AlekSIS team' +author = 'AlekSIS team' # The short X.Y version -version = '1.0' +version = '2.0' # The full version, including alpha/beta/rc tags -release = '1.0dev0' +release = '2.0a1' # -- General configuration --------------------------------------------------- @@ -138,7 +138,7 @@ latex_elements = { # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, 'AlekSIS.tex', 'AlekSIS Documentation', - 'AlekSIS team @ Teckids e.V.', 'manual'), + 'AlekSIS team', 'manual'), ] diff --git a/poetry.lock b/poetry.lock index 92e5c2e738113542002e6e31a17c5a1be7ad08c0..591849c3413c4492ebc30c577f706574f7c8470a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -30,8 +30,8 @@ category = "main" description = "ASGI specs, helper code, and adapters" name = "asgiref" optional = false -python-versions = "*" -version = "3.2.3" +python-versions = ">=3.5" +version = "3.2.7" [package.extras] tests = ["pytest (>=4.3.0,<4.4.0)", "pytest-asyncio (>=0.10.0,<0.11.0)"] @@ -91,10 +91,10 @@ description = "Screen-scraping library" name = "beautifulsoup4" optional = false python-versions = "*" -version = "4.8.2" +version = "4.9.0" [package.dependencies] -soupsieve = ">=1.2" +soupsieve = [">1.2", "<2.0"] [package.extras] html5lib = ["html5lib"] @@ -106,7 +106,7 @@ description = "Python multiprocessing fork with improvements and bugfixes" name = "billiard" optional = true python-versions = "*" -version = "3.6.1.0" +version = "3.6.3.0" [[package]] category = "dev" @@ -128,6 +128,18 @@ typed-ast = ">=1.4.0" [package.extras] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +[[package]] +category = "main" +description = "An easy safelist-based HTML-sanitizing tool." +name = "bleach" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "3.1.4" + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + [[package]] category = "main" description = "Utilities for working with calendar weeks in Python and Django" @@ -145,11 +157,11 @@ description = "Distributed Task Queue." name = "celery" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*," -version = "4.4.0" +version = "4.4.2" [package.dependencies] -billiard = ">=3.6.1,<4.0" -kombu = ">=4.6.7,<4.7" +billiard = ">=3.6.3.0,<4.0" +kombu = ">=4.6.8,<4.7" pytz = ">0.0-dev" vine = "1.3.0" @@ -189,7 +201,7 @@ s3 = ["boto3 (>=1.9.125)"] slmq = ["softlayer-messaging (>=1.0.3)"] solar = ["ephem"] sqlalchemy = ["sqlalchemy"] -sqs = ["boto3 (>=1.9.125)", "pycurl"] +sqs = ["boto3 (>=1.9.125)", "pycurl (7.43.0.2)"] tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=1.3.1)"] @@ -201,7 +213,7 @@ description = "Python package for providing Mozilla's CA Bundle." name = "certifi" optional = false python-versions = "*" -version = "2019.11.28" +version = "2020.4.5.1" [[package]] category = "main" @@ -216,8 +228,8 @@ category = "main" description = "Composable command line interface toolkit" name = "click" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "7.0" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "7.1.1" [[package]] category = "main" @@ -256,11 +268,19 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.0.3" +version = "5.1" [package.extras] toml = ["toml"] +[[package]] +category = "dev" +description = "Distribution utilities" +name = "distlib" +optional = false +python-versions = "*" +version = "0.3.0" + [[package]] category = "dev" description = "Use Database URLs in your Django Application." @@ -275,7 +295,7 @@ description = "A high-level Python Web framework that encourages rapid developme name = "django" optional = false python-versions = ">=3.6" -version = "3.0.2" +version = "3.0.5" [package.dependencies] asgiref = ">=3.2,<4.0" @@ -303,11 +323,10 @@ description = "A helper class for handling configuration defaults of packaged ap name = "django-appconf" optional = false python-versions = "*" -version = "1.0.3" +version = "1.0.4" [package.dependencies] django = "*" -six = "*" [[package]] category = "main" @@ -315,7 +334,7 @@ description = "Django LDAP authentication backend." name = "django-auth-ldap" optional = true python-versions = ">=3.5" -version = "2.1.0" +version = "2.1.1" [package.dependencies] Django = ">=1.11" @@ -323,14 +342,15 @@ python-ldap = ">=3.1" [[package]] category = "main" -description = "Bootstrap support for Django projects" -name = "django-bootstrap4" +description = "Easily use bleach with Django models and templates" +name = "django-bleach" optional = false python-versions = "*" -version = "1.1.1" +version = "0.6.1" [package.dependencies] -beautifulsoup4 = "*" +Django = ">=1.11" +bleach = ">=1.5.0" [[package]] category = "main" @@ -349,10 +369,12 @@ description = "Database-backed Periodic Tasks." name = "django-celery-beat" optional = true python-versions = "*" -version = "1.5.0" +version = "2.0.0" [package.dependencies] -django-timezone-field = ">=2.0" +Django = ">=1.11.17" +celery = "*" +django-timezone-field = ">=4.0,<5.0" python-crontab = ">=2.3.4" [[package]] @@ -374,10 +396,10 @@ description = "Celery result backends for Django." name = "django-celery-results" optional = true python-versions = "*" -version = "1.1.2" +version = "1.2.1" [package.dependencies] -celery = ">=4.3,<5.0" +celery = ">=4.4,<5.0" [[package]] category = "main" @@ -390,6 +412,14 @@ version = "5.9.0" [package.dependencies] django-js-asset = ">=1.2.2" +[[package]] +category = "main" +description = "simple color field for your models with a nice color-picker in the admin-interface." +name = "django-colorfield" +optional = false +python-versions = "*" +version = "0.2.2" + [[package]] category = "main" description = "Django live settings with pluggable backends, including Redis." @@ -425,7 +455,7 @@ description = "Yet another Django audit log app, hopefully the simplest one." name = "django-easy-audit" optional = false python-versions = "*" -version = "1.2.1rc1" +version = "1.2.2b4" [package.dependencies] beautifulsoup4 = "*" @@ -472,8 +502,8 @@ category = "main" description = "A reusable app for cropping images easily and non-destructively in Django" name = "django-image-cropping" optional = false -python-versions = "*" -version = "1.3.0" +python-versions = ">=3.5" +version = "1.4.0" [package.dependencies] django-appconf = ">=1.0.2" @@ -484,7 +514,7 @@ description = "Django app to allow superusers to impersonate other users." name = "django-impersonate" optional = false python-versions = "*" -version = "1.4.1" +version = "1.5" [[package]] category = "main" @@ -539,11 +569,22 @@ description = "Material design for django forms and admin" name = "django-material" optional = false python-versions = "*" -version = "1.6.0" +version = "1.6.3" [package.dependencies] six = "*" +[[package]] +category = "main" +description = "An implementation of memoization technique for Django." +name = "django-memoize" +optional = false +python-versions = "*" +version = "2.2.1" + +[package.dependencies] +django = "*" + [[package]] category = "main" description = "A straightforward menu generator for Django" @@ -578,19 +619,6 @@ six = ">=1.10.0" [package.extras] qrcode = ["qrcode"] -[[package]] -category = "main" -description = "A django-otp plugin that verifies YubiKey OTP tokens." -name = "django-otp-yubikey" -optional = false -python-versions = "*" -version = "0.5.2" - -[package.dependencies] -YubiOTP = ">=0.2.2" -django-otp = ">=0.5.0" -six = ">=1.10.0" - [[package]] category = "main" description = "An international phone number field for django models." @@ -603,10 +631,6 @@ version = "3.0.1" Django = ">=1.11.3" babel = "*" -[package.dependencies.phonenumbers] -optional = true -version = ">=7.0.2" - [package.extras] phonenumbers = ["phonenumbers (>=7.0.2)"] phonenumberslite = ["phonenumberslite (>=7.0.2)"] @@ -642,15 +666,11 @@ description = "A Django app to include a manifest.json and Service Worker instan name = "django-pwa" optional = false python-versions = "*" -version = "1.0.6" +version = "1.0.8" [package.dependencies] django = ">=1.8" -[package.source] -reference = "67cf917a081df3116968f684ebb28e4c076b2b50" -type = "git" -url = "https://github.com/Natureshadow/django-pwa" [[package]] category = "main" description = "Render a particular block from a template to a string." @@ -680,7 +700,7 @@ description = "Select2 option fields for Django" name = "django-select2" optional = false python-versions = "*" -version = "7.2.0" +version = "7.2.3" [package.dependencies] django = ">=2.2" @@ -700,11 +720,11 @@ description = "Mypy stubs for Django" name = "django-stubs" optional = false python-versions = ">=3.6" -version = "1.4.0" +version = "1.5.0" [package.dependencies] django = "*" -mypy = ">=0.760,<0.770" +mypy = ">=0.770,<0.780" typing-extensions = "*" [[package]] @@ -713,7 +733,7 @@ description = "Table/data-grid framework for Django" name = "django-tables2" optional = false python-versions = "*" -version = "2.2.1" +version = "2.3.1" [package.dependencies] Django = ">=1.11" @@ -751,7 +771,7 @@ description = "Complete Two-Factor Authentication for Django" name = "django-two-factor-auth" optional = false python-versions = "*" -version = "1.10.0" +version = "1.11.0" [package.dependencies] Django = ">=1.11" @@ -760,24 +780,16 @@ django-otp = ">=0.6.0,<0.99" django-phonenumber-field = ">=1.1.0,<3.99" qrcode = ">=4.0.0,<6.99" -[package.dependencies.django-otp-yubikey] -optional = true -version = "*" - [package.dependencies.phonenumbers] optional = true version = ">=7.0.9,<8.99" -[package.dependencies.twilio] -optional = true -version = ">=6.0" - [package.extras] -Call = ["twilio (>=6.0)"] -SMS = ["twilio (>=6.0)"] -YubiKey = ["django-otp-yubikey"] +call = ["twilio (>=6.0)"] phonenumbers = ["phonenumbers (>=7.0.9,<8.99)"] phonenumberslite = ["phonenumberslite (>=7.0.9,<8.99)"] +sms = ["twilio (>=6.0)"] +yubikey = ["django-otp-yubikey"] [[package]] category = "main" @@ -785,7 +797,7 @@ description = "Tweak the form field rendering in templates, not in python-level name = "django-widget-tweaks" optional = false python-versions = "*" -version = "1.4.5" +version = "1.4.8" [[package]] category = "main" @@ -813,12 +825,13 @@ description = "A parser for Python dependency files" name = "dparse" optional = false python-versions = "*" -version = "0.4.1" +version = "0.5.0" [package.dependencies] packaging = "*" +pipenv = "*" pyyaml = "*" -six = "*" +toml = "*" [package.extras] pipenv = ["pipenv"] @@ -829,19 +842,13 @@ description = "The dynamic configurator for your Python Project" name = "dynaconf" optional = false python-versions = "*" -version = "2.2.2" +version = "2.2.3" [package.dependencies] -click = "<=7.0" +click = "*" python-box = "<4.0.0" -python-dotenv = "<=0.10.3" - -[[package.dependencies.toml]] -version = "<=0.10.0" - -[[package.dependencies.toml]] -optional = true -version = "*" +python-dotenv = "*" +toml = "*" [package.dependencies.PyYAML] optional = true @@ -886,12 +893,20 @@ description = "Faker is a Python package that generates fake data for you." name = "faker" optional = false python-versions = ">=3.4" -version = "4.0.0" +version = "4.0.3" [package.dependencies] python-dateutil = ">=2.4" text-unidecode = "1.3" +[[package]] +category = "dev" +description = "A platform independent file lock." +name = "filelock" +optional = false +python-versions = "*" +version = "3.0.12" + [[package]] category = "dev" description = "the modular source code checker: pep8, pyflakes and co" @@ -938,7 +953,7 @@ description = "Check for python builtins being used as variables or parameters." name = "flake8-builtins" optional = false python-versions = "*" -version = "1.4.2" +version = "1.5.2" [package.dependencies] flake8 = "*" @@ -983,7 +998,7 @@ description = "flake8 plugin that integrates isort ." name = "flake8-isort" optional = false python-versions = "*" -version = "2.8.0" +version = "2.9.1" [package.dependencies] flake8 = ">=3.2.1" @@ -991,7 +1006,7 @@ testfixtures = "*" [package.dependencies.isort] extras = ["pyproject"] -version = ">=4.3.0" +version = ">=4.3.5" [package.extras] test = ["pytest"] @@ -1035,24 +1050,24 @@ restructuredtext_lint = "*" [[package]] category = "dev" description = "Git Object Database" -name = "gitdb2" +name = "gitdb" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.0.6" +python-versions = ">=3.4" +version = "4.0.4" [package.dependencies] -smmap2 = ">=2.0.0" +smmap = ">=3.0.1,<4" [[package]] category = "dev" description = "Python Git Library" name = "gitpython" optional = false -python-versions = ">=3.0, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.0.5" +python-versions = ">=3.4" +version = "3.1.1" [package.dependencies] -gitdb2 = ">=2.0.0" +gitdb = ">=4.0.1,<5" [[package]] category = "main" @@ -1068,7 +1083,7 @@ description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8" +version = "2.9" [[package]] category = "dev" @@ -1085,7 +1100,7 @@ marker = "python_version < \"3.8\"" name = "importlib-metadata" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.5.0" +version = "1.6.0" [package.dependencies] zipp = ">=0.5" @@ -1114,7 +1129,7 @@ description = "A very fast and expressive template engine." name = "jinja2" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.1" +version = "2.11.2" [package.dependencies] MarkupSafe = ">=0.23" @@ -1128,7 +1143,7 @@ description = "Messaging library for Python." name = "kombu" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "4.6.7" +version = "4.6.8" [package.dependencies] amqp = ">=2.5.2,<2.6" @@ -1194,7 +1209,7 @@ description = "Optional static typing for Python" name = "mypy" optional = false python-versions = ">=3.5" -version = "0.761" +version = "0.770" [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" @@ -1218,7 +1233,7 @@ description = "Core utilities for Python packages" name = "packaging" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.1" +version = "20.3" [package.dependencies] pyparsing = ">=2.0.2" @@ -1230,7 +1245,7 @@ description = "Utility library for gitignore style pattern matching of file path name = "pathspec" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.7.0" +version = "0.8.0" [[package]] category = "dev" @@ -1238,7 +1253,7 @@ description = "Python Build Reasonableness" name = "pbr" optional = false python-versions = "*" -version = "5.4.4" +version = "5.4.5" [[package]] category = "dev" @@ -1246,10 +1261,10 @@ description = "PostgreSQL interface library" name = "pg8000" optional = false python-versions = ">=3.5" -version = "1.13.2" +version = "1.15.1" [package.dependencies] -scramp = "1.1.0" +scramp = "1.1.1" [[package]] category = "main" @@ -1257,7 +1272,7 @@ description = "Python version of Google's common library for parsing, formatting name = "phonenumbers" optional = false python-versions = "*" -version = "8.11.2" +version = "8.12.1" [[package]] category = "main" @@ -1265,7 +1280,22 @@ description = "Python Imaging Library (Fork)" name = "pillow" optional = false python-versions = ">=3.5" -version = "7.0.0" +version = "7.1.1" + +[[package]] +category = "dev" +description = "Python Development Workflow for Humans." +name = "pipenv" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +version = "2018.11.26" + +[package.dependencies] +certifi = "*" +pip = ">=9.0.1" +setuptools = ">=36.2.1" +virtualenv = "*" +virtualenv-clone = ">=0.2.5" [[package]] category = "dev" @@ -1289,7 +1319,7 @@ description = "psycopg2 - Python-PostgreSQL Database Adapter" name = "psycopg2" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "2.8.4" +version = "2.8.5" [[package]] category = "dev" @@ -1326,14 +1356,6 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.5.0" -[[package]] -category = "main" -description = "Cryptographic library for Python" -name = "pycryptodome" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.9.4" - [[package]] category = "dev" description = "Python docstring style checker" @@ -1358,21 +1380,8 @@ category = "dev" description = "Pygments is a syntax highlighting package written in Python." name = "pygments" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.5.2" - -[[package]] -category = "main" -description = "JSON Web Token implementation in Python" -name = "pyjwt" -optional = false -python-versions = "*" -version = "1.7.1" - -[package.extras] -crypto = ["cryptography (>=1.4)"] -flake8 = ["flake8", "flake8-import-order", "pep8-naming"] -test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"] +python-versions = ">=3.5" +version = "2.6.1" [[package]] category = "dev" @@ -1380,7 +1389,7 @@ description = "Python parsing module" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.6" +version = "2.4.7" [[package]] category = "dev" @@ -1388,7 +1397,7 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.5" -version = "5.3.5" +version = "5.4.1" [package.dependencies] atomicwrites = ">=1.0" @@ -1429,7 +1438,7 @@ description = "A Django plugin for pytest." name = "pytest-django" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.8.0" +version = "3.9.0" [package.dependencies] pytest = ">=3.6" @@ -1480,7 +1489,7 @@ description = "Python Crontab API" name = "python-crontab" optional = true python-versions = "*" -version = "2.4.0" +version = "2.4.1" [package.dependencies] python-dateutil = "*" @@ -1506,7 +1515,7 @@ description = "Add .env support to your django/flask apps in development and dep name = "python-dotenv" optional = false python-versions = "*" -version = "0.10.3" +version = "0.12.0" [package.extras] cli = ["click (>=5.0)"] @@ -1548,7 +1557,7 @@ description = "YAML parser and emitter for Python" name = "pyyaml" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3" +version = "5.3.1" [[package]] category = "main" @@ -1574,7 +1583,7 @@ description = "Python client for Redis key-value store" name = "redis" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.4.0" +version = "3.4.1" [package.extras] hiredis = ["hiredis (>=0.1.3)"] @@ -1585,7 +1594,7 @@ description = "Alternative regular expression module, to replace re." name = "regex" optional = false python-versions = "*" -version = "2020.1.8" +version = "2020.4.4" [[package]] category = "main" @@ -1593,16 +1602,16 @@ description = "Python HTTP for Humans." name = "requests" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.22.0" +version = "2.23.0" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<3.1.0" -idna = ">=2.5,<2.9" +chardet = ">=3.0.2,<4" +idna = ">=2.5,<3" urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] [[package]] @@ -1622,7 +1631,7 @@ description = "Safety checks your installed dependencies for known security vuln name = "safety" optional = false python-versions = "*" -version = "1.8.5" +version = "1.8.7" [package.dependencies] Click = ">=6.0" @@ -1637,7 +1646,7 @@ description = "An implementation of the SCRAM protocol." name = "scramp" optional = false python-versions = ">=3.5" -version = "1.1.0" +version = "1.1.1" [[package]] category = "dev" @@ -1661,10 +1670,10 @@ version = "1.14.0" [[package]] category = "dev" description = "A pure Python implementation of a sliding window memory map manager" -name = "smmap2" +name = "smmap" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.0.5" +version = "3.0.2" [[package]] category = "dev" @@ -1688,7 +1697,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "2.3.1" +version = "2.4.4" [package.dependencies] Jinja2 = ">=2.3" @@ -1711,7 +1720,7 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -test = ["pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.761)", "docutils-stubs"] +test = ["pytest (<5.3.3)", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.761)", "docutils-stubs"] [[package]] category = "dev" @@ -1730,25 +1739,27 @@ type_comments = ["typed-ast (>=1.4.0)"] [[package]] category = "dev" -description = "" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" name = "sphinxcontrib-applehelp" optional = false -python-versions = "*" -version = "1.0.1" +python-versions = ">=3.5" +version = "1.0.2" [package.extras] -test = ["pytest", "flake8", "mypy"] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] [[package]] category = "dev" -description = "" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." name = "sphinxcontrib-devhelp" optional = false -python-versions = "*" -version = "1.0.1" +python-versions = ">=3.5" +version = "1.0.2" [package.extras] -test = ["pytest", "flake8", "mypy"] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] [[package]] category = "dev" @@ -1760,14 +1771,15 @@ version = "0.5.1" [[package]] category = "dev" -description = "" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" name = "sphinxcontrib-htmlhelp" optional = false -python-versions = "*" -version = "1.0.2" +python-versions = ">=3.5" +version = "1.0.3" [package.extras] -test = ["pytest", "flake8", "mypy", "html5lib"] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] [[package]] category = "dev" @@ -1782,25 +1794,27 @@ test = ["pytest", "flake8", "mypy"] [[package]] category = "dev" -description = "" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." name = "sphinxcontrib-qthelp" optional = false -python-versions = "*" -version = "1.0.2" +python-versions = ">=3.5" +version = "1.0.3" [package.extras] -test = ["pytest", "flake8", "mypy"] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] [[package]] category = "dev" -description = "" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." name = "sphinxcontrib-serializinghtml" optional = false -python-versions = "*" -version = "1.1.3" +python-versions = ">=3.5" +version = "1.1.4" [package.extras] -test = ["pytest", "flake8", "mypy"] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] [[package]] category = "main" @@ -1808,7 +1822,7 @@ description = "Non-validating SQL parser" name = "sqlparse" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.3.0" +version = "0.3.1" [[package]] category = "dev" @@ -1816,7 +1830,7 @@ description = "Manage dynamic plugins for Python applications" name = "stevedore" optional = false python-versions = "*" -version = "1.31.0" +version = "1.32.0" [package.dependencies] pbr = ">=2.0.0,<2.1.0 || >2.1.0" @@ -1836,12 +1850,12 @@ description = "A collection of helpers and mock objects for unit tests and doc t name = "testfixtures" optional = false python-versions = "*" -version = "6.11.0" +version = "6.14.0" [package.extras] build = ["setuptools-git", "wheel", "twine"] -docs = ["sphinx"] -test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "sybil", "zope.component", "twisted", "mock", "django (<2)", "django"] +docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] +test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] [[package]] category = "dev" @@ -1891,28 +1905,11 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.42.0" +version = "4.45.0" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] -[[package]] -category = "main" -description = "Twilio API client and TwiML generator" -name = "twilio" -optional = false -python-versions = "*" -version = "6.35.3" - -[package.dependencies] -PyJWT = ">=1.4.2" -pytz = "*" -six = "*" - -[package.dependencies.requests] -python = ">=3.0" -version = ">=2.0.0" - [[package]] category = "dev" description = "a fork of Python 2 and 3 ast modules with type comment support" @@ -1927,7 +1924,7 @@ description = "Backported and Experimental Type Hints for Python 3.5+" name = "typing-extensions" optional = false python-versions = "*" -version = "3.7.4.1" +version = "3.7.4.2" [[package]] category = "main" @@ -1950,25 +1947,51 @@ optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "1.3.0" +[[package]] +category = "dev" +description = "Virtual Python Environment builder" +name = "virtualenv" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +version = "20.0.17" + +[package.dependencies] +appdirs = ">=1.4.3,<2" +distlib = ">=0.3.0,<1" +filelock = ">=3.0.0,<4" +six = ">=1.9.0,<2" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12,<2" + +[package.extras] +docs = ["sphinx (>=2.0.0,<3)", "sphinx-argparse (>=0.2.5,<1)", "sphinx-rtd-theme (>=0.4.3,<1)", "towncrier (>=19.9.0rc1)", "proselint (>=0.10.2,<1)"] +testing = ["pytest (>=4.0.0,<6)", "coverage (>=4.5.1,<6)", "pytest-mock (>=2.0.0,<3)", "pytest-env (>=0.6.2,<1)", "pytest-timeout (>=1.3.4,<2)", "packaging (>=20.0)", "xonsh (>=0.9.16,<1)"] + +[[package]] +category = "dev" +description = "script to clone virtualenvs." +name = "virtualenv-clone" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.5.4" + [[package]] category = "dev" description = "Measures number of Terminal column cells of wide-character codes" name = "wcwidth" optional = false python-versions = "*" -version = "0.1.8" +version = "0.1.9" [[package]] category = "main" -description = "A library for verifying YubiKey OTP tokens, both locally and through a Yubico web service." -name = "yubiotp" +description = "Character encoding aliases for legacy web content" +name = "webencodings" optional = false python-versions = "*" -version = "0.2.2.post1" - -[package.dependencies] -pycryptodome = "*" -six = "*" +version = "0.5.1" [[package]] category = "main" @@ -1977,18 +2000,18 @@ marker = "python_version < \"3.8\"" name = "zipp" optional = false python-versions = ">=3.6" -version = "2.1.0" +version = "3.1.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["jaraco.itertools"] +testing = ["jaraco.itertools", "func-timeout"] [extras] celery = ["Celery", "django-celery-results", "django-celery-beat", "django-celery-email"] ldap = ["django-auth-ldap"] [metadata] -content-hash = "d420d561639e0a707bdc319fda33991df01ccef71e5ce639f85cbfd0261e421a" +content-hash = "8d698d1e20a7a28bb0f91312abb432565a30e9345f39552a2c2933eb1b4f8072" python-versions = "^3.7" [metadata.files] @@ -2005,8 +2028,8 @@ appdirs = [ {file = "appdirs-1.4.3.tar.gz", hash = "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"}, ] asgiref = [ - {file = "asgiref-3.2.3-py2.py3-none-any.whl", hash = "sha256:ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5"}, - {file = "asgiref-3.2.3.tar.gz", hash = "sha256:7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0"}, + {file = "asgiref-3.2.7-py2.py3-none-any.whl", hash = "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c"}, + {file = "asgiref-3.2.7.tar.gz", hash = "sha256:8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5"}, ] atomicwrites = [ {file = "atomicwrites-1.3.0-py2.py3-none-any.whl", hash = "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4"}, @@ -2025,37 +2048,41 @@ bandit = [ {file = "bandit-1.6.2.tar.gz", hash = "sha256:41e75315853507aa145d62a78a2a6c5e3240fe14ee7c601459d0df9418196065"}, ] beautifulsoup4 = [ - {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, - {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, - {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, + {file = "beautifulsoup4-4.9.0-py2-none-any.whl", hash = "sha256:a4bbe77fd30670455c5296242967a123ec28c37e9702a8a81bd2f20a4baf0368"}, + {file = "beautifulsoup4-4.9.0-py3-none-any.whl", hash = "sha256:d4e96ac9b0c3a6d3f0caae2e4124e6055c5dcafde8e2f831ff194c104f0775a0"}, + {file = "beautifulsoup4-4.9.0.tar.gz", hash = "sha256:594ca51a10d2b3443cbac41214e12dbb2a1cd57e1a7344659849e2e20ba6a8d8"}, ] billiard = [ - {file = "billiard-3.6.1.0-py3-none-any.whl", hash = "sha256:01afcb4e7c4fd6480940cfbd4d9edc19d7a7509d6ada533984d0d0f49901ec82"}, - {file = "billiard-3.6.1.0.tar.gz", hash = "sha256:b8809c74f648dfe69b973c8e660bcec00603758c9db8ba89d7719f88d5f01f26"}, + {file = "billiard-3.6.3.0-py3-none-any.whl", hash = "sha256:bff575450859a6e0fbc2f9877d9b715b0bbc07c3565bb7ed2280526a0cdf5ede"}, + {file = "billiard-3.6.3.0.tar.gz", hash = "sha256:d91725ce6425f33a97dfa72fb6bfef0e47d4652acd98a032bd1a7fbf06d5fa6a"}, ] black = [ {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, ] +bleach = [ + {file = "bleach-3.1.4-py2.py3-none-any.whl", hash = "sha256:cc8da25076a1fe56c3ac63671e2194458e0c4d9c7becfd52ca251650d517903c"}, + {file = "bleach-3.1.4.tar.gz", hash = "sha256:e78e426105ac07026ba098f04de8abe9b6e3e98b5befbf89b51a5ef0a4292b03"}, +] calendarweek = [ {file = "calendarweek-0.4.5-py3-none-any.whl", hash = "sha256:b35fcc087073969d017cede62a7295bcd714a1304bcb4c4e2b0f23acb0265fb1"}, {file = "calendarweek-0.4.5.tar.gz", hash = "sha256:5b1788ca435022f9348fc81a718974e51dd85d080f9aa3dad717df70a1bc6e1f"}, ] celery = [ - {file = "celery-4.4.0-py2.py3-none-any.whl", hash = "sha256:7c544f37a84a5eadc44cab1aa8c9580dff94636bb81978cdf9bf8012d9ea7d8f"}, - {file = "celery-4.4.0.tar.gz", hash = "sha256:d3363bb5df72d74420986a435449f3c3979285941dff57d5d97ecba352a0e3e2"}, + {file = "celery-4.4.2-py2.py3-none-any.whl", hash = "sha256:5b4b37e276033fe47575107a2775469f0b721646a08c96ec2c61531e4fe45f2a"}, + {file = "celery-4.4.2.tar.gz", hash = "sha256:108a0bf9018a871620936c33a3ee9f6336a89f8ef0a0f567a9001f4aa361415f"}, ] certifi = [ - {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"}, - {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"}, + {file = "certifi-2020.4.5.1-py2.py3-none-any.whl", hash = "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304"}, + {file = "certifi-2020.4.5.1.tar.gz", hash = "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"}, ] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, ] click = [ - {file = "Click-7.0-py2.py3-none-any.whl", hash = "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13"}, - {file = "Click-7.0.tar.gz", hash = "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"}, + {file = "click-7.1.1-py2.py3-none-any.whl", hash = "sha256:e345d143d80bf5ee7534056164e5e112ea5e22716bbb1ce727941f4c8b471b9a"}, + {file = "click-7.1.1.tar.gz", hash = "sha256:8a18b4ea89d8820c5d0c7da8a64b2c324b4dabb695804dbfea19b9be9d88c0cc"}, ] colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, @@ -2069,81 +2096,88 @@ configobj = [ {file = "configobj-5.0.6.tar.gz", hash = "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"}, ] coverage = [ - {file = "coverage-5.0.3-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f"}, - {file = "coverage-5.0.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc"}, - {file = "coverage-5.0.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a"}, - {file = "coverage-5.0.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52"}, - {file = "coverage-5.0.3-cp27-cp27m-win32.whl", hash = "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c"}, - {file = "coverage-5.0.3-cp27-cp27m-win_amd64.whl", hash = "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73"}, - {file = "coverage-5.0.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68"}, - {file = "coverage-5.0.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691"}, - {file = "coverage-5.0.3-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301"}, - {file = "coverage-5.0.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf"}, - {file = "coverage-5.0.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3"}, - {file = "coverage-5.0.3-cp35-cp35m-win32.whl", hash = "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0"}, - {file = "coverage-5.0.3-cp35-cp35m-win_amd64.whl", hash = "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0"}, - {file = "coverage-5.0.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2"}, - {file = "coverage-5.0.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894"}, - {file = "coverage-5.0.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf"}, - {file = "coverage-5.0.3-cp36-cp36m-win32.whl", hash = "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477"}, - {file = "coverage-5.0.3-cp36-cp36m-win_amd64.whl", hash = "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc"}, - {file = "coverage-5.0.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8"}, - {file = "coverage-5.0.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987"}, - {file = "coverage-5.0.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea"}, - {file = "coverage-5.0.3-cp37-cp37m-win32.whl", hash = "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc"}, - {file = "coverage-5.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e"}, - {file = "coverage-5.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb"}, - {file = "coverage-5.0.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37"}, - {file = "coverage-5.0.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d"}, - {file = "coverage-5.0.3-cp38-cp38m-win32.whl", hash = "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954"}, - {file = "coverage-5.0.3-cp38-cp38m-win_amd64.whl", hash = "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e"}, - {file = "coverage-5.0.3-cp39-cp39m-win32.whl", hash = "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40"}, - {file = "coverage-5.0.3-cp39-cp39m-win_amd64.whl", hash = "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af"}, - {file = "coverage-5.0.3.tar.gz", hash = "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef"}, + {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"}, + {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"}, + {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"}, + {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"}, + {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"}, + {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"}, + {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"}, + {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"}, + {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"}, + {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"}, + {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"}, + {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"}, + {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"}, + {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"}, + {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"}, + {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"}, + {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"}, + {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"}, + {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"}, + {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"}, + {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"}, + {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"}, + {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"}, + {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"}, + {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"}, + {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"}, + {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"}, + {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"}, + {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"}, + {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, + {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, +] +distlib = [ + {file = "distlib-0.3.0.zip", hash = "sha256:2e166e231a26b36d6dfe35a48c4464346620f8645ed0ace01ee31822b288de21"}, ] dj-database-url = [ {file = "dj-database-url-0.5.0.tar.gz", hash = "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163"}, {file = "dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"}, ] django = [ - {file = "Django-3.0.2-py3-none-any.whl", hash = "sha256:4f2c913303be4f874015993420bf0bd8fd2097a9c88e6b49c6a92f9bdd3fb13a"}, - {file = "Django-3.0.2.tar.gz", hash = "sha256:8c3575f81e11390893860d97e1e0154c47512f180ea55bd84ce8fa69ba8051ca"}, + {file = "Django-3.0.5-py3-none-any.whl", hash = "sha256:642d8eceab321ca743ae71e0f985ff8fdca59f07aab3a9fb362c617d23e33a76"}, + {file = "Django-3.0.5.tar.gz", hash = "sha256:d4666c2edefa38c5ede0ec1655424c56dc47ceb04b6d8d62a7eac09db89545c1"}, ] django-any-js = [ {file = "django-any-js-1.0.3.post0.tar.gz", hash = "sha256:1da88b44b861b0f54f6b8ea0eb4c7c4fa1a5772e9a4320532cd4e0871a4e23f7"}, ] django-appconf = [ - {file = "django-appconf-1.0.3.tar.gz", hash = "sha256:35f13ca4d567f132b960e2cd4c832c2d03cb6543452d34e29b7ba10371ba80e3"}, - {file = "django_appconf-1.0.3-py2.py3-none-any.whl", hash = "sha256:c98a7af40062e996b921f5962a1c4f3f0c979fa7885f7be4710cceb90ebe13a6"}, + {file = "django-appconf-1.0.4.tar.gz", hash = "sha256:be58deb54a43d77d2e1621fe59f787681376d3cd0b8bd8e4758ef6c3a6453380"}, + {file = "django_appconf-1.0.4-py2.py3-none-any.whl", hash = "sha256:1b1d0e1069c843ebe8ae5aa48ec52403b1440402b320c3e3a206a0907e97bb06"}, ] django-auth-ldap = [ - {file = "django-auth-ldap-2.1.0.tar.gz", hash = "sha256:5f48232c85ddfa33e3573153e6080526ac2eef5e7ec9cf42b5c4ba3c62afb96d"}, - {file = "django_auth_ldap-2.1.0-py3-none-any.whl", hash = "sha256:4d68d21058bd57a316a9e1fcd7a36d0f25d054d4d9d9ec85f766a4991176b454"}, + {file = "django-auth-ldap-2.1.1.tar.gz", hash = "sha256:fabbbc35a5d28ce6a12e3f6309229d82bfe6a410391914938593e4b96ce42ec8"}, + {file = "django_auth_ldap-2.1.1-py3-none-any.whl", hash = "sha256:43c47c8eac1d0b1f1ee70d28534c7cef33deefddff996f8fae11dd937cc65e82"}, ] -django-bootstrap4 = [ - {file = "django-bootstrap4-1.1.1.tar.gz", hash = "sha256:39f97cbce85eb66f6d76be2029bae171bd3863d0c6932b1c2dae7f299c569b90"}, - {file = "django_bootstrap4-1.1.1-py3-none-any.whl", hash = "sha256:0fcd84f8414a58b43df0b331c00c8b2f1786ae28f75f419b4d33b06fca43e0d1"}, +django-bleach = [ + {file = "django-bleach-0.6.1.tar.gz", hash = "sha256:674709c26040618aff0741ce8261fd151e5ead405bd50568c2034662d69daac3"}, + {file = "django_bleach-0.6.1-py2.py3-none-any.whl", hash = "sha256:59de95cd98f924992313821ab7f94cd64a03aa900ca980bd3b062d8aef1a7954"}, ] django-bulk-update = [ {file = "django-bulk-update-2.2.0.tar.gz", hash = "sha256:5ab7ce8a65eac26d19143cc189c0f041d5c03b9d1b290ca240dc4f3d6aaeb337"}, {file = "django_bulk_update-2.2.0-py2.py3-none-any.whl", hash = "sha256:49a403392ae05ea872494d74fb3dfa3515f8df5c07cc277c3dc94724c0ee6985"}, ] django-celery-beat = [ - {file = "django-celery-beat-1.5.0.tar.gz", hash = "sha256:659b39232c454ac27022bf679939bce0471fd482f3ee9276f5199716cb4afad9"}, - {file = "django_celery_beat-1.5.0-py2.py3-none-any.whl", hash = "sha256:61c92d4b600a9f24406ee0b8d01a9b192253e15d047e3325e1d81e2cacf7aba6"}, + {file = "django-celery-beat-2.0.0.tar.gz", hash = "sha256:fdf1255eecfbeb770c6521fe3e69989dfc6373cd5a7f0fe62038d37f80f47e48"}, + {file = "django_celery_beat-2.0.0-py2.py3-none-any.whl", hash = "sha256:fe0b2a1b31d4a6234fea4b31986ddfd4644a48fab216ce1843f3ed0ddd2e9097"}, ] django-celery-email = [ {file = "django-celery-email-3.0.0.tar.gz", hash = "sha256:5546cbba80952cc3b8a0ffa4206ce90a4a996a7ffd1c385a2bdb65903ca18ece"}, {file = "django_celery_email-3.0.0-py2.py3-none-any.whl", hash = "sha256:0f72da39cb2ea83c69440566e87f27cd72f68f247f98ce99fb29889fcf329406"}, ] django-celery-results = [ - {file = "django_celery_results-1.1.2-py2.py3-none-any.whl", hash = "sha256:932277e9382528f74778b30cf90e17941cba577b7d73cee09ed55e4972972c32"}, - {file = "django_celery_results-1.1.2.tar.gz", hash = "sha256:e735dc3e705a0e21afc3b6fa2918ec388258145fcbaad3727c493c5707d25034"}, + {file = "django_celery_results-1.2.1-py2.py3-none-any.whl", hash = "sha256:a29ab580f0e38c66c39f51cc426bbdbb2a391b8cc0867df9dea748db2c961db2"}, + {file = "django_celery_results-1.2.1.tar.gz", hash = "sha256:e390f70cc43bbc2cd7c8e4607dc29ab6211a2ab968f93677583f0160921f670c"}, ] django-ckeditor = [ {file = "django-ckeditor-5.9.0.tar.gz", hash = "sha256:e4d112851a72c5bf8b586e1c674d34084cab16d28f2553ad15cc770d1e9639c7"}, {file = "django_ckeditor-5.9.0-py2.py3-none-any.whl", hash = "sha256:71c3c7bb46b0cbfb9712ef64af0d2a406eab233f44ecd7c42c24bdfa39ae3bde"}, ] +django-colorfield = [ + {file = "django-colorfield-0.2.2.tar.gz", hash = "sha256:49cfce71365de88130e65ced8f2c5c4826b31e9ab0c5f0e721ff13a830b5be76"}, + {file = "django_colorfield-0.2.2-py2-none-any.whl", hash = "sha256:ecb8af68f35028e35f973ddb687c2dcae86d028c6da1b72580c0d3fae915d3b7"}, +] django-constance = [ {file = "django-constance-2.6.0.tar.gz", hash = "sha256:12d827f9d5552ee39884fb6fb356f231f32b1ab8958acc715e3d1a6ecf913653"}, ] @@ -2152,8 +2186,8 @@ django-debug-toolbar = [ {file = "django_debug_toolbar-2.2-py3-none-any.whl", hash = "sha256:ff94725e7aae74b133d0599b9bf89bd4eb8f5d2c964106e61d11750228c8774c"}, ] django-easy-audit = [ - {file = "django-easy-audit-1.2.1rc1.tar.gz", hash = "sha256:a127264dbfef4aac17bfa74439487540ad41e47ff4c067d3d77bfad82fd23bc5"}, - {file = "django_easy_audit-1.2.1rc1-py3-none-any.whl", hash = "sha256:00e9a9bc063ad73120fe399f2e7bc216af5fc32186dc5eccad09e2c4cd10abc1"}, + {file = "django-easy-audit-1.2.2b4.tar.gz", hash = "sha256:eac94b76882c6ad3fdb76d15f4f4ea281dc61e0897e92a457e058b87ed21ff68"}, + {file = "django_easy_audit-1.2.2b4-py3-none-any.whl", hash = "sha256:49ef3beea7bf439b349daa66d5e3d7624a7c9005d3bfd51f54d15dd5dcfaa202"}, ] django-filter = [ {file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"}, @@ -2168,10 +2202,11 @@ django-hattori = [ {file = "django_hattori-0.2.1-py2.py3-none-any.whl", hash = "sha256:e529ed7af8fc34a0169c797c477672b687a205a56f3f5206f90c260acb83b7ac"}, ] django-image-cropping = [ - {file = "django-image-cropping-1.3.0.tar.gz", hash = "sha256:5c102d87bc66de025517ad06e485c100f73313ebf725e7482a728944276f6463"}, + {file = "django-image-cropping-1.4.0.tar.gz", hash = "sha256:6cc4a6bd8901e69b710caceea29b942fdb202da26626313cd9271ae989a83a52"}, + {file = "django_image_cropping-1.4.0-py3-none-any.whl", hash = "sha256:fe6a139c6d5dfc480f2a1d4e7e3e928d5edaefc898e17be66bc5f73140762ad9"}, ] django-impersonate = [ - {file = "django-impersonate-1.4.1.tar.gz", hash = "sha256:63b62d06f93b0318698c68f7314c78473914c262d4164eb66ad860bb83e04771"}, + {file = "django-impersonate-1.5.tar.gz", hash = "sha256:2c10bcb1c42fe6495d915f4cc4cfd7c5f8375ba39a06b0f062ce6f1e2ff76585"}, ] django-ipware = [ {file = "django-ipware-2.1.0.tar.gz", hash = "sha256:a7c7a8fd019dbdc9c357e6e582f65034e897572fc79a7e467674efa8aef9d00b"}, @@ -2192,8 +2227,11 @@ django-maintenance-mode = [ {file = "django_maintenance_mode-0.14.0-py2-none-any.whl", hash = "sha256:b4cc24a469ed10897826a28f05d64e6166a58d130e4940ac124ce198cd4cc778"}, ] django-material = [ - {file = "django-material-1.6.0.tar.gz", hash = "sha256:767ab6ad51f906bf773f927e853c2bff6b4ebdd1bd2bf45dbd4ef3e31657c3d5"}, - {file = "django_material-1.6.0-py2.py3-none-any.whl", hash = "sha256:6a30e42f0ceefef1ff325bda0017fa6f6a7fa534b15b8fcc48eb96de4b6adc8e"}, + {file = "django-material-1.6.3.tar.gz", hash = "sha256:f8758afe1beabc16a3c54f5437c7fea15946b7d068eedd89c97d57a363793950"}, + {file = "django_material-1.6.3-py2.py3-none-any.whl", hash = "sha256:502dc88c2f61f190fdc401666e83b47da00cbda98477af6ed8b7d43944ce6407"}, +] +django-memoize = [ + {file = "django-memoize-2.2.1.tar.gz", hash = "sha256:7428e19cb17009ea51120420101a239d83bdf4064e5c72ca8c3dfa9656033f24"}, ] django-menu-generator = [ {file = "django-menu-generator-1.0.4.tar.gz", hash = "sha256:ce71a5055c16933c8aff64fb36c21e5cf8b6d505733aceed1252f8b99369a378"}, @@ -2205,10 +2243,6 @@ django-otp = [ {file = "django-otp-0.7.5.tar.gz", hash = "sha256:1f16c2b93fe484706ff16ac6f5e64ecc73dd240318c333e0560384ba548d3837"}, {file = "django_otp-0.7.5-py2.py3-none-any.whl", hash = "sha256:cd4975539be478417033561e9832a1a69a583189f680e92a649f412c661f90aa"}, ] -django-otp-yubikey = [ - {file = "django-otp-yubikey-0.5.2.tar.gz", hash = "sha256:f0b1881562fb42ee9f12c28d284cbdb90d1f0383f2d53a595373b080a19bc261"}, - {file = "django_otp_yubikey-0.5.2-py2.py3-none-any.whl", hash = "sha256:26b12c763b37e99b95b8b8a54d06d8d54c3774eb26133a452f54558033de732b"}, -] django-phonenumber-field = [ {file = "django-phonenumber-field-3.0.1.tar.gz", hash = "sha256:794ebbc3068a7af75aa72a80cb0cec67e714ff8409a965968040f1fd210b2d97"}, {file = "django_phonenumber_field-3.0.1-py3-none-any.whl", hash = "sha256:1ab19f723928582fed412bd9844221fa4ff466276d8526b8b4a9913ee1487c5e"}, @@ -2221,7 +2255,10 @@ django-polymorphic = [ {file = "django-polymorphic-2.1.2.tar.gz", hash = "sha256:6e08a76c91066635ccb7ef3ebbe9a0ad149febae6b30be2579716ec16d3c6461"}, {file = "django_polymorphic-2.1.2-py2.py3-none-any.whl", hash = "sha256:0a25058e95e5e99fe0beeabb8f4734effe242d7b5b77dca416fba9fd3062da6a"}, ] -django-pwa = [] +django-pwa = [ + {file = "django-pwa-1.0.8.tar.gz", hash = "sha256:caf9d6e2a792def272e6cb496f594a9821c4d73cb5117d33560bc7b7b82d6132"}, + {file = "django_pwa-1.0.8-py3-none-any.whl", hash = "sha256:88a844095ec3dc38ec8edc8d1f95247eccaebefeb41484fb94c10631881b0eb7"}, +] django-render-block = [ {file = "django_render_block-0.6-py2.py3-none-any.whl", hash = "sha256:95c7dc9610378a10e0c4a10d8364ec7307210889afccd6a67a6aaa0fd599bd4d"}, ] @@ -2229,19 +2266,19 @@ django-sass-processor = [ {file = "django-sass-processor-0.8.tar.gz", hash = "sha256:e039551994feaaba6fcf880412b25a772dd313162a34cbb4289814988cfae340"}, ] django-select2 = [ - {file = "django-select2-7.2.0.tar.gz", hash = "sha256:4c531cb7e9eb4152c7e5f8ab83be386f46978b3d80e91e55ad1fb46382222a0b"}, - {file = "django_select2-7.2.0-py2.py3-none-any.whl", hash = "sha256:d17bb0e64503a7e52ba405f73a187664906cefda5f1c33971c67ab0b3891e91c"}, + {file = "django-select2-7.2.3.tar.gz", hash = "sha256:b4cd3e8c42bdbdc582c38c03a23bc115a90c2f86563282329d37c567d8c34c36"}, + {file = "django_select2-7.2.3-py2.py3-none-any.whl", hash = "sha256:1482be84449c254ec944c4da0a236b00ec57445304377b783850fd95b269d1ad"}, ] django-settings-context-processor = [ {file = "django-settings-context-processor-0.2.tar.gz", hash = "sha256:d37c853d69a3069f5abbf94c7f4f6fc0fac38bbd0524190cd5a250ba800e496a"}, ] django-stubs = [ - {file = "django-stubs-1.4.0.tar.gz", hash = "sha256:a84860e02d5ada1a96e4c6f6800be4729ea3df354ff1156f0616db647dc2fe9e"}, - {file = "django_stubs-1.4.0-py3-none-any.whl", hash = "sha256:9a1bd302c42b1132e1537ba2315b94de01e673a1926ac2b3e1523ed7b81411c8"}, + {file = "django-stubs-1.5.0.tar.gz", hash = "sha256:b4c9042f2c2fcb89dc0fb37df070cce0f9bf93b39ae193847b6e5a392b13c430"}, + {file = "django_stubs-1.5.0-py3-none-any.whl", hash = "sha256:4a03df70e062f4133085efc461148d0934f36ccfd60a2b6d7bc35821f62008b6"}, ] django-tables2 = [ - {file = "django-tables2-2.2.1.tar.gz", hash = "sha256:0d9b17f5c030ba1b5fcaeb206d8397bf58f1fdfc6beaf56e7874841b8647aa94"}, - {file = "django_tables2-2.2.1-py2.py3-none-any.whl", hash = "sha256:6afa0496695e15b332e98537265d09fe01a55b28c75a85323d8e6b0dc2350280"}, + {file = "django-tables2-2.3.1.tar.gz", hash = "sha256:28da782f81f046c7d921246f43e7ba2df430cafe5a0e00a0f9dadef25a0e487d"}, + {file = "django_tables2-2.3.1-py2.py3-none-any.whl", hash = "sha256:7e425ad51e22caf5470351981f0fcd4fd35d4cf2d4c3b76fa1b7bf56251778d1"}, ] django-templated-email = [ {file = "django-templated-email-2.3.0.tar.gz", hash = "sha256:536c4e5ae099eabfb9aab36087d4d7799948c654e73da55a744213d086d5bb33"}, @@ -2251,12 +2288,12 @@ django-timezone-field = [ {file = "django_timezone_field-4.0-py3-none-any.whl", hash = "sha256:758b7d41084e9ea2e89e59eb616e9b6326e6fbbf9d14b6ef062d624fe8cc6246"}, ] django-two-factor-auth = [ - {file = "django-two-factor-auth-1.10.0.tar.gz", hash = "sha256:3c3af3cd747462be18e7494c4068a2bdc606d7a2d2b2914f8d4590fc80995a71"}, - {file = "django_two_factor_auth-1.10.0-py2.py3-none-any.whl", hash = "sha256:0945260fa84e4522d8fa951c35e401616579fd8564938441614399dc588a1c1f"}, + {file = "django-two-factor-auth-1.11.0.tar.gz", hash = "sha256:637bd96e76907d044206c3b038bf4b5eb4769e9e3a4718da755fafc97db38b26"}, + {file = "django_two_factor_auth-1.11.0-py2.py3-none-any.whl", hash = "sha256:f1835e5368448d1b3d826ce7a36c590b3e39cd536523d372cfc5f9fbdc9731f4"}, ] django-widget-tweaks = [ - {file = "django-widget-tweaks-1.4.5.tar.gz", hash = "sha256:f2e2c9c9be1ccc59061e248dcc2144f4906d594abe1a563902f4bdf6aa14e432"}, - {file = "django_widget_tweaks-1.4.5-py2.py3-none-any.whl", hash = "sha256:65c960f3d75008a285e4b10f4d21f9eae4160fd77a0f6097ad545185f8648bd6"}, + {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"}, + {file = "django_widget_tweaks-1.4.8-py2.py3-none-any.whl", hash = "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836"}, ] django-yarnpkg = [ {file = "django-yarnpkg-6.0.1.tar.gz", hash = "sha256:aa059347b246c6f242401581d2c129bdcb45aa726be59fe2f288762a9843348a"}, @@ -2266,12 +2303,12 @@ docutils = [ {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, ] dparse = [ - {file = "dparse-0.4.1-py2-none-any.whl", hash = "sha256:cef95156fa0adedaf042cd42f9990974bec76f25dfeca4dc01f381a243d5aa5b"}, - {file = "dparse-0.4.1.tar.gz", hash = "sha256:00a5fdfa900629e5159bf3600d44905b333f4059a3366f28e0dbd13eeab17b19"}, + {file = "dparse-0.5.0-py3-none-any.whl", hash = "sha256:14fed5efc5e98c0a81dfe100c4c2ea0a4c189104e9a9d18b5cfd342a163f97be"}, + {file = "dparse-0.5.0.tar.gz", hash = "sha256:db349e53f6d03c8ee80606c49b35f515ed2ab287a8e1579e2b4bdf52b12b1530"}, ] dynaconf = [ - {file = "dynaconf-2.2.2-py2.py3-none-any.whl", hash = "sha256:3cfc1ad7efae08b9cf91d81043a3230175e74e01157d875ce5ec6709bf4e6b9d"}, - {file = "dynaconf-2.2.2.tar.gz", hash = "sha256:4bac78b432e090d8ed66f1c23fb32e03ca91a590bf0a51ac36137e0e45ac31ca"}, + {file = "dynaconf-2.2.3-py2.py3-none-any.whl", hash = "sha256:e803cdab2d7addd539c4ee8d121f15ab0b63a83a5b723150e1746aa7e8063adb"}, + {file = "dynaconf-2.2.3.tar.gz", hash = "sha256:26b84f2b234a203f6005463d954c9f007181c09345eaaab3fc38503acbdadc7d"}, ] easy-thumbnails = [ {file = "easy-thumbnails-2.7.tar.gz", hash = "sha256:e4e7a0dd4001f56bfd4058428f2c91eafe27d33ef3b8b33ac4e013b159b9ff91"}, @@ -2281,8 +2318,12 @@ entrypoints = [ {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, ] faker = [ - {file = "Faker-4.0.0-py3-none-any.whl", hash = "sha256:047d4d1791bfb3756264da670d99df13d799bb36e7d88774b1585a82d05dbaec"}, - {file = "Faker-4.0.0.tar.gz", hash = "sha256:1b1a58961683b30c574520d0c739c4443e0ef6a185c04382e8cc888273dbebed"}, + {file = "Faker-4.0.3-py3-none-any.whl", hash = "sha256:53bf2c8a2de8af271466e7b9cc2f08ecf83c4c947981680eb61080779a0adace"}, + {file = "Faker-4.0.3.tar.gz", hash = "sha256:7292806948ed848f1bcea1e7b963bae6f398687d1da0ea096e156fea2787f454"}, +] +filelock = [ + {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, + {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, ] flake8 = [ {file = "flake8-3.7.9-py2.py3-none-any.whl", hash = "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca"}, @@ -2295,8 +2336,8 @@ flake8-black = [ {file = "flake8-black-0.1.1.tar.gz", hash = "sha256:56f85aaa5a83f06a3f61e680e3b50f156b5e557ebdcb964d823d86f4c108b0c8"}, ] flake8-builtins = [ - {file = "flake8-builtins-1.4.2.tar.gz", hash = "sha256:c44415fb19162ef3737056e700d5b99d48c3612a533943b4e16419a5d3de3a64"}, - {file = "flake8_builtins-1.4.2-py2.py3-none-any.whl", hash = "sha256:29bc0f7e68af481d088f5c96f8aeb02520abdfc900500484e3af969f42a38a5f"}, + {file = "flake8-builtins-1.5.2.tar.gz", hash = "sha256:fe7be13fe51bfb06bdae6096c6488e328c822c3aa080e24b91b77116a4fbb8b0"}, + {file = "flake8_builtins-1.5.2-py2.py3-none-any.whl", hash = "sha256:a0296d23da92a6f2494243b9f2039bfdb73f34aba20054c1b70b2a60c84745bb"}, ] flake8-django = [ {file = "flake8-django-0.0.4.tar.gz", hash = "sha256:7329ec2e2b8b194e8109639c534359014c79df4d50b14f4b85b8395edc5d6760"}, @@ -2310,8 +2351,8 @@ flake8-fixme = [ {file = "flake8_fixme-1.1.1-py2.py3-none-any.whl", hash = "sha256:226a6f2ef916730899f29ac140bed5d4a17e5aba79f00a0e3ae1eff1997cb1ac"}, ] flake8-isort = [ - {file = "flake8-isort-2.8.0.tar.gz", hash = "sha256:64454d1f154a303cfe23ee715aca37271d4f1d299b2f2663f45b73bff14e36a9"}, - {file = "flake8_isort-2.8.0-py2.py3-none-any.whl", hash = "sha256:aa0c4d004e6be47e74f122f5b7f36554d0d78ad8bf99b497a460dedccaa7cce9"}, + {file = "flake8-isort-2.9.1.tar.gz", hash = "sha256:0d34b266080e1748412b203a1690792245011706b1858c203476b43460bf3652"}, + {file = "flake8_isort-2.9.1-py2.py3-none-any.whl", hash = "sha256:a77df28778a1ac6ac4153339ebd9d252935f3ed4379872d4f8b84986296d8cc3"}, ] flake8-mypy = [ {file = "flake8-mypy-17.8.0.tar.gz", hash = "sha256:47120db63aff631ee1f84bac6fe8e64731dc66da3efc1c51f85e15ade4a3ba18"}, @@ -2324,41 +2365,41 @@ flake8-polyfill = [ flake8-rst-docstrings = [ {file = "flake8-rst-docstrings-0.0.13.tar.gz", hash = "sha256:b1b619d81d879b874533973ac04ee5d823fdbe8c9f3701bfe802bb41813997b4"}, ] -gitdb2 = [ - {file = "gitdb2-2.0.6-py2.py3-none-any.whl", hash = "sha256:96bbb507d765a7f51eb802554a9cfe194a174582f772e0d89f4e87288c288b7b"}, - {file = "gitdb2-2.0.6.tar.gz", hash = "sha256:1b6df1433567a51a4a9c1a5a0de977aa351a405cc56d7d35f3388bad1f630350"}, +gitdb = [ + {file = "gitdb-4.0.4-py3-none-any.whl", hash = "sha256:ba1132c0912e8c917aa8aa990bee26315064c7b7f171ceaaac0afeb1dc656c6a"}, + {file = "gitdb-4.0.4.tar.gz", hash = "sha256:6f0ecd46f99bb4874e5678d628c3a198e2b4ef38daea2756a2bfd8df7dd5c1a5"}, ] gitpython = [ - {file = "GitPython-3.0.5-py3-none-any.whl", hash = "sha256:c155c6a2653593ccb300462f6ef533583a913e17857cfef8fc617c246b6dc245"}, - {file = "GitPython-3.0.5.tar.gz", hash = "sha256:9c2398ffc3dcb3c40b27324b316f08a4f93ad646d5a6328cafbb871aa79f5e42"}, + {file = "GitPython-3.1.1-py3-none-any.whl", hash = "sha256:71b8dad7409efbdae4930f2b0b646aaeccce292484ffa0bc74f1195582578b3d"}, + {file = "GitPython-3.1.1.tar.gz", hash = "sha256:6d4f10e2aaad1864bb0f17ec06a2c2831534140e5883c350d58b4e85189dab74"}, ] html2text = [ {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"}, {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"}, ] idna = [ - {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"}, - {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"}, + {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"}, + {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"}, ] imagesize = [ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-1.5.0-py2.py3-none-any.whl", hash = "sha256:b97607a1a18a5100839aec1dc26a1ea17ee0d93b20b0f008d80a5a050afb200b"}, - {file = "importlib_metadata-1.5.0.tar.gz", hash = "sha256:06f5b3a99029c7134207dd882428a66992a9de2bef7c2b699b5641f9886c3302"}, + {file = "importlib_metadata-1.6.0-py2.py3-none-any.whl", hash = "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f"}, + {file = "importlib_metadata-1.6.0.tar.gz", hash = "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e"}, ] isort = [ {file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, ] jinja2 = [ - {file = "Jinja2-2.11.1-py2.py3-none-any.whl", hash = "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"}, - {file = "Jinja2-2.11.1.tar.gz", hash = "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250"}, + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] kombu = [ - {file = "kombu-4.6.7-py2.py3-none-any.whl", hash = "sha256:2a9e7adff14d046c9996752b2c48b6d9185d0b992106d5160e1a179907a5d4ac"}, - {file = "kombu-4.6.7.tar.gz", hash = "sha256:67b32ccb6fea030f8799f8fd50dd08e03a4b99464ebc4952d71d8747b1a52ad1"}, + {file = "kombu-4.6.8-py2.py3-none-any.whl", hash = "sha256:598e7e749d6ab54f646b74b2d2df67755dee13894f73ab02a2a9feb8870c7cb2"}, + {file = "kombu-4.6.8.tar.gz", hash = "sha256:2d1cda774126a044d91a7ff5fa6d09edf99f46924ab332a810760fe6740e9b76"}, ] libsass = [ {file = "libsass-0.19.4-cp27-cp27m-macosx_10_14_intel.whl", hash = "sha256:74acd9adf506142699dfa292f0e569fdccbd9e7cf619e8226f7117de73566e32"}, @@ -2406,6 +2447,11 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mccabe = [ @@ -2417,87 +2463,93 @@ more-itertools = [ {file = "more_itertools-8.2.0-py3-none-any.whl", hash = "sha256:5dd8bcf33e5f9513ffa06d5ad33d78f31e1931ac9a18f33d37e77a180d393a7c"}, ] mypy = [ - {file = "mypy-0.761-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:7f672d02fffcbace4db2b05369142e0506cdcde20cea0e07c7c2171c4fd11dd6"}, - {file = "mypy-0.761-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:87c556fb85d709dacd4b4cb6167eecc5bbb4f0a9864b69136a0d4640fdc76a36"}, - {file = "mypy-0.761-cp35-cp35m-win_amd64.whl", hash = "sha256:c6d27bd20c3ba60d5b02f20bd28e20091d6286a699174dfad515636cb09b5a72"}, - {file = "mypy-0.761-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:4b9365ade157794cef9685791032521233729cb00ce76b0ddc78749abea463d2"}, - {file = "mypy-0.761-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:634aef60b4ff0f650d3e59d4374626ca6153fcaff96ec075b215b568e6ee3cb0"}, - {file = "mypy-0.761-cp36-cp36m-win_amd64.whl", hash = "sha256:53ea810ae3f83f9c9b452582261ea859828a9ed666f2e1ca840300b69322c474"}, - {file = "mypy-0.761-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:0a9a45157e532da06fe56adcfef8a74629566b607fa2c1ac0122d1ff995c748a"}, - {file = "mypy-0.761-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7eadc91af8270455e0d73565b8964da1642fe226665dd5c9560067cd64d56749"}, - {file = "mypy-0.761-cp37-cp37m-win_amd64.whl", hash = "sha256:e2bb577d10d09a2d8822a042a23b8d62bc3b269667c9eb8e60a6edfa000211b1"}, - {file = "mypy-0.761-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c35cae79ceb20d47facfad51f952df16c2ae9f45db6cb38405a3da1cf8fc0a7"}, - {file = "mypy-0.761-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:f97a605d7c8bc2c6d1172c2f0d5a65b24142e11a58de689046e62c2d632ca8c1"}, - {file = "mypy-0.761-cp38-cp38-win_amd64.whl", hash = "sha256:a6bd44efee4dc8c3324c13785a9dc3519b3ee3a92cada42d2b57762b7053b49b"}, - {file = "mypy-0.761-py3-none-any.whl", hash = "sha256:7e396ce53cacd5596ff6d191b47ab0ea18f8e0ec04e15d69728d530e86d4c217"}, - {file = "mypy-0.761.tar.gz", hash = "sha256:85baab8d74ec601e86134afe2bcccd87820f79d2f8d5798c889507d1088287bf"}, + {file = "mypy-0.770-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:a34b577cdf6313bf24755f7a0e3f3c326d5c1f4fe7422d1d06498eb25ad0c600"}, + {file = "mypy-0.770-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:86c857510a9b7c3104cf4cde1568f4921762c8f9842e987bc03ed4f160925754"}, + {file = "mypy-0.770-cp35-cp35m-win_amd64.whl", hash = "sha256:a8ffcd53cb5dfc131850851cc09f1c44689c2812d0beb954d8138d4f5fc17f65"}, + {file = "mypy-0.770-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:7687f6455ec3ed7649d1ae574136835a4272b65b3ddcf01ab8704ac65616c5ce"}, + {file = "mypy-0.770-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3beff56b453b6ef94ecb2996bea101a08f1f8a9771d3cbf4988a61e4d9973761"}, + {file = "mypy-0.770-cp36-cp36m-win_amd64.whl", hash = "sha256:15b948e1302682e3682f11f50208b726a246ab4e6c1b39f9264a8796bb416aa2"}, + {file = "mypy-0.770-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:b90928f2d9eb2f33162405f32dde9f6dcead63a0971ca8a1b50eb4ca3e35ceb8"}, + {file = "mypy-0.770-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c56ffe22faa2e51054c5f7a3bc70a370939c2ed4de308c690e7949230c995913"}, + {file = "mypy-0.770-cp37-cp37m-win_amd64.whl", hash = "sha256:8dfb69fbf9f3aeed18afffb15e319ca7f8da9642336348ddd6cab2713ddcf8f9"}, + {file = "mypy-0.770-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:219a3116ecd015f8dca7b5d2c366c973509dfb9a8fc97ef044a36e3da66144a1"}, + {file = "mypy-0.770-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7ec45a70d40ede1ec7ad7f95b3c94c9cf4c186a32f6bacb1795b60abd2f9ef27"}, + {file = "mypy-0.770-cp38-cp38-win_amd64.whl", hash = "sha256:f91c7ae919bbc3f96cd5e5b2e786b2b108343d1d7972ea130f7de27fdd547cf3"}, + {file = "mypy-0.770-py3-none-any.whl", hash = "sha256:3b1fc683fb204c6b4403a1ef23f0b1fac8e4477091585e0c8c54cbdf7d7bb164"}, + {file = "mypy-0.770.tar.gz", hash = "sha256:8a627507ef9b307b46a1fea9513d5c98680ba09591253082b4c48697ba05a4ae"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] packaging = [ - {file = "packaging-20.1-py2.py3-none-any.whl", hash = "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73"}, - {file = "packaging-20.1.tar.gz", hash = "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334"}, + {file = "packaging-20.3-py2.py3-none-any.whl", hash = "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752"}, + {file = "packaging-20.3.tar.gz", hash = "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3"}, ] pathspec = [ - {file = "pathspec-0.7.0-py2.py3-none-any.whl", hash = "sha256:163b0632d4e31cef212976cf57b43d9fd6b0bac6e67c26015d611a647d5e7424"}, - {file = "pathspec-0.7.0.tar.gz", hash = "sha256:562aa70af2e0d434367d9790ad37aed893de47f1693e4201fd1d3dca15d19b96"}, + {file = "pathspec-0.8.0-py2.py3-none-any.whl", hash = "sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0"}, + {file = "pathspec-0.8.0.tar.gz", hash = "sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"}, ] pbr = [ - {file = "pbr-5.4.4-py2.py3-none-any.whl", hash = "sha256:61aa52a0f18b71c5cc58232d2cf8f8d09cd67fcad60b742a60124cb8d6951488"}, - {file = "pbr-5.4.4.tar.gz", hash = "sha256:139d2625547dbfa5fb0b81daebb39601c478c21956dc57e2e07b74450a8c506b"}, + {file = "pbr-5.4.5-py2.py3-none-any.whl", hash = "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8"}, + {file = "pbr-5.4.5.tar.gz", hash = "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c"}, ] pg8000 = [ - {file = "pg8000-1.13.2-py3-none-any.whl", hash = "sha256:e4c2b173178ba41bba19366b9cdeced91fecec2caf31c7ece719138633213cca"}, - {file = "pg8000-1.13.2.tar.gz", hash = "sha256:eebcb4176a7e407987e525a07454882f611985e0becb2b73f76efb93bbdc0aab"}, + {file = "pg8000-1.15.1-py3-none-any.whl", hash = "sha256:1f17917c8e2580581f4f689ed5e6eefef4ba873e7a9550d04afcb07fd43be83d"}, + {file = "pg8000-1.15.1.tar.gz", hash = "sha256:01033498ffb27e780f6fb9ec877655ad97ceb26a50efdd77ca3b39ab2271f37c"}, ] phonenumbers = [ - {file = "phonenumbers-8.11.2-py2.py3-none-any.whl", hash = "sha256:796ba25c3064727ca0b8edf7a8ef5ef247c6da37aee498562e6e0ed46970a57f"}, - {file = "phonenumbers-8.11.2.tar.gz", hash = "sha256:a22d3b14c7f18af9be7c4ade92285035f621c6a17b75352dc9c2e5d146aee348"}, + {file = "phonenumbers-8.12.1-py2.py3-none-any.whl", hash = "sha256:bebf881ef0e775b93062fbd107bf164b5baef877a7b8f702e93a9a5d24ae4065"}, + {file = "phonenumbers-8.12.1.tar.gz", hash = "sha256:59ae9cb25fb03027c9f2bf5584098e699be7eca12c443838b83752956be15cda"}, ] pillow = [ - {file = "Pillow-7.0.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00"}, - {file = "Pillow-7.0.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff"}, - {file = "Pillow-7.0.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"}, - {file = "Pillow-7.0.0-cp35-cp35m-win32.whl", hash = "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386"}, - {file = "Pillow-7.0.0-cp35-cp35m-win_amd64.whl", hash = "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435"}, - {file = "Pillow-7.0.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2"}, - {file = "Pillow-7.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317"}, - {file = "Pillow-7.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2"}, - {file = "Pillow-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313"}, - {file = "Pillow-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0"}, - {file = "Pillow-7.0.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f"}, - {file = "Pillow-7.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636"}, - {file = "Pillow-7.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9"}, - {file = "Pillow-7.0.0-cp37-cp37m-win32.whl", hash = "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837"}, - {file = "Pillow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda"}, - {file = "Pillow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be"}, - {file = "Pillow-7.0.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533"}, - {file = "Pillow-7.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614"}, - {file = "Pillow-7.0.0-cp38-cp38-win32.whl", hash = "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a"}, - {file = "Pillow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d"}, - {file = "Pillow-7.0.0-pp373-pypy36_pp73-win32.whl", hash = "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358"}, - {file = "Pillow-7.0.0.tar.gz", hash = "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946"}, + {file = "Pillow-7.1.1-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:b7453750cf911785009423789d2e4e5393aae9cbb8b3f471dab854b85a26cb89"}, + {file = "Pillow-7.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4510c6b33277970b1af83c987277f9a08ec2b02cc20ac0f9234e4026136bb137"}, + {file = "Pillow-7.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b99b2607b6cd58396f363b448cbe71d3c35e28f03e442ab00806463439629c2c"}, + {file = "Pillow-7.1.1-cp35-cp35m-win32.whl", hash = "sha256:cd47793f7bc9285a88c2b5551d3f16a2ddd005789614a34c5f4a598c2a162383"}, + {file = "Pillow-7.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:04a10558320eba9137d6a78ca6fc8f4a5801f1b971152938851dc4629d903579"}, + {file = "Pillow-7.1.1-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:50a10b048f4dd81c092adad99fa5f7ba941edaf2f9590510109ac2a15e706695"}, + {file = "Pillow-7.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:721c04d3c77c38086f1f95d1cd8df87f2f9a505a780acf8575912b3206479da1"}, + {file = "Pillow-7.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:a5dc9f28c0239ec2742d4273bd85b2aa84655be2564db7ad1eb8f64b1efcdc4c"}, + {file = "Pillow-7.1.1-cp36-cp36m-win32.whl", hash = "sha256:d6bf085f6f9ec6a1724c187083b37b58a8048f86036d42d21802ed5d1fae4853"}, + {file = "Pillow-7.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:251e5618125ec12ac800265d7048f5857a8f8f1979db9ea3e11382e159d17f68"}, + {file = "Pillow-7.1.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:433bbc2469a2351bea53666d97bb1eb30f0d56461735be02ea6b27654569f80f"}, + {file = "Pillow-7.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:eb84e7e5b07ff3725ab05977ac56d5eeb0c510795aeb48e8b691491be3c5745b"}, + {file = "Pillow-7.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3713386d1e9e79cea1c5e6aaac042841d7eef838cc577a3ca153c8bedf570287"}, + {file = "Pillow-7.1.1-cp37-cp37m-win32.whl", hash = "sha256:291bad7097b06d648222b769bbfcd61e40d0abdfe10df686d20ede36eb8162b6"}, + {file = "Pillow-7.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6c1924ed7dbc6ad0636907693bbbdd3fdae1d73072963e71f5644b864bb10b4d"}, + {file = "Pillow-7.1.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:670e58d3643971f4afd79191abd21623761c2ebe61db1c2cb4797d817c4ba1a7"}, + {file = "Pillow-7.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8d5799243050c2833c2662b824dfb16aa98e408d2092805edea4300a408490e7"}, + {file = "Pillow-7.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:da737ab273f4d60ae552f82ad83f7cbd0e173ca30ca20b160f708c92742ee212"}, + {file = "Pillow-7.1.1-cp38-cp38-win32.whl", hash = "sha256:b2f3e8cc52ecd259b94ca880fea0d15f4ebc6da2cd3db515389bb878d800270f"}, + {file = "Pillow-7.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:2f0b52a08d175f10c8ea36685115681a484c55d24d0933f9fd911e4111c04144"}, + {file = "Pillow-7.1.1-pp373-pypy36_pp73-win32.whl", hash = "sha256:90cd441a1638ae176eab4d8b6b94ab4ec24b212ed4c3fbee2a6e74672481d4f8"}, + {file = "Pillow-7.1.1-py3.8-macosx-10.9-x86_64.egg", hash = "sha256:5eef904c82b5f8e4256e8d420c971357da2884c0b812ba4efa15a7ad2ec66247"}, + {file = "Pillow-7.1.1.tar.gz", hash = "sha256:0f89ddc77cf421b8cd34ae852309501458942bf370831b4a9b406156b599a14e"}, +] +pipenv = [ + {file = "pipenv-2018.11.26-py2-none-any.whl", hash = "sha256:7df8e33a2387de6f537836f48ac6fcd94eda6ed9ba3d5e3fd52e35b5bc7ff49e"}, + {file = "pipenv-2018.11.26-py3-none-any.whl", hash = "sha256:56ad5f5cb48f1e58878e14525a6e3129d4306049cb76d2f6a3e95df0d5fc6330"}, + {file = "pipenv-2018.11.26.tar.gz", hash = "sha256:a673e606e8452185e9817a987572b55360f4d28b50831ef3b42ac3cab3fee846"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] psycopg2 = [ - {file = "psycopg2-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:72772181d9bad1fa349792a1e7384dde56742c14af2b9986013eb94a240f005b"}, - {file = "psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:893c11064b347b24ecdd277a094413e1954f8a4e8cdaf7ffbe7ca3db87c103f0"}, - {file = "psycopg2-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:9ab75e0b2820880ae24b7136c4d230383e07db014456a476d096591172569c38"}, - {file = "psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:b0845e3bdd4aa18dc2f9b6fb78fbd3d9d371ad167fd6d1b7ad01c0a6cdad4fc6"}, - {file = "psycopg2-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:ef6df7e14698e79c59c7ee7cf94cd62e5b869db369ed4b1b8f7b729ea825712a"}, - {file = "psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:965c4c93e33e6984d8031f74e51227bd755376a9df6993774fd5b6fb3288b1f4"}, - {file = "psycopg2-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:ed686e5926929887e2c7ae0a700e32c6129abb798b4ad2b846e933de21508151"}, - {file = "psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dca2d7203f0dfce8ea4b3efd668f8ea65cd2b35112638e488a4c12594015f67b"}, - {file = "psycopg2-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:8396be6e5ff844282d4d49b81631772f80dabae5658d432202faf101f5283b7c"}, - {file = "psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:47fc642bf6f427805daf52d6e52619fe0637648fe27017062d898f3bf891419d"}, - {file = "psycopg2-2.8.4-cp38-cp38-win32.whl", hash = "sha256:4212ca404c4445dc5746c0d68db27d2cbfb87b523fe233dc84ecd24062e35677"}, - {file = "psycopg2-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:92a07dfd4d7c325dd177548c4134052d4842222833576c8391aab6f74038fc3f"}, - {file = "psycopg2-2.8.4.tar.gz", hash = "sha256:f898e5cc0a662a9e12bde6f931263a1bbd350cfb18e1d5336a12927851825bb6"}, + {file = "psycopg2-2.8.5-cp27-cp27m-win32.whl", hash = "sha256:a0984ff49e176062fcdc8a5a2a670c9bb1704a2f69548bce8f8a7bad41c661bf"}, + {file = "psycopg2-2.8.5-cp27-cp27m-win_amd64.whl", hash = "sha256:acf56d564e443e3dea152efe972b1434058244298a94348fc518d6dd6a9fb0bb"}, + {file = "psycopg2-2.8.5-cp34-cp34m-win32.whl", hash = "sha256:440a3ea2c955e89321a138eb7582aa1d22fe286c7d65e26a2c5411af0a88ae72"}, + {file = "psycopg2-2.8.5-cp34-cp34m-win_amd64.whl", hash = "sha256:6b306dae53ec7f4f67a10942cf8ac85de930ea90e9903e2df4001f69b7833f7e"}, + {file = "psycopg2-2.8.5-cp35-cp35m-win32.whl", hash = "sha256:d3b29d717d39d3580efd760a9a46a7418408acebbb784717c90d708c9ed5f055"}, + {file = "psycopg2-2.8.5-cp35-cp35m-win_amd64.whl", hash = "sha256:6a471d4d2a6f14c97a882e8d3124869bc623f3df6177eefe02994ea41fd45b52"}, + {file = "psycopg2-2.8.5-cp36-cp36m-win32.whl", hash = "sha256:27c633f2d5db0fc27b51f1b08f410715b59fa3802987aec91aeb8f562724e95c"}, + {file = "psycopg2-2.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2df2bf1b87305bd95eb3ac666ee1f00a9c83d10927b8144e8e39644218f4cf81"}, + {file = "psycopg2-2.8.5-cp37-cp37m-win32.whl", hash = "sha256:ac5b23d0199c012ad91ed1bbb971b7666da651c6371529b1be8cbe2a7bf3c3a9"}, + {file = "psycopg2-2.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2c0afb40cfb4d53487ee2ebe128649028c9a78d2476d14a67781e45dc287f080"}, + {file = "psycopg2-2.8.5-cp38-cp38-win32.whl", hash = "sha256:2327bf42c1744a434ed8ed0bbaa9168cac7ee5a22a9001f6fc85c33b8a4a14b7"}, + {file = "psycopg2-2.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:132efc7ee46a763e68a815f4d26223d9c679953cd190f1f218187cb60decf535"}, + {file = "psycopg2-2.8.5.tar.gz", hash = "sha256:f7d46240f7a1ae1dd95aab38bd74f7428d46531f69219954266d669da60c0818"}, ] py = [ {file = "py-1.8.1-py2.py3-none-any.whl", hash = "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"}, @@ -2537,40 +2589,6 @@ pycodestyle = [ {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, ] -pycryptodome = [ - {file = "pycryptodome-3.9.4-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6c2720696b10ae356040e888bde1239b8957fe18885ccf5e7b4e8dec882f0856"}, - {file = "pycryptodome-3.9.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:5c485ed6e9718ebcaa81138fa70ace9c563d202b56a8cee119b4085b023931f5"}, - {file = "pycryptodome-3.9.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:56fdd0e425f1b8fd3a00b6d96351f86226674974814c50534864d0124d48871f"}, - {file = "pycryptodome-3.9.4-cp27-cp27m-win32.whl", hash = "sha256:2de33ed0a95855735d5a0fc0c39603314df9e78ee8bbf0baa9692fb46b3b8bbb"}, - {file = "pycryptodome-3.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:eec0689509389f19875f66ae8dedd59f982240cdab31b9f78a8dc266011df93a"}, - {file = "pycryptodome-3.9.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68fab8455efcbfe87c5d75015476f9b606227ffe244d57bfd66269451706e899"}, - {file = "pycryptodome-3.9.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4b9533d4166ca07abdd49ce9d516666b1df944997fe135d4b21ac376aa624aff"}, - {file = "pycryptodome-3.9.4-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:d3fe3f33ad52bf0c19ee6344b695ba44ffbfa16f3c29ca61116b48d97bd970fb"}, - {file = "pycryptodome-3.9.4-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:319e568baf86620b419d53063b18c216abf924875966efdfe06891b987196a45"}, - {file = "pycryptodome-3.9.4-cp34-cp34m-win32.whl", hash = "sha256:042ae873baadd0c33b4d699a5c5b976ade3233a979d972f98ca82314632d868c"}, - {file = "pycryptodome-3.9.4-cp34-cp34m-win_amd64.whl", hash = "sha256:a30f501bbb32e01a49ef9e09ca1260e5ab49bf33a257080ec553e08997acc487"}, - {file = "pycryptodome-3.9.4-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:b55c60c321ac91945c60a40ac9896ac7a3d432bb3e8c14006dfd82ad5871c331"}, - {file = "pycryptodome-3.9.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:9d9945ac8375d5d8e60bd2a2e1df5882eaa315522eedf3ca868b1546dfa34eba"}, - {file = "pycryptodome-3.9.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4372ec7518727172e1605c0843cdc5375d4771e447b8148c787b860260aae151"}, - {file = "pycryptodome-3.9.4-cp35-cp35m-win32.whl", hash = "sha256:0502876279772b1384b660ccc91563d04490d562799d8e2e06b411e2d81128a9"}, - {file = "pycryptodome-3.9.4-cp35-cp35m-win_amd64.whl", hash = "sha256:72166c2ac520a5dbd2d90208b9c279161ec0861662a621892bd52fb6ca13ab91"}, - {file = "pycryptodome-3.9.4-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:b4af098f2a50f8d048ab12cabb59456585c0acf43d90ee79782d2d6d0ed59dba"}, - {file = "pycryptodome-3.9.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:8a799bea3c6617736e914a2e77c409f52893d382f619f088f8a80e2e21f573c1"}, - {file = "pycryptodome-3.9.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:7c52308ac5b834331b2f107a490b2c27de024a229b61df4cdc5c131d563dfe98"}, - {file = "pycryptodome-3.9.4-cp36-cp36m-win32.whl", hash = "sha256:63c103a22cbe9752f6ea9f1a0de129995bad91c4d03a66c67cffcf6ee0c9f1e1"}, - {file = "pycryptodome-3.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:54456cf85130e01674d21fb1ab89ffccacb138a8ade88d72fa2b0ac898d2798b"}, - {file = "pycryptodome-3.9.4-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:aec4d42deb836b8fb3ba32f2ba1ef0d33dd3dc9d430b1479ee7a914490d15b5e"}, - {file = "pycryptodome-3.9.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:896e9b6fd0762aa07b203c993fbbee7a1f1a4674c6886afd7bfa86f3d1be98a8"}, - {file = "pycryptodome-3.9.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:57b1b707363490c495ad0eeb38bd1b0e1697c497af25fad78d3a1ebf0477fd5b"}, - {file = "pycryptodome-3.9.4-cp37-cp37m-win32.whl", hash = "sha256:87d8d85b4792ca5e730fb7a519fbc3ed976c59dcf79c5204589c59afd56b9926"}, - {file = "pycryptodome-3.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:e3a79a30d15d9c7c284a7734036ee8abdb5ca3a6f5774d293cdc9e1358c1dc10"}, - {file = "pycryptodome-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:48821950ffb9c836858d8fa09d7840b6df52eadd387a3c5acece55cb387743f9"}, - {file = "pycryptodome-3.9.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cbfd97f9e060f0d30245cd29fa267a9a84de9da97559366fca0a3f7655acc63f"}, - {file = "pycryptodome-3.9.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9ef966c727de942de3e41aa8462c4b7b4bca70f19af5a3f99e31376589c11aac"}, - {file = "pycryptodome-3.9.4-cp38-cp38-win32.whl", hash = "sha256:a8ca2450394d3699c9f15ef25e8de9a24b401933716a1e39d37fa01f5fe3c58b"}, - {file = "pycryptodome-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:c53348358408d94869059e16fba5ff3bef8c52c25b18421472aba272b9bb450f"}, - {file = "pycryptodome-3.9.4.tar.gz", hash = "sha256:a168e73879619b467072509a223282a02c8047d932a48b74fbd498f27224aa04"}, -] pydocstyle = [ {file = "pydocstyle-5.0.2-py3-none-any.whl", hash = "sha256:da7831660b7355307b32778c4a0dbfb137d89254ef31a2b2978f50fc0b4d7586"}, {file = "pydocstyle-5.0.2.tar.gz", hash = "sha256:f4f5d210610c2d153fae39093d44224c17429e2ad7da12a8b419aba5c2f614b5"}, @@ -2580,28 +2598,24 @@ pyflakes = [ {file = "pyflakes-2.1.1.tar.gz", hash = "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"}, ] pygments = [ - {file = "Pygments-2.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, - {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, -] -pyjwt = [ - {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, - {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ] pyparsing = [ - {file = "pyparsing-2.4.6-py2.py3-none-any.whl", hash = "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec"}, - {file = "pyparsing-2.4.6.tar.gz", hash = "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f"}, + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-5.3.5-py3-none-any.whl", hash = "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6"}, - {file = "pytest-5.3.5.tar.gz", hash = "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d"}, + {file = "pytest-5.4.1-py3-none-any.whl", hash = "sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172"}, + {file = "pytest-5.4.1.tar.gz", hash = "sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970"}, ] pytest-cov = [ {file = "pytest-cov-2.8.1.tar.gz", hash = "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b"}, {file = "pytest_cov-2.8.1-py2.py3-none-any.whl", hash = "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626"}, ] pytest-django = [ - {file = "pytest-django-3.8.0.tar.gz", hash = "sha256:489b904f695f9fb880ce591cf5a4979880afb467763b1f180c07574554bdfd26"}, - {file = "pytest_django-3.8.0-py2.py3-none-any.whl", hash = "sha256:456fa6854d04ee625d6bbb8b38ca2259e7040a6f93333bfe8bc8159b7e987203"}, + {file = "pytest-django-3.9.0.tar.gz", hash = "sha256:664e5f42242e5e182519388f01b9f25d824a9feb7cd17d8f863c8d776f38baf9"}, + {file = "pytest_django-3.9.0-py2.py3-none-any.whl", hash = "sha256:64f99d565dd9497af412fcab2989fe40982c1282d4118ff422b407f3f7275ca5"}, ] pytest-django-testing-postgresql = [ {file = "pytest-django-testing-postgresql-0.1.post0.tar.gz", hash = "sha256:78b0c58930084cb4393407b2e5a2a3b8734c627b841ecef7d62d39bbfb8e8a45"}, @@ -2616,15 +2630,15 @@ python-box = [ {file = "python_box-3.4.6-py2.py3-none-any.whl", hash = "sha256:a71d3dc9dbaa34c8597d3517c89a8041bd62fa875f23c0f3dad55e1958e3ce10"}, ] python-crontab = [ - {file = "python-crontab-2.4.0.tar.gz", hash = "sha256:3ac1608ff76032e6fc6e16b5fbf83b51557e0e066bf78e9f88571571e7bd7ae6"}, + {file = "python-crontab-2.4.1.tar.gz", hash = "sha256:2366c7aa373118315de7c082401907bacd28e8b1e4e0a6d702334d17b89e71aa"}, ] python-dateutil = [ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, ] python-dotenv = [ - {file = "python-dotenv-0.10.3.tar.gz", hash = "sha256:f157d71d5fec9d4bd5f51c82746b6344dffa680ee85217c123f4a0c8117c4544"}, - {file = "python_dotenv-0.10.3-py2.py3-none-any.whl", hash = "sha256:debd928b49dbc2bf68040566f55cdb3252458036464806f4094487244e2a4093"}, + {file = "python-dotenv-0.12.0.tar.gz", hash = "sha256:92b3123fb2d58a284f76cc92bfe4ee6c502c32ded73e8b051c4f6afc8b6751ed"}, + {file = "python_dotenv-0.12.0-py2.py3-none-any.whl", hash = "sha256:81822227f771e0cab235a2939f0f265954ac4763cafd806d845801c863bf372f"}, ] python-ldap = [ {file = "python-ldap-3.2.0.tar.gz", hash = "sha256:7d1c4b15375a533564aad3d3deade789221e450052b21ebb9720fb822eccdb8e"}, @@ -2638,63 +2652,63 @@ pytz = [ {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, ] pyyaml = [ - {file = "PyYAML-5.3-cp27-cp27m-win32.whl", hash = "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d"}, - {file = "PyYAML-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6"}, - {file = "PyYAML-5.3-cp35-cp35m-win32.whl", hash = "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e"}, - {file = "PyYAML-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689"}, - {file = "PyYAML-5.3-cp36-cp36m-win32.whl", hash = "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994"}, - {file = "PyYAML-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e"}, - {file = "PyYAML-5.3-cp37-cp37m-win32.whl", hash = "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5"}, - {file = "PyYAML-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf"}, - {file = "PyYAML-5.3-cp38-cp38-win32.whl", hash = "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811"}, - {file = "PyYAML-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20"}, - {file = "PyYAML-5.3.tar.gz", hash = "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] qrcode = [ {file = "qrcode-6.1-py2.py3-none-any.whl", hash = "sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5"}, {file = "qrcode-6.1.tar.gz", hash = "sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369"}, ] redis = [ - {file = "redis-3.4.0-py2.py3-none-any.whl", hash = "sha256:e933bdb504c69cbd5bdf4e2bb819a99644a36731cef4c59aa637cebfd5ddd4f9"}, - {file = "redis-3.4.0.tar.gz", hash = "sha256:7595976eb0b4e1fc3ad5478f1fd44215a814ee184a7820de92726f559bdff9cd"}, + {file = "redis-3.4.1-py2.py3-none-any.whl", hash = "sha256:b205cffd05ebfd0a468db74f0eedbff8df1a7bfc47521516ade4692991bb0833"}, + {file = "redis-3.4.1.tar.gz", hash = "sha256:0dcfb335921b88a850d461dc255ff4708294943322bd55de6cfd68972490ca1f"}, ] regex = [ - {file = "regex-2020.1.8-cp27-cp27m-win32.whl", hash = "sha256:4e8f02d3d72ca94efc8396f8036c0d3bcc812aefc28ec70f35bb888c74a25161"}, - {file = "regex-2020.1.8-cp27-cp27m-win_amd64.whl", hash = "sha256:e6c02171d62ed6972ca8631f6f34fa3281d51db8b326ee397b9c83093a6b7242"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4eae742636aec40cf7ab98171ab9400393360b97e8f9da67b1867a9ee0889b26"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bd25bb7980917e4e70ccccd7e3b5740614f1c408a642c245019cff9d7d1b6149"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3e77409b678b21a056415da3a56abfd7c3ad03da71f3051bbcdb68cf44d3c34d"}, - {file = "regex-2020.1.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:07b39bf943d3d2fe63d46281d8504f8df0ff3fe4c57e13d1656737950e53e525"}, - {file = "regex-2020.1.8-cp36-cp36m-win32.whl", hash = "sha256:23e2c2c0ff50f44877f64780b815b8fd2e003cda9ce817a7fd00dea5600c84a0"}, - {file = "regex-2020.1.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27429b8d74ba683484a06b260b7bb00f312e7c757792628ea251afdbf1434003"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0e182d2f097ea8549a249040922fa2b92ae28be4be4895933e369a525ba36576"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e3cd21cc2840ca67de0bbe4071f79f031c81418deb544ceda93ad75ca1ee9f7b"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ecc6de77df3ef68fee966bb8cb4e067e84d4d1f397d0ef6fce46913663540d77"}, - {file = "regex-2020.1.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:26ff99c980f53b3191d8931b199b29d6787c059f2e029b2b0c694343b1708c35"}, - {file = "regex-2020.1.8-cp37-cp37m-win32.whl", hash = "sha256:7bcd322935377abcc79bfe5b63c44abd0b29387f267791d566bbb566edfdd146"}, - {file = "regex-2020.1.8-cp37-cp37m-win_amd64.whl", hash = "sha256:10671601ee06cf4dc1bc0b4805309040bb34c9af423c12c379c83d7895622bb5"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:98b8ed7bb2155e2cbb8b76f627b2fd12cf4b22ab6e14873e8641f266e0fb6d8f"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6a6ba91b94427cd49cd27764679024b14a96874e0dc638ae6bdd4b1a3ce97be1"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:6a6ae17bf8f2d82d1e8858a47757ce389b880083c4ff2498dba17c56e6c103b9"}, - {file = "regex-2020.1.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:0932941cdfb3afcbc26cc3bcf7c3f3d73d5a9b9c56955d432dbf8bbc147d4c5b"}, - {file = "regex-2020.1.8-cp38-cp38-win32.whl", hash = "sha256:d58e4606da2a41659c84baeb3cfa2e4c87a74cec89a1e7c56bee4b956f9d7461"}, - {file = "regex-2020.1.8-cp38-cp38-win_amd64.whl", hash = "sha256:e7c7661f7276507bce416eaae22040fd91ca471b5b33c13f8ff21137ed6f248c"}, - {file = "regex-2020.1.8.tar.gz", hash = "sha256:d0f424328f9822b0323b3b6f2e4b9c90960b24743d220763c7f07071e0778351"}, + {file = "regex-2020.4.4-cp27-cp27m-win32.whl", hash = "sha256:90742c6ff121a9c5b261b9b215cb476eea97df98ea82037ec8ac95d1be7a034f"}, + {file = "regex-2020.4.4-cp27-cp27m-win_amd64.whl", hash = "sha256:24f4f4062eb16c5bbfff6a22312e8eab92c2c99c51a02e39b4eae54ce8255cd1"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:08119f707f0ebf2da60d2f24c2f39ca616277bb67ef6c92b72cbf90cbe3a556b"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c9423a150d3a4fc0f3f2aae897a59919acd293f4cb397429b120a5fcd96ea3db"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:c087bff162158536387c53647411db09b6ee3f9603c334c90943e97b1052a156"}, + {file = "regex-2020.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:1cbe0fa0b7f673400eb29e9ef41d4f53638f65f9a2143854de6b1ce2899185c3"}, + {file = "regex-2020.4.4-cp36-cp36m-win32.whl", hash = "sha256:0ce9537396d8f556bcfc317c65b6a0705320701e5ce511f05fc04421ba05b8a8"}, + {file = "regex-2020.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:7e1037073b1b7053ee74c3c6c0ada80f3501ec29d5f46e42669378eae6d4405a"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4385f12aa289d79419fede43f979e372f527892ac44a541b5446617e4406c468"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a58dd45cb865be0ce1d5ecc4cfc85cd8c6867bea66733623e54bd95131f473b6"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ccccdd84912875e34c5ad2d06e1989d890d43af6c2242c6fcfa51556997af6cd"}, + {file = "regex-2020.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ea4adf02d23b437684cd388d557bf76e3afa72f7fed5bbc013482cc00c816948"}, + {file = "regex-2020.4.4-cp37-cp37m-win32.whl", hash = "sha256:2294f8b70e058a2553cd009df003a20802ef75b3c629506be20687df0908177e"}, + {file = "regex-2020.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:e91ba11da11cf770f389e47c3f5c30473e6d85e06d7fd9dcba0017d2867aab4a"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5635cd1ed0a12b4c42cce18a8d2fb53ff13ff537f09de5fd791e97de27b6400e"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:23069d9c07e115537f37270d1d5faea3e0bdded8279081c4d4d607a2ad393683"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c162a21e0da33eb3d31a3ac17a51db5e634fc347f650d271f0305d96601dc15b"}, + {file = "regex-2020.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:fb95debbd1a824b2c4376932f2216cc186912e389bdb0e27147778cf6acb3f89"}, + {file = "regex-2020.4.4-cp38-cp38-win32.whl", hash = "sha256:2a3bf8b48f8e37c3a40bb3f854bf0121c194e69a650b209628d951190b862de3"}, + {file = "regex-2020.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bfed051dbff32fd8945eccca70f5e22b55e4148d2a8a45141a3b053d6455ae3"}, + {file = "regex-2020.4.4.tar.gz", hash = "sha256:295badf61a51add2d428a46b8580309c520d8b26e769868b922750cf3ce67142"}, ] requests = [ - {file = "requests-2.22.0-py2.py3-none-any.whl", hash = "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"}, - {file = "requests-2.22.0.tar.gz", hash = "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"}, + {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, + {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, ] restructuredtext-lint = [ {file = "restructuredtext_lint-1.3.0.tar.gz", hash = "sha256:97b3da356d5b3a8514d8f1f9098febd8b41463bed6a1d9f126cf0a048b6fd908"}, ] safety = [ - {file = "safety-1.8.5-py2.py3-none-any.whl", hash = "sha256:0a3a8a178a9c96242b224f033ee8d1d130c0448b0e6622d12deaf37f6c3b4e59"}, - {file = "safety-1.8.5.tar.gz", hash = "sha256:5059f3ffab3648330548ea9c7403405bbfaf085b11235770825d14c58f24cb78"}, + {file = "safety-1.8.7-py2.py3-none-any.whl", hash = "sha256:05f77773bbab834502328b29ed013677aa53ed0c22b6e330aef7d2a7e1dfd838"}, + {file = "safety-1.8.7.tar.gz", hash = "sha256:3016631e0dd17193d6cf12e8ed1af92df399585e8ee0e4b1300d9e7e32b54903"}, ] scramp = [ - {file = "scramp-1.1.0-py3-none-any.whl", hash = "sha256:e09d2a9be5adeb94cbeb56fc54a61fc5f5b6e140e679b2b60d1f7a8d6478d906"}, - {file = "scramp-1.1.0.tar.gz", hash = "sha256:475aa6296deb2737b86e9df9098e8eca0f30c8ad1cc0a8adadb99ef012a5ceba"}, + {file = "scramp-1.1.1-py3-none-any.whl", hash = "sha256:a2c740624642de84f77327da8f56b2f030c5afd10deccaedbb8eb6108a66dfc1"}, + {file = "scramp-1.1.1.tar.gz", hash = "sha256:b57eb0ae2f9240b15b5d0dab2ea8e40b43eef13ac66d3f627a79ef85a6da0927"}, ] selenium = [ {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"}, @@ -2704,9 +2718,9 @@ six = [ {file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"}, {file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"}, ] -smmap2 = [ - {file = "smmap2-2.0.5-py2.py3-none-any.whl", hash = "sha256:0555a7bf4df71d1ef4218e4807bbf9b201f910174e6e08af2e138d4e517b4dde"}, - {file = "smmap2-2.0.5.tar.gz", hash = "sha256:29a9ffa0497e7f2be94ca0ed1ca1aa3cd4cf25a1f6b4f5f87f74b46ed91d609a"}, +smmap = [ + {file = "smmap-3.0.2-py2.py3-none-any.whl", hash = "sha256:52ea78b3e708d2c2b0cfe93b6fc3fbeec53db913345c26be6ed84c11ed8bebc1"}, + {file = "smmap-3.0.2.tar.gz", hash = "sha256:b46d3fc69ba5f367df96d91f8271e8ad667a198d5a28e215a6c3d9acd133a911"}, ] snowballstemmer = [ {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, @@ -2717,55 +2731,55 @@ soupsieve = [ {file = "soupsieve-1.9.5.tar.gz", hash = "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda"}, ] sphinx = [ - {file = "Sphinx-2.3.1-py3-none-any.whl", hash = "sha256:298537cb3234578b2d954ff18c5608468229e116a9757af3b831c2b2b4819159"}, - {file = "Sphinx-2.3.1.tar.gz", hash = "sha256:e6e766b74f85f37a5f3e0773a1e1be8db3fcb799deb58ca6d18b70b0b44542a5"}, + {file = "Sphinx-2.4.4-py3-none-any.whl", hash = "sha256:fc312670b56cb54920d6cc2ced455a22a547910de10b3142276495ced49231cb"}, + {file = "Sphinx-2.4.4.tar.gz", hash = "sha256:b4c750d546ab6d7e05bdff6ac24db8ae3e8b8253a3569b754e445110a0a12b66"}, ] sphinx-autodoc-typehints = [ {file = "sphinx-autodoc-typehints-1.10.3.tar.gz", hash = "sha256:a6b3180167479aca2c4d1ed3b5cb044a70a76cccd6b38662d39288ebd9f0dff0"}, {file = "sphinx_autodoc_typehints-1.10.3-py3-none-any.whl", hash = "sha256:27c9e6ef4f4451766ab8d08b2d8520933b97beb21c913f3df9ab2e59b56e6c6c"}, ] sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.1.tar.gz", hash = "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897"}, - {file = "sphinxcontrib_applehelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d"}, + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, ] sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.1.tar.gz", hash = "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34"}, - {file = "sphinxcontrib_devhelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981"}, + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] sphinxcontrib-django = [ {file = "sphinxcontrib-django-0.5.1.tar.gz", hash = "sha256:3b48a9067d8db4713d47e3a4160af10288d02d448c866d1b44b001adbe74cc1e"}, {file = "sphinxcontrib_django-0.5.1-py2.py3-none-any.whl", hash = "sha256:73ef7fdbf2ed6d4f35b7ae709032bd5ac493d93cedd0624ea7b51bf5fce41267"}, ] sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-1.0.2.tar.gz", hash = "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422"}, - {file = "sphinxcontrib_htmlhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7"}, + {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, + {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, ] sphinxcontrib-jsmath = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.2.tar.gz", hash = "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f"}, - {file = "sphinxcontrib_qthelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20"}, + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.3.tar.gz", hash = "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227"}, - {file = "sphinxcontrib_serializinghtml-1.1.3-py2.py3-none-any.whl", hash = "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768"}, + {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, + {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, ] sqlparse = [ - {file = "sqlparse-0.3.0-py2.py3-none-any.whl", hash = "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177"}, - {file = "sqlparse-0.3.0.tar.gz", hash = "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"}, + {file = "sqlparse-0.3.1-py2.py3-none-any.whl", hash = "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e"}, + {file = "sqlparse-0.3.1.tar.gz", hash = "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"}, ] stevedore = [ - {file = "stevedore-1.31.0-py2.py3-none-any.whl", hash = "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730"}, - {file = "stevedore-1.31.0.tar.gz", hash = "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14"}, + {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"}, + {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, ] termcolor = [ {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, ] testfixtures = [ - {file = "testfixtures-6.11.0-py2.py3-none-any.whl", hash = "sha256:bde48b041bfe2bf41c0da85af0d04536bed6caf79275ad1a2a2d153c79b5a839"}, - {file = "testfixtures-6.11.0.tar.gz", hash = "sha256:1ef5c8e57b75883593b21c9bd9bd5a5ce7bbd852fc71486dd3c6b913b697b046"}, + {file = "testfixtures-6.14.0-py2.py3-none-any.whl", hash = "sha256:799144b3cbef7b072452d9c36cbd024fef415ab42924b96aad49dfd9c763de66"}, + {file = "testfixtures-6.14.0.tar.gz", hash = "sha256:cdfc3d73cb6d3d4dc3c67af84d912e86bf117d30ae25f02fe823382ef99383d2"}, ] "testing.common.database" = [ {file = "testing.common.database-2.0.3-py2.py3-none-any.whl", hash = "sha256:e3ed492bf480a87f271f74c53b262caf5d85c8bc09989a8f534fa2283ec52492"}, @@ -2785,11 +2799,8 @@ toml = [ {file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"}, ] tqdm = [ - {file = "tqdm-4.42.0-py2.py3-none-any.whl", hash = "sha256:01464d5950e9a07a8e463c2767883d9616c099c6502f6c7ef4e2e11d3065bd35"}, - {file = "tqdm-4.42.0.tar.gz", hash = "sha256:5865f5fef9d739864ff341ddaa69894173ebacedb1aaafcf014de56343d01d5c"}, -] -twilio = [ - {file = "twilio-6.35.3.tar.gz", hash = "sha256:4474fa87fde5ea5526e296be782d1b06fc6722f9e4698a503c47b5c2f8b70ea9"}, + {file = "tqdm-4.45.0-py2.py3-none-any.whl", hash = "sha256:ea9e3fd6bd9a37e8783d75bfc4c1faf3c6813da6bd1c3e776488b41ec683af94"}, + {file = "tqdm-4.45.0.tar.gz", hash = "sha256:00339634a22c10a7a22476ee946bbde2dbe48d042ded784e4d88e0236eca5d81"}, ] typed-ast = [ {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, @@ -2815,9 +2826,9 @@ typed-ast = [ {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.1-py2-none-any.whl", hash = "sha256:910f4656f54de5993ad9304959ce9bb903f90aadc7c67a0bef07e678014e892d"}, - {file = "typing_extensions-3.7.4.1-py3-none-any.whl", hash = "sha256:cf8b63fedea4d89bab840ecbb93e75578af28f76f66c35889bd7065f5af88575"}, - {file = "typing_extensions-3.7.4.1.tar.gz", hash = "sha256:091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2"}, + {file = "typing_extensions-3.7.4.2-py2-none-any.whl", hash = "sha256:f8d2bd89d25bc39dabe7d23df520442fa1d8969b82544370e03d88b5a591c392"}, + {file = "typing_extensions-3.7.4.2-py3-none-any.whl", hash = "sha256:6e95524d8a547a91e08f404ae485bbb71962de46967e1b71a0cb89af24e761c5"}, + {file = "typing_extensions-3.7.4.2.tar.gz", hash = "sha256:79ee589a3caca649a9bfd2a8de4709837400dfa00b6cc81962a1e6a1815969ae"}, ] urllib3 = [ {file = "urllib3-1.25.8-py2.py3-none-any.whl", hash = "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc"}, @@ -2827,15 +2838,23 @@ vine = [ {file = "vine-1.3.0-py2.py3-none-any.whl", hash = "sha256:ea4947cc56d1fd6f2095c8d543ee25dad966f78692528e68b4fada11ba3f98af"}, {file = "vine-1.3.0.tar.gz", hash = "sha256:133ee6d7a9016f177ddeaf191c1f58421a1dcc6ee9a42c58b34bed40e1d2cd87"}, ] +virtualenv = [ + {file = "virtualenv-20.0.17-py2.py3-none-any.whl", hash = "sha256:00cfe8605fb97f5a59d52baab78e6070e72c12ca64f51151695407cc0eb8a431"}, + {file = "virtualenv-20.0.17.tar.gz", hash = "sha256:c8364ec469084046c779c9a11ae6340094e8a0bf1d844330fc55c1cefe67c172"}, +] +virtualenv-clone = [ + {file = "virtualenv-clone-0.5.4.tar.gz", hash = "sha256:665e48dd54c84b98b71a657acb49104c54e7652bce9c1c4f6c6976ed4c827a29"}, + {file = "virtualenv_clone-0.5.4-py2.py3-none-any.whl", hash = "sha256:07e74418b7cc64f4fda987bf5bc71ebd59af27a7bc9e8a8ee9fd54b1f2390a27"}, +] wcwidth = [ - {file = "wcwidth-0.1.8-py2.py3-none-any.whl", hash = "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603"}, - {file = "wcwidth-0.1.8.tar.gz", hash = "sha256:f28b3e8a6483e5d49e7f8949ac1a78314e740333ae305b4ba5defd3e74fb37a8"}, + {file = "wcwidth-0.1.9-py2.py3-none-any.whl", hash = "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1"}, + {file = "wcwidth-0.1.9.tar.gz", hash = "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1"}, ] -yubiotp = [ - {file = "YubiOTP-0.2.2.post1-py2.py3-none-any.whl", hash = "sha256:7e281801b24678f4bda855ce8ab975a7688a912f5a6cb22b6c2b16263a93cbd2"}, - {file = "YubiOTP-0.2.2.post1.tar.gz", hash = "sha256:de83b1560226e38b5923f6ab919f962c8c2abb7c722104cb45b2b6db2ac86e40"}, +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, ] zipp = [ - {file = "zipp-2.1.0-py3-none-any.whl", hash = "sha256:ccc94ed0909b58ffe34430ea5451f07bc0c76467d7081619a454bf5c98b89e28"}, - {file = "zipp-2.1.0.tar.gz", hash = "sha256:feae2f18633c32fc71f2de629bfb3bd3c9325cd4419642b1f1da42ee488d9b98"}, + {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, + {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, ] diff --git a/pyproject.toml b/pyproject.toml index 42ae4b0b3490adc35a492f20950d0de8eeaf5afc..02448d52ad00c58009c4ba7cb4244f2a3c7da808 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ description = "AlekSIS (School Information System) — Core" authors = ["Dominik George <dominik.george@teckids.org>", "Julian Leucker <leuckeju@katharineum.de>", "mirabilos <thorsten.glaser@teckids.org>", "Frank Poetzsch-Heffter <p-h@katharineum.de>", "Tom Teichler <tom.teichler@teckids.org>", "Jonathan Weth <wethjo@katharineum.de>", "Hangzhi Yu <yuha@katharineum.de>"] license = "EUPL-1.2" homepage = "https://aleksis.org/" -repository = "https://edugit.org/AlekSIS/AlekSIS" +repository = "https://edugit.org/AlekSIS/Official/AlekSIS" documentation = "https://aleksis.edugit.io/AlekSIS/docs/html/" classifiers = [ "Environment :: Web Environment", @@ -23,7 +23,6 @@ classifiers = [ python = "^3.7" Django = "^3.0" django-any-js = "^1.0" -django-bootstrap4 = "^1.0" django-debug-toolbar = "^2.0" django-easy-audit = {version ="^1.2rc1", allow-prereleases = true} django-middleware-global-request = "^0.1.2" @@ -50,7 +49,7 @@ requests = "^2.22" django-two-factor-auth = { version = "^1.10.0", extras = [ "YubiKey", "phonenumbers", "Call", "SMS" ] } django-yarnpkg = "^6.0" django-material = "^1.6.0" -django-pwa = {git = "https://github.com/Natureshadow/django-pwa", rev = "67cf917a081df3116968f684ebb28e4c076b2b50" } +django-pwa = "^1.0.8" django-constance = { version = "^2.6.0", extras = ["database"] } django_widget_tweaks = "^1.4.5" django-filter = "^2.2.0" @@ -61,14 +60,21 @@ django-js-reverse = "^0.9.1" calendarweek = "^0.4.3" Celery = {version="^4.4.0", optional=true, extras=["django", "redis"]} django-celery-results = {version="^1.1.2", optional=true} -django-celery-beat = {version="^1.5.0", optional=true} +django-celery-beat = {version="^2.0.0", optional=true} django-celery-email = {version="^3.0.0", optional=true} django-jsonstore = "^0.4.1" django-polymorphic = "^2.1.2" +django-otp = "0.7.5" +django-colorfield = "^0.2.1" +django-bleach = "^0.6.1" +django-memoize = "^2.2.1" +django-haystack = "^3.0" +celery-haystack = {version="^0.3.1", optional=true} +django-dbbackup = "^3.3.0" [tool.poetry.extras] ldap = ["django-auth-ldap"] -celery = ["Celery", "django-celery-results", "django-celery-beat", "django-celery-email"] +celery = ["Celery", "django-celery-results", "django-celery-beat", "django-celery-email", "celery-haystack"] [tool.poetry.dev-dependencies] sphinx = "^2.1"