moderation.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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.forms.modusers import BanForm
  11. from misago.users.decorators import deny_guests
  12. from misago.users.permissions.moderation import (allow_rename_user,
  13. allow_ban_user)
  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_user)
  51. def ban_user(request, user):
  52. form = BanForm(user=user)
  53. if request.method == 'POST':
  54. form = BanForm(request.POST, user=user)
  55. if form.is_valid():
  56. form.ban_user()
  57. message = _("%(username)s has been banned.")
  58. messages.success(request, message % {'username': user.username})
  59. return redirect(user_profile.get_default_link(),
  60. **{'user_slug': user.slug, 'user_id': user.pk})
  61. return render(request, 'misago/modusers/ban.html',
  62. {'profile': user, 'form': form})
  63. @require_POST
  64. @user_moderation_view(allow_delete_user)
  65. def delete(request, user):
  66. user.delete(delete_content=True)
  67. message = _("User %(username)s has been deleted.")
  68. messages.success(request, message % {'username': user.username})
  69. return redirect('misago:index')