summaryrefslogtreecommitdiff
path: root/kitchen/admin.py
blob: 9f924aebf4726e7e3dfeb1bf848dd2bf25bfb060 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from django.contrib import admin
from .models import (
    Tag,
    Ingredient,
    PantryItem,
    MetaRecipe,
    Slot,
    SlotOption,
    MetaRecipeBase,
    Recipe,
    RecipeIngredient,
    CookLog,
    ShoppingListItem,
)


@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ["name"]
    search_fields = ["name"]


@admin.register(Ingredient)
class IngredientAdmin(admin.ModelAdmin):
    list_display = ["name", "default_unit", "shelf_life_days", "tag_list"]
    list_filter = ["tags"]
    search_fields = ["name", "aliases"]
    filter_horizontal = ["tags"]

    def tag_list(self, obj):
        return ", ".join(t.name for t in obj.tags.all())

    tag_list.short_description = "Tags"


@admin.register(PantryItem)
class PantryItemAdmin(admin.ModelAdmin):
    list_display = [
        "ingredient",
        "state",
        "quantity",
        "unit",
        "location",
        "stored_date",
        "expiry_date",
        "is_staple",
    ]
    list_filter = ["state", "location", "is_staple"]
    search_fields = ["ingredient__name"]
    list_editable = ["state", "quantity"]


# --- Meta-Recipe inlines ---


class SlotOptionInline(admin.TabularInline):
    model = SlotOption
    extra = 1
    autocomplete_fields = ["ingredient"]


class SlotInline(admin.TabularInline):
    model = Slot
    extra = 1
    show_change_link = True  # Link to slot detail to manage options


class MetaRecipeBaseInline(admin.TabularInline):
    model = MetaRecipeBase
    extra = 1
    autocomplete_fields = ["ingredient"]


@admin.register(MetaRecipe)
class MetaRecipeAdmin(admin.ModelAdmin):
    list_display = ["name", "default_servings", "prep_time_mins", "cook_time_mins", "gear_needed"]
    search_fields = ["name"]
    inlines = [SlotInline, MetaRecipeBaseInline]


@admin.register(Slot)
class SlotAdmin(admin.ModelAdmin):
    list_display = ["meta_recipe", "name", "required", "max_choices", "option_count"]
    list_filter = ["meta_recipe", "required"]
    inlines = [SlotOptionInline]

    def option_count(self, obj):
        return obj.options.count()

    option_count.short_description = "Options"


# --- Fixed Recipe inlines ---


class RecipeIngredientInline(admin.TabularInline):
    model = RecipeIngredient
    extra = 1
    autocomplete_fields = ["ingredient"]


@admin.register(Recipe)
class RecipeAdmin(admin.ModelAdmin):
    list_display = ["name", "servings", "prep_time_mins", "cook_time_mins", "source_url"]
    search_fields = ["name"]
    inlines = [RecipeIngredientInline]


# --- Cook Log & Shopping ---


@admin.register(CookLog)
class CookLogAdmin(admin.ModelAdmin):
    list_display = ["date", "meta_recipe", "recipe", "servings"]
    list_filter = ["date"]
    date_hierarchy = "date"


@admin.register(ShoppingListItem)
class ShoppingListItemAdmin(admin.ModelAdmin):
    list_display = ["__str__", "quantity", "unit", "reason", "added_date", "checked"]
    list_filter = ["checked"]
    list_editable = ["checked"]