dynamic meal types
This commit is contained in:
parent
27297d170a
commit
a3dc5f283a
@ -94,7 +94,7 @@ admin.site.register(RecipeBookEntry, RecipeBookEntryAdmin)
|
|||||||
|
|
||||||
|
|
||||||
class MealPlanAdmin(admin.ModelAdmin):
|
class MealPlanAdmin(admin.ModelAdmin):
|
||||||
list_display = ('user', 'recipe', 'meal', 'date')
|
list_display = ('user', 'recipe', 'meal_type', 'date')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def user(obj):
|
def user(obj):
|
||||||
@ -102,3 +102,10 @@ class MealPlanAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
|
|
||||||
admin.site.register(MealPlan, MealPlanAdmin)
|
admin.site.register(MealPlan, MealPlanAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
class MealTypeAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'order')
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(MealType, MealTypeAdmin)
|
||||||
|
@ -263,7 +263,7 @@ class MealPlanForm(forms.ModelForm):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = MealPlan
|
model = MealPlan
|
||||||
fields = ('recipe', 'title', 'meal', 'note', 'date', 'shared')
|
fields = ('recipe', 'title', 'meal_type', 'note', 'date', 'shared')
|
||||||
|
|
||||||
help_texts = {
|
help_texts = {
|
||||||
'shared': _('You can list default users to share recipes with in the settings.'),
|
'shared': _('You can list default users to share recipes with in the settings.'),
|
||||||
|
27
cookbook/migrations/0046_auto_20200602_1133.py
Normal file
27
cookbook/migrations/0046_auto_20200602_1133.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# Generated by Django 3.0.5 on 2020-06-02 09:33
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('cookbook', '0045_userpreference_show_recent'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='MealType',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=128)),
|
||||||
|
('order', models.IntegerField(default=0)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mealplan',
|
||||||
|
name='meal_type',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cookbook.MealType'),
|
||||||
|
),
|
||||||
|
]
|
51
cookbook/migrations/0047_auto_20200602_1133.py
Normal file
51
cookbook/migrations/0047_auto_20200602_1133.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# Generated by Django 3.0.5 on 2020-06-02 09:33
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_meal_types(apps, schema_editor):
|
||||||
|
MealPlan = apps.get_model('cookbook', 'MealPlan')
|
||||||
|
MealType = apps.get_model('cookbook', 'MealType')
|
||||||
|
|
||||||
|
breakfast = MealType.objects.create(
|
||||||
|
name=_('Breakfast'),
|
||||||
|
order=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
lunch = MealType.objects.create(
|
||||||
|
name=_('Lunch'),
|
||||||
|
order=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
dinner = MealType.objects.create(
|
||||||
|
name=_('Dinner'),
|
||||||
|
order=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
other = MealType.objects.create(
|
||||||
|
name=_('Other'),
|
||||||
|
order=0,
|
||||||
|
)
|
||||||
|
|
||||||
|
for m in MealPlan.objects.all():
|
||||||
|
if m.meal == 'BREAKFAST':
|
||||||
|
m.meal_type = breakfast
|
||||||
|
if m.meal == 'LUNCH':
|
||||||
|
m.meal_type = lunch
|
||||||
|
if m.meal == 'DINNER':
|
||||||
|
m.meal_type = dinner
|
||||||
|
if m.meal == 'OTHER':
|
||||||
|
m.meal_type = other
|
||||||
|
|
||||||
|
m.save()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
dependencies = [
|
||||||
|
('cookbook', '0046_auto_20200602_1133'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RunPython(migrate_meal_types),
|
||||||
|
]
|
23
cookbook/migrations/0048_auto_20200602_1140.py
Normal file
23
cookbook/migrations/0048_auto_20200602_1140.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 3.0.5 on 2020-06-02 09:40
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('cookbook', '0047_auto_20200602_1133'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mealplan',
|
||||||
|
name='meal',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='mealplan',
|
||||||
|
name='meal_type',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cookbook.MealType'),
|
||||||
|
),
|
||||||
|
]
|
@ -211,18 +211,20 @@ class RecipeBookEntry(models.Model):
|
|||||||
return self.recipe.name
|
return self.recipe.name
|
||||||
|
|
||||||
|
|
||||||
class MealPlan(models.Model):
|
class MealType(models.Model):
|
||||||
BREAKFAST = 'BREAKFAST'
|
name = models.CharField(max_length=128)
|
||||||
LUNCH = 'LUNCH'
|
order = models.IntegerField(default=0)
|
||||||
DINNER = 'DINNER'
|
|
||||||
OTHER = 'OTHER'
|
|
||||||
MEAL_TYPES = ((BREAKFAST, _('Breakfast')), (LUNCH, _('Lunch')), (DINNER, _('Dinner')), (OTHER, _('Other')),)
|
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class MealPlan(models.Model):
|
||||||
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, blank=True, null=True)
|
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, blank=True, null=True)
|
||||||
title = models.CharField(max_length=64, blank=True, default='')
|
title = models.CharField(max_length=64, blank=True, default='')
|
||||||
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
shared = models.ManyToManyField(User, blank=True, related_name='plan_share')
|
shared = models.ManyToManyField(User, blank=True, related_name='plan_share')
|
||||||
meal = models.CharField(choices=MEAL_TYPES, max_length=128, default=BREAKFAST)
|
meal_type = models.ForeignKey(MealType, on_delete=models.CASCADE)
|
||||||
note = models.TextField(blank=True)
|
note = models.TextField(blank=True)
|
||||||
date = models.DateField()
|
date = models.DateField()
|
||||||
|
|
||||||
@ -232,8 +234,7 @@ class MealPlan(models.Model):
|
|||||||
return str(self.recipe)
|
return str(self.recipe)
|
||||||
|
|
||||||
def get_meal_name(self):
|
def get_meal_name(self):
|
||||||
meals = dict(self.MEAL_TYPES)
|
return self.meal_type.name
|
||||||
return meals.get(self.meal)
|
|
||||||
|
|
||||||
|
|
||||||
class CookLog(models.Model):
|
class CookLog(models.Model):
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col col-12">
|
<div class="col col-12">
|
||||||
<h3>{{ plan.get_meal_name }} {{ plan.date }} <a href="{% url 'edit_meal_plan' plan.pk %}"
|
<h3>{{ plan.meal_type }} {{ plan.date }} <a href="{% url 'edit_meal_plan' plan.pk %}"
|
||||||
class="d-print-none"><i class="fas fa-pencil-alt"></i></a>
|
class="d-print-none"><i class="fas fa-pencil-alt"></i></a>
|
||||||
</h3>
|
</h3>
|
||||||
<small class="text-muted">{% trans 'Created by' %} {{ plan.created_by.get_user_name }}</small>
|
<small class="text-muted">{% trans 'Created by' %} {{ plan.created_by.get_user_name }}</small>
|
||||||
@ -77,7 +77,7 @@
|
|||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
{% for x in same_day_plan %}
|
{% for x in same_day_plan %}
|
||||||
<li class="list-group-item"><a href="{% url 'view_plan_entry' x.pk %}">{{ x.get_label }}
|
<li class="list-group-item"><a href="{% url 'view_plan_entry' x.pk %}">{{ x.get_label }}
|
||||||
({{ x.get_meal_name }})</a></li>
|
({{ x.meal_type }})</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -127,7 +127,7 @@ class MealPlanCreate(GroupRequiredMixin, CreateView):
|
|||||||
|
|
||||||
def get_initial(self):
|
def get_initial(self):
|
||||||
return dict(
|
return dict(
|
||||||
meal=self.request.GET['meal'] if 'meal' in self.request.GET else None,
|
meal_type=self.request.GET['meal'] if 'meal' in self.request.GET else None,
|
||||||
date=datetime.strptime(self.request.GET['date'], '%Y-%m-%d') if 'date' in self.request.GET else None,
|
date=datetime.strptime(self.request.GET['date'], '%Y-%m-%d') if 'date' in self.request.GET else None,
|
||||||
shared=self.request.user.userpreference.plan_share.all() if self.request.user.userpreference.plan_share else None
|
shared=self.request.user.userpreference.plan_share.all() if self.request.user.userpreference.plan_share else None
|
||||||
)
|
)
|
||||||
|
@ -148,13 +148,13 @@ def meal_plan(request):
|
|||||||
days_dict[d] = []
|
days_dict[d] = []
|
||||||
|
|
||||||
plan = {}
|
plan = {}
|
||||||
for t in MealPlan.MEAL_TYPES:
|
for t in MealType.objects.all():
|
||||||
plan[t[0]] = {'type_name': t[1], 'days': copy.deepcopy(days_dict)}
|
plan[t.name] = {'type_name': t.name, 'days': copy.deepcopy(days_dict)}
|
||||||
|
|
||||||
for d in days:
|
for d in days:
|
||||||
plan_day = MealPlan.objects.filter(date=d).filter(Q(created_by=request.user) | Q(shared=request.user)).distinct().all()
|
plan_day = MealPlan.objects.filter(date=d).filter(Q(created_by=request.user) | Q(shared=request.user)).distinct().all()
|
||||||
for p in plan_day:
|
for p in plan_day:
|
||||||
plan[p.meal]['days'][d].append(p)
|
plan[str(p.meal_type)]['days'][d].append(p)
|
||||||
|
|
||||||
return render(request, 'meal_plan.html', {'js_week': js_week, 'plan': plan, 'days': days, 'surrounding_weeks': surrounding_weeks})
|
return render(request, 'meal_plan.html', {'js_week': js_week, 'plan': plan, 'days': days, 'surrounding_weeks': surrounding_weeks})
|
||||||
|
|
||||||
@ -167,7 +167,7 @@ def meal_plan_entry(request, pk):
|
|||||||
messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
|
messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!'))
|
||||||
return HttpResponseRedirect(reverse_lazy('index'))
|
return HttpResponseRedirect(reverse_lazy('index'))
|
||||||
|
|
||||||
same_day_plan = MealPlan.objects.filter(date=plan.date).exclude(pk=plan.pk).filter(Q(created_by=request.user) | Q(shared=request.user)).order_by('meal').all()
|
same_day_plan = MealPlan.objects.filter(date=plan.date).exclude(pk=plan.pk).filter(Q(created_by=request.user) | Q(shared=request.user)).order_by('meal_type').all()
|
||||||
|
|
||||||
return render(request, 'meal_plan_entry.html', {'plan': plan, 'same_day_plan': same_day_plan})
|
return render(request, 'meal_plan_entry.html', {'plan': plan, 'same_day_plan': same_day_plan})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user