moderation.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from django.forms import ValidationError
  2. from django.utils.translation import ugettext as _
  3. from rest_framework import serializers
  4. from misago.acl import add_acl
  5. from misago.categories.models import Category
  6. from misago.categories.permissions import can_see_category, can_browse_category
  7. from misago.threads.models import THREAD_WEIGHT_DEFAULT, THREAD_WEIGHT_GLOBAL
  8. from misago.threads.permissions import allow_start_thread
  9. from misago.threads.validators import validate_title
  10. def validate_category(user, category_id):
  11. try:
  12. category = Category.objects.all_categories().get(id=category_id)
  13. except Category.DoesNotExist:
  14. category = None
  15. if not category or not can_see_category(user, category):
  16. raise ValidationError(_("Requested category could not be found."))
  17. if not can_browse_category(user, category):
  18. raise ValidationError(
  19. _("You don't have permission to access this category."))
  20. return category
  21. class MergeThreadsSerializer(serializers.Serializer):
  22. title = serializers.CharField()
  23. category = serializers.IntegerField()
  24. top_category = serializers.IntegerField(required=False, allow_null=True)
  25. weight = serializers.IntegerField(
  26. required=False,
  27. allow_null=True,
  28. max_value=THREAD_WEIGHT_GLOBAL,
  29. min_value=THREAD_WEIGHT_DEFAULT,
  30. )
  31. is_closed = serializers.NullBooleanField(required=False)
  32. def validate_title(self, title):
  33. return validate_title(title)
  34. def validate_top_category(self, category_id):
  35. return validate_category(self.context, category_id)
  36. def validate_category(self, category_id):
  37. self.category = validate_category(self.context, category_id)
  38. return self.category
  39. def validate_weight(self, weight):
  40. try:
  41. add_acl(self.context, self.category)
  42. except AttributeError:
  43. return weight # don't validate weight further if category failed
  44. if weight > self.category.acl.get('can_pin_threads', 0):
  45. if weight == 2:
  46. raise ValidationError(_("You don't have permission to pin "
  47. "threads globally in this category."))
  48. else:
  49. raise ValidationError(_("You don't have permission to pin "
  50. "threads in this category."))
  51. return weight
  52. def validate_is_closed(self, is_closed):
  53. try:
  54. add_acl(self.context, self.category)
  55. except AttributeError:
  56. return is_closed # don't validate closed further if category failed
  57. if is_closed and not self.category.acl.get('can_close_threads'):
  58. raise ValidationError(_("You don't have permission to close "
  59. "threads in this category."))
  60. return is_closed