decorators.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  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.apps.errors import error404
  6. from misago.models import User
  7. from misago.utils.strings import slugify
  8. def profile_view(fallback='user'):
  9. def outer_decorator(f):
  10. def inner_decorator(request, user, username, *args, **kwargs):
  11. request = request
  12. user_pk = int(user)
  13. user_slug = username
  14. try:
  15. user = User.objects
  16. if settings.PROFILE_EXTENSIONS_PRELOAD:
  17. user = user.select_related(*settings.PROFILE_EXTENSIONS_PRELOAD)
  18. user = user.get(pk=user_pk)
  19. if user.username_slug != user_slug:
  20. # Force crawlers to take notice of updated username
  21. return redirect(reverse(fallback, args=(user.username_slug, user.pk)), permanent=True)
  22. return f(request, user, *args, **kwargs)
  23. except User.DoesNotExist:
  24. return error404(request)
  25. return wraps(f)(inner_decorator)
  26. return outer_decorator
  27. def user_view(f):
  28. def inner_decorator(request, user, *args, **kwargs):
  29. request = request
  30. user_pk = int(user)
  31. try:
  32. user = User.objects.get(pk=user_pk)
  33. return f(request, user, *args, **kwargs)
  34. except User.DoesNotExist:
  35. return error404(request)
  36. return wraps(f)(inner_decorator)