category.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. from django.core.exceptions import PermissionDenied
  2. from django.utils.translation import ugettext as _, ugettext_lazy
  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_see_category, can_browse_category
  7. from . import PostingEndpoint, PostingMiddleware
  8. from ...permissions.threads import allow_start_thread
  9. from ...threadtypes import trees_map
  10. class CategoryMiddleware(PostingMiddleware):
  11. """
  12. Middleware that validates category id and sets category on thread and post instances
  13. """
  14. def use_this_middleware(self):
  15. if self.mode == PostingEndpoint.START:
  16. return self.tree_name == THREADS_ROOT_NAME
  17. return False
  18. def get_serializer(self):
  19. return CategorySerializer(self.user, data=self.request.data)
  20. def pre_save(self, serializer):
  21. category = serializer.category_cache
  22. add_acl(self.user, category)
  23. # set flags for savechanges middleware
  24. category.update_all = False
  25. category.update_fields = []
  26. # assign category to thread and post
  27. self.thread.category = category
  28. self.post.category = category
  29. class CategorySerializer(serializers.Serializer):
  30. category = serializers.IntegerField(error_messages={
  31. 'required': ugettext_lazy("You have to select category to post thread in."),
  32. 'invalid': ugettext_lazy("Selected category is invalid.")
  33. })
  34. def __init__(self, user, *args, **kwargs):
  35. self.user = user
  36. self.category_cache = None
  37. super(CategorySerializer, self).__init__(*args, **kwargs)
  38. def validate_category(self, value):
  39. try:
  40. self.category_cache = Category.objects.get(
  41. pk=value,
  42. tree_id=trees_map.get_tree_id_for_root(THREADS_ROOT_NAME)
  43. )
  44. can_see = can_see_category(self.user, self.category_cache)
  45. can_browse = can_browse_category(self.user, self.category_cache)
  46. if not (self.category_cache.level and can_see and can_browse):
  47. raise PermissionDenied(_("Selected category is invalid."))
  48. allow_start_thread(self.user, self.category_cache)
  49. except PermissionDenied as e:
  50. raise serializers.ValidationError(e.args[0])
  51. except Category.DoesNotExist:
  52. raise serializers.ValidationError(
  53. _("Selected category doesn't exist or you don't have permission to browse it."))