added admin editable units and categories

This commit is contained in:
Jens Timmerman 2018-09-23 22:45:06 +02:00
parent 5be3707449
commit 82a824cf41
6 changed files with 129 additions and 39 deletions

View file

@ -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)

View 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),
),
]

View 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',
),
]

View file

@ -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]])

View file

@ -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'),
] ]

View file

@ -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