diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4769a46ad4d1aa3b3da548b329c5a60864b4cdd6..c7f0901a2dcbc533d5921ef86dd1fc72671b6457 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -14,6 +14,7 @@ Added * Add link to public page to events list * Add RSS feed of upcoming events +* Add slug field to Event model Changed ~~~~~~~ diff --git a/aleksis/apps/paweljong/forms.py b/aleksis/apps/paweljong/forms.py index 9ac8149b866014d31b77cf5cbf46e11d006f8d3c..584e5b28f43192ffa02d94685837bab0bf35209d 100644 --- a/aleksis/apps/paweljong/forms.py +++ b/aleksis/apps/paweljong/forms.py @@ -43,7 +43,7 @@ class EditEventForm(ExtensibleForm): Fieldset( _("Base data"), "linked_group", - Row("display_name", "description"), + Row("display_name", "slug", "description"), Row("place", "published"), Fieldset(_("Date data"), Row("date_event", "date_registration", "date_retraction")), Fieldset(_("Event details"), Row("cost", "max_participants"), "information"), @@ -57,6 +57,7 @@ class EditEventForm(ExtensibleForm): "linked_group", "display_name", "description", + "slug", "place", "published", "date_event", @@ -378,7 +379,8 @@ class RegisterEventConsent(ExtensibleForm): field_instance = forms.BooleanField( required=True, label=_( - "I confirm that the retraction of the registration is not possible anymore after {}" + "I confirm that the retraction of the registration is not possible anymore " + "after {}" ).format(event.date_retraction), ) self.fields["retraction_deadline"] = field_instance diff --git a/aleksis/apps/paweljong/migrations/0012_event_slug.py b/aleksis/apps/paweljong/migrations/0012_event_slug.py new file mode 100644 index 0000000000000000000000000000000000000000..0817500f7819f467cf829f8c5629d8197e1b4489 --- /dev/null +++ b/aleksis/apps/paweljong/migrations/0012_event_slug.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.12 on 2022-02-21 19:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('paweljong', '0011_registration_accepted_terms'), + ] + + operations = [ + migrations.AddField( + model_name='event', + name='slug', + field=models.SlugField(max_length=255, verbose_name='Slug', blank=True), + preserve_default=False, + ), + ] diff --git a/aleksis/apps/paweljong/models.py b/aleksis/apps/paweljong/models.py index ddb97fb812692b850cc674d4da325b04bcc46ef0..72b02714f240f533867c736922fef638ad2fa1e4 100644 --- a/aleksis/apps/paweljong/models.py +++ b/aleksis/apps/paweljong/models.py @@ -2,6 +2,7 @@ from datetime import datetime from django.db import models from django.urls import reverse +from django.utils.text import slugify from django.utils.timezone import now from django.utils.translation import gettext_lazy as _ @@ -31,6 +32,7 @@ class Event(ExtensibleModel): description = models.CharField(max_length=500, verbose_name=_("Description")) published = models.BooleanField(default=False, verbose_name=_("Publish")) place = models.CharField(max_length=50, verbose_name="Place") + slug = models.SlugField(max_length=255, verbose_name=_("Slug"), blank=True) # Date details date_event = models.DateField(verbose_name=_("Date of event")) @@ -43,6 +45,15 @@ class Event(ExtensibleModel): information = RichTextField(verbose_name=_("Information about the event")) terms = models.ManyToManyField(Terms, verbose_name=_("Terms"), related_name="event", blank=True) + def save(self, *args, **kwargs): + if not self.slug: + if self.linked_group.short_name: + self.slug = slugify(self.linked_group.short_name) + else: + self.slug = slugify(self.display_name) + + return super().save(*args, **kwargs) + def __str__(self) -> str: return self.display_name @@ -70,7 +81,7 @@ class Event(ExtensibleModel): return self.date_event > now def get_absolute_url(self): - return reverse("event_by_name", kwargs={"slug": self.linked_group.short_name}) + return reverse("event_by_name", kwargs={"slug": self.slug}) @property def booked_percentage(self): diff --git a/aleksis/apps/paweljong/tables.py b/aleksis/apps/paweljong/tables.py index c404c36cf6295b14084e3a200fce7cfb0b04a574..9dd0416c66601d415869104842983d8b0c7ad03a 100644 --- a/aleksis/apps/paweljong/tables.py +++ b/aleksis/apps/paweljong/tables.py @@ -15,13 +15,13 @@ class ManageEventsTable(tables.Table): edit = tables.LinkColumn( "edit_event_by_slug", - args=[A("linked_group__short_name")], + args=[A("slug")], verbose_name=_("Edit"), text=_("Edit"), ) view = tables.LinkColumn( "event_by_name", - args=[A("linked_group__short_name")], + args=[A("slug")], verbose_name=_("View"), text=_("View"), ) diff --git a/aleksis/apps/paweljong/templates/paweljong/event/full.html b/aleksis/apps/paweljong/templates/paweljong/event/full.html index 341236db8c76a7afb2897c03ab6b7dcfadf08a04..a50e0c3e5ff4f8f67a2e6c08bf9257ed24597e07 100644 --- a/aleksis/apps/paweljong/templates/paweljong/event/full.html +++ b/aleksis/apps/paweljong/templates/paweljong/event/full.html @@ -61,9 +61,9 @@ </div> <div class="card-action"> {% if can_register and not is_authenticated %} - <a href="{% url "register_event_by_slug_start" event.linked_group.short_name %}">{% trans "Register now" %}</a> + <a href="{% url "register_event_by_slug_start" event.slug %}">{% trans "Register now" %}</a> {% elif can_register and is_authenticated %} - <a href="{% url "register_event_by_slug" event.linked_group.short_name %}">{% trans "Register now" %}</a> + <a href="{% url "register_event_by_slug" event.slug %}">{% trans "Register now" %}</a> {% else %} <a href="#">{% trans "Not available" %}</a> {% endif %} diff --git a/aleksis/apps/paweljong/templates/paweljong/event/register_start.html b/aleksis/apps/paweljong/templates/paweljong/event/register_start.html index 46d579b03eba1fbddb59714b204dc610ac92e80a..d67d8afd37b9b9d585084f6d6cc1b7971a910c33 100644 --- a/aleksis/apps/paweljong/templates/paweljong/event/register_start.html +++ b/aleksis/apps/paweljong/templates/paweljong/event/register_start.html @@ -87,7 +87,7 @@ or have problems logging in, please send us an e-mail. {% endblocktrans %} </p> - <a href="{% url "login" %}?next=/app/paweljong/event/{{ event.linked_group.short_name }}/register">{% trans "Login" %}</a> + <a href="{% url "login" %}?next=/app/paweljong/event/{{ event.slug }}/register">{% trans "Login" %}</a> </div> <div id="with_email"> <p> @@ -98,7 +98,7 @@ https://leopard.institute/pages/services.html</a> {% endblocktrans %} </p> - <a href="{% url "set_email_needed" event.linked_group.short_name %}">{% trans "Register now" %}</a> + <a href="{% url "set_email_needed" event.slug %}">{% trans "Register now" %}</a> </div> <div id="without_email"> <p> @@ -108,7 +108,7 @@ a personal e-mail address, please choose the respective option instead! {% endblocktrans %} </p> - <a href="{% url "register_event_by_slug" event.linked_group.short_name %}">{% trans "Register now" %}</a> + <a href="{% url "register_event_by_slug" event.slug %}">{% trans "Register now" %}</a> </div> {% else %} <div id="not_possible"> diff --git a/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html b/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html index 0f2bbcd6672e75f7c08372d465c6f9a65493799f..ba22d3006f4e79607936242a62d5f5b03b8e5ac6 100644 --- a/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html +++ b/aleksis/apps/paweljong/templates/paweljong/event_registration/full.html @@ -116,7 +116,7 @@ <td> <i class="material-icons small">local_activity</a> </td> - <td colspan="3"><a href="{% url 'edit_event_by_slug' registration.event.linked_group.short_name %}">{{ registration.event }}</a></td> + <td colspan="3"><a href="{% url 'edit_event_by_slug' registration.event.slug %}">{{ registration.event }}</a></td> </tr> <tr> <td> diff --git a/aleksis/apps/paweljong/views.py b/aleksis/apps/paweljong/views.py index 13f0a78b9e74290308bff660b029671c445e1992..e10cd3b04e7ee4813fcf13adc68a311121b7c3e3 100644 --- a/aleksis/apps/paweljong/views.py +++ b/aleksis/apps/paweljong/views.py @@ -53,7 +53,7 @@ class CreateEventView(PermissionRequiredMixin, AdvancedCreateView): class EditEventView(PermissionRequiredMixin, RevisionMixin, AdvancedEditView): form_class = EditEventForm model = Event - slug_field = "linked_group__short_name" + slug_field = "slug" permission_required = "paweljong.change_event" context_object_name = "manage_events" template_name = "paweljong/event/edit.html" @@ -293,7 +293,7 @@ class RegisterEventWizardView(SessionWizardView): def get_context_data(self, form, **kwargs): context = super().get_context_data(form, **kwargs) - context["event"] = Event.objects.get(linked_group__short_name=self.kwargs["slug"]) + context["event"] = Event.objects.get(slug=self.kwargs["slug"]) if self.steps.current == "email": context["page_title"] = "" @@ -369,10 +369,10 @@ class RegisterEventWizardView(SessionWizardView): if step == "email": kwargs["request"] = self.request if step == "additional": - event = Event.objects.get(linked_group__short_name=self.kwargs["slug"]) + event = Event.objects.get(slug=self.kwargs["slug"]) kwargs["event"] = event if step == "consent": - event = Event.objects.get(linked_group__short_name=self.kwargs["slug"]) + event = Event.objects.get(slug=self.kwargs["slug"]) kwargs["event"] = event return kwargs @@ -439,7 +439,7 @@ class RegisterEventWizardView(SessionWizardView): def done(self, form_list, **kwargs): - event = Event.objects.get(linked_group__short_name=self.kwargs["slug"]) + event = Event.objects.get(slug=self.kwargs["slug"]) cleaned_data_email = self.get_cleaned_data_for_step("email") cleaned_data_contact_details = self.get_cleaned_data_for_step("contact_details") cleaned_data_guardians = self.get_cleaned_data_for_step("guardians") @@ -610,7 +610,7 @@ class RegisterEventWizardView(SessionWizardView): class EventFullView(DetailView): model = Event - slug_field = "linked_group__short_name" + slug_field = "slug" template_name = "paweljong/event/full.html" object_context_name = "event" @@ -625,7 +625,7 @@ class EventFullView(DetailView): class RegisterEventStart(DetailView): model = Event - slug_field = "linked_group__short_name" + slug_field = "slug" template_name = "paweljong/event/register_start.html" object_context_name = "event"