diff --git a/litl/forms.py b/litl/forms.py index 0f3bad3..d4a9749 100644 --- a/litl/forms.py +++ b/litl/forms.py @@ -4,6 +4,7 @@ # Forms for litl. The main form is for creating the link. from django import forms +from django.core.exceptions import ValidationError from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit from .models import Slug diff --git a/litl/templates/base.html b/litl/templates/base.html index d0cbe92..a2084e3 100644 --- a/litl/templates/base.html +++ b/litl/templates/base.html @@ -23,6 +23,17 @@ Code
+ {% if messages %} +
+ {% for message in messages %} + {% if message.tags == "error" %} +
{{ message }}
+ {% else %} +
{{ message }}
+ {% endif %} + {% endfor %} +
+ {% endif %}
{% block content %} {% endblock %} diff --git a/litl/views.py b/litl/views.py index a4c8eb2..15df9eb 100644 --- a/litl/views.py +++ b/litl/views.py @@ -4,7 +4,9 @@ # Views for litl. from django.shortcuts import render -from django.http import HttpResponseRedirect +from django import forms +from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect +from django.contrib import messages from .settings import TEMPLATES, RANDOM_SLUG_LEN, UID_LEN from .models import Slug @@ -23,25 +25,31 @@ def index(request): def AddSlug(request): """Display the form for creating a new slug. """ - if request.method == 'POST': - form = SlugAddForm(request.POST) - if form.is_valid(): - slug = form.save(commit=False) - - if slug.slug == '': - while slug.slug=='': - rand_string = ''.join(random.choice(ensemble) for _ in range(RANDOM_SLUG_LEN)) - if not Slug.objects.filter(slug=rand_string).exists(): - slug.slug = rand_string - while slug.uid == None: - rand_uid = ''.join(random.choice(ensemble) for _ in range(UID_LEN)) - if not Slug.objects.filter(uid = rand_uid).exists(): - slug.uid = rand_uid - - slug.save() - return HttpResponseRedirect('display/{}'.format(slug.slug)) - else: - form = SlugAddForm() + form = SlugAddForm(request.POST or None) + if request.method == 'POST' and form.is_valid(): + # Add slug if needed + if form.cleaned_data['slug'] == '': + rand_slug = ''.join(random.choice(ensemble) for _ in range(RANDOM_SLUG_LEN)) + while Slug.object.filter(slug = rand_slug).exists(): + rand_string = ''.join(random.choice(ensemble) for _ in range(RANDOM_SLUG_LEN)) + form.cleaned_data['slug'] = rand_string + else: + # If slug added by the user, check uniqueness + if Slug.objects.filter(slug=form.cleaned_data['slug']).exists(): + messages.error(request,"This slug is already in use.") + return render(request,'add_slug.html',{'form':form}) + + # Generate uid + rand_uid = ''.join(random.choice(ensemble) for _ in range(UID_LEN)) + while Slug.objects.filter(uid = rand_uid).exists(): + rand_uid = ''.join(random.choice(ensemble) for _ in range(UID_LEN)) + + slug = form.save(commit=False) + slug.uid = rand_uid + slug.save() + return HttpResponseRedirect('display/{}'.format(slug.slug)) + + # First call, return empty form return render(request,'add_slug.html',{'form':form}) def display(request, slug_got): @@ -58,5 +66,5 @@ def redirect(request,slug_got): context = {'slug':slug_got,'request': request} return render(request,'unknown.html',context) else: - return HttpResponseRedirect(slug.get().destination) + return HttpResponsePermanentRedirect(slug.get().destination)