added admin editable units and categories
This commit is contained in:
parent
5be3707449
commit
82a824cf41
|
@ -2,12 +2,14 @@ from django.contrib import admin
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
|
|
||||||
from .models import PantryItem, PantryItemLine
|
from .models import PantryItem, PantryItemLine, Unit, Category
|
||||||
|
|
||||||
|
|
||||||
class PantryItemInLine(admin.TabularInline):
|
class PantryItemInLine(admin.TabularInline):
|
||||||
model = PantryItemLine
|
model = PantryItemLine
|
||||||
extra = 1
|
extra = 1
|
||||||
|
|
||||||
|
|
||||||
def upper_case_name(obj):
|
def upper_case_name(obj):
|
||||||
return obj.name.upper()
|
return obj.name.upper()
|
||||||
upper_case_name.short_description = 'Name'
|
upper_case_name.short_description = 'Name'
|
||||||
|
@ -18,12 +20,13 @@ def capitalize_name(obj):
|
||||||
upper_case_name.short_description = 'Name'
|
upper_case_name.short_description = 'Name'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PantryItemInLineAdmin(admin.ModelAdmin):
|
class PantryItemInLineAdmin(admin.ModelAdmin):
|
||||||
list_filter = ['expiry_date', 'unit', 'pantry_item', 'pantry_item__min_quantity']
|
list_filter = ['expiry_date', 'pantry_item__unit', 'pantry_item', 'pantry_item__min_quantity']
|
||||||
search_fields = ['info', 'pantry_item__name', 'pantry_item__info']
|
search_fields = ['info', 'pantry_item__name', 'pantry_item__info']
|
||||||
autocomplete_fields = ['pantry_item',]
|
autocomplete_fields = ['pantry_item']
|
||||||
fields = (
|
|
||||||
|
readonly_fields = ['unit']
|
||||||
|
fields = (
|
||||||
'pantry_item',
|
'pantry_item',
|
||||||
'quantity',
|
'quantity',
|
||||||
'expiry_date',
|
'expiry_date',
|
||||||
|
@ -40,14 +43,18 @@ class PantryItemInLineAdmin(admin.ModelAdmin):
|
||||||
'info',
|
'info',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class AutocompleteAdmin(admin.ModelAdmin):
|
||||||
|
"""Class used to satisfy an admin check"""
|
||||||
|
search_fields = ["name"]
|
||||||
|
|
||||||
class PantryItemAdmin(admin.ModelAdmin):
|
class PantryItemAdmin(admin.ModelAdmin):
|
||||||
list_filter = ['category', 'unit', 'min_quantity']
|
list_filter = ['category', 'unit', 'min_quantity']
|
||||||
search_fields = ['info', 'name']
|
search_fields = ['info', 'name', 'category', 'unit']
|
||||||
|
autocomplete_fields = ['category', 'unit']
|
||||||
inlines = [PantryItemInLine]
|
inlines = [PantryItemInLine]
|
||||||
# TODO: make category a model
|
# TODO: make category a model
|
||||||
#autocomplete_fields = ['category',]
|
#autocomplete_fields = ['category',]
|
||||||
fields = (
|
fields = (
|
||||||
'name',
|
'name',
|
||||||
'category',
|
'category',
|
||||||
('min_quantity', 'unit'),
|
('min_quantity', 'unit'),
|
||||||
|
@ -64,3 +71,5 @@ class PantryItemAdmin(admin.ModelAdmin):
|
||||||
|
|
||||||
admin.site.register(PantryItem, PantryItemAdmin)
|
admin.site.register(PantryItem, PantryItemAdmin)
|
||||||
admin.site.register(PantryItemLine, PantryItemInLineAdmin)
|
admin.site.register(PantryItemLine, PantryItemInLineAdmin)
|
||||||
|
admin.site.register(Unit, AutocompleteAdmin)
|
||||||
|
admin.site.register(Category, AutocompleteAdmin)
|
||||||
|
|
57
inventory/migrations/0011_auto_20180923_2025.py
Normal file
57
inventory/migrations/0011_auto_20180923_2025.py
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
# Generated by Django 2.1.1 on 2018-09-23 20:25
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('inventory', '0010_auto_20180916_1252'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Category',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Unit',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('unit', models.CharField(max_length=50)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='pantryitemline',
|
||||||
|
name='unit',
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pantryitem',
|
||||||
|
name='category',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.Category'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pantryitem',
|
||||||
|
name='min_quantity',
|
||||||
|
field=models.IntegerField(default=1),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pantryitem',
|
||||||
|
name='unit',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='inventory.Unit'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pantryitemline',
|
||||||
|
name='pantry_item',
|
||||||
|
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='inventory.PantryItem'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pantryitemline',
|
||||||
|
name='size',
|
||||||
|
field=models.IntegerField(default=1),
|
||||||
|
),
|
||||||
|
]
|
18
inventory/migrations/0012_auto_20180923_2037.py
Normal file
18
inventory/migrations/0012_auto_20180923_2037.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 2.1.1 on 2018-09-23 20:37
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('inventory', '0011_auto_20180923_2025'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='unit',
|
||||||
|
old_name='unit',
|
||||||
|
new_name='name',
|
||||||
|
),
|
||||||
|
]
|
|
@ -2,17 +2,6 @@ from django.db import models
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
|
||||||
CATEGORIES = (
|
|
||||||
('UC', 'UNCATEGORIZED'), # bloem meel pasta
|
|
||||||
('GS', 'GENRAL_STOCK'), # bloem meel pasta
|
|
||||||
('CANS', 'CANS'),
|
|
||||||
('BR', 'BREAKFAST'),
|
|
||||||
('SAV', 'SAVORIES'),
|
|
||||||
('SW', 'SWEETS'),
|
|
||||||
('SN', 'SNACKS'),
|
|
||||||
('SP', 'SPICES'),
|
|
||||||
('DR', 'DRINKS'),
|
|
||||||
)
|
|
||||||
|
|
||||||
UNITS = (
|
UNITS = (
|
||||||
('L', 'miliLiter'),
|
('L', 'miliLiter'),
|
||||||
|
@ -25,22 +14,46 @@ UNITS = (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class Category(models.Model):
|
||||||
|
"""A category for a pantry item to be in
|
||||||
|
e.g.
|
||||||
|
UNCATEGORIZED
|
||||||
|
GENRAL_STOCK # bloem meel pasta
|
||||||
|
CANS
|
||||||
|
BREAKFAST
|
||||||
|
SAVORIES
|
||||||
|
SWEETS
|
||||||
|
SNACKS
|
||||||
|
SPICES
|
||||||
|
DRINKS
|
||||||
|
"""
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
|
|
||||||
#class ShoppingList(models.Model):
|
def __str__(self):
|
||||||
# - pantryitems < min_quantity in pantryitemlists
|
return self.name
|
||||||
# - shoppinglistitems
|
|
||||||
# - user ?
|
|
||||||
# info
|
class Unit(models.Model):
|
||||||
# quantity
|
"""A unit
|
||||||
# unit
|
e.g. Mililiter
|
||||||
# name
|
Grams
|
||||||
|
Roll
|
||||||
|
Tube
|
||||||
|
Bag
|
||||||
|
Bar
|
||||||
|
Pack
|
||||||
|
"""
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
class PantryItem(models.Model):
|
class PantryItem(models.Model):
|
||||||
# user?
|
# user?
|
||||||
name = models.CharField(max_length=200)
|
name = models.CharField(max_length=200)
|
||||||
category = models.CharField(max_length=200, choices=CATEGORIES, default='UC')
|
category = models.ForeignKey(Category, on_delete=models.PROTECT)
|
||||||
min_quantity = models.IntegerField(default=1) #, decimal_places=3, max_digits=32)
|
min_quantity = models.IntegerField(default=1) #, decimal_places=3, max_digits=32)
|
||||||
unit = models.CharField(max_length=20, null=True, blank=True, choices=UNITS)
|
unit = models.ForeignKey(Unit, on_delete=models.PROTECT, null=True)
|
||||||
info = models.CharField(max_length=200, null=True, blank=True)
|
info = models.CharField(max_length=200, null=True, blank=True)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -52,11 +65,13 @@ class PantryItemLine(models.Model):
|
||||||
quantity = models.IntegerField(default=1)
|
quantity = models.IntegerField(default=1)
|
||||||
expiry_date = models.DateField(null=True, blank=True)
|
expiry_date = models.DateField(null=True, blank=True)
|
||||||
size = models.IntegerField(default=1) #, decimal_places=3, max_digits=32)
|
size = models.IntegerField(default=1) #, decimal_places=3, max_digits=32)
|
||||||
unit = models.CharField(max_length=20, null=True, blank=True, choices=UNITS)
|
|
||||||
info = models.CharField(max_length=200, null=True, blank=True)
|
info = models.CharField(max_length=200, null=True, blank=True)
|
||||||
|
|
||||||
|
def unit(self):
|
||||||
|
return self.pantry_item.unit
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('pantryitemlinedetail', kwargs={'pk': self.pk})
|
return reverse('pantryitemlinedetail', kwargs={'pk': self.pk})
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return ' '.join([str(x) for x in [self.pantry_item.name, self.quantity, 'X', self.size, self.unit]])
|
return ' '.join([str(x) for x in [self.pantry_item.name, self.quantity, 'X', self.size, self.pantry_item.unit]])
|
||||||
|
|
|
@ -10,5 +10,4 @@ urlpatterns = [
|
||||||
# TODO: add categories
|
# TODO: add categories
|
||||||
# TODO: add pantry item selection
|
# TODO: add pantry item selection
|
||||||
path('expirations/', views.Expirations.as_view(), name='expirations'),
|
path('expirations/', views.Expirations.as_view(), name='expirations'),
|
||||||
path('item/<int:pk>/', views.DetailView.as_view(), name='pantryitemlinedetail'),
|
|
||||||
]
|
]
|
||||||
|
|
|
@ -18,9 +18,6 @@ def consume(request):
|
||||||
return render(request, "inventory/consume.html")
|
return render(request, "inventory/consume.html")
|
||||||
|
|
||||||
|
|
||||||
def add(request):
|
|
||||||
return render(request, "inventory/add.html")
|
|
||||||
|
|
||||||
class Shoppinglist(generic.ListView):
|
class Shoppinglist(generic.ListView):
|
||||||
template_name = "inventory/shoppinglist.html"
|
template_name = "inventory/shoppinglist.html"
|
||||||
context_object_name = 'pis'
|
context_object_name = 'pis'
|
||||||
|
@ -30,14 +27,9 @@ class Shoppinglist(generic.ListView):
|
||||||
#return PantryItemLine.objects.filter(quantity__lt=F('pantry_item__min_quantity'))
|
#return PantryItemLine.objects.filter(quantity__lt=F('pantry_item__min_quantity'))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Expirations(generic.ListView):
|
class Expirations(generic.ListView):
|
||||||
template_name = "inventory/expirations.html"
|
template_name = "inventory/expirations.html"
|
||||||
context_object_name = 'pis'
|
context_object_name = 'pis'
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return PantryItemLine.objects.exclude(expiry_date__isnull=True).order_by('expiry_date')
|
return PantryItemLine.objects.exclude(expiry_date__isnull=True).order_by('expiry_date')
|
||||||
|
|
||||||
|
|
||||||
class DetailView(generic.DetailView):
|
|
||||||
model = PantryItemLine
|
|
||||||
|
|
Loading…
Reference in a new issue