moderation.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 THREADS_ROOT_NAME, Category
  6. from misago.categories.permissions import can_browse_category, can_see_category
  7. from ..models import THREAD_WEIGHT_DEFAULT, THREAD_WEIGHT_GLOBAL
  8. from ..permissions import allow_start_thread
  9. from ..threadtypes import trees_map
  10. from ..validators import validate_title
  11. def validate_category(user, category_id, allow_root=False):
  12. try:
  13. threads_tree_id = trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)
  14. category = Category.objects.get(
  15. tree_id=threads_tree_id,
  16. id=category_id,
  17. )
  18. except Category.DoesNotExist:
  19. category = None
  20. # Skip ACL validation for root category?
  21. if allow_root and category and not category.level:
  22. return category
  23. if not category or not can_see_category(user, category):
  24. raise ValidationError(_("Requested category could not be found."))
  25. if not can_browse_category(user, category):
  26. raise ValidationError(_("You don't have permission to access this category."))
  27. return category
  28. class MergeThreadsSerializer(serializers.Serializer):
  29. title = serializers.CharField()
  30. category = serializers.IntegerField()
  31. top_category = serializers.IntegerField(required=False, allow_null=True)
  32. weight = serializers.IntegerField(
  33. required=False,
  34. allow_null=True,
  35. max_value=THREAD_WEIGHT_GLOBAL,
  36. min_value=THREAD_WEIGHT_DEFAULT,
  37. )
  38. is_closed = serializers.NullBooleanField(required=False)
  39. def validate_title(self, title):
  40. return validate_title(title)
  41. def validate_top_category(self, category_id):
  42. return validate_category(self.context, category_id, allow_root=True)
  43. def validate_category(self, category_id):
  44. self.category = validate_category(self.context, category_id)
  45. return self.category
  46. def validate_weight(self, weight):
  47. try:
  48. add_acl(self.context, self.category)
  49. except AttributeError:
  50. return weight # don't validate weight further if category failed
  51. if weight > self.category.acl.get('can_pin_threads', 0):
  52. if weight == 2:
  53. raise ValidationError(_("You don't have permission to pin threads globally in this category."))
  54. else:
  55. raise ValidationError(_("You don't have permission to pin threads in this category."))
  56. return weight
  57. def validate_is_closed(self, is_closed):
  58. try:
  59. add_acl(self.context, self.category)
  60. except AttributeError:
  61. return is_closed # don't validate closed further if category failed
  62. if is_closed and not self.category.acl.get('can_close_threads'):
  63. raise ValidationError(_("You don't have permission to close threads in this category."))
  64. return is_closed