diff --git a/cookbook/migrations/0206_shoppinglistentry_updated_at.py b/cookbook/migrations/0206_shoppinglistentry_updated_at.py new file mode 100644 index 00000000..9354e117 --- /dev/null +++ b/cookbook/migrations/0206_shoppinglistentry_updated_at.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.7 on 2023-12-30 08:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0205_alter_food_fdc_id_alter_propertytype_fdc_id'), + ] + + operations = [ + migrations.AddField( + model_name='shoppinglistentry', + name='updated_at', + field=models.DateTimeField(auto_now=True), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index c40bb41f..1d5d3758 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -1050,6 +1050,8 @@ class ShoppingListEntry(ExportModelOperationsMixin('shopping_list_entry'), model checked = models.BooleanField(default=False) created_by = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + completed_at = models.DateTimeField(null=True, blank=True) delay_until = models.DateTimeField(null=True, blank=True) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index fd42bd96..78c14c33 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -1056,7 +1056,7 @@ class ShoppingListRecipeSerializer(serializers.ModelSerializer): class Meta: model = ShoppingListRecipe - fields = ('id', 'recipe_name', 'name', 'recipe', 'mealplan', 'servings', 'mealplan_note','mealplan_from_date', 'mealplan_type') + fields = ('id', 'recipe_name', 'name', 'recipe', 'mealplan', 'servings', 'mealplan_note', 'mealplan_from_date', 'mealplan_type') read_only_fields = ('id',) @@ -1074,7 +1074,7 @@ class ShoppingListEntrySerializer(WritableNestedModelSerializer): # autosync values are only needed for frequent 'checked' value updating if self.context['request'] and bool(int(self.context['request'].query_params.get('autosync', False))): - for f in list(set(fields) - set(['id', 'checked'])): + for f in list(set(fields) - set(['id', 'checked', 'updated_at', ])): del fields[f] return fields @@ -1118,7 +1118,7 @@ class ShoppingListEntrySerializer(WritableNestedModelSerializer): fields = ( 'id', 'list_recipe', 'food', 'unit', 'ingredient', 'ingredient_note', 'amount', 'order', 'checked', 'recipe_mealplan', - 'created_by', 'created_at', 'completed_at', 'delay_until' + 'created_by', 'created_at', 'updated_at', 'completed_at', 'delay_until' ) read_only_fields = ('id', 'created_by', 'created_at',) diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 55261fff..0222fff8 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -1163,6 +1163,11 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet): if 'checked' in self.request.query_params or 'recent' in self.request.query_params: return shopping_helper(self.queryset, self.request) + last_autosync = self.request.query_params.get('last_autosync', None) + if last_autosync: + last_autosync = datetime.datetime.now() # TODO implement + self.queryset = self.queryset.filter(updated_at__gte=last_autosync) + # TODO once old shopping list is removed this needs updated to sharing users in preferences return self.queryset @@ -1174,11 +1179,13 @@ class ShoppingListViewSet(viewsets.ModelViewSet): permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope] def get_queryset(self): - return self.queryset.filter( + self.queryset = self.queryset.filter( Q(created_by=self.request.user) | Q(shared=self.request.user) | Q(created_by__in=list(self.request.user.get_shopping_share())) - ).filter(space=self.request.space).distinct() + ).filter(space=self.request.space) + + return self.queryset.distinct() def get_serializer_class(self): try: