Skip to content

Commit 7667130

Browse files
committed
fix/add IngredientInShoppingList model
1 parent 6c3930d commit 7667130

3 files changed

Lines changed: 146 additions & 2 deletions

File tree

src/apps/recipes/admin.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
IngredientInRecipe,
1616
Measurement,
1717
ShoppingList,
18+
IngredientInShoppingList,
1819
)
1920

2021

@@ -86,7 +87,6 @@ class IngredientInRecipeAdmin(admin.ModelAdmin):
8687
list_display = (
8788
'ingredient',
8889
'recipe',
89-
'recipe',
9090
'amount',
9191
'measurement',
9292
'recommendation',
@@ -114,3 +114,21 @@ class ShoppingListAdmin(admin.ModelAdmin):
114114
)
115115
search_fields = ('name', 'author__username')
116116
list_filter = ('author',)
117+
118+
119+
@admin.register(IngredientInShoppingList)
120+
class IngredientInShoppingListAdmin(admin.ModelAdmin):
121+
list_display = (
122+
'ingredient',
123+
'shopping_list',
124+
'amount',
125+
'measurement',
126+
'recommendation',
127+
)
128+
search_fields = (
129+
'ingredient__name',
130+
'shopping_list__name',
131+
'shopping_list__author__username',
132+
'measurement__name',
133+
)
134+
list_filter = ('ingredient', 'shopping_list', 'measurement')

src/apps/recipes/migrations/0001_initial.py

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 4.2.16 on 2024-11-11 08:16
1+
# Generated by Django 4.2.16 on 2024-11-11 09:08
22

33
import apps.core.validators
44
import apps.recipes.models
@@ -176,6 +176,52 @@ class Migration(migrations.Migration):
176176
"get_latest_by": ("created",),
177177
},
178178
),
179+
migrations.CreateModel(
180+
name="IngredientInShoppingList",
181+
fields=[
182+
(
183+
"id",
184+
models.BigAutoField(
185+
auto_created=True,
186+
primary_key=True,
187+
serialize=False,
188+
verbose_name="ID",
189+
),
190+
),
191+
(
192+
"created",
193+
models.DateTimeField(
194+
auto_now_add=True, db_index=True, verbose_name="Date created"
195+
),
196+
),
197+
(
198+
"amount",
199+
models.PositiveSmallIntegerField(verbose_name="Ingredient amount"),
200+
),
201+
(
202+
"recommendation",
203+
models.CharField(
204+
max_length=128, verbose_name="Ingredient recommendation note"
205+
),
206+
),
207+
(
208+
"ingredient",
209+
models.ForeignKey(
210+
on_delete=django.db.models.deletion.CASCADE,
211+
related_name="shopping_lists_details",
212+
to="recipes.ingredient",
213+
verbose_name="Ingredient in recipe",
214+
),
215+
),
216+
],
217+
options={
218+
"verbose_name": "Ingredient in shopping list",
219+
"verbose_name_plural": "Ingredients in shopping lists",
220+
"db_table_comment": "Ingredients in shopping lists",
221+
"ordering": ("-created",),
222+
"get_latest_by": ("created",),
223+
},
224+
),
179225
migrations.CreateModel(
180226
name="Measurement",
181227
fields=[
@@ -448,6 +494,7 @@ class Migration(migrations.Migration):
448494
models.ManyToManyField(
449495
blank=True,
450496
related_name="shopping_lists",
497+
through="recipes.IngredientInShoppingList",
451498
to="recipes.ingredient",
452499
verbose_name="Ingredients in list",
453500
),
@@ -592,6 +639,37 @@ class Migration(migrations.Migration):
592639
verbose_name="Recipe timers",
593640
),
594641
),
642+
migrations.AddField(
643+
model_name="ingredientinshoppinglist",
644+
name="measurement",
645+
field=models.ForeignKey(
646+
null=True,
647+
on_delete=django.db.models.deletion.SET_NULL,
648+
related_name="shopping_lists_details",
649+
to="recipes.measurement",
650+
verbose_name="Ingredient measurement",
651+
),
652+
),
653+
migrations.AddField(
654+
model_name="ingredientinshoppinglist",
655+
name="shopping_list",
656+
field=models.ForeignKey(
657+
on_delete=django.db.models.deletion.CASCADE,
658+
related_name="ingredients_details",
659+
to="recipes.shoppinglist",
660+
verbose_name="ShoppingList",
661+
),
662+
),
663+
migrations.AddField(
664+
model_name="ingredientinshoppinglist",
665+
name="substitutes",
666+
field=models.ManyToManyField(
667+
blank=True,
668+
help_text="Ingredients that can be used instead of",
669+
to="recipes.ingredientinshoppinglist",
670+
verbose_name="Substitutes",
671+
),
672+
),
595673
migrations.AddField(
596674
model_name="ingredientinrecipe",
597675
name="measurement",

src/apps/recipes/models.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ class ShoppingList(CreatedModel, AuthorModel, UUIDModel):
304304
)
305305
ingredients = models.ManyToManyField(
306306
'Ingredient',
307+
through='IngredientInShoppingList',
307308
related_name='shopping_lists',
308309
verbose_name=_('Ingredients in list'),
309310
blank=True,
@@ -320,6 +321,53 @@ def __str__(self) -> str:
320321
return _(f'{self.name} (author: {self.author})')
321322

322323

324+
class IngredientInShoppingList(CreatedModel):
325+
"""Ingredient, shopping list intermediate model."""
326+
327+
shopping_list = models.ForeignKey(
328+
'ShoppingList',
329+
verbose_name=_('ShoppingList'),
330+
on_delete=models.CASCADE,
331+
related_name='ingredients_details',
332+
)
333+
ingredient = models.ForeignKey(
334+
'Ingredient',
335+
verbose_name=_('Ingredient in recipe'),
336+
on_delete=models.CASCADE,
337+
related_name='shopping_lists_details',
338+
)
339+
amount = models.PositiveSmallIntegerField(
340+
_('Ingredient amount'),
341+
null=False,
342+
blank=False,
343+
)
344+
measurement = models.ForeignKey(
345+
'Measurement',
346+
verbose_name=_('Ingredient measurement'),
347+
on_delete=models.SET_NULL,
348+
related_name='shopping_lists_details',
349+
null=True,
350+
)
351+
recommendation = models.CharField(
352+
_('Ingredient recommendation note'),
353+
max_length=RecipesLengthLimits.INGREDIENT_RECOMMENDATION_MAX_LENGTH,
354+
)
355+
substitutes = models.ManyToManyField(
356+
'self',
357+
symmetrical=False,
358+
verbose_name=_('Substitutes'),
359+
help_text=_('Ingredients that can be used instead of'),
360+
blank=True,
361+
)
362+
363+
class Meta:
364+
verbose_name = _('Ingredient in shopping list')
365+
verbose_name_plural = _('Ingredients in shopping lists')
366+
db_table_comment = _('Ingredients in shopping lists')
367+
ordering = ('-created',)
368+
get_latest_by = ('created',)
369+
370+
323371
class CookingStep(CreatedModel, ModifiedModel, UUIDModel):
324372
"""Recipe cooking step model."""
325373

0 commit comments

Comments
 (0)