diff --git a/.gitignore b/.gitignore index 2ef1c4ec6..1657d4ca1 100644 --- a/.gitignore +++ b/.gitignore @@ -87,4 +87,5 @@ vue/webpack-stats.json cookbook/templates/sw.js .prettierignore vue/.yarn +vue3/.vite vue3/node_modules diff --git a/cookbook/migrations/0214_cooklog_comment_cooklog_updated_at_and_more.py b/cookbook/migrations/0214_cooklog_comment_cooklog_updated_at_and_more.py new file mode 100644 index 000000000..fe28d646f --- /dev/null +++ b/cookbook/migrations/0214_cooklog_comment_cooklog_updated_at_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 4.2.7 on 2024-02-24 12:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0213_remove_property_property_unique_import_food_per_space_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='cooklog', + name='comment', + field=models.TextField(blank=True, null=True), + ), + migrations.AddField( + model_name='cooklog', + name='updated_at', + field=models.DateTimeField(auto_now=True), + ), + migrations.AlterField( + model_name='cooklog', + name='rating', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='cooklog', + name='servings', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index fc1a62ad1..f9c16607d 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -1293,10 +1293,13 @@ class TelegramBot(models.Model, PermissionModelMixin): class CookLog(ExportModelOperationsMixin('cook_log'), models.Model, PermissionModelMixin): recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE) + rating = models.IntegerField(null=True, blank=True) + servings = models.IntegerField(null=True, blank=True) + comment = models.TextField(null=True, blank=True) + created_by = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(default=timezone.now) - rating = models.IntegerField(null=True) - servings = models.IntegerField(default=0) + updated_at = models.DateTimeField(auto_now=True) space = models.ForeignKey(Space, on_delete=models.CASCADE) objects = ScopedManager(space='space') diff --git a/cookbook/serializer.py b/cookbook/serializer.py index c27cb8ef2..2bcd203c1 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -337,7 +337,7 @@ class UserSpaceSerializer(WritableNestedModelSerializer): class Meta: model = UserSpace fields = ( - 'id', 'user', 'space', 'groups', 'active', 'internal_note', 'invite_link', 'created_at', 'updated_at',) + 'id', 'user', 'space', 'groups', 'active', 'internal_note', 'invite_link', 'created_at', 'updated_at',) read_only_fields = ('id', 'invite_link', 'created_at', 'updated_at', 'space') @@ -772,8 +772,7 @@ class IngredientSerializer(IngredientSimpleSerializer): class StepSerializer(WritableNestedModelSerializer, ExtendedRecipeMixin): ingredients = IngredientSerializer(many=True) - ingredients_markdown = serializers.SerializerMethodField('get_ingredients_markdown') - ingredients_vue = serializers.SerializerMethodField('get_ingredients_vue') + instructions_markdown = serializers.SerializerMethodField('get_instructions_markdown') file = UserFileViewSerializer(allow_null=True, required=False) step_recipe_data = serializers.SerializerMethodField('get_step_recipe_data') recipe_filter = 'steps' @@ -782,10 +781,7 @@ class StepSerializer(WritableNestedModelSerializer, ExtendedRecipeMixin): validated_data['space'] = self.context['request'].space return super().create(validated_data) - def get_ingredients_vue(self, obj): - return obj.get_instruction_render() - - def get_ingredients_markdown(self, obj): + def get_instructions_markdown(self, obj): return obj.get_instruction_render() def get_step_recipes(self, obj): @@ -800,8 +796,8 @@ class StepSerializer(WritableNestedModelSerializer, ExtendedRecipeMixin): class Meta: model = Step fields = ( - 'id', 'name', 'instruction', 'ingredients', 'ingredients_markdown', - 'ingredients_vue', 'time', 'order', 'show_as_header', 'file', 'step_recipe', + 'id', 'name', 'instruction', 'ingredients', 'instructions_markdown', + 'time', 'order', 'show_as_header', 'file', 'step_recipe', 'step_recipe_data', 'numrecipe', 'show_ingredients_table' ) @@ -846,7 +842,7 @@ class UnitConversionSerializer(WritableNestedModelSerializer, OpenDataModelMixin class Meta: model = UnitConversion fields = ( - 'id', 'name', 'base_amount', 'base_unit', 'converted_amount', 'converted_unit', 'food', 'open_data_slug') + 'id', 'name', 'base_amount', 'base_unit', 'converted_amount', 'converted_unit', 'food', 'open_data_slug') class NutritionInformationSerializer(serializers.ModelSerializer): @@ -873,6 +869,13 @@ class RecipeBaseSerializer(WritableNestedModelSerializer): return False +class CommentSerializer(serializers.ModelSerializer): + class Meta: + model = Comment + fields = '__all__' + read_only_fields = ['id', 'created_at', 'created_by', 'updated_at', ] + + class RecipeOverviewSerializer(RecipeBaseSerializer): keywords = KeywordLabelSerializer(many=True) new = serializers.SerializerMethodField('is_recipe_new') @@ -950,12 +953,6 @@ class RecipeImportSerializer(SpacedModelSerializer): fields = '__all__' -class CommentSerializer(serializers.ModelSerializer): - class Meta: - model = Comment - fields = '__all__' - - class CustomFilterSerializer(SpacedModelSerializer, WritableNestedModelSerializer): shared = UserSerializer(many=True, required=False) @@ -1150,7 +1147,7 @@ class ShoppingListEntrySerializer(WritableNestedModelSerializer): 'recipe_mealplan', 'created_by', 'created_at', 'updated_at', 'completed_at', 'delay_until' ) - read_only_fields = ('id', 'created_by', 'created_at','updated_at',) + read_only_fields = ('id', 'created_by', 'created_at', 'updated_at',) class ShoppingListEntryBulkSerializer(serializers.Serializer): @@ -1203,6 +1200,8 @@ class ShareLinkSerializer(SpacedModelSerializer): class CookLogSerializer(serializers.ModelSerializer): + created_by = UserSerializer(read_only=True) + def create(self, validated_data): validated_data['created_by'] = self.context['request'].user validated_data['space'] = self.context['request'].space @@ -1210,7 +1209,7 @@ class CookLogSerializer(serializers.ModelSerializer): class Meta: model = CookLog - fields = ('id', 'recipe', 'servings', 'rating', 'created_by', 'created_at') + fields = ('id', 'recipe', 'servings', 'rating', 'comment', 'created_by', 'created_at', 'updated_at') read_only_fields = ('id', 'created_by') diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 710a8e375..50e1b77fb 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -1270,8 +1270,13 @@ class CookLogViewSet(viewsets.ModelViewSet): serializer_class = CookLogSerializer permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope] pagination_class = DefaultPagination + query_params = [ + QueryParam(name='recipe', description=_('Filter for entries with the given recipe'), qtype='integer'), + ] def get_queryset(self): + if self.request.query_params.get('recipe', None): + self.queryset = self.queryset.filter(recipe=self.request.query_params.get('recipe')) return self.queryset.filter(space=self.request.space) diff --git a/vue/src/components/StepComponent.vue b/vue/src/components/StepComponent.vue index 9585a3a76..3d25335e1 100644 --- a/vue/src/components/StepComponent.vue +++ b/vue/src/components/StepComponent.vue @@ -44,7 +44,7 @@