diff --git a/AKModel/locale/de_DE/LC_MESSAGES/django.po b/AKModel/locale/de_DE/LC_MESSAGES/django.po index 6c91a57b5bdd915de26ba250e65642e528afd773..7945c257131421b13b7d3ec4011fdcacf39efa06 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: 2019-10-20 17:51+0000\n" +"POT-Creation-Date: 2019-10-24 21:00+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" @@ -11,13 +11,13 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: availability.py:38 models.py:20 models.py:40 models.py:105 models.py:153 -#: models.py:184 models.py:209 +#: availability.py:38 models.py:23 models.py:45 models.py:139 models.py:188 +#: models.py:220 models.py:246 msgid "Event" msgstr "Event" -#: availability.py:39 models.py:41 models.py:106 models.py:154 models.py:185 -#: models.py:210 +#: availability.py:39 models.py:46 models.py:140 models.py:189 models.py:221 +#: models.py:247 msgid "Associated event" msgstr "Zugehöriges Event" @@ -29,7 +29,7 @@ msgstr "Person" msgid "Person whose availability this is" msgstr "Person deren Verfügbarkeit hier abgebildet wird" -#: availability.py:56 models.py:188 models.py:203 +#: availability.py:56 models.py:224 models.py:239 msgid "Room" msgstr "Raum" @@ -37,7 +37,7 @@ msgstr "Raum" msgid "Room whose availability this is" msgstr "Raum dessen Verfügbarkeit hier abgebildet wird" -#: availability.py:65 models.py:157 models.py:202 +#: availability.py:65 models.py:192 models.py:238 msgid "AK" msgstr "AK" @@ -47,7 +47,7 @@ msgstr "AK" msgid "AK whose availability this is" msgstr "Verfügbarkeiten" -#: availability.py:74 models.py:63 +#: availability.py:74 models.py:97 msgid "AK Category" msgstr "AK Kategorie" @@ -63,334 +63,346 @@ msgstr "Verfügbarkeit" msgid "Availabilities" msgstr "Verfügbarkeiten" -#: models.py:9 models.py:58 models.py:74 models.py:89 models.py:103 -#: models.py:120 models.py:177 +#: models.py:12 models.py:92 models.py:108 models.py:123 models.py:137 +#: models.py:154 models.py:213 msgid "Name" msgstr "Name" -#: models.py:10 +#: models.py:13 msgid "Name or iteration of the event" msgstr "Name oder Iteration des Events" -#: models.py:11 +#: models.py:14 #, fuzzy #| msgid "Short Name" msgid "Short Form" msgstr "Kurzer Name" -#: models.py:12 +#: models.py:15 msgid "Short name of letters/numbers/dots/dashes/underscores used in URLs." msgstr "" -#: models.py:13 +#: models.py:16 msgid "Start" msgstr "Start" -#: models.py:13 +#: models.py:16 msgid "Time the event begins" msgstr "Zeit zu der das Event beginnt" -#: models.py:14 +#: models.py:17 msgid "End" msgstr "Ende" -#: models.py:14 +#: models.py:17 msgid "Time the event ends" msgstr "Zeit zu der das Event endet" -#: models.py:15 +#: models.py:18 msgid "Place" msgstr "Ort" -#: models.py:16 +#: models.py:19 msgid "City etc. the event takes place in" msgstr "Stadt o.ä. in der das Event stattfindet" -#: models.py:17 +#: models.py:20 msgid "Active State" msgstr "Aktiver Status" -#: models.py:17 +#: models.py:20 msgid "Marks currently active events" msgstr "Markiert aktuell aktive Events" -#: models.py:21 +#: models.py:24 msgid "Events" msgstr "Events" -#: models.py:35 +#: models.py:38 msgid "Nickname" msgstr "Spitzname" -#: models.py:35 +#: models.py:38 msgid "Name to identify an AK owner by" msgstr "Name durch den eine AK Leitung identifiziert wird" -#: models.py:36 +#: models.py:39 +msgid "Slug" +msgstr "Slug" + +#: models.py:40 +msgid "Slug for URL generation" +msgstr "Slug für URL-Generierung" + +#: models.py:41 msgid "E-Mail Address" msgstr "E-Mail Adresse" -#: models.py:36 +#: models.py:41 msgid "Contact mail" msgstr "Kontakt E-Mail" -#: models.py:37 +#: models.py:42 msgid "Institution" msgstr "Instutution" -#: models.py:37 +#: models.py:42 msgid "Uni etc." msgstr "Universität o.ä." -#: models.py:38 models.py:129 +#: models.py:43 models.py:163 msgid "Web Link" msgstr "Internet Link" -#: models.py:38 +#: models.py:43 msgid "Link to Homepage" msgstr "Link zu Homepage oder Webseite" -#: models.py:44 +#: models.py:49 msgid "AK Owner" msgstr "AK Leitung" -#: models.py:45 +#: models.py:50 msgid "AK Owners" msgstr "AK Leitungen" -#: models.py:58 +#: models.py:92 msgid "Name of the AK Category" msgstr "Name des AK Kategorie" -#: models.py:59 models.py:75 +#: models.py:93 models.py:109 msgid "Color" msgstr "Farbe" -#: models.py:59 models.py:75 +#: models.py:93 models.py:109 msgid "Color for displaying" msgstr "Farbe für die Anzeige" -#: models.py:60 models.py:123 +#: models.py:94 models.py:157 msgid "Description" msgstr "Beschreibung" -#: models.py:60 +#: models.py:94 msgid "Short description of this AK Category" msgstr "Beschreibung der AK-Kategorie" -#: models.py:64 +#: models.py:98 msgid "AK Categories" msgstr "AK Kategorien" -#: models.py:74 +#: models.py:108 msgid "Name of the AK Track" msgstr "Name des AK Tracks" -#: models.py:78 +#: models.py:112 msgid "AK Track" msgstr "AK Track" -#: models.py:79 +#: models.py:113 msgid "AK Tracks" msgstr "AK Tracks" -#: models.py:89 +#: models.py:123 msgid "Name of the AK Tag" msgstr "Name das AK Tags" -#: models.py:92 +#: models.py:126 msgid "AK Tag" msgstr "AK Tag" -#: models.py:93 +#: models.py:127 msgid "AK Tags" msgstr "AK Tags" -#: models.py:103 +#: models.py:137 msgid "Name of the Requirement" msgstr "Name der Anforderung" -#: models.py:109 +#: models.py:143 msgid "AK Requirement" msgstr "AK Anforderung" -#: models.py:110 +#: models.py:144 msgid "AK Requirements" msgstr "AK Anforderungen" -#: models.py:120 +#: models.py:154 msgid "Name of the AK" msgstr "Name des AKs" -#: models.py:121 +#: models.py:155 msgid "Short Name" msgstr "Kurzer Name" -#: models.py:122 +#: models.py:156 msgid "Name displayed in the schedule" msgstr "Name zur Anzeige im AK Plan" -#: models.py:123 +#: models.py:157 msgid "Description of the AK" msgstr "Beschreibung des AKs" -#: models.py:125 +#: models.py:159 msgid "Owners" msgstr "Leitungen" -#: models.py:126 +#: models.py:160 msgid "Those organizing the AK" msgstr "Menschen, die den AK organisieren und halten" -#: models.py:129 +#: models.py:163 msgid "Link to wiki page" msgstr "Link zur Wiki Seite" -#: models.py:131 +#: models.py:165 msgid "Category" msgstr "Kategorie" -#: models.py:132 +#: models.py:166 msgid "Category of the AK" msgstr "Kategorie des AKs" -#: models.py:133 +#: models.py:167 msgid "Tags" msgstr "Tags" -#: models.py:133 +#: models.py:167 msgid "Tags provided by owners" msgstr "Tags, die durch die AK Leitung vergeben wurden" -#: models.py:134 +#: models.py:168 msgid "Track" msgstr "Track" -#: models.py:135 +#: models.py:169 msgid "Track the AK belongs to" msgstr "Track zu dem der AK gehört" -#: models.py:137 +#: models.py:171 msgid "Resolution Intention" msgstr "Resolutionsabsicht" -#: models.py:138 +#: models.py:172 msgid "Intends to submit a resolution" msgstr "Beabsichtigt eine Resolution einzureichen" -#: models.py:139 +#: models.py:173 msgid "Present this AK" msgstr "AK Präsentieren" -#: models.py:139 +#: models.py:174 msgid "Present results of this AK" msgstr "Die Ergebnisse dieses AKs vorstellen" -#: models.py:141 +#: models.py:176 msgid "Requirements" msgstr "Anforderungen" -#: models.py:142 +#: models.py:177 msgid "AK's Requirements" msgstr "Anforderungen des AKs" -#: models.py:144 +#: models.py:179 msgid "Conflicting AKs" msgstr "AK Konflikte" -#: models.py:145 +#: models.py:180 msgid "AKs that conflict and thus must not take place at the same time" msgstr "" "AKs, die Konflikte haben und deshalb nicht gleichzeitig stattfinden dürfen" -#: models.py:146 +#: models.py:181 msgid "Prerequisite AKs" msgstr "Vorausgesetzte AKs" -#: models.py:147 +#: models.py:182 msgid "AKs that should precede this AK in the schedule" msgstr "AKS die im AK Plan vor diesem AK stattfinden müssen" -#: models.py:149 +#: models.py:184 msgid "Internal Notes" msgstr "Interne Notizen" -#: models.py:149 +#: models.py:184 msgid "Notes to organizers" msgstr "Notizen an die Organisator*innen" -#: models.py:151 +#: models.py:186 msgid "Interest" msgstr "Interesse" -#: models.py:151 +#: models.py:186 msgid "Expected number of people" msgstr "Erwartete Personenzahl" -#: models.py:158 +#: models.py:193 msgid "AKs" msgstr "AKs" -#: models.py:177 +#: models.py:213 msgid "Name or number of the room" msgstr "Name oder Nummer des Raums" -#: models.py:178 +#: models.py:214 msgid "Building" msgstr "Gebäude" -#: models.py:179 +#: models.py:215 msgid "Name or number of the building" msgstr "Name oder Nummer des Gebäudes" -#: models.py:180 +#: models.py:216 msgid "Capacity" msgstr "Kapazität" -#: models.py:180 +#: models.py:216 msgid "Maximum number of people" msgstr "Maximale Personenzahl" -#: models.py:181 +#: models.py:217 msgid "Properties" msgstr "Eigenschaften" -#: models.py:182 +#: models.py:218 msgid "AK requirements fulfilled by the room" msgstr "AK Anforderungen, die dieser Raum erfüllt" -#: models.py:189 +#: models.py:225 msgid "Rooms" msgstr "Räume" -#: models.py:202 +#: models.py:238 msgid "AK being mapped" msgstr "AK, der zugeordnet wird" -#: models.py:204 +#: models.py:240 msgid "Room the AK will take place in" msgstr "Raum in dem der AK stattfindet" -#: models.py:205 +#: models.py:241 msgid "Slot Begin" msgstr "Beginn des Slots" -#: models.py:205 +#: models.py:241 msgid "Time and date the slot begins" msgstr "Zeit und Datum zu der der AK beginnt" -#: models.py:206 +#: models.py:243 msgid "Duration" msgstr "Dauer" -#: models.py:207 +#: models.py:244 msgid "Length in hours" msgstr "Länge in Stunden" -#: models.py:213 +#: models.py:250 msgid "AK Slot" msgstr "AK Slot" -#: models.py:214 +#: models.py:251 msgid "AK Slots" msgstr "AK Slot" + +#: models.py:265 +msgid "Not scheduled yet" +msgstr "Noch nicht geplant" diff --git a/AKModel/migrations/0019_slot_start_optional.py b/AKModel/migrations/0019_slot_start_optional.py new file mode 100644 index 0000000000000000000000000000000000000000..0d04806ffe5da36076aa34649f8f7f835388d7fe --- /dev/null +++ b/AKModel/migrations/0019_slot_start_optional.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.6 on 2019-10-24 15:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AKModel', '0018_merge_20191023_2227'), + ] + + operations = [ + migrations.AlterField( + model_name='akslot', + name='start', + field=models.DateTimeField(blank=True, help_text='Time and date the slot begins', null=True, verbose_name='Slot Begin'), + ), + ] diff --git a/AKModel/migrations/0020_ak_unique.py b/AKModel/migrations/0020_ak_unique.py new file mode 100644 index 0000000000000000000000000000000000000000..ee7fbb099699c4af06be965ad1d88437bed5cf5f --- /dev/null +++ b/AKModel/migrations/0020_ak_unique.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.6 on 2019-10-24 19:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('AKModel', '0019_slot_start_optional'), + ] + + operations = [ + migrations.AlterField( + model_name='ak', + name='name', + field=models.CharField(help_text='Name of the AK', max_length=256, verbose_name='Name'), + ), + migrations.AlterField( + model_name='ak', + name='short_name', + field=models.CharField(blank=True, help_text='Name displayed in the schedule', max_length=64, verbose_name='Short Name'), + ), + migrations.AlterUniqueTogether( + name='ak', + unique_together={('short_name', 'event'), ('name', 'event')}, + ), + ] diff --git a/AKModel/models.py b/AKModel/models.py index 81cb9ca46a12b87914220c6cceccbe6af23633c3..690a941189489b46fc542d9e80ec460ac523b7a4 100644 --- a/AKModel/models.py +++ b/AKModel/models.py @@ -151,8 +151,8 @@ class AKRequirement(models.Model): class AK(models.Model): """ An AK is a slot-based activity to be scheduled during an event. """ - name = models.CharField(max_length=256, unique=True, verbose_name=_('Name'), help_text=_('Name of the AK')) - short_name = models.CharField(max_length=64, unique=True, blank=True, verbose_name=_('Short Name'), + name = models.CharField(max_length=256, verbose_name=_('Name'), help_text=_('Name of the AK')) + short_name = models.CharField(max_length=64, blank=True, verbose_name=_('Short Name'), help_text=_('Name displayed in the schedule')) description = models.TextField(blank=True, verbose_name=_('Description'), help_text=_('Description of the AK')) @@ -191,6 +191,7 @@ class AK(models.Model): class Meta: verbose_name = _('AK') verbose_name_plural = _('AKs') + unique_together = [('name', 'event'), ('short_name', 'event')] def __str__(self): if self.short_name: @@ -237,7 +238,8 @@ class AKSlot(models.Model): ak = models.ForeignKey(to=AK, on_delete=models.CASCADE, verbose_name=_('AK'), help_text=_('AK being mapped')) room = models.ForeignKey(to=Room, blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('Room'), help_text=_('Room the AK will take place in')) - start = models.DateTimeField(verbose_name=_('Slot Begin'), help_text=_('Time and date the slot begins')) + start = models.DateTimeField(verbose_name=_('Slot Begin'), help_text=_('Time and date the slot begins'), + blank=True, null=True) duration = models.DecimalField(max_digits=4, decimal_places=2, default=2, verbose_name=_('Duration'), help_text=_('Length in hours')) @@ -259,4 +261,6 @@ class AKSlot(models.Model): """ Display start time of slot in format weekday + time, e.g. "Fri 14:00" """ + if self.start is None: + return _("Not scheduled yet") return self.start.strftime('%a %H:%M') diff --git a/AKModel/views.py b/AKModel/views.py index 848640639bbe1c4d6863d20ba6e4bff0bb9335b3..1ef246355f8fa160d3b93577d4b5bfd03d5fbd25 100644 --- a/AKModel/views.py +++ b/AKModel/views.py @@ -1,4 +1,4 @@ -from django.http import Http404 +from django.shortcuts import get_object_or_404 from AKModel.models import Event @@ -9,14 +9,18 @@ class EventSlugMixin: """ event = None - def get(self, request, *args, **kwargs): + def _load_event(self): # Find event based on event slug - try: - self.event = Event.get_by_slug(self.kwargs.get("event_slug", None)) - except Event.DoesNotExist: - raise Http404 + self.event = get_object_or_404(Event, slug=self.kwargs.get("event_slug", None)) + + def get(self, request, *args, **kwargs): + self._load_event() return super().get(request, *args, **kwargs) + def post(self, request, *args, **kwargs): + self._load_event() + return super().post(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) diff --git a/AKSubmission/forms.py b/AKSubmission/forms.py index 414e45395e698859e8c48ab2cdcd067ab0c97e3e..2d145419f1668a56df2dc3203acf16011a35c7b0 100644 --- a/AKSubmission/forms.py +++ b/AKSubmission/forms.py @@ -2,6 +2,8 @@ from django import forms from AKModel.models import AK, AKOwner +from django.utils.translation import ugettext_lazy as _ + class AKForm(forms.ModelForm): class Meta: @@ -12,17 +14,18 @@ class AKForm(forms.ModelForm): 'owners', 'description', 'category', - 'tags', 'reso', 'present', 'requirements', 'conflicts', 'prerequisites', 'notes', + 'event' ] widgets = { 'requirements': forms.CheckboxSelectMultiple, + 'event': forms.HiddenInput, } def __init__(self, *args, **kwargs): @@ -32,8 +35,63 @@ class AKForm(forms.ModelForm): self.fields["conflicts"].widget.attrs = {'class': 'chosen-select'} self.fields["prerequisites"].widget.attrs = {'class': 'chosen-select'} + help_tags_addition = _('Separate multiple tags with semicolon') + + # Add text fields for tags + self.fields["tags_raw"] = forms.CharField( + required=False, + label=AK.tags.field.verbose_name, + help_text=f"{AK.tags.field.help_text} ({help_tags_addition})") + + @staticmethod + def _clean_duration(duration): + # Handle different duration formats (h:mm and decimal comma instead of point) + if ":" in duration: + h, m = duration.split(":") + duration = int(h) + int(m) / 60 + if "," in str(duration): + duration = float(duration.replace(",", ".")) + return duration + + def clean(self): + cleaned_data = super().clean() + + # Generate short name if not given + short_name = self.cleaned_data["short_name"] + if len(short_name) == 0: + cleaned_data["short_name"] = ''.join(x for x in self.cleaned_data["name"].title() if x.isalnum()) + + # Get tag names from raw tags + cleaned_data["tag_names"] = [name.strip().lower() for name in cleaned_data["tags_raw"].split(";")] + + # Get durations from raw durations field + if "durations" in cleaned_data: + cleaned_data["durations"] = [self._clean_duration(d) for d in self.cleaned_data["durations"].split()] + return cleaned_data + + +class AKSubmissionForm(AKForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Add field for durations + self.fields["durations"] = forms.CharField( + widget=forms.Textarea, + label=_("Duration(s)"), + help_text=_("Enter at least one planned duration (in hours). If your AK should have multiple slots, use multiple lines") + ) + + +class AKEditForm(AKForm): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Add existing tags to tag raw field + self.fields["tags_raw"].initial = "; ".join(str(tag) for tag in self.instance.tags.all()) + -class AKWishForm(AKForm): +class AKWishForm(AKSubmissionForm): class Meta(AKForm.Meta): exclude = ['owners'] diff --git a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po b/AKSubmission/locale/de_DE/LC_MESSAGES/django.po index e6500ad74806be3cc03beb2160a564222c12a950..25f724102fd547b6e06864ebafc14117ad6279b4 100644 --- a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po +++ b/AKSubmission/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: 2019-10-24 14:18+0000\n" +"POT-Creation-Date: 2019-10-24 21:34+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,27 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +#: forms.py:38 +msgid "Separate multiple tags with semicolon" +msgstr "Mehrere Tags mit Semikolon trennen" + +#: forms.py:80 +msgid "Duration(s)" +msgstr "Dauer(n)" + +#: forms.py:81 +msgid "" +"Enter at least one planned duration (in hours). If your AK should have " +"multiple slots, use multiple lines" +msgstr "" +"Mindestens eine geplante Dauer (in Stunden) angeben. Wenn der AK mehrere " +"Slots haben soll, mehrere Zeilen verwenden" + #: templates/AKSubmission/ak_detail.html:8 #: templates/AKSubmission/ak_detail.html:13 #: templates/AKSubmission/ak_detail.html:18 -#: templates/AKSubmission/ak_list.html:8 templates/AKSubmission/ak_list.html:13 +#: templates/AKSubmission/ak_edit.html:14 templates/AKSubmission/ak_list.html:8 +#: templates/AKSubmission/ak_list.html:13 #: templates/AKSubmission/ak_list.html:18 #: templates/AKSubmission/akowner_create_update.html:13 #: templates/AKSubmission/submission_overview.html:6 @@ -72,6 +89,14 @@ msgstr "Dauer" msgid "Room" msgstr "Raum" +#: templates/AKSubmission/ak_edit.html:8 templates/AKSubmission/ak_edit.html:21 +msgid "Edit AK" +msgstr "AK bearbeiten" + +#: templates/AKSubmission/ak_edit.html:16 +msgid "Edit" +msgstr "Bearbeiten" + #: templates/AKSubmission/ak_list.html:14 msgid "AKs" msgstr "AKs" @@ -163,14 +188,14 @@ msgstr "" msgid "AK successfully created" msgstr "AK erfolgreich angelegt" -#: views.py:149 +#: views.py:151 msgid "AK successfully updated" msgstr "AK erfolgreich bearbeitet" -#: views.py:193 +#: views.py:208 msgid "Person Info successfully updated" msgstr "Personen-Info erfolgreich bearbeitet" -#: views.py:205 +#: views.py:220 msgid "No user selected" msgstr "Keine Person ausgewählt" diff --git a/AKSubmission/templates/AKSubmission/ak_edit.html b/AKSubmission/templates/AKSubmission/ak_edit.html new file mode 100644 index 0000000000000000000000000000000000000000..45b1f9d39c735a4140ab27386460279da9b524f8 --- /dev/null +++ b/AKSubmission/templates/AKSubmission/ak_edit.html @@ -0,0 +1,22 @@ +{% extends 'AKSubmission/submit_new.html' %} + +{% load i18n %} +{% load bootstrap4 %} +{% load fontawesome %} +{% load staticfiles %} + +{% block title %}{{ event.slug }} - {% trans "Edit AK" %}{% endblock %} + +{% block breadcrumbs %} + <li class="breadcrumb-item"><a href="#">AKPlanning</a></li> + <li class="breadcrumb-item"><a href="#">{{ event.slug }}</a></li> + <li class="breadcrumb-item"><a + href="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li> + <li class="breadcrumb-item"><a href="#">{{ ak.short_name }}</a></li> + <li class="breadcrumb-item active">{% trans "Edit" %}</li> +{% endblock %} + + +{% block headline %} + <h2>{% trans 'Edit AK' %}</h2> +{% endblock %} diff --git a/AKSubmission/views.py b/AKSubmission/views.py index 873cc975a7ce78a4a4e676d7da84e4e88667e4eb..b9011f867063783435c0bca9f526dc5938580087 100644 --- a/AKSubmission/views.py +++ b/AKSubmission/views.py @@ -6,12 +6,12 @@ from django.utils.translation import gettext_lazy as _ from django.views import View from django.views.generic import ListView, DetailView, CreateView, UpdateView -from AKModel.models import AK, AKCategory, AKTag, AKOwner +from AKModel.models import AK, AKCategory, AKTag, AKOwner, AKSlot from AKModel.models import Event from AKModel.views import EventSlugMixin from AKModel.views import FilterByEventSlugMixin -from AKSubmission.forms import AKForm, AKWishForm, AKOwnerForm +from AKSubmission.forms import AKForm, AKWishForm, AKOwnerForm, AKEditForm, AKSubmissionForm from django.conf import settings @@ -99,34 +99,36 @@ class AKListByTagView(AKListView): class AKAndAKWishSubmissionView(EventSlugMixin, CreateView): model = AK template_name = 'AKSubmission/submit_new.html' - form_class = AKForm + form_class = AKSubmissionForm def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, _("AK successfully created")) return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.pk}) def form_valid(self, form): - instance = form.save(commit=False) - - # Set event - instance.event = Event.get_by_slug(self.kwargs["event_slug"]) - - # Generate short name if not given - # TODO + super_form_valid = super().form_valid(form) # Generate wiki link # TODO + # Set tags (and generate them if necessary) + for tag_name in form.cleaned_data["tag_names"]: + tag, _ = AKTag.objects.get_or_create(name=tag_name) + self.object.tags.add(tag) + # Generate slot(s) - # TODO + for duration in form.cleaned_data["durations"]: + new_slot = AKSlot(ak=self.object, duration=duration, event=self.object.event) + new_slot.save() - return super().form_valid(form) + return super_form_valid class AKSubmissionView(AKAndAKWishSubmissionView): def get_initial(self): initials = super(AKAndAKWishSubmissionView, self).get_initial() initials['owners'] = [AKOwner.get_by_slug(self.kwargs['owner_slug'])] + initials['event'] = self.event return initials def get_context_data(self, *, object_list=None, **kwargs): @@ -142,13 +144,26 @@ class AKWishSubmissionView(AKAndAKWishSubmissionView): class AKEditView(EventSlugMixin, UpdateView): model = AK - template_name = 'AKSubmission/submit_new.html' - form_class = AKForm + template_name = 'AKSubmission/ak_edit.html' + form_class = AKEditForm def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, _("AK successfully updated")) return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': self.object.pk}) + def form_valid(self, form): + super_form_valid = super().form_valid(form) + + # Detach existing tags + self.object.tags.clear() + + # Set tags (and generate them if necessary) + for tag_name in form.cleaned_data["tag_names"]: + tag, _ = AKTag.objects.get_or_create(name=tag_name) + self.object.tags.add(tag) + + return super_form_valid + class AKOwnerCreateView(EventSlugMixin, CreateView): model = AKOwner