moderation.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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.bans import get_user_ban
  10. from misago.users.decorators import deny_guests
  11. from misago.users.forms.rename import ChangeUsernameForm
  12. from misago.users.forms.modusers import BanForm
  13. from misago.users.models import Ban
  14. from misago.users.permissions.moderation import (allow_rename_user,
  15. allow_ban_user,
  16. allow_lift_ban)
  17. from misago.users.permissions.delete import allow_delete_user
  18. from misago.users.sites import user_profile
  19. def user_moderation_view(required_permission=None):
  20. def wrap(f):
  21. @deny_guests
  22. @transaction.atomic
  23. def decorator(request, *args, **kwargs):
  24. queryset = get_user_model().objects
  25. user_id = kwargs.pop('user_id')
  26. kwargs['user'] = get_object_or_404(queryset, id=user_id)
  27. validate_slug(kwargs['user'], kwargs.pop('user_slug'))
  28. add_acl(request.user, kwargs['user'])
  29. if required_permission:
  30. required_permission(request.user, kwargs['user'])
  31. return f(request, *args, **kwargs)
  32. return decorator
  33. return wrap
  34. @user_moderation_view(allow_rename_user)
  35. def rename(request, user):
  36. form = ChangeUsernameForm(user=user)
  37. if request.method == 'POST':
  38. old_username = user.username
  39. form = ChangeUsernameForm(request.POST, user=user)
  40. if form.is_valid():
  41. try:
  42. form.change_username(changed_by=request.user)
  43. message = _("%(old_username)s's username has been changed.")
  44. message = message % {'old_username': old_username}
  45. messages.success(request, message)
  46. return redirect(user_profile.get_default_link(),
  47. **{'user_slug': user.slug, 'user_id': user.pk})
  48. except IntegrityError:
  49. message = _("Error changing username. Please try again.")
  50. messages.error(request, message)
  51. return render(request, 'misago/modusers/rename.html',
  52. {'profile': user, 'form': form})
  53. @user_moderation_view(allow_ban_user)
  54. def ban_user(request, user):
  55. form = BanForm(user=user)
  56. if request.method == 'POST':
  57. form = BanForm(request.POST, user=user)
  58. if form.is_valid():
  59. form.ban_user()
  60. message = _("%(username)s has been banned.")
  61. messages.success(request, message % {'username': user.username})
  62. return redirect(user_profile.get_default_link(),
  63. **{'user_slug': user.slug, 'user_id': user.pk})
  64. return render(request, 'misago/modusers/ban.html',
  65. {'profile': user, 'form': form})
  66. @require_POST
  67. @user_moderation_view(allow_lift_ban)
  68. def lift_user_ban(request, user):
  69. user_ban = get_user_ban(user).ban
  70. user_ban.lift()
  71. user_ban.save()
  72. Ban.objects.invalidate_cache()
  73. message = _("%(username)s's ban has been lifted.")
  74. messages.success(request, message % {'username': user.username})
  75. return redirect(user_profile.get_default_link(),
  76. **{'user_slug': user.slug, 'user_id': user.pk})
  77. @require_POST
  78. @user_moderation_view(allow_delete_user)
  79. def delete(request, user):
  80. user.delete(delete_content=True)
  81. message = _("User %(username)s has been deleted.")
  82. messages.success(request, message % {'username': user.username})
  83. return redirect('misago:index')