diff --git a/AKModel/admin.py b/AKModel/admin.py index 65f4b6a67130fd84480b301b3812c1991ba053cc..3d37232595a7efacfa17ebab69466103214c44d5 100644 --- a/AKModel/admin.py +++ b/AKModel/admin.py @@ -19,7 +19,7 @@ from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequire ConstraintViolation, DefaultSlot from AKModel.urls import get_admin_urls_event_wizard, get_admin_urls_event from AKModel.views import CVMarkResolvedView, CVSetLevelViolationView, CVSetLevelWarningView, AKResetInterestView, \ - AKResetInterestCounterView, PlanPublishView, PlanUnpublishView + AKResetInterestCounterView, PlanPublishView, PlanUnpublishView, DefaultSlotEditorView class EventRelatedFieldListFilter(RelatedFieldListFilter): @@ -55,6 +55,7 @@ class EventAdmin(admin.ModelAdmin): urls.extend([ path('plan/publish/', PlanPublishView.as_view(), name="plan-publish"), path('plan/unpublish/', PlanUnpublishView.as_view(), name="plan-unpublish"), + path('<slug:event_slug>/defaultSlots/', DefaultSlotEditorView.as_view(), name="default-slots-editor"), ]) urls.extend(super().get_urls()) return urls diff --git a/AKModel/forms.py b/AKModel/forms.py index 3aa9486813bc9fb91ee21860fc8614bb0ff96cfa..0f09a63b1d0bbd312201863743a6c080972a9b91 100644 --- a/AKModel/forms.py +++ b/AKModel/forms.py @@ -101,3 +101,14 @@ class SlideExportForm(AdminIntermediateForm): coerce=lambda x: x == "True", help_text=_("Create symbols indicating space to note down owners and timeslots for wishes, e.g., to be filled " "out on a touch screen while presenting?")) + + +class DefaultSlotEditorForm(AdminIntermediateForm): + availabilities = forms.CharField( + label=_('Default Slots'), + help_text=_( + 'Click and drag to mark the availability during the event, double-click to delete.' # Adapted help text + ), + widget=forms.TextInput(attrs={'class': 'availabilities-editor-data'}), + required=True, + ) diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 117543220b4d609760fca0ce68d78a74b6cc0337..5a302db39b93066d738d3fb84561945f57ddaf87 100644 --- a/AKModel/locale/de_DE/LC_MESSAGES/django.po +++ b/AKModel/locale/de_DE/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-26 23:16+0100\n" +"POT-Creation-Date: 2022-11-29 00:13+0100\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" @@ -11,7 +11,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: AKModel/admin.py:62 AKModel/admin.py:65 +#: AKModel/admin.py:63 AKModel/admin.py:66 #: AKModel/templates/admin/AKModel/event_wizard/activate.html:32 #: AKModel/templates/admin/AKModel/event_wizard/created_prepare_import.html:48 #: AKModel/templates/admin/AKModel/event_wizard/finish.html:21 @@ -21,59 +21,59 @@ msgstr "" msgid "Status" msgstr "Status" -#: AKModel/admin.py:67 +#: AKModel/admin.py:68 msgid "Toggle plan visibility" msgstr "Plansichtbarkeit ändern" -#: AKModel/admin.py:71 AKModel/admin.py:82 AKModel/views.py:481 +#: AKModel/admin.py:72 AKModel/admin.py:83 AKModel/views.py:483 msgid "Publish plan" msgstr "Plan veröffentlichen" -#: AKModel/admin.py:74 AKModel/admin.py:87 AKModel/views.py:491 +#: AKModel/admin.py:75 AKModel/admin.py:88 AKModel/views.py:493 msgid "Unpublish plan" msgstr "Plan verbergen" -#: AKModel/admin.py:159 +#: AKModel/admin.py:160 msgid "Wish" msgstr "AK-Wunsch" -#: AKModel/admin.py:165 +#: AKModel/admin.py:166 msgid "Is wish" msgstr "Ist ein Wunsch" -#: AKModel/admin.py:166 +#: AKModel/admin.py:167 msgid "Is not a wish" msgstr "Ist kein Wunsch" -#: AKModel/admin.py:210 +#: AKModel/admin.py:211 msgid "Export to wiki syntax" msgstr "In Wiki-Syntax exportieren" -#: AKModel/admin.py:219 +#: AKModel/admin.py:220 msgid "Cannot export AKs from more than one event at the same time." msgstr "Kann nicht AKs von mehreren Events zur selben Zeit exportieren." -#: AKModel/admin.py:234 AKModel/views.py:461 +#: AKModel/admin.py:235 AKModel/views.py:463 msgid "Reset interest in AKs" msgstr "Interesse an AKs zurücksetzen" -#: AKModel/admin.py:239 AKModel/views.py:471 +#: AKModel/admin.py:240 AKModel/views.py:473 msgid "Reset AKs' interest counters" msgstr "Interessenszähler der AKs zurücksetzen" -#: AKModel/admin.py:323 AKModel/admin.py:330 +#: AKModel/admin.py:324 AKModel/admin.py:331 msgid "AK Details" msgstr "AK-Details" -#: AKModel/admin.py:382 AKModel/views.py:431 +#: AKModel/admin.py:383 AKModel/views.py:433 msgid "Mark Constraint Violations as manually resolved" msgstr "Markiere Constraintverletzungen als manuell behoben" -#: AKModel/admin.py:387 AKModel/views.py:441 +#: AKModel/admin.py:388 AKModel/views.py:443 msgid "Set Constraint Violations to level \"violation\"" msgstr "Constraintverletzungen auf Level \"Violation\" setzen" -#: AKModel/admin.py:392 AKModel/views.py:451 +#: AKModel/admin.py:393 AKModel/views.py:453 msgid "Set Constraint Violations to level \"warning\"" msgstr "Constraintverletzungen auf Level \"Warning\" setzen" @@ -81,7 +81,7 @@ msgstr "Constraintverletzungen auf Level \"Warning\" setzen" msgid "Availability" msgstr "Verfügbarkeit" -#: AKModel/availability/forms.py:23 +#: AKModel/availability/forms.py:23 AKModel/forms.py:110 msgid "" "Click and drag to mark the availability during the event, double-click to " "delete." @@ -208,6 +208,10 @@ msgstr "" "fürWünsche markieren, z.B. um während der Präsentation auf einem Touchscreen " "ausgefüllt zu werden?" +#: AKModel/forms.py:108 AKModel/models.py:658 +msgid "Default Slots" +msgstr "Standardslots" + #: AKModel/models.py:18 AKModel/models.py:175 AKModel/models.py:199 #: AKModel/models.py:218 AKModel/models.py:232 AKModel/models.py:250 #: AKModel/models.py:346 @@ -244,7 +248,7 @@ msgstr "Zeitzone" msgid "Time Zone where this event takes place in" msgstr "Zeitzone in der das Event stattfindet" -#: AKModel/models.py:27 AKModel/views.py:242 +#: AKModel/models.py:27 AKModel/views.py:244 msgid "Start" msgstr "Start" @@ -540,7 +544,7 @@ msgstr "AK präsentieren" msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: AKModel/models.py:273 AKModel/templates/admin/AKModel/status.html:102 +#: AKModel/models.py:273 AKModel/templates/admin/AKModel/status.html:104 msgid "Requirements" msgstr "Anforderungen" @@ -597,7 +601,7 @@ msgstr "Anzahl Personen, die online Interesse bekundet haben" #: AKModel/models.py:295 AKModel/models.py:502 #: AKModel/templates/admin/AKModel/status.html:56 -#: AKModel/templates/admin/AKModel/status.html:63 AKModel/views.py:360 +#: AKModel/templates/admin/AKModel/status.html:63 AKModel/views.py:362 msgid "AKs" msgstr "AKs" @@ -839,10 +843,6 @@ msgstr "Details" msgid "Default Slot" msgstr "Standardslot" -#: AKModel/models.py:658 -msgid "Default Slots" -msgstr "Standardslots" - #: AKModel/models.py:662 msgid "Slot End" msgstr "Ende des Slots" @@ -906,7 +906,7 @@ msgid "Successfully imported.<br><br>Do you want to activate your event now?" msgstr "Erfolgreich importiert.<br><br>Soll das Event jetzt aktiviert werden?" #: AKModel/templates/admin/AKModel/event_wizard/activate.html:27 -#: AKModel/views.py:247 +#: AKModel/views.py:249 msgid "Finish" msgstr "Abschluss" @@ -971,7 +971,7 @@ msgid "No AKs with this requirement" msgstr "Kein AK mit dieser Anforderung" #: AKModel/templates/admin/AKModel/requirements_overview.html:45 -#: AKModel/templates/admin/AKModel/status.html:118 +#: AKModel/templates/admin/AKModel/status.html:120 msgid "Add Requirement" msgstr "Anforderung hinzufügen" @@ -1024,35 +1024,39 @@ msgstr "AKs, die besondere Aufmerksamkeit benötigen" msgid "Enter Interest" msgstr "Interesse erfassen" -#: AKModel/templates/admin/AKModel/status.html:93 +#: AKModel/templates/admin/AKModel/status.html:93 AKModel/views.py:505 +msgid "Edit Default Slots" +msgstr "Standardslots bearbeiten" + +#: AKModel/templates/admin/AKModel/status.html:95 msgid "Manage ak tracks" msgstr "AK-Tracks verwalten" -#: AKModel/templates/admin/AKModel/status.html:95 +#: AKModel/templates/admin/AKModel/status.html:97 msgid "Export AKs as CSV" msgstr "AKs als CSV exportieren" -#: AKModel/templates/admin/AKModel/status.html:97 +#: AKModel/templates/admin/AKModel/status.html:99 msgid "Export AKs for Wiki" msgstr "AKs im Wiki-Format exportieren" -#: AKModel/templates/admin/AKModel/status.html:99 AKModel/views.py:330 +#: AKModel/templates/admin/AKModel/status.html:101 AKModel/views.py:332 msgid "Export AK Slides" msgstr "AK-Folien exportieren" -#: AKModel/templates/admin/AKModel/status.html:104 +#: AKModel/templates/admin/AKModel/status.html:106 msgid "No requirements yet" msgstr "Bisher keine Anforderungen" -#: AKModel/templates/admin/AKModel/status.html:117 +#: AKModel/templates/admin/AKModel/status.html:119 msgid "Show AKs for requirements" msgstr "Zu Anforderungen gehörige AKs anzeigen" -#: AKModel/templates/admin/AKModel/status.html:121 +#: AKModel/templates/admin/AKModel/status.html:123 msgid "Messages" msgstr "Nachrichten" -#: AKModel/templates/admin/AKModel/status.html:123 +#: AKModel/templates/admin/AKModel/status.html:125 msgid "Delete all messages" msgstr "Alle Nachrichten löschen" @@ -1089,136 +1093,148 @@ msgstr "Login" msgid "Register" msgstr "Registrieren" -#: AKModel/views.py:148 +#: AKModel/views.py:150 msgid "Event Status" msgstr "Eventstatus" -#: AKModel/views.py:161 +#: AKModel/views.py:163 msgid "Requirements for Event" msgstr "Anforderungen für das Event" -#: AKModel/views.py:175 +#: AKModel/views.py:177 msgid "AK CSV Export" msgstr "AK-CSV-Export" -#: AKModel/views.py:189 +#: AKModel/views.py:191 msgid "AK Wiki Export" msgstr "AK-Wiki-Export" -#: AKModel/views.py:197 AKModel/views.py:346 +#: AKModel/views.py:199 AKModel/views.py:348 msgid "Wishes" msgstr "Wünsche" -#: AKModel/views.py:218 +#: AKModel/views.py:220 msgid "Delete AK Orga Messages" msgstr "AK-Organachrichten löschen" -#: AKModel/views.py:233 +#: AKModel/views.py:235 msgid "AK Orga Messages successfully deleted" msgstr "AK-Organachrichten erfolgreich gelöscht" -#: AKModel/views.py:243 +#: AKModel/views.py:245 msgid "Settings" msgstr "Einstellungen" -#: AKModel/views.py:244 +#: AKModel/views.py:246 msgid "Event created, Prepare Import" msgstr "Event angelegt, Import vorbereiten" -#: AKModel/views.py:245 +#: AKModel/views.py:247 msgid "Import categories & requirements" msgstr "Kategorien & Anforderungen kopieren" -#: AKModel/views.py:246 +#: AKModel/views.py:248 msgid "Activate?" msgstr "Aktivieren?" -#: AKModel/views.py:305 +#: AKModel/views.py:307 #, python-format msgid "Copied '%(obj)s'" msgstr "'%(obj)s' kopiert" -#: AKModel/views.py:308 +#: AKModel/views.py:310 #, python-format msgid "Could not copy '%(obj)s' (%(error)s)" msgstr "'%(obj)s' konnte nicht kopiert werden (%(error)s)" -#: AKModel/views.py:341 +#: AKModel/views.py:343 msgid "Symbols" msgstr "Symbole" -#: AKModel/views.py:342 +#: AKModel/views.py:344 msgid "Who?" msgstr "Wer?" -#: AKModel/views.py:343 +#: AKModel/views.py:345 msgid "Duration(s)" msgstr "Dauer(n)" -#: AKModel/views.py:344 +#: AKModel/views.py:346 msgid "Reso intention?" msgstr "Resolutionsabsicht?" -#: AKModel/views.py:345 +#: AKModel/views.py:347 msgid "Category (for Wishes)" msgstr "Kategorie (für Wünsche)" -#: AKModel/views.py:433 +#: AKModel/views.py:435 msgid "The following Constraint Violations will be marked as manually resolved" msgstr "" "Die folgenden Constraintverletzungen werden als manuell behoben markiert." -#: AKModel/views.py:434 +#: AKModel/views.py:436 msgid "Constraint Violations marked as resolved" msgstr "Constraintverletzungen als manuell behoben markiert" -#: AKModel/views.py:443 +#: AKModel/views.py:445 msgid "The following Constraint Violations will be set to level 'violation'" msgstr "" "Die folgenden Constraintverletzungen werden auf das Level \"Violation\" " "gesetzt." -#: AKModel/views.py:444 +#: AKModel/views.py:446 msgid "Constraint Violations set to level 'violation'" msgstr "Constraintverletzungen auf Level \"Violation\" gesetzt" -#: AKModel/views.py:453 +#: AKModel/views.py:455 msgid "The following Constraint Violations will be set to level 'warning'" msgstr "" "Die folgenden Constraintverletzungen werden auf das Level 'warning' gesetzt." -#: AKModel/views.py:454 +#: AKModel/views.py:456 msgid "Constraint Violations set to level 'warning'" msgstr "Constraintverletzungen auf Level \"Warning\" gesetzt" -#: AKModel/views.py:463 +#: AKModel/views.py:465 msgid "Interest of the following AKs will be set to not filled (-1):" msgstr "Interesse an den folgenden AKs wird auf nicht ausgefüllt (-1) gesetzt:" -#: AKModel/views.py:464 +#: AKModel/views.py:466 msgid "Reset of interest in AKs successful." msgstr "Interesse an AKs erfolgreich zurückgesetzt." -#: AKModel/views.py:473 +#: AKModel/views.py:475 msgid "Interest counter of the following AKs will be set to 0:" msgstr "Interessensbekundungszähler der folgenden AKs wird auf 0 gesetzt:" -#: AKModel/views.py:474 +#: AKModel/views.py:476 msgid "AKs' interest counters set back to 0." msgstr "Interessenszähler der AKs zurückgesetzt" -#: AKModel/views.py:483 +#: AKModel/views.py:485 msgid "Publish the plan(s) of:" msgstr "Den Plan/die Pläne veröffentlichen von:" -#: AKModel/views.py:484 +#: AKModel/views.py:486 msgid "Plan published" msgstr "Plan veröffentlicht" -#: AKModel/views.py:493 +#: AKModel/views.py:495 msgid "Unpublish the plan(s) of:" msgstr "Den Plan/die Pläne verbergen von:" -#: AKModel/views.py:494 +#: AKModel/views.py:496 msgid "Plan unpublished" msgstr "Plan verborgen" + +#: AKModel/views.py:542 +#, python-brace-format +msgid "Could not update slot {id} since it does not belong to {event}" +msgstr "" +"Konnte Slot {id} nicht bearbeiten, da er nicht zum Event {event} gehört" + +#: AKModel/views.py:572 +#, python-brace-format +msgid "Updated {u} slot(s). created {c} new slot(s) and deleted {d} slot(s)" +msgstr "" +"{u} Slot(s) aktualisiert, {c} Slot(s) hinzugefügt und {d} Slot(s) gelöscht" diff --git a/AKModel/models.py b/AKModel/models.py index fe8b9a7f138a83d79f0623471e5b622725a23f02..2844ab8ad496ee2f43c9f1b764f8177a381ea804 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -671,9 +671,17 @@ class DefaultSlot(models.Model): def start_simplified(self): return self.start.astimezone(self.event.timezone).strftime('%a %H:%M') + @property + def start_iso(self): + return timezone.localtime(self.start, self.event.timezone).strftime("%Y-%m-%dT%H:%M:%S") + @property def end_simplified(self): return self.end.astimezone(self.event.timezone).strftime('%a %H:%M') + @property + def end_iso(self): + return timezone.localtime(self.end, self.event.timezone).strftime("%Y-%m-%dT%H:%M:%S") + def __str__(self): return f"{self.event}: {self.start_simplified} - {self.end_simplified}" diff --git a/AKModel/templates/admin/AKModel/default_slot_editor.html b/AKModel/templates/admin/AKModel/default_slot_editor.html new file mode 100644 index 0000000000000000000000000000000000000000..c3004e357649fe4c226c40113e1761b2ec16c955 --- /dev/null +++ b/AKModel/templates/admin/AKModel/default_slot_editor.html @@ -0,0 +1,30 @@ +{% extends "admin/AKModel/action_intermediate.html" %} +{% load tags_AKModel %} +{% load i18n admin_urls %} +{% load static %} +{% load bootstrap4 %} +{% load tz %} + +{% block extrahead %} + {{ block.super }} + {% bootstrap_javascript jquery='slim' %} + {% include "AKModel/load_fullcalendar_availabilities.html" %} + + <script> + {% get_current_language as LANGUAGE_CODE %} + + document.addEventListener('DOMContentLoaded', function () { + createAvailabilityEditors( + '{{ event.timezone }}', + '{{ LANGUAGE_CODE }}', + '{{ event.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}', + '{{ event.end | timezone:event.timezone | date:"Y-m-d H:i:s" }}' + ); + }); + </script> +{% endblock %} + +{% block action_preview %} + <h3>{{ event.name }}</h3> +{% endblock %} + diff --git a/AKModel/templates/admin/AKModel/status.html b/AKModel/templates/admin/AKModel/status.html index d279efeafa139ae7f9c82ba7be404ea4a3474a2e..8530e444719bbb2be948dc55f7376ed0f23bee01 100644 --- a/AKModel/templates/admin/AKModel/status.html +++ b/AKModel/templates/admin/AKModel/status.html @@ -89,6 +89,8 @@ <a class="btn btn-success" href="{% url 'admin:enter-interest' event_slug=event.slug pk=event.ak_set.all.first.pk %}">{% trans "Enter Interest" %}</a> {% endif %} + <a class="btn btn-success" + href="{% url 'admin:default-slots-editor' event_slug=event.slug %}">{% trans "Edit Default Slots" %}</a> <a class="btn btn-success" href="{% url 'admin:tracks_manage' event_slug=event.slug %}">{% trans "Manage ak tracks" %}</a> <a class="btn btn-success" diff --git a/AKModel/views.py b/AKModel/views.py index 9bb8edc0cd97876d9714f51adfbd4667c4b4c565..76ead0da0e45f5a2b57089558ba13b6a15f6411c 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -1,3 +1,4 @@ +import json import os import tempfile from abc import ABC, abstractmethod @@ -7,6 +8,7 @@ from django.contrib import admin, messages from django.db.models.functions import Now from django.shortcuts import get_object_or_404, redirect from django.urls import reverse_lazy, reverse +from django.utils.dateparse import parse_datetime from django.utils.translation import gettext_lazy as _ from django.views.generic import TemplateView, DetailView, ListView, DeleteView, CreateView, FormView, UpdateView from django_tex.core import render_template_with_context, run_tex_in_directory @@ -15,9 +17,9 @@ from rest_framework import viewsets, permissions, mixins from AKModel.forms import NewEventWizardStartForm, NewEventWizardSettingsForm, NewEventWizardPrepareImportForm, \ NewEventWizardImportForm, NewEventWizardActivateForm, AdminIntermediateForm, SlideExportForm, \ - AdminIntermediateActionForm + AdminIntermediateActionForm, DefaultSlotEditorForm from AKModel.models import Event, AK, AKSlot, Room, AKTrack, AKCategory, AKOwner, AKOrgaMessage, AKRequirement, \ - ConstraintViolation + ConstraintViolation, DefaultSlot from AKModel.serializers import AKSerializer, AKSlotSerializer, RoomSerializer, AKTrackSerializer, AKCategorySerializer, \ AKOwnerSerializer @@ -495,3 +497,79 @@ class PlanUnpublishView(IntermediateAdminActionView): def action(self, form): self.entities.update(plan_published_at=None, plan_hidden=True) + + +class DefaultSlotEditorView(EventSlugMixin, IntermediateAdminView): + template_name = "admin/AKModel/default_slot_editor.html" + form_class = DefaultSlotEditorForm + title = _("Edit Default Slots") + + def get_success_url(self): + return self.request.path + + def get_initial(self): + initial = super().get_initial() + default_slots = [ + {"id": s.id, "start": s.start_iso, "end": s.end_iso, "allDay": False} + for s in self.event.defaultslot_set.all() + ] + initial['availabilities'] = json.dumps({ + 'availabilities': default_slots + }) + return initial + + def form_valid(self, form): + default_slots_raw = json.loads(form.cleaned_data['availabilities'])["availabilities"] + tz = self.event.timezone + + created_count = 0 + updated_count = 0 + + previous_slot_ids = set(s.id for s in self.event.defaultslot_set.all()) + + for slot in default_slots_raw: + start = tz.localize(parse_datetime(slot["start"])) + end = tz.localize(parse_datetime(slot["end"])) + + if slot["id"] != '': + id = int(slot["id"]) + if id not in previous_slot_ids: + # Make sure only slots (currently) belonging to this event are edited + # (user did not manipulate IDs and slots have not been deleted in another session in the meantime) + messages.add_message( + self.request, + messages.WARNING, + _("Could not update slot {id} since it does not belong to {event}") + .format(id=slot['id'], event=self.event.name) + ) + else: + # Update existing entries + previous_slot_ids.remove(id) + original_slot = DefaultSlot.objects.get(id=id) + if original_slot.start != start or original_slot.end != end: + original_slot.start = start + original_slot.end = end + original_slot.save() + updated_count += 1 + else: + # Create new entries + DefaultSlot.objects.create( + start=start, + end=end, + event=self.event + ) + created_count += 1 + + # Delete all slots not re-submitted by the user (and hence deleted in editor) + deleted_count = len(previous_slot_ids) + for d_id in previous_slot_ids: + DefaultSlot.objects.get(id=d_id).delete() + + if created_count + updated_count + deleted_count > 0: + messages.add_message( + self.request, + messages.SUCCESS, + _("Updated {u} slot(s). created {c} new slot(s) and deleted {d} slot(s)") + .format(u=str(updated_count), c=str(created_count), d=str(deleted_count)) + ) + return super().form_valid(form) diff --git a/AKScheduling/locale/de_DE/LC_MESSAGES/django.po b/AKScheduling/locale/de_DE/LC_MESSAGES/django.po index 309bcc6ef88e1f391d941a24e3a0f36445e2c1be..6326be76f8a6be3468014eb86e93b9e74012430d 100644 --- a/AKScheduling/locale/de_DE/LC_MESSAGES/django.po +++ b/AKScheduling/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-11-26 23:16+0100\n" +"POT-Creation-Date: 2022-11-29 00:13+0100\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" @@ -39,52 +39,53 @@ msgstr "" msgid "Constraint Violations for" msgstr "" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:78 -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:133 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:44 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:100 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:214 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:293 msgid "No violations" msgstr "Keine Verletzungen" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:85 -msgid "Cannot load current violations from server" -msgstr "Kann die aktuellen Verletzungen nicht vom Server laden" - -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:110 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:77 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:264 msgid "Violation(s)" msgstr "Verletzung(en)" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:113 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:80 msgid "Auto reload?" msgstr "Automatisch neu laden?" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:117 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:84 msgid "Reload now" msgstr "Jetzt neu laden" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:123 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:90 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:200 msgid "Violation" msgstr "Verletzung" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:124 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:91 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:287 msgid "Problem" msgstr "Problem" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:125 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:92 msgid "Details" msgstr "Details" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:126 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:93 msgid "Since" msgstr "Seit" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:139 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:106 #: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:243 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:209 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:250 #: AKScheduling/templates/admin/AKScheduling/special_attention.html:48 #: AKScheduling/templates/admin/AKScheduling/unscheduled.html:34 msgid "Event Status" msgstr "Event-Status" -#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:141 +#: AKScheduling/templates/admin/AKScheduling/constraint_violations.html:108 msgid "Scheduling" msgstr "Scheduling" @@ -93,7 +94,8 @@ msgid "Submit" msgstr "Abschicken" #: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:11 -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:10 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:19 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:247 msgid "Scheduling for" msgstr "Scheduling für" @@ -129,26 +131,34 @@ msgstr "AK-Track hinzufügen" msgid "AKs without track" msgstr "AKs ohne Track" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:91 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:92 msgid "Day (Horizontal)" msgstr "Tag (horizontal)" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:98 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:99 msgid "Day (Vertical)" msgstr "Tag (vertikal)" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:109 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:110 msgid "Event (Horizontal)" msgstr "Event (horizontal)" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:118 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:119 msgid "Event (Vertical)" msgstr "Event (vertikal)" -#: AKScheduling/templates/admin/AKScheduling/scheduling.html:146 +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:147 msgid "Room" msgstr "Raum" +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:261 +msgid "Unscheduled" +msgstr "Micht gescheduled" + +#: AKScheduling/templates/admin/AKScheduling/scheduling.html:286 +msgid "Level" +msgstr "Level" + #: AKScheduling/templates/admin/AKScheduling/special_attention.html:14 msgid "AKs with public notes" msgstr "AKs mit öffentlichen Kommentaren" @@ -235,3 +245,6 @@ msgstr "Konnte keine Verfügbarkeit anlegen für AK: {ak}" #, python-brace-format msgid "Created default availabilities for {count} AKs" msgstr "Standardverfügbarkeiten für {count} AKs angelegt" + +#~ msgid "Cannot load current violations from server" +#~ msgstr "Kann die aktuellen Verletzungen nicht vom Server laden"