From 326de9444dfb3704d2deff64c30fafaf6f300cc3 Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Tue, 22 Dec 2020 21:35:05 +0100 Subject: [PATCH] Allow for customization of workflow --- inventory/admin/__init__.py | 3 +- inventory/admin/settings.py | 21 ++++++ .../migrations/0004_auto_20201222_1858.py | 28 ++++++++ inventory/migrations/0005_settings.py | 27 ++++++++ inventory/models/__init__.py | 1 + inventory/models/area.py | 1 + inventory/models/container.py | 6 +- inventory/models/item.py | 3 +- inventory/models/manufacturer.py | 2 +- inventory/models/settings.py | 18 ++++++ inventory/models/workshop.py | 1 + inventory/static/inventory/css/cell.css | 3 + inventory/static/inventory/css/main.css | 64 +++++++++++++------ .../static/inventory/img/star-filled.svg | 1 + .../static/inventory/img/star-outline.svg | 1 + inventory/templates/base.html | 9 +++ .../templates/inventory/area_detail.html | 42 ++++++------ inventory/templates/inventory/box-detail.html | 18 ++++++ .../templates/inventory/box-generic.html | 10 +-- .../templates/inventory/box-ikea-samla.html | 14 +--- .../templates/inventory/box-raaco-even.html | 14 +--- .../templates/inventory/box-raaco-simple.html | 14 +--- .../templates/inventory/box-smd-box-all.html | 14 +--- inventory/templates/inventory/set_index.html | 15 +++++ .../templates/inventory/workshop_detail.html | 40 +++++++----- .../templates/inventory/workshop_list.html | 3 +- inventory/urls.py | 3 +- inventory/views/__init__.py | 11 ++++ inventory/views/area.py | 4 +- inventory/views/box.py | 4 +- inventory/views/index.py | 30 +++++++++ inventory/views/utils.py | 11 ++++ inventory/views/workshop.py | 7 +- inventory_project/urls.py | 1 - 34 files changed, 315 insertions(+), 129 deletions(-) create mode 100644 inventory/admin/settings.py create mode 100644 inventory/migrations/0004_auto_20201222_1858.py create mode 100644 inventory/migrations/0005_settings.py create mode 100644 inventory/models/settings.py create mode 100644 inventory/static/inventory/img/star-filled.svg create mode 100644 inventory/static/inventory/img/star-outline.svg create mode 100644 inventory/templates/inventory/box-detail.html create mode 100644 inventory/templates/inventory/set_index.html create mode 100644 inventory/views/index.py create mode 100644 inventory/views/utils.py diff --git a/inventory/admin/__init__.py b/inventory/admin/__init__.py index b98df51..8a1cedb 100644 --- a/inventory/admin/__init__.py +++ b/inventory/admin/__init__.py @@ -4,4 +4,5 @@ from .layout import LayoutAdmin from .item import ItemAdmin from .manufacturer import ManufacturerAdmin from .form_factor import FormFactorAdmin -from .tag import TagAdmin \ No newline at end of file +from .tag import TagAdmin +from .settings import SettingsAdmin \ No newline at end of file diff --git a/inventory/admin/settings.py b/inventory/admin/settings.py new file mode 100644 index 0000000..5b2adcc --- /dev/null +++ b/inventory/admin/settings.py @@ -0,0 +1,21 @@ +from typing import Optional, TypeVar +from django.db.models import Model +from django.http.request import HttpRequest +from django.contrib import admin + +from inventory.models import Settings + + +_ModelT = TypeVar("_ModelT", bound=Model) + + +class SettingsAdmin(admin.ModelAdmin): + + def has_add_permission(self, request: HttpRequest) -> bool: + return False + + def has_delete_permission(self, request: HttpRequest, obj: Optional[_ModelT] = None) -> bool: + return False + + +admin.site.register(Settings, SettingsAdmin) diff --git a/inventory/migrations/0004_auto_20201222_1858.py b/inventory/migrations/0004_auto_20201222_1858.py new file mode 100644 index 0000000..87071cd --- /dev/null +++ b/inventory/migrations/0004_auto_20201222_1858.py @@ -0,0 +1,28 @@ +# Generated by Django 3.1.4 on 2020-12-22 18:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0003_item_size'), + ] + + operations = [ + migrations.AddField( + model_name='area', + name='show_sub_area', + field=models.BooleanField(default=True, help_text='Allow sub-areas to be defined in this area'), + ), + migrations.AddField( + model_name='workshop', + name='show_boxes', + field=models.BooleanField(default=True, help_text='Allow boxes to be defined directly in this workshop'), + ), + migrations.AlterField( + model_name='item', + name='size', + field=models.PositiveIntegerField(default=1, help_text='Number of sub-compartments this item takes up'), + ), + ] diff --git a/inventory/migrations/0005_settings.py b/inventory/migrations/0005_settings.py new file mode 100644 index 0000000..7100482 --- /dev/null +++ b/inventory/migrations/0005_settings.py @@ -0,0 +1,27 @@ +# Generated by Django 3.1.4 on 2020-12-22 19:29 + +from django.db import migrations, models +import django.db.models.deletion + + +def create_settings(apps, schema_editor): + Settings = apps.get_model('inventory', 'Settings') + Settings.objects.create(default_container=None) + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0004_auto_20201222_1858'), + ] + + operations = [ + migrations.CreateModel( + name='Settings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('default_container', models.ForeignKey(blank=True, default=None, help_text='Default container to display when calling the index page', null=True, on_delete=django.db.models.deletion.SET_NULL, to='inventory.container')), + ], + ), + migrations.RunPython(create_settings) + ] diff --git a/inventory/models/__init__.py b/inventory/models/__init__.py index 0712dd8..44f3a26 100644 --- a/inventory/models/__init__.py +++ b/inventory/models/__init__.py @@ -9,3 +9,4 @@ from .manufacturer import Manufacturer from .tag import Tag from .workshop import Workshop from .container import Container, CanBeContained +from .settings import Settings \ No newline at end of file diff --git a/inventory/models/area.py b/inventory/models/area.py index 38caaff..b475a82 100644 --- a/inventory/models/area.py +++ b/inventory/models/area.py @@ -6,6 +6,7 @@ from .container import Container, CanBeContained class Area(CanBeContained, Container): name = models.CharField(max_length=255, unique=True) description = models.CharField(max_length=4096) + show_sub_area = models.BooleanField(default=True, help_text="Allow sub-areas to be defined in this area") created_at = models.DateTimeField(auto_now_add=True) changed_at = models.DateTimeField(auto_now=True) diff --git a/inventory/models/container.py b/inventory/models/container.py index c626151..bfb81fb 100644 --- a/inventory/models/container.py +++ b/inventory/models/container.py @@ -1,4 +1,3 @@ -from django.urls import reverse from django.db import models from django.apps import apps @@ -30,6 +29,9 @@ class Container(models.Model): @property def url(self): + _, obj = self.subclass + if obj is not None: + return obj.url return None @@ -48,4 +50,4 @@ class CanBeContained(models.Model): @property def container_url(self): _, obj = self.container.subclass - return obj.url \ No newline at end of file + return obj.url diff --git a/inventory/models/item.py b/inventory/models/item.py index 8682d0a..98fca0f 100644 --- a/inventory/models/item.py +++ b/inventory/models/item.py @@ -1,5 +1,4 @@ from django.db import models -from django.contrib.postgres.fields import JSONField, ArrayField from .container import CanBeContained @@ -23,4 +22,4 @@ class Item(CanBeContained): tags = models.ManyToManyField('inventory.Tag', blank=True) def __str__(self): - return self.name \ No newline at end of file + return self.name diff --git a/inventory/models/manufacturer.py b/inventory/models/manufacturer.py index 9cb4e9c..3db5c60 100644 --- a/inventory/models/manufacturer.py +++ b/inventory/models/manufacturer.py @@ -11,4 +11,4 @@ class Manufacturer(models.Model): icon = models.ImageField(null=True, blank=True) def __str__(self): - return self.name \ No newline at end of file + return self.name diff --git a/inventory/models/settings.py b/inventory/models/settings.py new file mode 100644 index 0000000..a4950f2 --- /dev/null +++ b/inventory/models/settings.py @@ -0,0 +1,18 @@ +from django.db import models + + +class Settings(models.Model): + default_container = models.ForeignKey( + 'inventory.Container', + on_delete=models.SET_NULL, + default=None, + null=True, + blank=True, + help_text='Default container to display when calling the index page' + ) + + def __str__(self): + return 'Settings' + + class Meta: + verbose_name_plural = 'Settings' diff --git a/inventory/models/workshop.py b/inventory/models/workshop.py index 29d1a18..cbcb9cf 100644 --- a/inventory/models/workshop.py +++ b/inventory/models/workshop.py @@ -6,6 +6,7 @@ from .container import Container class Workshop(Container): name = models.CharField(max_length=255, unique=True) description = models.CharField(max_length=4096) + show_boxes = models.BooleanField(default=True, help_text="Allow boxes to be defined directly in this workshop") created_at = models.DateTimeField(auto_now_add=True) changed_at = models.DateTimeField(auto_now=True) diff --git a/inventory/static/inventory/css/cell.css b/inventory/static/inventory/css/cell.css index 67747ba..b940651 100644 --- a/inventory/static/inventory/css/cell.css +++ b/inventory/static/inventory/css/cell.css @@ -10,12 +10,15 @@ tr { right: 0; top: 0; bottom: 0; + min-width: 100px; + min-height: 75px; } .cell { flex-grow: 1; display: inline-block; position: relative; + } .cell:nth-child(2n) { diff --git a/inventory/static/inventory/css/main.css b/inventory/static/inventory/css/main.css index d28e233..6d7aa74 100644 --- a/inventory/static/inventory/css/main.css +++ b/inventory/static/inventory/css/main.css @@ -54,11 +54,11 @@ table.box th { nav { display: flex; + align-items: baseline; justify-content: space-between; background-color: #292981; color: #ffffff; padding: 20px; - margin-bottom: 20px; } nav form { @@ -73,6 +73,12 @@ nav button { padding: 8px 10px 8px 10px; } +nav .icon-only-button { + border: none; + background-color: transparent; + +} + h1 { margin-top: 20px; } @@ -103,29 +109,29 @@ nav .icon { filter: invert(); } -main { - margin: auto; +nav ul { + margin: 0; + padding: 0; + display: inline-block; } -@media (min-width: 1025px) { - h1, h2 { - width: 80%; - } +nav ul li { + display: inline-block; + text-indent: 0; + margin: 0; + padding: 0 10px 0 0; +} - main { - width: 80%; - } +nav .spacer { + flex-grow: 2; +} + +main { + margin: auto; + padding: 20px; } @media (max-width: 1024px) { - h1, h2 { - width: 95%; - } - - main { - width: 95%; - } - body { font-size: 12px; } @@ -144,4 +150,24 @@ h2 .icon { width: 25px; height: 25px; top: 3px; -} \ No newline at end of file +} + +ul.nav-list { + display: flex; + flex-direction: column; + flex-wrap: wrap; + height: 100%; + width: 30%; + margin: 0; + padding: 0; +} + +ul.nav-list li { + display: flex; + justify-content: space-between; + border: 1px solid black; + margin-bottom: -1px; + padding: 10px; + text-indent: 0; + list-style-type: none; +} diff --git a/inventory/static/inventory/img/star-filled.svg b/inventory/static/inventory/img/star-filled.svg new file mode 100644 index 0000000..7533196 --- /dev/null +++ b/inventory/static/inventory/img/star-filled.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/inventory/static/inventory/img/star-outline.svg b/inventory/static/inventory/img/star-outline.svg new file mode 100644 index 0000000..5fe0693 --- /dev/null +++ b/inventory/static/inventory/img/star-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/inventory/templates/base.html b/inventory/templates/base.html index 66c3f92..6c48e1a 100644 --- a/inventory/templates/base.html +++ b/inventory/templates/base.html @@ -13,6 +13,15 @@ {% block header_bar %} {% endblock %} + +
+
+ + + {% if user.is_authenticated %}
{% csrf_token %} diff --git a/inventory/templates/inventory/area_detail.html b/inventory/templates/inventory/area_detail.html index f7ab7e0..60d5614 100644 --- a/inventory/templates/inventory/area_detail.html +++ b/inventory/templates/inventory/area_detail.html @@ -9,28 +9,34 @@ {{ area.description}} {% endblock %} +{% block header_icons %} + {% include 'inventory/set_index.html' with item=area is_index=is_index %} +{% endblock %} + {% block content %} -

Areas

- + {% if area.show_sub_area %} +

Areas

+ - {% if user.is_staff %} -

Create new area...

+ {% if user.is_staff %} +

Create new area...

+ {% endif %} {% endif %} -

Boxes

-