Merge branch 'develop' into feature/vue3

# Conflicts:
#	cookbook/urls.py
This commit is contained in:
vabene1111
2024-03-09 14:34:44 +01:00
16 changed files with 665 additions and 23 deletions

View File

@@ -76,4 +76,11 @@ echo "Done"
chmod -R 755 /opt/recipes/mediafiles
exec gunicorn -b "[::]:$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
ipv6_disable=$(cat /sys/module/ipv6/parameters/disable)
# Check if IPv6 is enabled, only then run gunicorn with ipv6 support
if [ "$ipv6_disable" -eq 0 ]; then
exec gunicorn -b "[::]:$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
else
exec gunicorn -b ":$TANDOOR_PORT" --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level $GUNICORN_LOG_LEVEL recipes.wsgi
fi

View File

@@ -6,6 +6,8 @@ from cookbook.models import (Food, FoodProperty, Property, PropertyType, Superma
SupermarketCategory, SupermarketCategoryRelation, Unit, UnitConversion)
import re
from recipes.settings import DEBUG
class OpenDataImportResponse:
total_created = 0
@@ -367,12 +369,28 @@ class OpenDataImporter:
create_list.append({'data': obj_dict})
if self.update_existing and len(update_list) > 0:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
try:
model_type.objects.bulk_update(update_list, field_list)
od_response.total_updated += len(update_list)
except Exception:
if DEBUG:
print('========= LOAD FOOD FAILED ============')
print(update_list)
print(existing_data_names)
print(existing_data_slugs)
traceback.print_exc()
if len(create_list) > 0:
Food.load_bulk(create_list, None)
od_response.total_created += len(create_list)
try:
Food.load_bulk(create_list, None)
od_response.total_created += len(create_list)
except Exception:
if DEBUG:
print('========= LOAD FOOD FAILED ============')
print(create_list)
print(existing_data_names)
print(existing_data_slugs)
traceback.print_exc()
# --------------- PROPERTY STUFF -----------------------
model_type = Property

View File

@@ -13,8 +13,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-18 14:28+0200\n"
"PO-Revision-Date: 2023-07-06 21:19+0000\n"
"Last-Translator: Rubens <rubenixnagios@gmail.com>\n"
"PO-Revision-Date: 2024-03-08 23:19+0000\n"
"Last-Translator: Enric Bergadà <enric@bergada.cat>\n"
"Language-Team: Catalan <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/ca/>\n"
"Language: ca\n"
@@ -567,11 +567,11 @@ msgstr "No s'ha pogut analitzar el codi de la plantilla."
#: .\cookbook\integration\copymethat.py:44
#: .\cookbook\integration\melarecipes.py:37
msgid "Favorite"
msgstr ""
msgstr "Preferit"
#: .\cookbook\integration\copymethat.py:50
msgid "I made this"
msgstr ""
msgstr "Ho he fet jo"
#: .\cookbook\integration\integration.py:218
msgid ""

View File

@@ -14,7 +14,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-05-18 14:28+0200\n"
"PO-Revision-Date: 2024-03-03 23:19+0000\n"
"PO-Revision-Date: 2024-03-05 22:19+0000\n"
"Last-Translator: Jocelin Lebreton <jocelin.lebreton@gmail.com>\n"
"Language-Team: French <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/fr/>\n"
@@ -2128,7 +2128,7 @@ msgstr "Se connecter via %(provider)s"
#, python-format
msgid "You are about to sign in using a third party account from %(provider)s."
msgstr ""
"ous êtes sur le point de vous connecter en utilisant un compte tiers depuis "
"Vous êtes sur le point de vous connecter en utilisant un compte tiers depuis "
"%(provider)s."
#: .\cookbook\templates\socialaccount\login.html:20

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.10 on 2024-03-09 06:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cookbook', '0216_delete_shoppinglist'),
]
operations = [
migrations.AlterField(
model_name='userpreference',
name='default_page',
field=models.CharField(choices=[('SEARCH', 'Search'), ('PLAN', 'Meal-Plan'), ('BOOKS', 'Books'), ('SHOPPING', 'Shopping')], default='SEARCH', max_length=64),
),
]

View File

@@ -449,11 +449,13 @@ class UserPreference(models.Model, PermissionModelMixin):
SEARCH = 'SEARCH'
PLAN = 'PLAN'
BOOKS = 'BOOKS'
SHOPPING = 'SHOPPING'
PAGES = (
(SEARCH, _('Search')),
(PLAN, _('Meal-Plan')),
(BOOKS, _('Books')),
(SHOPPING, _('Shopping')),
)
user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True)

View File

@@ -16,7 +16,7 @@ from .models import (Automation, Comment, CustomFilter, Food, InviteLink, Keywor
from .views import api, data, delete, edit, import_export, lists, new, telegram, views
from .views.api import CustomAuthToken, ImportOpenData
import datetime
# extend DRF default router class to allow including additional routers
class DefaultRouter(routers.DefaultRouter):
@@ -122,9 +122,9 @@ urlpatterns = [
path('api/get_recipe_file/<int:recipe_id>/', api.get_recipe_file, name='api_get_recipe_file'),
path('api/sync_all/', api.sync_all, name='api_sync'),
path('api/log_cooking/<int:recipe_id>/', api.log_cooking, name='api_log_cooking'),
path('api/plan-ical/', api.get_plan_ical, name='api_get_plan_ical_future'),
path('api/plan-ical/<slug:from_date>/', api.get_plan_ical, name='api_get_plan_ical_from'),
path('api/plan-ical/<slug:from_date>/<slug:to_date>/', api.get_plan_ical, name='api_get_plan_ical'),
path('api/plan-ical/', api.get_plan_ical, kwargs={'from_date': datetime.date.today(), 'to_date': None}, name='api_get_plan_ical_future'),
path('api/recipe-from-source/', api.RecipeUrlImportView.as_view(), name='api_recipe_from_source'),
path('api/backup/', api.get_backup, name='api_backup'),
path('api/ingredient-from-string/', api.ingredient_from_string, name='api_ingredient_from_string'),

View File

@@ -38,7 +38,7 @@ def index(request):
return HttpResponseRedirect(reverse_lazy('view_search'))
try:
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'), }
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'), UserPreference.SHOPPING: reverse_lazy('view_shopping'),}
return HttpResponseRedirect(page_map.get(request.user.userpreference.default_page))
except UserPreference.DoesNotExist:
@@ -293,11 +293,10 @@ def system(request):
if postgres:
postgres_current = 16 # will need to be updated as PostgreSQL releases new major versions
from decimal import Decimal
from django.db import connection
postgres_ver = Decimal(str(connection.pg_version).replace('00', '.'))
postgres_ver = divmod(connection.pg_version, 10000)
if postgres_ver >= postgres_current:
database_status = 'success'
database_message = _('Everything is fine!')
@@ -446,7 +445,7 @@ def web_manifest(request):
theme_values['app_name'], "description":
_("Manage recipes, shopping list, meal plans and more."), "icons":
icons, "start_url":
"./search", "background_color":
"./", "background_color":
theme_values['nav_bg_color'], "display":
"standalone", "scope":
".", "theme_color":
@@ -454,7 +453,7 @@ def web_manifest(request):
[{"name": _("Plan"), "short_name": _("Plan"), "description": _("View your meal Plan"), "url":
"./plan"}, {"name": _("Books"), "short_name": _("Books"), "description": _("View your cookbooks"), "url": "./books"},
{"name": _("Shopping"), "short_name": _("Shopping"), "description": _("View your shopping lists"), "url":
"./list/shopping-list/"}], "share_target": {"action": "/data/import/url", "method": "GET", "params": {"title": "title", "url": "url", "text": "text"}}
"./shopping/"}], "share_target": {"action": "/data/import/url", "method": "GET", "params": {"title": "title", "url": "url", "text": "text"}}
}
return JsonResponse(manifest_info, json_dumps_params={'indent': 4})

View File

@@ -75,7 +75,7 @@
<!-- --------------------------------------- shopping list table -->
<b-row v-for="c in shopping_list_store.get_entries_by_group" v-bind:key="c.id">
<b-col cols="12"
v-if="c.count_unchecked > 0 || user_preference_store.device_settings.shopping_show_checked_entries && (c.count_unchecked + c.count_checked) > 0">
v-if="(c.count_unchecked > 0 || user_preference_store.device_settings.shopping_show_checked_entries) && (c.count_unchecked + c.count_checked) > 0 && (c.count_delayed_unchecked < c.count_unchecked ||user_preference_store.device_settings.shopping_show_delayed_entries )">
<b-button-group class="w-100 mt-1"
:class="{'flex-row-reverse': useUserPreferenceStore().user_settings.left_handed}">
<b-button variant="info" block class="btn btn-block text-left">
@@ -569,6 +569,9 @@ export default {
api.retrieveSupermarket(useUserPreferenceStore().device_settings.shopping_selected_supermarket.id).then(r => {
useUserPreferenceStore().device_settings.shopping_selected_supermarket = r.data
useUserPreferenceStore().updateDeviceSettings()
}).catch(err => {
useUserPreferenceStore().device_settings.shopping_selected_supermarket = null
useUserPreferenceStore().updateDeviceSettings()
})
}

View File

@@ -37,6 +37,15 @@
</b-form-checkbox>
</b-form-group>
<b-form-group :label="$t('DefaultPage')">
<b-form-select v-model="user_preferences.default_page" @change="updateSettings(true);">
<b-form-select-option value="SEARCH">{{$t('Search')}}</b-form-select-option>
<b-form-select-option value="SHOPPING">{{$t('Shopping')}}</b-form-select-option>
<b-form-select-option value="PLAN">{{$t('Meal_Plan')}}</b-form-select-option>
<b-form-select-option value="BOOKS">{{$t('Books')}}</b-form-select-option>
</b-form-select>
</b-form-group>
<hr/>

570
vue/src/locales/ca.json Normal file
View File

@@ -0,0 +1,570 @@
{
"warning_feature_beta": "Aquesta funció està en fase BETA (proves). Podrien aparèixer-hi errades i canvis importants en un futur (i es podria perdre informació relacionada amb la seva funcionalitat) quan la utilitzis .",
"err_fetching_resource": "Hi ha hagut una errada a l'hora d'obtenir el recurs!",
"err_creating_resource": "Hi ha hagut un error quan es creava el recurs!",
"err_updating_resource": "Hi ha hagut un error quan s'actualitzava el recurs!",
"err_deleting_resource": "Hi ha hagut un error mentre s'esborrava el recurs!",
"err_deleting_protected_resource": "L'objecte que esteu intentant eliminar s'està utilitzant i no es pot esborrar.",
"err_moving_resource": "Hi ha hagut un error movent el recurs!",
"err_merging_resource": "Hi ha hagut un error fusionant el recurs!",
"err_importing_recipe": "Hi ha hagut un error mentre s'importava la recepta!",
"success_fetching_resource": "S'ha obtingut el recurs amb èxit!",
"success_creating_resource": "El recurs ha estat creat amb èxit!",
"success_updating_resource": "El recurs s'ha actualitzat adequadament!",
"success_deleting_resource": "El recurs s'ha esborrat adequadament!",
"success_moving_resource": "El recurs s'ha mogut adequadament!",
"success_merging_resource": "El recurs s'ha fusionat adequadament!",
"file_upload_disabled": "La càrrega d'arxius no està habilitada per al vostre espai.",
"recipe_property_info": "També podeu afegir propietats als aliments per calcular-les automàticament en funció de la vostra recepta!",
"warning_space_delete": "Podeu eliminar el vostre espai incloent-hi les receptes, llistes de la compra, plans d'àpats i tot el que hi hàgiu creat. Un cop ho feu, no podreu tornar enrere. Esteu segurs que ho voleu fer?",
"food_inherit_info": "Camps que han de ser heretats per defecte.",
"step_time_minutes": "Temps del pas en minuts",
"confirm_delete": "Esteu segurs que voleu eliminar aquest {object}?",
"import_running": "Importació en curs, espereu!",
"all_fields_optional": "Tots els camps són opcionals i es poden deixar buits.",
"convert_internal": "Convertiu-ho en una recepta interna",
"show_only_internal": "Mostreu només les receptes internes",
"show_split_screen": "Vista dividida",
"Log_Recipe_Cooking": "Registre de receptes",
"External_Recipe_Image": "Imatge externa de la recepta",
"Add_to_Shopping": "Afegiu-ho al cistell",
"Add_to_Plan": "Afegiu-ho al pla",
"Step_start_time": "Hora d'inici",
"Sort_by_new": "Ordenar a partir del més nou",
"Table_of_Contents": "Taula de continguts",
"Recipes_per_page": "Receptes per pàgina",
"Show_as_header": "Mostreu com a títol",
"Hide_as_header": "Amagueu com a títol",
"Add_nutrition_recipe": "Afegir nutrició a la recepta",
"Remove_nutrition_recipe": "Esborreu nutrició de la recepta",
"Copy_template_reference": "Copieu el patró",
"per_serving": "per porció",
"Save_and_View": "Graveu-ho i mostreu-ho",
"Manage_Books": "Gestioneu els llibres",
"Meal_Plan": "Pla d'àpats",
"Select_Book": "Seleccioneu llibre",
"Select_File": "Seleccioneu arxiu",
"Recipe_Image": "Imatge de la recepta",
"Import_finished": "Importació finalitzada",
"View_Recipes": "Mostreu les receptes",
"Log_Cooking": "Registreu el que s'ha cuinat",
"New_Recipe": "Nova recepta",
"Url_Import": "Importeu des d'url",
"Reset_Search": "Reinicieu la cerca",
"Recently_Viewed": "Vistos recentment",
"Load_More": "Carregueu-ne més",
"New_Keyword": "Afegiu-hi una nova paraula clau",
"Delete_Keyword": "Esborreu paraula clau",
"Edit_Keyword": "Editeu paraula clau",
"Edit_Recipe": "Editeu recepta",
"Move_Keyword": "Moveu la paraula clau",
"Merge_Keyword": "Fusioneu paraula clau",
"Hide_Keywords": "Amagueu paraula clau",
"Hide_Recipes": "Amagueu receptes",
"Move_Up": "Moveu amunt",
"Move_Down": "Moveu avall",
"Step_Name": "Nom del pas",
"Step_Type": "Tipus de pas",
"Make_Header": "Establiu capçalera",
"Make_Ingredient": "Establiu ingredient",
"Amount": "Quantitat",
"Enable_Amount": "Habiliteu quantitat",
"Disable_Amount": "Deshabiliteu quantitat",
"Ingredient Editor": "Editor d'ingredients",
"Description_Replace": "Substituïu descripció",
"Instruction_Replace": "Substituïu instrucció",
"Auto_Sort": "Ordeneu automàticament",
"Auto_Sort_Help": "Moveu tots els ingredients al pas més adequat.",
"Private_Recipe": "Recepta privada",
"Private_Recipe_Help": "Només tu i la gent amb qui l'has compartit podran veure aquesta recepta.",
"reusable_help_text": "L'enllaç d'invitació es pot fer servir per més d'un usuari.",
"open_data_help_text": "El projecte de dades obertes de Tandoor proporciona dades per a Tandoor a partir de les contribucions de la comunitat. Aquest camp s'emplena automàticament quan s'importa i permet que es facin actualitzacions en un futur.",
"Open_Data_Slug": "",
"Open_Data_Import": "",
"Properties_Food_Amount": "",
"Properties_Food_Unit": "",
"Calculator": "",
"FDC_ID": "",
"FDC_Search": "",
"FDC_ID_help": "",
"property_type_fdc_hint": "",
"Data_Import_Info": "",
"Update_Existing_Data": "",
"Use_Metric": "",
"Learn_More": "",
"converted_unit": "",
"converted_amount": "",
"base_unit": "",
"base_amount": "",
"Datatype": "",
"Input": "",
"Undo": "",
"NoMoreUndo": "",
"Number of Objects": "",
"Add_Step": "",
"Keywords": "",
"Books": "",
"Proteins": "",
"Fats": "",
"Carbohydrates": "",
"Calories": "",
"Energy": "",
"Nutrition": "",
"Date": "",
"StartDate": "",
"EndDate": "",
"Share": "",
"Automation": "",
"Parameter": "",
"Export": "",
"Copy": "",
"Rating": "",
"Close": "",
"Cancel": "",
"Link": "",
"Add": "",
"New": "",
"Note": "",
"Alignment": "",
"Success": "",
"Failure": "",
"Protected": "",
"Ingredients": "",
"Supermarket": "",
"Categories": "",
"Category": "",
"Selected": "",
"min": "",
"Servings": "",
"Waiting": "",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Image": "",
"Delete": "",
"Delete_All": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Search Settings": "",
"View": "",
"Recipes": "",
"Welcome": "",
"Move": "",
"Merge": "",
"Parent": "",
"Copy Link": "",
"Copy Token": "",
"delete_confirmation": "",
"move_confirmation": "",
"merge_confirmation": "",
"create_rule": "",
"move_selection": "",
"merge_selection": "",
"Root": "",
"Ignore_Shopping": "",
"Shopping_Category": "",
"Shopping_Categories": "",
"Shopping_input_placeholder": "",
"Edit_Food": "",
"Move_Food": "",
"New_Food": "",
"Hide_Food": "",
"Food_Alias": "",
"Unit_Alias": "",
"Keyword_Alias": "",
"Delete_Food": "",
"No_ID": "",
"Meal_Plan_Days": "",
"merge_title": "",
"move_title": "",
"Food": "",
"Property": "",
"Property_Editor": "",
"Conversion": "",
"Original_Text": "",
"Recipe_Book": "",
"del_confirmation_tree": "",
"delete_title": "",
"create_title": "",
"edit_title": "",
"Name": "",
"Properties": "",
"Type": "",
"Description": "",
"Recipe": "",
"tree_root": "",
"Icon": "",
"Unit": "",
"Decimals": "",
"Default_Unit": "",
"No_Results": "",
"New_Unit": "",
"Create_New_Shopping Category": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Unit": "",
"Create_New_Meal_Type": "",
"Create_New_Shopping_Category": "",
"and_up": "",
"and_down": "",
"Instructions": "",
"Unrated": "",
"Automate": "",
"Empty": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Time": "",
"Text": "",
"Shopping_list": "",
"Added_by": "",
"Added_on": "",
"AddToShopping": "",
"IngredientInShopping": "",
"NotInShopping": "",
"OnHand": "",
"FoodOnHand": "",
"FoodNotOnHand": "",
"Undefined": "",
"Create_Meal_Plan_Entry": "",
"Edit_Meal_Plan_Entry": "",
"Title": "",
"Week": "",
"Month": "",
"Year": "",
"created_by": "",
"Planner": "",
"Planner_Settings": "",
"Period": "",
"Plan_Period_To_Show": "",
"Periods": "",
"Plan_Show_How_Many_Periods": "",
"Starting_Day": "",
"Meal_Types": "",
"Meal_Type": "",
"New_Entry": "",
"Clone": "",
"Drag_Here_To_Delete": "",
"Meal_Type_Required": "",
"Title_or_Recipe_Required": "",
"Color": "",
"New_Meal_Type": "",
"Use_Fractions": "",
"Use_Fractions_Help": "",
"AddFoodToShopping": "",
"RemoveFoodFromShopping": "",
"DeleteShoppingConfirm": "",
"IgnoredFood": "",
"Add_Servings_to_Shopping": "",
"Week_Numbers": "",
"Show_Week_Numbers": "",
"Export_As_ICal": "",
"Export_To_ICal": "",
"Cannot_Add_Notes_To_Shopping": "",
"Added_To_Shopping_List": "",
"Shopping_List_Empty": "",
"Next_Period": "",
"Previous_Period": "",
"Current_Period": "",
"Next_Day": "",
"Previous_Day": "",
"Inherit": "",
"InheritFields": "",
"FoodInherit": "",
"ShowUncategorizedFood": "",
"GroupBy": "",
"Language": "",
"Theme": "",
"CustomTheme": "",
"CustomThemeHelp": "",
"CustomImageHelp": "",
"CustomNavLogoHelp": "",
"CustomLogoHelp": "",
"CustomLogos": "",
"SupermarketCategoriesOnly": "",
"MoveCategory": "",
"CountMore": "",
"IgnoreThis": "",
"DelayFor": "",
"Warning": "",
"NoCategory": "",
"InheritWarning": "",
"ShowDelayed": "",
"ShowRecentlyCompleted": "",
"Completed": "",
"OfflineAlert": "",
"ShoppingBackgroundSyncWarning": "",
"shopping_share": "",
"shopping_auto_sync": "",
"one_url_per_line": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoinclude_related": "",
"default_delay": "",
"plan_share_desc": "",
"shopping_share_desc": "",
"shopping_auto_sync_desc": "",
"mealplan_autoadd_shopping_desc": "",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related_desc": "",
"default_delay_desc": "",
"filter_to_supermarket": "",
"Coming_Soon": "",
"Auto_Planner": "",
"New_Cookbook": "",
"Hide_Keyword": "",
"Hour": "",
"Hours": "",
"Day": "",
"Days": "",
"Second": "",
"Seconds": "",
"Clear": "",
"Users": "",
"Invites": "",
"err_move_self": "",
"nothing": "",
"err_merge_self": "",
"show_sql": "",
"filter_to_supermarket_desc": "",
"CategoryName": "",
"SupermarketName": "",
"CategoryInstruction": "",
"OrderInformation": "",
"shopping_recent_days_desc": "",
"shopping_recent_days": "",
"download_pdf": "",
"download_csv": "",
"csv_delim_help": "",
"csv_delim_label": "",
"SuccessClipboard": "",
"copy_to_clipboard": "",
"csv_prefix_help": "",
"csv_prefix_label": "",
"copy_markdown_table": "",
"in_shopping": "",
"DelayUntil": "",
"Pin": "",
"Unpin": "",
"PinnedConfirmation": "",
"UnpinnedConfirmation": "",
"mark_complete": "",
"QuickEntry": "",
"shopping_add_onhand_desc": "",
"shopping_add_onhand": "",
"related_recipes": "",
"today_recipes": "",
"sql_debug": "",
"remember_search": "",
"remember_hours": "",
"tree_select": "",
"OnHand_help": "",
"ignore_shopping_help": "",
"shopping_category_help": "",
"food_recipe_help": "",
"Foods": "",
"Account": "",
"Cosmetic": "",
"API": "",
"enable_expert": "",
"expert_mode": "",
"simple_mode": "",
"advanced": "",
"fields": "",
"show_keywords": "",
"show_foods": "",
"show_books": "",
"show_rating": "",
"show_units": "",
"show_filters": "",
"not": "",
"save_filter": "",
"filter_name": "",
"left_handed": "",
"left_handed_help": "",
"show_step_ingredients_setting": "",
"show_step_ingredients_setting_help": "",
"show_step_ingredients": "",
"hide_step_ingredients": "",
"Custom Filter": "",
"shared_with": "",
"sort_by": "",
"asc": "",
"desc": "",
"date_viewed": "",
"last_cooked": "",
"times_cooked": "",
"date_created": "",
"show_sortby": "",
"search_rank": "",
"make_now": "",
"Created": "",
"Updated": "",
"Unchanged": "",
"Error": "",
"make_now_count": "",
"recipe_filter": "",
"book_filter_help": "",
"review_shopping": "",
"view_recipe": "",
"copy_to_new": "",
"recipe_name": "",
"paste_ingredients_placeholder": "",
"paste_ingredients": "",
"ingredient_list": "",
"explain": "",
"filter": "",
"Website": "",
"App": "",
"Message": "",
"Bookmarklet": "",
"Sticky_Nav": "",
"Sticky_Nav_Help": "",
"Logo": "",
"Show_Logo": "",
"Show_Logo_Help": "",
"Nav_Color": "",
"Nav_Text_Mode": "",
"Nav_Text_Mode_Help": "",
"Nav_Color_Help": "",
"Space_Cosmetic_Settings": "",
"Use_Kj": "",
"Comments_setting": "",
"click_image_import": "",
"no_more_images_found": "",
"import_duplicates": "",
"paste_json": "",
"Click_To_Edit": "",
"search_no_recipes": "",
"search_import_help_text": "",
"search_create_help_text": "",
"warning_duplicate_filter": "",
"reset_children": "",
"reset_children_help": "",
"reset_food_inheritance": "",
"reset_food_inheritance_info": "",
"substitute_help": "",
"substitute_siblings_help": "",
"substitute_children_help": "",
"substitute_siblings": "",
"substitute_children": "",
"SubstituteOnHand": "",
"ChildInheritFields": "",
"ChildInheritFields_help": "",
"InheritFields_help": "",
"show_ingredients_table": "",
"show_ingredient_overview": "",
"Ingredient Overview": "",
"last_viewed": "",
"created_on": "",
"updatedon": "",
"Imported_From": "",
"advanced_search_settings": "",
"nothing_planned_today": "",
"no_pinned_recipes": "",
"Planned": "",
"Pinned": "",
"Imported": "",
"Quick actions": "",
"Ratings": "",
"Internal": "",
"Units": "",
"Manage_Emails": "",
"Change_Password": "",
"Social_Authentication": "",
"Random Recipes": "",
"parameter_count": "",
"select_keyword": "",
"add_keyword": "",
"select_file": "",
"select_recipe": "",
"select_unit": "",
"select_food": "",
"remove_selection": "",
"empty_list": "",
"Select": "",
"Supermarkets": "",
"User": "",
"Username": "",
"First_name": "",
"Last_name": "",
"Keyword": "",
"Advanced": "",
"Page": "",
"Single": "",
"Multiple": "",
"Reset": "",
"Disabled": "",
"Disable": "",
"Enable": "",
"Options": "",
"Create Food": "",
"create_food_desc": "",
"additional_options": "",
"Importer_Help": "",
"Documentation": "",
"Select_App_To_Import": "",
"Import_Supported": "",
"Export_Supported": "",
"Import_Not_Yet_Supported": "",
"Export_Not_Yet_Supported": "",
"Import_Result_Info": "",
"Recipes_In_Import": "",
"Toggle": "",
"total": "",
"Import_Error": "",
"Warning_Delete_Supermarket_Category": "",
"New_Supermarket": "",
"New_Supermarket_Category": "",
"Are_You_Sure": "",
"Valid Until": "",
"Split_All_Steps": "",
"Combine_All_Steps": "",
"Plural": "",
"plural_short": "",
"g": "",
"kg": "",
"ounce": "",
"pound": "",
"ml": "",
"l": "",
"fluid_ounce": "",
"pint": "",
"quart": "",
"gallon": "",
"tbsp": "",
"tsp": "",
"imperial_fluid_ounce": "",
"imperial_pint": "",
"imperial_quart": "",
"imperial_gallon": "",
"imperial_tbsp": "",
"imperial_tsp": "",
"Choose_Category": "",
"Back": "",
"Use_Plural_Unit_Always": "",
"Use_Plural_Unit_Simple": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"plural_usage_info": "",
"Create Recipe": "",
"Import Recipe": "",
"Never_Unit": "",
"Transpose_Words": "",
"Name_Replace": "",
"Food_Replace": "",
"Unit_Replace": ""
}

View File

@@ -114,7 +114,7 @@
"Create_New_Shopping Category": "Neue Einkaufskategorie erstellen",
"Automate": "Automatisieren",
"Type": "Typ",
"and_up": "& Hoch",
"and_up": "& mehr",
"Unrated": "Unbewertet",
"Shopping_list": "Einkaufsliste",
"step_time_minutes": "Schritt Dauer in Minuten",

View File

@@ -504,6 +504,7 @@
"Keyword": "Keyword",
"Advanced": "Advanced",
"Page": "Page",
"DefaultPage": "Default Page",
"Single": "Single",
"Multiple": "Multiple",
"Reset": "Reset",

View File

@@ -520,5 +520,6 @@
"imperial_gallon": "imperial gal [imp gal] (Verenigd Koninkrijk, volume)",
"imperial_tsp": "imperial thelepel [imp tsp] (UK, volume)",
"Choose_Category": "Kies Categorie",
"Back": "Terug"
"Back": "Terug",
"err_importing_recipe": "Bij het importeren van het recept is een fout opgetreden!"
}

View File

@@ -65,6 +65,7 @@ export const useShoppingListStore = defineStore(_STORE_ID, {
let count_checked = 0
let count_unchecked_food = 0
let count_checked_food = 0
let count_delayed_unchecked = 0
for (let fi in structure[i]['foods']) {
let food_checked = true
@@ -74,6 +75,9 @@ export const useShoppingListStore = defineStore(_STORE_ID, {
} else {
food_checked = false
count_unchecked++
if (structure[i]['foods'][fi]['entries'][ei].delay_until != null){
count_delayed_unchecked++
}
}
}
if (food_checked) {
@@ -87,6 +91,7 @@ export const useShoppingListStore = defineStore(_STORE_ID, {
Vue.set(structure[i], 'count_checked', count_checked)
Vue.set(structure[i], 'count_unchecked_food', count_unchecked_food)
Vue.set(structure[i], 'count_checked_food', count_checked_food)
Vue.set(structure[i], 'count_delayed_unchecked', count_delayed_unchecked)
total_unchecked += count_unchecked
total_checked += count_checked

View File

@@ -427,6 +427,15 @@ export class Models {
placeholder: "",
optional: true,
},
open_data_slug: {
form_field: true,
type: "text",
field: "open_data_slug",
disabled: true,
label: "Open_Data_Slug",
help_text: "open_data_help_text",
optional: true,
},
},
},
}