diff --git a/src/c3nav/locale/de/LC_MESSAGES/django.po b/src/c3nav/locale/de/LC_MESSAGES/django.po index e6fc68e8..ba644845 100644 --- a/src/c3nav/locale/de/LC_MESSAGES/django.po +++ b/src/c3nav/locale/de/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-24 23:00+0100\n" -"PO-Revision-Date: 2024-12-24 23:04+0100\n" +"POT-Creation-Date: 2024-12-25 11:49+0100\n" +"PO-Revision-Date: 2024-12-25 11:50+0100\n" "Last-Translator: Laura Klünder \n" "Language-Team: \n" "Language: de\n" @@ -2918,10 +2918,6 @@ msgstr "via Control Panel" msgid "Map update" msgstr "Kartenänderung" -#: c3nav/mapdata/quests/simple.py -msgid "Ranging Beacon Altitude" -msgstr "Höhe des Ranging Beacons" - #: c3nav/mapdata/quests/simple.py #, python-format msgid "How many meters above ground is the access point “%s” mounted?" @@ -2931,6 +2927,10 @@ msgstr "Wie viele meter über dem Boden ist der access point „%s“ befestigt? msgid "The AP should not be 0m above ground." msgstr "Der AP sollte sich nicht 0m über dem Boden befinden." +#: c3nav/mapdata/quests/simple.py +msgid "Ranging Beacon Altitude" +msgstr "Höhe des Ranging Beacons" + #: c3nav/mapdata/tasks.py #, python-format msgid "%d map update processed." @@ -4189,6 +4189,77 @@ msgstr[1] "" msgid "Route from %s to %s" msgstr "Route von %s nach %s" +#: c3nav/site/views.py +msgid "I do not read fefe or i only read the sports section." +msgstr "Ich lese kein Fefe oder nur den Sportteil." + +#: c3nav/site/views.py +msgid "" +"I am not affiliated with Automattic in any way, financially or otherwise." +msgstr "" +"Ich bin in keiner Weise, weder finanziell noch anderweitig, Automattic " +"angehörig." + +#: c3nav/site/views.py +msgid "" +"I am not Anish Kapoor, i am in no way affiliated to Anish Kapoor, I am not " +"signing in on behalf of Anish Kapoor or an associate of Anish Kapoor. To the " +"best of my knowledge, information and belief, this account will not make its " +"way into the hands of Anish Kapoor." +msgstr "" +"Ich bin nicht Anish Kapoor, ich bin in keiner Weise mit Anish Kapoor " +"verbunden, ich melde mich nicht im Namen von Anish Kapoor oder eines " +"Mitarbeiters von Anish Kapoor an. Nach meinem besten Wissen und Gewissen " +"wird dieses Konto nicht in die Hände von Anish Kapoor gelangen." + +#: c3nav/site/views.py +msgid "I do not use generative AI to create cheap assets for my talk slides." +msgstr "" +"Ich verwende keine generative KI, um billige Assets für meine Vortragsfolien " +"zu erstellen." + +#: c3nav/site/views.py +msgid "I have not checked this checkbox." +msgstr "Ich habe diese Checkbox nicht aktiviert." + +#: c3nav/site/views.py +msgid "" +"I will not harm any human being, catgirl or similar creature nor through " +"inaction permit any such creature to be harmed." +msgstr "" +"Ich werde keinem Menschen, Catgirl oder ähnlichen Lebewesen Schaden zufügen " +"und auch nicht durch Untätigkeit zulassen, dass einem solchen Lebewesen " +"Schaden zugefügt wird." + +#: c3nav/site/views.py +msgid "I am not a robot or i am at least a cute one." +msgstr "Ich bin kein Roboter oder wenn, dann ein cuter Roboter." + +#: c3nav/site/views.py +msgid "I am a robot." +msgstr "Ich bin ein Roboter." + +#: c3nav/site/views.py +msgid "Trans rights!" +msgstr "Trans rights!" + +#: c3nav/site/views.py +msgid "Be excellent to each other." +msgstr "Be excellent to each other." + +#: c3nav/site/views.py +msgid "" +"I acknowledge that any checkboxes shown under this form are optional, non-" +"mandatory serving suggestions." +msgstr "" +"Ich erkenne an, dass alle Checkboxen unter diesem Formular optionale, nicht-" +"verpflichtende Serviervorschläge sind." + +#: c3nav/site/views.py +msgid "If you do not like this checkbox, reload to get another one." +msgstr "" +"Wenn dir diese Checkbox nicht gefällt, lade die Seite neu für eine andere." + #: c3nav/site/views.py msgid "account creation is currently disabled." msgstr "Benutzerregistrierung ist momentan deaktiviert." diff --git a/src/c3nav/site/static/site/css/c3nav.scss b/src/c3nav/site/static/site/css/c3nav.scss index 52a30788..a992f948 100644 --- a/src/c3nav/site/static/site/css/c3nav.scss +++ b/src/c3nav/site/static/site/css/c3nav.scss @@ -195,6 +195,21 @@ main.account form { width: 100%; } +form label:has(+[type=checkbox]) { + float: right; + width: calc(100% - 25px); + margin-bottom: 1px; +} +form [type=checkbox] { + margin-bottom: 1px; +} +form [type=checkbox]+.helptext { + clear: both; + display: block; + mrgin-top: 1px; + margin-bottom: 1px; +} + #modal-content p, main.account p { margin-bottom: 10px; } diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index f2ddd019..f71714e6 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -1,4 +1,5 @@ import json +import random from itertools import chain from typing import Optional from urllib.parse import urlparse @@ -14,6 +15,7 @@ from django.core.exceptions import ObjectDoesNotExist, SuspiciousOperation, Vali from django.core.paginator import Paginator from django.core.serializers.json import DjangoJSONEncoder from django.db import transaction +from django.forms.fields import BooleanField from django.http import Http404, HttpResponse, HttpResponseBadRequest, QueryDict from django.middleware import csrf from django.shortcuts import get_object_or_404, redirect, render @@ -47,7 +49,6 @@ from c3nav.routing.models import RouteOptions from c3nav.site.forms import APISecretForm, DeleteAccountForm, PositionForm, PositionSetForm, ReportUpdateForm from c3nav.site.models import Announcement, SiteUpdate - if settings.METRICS: from prometheus_client import Counter @@ -292,6 +293,24 @@ def migrate_access_permissions_after_login(request): transaction.on_commit(lambda: cache.delete(AccessPermission.request_access_permission_key(request))) +login_options = ( + _('I do not read fefe or i only read the sports section.'), + _('I am not affiliated with Automattic in any way, financially or otherwise.'), + _('I am not Anish Kapoor, i am in no way affiliated to Anish Kapoor, I am not signing in on behalf of ' + 'Anish Kapoor or an associate of Anish Kapoor. To the best of my knowledge, information and belief, this account ' + 'will not make its way into the hands of Anish Kapoor.'), + _('I do not use generative AI to create cheap assets for my talk slides.'), + _('I have not checked this checkbox.'), + _('I will not harm any human being, catgirl or similar creature nor through inaction permit any such creature ' + 'to be harmed.'), + _('I am not a robot or i am at least a cute one.'), + _('I am a robot.'), + _('Trans rights!'), + _('Be excellent to each other.'), + _('I acknowledge that any checkboxes shown under this form are optional, non-mandatory serving suggestions.'), +) + + @never_cache def login_view(request): if request.user.is_authenticated: @@ -306,6 +325,9 @@ def login_view(request): else: form = AuthenticationForm(request) + form.fields["check"] = BooleanField(required=False, label=random.choice(login_options), + help_text=_('If you do not like this checkbox, reload to get another one.')) + redirect_path = request.GET.get(REDIRECT_FIELD_NAME, '/account/') if referer := request.headers.get('Referer', None): referer = urlparse(referer)