decorators.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. from functools import wraps
  2. from django.conf import settings
  3. from django.core.urlresolvers import reverse
  4. from django.shortcuts import redirect
  5. from misago.acl.exceptions import ACLError403, ACLError404
  6. from misago.apps.errors import error403, error404
  7. from misago.models import User
  8. from misago.utils.strings import slugify
  9. def profile_view(fallback='user'):
  10. def outer_decorator(f):
  11. def inner_decorator(request, user, username, *args, **kwargs):
  12. request = request
  13. user_pk = int(user)
  14. user_slug = username
  15. try:
  16. user = User.objects
  17. if settings.PROFILE_EXTENSIONS_PRELOAD:
  18. user = user.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
  19. user = user.get(pk=user_pk)
  20. if user.username_slug != user_slug:
  21. # Force crawlers to take notice of updated username
  22. return redirect(reverse(fallback, args=(user.username_slug, user.pk)), permanent=True)
  23. return f(request, user, *args, **kwargs)
  24. except User.DoesNotExist:
  25. return error404(request)
  26. except ACLError404:
  27. return error404(request)
  28. except ACLError403 as e:
  29. return error403(request, e.message)
  30. return wraps(f)(inner_decorator)
  31. return outer_decorator
  32. def user_view(f):
  33. def inner_decorator(request, user, *args, **kwargs):
  34. request = request
  35. user_pk = int(user)
  36. try:
  37. user = User.objects.get(pk=user_pk)
  38. return f(request, user, *args, **kwargs)
  39. except User.DoesNotExist:
  40. return error404(request)
  41. return wraps(f)(inner_decorator)