diff --git a/AKModel/migrations/0017_owner_slug.py b/AKModel/migrations/0017_owner_slug.py new file mode 100644 index 0000000000000000000000000000000000000000..39ef4b69c1983628a6bf90d9028ac88ceda672ee --- /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 0be0fd008e65ef1e28136905768ac949f7358952..aed1ffe322047b414a590bc6a683caec3438a0a1 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 9cd0f121ba0870d8f7978dd71d2afba7ec492720..642aa58b201eee126cf4773c81a8e6c47b5682f9 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 0000000000000000000000000000000000000000..7076b281e7cf0253eb29ffcd059bd74d4c36d5f3 --- /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 0fbaf8073fc683270e40fc3e7b4ce40d5bb487f6..16f890097ef64d4020563251aa3b27a6a9a629da 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 b60820ceb806b168de12cfaf629574e60822a44d..0036e5844261864d48e31930d780d8760ea24f6b 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> - + <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 b0315ab0177a49ac8e0d00ed5856dc0ca9669a4c..9f01badebe93e08832448665c4eacc2e59811ba5 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 d3c995a42f9457801940e0765694ab77549cedc1..7f12ffe83ad005fab70a96139227e5b6bdcae1dd 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 13eb7c07741c8f05af41bb72bb7d2694eba5b244..90e1a96421595ba95fb31a82ba15bb840c8f736b 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)