profile.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. from misago.users.warnings import (get_warning_levels, get_user_warning_level,
  10. get_user_warning_obj)
  11. def profile_view(f):
  12. def decorator(request, *args, **kwargs):
  13. relations = ('rank', 'online_tracker', 'ban_cache')
  14. queryset = get_user_model().objects.select_related(*relations)
  15. profile = get_object_or_404(queryset, id=kwargs.pop('user_id'))
  16. validate_slug(profile, kwargs.pop('user_slug'))
  17. kwargs['profile'] = profile
  18. add_acl(request.user, profile)
  19. return f(request, *args, **kwargs)
  20. return decorator
  21. def profile_view_restricted_visibility(f):
  22. @profile_view
  23. def decorator(request, *args, **kwargs):
  24. pages = user_profile.get_pages(request, kwargs['profile'])
  25. for page in pages:
  26. if page['is_active']:
  27. return f(request, *args, **kwargs)
  28. else:
  29. # we are trying to display page thats not in nav
  30. raise Http404()
  31. return decorator
  32. def render(request, template, context):
  33. context['pages'] = user_profile.get_pages(request, context['profile'])
  34. for page in context['pages']:
  35. if page['is_active']:
  36. context['active_page'] = page
  37. break
  38. if request.user.is_authenticated():
  39. is_authenticated_user = context['profile'].pk == request.user.pk
  40. else:
  41. is_authenticated_user = False
  42. context['is_authenticated_user'] = is_authenticated_user
  43. user_acl = request.user.acl
  44. if request.user.is_authenticated():
  45. if is_authenticated_user:
  46. context['show_email'] = True
  47. else:
  48. context['show_email'] = user_acl['can_see_users_emails']
  49. else:
  50. context['show_email'] = False
  51. context['state'] = online.state_for_acl(context['profile'], user_acl)
  52. return django_render(request, template, context)
  53. @profile_view
  54. def user_posts(request, profile=None, page=0):
  55. return render(request, 'misago/profile/posts.html', {'profile': profile})
  56. @profile_view
  57. def user_threads(request, profile=None, page=0):
  58. return render(request, 'misago/profile/threads.html', {'profile': profile})
  59. @profile_view_restricted_visibility
  60. def warnings(request, profile=None, page=0):
  61. warnings_qs = profile.warnings.order_by('-id')
  62. warnings = paginate(warnings_qs, page, 5, 2)
  63. items_left = warnings.paginator.count - warnings.end_index()
  64. add_acl(request.user, warnings.object_list)
  65. warning_level = get_user_warning_level(profile)
  66. warning_level_obj = get_user_warning_obj(profile)
  67. active_warnings = warning_level - warnings.start_index() + 1
  68. for warning in warnings.object_list:
  69. if warning.is_canceled:
  70. warning.is_active = False
  71. else:
  72. warning.is_active = active_warnings > 0
  73. active_warnings -= 1
  74. levels_total = len(get_warning_levels()) - 1
  75. if levels_total and warning_level:
  76. warning_progress = 100 - warning_level * 100 / levels_total
  77. else:
  78. warning_progress = 100
  79. if warning_level:
  80. warning_level_obj.level = warning_level
  81. return render(request, 'misago/profile/warnings.html', {
  82. 'profile': profile,
  83. 'warnings': warnings,
  84. 'warning_level': warning_level_obj,
  85. 'warning_progress': warning_progress,
  86. 'page_number': warnings.number,
  87. 'items_left': items_left
  88. })
  89. @profile_view_restricted_visibility
  90. def name_history(request, profile=None, page=0):
  91. name_changes_qs = profile.namechanges.all().order_by('-id')
  92. name_changes = paginate(name_changes_qs, page, 12, 4)
  93. items_left = name_changes.paginator.count - name_changes.end_index()
  94. return render(request, 'misago/profile/name_history.html', {
  95. 'profile': profile,
  96. 'name_changes': name_changes,
  97. 'page_number': name_changes.number,
  98. 'items_left': items_left
  99. })
  100. @profile_view_restricted_visibility
  101. def user_ban(request, profile=None):
  102. ban = get_user_ban(profile)
  103. if not ban:
  104. raise Http404()
  105. return render(request, 'misago/profile/ban_details.html', {
  106. 'profile': profile,
  107. 'ban': ban
  108. })