create_list.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from django.contrib import messages
  2. from django.contrib.auth.decorators import login_required, user_passes_test
  3. from django.core.exceptions import PermissionDenied
  4. from django.db import IntegrityError
  5. from django.http import HttpResponse
  6. from django.shortcuts import redirect, render
  7. from django.utils.text import slugify
  8. from tickets.forms import ListCreateForm
  9. from tickets.utils import staff_check
  10. @login_required
  11. @user_passes_test(staff_check)
  12. def create_list(request) -> HttpResponse:
  13. """Allow users to add a new tickets list to the group they're in.
  14. """
  15. # Only staffers can add lists, regardless of tickets_STAFF_USER setting.
  16. if not request.user.is_staff:
  17. raise PermissionDenied
  18. if request.POST:
  19. form = ListCreateForm(request.user, request.POST)
  20. if form.is_valid():
  21. try:
  22. newlist = form.save(commit=False)
  23. newlist.slug = slugify(newlist.name, allow_unicode=True)
  24. newlist.save()
  25. messages.success(request, "A new list has been added.")
  26. return redirect("tickets:lists")
  27. except IntegrityError:
  28. messages.warning(
  29. request,
  30. "There was a problem saving the new list. "
  31. "Most likely a list with the same name in the same group already exists.",
  32. )
  33. else:
  34. if request.user.groups.count() == 1:
  35. form = ListCreateForm(request.user, initial={"group": request.user.groups.first()})
  36. else:
  37. form = ListCreateForm(request.user)
  38. context = {"form": form}
  39. return render(request, "tickets/create_list.html", context)