diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 0a4b61586..360d6d0e3 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -107,6 +107,7 @@ class ExtendedRecipeMixin(): ''' ExtendedRecipe annotates a queryset with recipe_image and recipe_count values ''' + @classmethod def annotate_recipe(self, queryset=None, request=None, serializer=None, tree=False): extended = str2bool(request.query_params.get('extended', None)) @@ -146,10 +147,10 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin): if fuzzy: self.queryset = ( self.queryset - .annotate(starts=Case(When(name__istartswith=query, then=(Value(.3, output_field=IntegerField()))), default=Value(0))) - .annotate(trigram=TrigramSimilarity('name', query)) - .annotate(sort=F('starts')+F('trigram')) - .order_by('-sort') + .annotate(starts=Case(When(name__istartswith=query, then=(Value(.3, output_field=IntegerField()))), default=Value(0))) + .annotate(trigram=TrigramSimilarity('name', query)) + .annotate(sort=F('starts') + F('trigram')) + .order_by('-sort') ) else: # TODO have this check unaccent search settings or other search preferences? @@ -183,8 +184,8 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin): class MergeMixin(ViewSetMixin): - @ decorators.action(detail=True, url_path='merge/(?P[^/.]+)', methods=['PUT'], ) - @ decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer)) + @decorators.action(detail=True, url_path='merge/(?P[^/.]+)', methods=['PUT'], ) + @decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer)) def merge(self, request, pk, target): self.description = f"Merge {self.basename} onto target {self.basename} with ID of [int]." @@ -280,8 +281,8 @@ class TreeMixin(MergeMixin, FuzzyFilterMixin, ExtendedRecipeMixin): return self.annotate_recipe(queryset=self.queryset, request=self.request, serializer=self.serializer_class, tree=True) - @ decorators.action(detail=True, url_path='move/(?P[^/.]+)', methods=['PUT'], ) - @ decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer)) + @decorators.action(detail=True, url_path='move/(?P[^/.]+)', methods=['PUT'], ) + @decorators.renderer_classes((TemplateHTMLRenderer, JSONRenderer)) def move(self, request, pk, parent): self.description = f"Move {self.basename} to be a child of {self.basename} with ID of [int]. Use ID: 0 to move {self.basename} to the root." if self.model.node_order_by: @@ -461,7 +462,7 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin): # onhand_status = self.queryset.annotate(onhand_status=Exists(onhand_users_set__in=[shared_users])) return self.queryset.annotate(shopping_status=Exists(shopping_status)).prefetch_related('onhand_users', 'inherit_fields').select_related('recipe', 'supermarket_category') - @ decorators.action(detail=True, methods=['PUT'], serializer_class=FoodShoppingUpdateSerializer,) + @decorators.action(detail=True, methods=['PUT'], serializer_class=FoodShoppingUpdateSerializer, ) # TODO DRF only allows one action in a decorator action without overriding get_operation_id_base() this should be PUT and DELETE probably def shopping(self, request, pk): if self.request.space.demo: @@ -540,7 +541,7 @@ class MealPlanViewSet(viewsets.ModelViewSet): """ queryset = MealPlan.objects serializer_class = MealPlanSerializer - permission_classes = [CustomIsOwner] + permission_classes = [CustomIsOwner | CustomIsShared] def get_queryset(self): queryset = self.queryset.filter(