profile.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. from django.contrib.auth import get_user_model
  2. from django.http import Http404
  3. from django.shortcuts import redirect, render as django_render
  4. from misago.core.shortcuts import get_object_or_404, paginate, validate_slug
  5. from misago.users import online
  6. from misago.users.sites import user_profile
  7. def profile_view(f):
  8. def decorator(*args, **kwargs):
  9. relations = ('rank', 'online_tracker', 'ban_cache')
  10. queryset = get_user_model().objects.select_related(*relations)
  11. profile = get_object_or_404(queryset, id=kwargs.pop('user_id'))
  12. validate_slug(profile, kwargs.pop('user_slug'))
  13. kwargs['profile'] = profile
  14. return f(*args, **kwargs)
  15. return decorator
  16. def profile_view_restricted_visibility(f):
  17. @profile_view
  18. def decorator(request, *args, **kwargs):
  19. pages = user_profile.get_pages(request, kwargs['profile'])
  20. for page in pages:
  21. if page['is_active']:
  22. return f(request, *args, **kwargs)
  23. else:
  24. raise Http404()
  25. return decorator
  26. def render(request, template, context):
  27. context['pages'] = user_profile.get_pages(request, context['profile'])
  28. for page in context['pages']:
  29. if page['is_active']:
  30. context['active_page'] = page
  31. break
  32. if request.user.is_authenticated():
  33. is_authenticated_user = context['profile'].pk == request.user.pk
  34. else:
  35. is_authenticated_user = False
  36. context['is_authenticated_user'] = is_authenticated_user
  37. user_acl = request.user.acl
  38. if request.user.is_authenticated():
  39. if is_authenticated_user:
  40. context['show_email'] = True
  41. else:
  42. context['show_email'] = user_acl['can_see_users_emails']
  43. else:
  44. context['show_email'] = False
  45. context['state'] = online.state_for_acl(context['profile'], user_acl)
  46. return django_render(request, template, context)
  47. @profile_view
  48. def user_posts(request, profile=None, page=0):
  49. return render(request, 'misago/profile/posts.html', {'profile': profile})
  50. @profile_view
  51. def user_threads(request, profile=None, page=0):
  52. return render(request, 'misago/profile/threads.html', {'profile': profile})
  53. @profile_view_restricted_visibility
  54. def name_history(request, profile=None, page=0):
  55. name_changes_sq = profile.namechanges.all().order_by('-id')
  56. name_changes = paginate(name_changes_sq, page, 24, 6)
  57. items_left = name_changes.paginator.count - name_changes.end_index()
  58. return render(request, 'misago/profile/name_history.html', {
  59. 'profile': profile,
  60. 'name_changes': name_changes,
  61. 'page_number': name_changes.number,
  62. 'items_left': items_left
  63. })