profile.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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.acl import add_acl
  5. from misago.core.shortcuts import get_object_or_404, paginate, validate_slug
  6. from misago.users import online
  7. from misago.users.bans import get_user_ban
  8. from misago.users.sites import user_profile
  9. def profile_view(f):
  10. def decorator(request, *args, **kwargs):
  11. relations = ('rank', 'online_tracker', 'ban_cache')
  12. queryset = get_user_model().objects.select_related(*relations)
  13. profile = get_object_or_404(queryset, id=kwargs.pop('user_id'))
  14. validate_slug(profile, kwargs.pop('user_slug'))
  15. kwargs['profile'] = profile
  16. add_acl(request.user, profile)
  17. return f(request, *args, **kwargs)
  18. return decorator
  19. def profile_view_restricted_visibility(f):
  20. @profile_view
  21. def decorator(request, *args, **kwargs):
  22. pages = user_profile.get_pages(request, kwargs['profile'])
  23. for page in pages:
  24. if page['is_active']:
  25. return f(request, *args, **kwargs)
  26. else:
  27. # we are trying to display page thats not in nav
  28. raise Http404()
  29. return decorator
  30. def render(request, template, context):
  31. context['pages'] = user_profile.get_pages(request, context['profile'])
  32. for page in context['pages']:
  33. if page['is_active']:
  34. context['active_page'] = page
  35. break
  36. if request.user.is_authenticated():
  37. is_authenticated_user = context['profile'].pk == request.user.pk
  38. else:
  39. is_authenticated_user = False
  40. context['is_authenticated_user'] = is_authenticated_user
  41. user_acl = request.user.acl
  42. if request.user.is_authenticated():
  43. if is_authenticated_user:
  44. context['show_email'] = True
  45. else:
  46. context['show_email'] = user_acl['can_see_users_emails']
  47. else:
  48. context['show_email'] = False
  49. context['state'] = online.state_for_acl(context['profile'], user_acl)
  50. return django_render(request, template, context)
  51. @profile_view
  52. def user_posts(request, profile=None, page=0):
  53. return render(request, 'misago/profile/posts.html', {'profile': profile})
  54. @profile_view
  55. def user_threads(request, profile=None, page=0):
  56. return render(request, 'misago/profile/threads.html', {'profile': profile})
  57. @profile_view_restricted_visibility
  58. def name_history(request, profile=None, page=0):
  59. name_changes_sq = profile.namechanges.all().order_by('-id')
  60. name_changes = paginate(name_changes_sq, page, 12, 4)
  61. items_left = name_changes.paginator.count - name_changes.end_index()
  62. return render(request, 'misago/profile/name_history.html', {
  63. 'profile': profile,
  64. 'name_changes': name_changes,
  65. 'page_number': name_changes.number,
  66. 'items_left': items_left
  67. })
  68. @profile_view_restricted_visibility
  69. def user_ban(request, profile=None):
  70. ban = get_user_ban(profile)
  71. if not ban:
  72. raise Http404()
  73. return render(request, 'misago/profile/ban_details.html', {
  74. 'profile': profile,
  75. 'ban': ban
  76. })