moderation.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from django.contrib import messages
  2. from django.contrib.auth import get_user_model
  3. from django.db import IntegrityError, transaction
  4. from django.shortcuts import redirect, render
  5. from django.utils.translation import ugettext as _
  6. from misago.acl import add_acl
  7. from misago.core.decorators import require_POST
  8. from misago.core.shortcuts import get_object_or_404, validate_slug
  9. from misago.users.forms.rename import ChangeUsernameForm
  10. from misago.users.decorators import deny_guests
  11. from misago.users.permissions.moderation import (allow_rename_user,
  12. allow_ban_username,
  13. allow_ban_email)
  14. from misago.users.permissions.delete import allow_delete_user
  15. from misago.users.sites import user_profile
  16. def user_moderation_view(required_permission=None):
  17. def wrap(f):
  18. @deny_guests
  19. @transaction.atomic
  20. def decorator(request, *args, **kwargs):
  21. queryset = get_user_model().objects
  22. user_id = kwargs.pop('user_id')
  23. kwargs['user'] = get_object_or_404(queryset, id=user_id)
  24. validate_slug(kwargs['user'], kwargs.pop('user_slug'))
  25. add_acl(request.user, kwargs['user'])
  26. if required_permission:
  27. required_permission(request.user, kwargs['user'])
  28. return f(request, *args, **kwargs)
  29. return decorator
  30. return wrap
  31. @user_moderation_view(allow_rename_user)
  32. def rename(request, user):
  33. form = ChangeUsernameForm(user=user)
  34. if request.method == 'POST':
  35. old_username = user.username
  36. form = ChangeUsernameForm(request.POST, user=user)
  37. if form.is_valid():
  38. try:
  39. form.change_username(changed_by=request.user)
  40. message = _("%(old_username)s's username has been changed.")
  41. message = message % {'old_username': old_username}
  42. messages.success(request, message)
  43. return redirect(user_profile.get_default_link(),
  44. **{'user_slug': user.slug, 'user_id': user.pk})
  45. except IntegrityError:
  46. message = _("Error changing username. Please try again.")
  47. messages.error(request, message)
  48. return render(request, 'misago/modusers/rename.html',
  49. {'profile': user, 'form': form})
  50. @user_moderation_view(allow_ban_username)
  51. def ban_username(request, user):
  52. form = ChangeUsernameForm(user=user)
  53. if request.method == 'POST':
  54. old_username = user.username
  55. form = ChangeUsernameForm(request.POST, user=user)
  56. if form.is_valid():
  57. user.set_username(form.cleaned_data['new_username'],
  58. changed_by=request.user)
  59. user.save(update_fields=['username', 'slug'])
  60. message = _("%(old_username)s's username has been changed.")
  61. messages.success(request, message % {'old_username': old_username})
  62. return redirect(user_profile.get_default_link(),
  63. **{'user_slug': user.slug, 'user_id': user.pk})
  64. return render(request, 'misago/modusers/rename.html',
  65. {'profile': user, 'form': form})
  66. @user_moderation_view(allow_ban_email)
  67. def ban_email(request, user):
  68. form = ChangeUsernameForm(user=user)
  69. if request.method == 'POST':
  70. old_username = user.username
  71. form = ChangeUsernameForm(request.POST, user=user)
  72. if form.is_valid():
  73. user.set_username(form.cleaned_data['new_username'],
  74. changed_by=request.user)
  75. user.save(update_fields=['username', 'slug'])
  76. message = _("%(old_username)s's username has been changed.")
  77. messages.success(request, message % {'old_username': old_username})
  78. return redirect(user_profile.get_default_link(),
  79. **{'user_slug': user.slug, 'user_id': user.pk})
  80. return render(request, 'misago/modusers/rename.html',
  81. {'profile': user, 'form': form})
  82. @require_POST
  83. @user_moderation_view(allow_delete_user)
  84. def delete(request, user):
  85. user.delete(delete_content=True)
  86. message = _("User %(username)s has been deleted.")
  87. messages.success(request, message % {'username': user.username})
  88. return redirect('misago:index')