mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2026-01-01 12:18:45 -05:00
Merge branch 'develop' into feature/copy-to-new-recipe
This commit is contained in:
26
boot.sh
26
boot.sh
@@ -1,8 +1,30 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
source venv/bin/activate
|
source venv/bin/activate
|
||||||
|
|
||||||
|
|
||||||
TANDOOR_PORT="${TANDOOR_PORT:-8080}"
|
TANDOOR_PORT="${TANDOOR_PORT:-8080}"
|
||||||
|
NGINX_CONF_FILE=/opt/recipes/nginx/conf.d/Recipes.conf
|
||||||
|
|
||||||
|
display_warning() {
|
||||||
|
echo "[WARNING]"
|
||||||
|
echo -e "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Checking configuration..."
|
||||||
|
|
||||||
|
# Nginx config file must exist if gunicorn is not active
|
||||||
|
if [ ! -f "$NGINX_CONF_FILE" ] && [ $GUNICORN_MEDIA -eq 0 ]; then
|
||||||
|
display_warning "Nginx configuration file could not be found at the default location!\nPath: ${NGINX_CONF_FILE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# SECRET_KEY must be set in .env file
|
||||||
|
if [ -z "${SECRET_KEY}" ]; then
|
||||||
|
display_warning "The environment variable 'SECRET_KEY' is not set but REQUIRED for running Tandoor!"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# POSTGRES_PASSWORD must be set in .env file
|
||||||
|
if [ -z "${POSTGRES_PASSWORD}" ]; then
|
||||||
|
display_warning "The environment variable 'POSTGRES_PASSWORD' is not set but REQUIRED for running Tandoor!"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Waiting for database to be ready..."
|
echo "Waiting for database to be ready..."
|
||||||
|
|
||||||
@@ -36,4 +58,4 @@ echo "Done"
|
|||||||
|
|
||||||
chmod -R 755 /opt/recipes/mediafiles
|
chmod -R 755 /opt/recipes/mediafiles
|
||||||
|
|
||||||
exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi
|
exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi
|
||||||
@@ -12,6 +12,7 @@ from django.contrib.auth.models import Group
|
|||||||
from django.contrib.auth.password_validation import validate_password
|
from django.contrib.auth.password_validation import validate_password
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db.models import Avg, Q, Sum
|
from django.db.models import Avg, Q, Sum
|
||||||
|
from django.db.models.functions import Lower
|
||||||
from django.http import HttpResponseRedirect, JsonResponse
|
from django.http import HttpResponseRedirect, JsonResponse
|
||||||
from django.shortcuts import get_object_or_404, redirect, render
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.urls import reverse, reverse_lazy
|
||||||
|
|||||||
@@ -210,6 +210,18 @@
|
|||||||
<b-button pill variant="primary" size="sm" class="ml-1" @click="step.file_visible = true" v-if="!step.file_visible">
|
<b-button pill variant="primary" size="sm" class="ml-1" @click="step.file_visible = true" v-if="!step.file_visible">
|
||||||
<i class="fas fa-plus-circle"></i> {{ $t("File") }}
|
<i class="fas fa-plus-circle"></i> {{ $t("File") }}
|
||||||
</b-button>
|
</b-button>
|
||||||
|
<b-button
|
||||||
|
pill
|
||||||
|
variant="primary"
|
||||||
|
size="sm"
|
||||||
|
class="ml-1"
|
||||||
|
@click="
|
||||||
|
paste_step = step.id
|
||||||
|
$bvModal.show('id_modal_paste_ingredients')
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<i class="fas fa-plus-circle"></i> {{ $t("paste_ingredients") }}
|
||||||
|
</b-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -516,6 +528,17 @@
|
|||||||
</draggable>
|
</draggable>
|
||||||
</b-modal>
|
</b-modal>
|
||||||
|
|
||||||
|
<!-- modal for pasting list of ingredients -->
|
||||||
|
<b-modal
|
||||||
|
id="id_modal_paste_ingredients"
|
||||||
|
v-bind:title="$t('ingredient_list')"
|
||||||
|
@ok="appendIngredients"
|
||||||
|
@cancel="paste_ingredients = paste_step = undefined"
|
||||||
|
@close="paste_ingredients = paste_step = undefined"
|
||||||
|
>
|
||||||
|
<b-form-textarea id="paste_ingredients" v-model="paste_ingredients" :placeholder="$t('paste_ingredients_placeholder')" rows="10"></b-form-textarea>
|
||||||
|
</b-modal>
|
||||||
|
|
||||||
<!-- form to create files on the fly -->
|
<!-- form to create files on the fly -->
|
||||||
<generic-modal-form :model="Models.USERFILE" :action="Actions.CREATE" :show="show_file_create" @finish-action="fileCreated" />
|
<generic-modal-form :model="Models.USERFILE" :action="Actions.CREATE" :show="show_file_create" @finish-action="fileCreated" />
|
||||||
</div>
|
</div>
|
||||||
@@ -574,7 +597,8 @@ export default {
|
|||||||
recipes_loading: false,
|
recipes_loading: false,
|
||||||
message: "",
|
message: "",
|
||||||
options_limit: 25,
|
options_limit: 25,
|
||||||
|
paste_ingredients: undefined,
|
||||||
|
paste_step: undefined,
|
||||||
show_file_create: false,
|
show_file_create: false,
|
||||||
step_for_file_create: undefined,
|
step_for_file_create: undefined,
|
||||||
}
|
}
|
||||||
@@ -942,6 +966,29 @@ export default {
|
|||||||
energy: function () {
|
energy: function () {
|
||||||
return energyHeading()
|
return energyHeading()
|
||||||
},
|
},
|
||||||
|
appendIngredients: function () {
|
||||||
|
let ing_list = this.paste_ingredients.split(/\r?\n/)
|
||||||
|
let step = this.recipe.steps.findIndex((x) => x.id == this.paste_step)
|
||||||
|
let order = Math.max(...this.recipe.steps[step].ingredients.map((x) => x.order), -1) + 1
|
||||||
|
this.recipe.steps[step].ingredients_visible = true
|
||||||
|
ing_list.forEach((ing) => {
|
||||||
|
if (ing.trim() !== "") {
|
||||||
|
this.genericPostAPI("api_ingredient_from_string", { text: ing }).then((result) => {
|
||||||
|
let unit = null
|
||||||
|
if (result.data.unit !== "") {
|
||||||
|
unit = { name: result.data.unit }
|
||||||
|
}
|
||||||
|
this.recipe.steps[step].ingredients.splice(order, 0, {
|
||||||
|
amount: result.data.amount,
|
||||||
|
unit: unit,
|
||||||
|
food: { name: result.data.food },
|
||||||
|
note: result.data.note,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
order++
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -207,8 +207,7 @@ export default {
|
|||||||
if (!cancel) {
|
if (!cancel) {
|
||||||
console.log("saving", { ...this.mealplan_settings, ...this.entryEditing })
|
console.log("saving", { ...this.mealplan_settings, ...this.entryEditing })
|
||||||
this.$bvModal.hide(`edit-modal`)
|
this.$bvModal.hide(`edit-modal`)
|
||||||
this.$emit("save-entry", { ...this.mealplan_settings, ...this.entryEditing })
|
this.$emit("save-entry", { ...this.mealplan_settings, ...this.entryEditing, ...{ addshopping: this.entryEditing.addshopping && !this.autoMealPlan } })
|
||||||
console.log("after emit", { ...this.mealplan_settings, ...this.entryEditing }.addshopping)
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
deleteEntry() {
|
deleteEntry() {
|
||||||
|
|||||||
@@ -298,5 +298,8 @@
|
|||||||
"review_shopping": "Review shopping entries before saving",
|
"review_shopping": "Review shopping entries before saving",
|
||||||
"view_recipe": "View Recipe",
|
"view_recipe": "View Recipe",
|
||||||
"copy_to_new": "Copy To New Recipe",
|
"copy_to_new": "Copy To New Recipe",
|
||||||
"recipe_name": "Recipe Name"
|
"recipe_name": "Recipe Name",
|
||||||
|
"paste_ingredients_placeholder": "Paste ingredient list here...",
|
||||||
|
"paste_ingredients": "Paste Ingredients",
|
||||||
|
"ingredient_list": "Ingredient List"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5369,9 +5369,9 @@ flush-write-stream@^1.0.0:
|
|||||||
readable-stream "^2.3.6"
|
readable-stream "^2.3.6"
|
||||||
|
|
||||||
follow-redirects@^1.0.0, follow-redirects@^1.14.4:
|
follow-redirects@^1.0.0, follow-redirects@^1.14.4:
|
||||||
version "1.14.7"
|
version "1.14.8"
|
||||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685"
|
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
|
||||||
integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==
|
integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
|
||||||
|
|
||||||
for-in@^1.0.2:
|
for-in@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
|
|||||||
Reference in New Issue
Block a user