Skip to content
Snippets Groups Projects
Commit cc370cbf authored by Nadja Geisler's avatar Nadja Geisler :sunny:
Browse files

Merge branch 'main' of gitlab.fachschaften.org:kif/akplanning

parents 2c2a5311 53e284c1
Branches
No related tags found
No related merge requests found
Showing
with 4368 additions and 170 deletions
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-03 17:40+0000\n"
"POT-Creation-Date: 2021-04-29 21:09+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"
......
......@@ -95,6 +95,18 @@ class AKTrackAdmin(admin.ModelAdmin):
kwargs['initial'] = Event.get_next_active()
return super(AKTrackAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
def get_urls(self):
urls = super().get_urls()
custom_urls = []
if apps.is_installed("AKScheduling"):
from AKScheduling.views import TrackAdminView
custom_urls.extend([
path('<slug:event_slug>/manage/', self.admin_site.admin_view(TrackAdminView.as_view()),
name="tracks_manage"),
])
return custom_urls + urls
@admin.register(AKTag)
class AKTagAdmin(admin.ModelAdmin):
......
......@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-29 17:43+0000\n"
"POT-Creation-Date: 2021-04-29 21:09+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,23 +18,23 @@ msgstr ""
msgid "Status"
msgstr "Status"
#: AKModel/admin.py:123
#: AKModel/admin.py:135
msgid "Wish"
msgstr "AK-Wunsch"
#: AKModel/admin.py:129
#: AKModel/admin.py:141
msgid "Is wish"
msgstr "Ist ein Wunsch"
#: AKModel/admin.py:130
#: AKModel/admin.py:142
msgid "Is not a wish"
msgstr "Ist kein Wunsch"
#: AKModel/admin.py:157
#: AKModel/admin.py:169
msgid "Export to wiki syntax"
msgstr "In Wiki-Syntax exportieren"
#: AKModel/admin.py:253
#: AKModel/admin.py:265
msgid "AK Details"
msgstr "AK-Details"
......@@ -64,14 +64,14 @@ msgstr "Bitte Verfügbarkeiten eintragen!"
#: AKModel/availability/models.py:38 AKModel/models.py:47 AKModel/models.py:76
#: AKModel/models.py:128 AKModel/models.py:147 AKModel/models.py:179
#: AKModel/models.py:233 AKModel/models.py:292 AKModel/models.py:324
#: AKModel/models.py:431
#: AKModel/models.py:233 AKModel/models.py:298 AKModel/models.py:330
#: AKModel/models.py:437
msgid "Event"
msgstr "Event"
#: AKModel/availability/models.py:39 AKModel/models.py:77 AKModel/models.py:129
#: AKModel/models.py:148 AKModel/models.py:180 AKModel/models.py:234
#: AKModel/models.py:293 AKModel/models.py:325 AKModel/models.py:432
#: AKModel/models.py:299 AKModel/models.py:331 AKModel/models.py:438
msgid "Associated event"
msgstr "Zugehöriges Event"
......@@ -83,8 +83,8 @@ msgstr "Person"
msgid "Person whose availability this is"
msgstr "Person deren Verfügbarkeit hier abgebildet wird"
#: AKModel/availability/models.py:56 AKModel/models.py:296
#: AKModel/models.py:315 AKModel/models.py:440
#: AKModel/availability/models.py:56 AKModel/models.py:302
#: AKModel/models.py:321 AKModel/models.py:446
msgid "Room"
msgstr "Raum"
......@@ -93,7 +93,7 @@ msgid "Room whose availability this is"
msgstr "Raum dessen Verfügbarkeit hier abgebildet wird"
#: AKModel/availability/models.py:65 AKModel/models.py:239
#: AKModel/models.py:314 AKModel/models.py:387
#: AKModel/models.py:320 AKModel/models.py:393
msgid "AK"
msgstr "AK"
......@@ -102,7 +102,7 @@ msgid "AK whose availability this is"
msgstr "Verfügbarkeiten"
#: AKModel/availability/models.py:74 AKModel/models.py:132
#: AKModel/models.py:446
#: AKModel/models.py:452
msgid "AK Category"
msgstr "AK-Kategorie"
......@@ -116,7 +116,7 @@ msgstr "Verfügbarkeiten"
#: AKModel/models.py:16 AKModel/models.py:123 AKModel/models.py:144
#: AKModel/models.py:163 AKModel/models.py:177 AKModel/models.py:195
#: AKModel/models.py:285
#: AKModel/models.py:291
msgid "Name"
msgstr "Name"
......@@ -266,7 +266,7 @@ msgstr "Internet Link"
msgid "Link to Homepage"
msgstr "Link zu Homepage oder Webseite"
#: AKModel/models.py:80 AKModel/models.py:439
#: AKModel/models.py:80 AKModel/models.py:445
msgid "AK Owner"
msgstr "AK-Leitung"
......@@ -326,7 +326,7 @@ msgstr "AK-Tags"
msgid "Name of the Requirement"
msgstr "Name der Anforderung"
#: AKModel/models.py:183 AKModel/models.py:443
#: AKModel/models.py:183 AKModel/models.py:449
msgid "AK Requirement"
msgstr "AK-Anforderung"
......@@ -410,7 +410,7 @@ msgstr "AK präsentieren"
msgid "Present results of this AK"
msgstr "Die Ergebnisse dieses AKs vorstellen"
#: AKModel/models.py:218 AKModel/templates/admin/AKModel/status.html:83
#: AKModel/models.py:218 AKModel/templates/admin/AKModel/status.html:85
msgid "Requirements"
msgstr "Anforderungen"
......@@ -463,244 +463,244 @@ msgstr "Interessenszähler"
msgid "People who have indicated interest online"
msgstr "Anzahl Personen, die online Interesse bekundet haben"
#: AKModel/models.py:240 AKModel/models.py:434
#: AKModel/models.py:240 AKModel/models.py:440
#: AKModel/templates/admin/AKModel/status.html:49
#: AKModel/templates/admin/AKModel/status.html:56
msgid "AKs"
msgstr "AKs"
#: AKModel/models.py:285
#: AKModel/models.py:291
msgid "Name or number of the room"
msgstr "Name oder Nummer des Raums"
#: AKModel/models.py:286
#: AKModel/models.py:292
msgid "Location"
msgstr "Ort"
#: AKModel/models.py:287
#: AKModel/models.py:293
msgid "Name or number of the location"
msgstr "Name oder Nummer des Ortes"
#: AKModel/models.py:288
#: AKModel/models.py:294
msgid "Capacity"
msgstr "Kapazität"
#: AKModel/models.py:288
#: AKModel/models.py:294
msgid "Maximum number of people"
msgstr "Maximale Personenzahl"
#: AKModel/models.py:289
#: AKModel/models.py:295
msgid "Properties"
msgstr "Eigenschaften"
#: AKModel/models.py:290
#: AKModel/models.py:296
msgid "AK requirements fulfilled by the room"
msgstr "AK-Anforderungen, die dieser Raum erfüllt"
#: AKModel/models.py:297 AKModel/templates/admin/AKModel/status.html:33
#: AKModel/models.py:303 AKModel/templates/admin/AKModel/status.html:33
msgid "Rooms"
msgstr "Räume"
#: AKModel/models.py:314
#: AKModel/models.py:320
msgid "AK being mapped"
msgstr "AK, der zugeordnet wird"
#: AKModel/models.py:316
#: AKModel/models.py:322
msgid "Room the AK will take place in"
msgstr "Raum in dem der AK stattfindet"
#: AKModel/models.py:317
#: AKModel/models.py:323
msgid "Slot Begin"
msgstr "Beginn des Slots"
#: AKModel/models.py:317
#: AKModel/models.py:323
msgid "Time and date the slot begins"
msgstr "Zeit und Datum zu der der AK beginnt"
#: AKModel/models.py:319
#: AKModel/models.py:325
msgid "Duration"
msgstr "Dauer"
#: AKModel/models.py:320
#: AKModel/models.py:326
msgid "Length in hours"
msgstr "Länge in Stunden"
#: AKModel/models.py:322
#: AKModel/models.py:328
msgid "Scheduling fixed"
msgstr "Planung fix"
#: AKModel/models.py:322
#: AKModel/models.py:328
msgid "Length and time of this AK should not be changed"
msgstr "Dauer und Zeit dieses AKs sollten nicht verändert werden"
#: AKModel/models.py:327
#: AKModel/models.py:333
msgid "Last update"
msgstr "Letzte Aktualisierung"
#: AKModel/models.py:330
#: AKModel/models.py:336
msgid "AK Slot"
msgstr "AK-Slot"
#: AKModel/models.py:331 AKModel/models.py:436
#: AKModel/models.py:337 AKModel/models.py:442
msgid "AK Slots"
msgstr "AK-Slot"
msgstr "AK-Slots"
#: AKModel/models.py:353 AKModel/models.py:362
#: AKModel/models.py:359 AKModel/models.py:368
msgid "Not scheduled yet"
msgstr "Noch nicht geplant"
#: AKModel/models.py:388
#: AKModel/models.py:394
msgid "AK this message belongs to"
msgstr "AK zu dem die Nachricht gehört"
#: AKModel/models.py:389
#: AKModel/models.py:395
msgid "Message text"
msgstr "Nachrichtentext"
#: AKModel/models.py:390
#: AKModel/models.py:396
msgid "Message to the organizers. This is not publicly visible."
msgstr ""
"Nachricht an die Organisator*innen. Diese ist nicht öffentlich sichtbar."
#: AKModel/models.py:394
#: AKModel/models.py:400
msgid "AK Orga Message"
msgstr "AK-Organachricht"
#: AKModel/models.py:395
#: AKModel/models.py:401
msgid "AK Orga Messages"
msgstr "AK-Organachrichten"
#: AKModel/models.py:404
#: AKModel/models.py:410
msgid "Constraint Violation"
msgstr "Constraintverletzung"
#: AKModel/models.py:405
#: AKModel/models.py:411
msgid "Constraint Violations"
msgstr "Constraintverletzungen"
#: AKModel/models.py:409
#: AKModel/models.py:415
msgid "Owner has two parallel slots"
msgstr "Leitung hat zwei Slots parallel"
#: AKModel/models.py:410
#: AKModel/models.py:416
msgid "AK Slot was scheduled outside the AK's availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeit des AKs platziert"
#: AKModel/models.py:411
#: AKModel/models.py:417
msgid "Room has two AK slots scheduled at the same time"
msgstr "Raum hat AK Slots gleichzeitig"
msgstr "Raum hat zwei AK Slots gleichzeitig"
#: AKModel/models.py:412
#: AKModel/models.py:418
msgid "Room does not satisfy the requirement of the scheduled AK"
msgstr "Room erfüllt die Anforderungen des platzierten AKs nicht"
#: AKModel/models.py:413
#: AKModel/models.py:419
msgid "AK Slot is scheduled at the same time as an AK listed as a conflict"
msgstr ""
"AK Slot wurde wurde zur gleichen Zeit wie ein Konflikt des AKs platziert"
#: AKModel/models.py:414
#: AKModel/models.py:420
msgid "AK Slot is scheduled before an AK listed as a prerequisite"
msgstr "AK Slot wurde vor einem als Voraussetzung gelisteten AK platziert"
#: AKModel/models.py:416
#: AKModel/models.py:422
msgid ""
"AK Slot for AK with intention to submit a resolution is scheduled after "
"resolution deadline"
msgstr ""
"AK Slot eines AKs mit Resoabsicht wurde nach der Resodeadline platziert"
#: AKModel/models.py:417
#: AKModel/models.py:423
msgid "AK Slot in a category is outside that categories availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeiten seiner Kategorie"
#: AKModel/models.py:418
#: AKModel/models.py:424
msgid "Two AK Slots for the same AK scheduled at the same time"
msgstr "Zwei AK Slots eines AKs wurden zur selben Zeit platziert"
#: AKModel/models.py:419
#: AKModel/models.py:425
msgid "AK Slot is scheduled in a room with less space than interest"
msgstr ""
"AK Slot wurde in einem Raum mit weniger Plätzen als am AK Interessierten "
"platziert"
#: AKModel/models.py:420
#: AKModel/models.py:426
msgid "AK Slot is scheduled outside the event's availabilities"
msgstr "AK Slot wurde außerhalb der Verfügbarkeit des Events platziert"
#: AKModel/models.py:423
#: AKModel/models.py:429
msgid "Warning"
msgstr "Warnung"
#: AKModel/models.py:424
#: AKModel/models.py:430
msgid "Violation"
msgstr "Verletzung"
#: AKModel/models.py:426
#: AKModel/models.py:432
msgid "Type"
msgstr "Art"
#: AKModel/models.py:427
#: AKModel/models.py:433
msgid "Type of violation, i.e. what kind of constraint was violated"
msgstr "Art der Verletzung, gibt an welche Art Constraint verletzt wurde"
#: AKModel/models.py:428
#: AKModel/models.py:434
msgid "Level"
msgstr "Level"
#: AKModel/models.py:429
#: AKModel/models.py:435
msgid "Severity level of the violation"
msgstr "Schweregrad der Verletzung"
#: AKModel/models.py:435
#: AKModel/models.py:441
msgid "AK(s) belonging to this constraint"
msgstr "AK(s), die zu diesem Constraint gehören"
#: AKModel/models.py:437
#: AKModel/models.py:443
msgid "AK Slot(s) belonging to this constraint"
msgstr "AK Slot(s), die zu diesem Constraint gehören"
#: AKModel/models.py:439
#: AKModel/models.py:445
msgid "AK Owner belonging to this constraint"
msgstr "AK Leitung(en), die zu diesem Constraint gehören"
#: AKModel/models.py:441
#: AKModel/models.py:447
msgid "Room belonging to this constraint"
msgstr "Raum, der zu diesem Constraint gehört"
#: AKModel/models.py:444
#: AKModel/models.py:450
msgid "AK Requirement belonging to this constraint"
msgstr "AK Anforderung, die zu diesem Constraint gehört"
#: AKModel/models.py:446
#: AKModel/models.py:452
msgid "AK Category belonging to this constraint"
msgstr "AK Kategorie, di zu diesem Constraint gehört"
#: AKModel/models.py:448
#: AKModel/models.py:454
msgid "Comment"
msgstr "Kommentar"
#: AKModel/models.py:448
#: AKModel/models.py:454
msgid "Comment or further details for this violation"
msgstr "Kommentar oder weitere Details zu dieser Vereletzung"
#: AKModel/models.py:451
#: AKModel/models.py:457
msgid "Timestamp"
msgstr "Timestamp"
#: AKModel/models.py:451
#: AKModel/models.py:457
msgid "Time of creation"
msgstr "Zeitpunkt der ERstellung"
#: AKModel/models.py:452
#: AKModel/models.py:458
msgid "Manually Resolved"
msgstr "Manuell behoben"
#: AKModel/models.py:453
#: AKModel/models.py:459
msgid "Mark this violation manually as resolved"
msgstr "Markiere diese Verletzung manuell als behoben"
#: AKModel/models.py:475
#: AKModel/models.py:481
#: AKModel/templates/admin/AKModel/requirements_overview.html:27
msgid "Details"
msgstr "Details"
......@@ -735,8 +735,7 @@ msgid "Delete AK Orga Messages"
msgstr "AK-Organachrichten löschen"
#: AKModel/templates/admin/AKModel/message_delete.html:11
#, fuzzy, python-format
#| msgid "Are you sure you want to delete all orga messages for "
#, python-format
msgid ""
"Are you sure you want to delete all orga messages for %(event)s? This will "
"permanently delete %(message_count)s message(s):"
......@@ -765,7 +764,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:99
#: AKModel/templates/admin/AKModel/status.html:101
msgid "Add Requirement"
msgstr "Anforderung hinzufügen"
......@@ -807,26 +806,30 @@ msgid "Scheduling"
msgstr "Scheduling"
#: AKModel/templates/admin/AKModel/status.html:78
msgid "Manage ak tracks"
msgstr "AK-Tracks verwalten"
#: AKModel/templates/admin/AKModel/status.html:80
msgid "Export AKs as CSV"
msgstr "AKs als CSV exportieren"
#: AKModel/templates/admin/AKModel/status.html:80
#: AKModel/templates/admin/AKModel/status.html:82
msgid "Export AKs for Wiki"
msgstr "AKs im Wiki-Format exportieren"
#: AKModel/templates/admin/AKModel/status.html:85
#: AKModel/templates/admin/AKModel/status.html:87
msgid "No requirements yet"
msgstr "Bisher keine Anforderungen"
#: AKModel/templates/admin/AKModel/status.html:98
#: AKModel/templates/admin/AKModel/status.html:100
msgid "Show AKs for requirements"
msgstr "Zu Anforderungen gehörige AKs anzeigen"
#: AKModel/templates/admin/AKModel/status.html:102
#: AKModel/templates/admin/AKModel/status.html:104
msgid "Messages"
msgstr "Nachrichten"
#: AKModel/templates/admin/AKModel/status.html:104
#: AKModel/templates/admin/AKModel/status.html:106
msgid "Delete all messages"
msgstr "Alle Nachrichten löschen"
......@@ -834,23 +837,23 @@ msgstr "Alle Nachrichten löschen"
msgid "Active Events"
msgstr "Aktive Events"
#: AKModel/views.py:130
#: AKModel/views.py:135
msgid "Event Status"
msgstr "Eventstatus"
#: AKModel/views.py:143
#: AKModel/views.py:148
msgid "Requirements for Event"
msgstr "Anforderungen für das Event"
#: AKModel/views.py:157
#: AKModel/views.py:162
msgid "AK CSV Export"
msgstr "AK-CSV-Export"
#: AKModel/views.py:171
#: AKModel/views.py:176
msgid "AK Wiki Export"
msgstr "AK-Wiki-Export"
#: AKModel/views.py:191
#: AKModel/views.py:196
msgid "AK Orga Messages successfully deleted"
msgstr "AK-Organachrichten erfolgreich gelöscht"
......
# Generated by Django 3.1.5 on 2021-01-29 15:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('AKModel', '0042_akslot_fixed'),
]
operations = [
migrations.AlterField(
model_name='akslot',
name='fixed',
field=models.BooleanField(default=False, help_text='Length and time of this AK should not be changed', verbose_name='Scheduling fixed'),
),
]
# Generated by Django 3.1.5 on 2021-01-29 15:44
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('AKModel', '0043_akslot_fixed_improve_verbose_name'),
]
operations = [
migrations.RemoveField(
model_name='historicalak',
name='interest_counter',
),
]
......@@ -233,7 +233,7 @@ class AK(models.Model):
event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name=_('Event'),
help_text=_('Associated event'))
history = HistoricalRecords()
history = HistoricalRecords(excluded_fields=['interest_counter'])
class Meta:
verbose_name = _('AK')
......@@ -266,13 +266,19 @@ class AK(models.Model):
def durations_list(self):
return ", ".join(str(slot.duration) for slot in self.akslot_set.all())
@property
def tags_list(self):
return ", ".join(str(tag) for tag in self.tags.all())
@property
def wish(self):
return self.owners.count() == 0
def increment_interest(self):
self.interest_counter += 1
self.skip_history_when_saving = True
self.save()
del self.skip_history_when_saving
@property
def availabilities(self):
......
......@@ -74,6 +74,8 @@
<a class="btn btn-success"
href="{% url 'admin:schedule' event_slug=event.slug %}">{% trans "Scheduling" %}</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"
href="{% url 'admin:ak_csv_export' event_slug=event.slug %}">{% trans "Export AKs as CSV" %}</a>
<a class="btn btn-success"
......
......@@ -38,6 +38,11 @@ class EventSlugMixin:
self._load_event()
return super().create(request, *args, **kwargs)
def initial(self, request, *args, **kwargs):
if self.event is None:
self._load_event()
super().initial(request, *args, **kwargs)
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(object_list=object_list, **kwargs)
# Add event to context (to make it accessible in templates)
......@@ -87,7 +92,7 @@ class AKCategoryViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListMo
return AKCategory.objects.filter(event=self.event)
class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
serializer_class = AKTrackSerializer
......@@ -95,7 +100,7 @@ class AKTrackViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModel
return AKTrack.objects.filter(event=self.event)
class AKViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
class AKViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
serializer_class = AKSerializer
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-03 17:40+0000\n"
"POT-Creation-Date: 2021-04-29 21:09+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"
......@@ -23,7 +23,7 @@ msgstr ""
msgid "Plan"
msgstr "Plan"
#: AKPlan/templates/AKPlan/plan_base.html:28
#: AKPlan/templates/AKPlan/plan_base.html:21
msgid "Write to organizers of this event for questions and comments"
msgstr "Fragen oder Kommentare? Schreib den Orgas dieses Events eine Mail"
......@@ -38,7 +38,7 @@ msgstr "Veranstaltung"
#: AKPlan/templates/AKPlan/plan_index.html:53
#: AKPlan/templates/AKPlan/plan_room.html:13
#: AKPlan/templates/AKPlan/plan_room.html:59
#: AKPlan/templates/AKPlan/plan_wall.html:57
#: AKPlan/templates/AKPlan/plan_wall.html:50
msgid "Room"
msgstr "Raum"
......@@ -63,12 +63,12 @@ msgid "AK Wall"
msgstr "AK-Wall"
#: AKPlan/templates/AKPlan/plan_index.html:124
#: AKPlan/templates/AKPlan/plan_wall.html:86
#: AKPlan/templates/AKPlan/plan_wall.html:79
msgid "Current AKs"
msgstr "Aktuelle AKs"
#: AKPlan/templates/AKPlan/plan_index.html:131
#: AKPlan/templates/AKPlan/plan_wall.html:91
#: AKPlan/templates/AKPlan/plan_wall.html:84
msgid "Next AKs"
msgstr "Nächste AKs"
......
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-03 17:40+0000\n"
"POT-Creation-Date: 2021-04-29 21:09+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,10 +17,10 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: AKPlanning/settings.py:131
#: AKPlanning/settings.py:133
msgid "German"
msgstr "Deutsch"
#: AKPlanning/settings.py:132
#: AKPlanning/settings.py:134
msgid "English"
msgstr "Englisch"
# 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: 2021-04-29 21:09+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"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:11
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:10
msgid "Scheduling for"
msgstr "Scheduling für"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:126
msgid "Name of new ak track"
msgstr "Name des neuen AK-Tracks"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:142
msgid "Could not create ak track"
msgstr "Konnte neuen AK-Track nicht anlegen"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:168
msgid "Could not update ak track name"
msgstr "Konnte Namen des AK-Tracks nicht ändern"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:174
msgid "Do you really want to delete this ak track?"
msgstr "Soll dieser AK-Track wirklich gelöscht werden?"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:188
msgid "Could not delete ak track"
msgstr "AK-Track konnte nicht gelöscht werden"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:200
msgid "Manage AK Tracks"
msgstr "AK-Tracks verwalten"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:201
msgid "Add ak track"
msgstr "AK-Track hinzufügen"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:206
msgid "AKs without track"
msgstr "AKs ohne Track"
#: AKScheduling/templates/admin/AKScheduling/manage_tracks.html:240
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:197
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:34
msgid "Event Status"
msgstr "Event-Status"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:87
msgid "Day (Horizontal)"
msgstr "Tag (horizontal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:94
msgid "Day (Vertical)"
msgstr "Tag (vertikal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:105
msgid "Event (Horizontal)"
msgstr "Event (horizontal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:114
msgid "Event (Vertical)"
msgstr "Event (vertikal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:141
msgid "Room"
msgstr "Raum"
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:7
msgid "Unscheduled AK Slots"
msgstr "Noch nicht geschedulte AK-Slots"
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:11
msgid "Count"
msgstr "Anzahl"
{% extends "admin/base_site.html" %}
{% load tags_AKModel %}
{% load i18n %}
{% load l10n %}
{% load tz %}
{% load static %}
{% load tags_AKPlan %}
{% load fontawesome_5 %}
{% block title %}{% trans "Scheduling for" %} {{event}}{% endblock %}
{% block extrahead %}
{{ block.super }}
<script src="{% static "common/vendor/sortable/sortable.min.js" %}"></script>
<script src="{% static "common/vendor/sortable/jquery-sortable.js" %}"></script>
<style>
.ak-list {
padding-left: 5px;
user-select: none;
height: 100%;
}
.ak-list > li {
cursor: move;
}
.track-delete {
cursor: pointer;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function () {
// CSRF Protection/Authentication
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
function mark_dirty(container) {
container.removeClass("border-success").addClass("border-warning")
}
function mark_clean(container) {
container.removeClass("border-warning").addClass("border-success");
}
function update_ak_track(ak_id, track_id, container) {
mark_dirty(container);
$.ajax({
url: "{% url "model:AK-list" event_slug=event.slug %}" + ak_id + "/",
type: 'PATCH',
data: {
track: track_id,
},
success: function (response) {
mark_clean(container);
},
error: function (response) {
alert("ERROR. Did not update " + changeInfo.event.title)
}
});
}
sortable_options = {
"group": 'ak-lists',
'sort': false,
// Element is dropped into the list from another list
onAdd: function (/**Event*/evt) {
// same properties as onEnd
console.log(evt.item);
var ak_id = evt.item.dataset["akId"];
var container = $(evt.to).parents(".track-container");
if(evt.to.dataset["sync"]==="true")
{
var track_id = evt.to.dataset["trackId"]
update_ak_track(ak_id, track_id, container);
}
else {
update_ak_track(ak_id, "");
}
},
};
$('.ak-list').sortable(sortable_options);
// Display tooltips containing the tags for each list item (if available)
$('.ak-list li').each(function() {
$(this).tooltip({title: $(this).attr('data-title'), trigger: 'hover'});
});
// Add a new track container (and make usable for dragging)
$('#btn-add-track').click(function () {
var new_track_name = prompt("{% trans 'Name of new ak track' %}");
$.ajax({
url: "{% url "model:AKTrack-list" event_slug=event.slug %}",
type: 'POST',
data: {
name: new_track_name,
event: "{{ event.pk }}"
},
success: function (response) {
console.log(response);
$('<div class="card border-success mb-3 track-container" style="width: 20rem;margin-right:20px;margin-bottom: 20px;"><div class="card-header"><span class="btn btn-danger float-right track-delete" data-track-id="' + response["id"] + '">{% fa5_icon "trash" "fas" %}</span><input class="track-name" data-track-id="None" type="text" value="' + response["name"] + '"></div><div class="card-body"><ul data-track-id="' + response["id"] + '" data-name="' + response["name"] + '" data-sync="true" class="ak-list"></ul></div></div>')
.appendTo($("#workspace"))
.find("ul").sortable(sortable_options)
},
error: function (response) {
console.error(response);
alert("{% trans 'Could not create ak track' %}");
}
});
});
$('#workspace')
// React to track name changes
.on('change', '.track-name', function () {
var track_name_field = $(this);
var new_track_name = track_name_field.val();
var track_id = track_name_field.attr("data-track-id");
var container = track_name_field.parents(".track-container")
mark_dirty(container);
$.ajax({
url: "{% url "model:AKTrack-list" event_slug=event.slug %}" + track_id + "/",
type: 'PATCH',
data: {
name: new_track_name,
},
success: function (response) {
console.log(response);
mark_clean(container);
},
error: function (response) {
console.error(response);
alert("{% trans 'Could not update ak track name' %}");
}
});
})
// Allow to delete a track
.on('click', '.track-delete', function () {
if(confirm("{% trans 'Do you really want to delete this ak track?' %}")) {
var track_delete_button = $(this);
var track_id = track_delete_button.data("trackId");
$.ajax({
url: "{% url "model:AKTrack-list" event_slug=event.slug %}" + track_id + "/",
type: 'DELETE',
data: {},
success: function (response) {
console.log(response);
track_delete_button.parents(".track-container").remove();
},
error: function (response) {
console.error(response);
alert("{% trans 'Could not delete ak track' %}");
}
});
}
});
});
</script>
{% endblock extrahead %}
{% block content %}
<div class="mb-5">
<h3>{{ event }}: {% trans "Manage AK Tracks" %}</h3>
<a id="btn-add-track" href="#" class="btn btn-primary">{% fa5_icon "plus" "fas" %} {% trans "Add ak track" %}</a>
</div>
<div id="workspace" class="row" style="">
<div class="card border-primary mb-3" style="width: 20rem;margin-right:20px;margin-bottom: 20px;">
<div class="card-header">{% trans "AKs without track" %}</div>
<div class="card-body">
<ul data-id="None" data-sync="false" class="ak-list">
{% for ak in aks_without_track %}
<li data-ak-id="{{ ak.pk }}" data-toggle="tooltip" data-placement="top" title="" data-title="{{ ak.tags_list }}">
{{ ak.name }} ({{ ak.category }})
</li>
{% endfor %}
</ul>
</div>
</div>
{% for track in tracks %}
<div class="card border-success mb-3 track-container" style="width: 20rem;margin-right:20px;margin-bottom: 20px;">
<div class="card-header">
<span class="btn btn-danger float-right track-delete" data-track-id="{{ track.pk }}">
{% fa5_icon "trash" "fas" %}
</span>
<input class="track-name" data-track-id="{{ track.pk }}" type="text" value="{{ track }}">
</div>
<div class="card-body">
<ul data-track-id="{{ track.pk }}" data-name="{{ track }}" data-sync="true" class="ak-list">
{% for ak in track.ak_set.all %}
<li data-ak-id="{{ ak.pk }}" data-toggle="tooltip" data-placement="top" title="" data-title="{{ ak.tags_list }}">
{{ ak.name }} ({{ ak.category }})
</li>
{% endfor %}
</ul>
</div>
</div>
{% endfor %}
</div>
<a href="{% url 'admin:event_status' event.slug %}">{% trans "Event Status" %}</a>
{% endblock %}
from django.views.generic import ListView
from django.utils.translation import gettext_lazy as _
from AKModel.availability.models import Availability
from AKModel.models import AKSlot
from AKModel.models import AKSlot, AKTrack
from AKModel.views import AdminViewMixin, FilterByEventSlugMixin
......@@ -37,3 +36,14 @@ class SchedulingAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView):
context["end"] = self.event.end
return context
class TrackAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView):
template_name = "admin/AKScheduling/manage_tracks.html"
model = AKTrack
context_object_name = "tracks"
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(object_list=object_list, **kwargs)
context["aks_without_track"] = self.event.ak_set.filter(track=None)
return context
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-03 20:41+0000\n"
"POT-Creation-Date: 2021-04-29 21:09+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"
......@@ -85,6 +85,7 @@ msgid "Interest"
msgstr "Interesse"
#: AKSubmission/templates/AKSubmission/ak_detail.html:40
#: AKSubmission/templates/AKSubmission/ak_table.html:56
msgid "Show Interest"
msgstr "Interesse bekunden"
......@@ -111,7 +112,7 @@ msgid "Add confidential message to organizers"
msgstr "Sende eine provate Nachricht an das Organisationsteam"
#: AKSubmission/templates/AKSubmission/ak_detail.html:62
#: AKSubmission/templates/AKSubmission/ak_detail.html:202
#: AKSubmission/templates/AKSubmission/ak_detail.html:210
#: AKSubmission/templates/AKSubmission/ak_edit.html:16
#: AKSubmission/templates/AKSubmission/ak_table.html:53
msgid "Edit"
......@@ -124,7 +125,7 @@ msgid "AK Wish"
msgstr "AK-Wunsch"
#: AKSubmission/templates/AKSubmission/ak_detail.html:74
#, python-format "
#, python-format
msgid ""
"\n"
" This AK currently takes place for another "
......@@ -151,7 +152,7 @@ msgstr ""
" "
#: AKSubmission/templates/AKSubmission/ak_detail.html:87
#: AKSubmission/templates/AKSubmission/ak_detail.html:210
#: AKSubmission/templates/AKSubmission/ak_detail.html:218
msgid "Go to virtual room"
msgstr "Zum virtuellen Raum"
......@@ -172,8 +173,10 @@ msgid "Track"
msgstr "Track"
#: AKSubmission/templates/AKSubmission/ak_detail.html:114
msgid "Present AK results"
msgstr "AK-Ergebnisse vorstellen"
#, fuzzy
#| msgid "Present results of this AK"
msgid "Present this AK"
msgstr "Die Ergebnisse dieses AKs vorstellen"
#: AKSubmission/templates/AKSubmission/ak_detail.html:118
#: AKSubmission/templates/AKSubmission/ak_table.html:12
......@@ -200,40 +203,40 @@ msgstr "Vorausgesetzte AKs"
msgid "Notes"
msgstr "Notizen"
#: AKSubmission/templates/AKSubmission/ak_detail.html:177
#: AKSubmission/templates/AKSubmission/akslot_delete.html:35
msgid "Duration"
msgstr "Dauer"
#: AKSubmission/templates/AKSubmission/ak_detail.html:179
#: AKSubmission/templates/AKSubmission/ak_detail.html:178
msgid "When?"
msgstr "Wann?"
#: AKSubmission/templates/AKSubmission/ak_detail.html:180
#: AKSubmission/templates/AKSubmission/akslot_delete.html:35
msgid "Duration"
msgstr "Dauer"
#: AKSubmission/templates/AKSubmission/ak_detail.html:182
msgid "Room"
msgstr "Raum"
#: AKSubmission/templates/AKSubmission/ak_detail.html:205
#: AKSubmission/templates/AKSubmission/ak_detail.html:213
msgid "Delete"
msgstr "Löschen"
#: AKSubmission/templates/AKSubmission/ak_detail.html:216
#: AKSubmission/templates/AKSubmission/ak_detail.html:224
msgid "Schedule"
msgstr "Schedule"
#: AKSubmission/templates/AKSubmission/ak_detail.html:228
#: AKSubmission/templates/AKSubmission/ak_detail.html:236
msgid "Add another slot"
msgstr "Einen neuen AK-Slot hinzufügen"
#: AKSubmission/templates/AKSubmission/ak_detail.html:232
#: AKSubmission/templates/AKSubmission/ak_detail.html:240
msgid "Possible Times"
msgstr "Mögliche Zeiten"
#: AKSubmission/templates/AKSubmission/ak_detail.html:236
#: AKSubmission/templates/AKSubmission/ak_detail.html:244
msgid "Start"
msgstr "Start"
#: AKSubmission/templates/AKSubmission/ak_detail.html:237
#: AKSubmission/templates/AKSubmission/ak_detail.html:245
msgid "End"
msgstr "Ende"
......@@ -285,7 +288,7 @@ msgstr "AK hinzufügen"
msgid "Details"
msgstr "Details"
#: AKSubmission/templates/AKSubmission/ak_table.html:63
#: AKSubmission/templates/AKSubmission/ak_table.html:66
msgid "There are no AKs in this category yet"
msgstr "Es gibt noch keine AKs in dieser Kategorie"
......@@ -417,38 +420,41 @@ msgstr "AK erfolgreich angelegt"
msgid "AK successfully updated"
msgstr "AK erfolgreich aktualisiert"
#: AKSubmission/views.py:288
#: AKSubmission/views.py:289
msgid "Interest saved"
msgstr "Interesse gespeichert"
#: AKSubmission/views.py:337
#: AKSubmission/views.py:348
msgid "Person Info successfully updated"
msgstr "Personen-Info erfolgreich aktualisiert"
#: AKSubmission/views.py:357
#: AKSubmission/views.py:368
msgid "No user selected"
msgstr "Keine Person ausgewählt"
#: AKSubmission/views.py:383
#: AKSubmission/views.py:394
msgid "AK Slot successfully added"
msgstr "AK-Slot erfolgreich angelegt"
#: AKSubmission/views.py:397
#: AKSubmission/views.py:408
msgid "You cannot edit a slot that has already been scheduled"
msgstr "Bereits geplante AK-Slots können nicht mehr bearbeitet werden"
#: AKSubmission/views.py:407
#: AKSubmission/views.py:418
msgid "AK Slot successfully updated"
msgstr "AK-Slot erfolgreich aktualisiert"
#: AKSubmission/views.py:420
#: AKSubmission/views.py:431
msgid "You cannot delete a slot that has already been scheduled"
msgstr "Bereits geplante AK-Slots können nicht mehr gelöscht werden"
#: AKSubmission/views.py:430
#: AKSubmission/views.py:441
msgid "AK Slot successfully deleted"
msgstr "AK-Slot erfolgreich angelegt"
#: AKSubmission/views.py:451
#: AKSubmission/views.py:462
msgid "Message to organizers successfully saved"
msgstr "Nachricht an die Organisator*innen erfolgreich gespeichert"
#~ msgid "Present AK results"
#~ msgstr "AK-Ergebnisse vorstellen"
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-03 17:40+0000\n"
"POT-Creation-Date: 2021-04-29 21:09+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"
......@@ -34,43 +34,6 @@ msgstr "Virtueller Raum"
msgid "Virtual Rooms"
msgstr "Virtuelle Räume"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:10
msgid "Scheduling for"
msgstr "Scheduling für"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:94
msgid "Day (Horizontal)"
msgstr "Tag (horizontal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:101
msgid "Day (Vertical)"
msgstr "Tag (vertikal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:112
msgid "Event (Horizontal)"
msgstr "Event (horizontal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:121
msgid "Event (Vertical)"
msgstr "Event (vertikal)"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:148
msgid "Room"
msgstr "Raum"
#: AKScheduling/templates/admin/AKScheduling/scheduling.html:204
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:34
msgid "Event Status"
msgstr "Event-Status"
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:7
msgid "Unscheduled AK Slots"
msgstr "Noch nicht geschedulte AK-Slots"
#: AKScheduling/templates/admin/AKScheduling/unscheduled.html:11
msgid "Count"
msgstr "Anzahl"
#: templates/base.html:29
msgid ""
"Are you sure you want to change the language now? This will clear the form!"
......@@ -83,3 +46,30 @@ msgstr "Impressum"
#: templates/base.html:102
msgid "This software is open source"
msgstr "Diese Software ist Open Source"
#~ msgid "Scheduling for"
#~ msgstr "Scheduling für"
#~ msgid "Event Status"
#~ msgstr "Event-Status"
#~ msgid "Day (Horizontal)"
#~ msgstr "Tag (horizontal)"
#~ msgid "Day (Vertical)"
#~ msgstr "Tag (vertikal)"
#~ msgid "Event (Horizontal)"
#~ msgstr "Event (horizontal)"
#~ msgid "Event (Vertical)"
#~ msgstr "Event (vertikal)"
#~ msgid "Room"
#~ msgstr "Raum"
#~ msgid "Unscheduled AK Slots"
#~ msgstr "Noch nicht geschedulte AK-Slots"
#~ msgid "Count"
#~ msgstr "Anzahl"
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment