category.py 2.5 KB

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