moderation.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.contrib import messages
  2. from django.contrib.auth import get_user_model
  3. from django.db import 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.usercp import ChangeUsernameForm
  10. from misago.users.decorators import deny_guests
  11. from misago.users.permissions.moderation import allow_rename_user
  12. from misago.users.permissions.delete import allow_delete_user
  13. from misago.users.sites import user_profile
  14. def user_moderation_view(required_permission=None):
  15. def wrap(f):
  16. @deny_guests
  17. @transaction.atomic
  18. def decorator(request, *args, **kwargs):
  19. queryset = get_user_model().objects
  20. user_id = kwargs.pop('user_id')
  21. kwargs['user'] = get_object_or_404(queryset, id=user_id)
  22. validate_slug(kwargs['user'], kwargs.pop('user_slug'))
  23. add_acl(request.user, kwargs['user'])
  24. if required_permission:
  25. required_permission(request.user, kwargs['user'])
  26. return f(request, *args, **kwargs)
  27. return decorator
  28. return wrap
  29. @user_moderation_view(allow_rename_user)
  30. def rename(request, user):
  31. form = ChangeUsernameForm(user=user)
  32. if request.method == 'POST':
  33. old_username = user.username
  34. form = ChangeUsernameForm(request.POST, user=user)
  35. if form.is_valid():
  36. user.set_username(form.cleaned_data['new_username'],
  37. changed_by=request.user)
  38. user.save(update_fields=['username', 'slug'])
  39. message = _("%(old_username)s's username has been changed.")
  40. messages.success(request, message % {'old_username': old_username})
  41. return redirect(user_profile.get_default_link(),
  42. **{'user_slug': user.slug, 'user_id': user.pk})
  43. return render(request, 'misago/modusers/rename.html',
  44. {'profile': user, 'form': form})
  45. @require_POST
  46. @user_moderation_view(allow_delete_user)
  47. def delete(request, user):
  48. user.delete(delete_content=True)
  49. message = _("User %(username)s has been deleted.")
  50. messages.success(request, message % {'username': user.username})
  51. return redirect('misago:index')