merged PR 474 adding manual json import
This commit is contained in:
parent
3c1b6a5f3a
commit
48c90c483a
@ -84,6 +84,7 @@ def find_recipe_json(ld_json, url, space):
|
|||||||
|
|
||||||
for x in ld_json['recipeIngredient']:
|
for x in ld_json['recipeIngredient']:
|
||||||
if x.replace(' ', '') != '':
|
if x.replace(' ', '') != '':
|
||||||
|
x = x.replace('½', "0.5").replace('¼', "0.25").replace('¾', "0.75")
|
||||||
try:
|
try:
|
||||||
amount, unit, ingredient, note = parse_ingredient(x)
|
amount, unit, ingredient, note = parse_ingredient(x)
|
||||||
if ingredient:
|
if ingredient:
|
||||||
|
@ -30,6 +30,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input class="form-control" v-model="json_data" placeholder="{% trans 'Enter json directly' %}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button @click="loadRecipeJson()" class="btn btn-primary shadow-none" type="button"
|
||||||
|
id="id_btn_search"><i class="fas fa-search"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div v-if="loading" class="text-center">
|
<div v-if="loading" class="text-center">
|
||||||
@ -322,6 +335,21 @@
|
|||||||
this.makeToast(gettext('Error'), gettext('There was an error loading a resource!') + err.bodyText, 'danger')
|
this.makeToast(gettext('Error'), gettext('There was an error loading a resource!') + err.bodyText, 'danger')
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
loadRecipeJson: function () {
|
||||||
|
this.recipe_data = undefined
|
||||||
|
this.error = undefined
|
||||||
|
this.loading = true
|
||||||
|
this.$http.post("{% url 'api_recipe_from_json' %}", {'json': this.json_data}, {emulateJSON: true}).then((response) => {
|
||||||
|
console.log(response.data)
|
||||||
|
this.recipe_data = response.data;
|
||||||
|
this.loading = false
|
||||||
|
}).catch((err) => {
|
||||||
|
this.error = err.data
|
||||||
|
this.loading = false
|
||||||
|
console.log(err)
|
||||||
|
this.makeToast(gettext('Error'), gettext('There was an error loading a resource!') + err.bodyText, 'danger')
|
||||||
|
})
|
||||||
|
},
|
||||||
importRecipe: function () {
|
importRecipe: function () {
|
||||||
if (this.importing_recipe) {
|
if (this.importing_recipe) {
|
||||||
this.makeToast(gettext('Error'), gettext('Already importing the selected recipe, please wait!'), 'danger')
|
this.makeToast(gettext('Error'), gettext('Already importing the selected recipe, please wait!'), 'danger')
|
||||||
@ -361,7 +389,7 @@
|
|||||||
this.recipe_data.recipeIngredient[index] = new_unit
|
this.recipe_data.recipeIngredient[index] = new_unit
|
||||||
},
|
},
|
||||||
addKeyword: function (tag) {
|
addKeyword: function (tag) {
|
||||||
let new_keyword = {'text':tag,'id':null}
|
let new_keyword = {'text': tag, 'id': null}
|
||||||
this.recipe_data.keywords.push(new_keyword)
|
this.recipe_data.keywords.push(new_keyword)
|
||||||
},
|
},
|
||||||
openUnitSelect: function (id) {
|
openUnitSelect: function (id) {
|
||||||
|
@ -91,6 +91,7 @@ urlpatterns = [
|
|||||||
path('api/log_cooking/<int:recipe_id>/', api.log_cooking, name='api_log_cooking'),
|
path('api/log_cooking/<int:recipe_id>/', api.log_cooking, name='api_log_cooking'),
|
||||||
path('api/plan-ical/<slug:from_date>/<slug:to_date>/', api.get_plan_ical, name='api_get_plan_ical'),
|
path('api/plan-ical/<slug:from_date>/<slug:to_date>/', api.get_plan_ical, name='api_get_plan_ical'),
|
||||||
path('api/recipe-from-url/', api.recipe_from_url, name='api_recipe_from_url'),
|
path('api/recipe-from-url/', api.recipe_from_url, name='api_recipe_from_url'),
|
||||||
|
path('api/recipe-from-json/', api.recipe_from_json, name='api_recipe_from_json'),
|
||||||
path('api/ingredient-from-string/', api.ingredient_from_string, name='api_ingredient_from_string'),
|
path('api/ingredient-from-string/', api.ingredient_from_string, name='api_ingredient_from_string'),
|
||||||
|
|
||||||
path('dal/keyword/', dal.KeywordAutocomplete.as_view(), name='dal_keyword'),
|
path('dal/keyword/', dal.KeywordAutocomplete.as_view(), name='dal_keyword'),
|
||||||
|
@ -27,7 +27,7 @@ from cookbook.helper.permission_helper import (CustomIsAdmin, CustomIsGuest,
|
|||||||
CustomIsOwner, CustomIsShare,
|
CustomIsOwner, CustomIsShare,
|
||||||
CustomIsShared, CustomIsUser,
|
CustomIsShared, CustomIsUser,
|
||||||
group_required)
|
group_required)
|
||||||
from cookbook.helper.recipe_url_import import get_from_html
|
from cookbook.helper.recipe_url_import import get_from_html, find_recipe_json
|
||||||
from cookbook.models import (CookLog, Food, Ingredient, Keyword, MealPlan,
|
from cookbook.models import (CookLog, Food, Ingredient, Keyword, MealPlan,
|
||||||
MealType, Recipe, RecipeBook, ShoppingList,
|
MealType, Recipe, RecipeBook, ShoppingList,
|
||||||
ShoppingListEntry, ShoppingListRecipe, Step,
|
ShoppingListEntry, ShoppingListRecipe, Step,
|
||||||
@ -337,7 +337,7 @@ class RecipeViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
|||||||
class ShoppingListRecipeViewSet(viewsets.ModelViewSet):
|
class ShoppingListRecipeViewSet(viewsets.ModelViewSet):
|
||||||
queryset = ShoppingListRecipe.objects
|
queryset = ShoppingListRecipe.objects
|
||||||
serializer_class = ShoppingListRecipeSerializer
|
serializer_class = ShoppingListRecipeSerializer
|
||||||
permission_classes = [CustomIsOwner| CustomIsShared ]
|
permission_classes = [CustomIsOwner | CustomIsShared]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return self.queryset.filter(Q(shoppinglist__created_by=self.request.user) | Q(shoppinglist__shared=self.request.user)).filter(shoppinglist__space=self.request.space).all()
|
return self.queryset.filter(Q(shoppinglist__created_by=self.request.user) | Q(shoppinglist__shared=self.request.user)).filter(shoppinglist__space=self.request.space).all()
|
||||||
@ -546,6 +546,23 @@ def recipe_from_url(request):
|
|||||||
return get_from_html(response.text, url, request.space)
|
return get_from_html(response.text, url, request.space)
|
||||||
|
|
||||||
|
|
||||||
|
@group_required('user')
|
||||||
|
def recipe_from_json(request):
|
||||||
|
mjson = request.POST['json']
|
||||||
|
|
||||||
|
md_json = json.loads(mjson)
|
||||||
|
if ('@type' in md_json
|
||||||
|
and md_json['@type'] == 'Recipe'):
|
||||||
|
return JsonResponse(find_recipe_json(md_json, '', request.space))
|
||||||
|
return JsonResponse(
|
||||||
|
{
|
||||||
|
'error': True,
|
||||||
|
'msg': _('Could not parse correctly...')
|
||||||
|
},
|
||||||
|
status=400
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@group_required('user')
|
@group_required('user')
|
||||||
def ingredient_from_string(request):
|
def ingredient_from_string(request):
|
||||||
text = request.POST['text']
|
text = request.POST['text']
|
||||||
|
Loading…
Reference in New Issue
Block a user