diff --git a/cookbook/admin.py b/cookbook/admin.py index 73e86ecf5..625b2a6bc 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() + Ingredient.objects.filter(space=space).delete() + Food.objects.filter(space=space).delete() + Unit.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] 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): diff --git a/cookbook/views/telegram.py b/cookbook/views/telegram.py index 9c73ba7bd..6c98bdf08 100644 --- a/cookbook/views/telegram.py +++ b/cookbook/views/telegram.py @@ -45,21 +45,15 @@ 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, space=request.space) + return JsonResponse({'data': data['message']['text']}) except Exception: pass 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/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 }}
diff --git a/vue/src/components/Modals/LookupInput.vue b/vue/src/components/Modals/LookupInput.vue index 24dde7540..66a9863ea 100644 --- a/vue/src/components/Modals/LookupInput.vue +++ b/vue/src/components/Modals/LookupInput.vue @@ -1,6 +1,6 @@