profile.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. # we are trying to display page thats not in nav
  25. raise Http404()
  26. return decorator
  27. def render(request, template, context):
  28. context['pages'] = user_profile.get_pages(request, context['profile'])
  29. for page in context['pages']:
  30. if page['is_active']:
  31. context['active_page'] = page
  32. break
  33. if request.user.is_authenticated():
  34. is_authenticated_user = context['profile'].pk == request.user.pk
  35. else:
  36. is_authenticated_user = False
  37. context['is_authenticated_user'] = is_authenticated_user
  38. user_acl = request.user.acl
  39. if request.user.is_authenticated():
  40. if is_authenticated_user:
  41. context['show_email'] = True
  42. else:
  43. context['show_email'] = user_acl['can_see_users_emails']
  44. else:
  45. context['show_email'] = False
  46. context['state'] = online.state_for_acl(context['profile'], user_acl)
  47. return django_render(request, template, context)
  48. @profile_view
  49. def user_posts(request, profile=None, page=0):
  50. return render(request, 'misago/profile/posts.html', {'profile': profile})
  51. @profile_view
  52. def user_threads(request, profile=None, page=0):
  53. return render(request, 'misago/profile/threads.html', {'profile': profile})
  54. @profile_view_restricted_visibility
  55. def name_history(request, profile=None, page=0):
  56. name_changes_sq = profile.namechanges.all().order_by('-id')
  57. name_changes = paginate(name_changes_sq, page, 12, 4)
  58. items_left = name_changes.paginator.count - name_changes.end_index()
  59. return render(request, 'misago/profile/name_history.html', {
  60. 'profile': profile,
  61. 'name_changes': name_changes,
  62. 'page_number': name_changes.number,
  63. 'items_left': items_left
  64. })