From 5297e479ecfaba1d431ade22c717b55e3e797ff1 Mon Sep 17 00:00:00 2001
From: "N. Geisler" <ngeisler@fachschaft.informatik.tu-darmstadt.de>
Date: Wed, 23 Oct 2019 17:42:22 +0200
Subject: [PATCH] add owner-related ak creation

currently only works when creating a new owner
---
 AKModel/migrations/0017_owner_slug.py         | 23 ++++++++++++
 AKModel/models.py                             | 36 ++++++++++++++++++-
 AKSubmission/forms.py                         |  8 ++++-
 .../AKSubmission/akowner_create_select.html   | 36 +++++++++++++++++++
 .../AKSubmission/submission_overview.html     |  6 ++--
 .../templates/AKSubmission/submit_new.html    |  6 ++--
 .../AKSubmission/submit_new_wish.html         |  1 +
 AKSubmission/urls.py                          |  3 +-
 AKSubmission/views.py                         | 27 ++++++++++++--
 9 files changed, 135 insertions(+), 11 deletions(-)
 create mode 100644 AKModel/migrations/0017_owner_slug.py
 create mode 100644 AKSubmission/templates/AKSubmission/akowner_create_select.html

diff --git a/AKModel/migrations/0017_owner_slug.py b/AKModel/migrations/0017_owner_slug.py
new file mode 100644
index 00000000..39ef4b69
--- /dev/null
+++ b/AKModel/migrations/0017_owner_slug.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.6 on 2019-10-19 17:47
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('AKModel', '0016_slot_room_blank'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='akowner',
+            name='slug',
+            field=models.SlugField(blank=True, help_text='Slug for URL generation', max_length=64, unique=True, verbose_name='Slug'),
+        ),
+        migrations.AlterField(
+            model_name='akowner',
+            name='name',
+            field=models.CharField(help_text='Name to identify an AK owner by', max_length=64, verbose_name='Nickname'),
+        ),
+    ]
diff --git a/AKModel/models.py b/AKModel/models.py
index 0be0fd00..aed1ffe3 100644
--- a/AKModel/models.py
+++ b/AKModel/models.py
@@ -1,5 +1,8 @@
 # Create your models here.
+import itertools
+
 from django.db import models
+from django.utils.text import slugify
 from django.utils.translation import gettext_lazy as _
 
 
@@ -32,7 +35,9 @@ class Event(models.Model):
 class AKOwner(models.Model):
     """ An AKOwner describes the person organizing/holding an AK.
     """
-    name = models.CharField(max_length=256, verbose_name=_('Nickname'), help_text=_('Name to identify an AK owner by'))
+    name = models.CharField(max_length=64, verbose_name=_('Nickname'), help_text=_('Name to identify an AK owner by'))
+    slug = models.SlugField(max_length=64, blank=True, unique=True, verbose_name=_('Slug'),
+                            help_text=_('Slug for URL generation'))
     email = models.EmailField(max_length=128, blank=True, verbose_name=_('E-Mail Address'), help_text=_('Contact mail'))
     institution = models.CharField(max_length=128, blank=True, verbose_name=_('Institution'), help_text=_('Uni etc.'))
     link = models.URLField(blank=True, verbose_name=_('Web Link'), help_text=_('Link to Homepage'))
@@ -51,6 +56,35 @@ class AKOwner(models.Model):
             return f"{self.name} ({self.institution})"
         return self.name
 
+    def _generate_slug(self):
+        max_length = self._meta.get_field('slug').max_length
+
+        slug_candidate = slugify(self.name)[:max_length]
+        if not AKOwner.objects.filter(slug=slug_candidate).exists():
+            self.slug = slug_candidate
+            return
+        slug_candidate = slugify(slug_candidate + '_' + self.institution)[:max_length]
+        if not AKOwner.objects.filter(slug=slug_candidate).exists():
+            self.slug = slug_candidate
+            return
+        for i in itertools.count(1):
+            if not AKOwner.objects.filter(slug=slug_candidate).exists():
+                break
+            digits = len(str(i))
+            slug_candidate = '{}-{}'.format(slug_candidate[:-digits + 1], i)
+
+        self.slug = slug_candidate
+
+    def save(self, *args, **kwargs):
+        if not self.slug:
+            self._generate_slug()
+
+        super().save(*args, **kwargs)
+
+    @staticmethod
+    def get_by_slug(slug):
+        return AKOwner.objects.get(slug=slug)
+
 
 class AKCategory(models.Model):
     """ An AKCategory describes the characteristics of an AK, e.g. content vs. recreational.
diff --git a/AKSubmission/forms.py b/AKSubmission/forms.py
index 9cd0f121..642aa58b 100644
--- a/AKSubmission/forms.py
+++ b/AKSubmission/forms.py
@@ -1,6 +1,6 @@
 from django import forms
 
-from AKModel.models import AK
+from AKModel.models import AK, AKOwner
 
 
 class AKForm(forms.ModelForm):
@@ -29,3 +29,9 @@ class AKForm(forms.ModelForm):
 class AKWishForm(AKForm):
     class Meta(AKForm.Meta):
         exclude = ['owners']
+
+
+class AKOwnerForm(forms.ModelForm):
+    class Meta:
+        model = AKOwner
+        fields = ['name', 'email', 'institution', 'link']
diff --git a/AKSubmission/templates/AKSubmission/akowner_create_select.html b/AKSubmission/templates/AKSubmission/akowner_create_select.html
new file mode 100644
index 00000000..7076b281
--- /dev/null
+++ b/AKSubmission/templates/AKSubmission/akowner_create_select.html
@@ -0,0 +1,36 @@
+{% extends 'base.html' %}
+
+{% load i18n %}
+{% load bootstrap4 %}
+{% load fontawesome %}
+
+{% block title %}{{ event.slug }} - {% trans "AK Owner" %}{% 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 active">{{ owner.slug }}</li>
+{% endblock %}
+
+{% block content %}
+    {% block headline %}
+        <h2>{% trans 'AK Owner' %}</h2>
+    {% endblock %}
+    <form method="POST" class="post-form">{% csrf_token %}
+        {% bootstrap_form form %}
+        {% buttons %}
+            <button type="reset" class="btn btn-danger">
+                {% fontawesome_icon "undo-alt" %} {% trans "Reset" %}
+            </button>
+
+            <a href="{% url 'submit:submission_overview' event_slug=event.slug %}" class="btn btn-secondary">
+                {% fontawesome_icon "times" %} {% trans "Cancel" %}
+            </a>
+            <button type="submit" class="save btn btn-primary float-right">
+                {% fontawesome_icon "check" %} {% trans "Submit" %}
+            </button>
+        {% endbuttons %}
+    </form>
+{% endblock %}
\ No newline at end of file
diff --git a/AKSubmission/templates/AKSubmission/submission_overview.html b/AKSubmission/templates/AKSubmission/submission_overview.html
index 0fbaf807..16f89009 100644
--- a/AKSubmission/templates/AKSubmission/submission_overview.html
+++ b/AKSubmission/templates/AKSubmission/submission_overview.html
@@ -17,10 +17,8 @@
     {% blocktrans %}On this page you can see a list of current AKs, change them and add new ones.{% endblocktrans %}
 
     <div class="jumbotron" style="margin-top:20px;">
-        <h2>{% trans "Submit" %}</h2>
-        <a href="{% url 'submit:submit_ak' event_slug=event.slug %}" class="btn btn-primary">{% trans "New AK" %}</a>
-        <a href="{% url 'submit:submit_ak_wish' event_slug=event.slug %}"
-           class="btn btn-info">{% trans "New AK Wish" %}</a>
+        <a href="{% url 'submit:akowner_select_create' event_slug=event.slug %}" class="btn btn-primary">{% trans "New AK" %}</a>
+        <a href="{% url 'submit:submit_ak_wish' event_slug=event.slug  %}" class="btn btn-info">{% trans "New AK Wish" %}</a>
     </div>
 
 
diff --git a/AKSubmission/templates/AKSubmission/submit_new.html b/AKSubmission/templates/AKSubmission/submit_new.html
index b60820ce..0036e584 100644
--- a/AKSubmission/templates/AKSubmission/submit_new.html
+++ b/AKSubmission/templates/AKSubmission/submit_new.html
@@ -9,7 +9,9 @@
 {% 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="{% url 'submit:submission_overview' event_slug=event.slug %}">{% trans "AK Submission" %}</a></li>
+    <li class="breadcrumb-item"><a href="#">{{ owner.slug }}</a></li>
     <li class="breadcrumb-item active">{% trans "New AK" %}</li>
 {% endblock %}
 
@@ -24,7 +26,7 @@
             <button type="reset" class="btn btn-danger">
                 {% fontawesome_icon "undo-alt" %} {% trans "Reset" %}
             </button>
-            &nbsp;&nbsp;
+
             <a href="{% url 'submit:submission_overview' event_slug=event.slug %}" class="btn btn-secondary">
                 {% fontawesome_icon "times" %} {% trans "Cancel" %}
             </a>
diff --git a/AKSubmission/templates/AKSubmission/submit_new_wish.html b/AKSubmission/templates/AKSubmission/submit_new_wish.html
index b0315ab0..9f01bade 100644
--- a/AKSubmission/templates/AKSubmission/submit_new_wish.html
+++ b/AKSubmission/templates/AKSubmission/submit_new_wish.html
@@ -8,6 +8,7 @@
     <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="#">{% trans "AK Submission" %}</a></li>
+    <li class="breadcrumb-item"><a href="#">{{ owner.slug }}</a></li>
     <li class="breadcrumb-item active">{% trans "New AK Wish" %}</li>
 {% endblock %}
 
diff --git a/AKSubmission/urls.py b/AKSubmission/urls.py
index d3c995a4..7f12ffe8 100644
--- a/AKSubmission/urls.py
+++ b/AKSubmission/urls.py
@@ -13,7 +13,8 @@ urlpatterns = [
             path('aks/', views.AKListView.as_view(), name='ak_list'),
             path('aks/category/<int:category_pk>', views.AKListByCategoryView.as_view(), name='ak_list_by_category'),
             path('aks/tag/<int:tag_pk>', views.AKListByTagView.as_view(), name='ak_list_by_tag'),
-            path('new/', views.AKSubmissionView.as_view(), name='submit_ak'),
+            path('owner/', views.AKOwnerSelectCreateView.as_view(), name='akowner_select_create'),
+            path('<slug:owner_slug>/new/', views.AKSubmissionView.as_view(), name='submit_ak'),
             path('new_wish/', views.AKWishSubmissionView.as_view(), name='submit_ak_wish'),
         ])
     ),
diff --git a/AKSubmission/views.py b/AKSubmission/views.py
index 13eb7c07..90e1a964 100644
--- a/AKSubmission/views.py
+++ b/AKSubmission/views.py
@@ -4,11 +4,11 @@ from django.urls import reverse_lazy
 from django.utils.translation import gettext_lazy as _
 from django.views.generic import ListView, DetailView, CreateView
 
-from AKModel.models import AK, AKCategory, AKTag
+from AKModel.models import AK, AKCategory, AKTag, AKOwner
 from AKModel.models import Event
 from AKModel.views import EventSlugMixin
 from AKModel.views import FilterByEventSlugMixin
-from AKSubmission.forms import AKForm, AKWishForm
+from AKSubmission.forms import AKForm, AKWishForm, AKOwnerForm
 
 
 class SubmissionOverviewView(FilterByEventSlugMixin, ListView):
@@ -69,6 +69,11 @@ class AKSubmissionView(EventSlugMixin, CreateView):
     template_name = 'AKSubmission/submit_new.html'
     form_class = AKForm
 
+    def get_initial(self):
+        initials = super(AKSubmissionView, self).get_initial()
+        initials['owners'] = [AKOwner.get_by_slug(self.kwargs['owner_slug'])]
+        return initials
+
     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})
@@ -94,3 +99,21 @@ class AKSubmissionView(EventSlugMixin, CreateView):
 class AKWishSubmissionView(AKSubmissionView):
     template_name = 'AKSubmission/submit_new_wish.html'
     form_class = AKWishForm
+
+
+class AKOwnerSelectCreateView(EventSlugMixin, CreateView):
+    model = AKOwner
+    template_name = 'AKSubmission/akowner_create_select.html'
+    form_class = AKOwnerForm
+
+    def get_success_url(self):
+        return reverse_lazy('submit:submit_ak',
+                            kwargs={'event_slug': self.kwargs['event_slug'], 'owner_slug': self.object.slug})
+
+    def form_valid(self, form):
+        instance = form.save(commit=False)
+
+        # Set event
+        instance.event = Event.get_by_slug(self.kwargs["event_slug"])
+
+        return super().form_valid(form)
-- 
GitLab