From a4e58a5fa455c261167bc3a96264060b944fc8ae Mon Sep 17 00:00:00 2001 From: Maximilian Friedersdorff Date: Tue, 25 Jun 2024 20:59:37 +0100 Subject: [PATCH] A bunch of progress --- config/settings/base.py | 4 +- config/urls.py | 3 +- reinheit/apps/brew/models.py | 10 ++++- reinheit/apps/brew/urls.py | 5 ++- reinheit/apps/brew/views.py | 10 +++-- reinheit/static/img/brand.png | Bin 0 -> 6682 bytes reinheit/templates/base.html | 54 ++++++++++++++++++++++- reinheit/templates/brew/brew_detail.html | 12 +++++ reinheit/templates/brew/brew_list.html | 15 ++++--- requirements/base.in | 1 + requirements/base.txt | 34 ++++++++++++++ 11 files changed, 130 insertions(+), 18 deletions(-) create mode 100644 reinheit/static/img/brand.png create mode 100644 reinheit/templates/brew/brew_detail.html diff --git a/config/settings/base.py b/config/settings/base.py index 8086e41..9c87e0d 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -37,6 +37,7 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "django.contrib.humanize", "django_bootstrap5", "reinheit.apps.brew", "reinheit.apps.styles", @@ -58,7 +59,7 @@ ROOT_URLCONF = "config.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [BASE_DIR/"reinheit"/"templates"], + "DIRS": [BASE_DIR / "reinheit" / "templates"], "APP_DIRS": True, "OPTIONS": { "context_processors": [ @@ -120,6 +121,7 @@ USE_TZ = True # https://docs.djangoproject.com/en/5.0/howto/static-files/ STATIC_URL = "static/" +STATICFILES_DIRS = [BASE_DIR / "reinheit" / "static"] # Default primary key field type # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field diff --git a/config/urls.py b/config/urls.py index b830bd4..8a4ad6d 100644 --- a/config/urls.py +++ b/config/urls.py @@ -3,6 +3,5 @@ from django.contrib import admin urlpatterns = [ path("admin/", admin.site.urls), - - path("brews/", include(("reinheit.apps.brew.urls", "brew"), namespace="brews")) + path("brews/", include(("reinheit.apps.brew.urls", "brew"), namespace="brews")), ] diff --git a/reinheit/apps/brew/models.py b/reinheit/apps/brew/models.py index f1c74ac..14e66c3 100644 --- a/reinheit/apps/brew/models.py +++ b/reinheit/apps/brew/models.py @@ -27,10 +27,18 @@ class Brew(models.Model): class Addition(models.Model): ingredient = models.ForeignKey("ingredients.Ingredient", on_delete=models.PROTECT) - brew = models.ForeignKey("Brew", on_delete=models.CASCADE) + brew = models.ForeignKey("Brew", on_delete=models.CASCADE, related_name="additions") mass = models.FloatField(help_text="The mass in kg added") added = models.DateTimeField(null=True) + @property + def unit(self): + return "g" if self.mass < 0.5 else "kg" + + @property + def humanised_mass(self): + return 1000 * self.mass if self.mass < 0.5 else self.mass + def __str__(self): return f"{self.mass}kg of {self.ingredient} in {self.brew}" diff --git a/reinheit/apps/brew/urls.py b/reinheit/apps/brew/urls.py index b6936ab..2ea2be7 100644 --- a/reinheit/apps/brew/urls.py +++ b/reinheit/apps/brew/urls.py @@ -1,7 +1,8 @@ from django.urls import path -from .views import BrewListView +from .views import BrewListView, BrewView urlpatterns = [ - path("brews/", BrewListView.as_view(), name="list") + path("brews/", BrewListView.as_view(), name="list"), + path("brews//", BrewView.as_view(), name="brew"), ] diff --git a/reinheit/apps/brew/views.py b/reinheit/apps/brew/views.py index 09ec38c..39060a0 100644 --- a/reinheit/apps/brew/views.py +++ b/reinheit/apps/brew/views.py @@ -1,4 +1,4 @@ -from django.views.generic import ListView +from django.views.generic import ListView, DetailView from .models import Brew @@ -8,7 +8,9 @@ from .models import Brew class BrewListView(ListView): model = Brew + +class BrewView(DetailView): + model = Brew + def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) - print(context) - return context + return super().get_context_data(ingredients=self.object.additions.all(), **kwargs) diff --git a/reinheit/static/img/brand.png b/reinheit/static/img/brand.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc8bc3efbdea2d184af64ea9257f4bc3ce2c7db GIT binary patch literal 6682 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 literal 0 HcmV?d00001 diff --git a/reinheit/templates/base.html b/reinheit/templates/base.html index 90531a4..1079dd5 100644 --- a/reinheit/templates/base.html +++ b/reinheit/templates/base.html @@ -1,2 +1,52 @@ - - +{% extends 'django_bootstrap5/bootstrap5.html' %} +{% load static %} +{% block bootstrap5_extra_head %} + +{% endblock %} +{% block bootstrap5_title %}Reinheit{% endblock %} +{% block bootstrap5_before_content %} + {% block nav %} + + {% endblock nav %} +{% endblock %} +{% block bootstrap5_content %} +
+
+
+ {% block content %} + {% endblock content %} +
+
+
+{% endblock bootstrap5_content %} +{% block bootstrap5_after_content %} + +{% endblock bootstrap5_after_content %} diff --git a/reinheit/templates/brew/brew_detail.html b/reinheit/templates/brew/brew_detail.html new file mode 100644 index 0000000..392d93a --- /dev/null +++ b/reinheit/templates/brew/brew_detail.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% block content %} +

{{ object.name }}

+

{{ object.style }}

+

{{ object.notes }}

+

Ingredients

+
    + {% for ingredient in ingredients %} +
  • {{ ingredient.humanised_mass }}{{ ingredient.unit }} of {{ ingredient.ingredient.name }}
  • + {% endfor %} +
+{% endblock content %} diff --git a/reinheit/templates/brew/brew_list.html b/reinheit/templates/brew/brew_list.html index 79152df..247ab2b 100644 --- a/reinheit/templates/brew/brew_list.html +++ b/reinheit/templates/brew/brew_list.html @@ -1,8 +1,11 @@ -{% include "base.html" %} - +{% extends "base.html" %} {% block content %} - {% for brew in brew_list %} - {{ brew }} - {% endfor %} - + {% endblock content %} diff --git a/requirements/base.in b/requirements/base.in index 37d30e1..c250a95 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -1,2 +1,3 @@ django django-bootstrap5 +djlint diff --git a/requirements/base.txt b/requirements/base.txt index f86b21e..8764152 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -2,11 +2,45 @@ # uv pip compile requirements/base.in asgiref==3.8.1 # via django +click==8.1.7 + # via djlint +colorama==0.4.6 + # via djlint +cssbeautifier==1.15.1 + # via djlint django==5.0.6 # via # -r requirements/base.in # django-bootstrap5 django-bootstrap5==24.2 # via -r requirements/base.in +djlint==1.34.1 + # via -r requirements/base.in +editorconfig==0.12.4 + # via + # cssbeautifier + # jsbeautifier +html-tag-names==0.1.2 + # via djlint +html-void-elements==0.1.0 + # via djlint +jsbeautifier==1.15.1 + # via + # cssbeautifier + # djlint +json5==0.9.25 + # via djlint +pathspec==0.12.1 + # via djlint +pyyaml==6.0.1 + # via djlint +regex==2023.12.25 + # via djlint +six==1.16.0 + # via + # cssbeautifier + # jsbeautifier sqlparse==0.5.0 # via django +tqdm==4.66.4 + # via djlint