diff --git a/cookbook/forms.py b/cookbook/forms.py index ce84a1c00..9a70b22e0 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -1,16 +1,27 @@ +from dal_select2.widgets import ModelSelect2 from django import forms -from django.forms import widgets +from django.forms import widgets, SelectDateWidget from django.utils.translation import gettext as _ from emoji_picker.widgets import EmojiPickerTextInput from .models import * +class SelectWidget(widgets.Select): + class Media: + js = ('custom/js/form_select.js',) + + class MultiSelectWidget(widgets.SelectMultiple): class Media: js = ('custom/js/form_multiselect.js',) +# yes there are some stupid browsers that still dont support this but i dont support people using these browsers +class DateWidget(forms.DateInput): + input_type = 'date' + + class ExternalRecipeForm(forms.ModelForm): file_path = forms.CharField(disabled=True, required=False) storage = forms.ModelChoiceField(queryset=Storage.objects.all(), disabled=True, required=False) @@ -87,12 +98,6 @@ class StorageForm(forms.ModelForm): } -class RecipeBookForm(forms.ModelForm): - class Meta: - model = RecipeBook - fields = ('name',) - - class RecipeBookEntryForm(forms.ModelForm): prefix = 'bookmark' @@ -125,3 +130,17 @@ class ImportRecipeForm(forms.ModelForm): 'file_uid': _('File ID'), } widgets = {'keywords': MultiSelectWidget} + + +class RecipeBookForm(forms.ModelForm): + class Meta: + model = RecipeBook + fields = ('name',) + + +class MealPlanForm(forms.ModelForm): + class Meta: + model = MealPlan + fields = ('recipe', 'meal', 'note', 'date') + + widgets = {'recipe': SelectWidget, 'date': DateWidget} diff --git a/cookbook/helper/dal.py b/cookbook/helper/dal.py index 12411cec0..26887afdd 100644 --- a/cookbook/helper/dal.py +++ b/cookbook/helper/dal.py @@ -1,6 +1,6 @@ from dal import autocomplete -from cookbook.models import Keyword, RecipeIngredients +from cookbook.models import Keyword, RecipeIngredients, Recipe class KeywordAutocomplete(autocomplete.Select2QuerySetView): @@ -27,3 +27,16 @@ class IngredientsAutocomplete(autocomplete.Select2QuerySetView): qs = qs.filter(name__istartswith=self.q) return qs + + +class RecipeAutocomplete(autocomplete.Select2QuerySetView): + def get_queryset(self): + if not self.request.user.is_authenticated: + return Recipe.objects.none() + + qs = Recipe.objects.all() + + if self.q: + qs = qs.filter(name__icontains=self.q) + + return qs diff --git a/cookbook/migrations/0008_mealplan.py b/cookbook/migrations/0008_mealplan.py new file mode 100644 index 000000000..18673ed1e --- /dev/null +++ b/cookbook/migrations/0008_mealplan.py @@ -0,0 +1,27 @@ +# Generated by Django 3.0.2 on 2020-01-17 14:55 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0007_auto_20191226_0852'), + ] + + operations = [ + migrations.CreateModel( + name='MealPlan', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('meal', models.CharField(choices=[('BREAKFAST', 'Breakfast'), ('LUNCH', 'Lunch'), ('DINNER', 'Dinner'), ('OTHER', 'Other')], default='BREAKFAST', max_length=128)), + ('note', models.TextField(blank=True)), + ('date', models.DateField()), + ('recipe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.Recipe')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 400214875..0299a6bec 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -1,5 +1,5 @@ from django.contrib.auth.models import User - +from django.utils.translation import gettext as _ from django.db import models @@ -115,3 +115,17 @@ class RecipeBookEntry(models.Model): def __str__(self): return self.recipe.name + + +class MealPlan(models.Model): + BREAKFAST = 'BREAKFAST' + LUNCH = 'LUNCH' + DINNER = 'DINNER' + OTHER = 'OTHER' + MEAL_TYPES = ((BREAKFAST, _('Breakfast')), (LUNCH, _('Lunch')), (DINNER, _('Dinner')), (OTHER, _('Other')),) + + user = models.ForeignKey(User, on_delete=models.CASCADE) + recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE) + meal = models.CharField(choices=MEAL_TYPES, max_length=128, default=BREAKFAST) + note = models.TextField(blank=True) + date = models.DateField() diff --git a/cookbook/static/custom/js/form_select.js b/cookbook/static/custom/js/form_select.js new file mode 100644 index 000000000..85935d370 --- /dev/null +++ b/cookbook/static/custom/js/form_select.js @@ -0,0 +1,3 @@ +$(document).ready(function () { + $('.selectwidget').select2(); +}); \ No newline at end of file diff --git a/cookbook/templates/base.html b/cookbook/templates/base.html index c0eb00f46..776477c3b 100644 --- a/cookbook/templates/base.html +++ b/cookbook/templates/base.html @@ -75,6 +75,9 @@
| ? | +? | +? | +? | +? | +? | +? | +
|---|---|---|---|---|---|---|
{% trans 'Breakfast' %} |
+ ||||||
| + | + | + | + | + | + | + |
{% trans 'Lunch' %} |
+ ||||||
{% trans 'Dinner' %} |
+ ||||||
{% trans 'Other' %} |
+ ||||||