moderation.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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 misago.threads.models import THREAD_WEIGHT_DEFAULT, THREAD_WEIGHT_GLOBAL
  8. from misago.threads.permissions import allow_start_thread
  9. from misago.threads.threadtypes import trees_map
  10. from misago.threads.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(
  27. _("You don't have permission to access this category."))
  28. return category
  29. class MergeThreadsSerializer(serializers.Serializer):
  30. title = serializers.CharField()
  31. category = serializers.IntegerField()
  32. top_category = serializers.IntegerField(required=False, allow_null=True)
  33. weight = serializers.IntegerField(
  34. required=False,
  35. allow_null=True,
  36. max_value=THREAD_WEIGHT_GLOBAL,
  37. min_value=THREAD_WEIGHT_DEFAULT,
  38. )
  39. is_closed = serializers.NullBooleanField(required=False)
  40. def validate_title(self, title):
  41. return validate_title(title)
  42. def validate_top_category(self, category_id):
  43. return validate_category(self.context, category_id, allow_root=True)
  44. def validate_category(self, category_id):
  45. self.category = validate_category(self.context, category_id)
  46. return self.category
  47. def validate_weight(self, weight):
  48. try:
  49. add_acl(self.context, self.category)
  50. except AttributeError:
  51. return weight # don't validate weight further if category failed
  52. if weight > self.category.acl.get('can_pin_threads', 0):
  53. if weight == 2:
  54. raise ValidationError(_("You don't have permission to pin "
  55. "threads globally in this category."))
  56. else:
  57. raise ValidationError(_("You don't have permission to pin "
  58. "threads in this category."))
  59. return weight
  60. def validate_is_closed(self, is_closed):
  61. try:
  62. add_acl(self.context, self.category)
  63. except AttributeError:
  64. return is_closed # don't validate closed further if category failed
  65. if is_closed and not self.category.acl.get('can_close_threads'):
  66. raise ValidationError(_("You don't have permission to close "
  67. "threads in this category."))
  68. return is_closed