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.
from .models import PantryItem, PantryItemLine
from .models import PantryItem, PantryItemLine, Unit, Category
class PantryItemInLine(admin.TabularInline):
model = PantryItemLine
extra = 1
def upper_case_name(obj):
return obj.name.upper()
upper_case_name.short_description = 'Name'
@ -18,12 +20,13 @@ def capitalize_name(obj):
upper_case_name.short_description = 'Name'
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']
autocomplete_fields = ['pantry_item',]
fields = (
autocomplete_fields = ['pantry_item']
readonly_fields = ['unit']
fields = (
'pantry_item',
'quantity',
'expiry_date',
@ -40,14 +43,18 @@ class PantryItemInLineAdmin(admin.ModelAdmin):
'info',
)
class AutocompleteAdmin(admin.ModelAdmin):
"""Class used to satisfy an admin check"""
search_fields = ["name"]
class PantryItemAdmin(admin.ModelAdmin):
list_filter = ['category', 'unit', 'min_quantity']
search_fields = ['info', 'name']
search_fields = ['info', 'name', 'category', 'unit']
autocomplete_fields = ['category', 'unit']
inlines = [PantryItemInLine]
# TODO: make category a model
#autocomplete_fields = ['category',]
fields = (
fields = (
'name',
'category',
('min_quantity', 'unit'),
@ -64,3 +71,5 @@ class PantryItemAdmin(admin.ModelAdmin):
admin.site.register(PantryItem, PantryItemAdmin)
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.
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 = (
('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):
# - pantryitems < min_quantity in pantryitemlists
# - shoppinglistitems
# - user ?
# info
# quantity
# unit
# name
def __str__(self):
return self.name
class Unit(models.Model):
"""A unit
e.g. Mililiter
Grams
Roll
Tube
Bag
Bar
Pack
"""
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class PantryItem(models.Model):
# user?
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)
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)
def __str__(self):
@ -52,11 +65,13 @@ class PantryItemLine(models.Model):
quantity = models.IntegerField(default=1)
expiry_date = models.DateField(null=True, blank=True)
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)
def unit(self):
return self.pantry_item.unit
def get_absolute_url(self):
return reverse('pantryitemlinedetail', kwargs={'pk': self.pk})
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 pantry item selection
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")
def add(request):
return render(request, "inventory/add.html")
class Shoppinglist(generic.ListView):
template_name = "inventory/shoppinglist.html"
context_object_name = 'pis'
@ -30,14 +27,9 @@ class Shoppinglist(generic.ListView):
#return PantryItemLine.objects.filter(quantity__lt=F('pantry_item__min_quantity'))
class Expirations(generic.ListView):
template_name = "inventory/expirations.html"
context_object_name = 'pis'
def get_queryset(self):
return PantryItemLine.objects.exclude(expiry_date__isnull=True).order_by('expiry_date')
class DetailView(generic.DetailView):
model = PantryItemLine