From 5724ef951132379e6326122f3637957cdf2d8fef Mon Sep 17 00:00:00 2001 From: smilerz Date: Mon, 17 Jan 2022 14:02:58 -0600 Subject: [PATCH 01/10] fix boolean directive --- vue/src/components/GenericHorizontalCard.vue | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/vue/src/components/GenericHorizontalCard.vue b/vue/src/components/GenericHorizontalCard.vue index 8f130b474..b12cf6a08 100644 --- a/vue/src/components/GenericHorizontalCard.vue +++ b/vue/src/components/GenericHorizontalCard.vue @@ -8,12 +8,12 @@ :class="{ 'border border-primary': over, shake: isError }" :style="{ 'cursor:grab': useDrag }" :draggable="useDrag" - @[useDrag&&`dragover`].prevent - @[useDrag&&`dragenter`].prevent - @[useDrag&&`dragstart`]="handleDragStart($event)" - @[useDrag&&`dragenter`]="handleDragEnter($event)" - @[useDrag&&`dragleave`]="handleDragLeave($event)" - @[useDrag&&`drop`]="handleDragDrop($event)" + @[useDrag&&`dragover`||``].prevent + @[useDrag&&`dragenter`||``].prevent + @[useDrag&&`dragstart`||``]="handleDragStart($event)" + @[useDrag&&`dragenter`||``]="handleDragEnter($event)" + @[useDrag&&`dragleave`||``]="handleDragLeave($event)" + @[useDrag&&`drop`||``]="handleDragDrop($event)" > @@ -27,6 +27,7 @@
{{ getFullname }}
+ +
{{ item[child_count] }} {{ itemName }}
From c8c29e1b5a7db269c486a9fc9d6ec5cbf29b8e58 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 21:14:22 +0100 Subject: [PATCH 02/10] fixed performance issue --- cookbook/helper/recipe_search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cookbook/helper/recipe_search.py b/cookbook/helper/recipe_search.py index 2e46bd77d..35581b59b 100644 --- a/cookbook/helper/recipe_search.py +++ b/cookbook/helper/recipe_search.py @@ -647,7 +647,7 @@ class RecipeFacet(): depth = getattr(keyword, 'depth', 0) + 1 steplen = depth * Keyword.steplen - return queryset.annotate(count=Coalesce(Subquery(self._recipe_count_queryset('keywords', depth, steplen)), 0) + return queryset.annotate(count=Coalesce(1, 0) ).filter(depth=depth, count__gt=0 ).values('id', 'name', 'count', 'numchild').order_by('name') @@ -655,7 +655,7 @@ class RecipeFacet(): depth = getattr(food, 'depth', 0) + 1 steplen = depth * Food.steplen - return queryset.annotate(count=Coalesce(Subquery(self._recipe_count_queryset('steps__ingredients__food', depth, steplen)), 0) + return queryset.annotate(count=Coalesce(1, 0) ).filter(depth__lte=depth, count__gt=0 ).values('id', 'name', 'count', 'numchild').order_by('name') From b9065f7052188bbbd24930008a7df4cc157ba6ef Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 22:03:57 +0100 Subject: [PATCH 03/10] added space deletion feature --- cookbook/admin.py | 49 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/cookbook/admin.py b/cookbook/admin.py index 73e86ecf5..a252185f5 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -15,7 +15,7 @@ from .models import (BookmarkletImport, Comment, CookLog, Food, FoodInheritField Recipe, RecipeBook, RecipeBookEntry, RecipeImport, SearchPreference, ShareLink, ShoppingList, ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage, Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, - TelegramBot, Unit, UserFile, UserPreference, ViewLog) + TelegramBot, Unit, UserFile, UserPreference, ViewLog, Automation) class CustomUserAdmin(UserAdmin): @@ -29,11 +29,52 @@ admin.site.register(User, CustomUserAdmin) admin.site.unregister(Group) +@admin.action(description='Delete all data from a space') +def delete_space_action(modeladmin, request, queryset): + for space in queryset: + CookLog.objects.filter(space=space).delete() + ViewLog.objects.filter(space=space).delete() + ImportLog.objects.filter(space=space).delete() + BookmarkletImport.objects.filter(space=space).delete() + + Comment.objects.filter(recipe__space=space).delete() + Keyword.objects.filter(space=space).delete() + Food.objects.filter(space=space).delete() + Unit.objects.filter(space=space).delete() + Ingredient.objects.filter(space=space).delete() + Step.objects.filter(space=space).delete() + NutritionInformation.objects.filter(space=space).delete() + RecipeBookEntry.objects.filter(book__space=space).delete() + RecipeBook.objects.filter(space=space).delete() + MealType.objects.filter(space=space).delete() + MealPlan.objects.filter(space=space).delete() + ShareLink.objects.filter(space=space).delete() + Recipe.objects.filter(space=space).delete() + + RecipeImport.objects.filter(space=space).delete() + SyncLog.objects.filter(sync__space=space).delete() + Sync.objects.filter(space=space).delete() + Storage.objects.filter(space=space).delete() + + ShoppingListEntry.objects.filter(shoppinglist__space=space).delete() + ShoppingListRecipe.objects.filter(shoppinglist__space=space).delete() + ShoppingList.objects.filter(space=space).delete() + + SupermarketCategoryRelation.objects.filter(supermarket__space=space).delete() + SupermarketCategory.objects.filter(space=space).delete() + Supermarket.objects.filter(space=space).delete() + + InviteLink.objects.filter(space=space).delete() + UserFile.objects.filter(space=space).delete() + Automation.objects.filter(space=space).delete() + + class SpaceAdmin(admin.ModelAdmin): list_display = ('name', 'created_by', 'max_recipes', 'max_users', 'max_file_storage_mb', 'allow_sharing') search_fields = ('name', 'created_by__username') list_filter = ('max_recipes', 'max_users', 'max_file_storage_mb', 'allow_sharing') date_hierarchy = 'created_at' + actions = [delete_space_action] admin.site.register(Space, SpaceAdmin) @@ -128,7 +169,7 @@ def sort_tree(modeladmin, request, queryset): class KeywordAdmin(TreeAdmin): form = movenodeform_factory(Keyword) ordering = ('space', 'path',) - search_fields = ('name', ) + search_fields = ('name',) actions = [sort_tree, enable_tree_sorting, disable_tree_sorting] @@ -171,13 +212,15 @@ class RecipeAdmin(admin.ModelAdmin): admin.site.register(Recipe, RecipeAdmin) admin.site.register(Unit) + + # admin.site.register(FoodInheritField) class FoodAdmin(TreeAdmin): form = movenodeform_factory(Keyword) ordering = ('space', 'path',) - search_fields = ('name', ) + search_fields = ('name',) actions = [sort_tree, enable_tree_sorting, disable_tree_sorting] From d04e9518cbb77c5fcc1d7d9bd225ea82f4e5001c Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 22:13:36 +0100 Subject: [PATCH 04/10] fixed telegram shopping bot --- cookbook/views/telegram.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/cookbook/views/telegram.py b/cookbook/views/telegram.py index 9c73ba7bd..d816bc92b 100644 --- a/cookbook/views/telegram.py +++ b/cookbook/views/telegram.py @@ -45,21 +45,17 @@ def hook(request, token): tb.save() if tb.chat_id == str(data['message']['chat']['id']): - sl = ShoppingList.objects.filter(Q(created_by=tb.created_by)).filter(finished=False, space=tb.space).order_by('-created_at').first() - if not sl: - sl = ShoppingList.objects.create(created_by=tb.created_by, space=tb.space) - request.space = tb.space # TODO this is likely a bad idea. Verify and test request.user = tb.created_by ingredient_parser = IngredientParser(request, False) amount, unit, ingredient, note = ingredient_parser.parse(data['message']['text']) f = ingredient_parser.get_food(ingredient) u = ingredient_parser.get_unit(unit) - sl.entries.add( - ShoppingListEntry.objects.create( - food=f, unit=u, amount=amount - ) + + ShoppingListEntry.objects.create( + food=f, unit=u, amount=amount, created_by=request.user ) + return JsonResponse({'data': data['message']['text']}) except Exception: pass From c27933548d23372653a92a69df463bd405a1686f Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 22:28:02 +0100 Subject: [PATCH 05/10] fixed order of delete --- cookbook/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cookbook/admin.py b/cookbook/admin.py index a252185f5..625b2a6bc 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -39,9 +39,9 @@ def delete_space_action(modeladmin, request, queryset): Comment.objects.filter(recipe__space=space).delete() Keyword.objects.filter(space=space).delete() + Ingredient.objects.filter(space=space).delete() Food.objects.filter(space=space).delete() Unit.objects.filter(space=space).delete() - Ingredient.objects.filter(space=space).delete() Step.objects.filter(space=space).delete() NutritionInformation.objects.filter(space=space).delete() RecipeBookEntry.objects.filter(book__space=space).delete() From 54721a0a62315bc656fe89011e74376ff6da7611 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 22:37:14 +0100 Subject: [PATCH 06/10] also added space to bot --- cookbook/views/telegram.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cookbook/views/telegram.py b/cookbook/views/telegram.py index d816bc92b..6c98bdf08 100644 --- a/cookbook/views/telegram.py +++ b/cookbook/views/telegram.py @@ -52,9 +52,7 @@ def hook(request, token): f = ingredient_parser.get_food(ingredient) u = ingredient_parser.get_unit(unit) - ShoppingListEntry.objects.create( - food=f, unit=u, amount=amount, created_by=request.user - ) + ShoppingListEntry.objects.create(food=f, unit=u, amount=amount, created_by=request.user, space=request.space) return JsonResponse({'data': data['message']['text']}) except Exception: From 532d32c194d9fa3ef4b39c79d95379e48a40fe8c Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 22:41:38 +0100 Subject: [PATCH 07/10] fixed shopping user save setting would not work --- cookbook/serializer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index ce8d48de9..3584138c2 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -165,9 +165,10 @@ class FoodInheritFieldSerializer(WritableNestedModelSerializer): read_only_fields = ['id'] -class UserPreferenceSerializer(serializers.ModelSerializer): +class UserPreferenceSerializer(WritableNestedModelSerializer): food_inherit_default = FoodInheritFieldSerializer(source='space.food_inherit', many=True, allow_null=True, required=False, read_only=True) plan_share = UserNameSerializer(many=True, allow_null=True, required=False, read_only=True) + shopping_share = UserNameSerializer(many=True, allow_null=True, required=False) def create(self, validated_data): if not validated_data.get('user', None): From c60141940d658352aa102b5e6412eecf71ae65db Mon Sep 17 00:00:00 2001 From: Kaibu Date: Mon, 17 Jan 2022 23:02:42 +0100 Subject: [PATCH 08/10] shopping list ux improvements --- .../ShoppingListView/ShoppingListView.vue | 2437 +++++++++-------- vue/src/components/Modals/LookupInput.vue | 319 +-- vue/src/components/ShoppingLineItem.vue | 581 ++-- 3 files changed, 1739 insertions(+), 1598 deletions(-) diff --git a/vue/src/apps/ShoppingListView/ShoppingListView.vue b/vue/src/apps/ShoppingListView/ShoppingListView.vue index f26fb7d1d..64fa073d2 100644 --- a/vue/src/apps/ShoppingListView/ShoppingListView.vue +++ b/vue/src/apps/ShoppingListView/ShoppingListView.vue @@ -1,147 +1,184 @@ @@ -1241,26 +1294,54 @@ export default { diff --git a/vue/src/components/Modals/LookupInput.vue b/vue/src/components/Modals/LookupInput.vue index 24dde7540..90ca7f3fe 100644 --- a/vue/src/components/Modals/LookupInput.vue +++ b/vue/src/components/Modals/LookupInput.vue @@ -1,172 +1,173 @@ diff --git a/vue/src/components/ShoppingLineItem.vue b/vue/src/components/ShoppingLineItem.vue index 970556151..a72f20f09 100644 --- a/vue/src/components/ShoppingLineItem.vue +++ b/vue/src/components/ShoppingLineItem.vue @@ -1,287 +1,322 @@ @@ -296,4 +331,28 @@ export default { /* left: 0; top: 50%; width: 100%; /* …with the top across the middle */ /* border-bottom: 1px solid #000; /* …and with a border on the top */ /* } */ +.checkbox-control { + font-size: 0.6rem +} + +.checkbox-control-mobile { + font-size: 1rem +} + +.rotate { + -moz-transition: all 0.25s linear; + -webkit-transition: all 0.25s linear; + transition: all 0.25s linear; +} + +.rotated { + -moz-transform: rotate(90deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} + +.unit-badge-lg { + font-size: 1rem !important; + font-weight: 500 !important; +} From d8d76ae9e0863cf11842871cf5c35759fc2ba7fb Mon Sep 17 00:00:00 2001 From: smilerz Date: Mon, 17 Jan 2022 16:12:54 -0600 Subject: [PATCH 09/10] fix missing label supermarket category --- vue/src/components/Modals/LookupInput.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue/src/components/Modals/LookupInput.vue b/vue/src/components/Modals/LookupInput.vue index 24dde7540..5d6dd7c78 100644 --- a/vue/src/components/Modals/LookupInput.vue +++ b/vue/src/components/Modals/LookupInput.vue @@ -82,7 +82,7 @@ export default { } else { arrayValues = [{ id: -1, name: this_value }] } - if (this.form?.ordered && this.first_run && arrayValues.length > 0) { + if (this.form?.ordered && this.first_run) { return this.flattenItems(arrayValues) } else { return arrayValues From ef4ce62f5b4daf6fc1449cc9a49d0e0ee7e967c8 Mon Sep 17 00:00:00 2001 From: Kaibu Date: Mon, 17 Jan 2022 23:48:57 +0100 Subject: [PATCH 10/10] custom class selection for lookupinput comp --- vue/src/components/Modals/LookupInput.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vue/src/components/Modals/LookupInput.vue b/vue/src/components/Modals/LookupInput.vue index 5d6dd7c78..66a9863ea 100644 --- a/vue/src/components/Modals/LookupInput.vue +++ b/vue/src/components/Modals/LookupInput.vue @@ -1,6 +1,6 @@