diff --git a/cookbook/serializer.py b/cookbook/serializer.py index e4e96b964..8244c2472 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -1,9 +1,15 @@ from rest_framework import serializers -from cookbook.models import MealPlan +from cookbook.models import MealPlan, MealType class MealPlanSerializer(serializers.ModelSerializer): class Meta: model = MealPlan - fields = ['recipe', 'title', 'note', 'meal_type'] + fields = '__all__' + + +class MealTypeSerializer(serializers.ModelSerializer): + class Meta: + model = MealType + fields = '__all__' diff --git a/cookbook/static/js/vue-draggable.min.js b/cookbook/static/js/vue-draggable.min.js new file mode 100644 index 000000000..91dc71a6d --- /dev/null +++ b/cookbook/static/js/vue-draggable.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("VueDraggable",[],e):"object"==typeof exports?exports.VueDraggable=e():t.VueDraggable=e()}(this,(function(){return function(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(i,n,function(e){return t[e]}.bind(null,n));return i},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){"use strict";r.r(e);var i=function(t,e){return t.querySelectorAll(e)},n=function(t,e){return t.querySelectorAll(e)},s=function(t){this.targets=i(t,this.defaultOptions.dropzoneSelector),this.items=n(t,this.defaultOptions.draggableSelector);for(var e=0;e=0?this.selections.items:[].concat(f(this.selections.items),[t]))},h=function(t){t.setAttribute("aria-grabbed","false");for(var e=0;er.offsetTop&&t.offsetTop<=e.offsetTop&&t.offsetTop>=r.offsetTop||t.offsetTop>=e.offsetTop&&t.offsetTop<=r.offsetTop)},D=function(t){var e=t.target.closest(this.defaultOptions.draggableSelector);if(e&&e.getAttribute("draggable"))if(u(t))if(this.selections.items.length&&t.shiftKey){var r=this.selections.items.slice(-1).pop();if(this.items&&this.items.length>0)for(var i=0;i0)for(var r=0;r=0}));(e=this.value).splice.apply(e,[t.detail.index,0].concat(J(i))),this.$emit("change",this.groups)},removed:function(t){var e=this.value.filter((function(e){return t.detail.ids.map(Number).indexOf(e.id)<0}));this.$emit("input",e)},reordered:function(t,e){var r=this.value.filter((function(e){return t.detail.ids.map(Number).indexOf(e.id)>=0})),i=this.value.filter((function(e){return t.detail.ids.map(Number).indexOf(e.id)<0}));i.splice.apply(i,[t.detail.index,0].concat(J(r))),this.$emit("input",i),this.$emit("change",this.groups)},addListeners:function(){var t=this;Q.forEach((function(e){return t.$el.addEventListener(e,t[e])}))},removeListeners:function(){var t=this;Q.forEach((function(e){return t.$el.removeEventListener(e,t[e])}))}},mounted:function(){this.addListeners()},beforeDestroy:function(){this.removeListeners()}};r.d(e,"VueDraggableDirective",(function(){return Y}));var X=[],Y={bind:function(t,e,r){var i=new H(t,r.context,e.value);X.push(i)},componentUpdated:function(t){setTimeout((function(){X.forEach((function(e){e.el===t&&e.update(t)}))}))},unbind:function(t){X=X.filter((function(e){return e.el!==t}))}};H.install=function(t){t.directive("drag-and-drop",Y),t.component("vue-draggable-group",W)};e.default=H}])})); +//# sourceMappingURL=vue-draggable.min.js.map \ No newline at end of file diff --git a/cookbook/templates/meal_plan.html b/cookbook/templates/meal_plan.html index a22e9b149..004b34916 100644 --- a/cookbook/templates/meal_plan.html +++ b/cookbook/templates/meal_plan.html @@ -9,6 +9,12 @@ + + + + + + {% endblock %} {% block content %} @@ -37,24 +43,78 @@
+ + + + + + + + + + + +
[[d]]
[[t]]
[[plan_entries]] + +
+ + {% endblock %} \ No newline at end of file diff --git a/cookbook/urls.py b/cookbook/urls.py index 33ec44ddb..d150876a7 100644 --- a/cookbook/urls.py +++ b/cookbook/urls.py @@ -9,6 +9,7 @@ from cookbook.helper import dal router = routers.DefaultRouter() router.register(r'meal-plan', api.MealPlanViewSet) +router.register(r'meal-type', api.MealTypeViewSet) urlpatterns = [ path('', views.index, name='index'), diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 45d393d24..0982d1714 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -9,10 +9,10 @@ from django.utils.translation import gettext as _ from rest_framework import viewsets, permissions from cookbook.helper.permission_helper import group_required -from cookbook.models import Recipe, Sync, Storage, CookLog, MealPlan +from cookbook.models import Recipe, Sync, Storage, CookLog, MealPlan, MealType from cookbook.provider.dropbox import Dropbox from cookbook.provider.nextcloud import Nextcloud -from cookbook.serializer import MealPlanSerializer +from cookbook.serializer import MealPlanSerializer, MealTypeSerializer class MealPlanViewSet(viewsets.ModelViewSet): @@ -28,6 +28,12 @@ class MealPlanViewSet(viewsets.ModelViewSet): return queryset +class MealTypeViewSet(viewsets.ModelViewSet): + queryset = MealType.objects.all() + serializer_class = MealTypeSerializer + permission_classes = [permissions.IsAuthenticated] + + def get_recipe_provider(recipe): if recipe.storage.method == Storage.DROPBOX: return Dropbox