diff --git a/recipes/admin.py b/recipes/admin.py index 8c38f3f..1542b98 100644 --- a/recipes/admin.py +++ b/recipes/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import Recipe, Version, Ingredient -# Register your models here. +admin.site.register(Recipe) +admin.site.register(Version) +admin.site.register(Ingredient) diff --git a/recipes/models.py b/recipes/models.py index 71a8362..cc18b98 100644 --- a/recipes/models.py +++ b/recipes/models.py @@ -1,3 +1,34 @@ from django.db import models +from django.contrib.auth.models import User +from django.urls import reverse -# Create your models here. +class Recipe(models.Model): + title = models.CharField(max_length=100, null=False, blank=False) + slug = models.SlugField(unique=True) + + def __str__(self) -> str: + return self.title + + def get_absolute_url(self): + return reverse('recipe', kwargs={'slug': self.slug}) + +class Version(models.Model): + label = models.CharField(max_length=20, default='Original') + slug = models.SlugField(max_length=20, default='original') + body = models.TextField(null=True, blank=True) + author_user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) + author_name = models.CharField(max_length=30, blank=True) + recipe = models.ForeignKey(Recipe, on_delete=models.PROTECT, null=False, blank=False, related_name='versions') + + def __str__(self) -> str: + return self.recipe.title + ' - ' + self.label + + def get_absolute_url(self): + return reverse('version', kwargs={'slug_recipe': self.recipe.slug, 'slug_version': self.slug}) + +class Ingredient(models.Model): + text = models.CharField(max_length=50, null=False, blank=False) + version = models.ForeignKey(Version, on_delete=models.CASCADE, null=False, blank=False, related_name='ingredients') + + def __str__(self) -> str: + return self.text + ' for ' + str(self.version) diff --git a/recipes/templates/recipe.html b/recipes/templates/recipe.html new file mode 100644 index 0000000..2b4de35 --- /dev/null +++ b/recipes/templates/recipe.html @@ -0,0 +1,10 @@ +{% extends "base_main.html" %} +{% block title %}{{ recipe.title }}{% endblock %} +{% block main %} +

{{ recipe.title }}

+ +{% endblock %} diff --git a/recipes/templates/recipes.html b/recipes/templates/recipes.html new file mode 100644 index 0000000..d5ee768 --- /dev/null +++ b/recipes/templates/recipes.html @@ -0,0 +1,12 @@ +{% extends "base_main.html" %} +{% block title %}Recipes{% endblock %} +{% block main %} +

Recipes

+ {% if perms.recipes.view_recipe %} + + {% endif %} +{% endblock %} diff --git a/recipes/templates/version.html b/recipes/templates/version.html new file mode 100644 index 0000000..8c926d4 --- /dev/null +++ b/recipes/templates/version.html @@ -0,0 +1,14 @@ +{% extends "base_main.html" %} +{% block title %}{{ recipe.title }}{% endblock %} +{% block main %} +

{{ version.recipe.title }} ({{ version.label }})

+{% if has_multiple_versions %} + +{% endif %} + +

{{ version.body }}

+{% endblock %} diff --git a/recipes/urls.py b/recipes/urls.py new file mode 100644 index 0000000..a0c7f45 --- /dev/null +++ b/recipes/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.recipes, name='recipes'), + path('//', views.version, name='version'), + path('/', views.recipe, name='recipe'), +] diff --git a/recipes/views.py b/recipes/views.py index 91ea44a..08588ec 100644 --- a/recipes/views.py +++ b/recipes/views.py @@ -1,3 +1,36 @@ -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404 +from .models import Recipe, Version +from django.contrib.auth.decorators import login_required, permission_required +from django.urls import reverse +from django.http.response import HttpResponseRedirect +from django.conf import settings -# Create your views here. +@login_required +@permission_required('recipes.view_recipe') +def recipes(request): + recipes = Recipe.objects.all() + return render(request, 'recipes.html', context={'recipes': recipes}) + +@login_required +@permission_required('recipes.view_recipe') +def version(request, slug_recipe, slug_version): + recipe = get_object_or_404(Recipe, slug=slug_recipe) + has_multiple_versions = recipe.versions.all().count() > 1 # type: ignore + version = get_object_or_404(Version, recipe=recipe, slug=slug_version) + ingredients = version.ingredients.all() # type: ignore + + return render(request, 'version.html', context={'recipe': recipe, 'has_multiple_versions': has_multiple_versions, 'version': version, 'ingredients': ingredients}) + +@login_required +@permission_required('recipes.view_recipe') +def recipe(request, slug): + recipe = get_object_or_404(Recipe, slug=slug) + versions = recipe.versions.all() # type: ignore + + if (1 == versions.count()): + if settings.ENFORCE_RECIPE_VERSION_URL: + return HttpResponseRedirect(reverse('version', kwargs={'slug_recipe': slug, 'slug_version': versions.get().slug})) + else: + return version(request, slug, versions.get().slug) + else: + return render(request, 'recipe.html', context={'recipe': recipe, 'versions': versions}) diff --git a/stadlbauer/settings.py b/stadlbauer/settings.py index 039af39..c754490 100644 --- a/stadlbauer/settings.py +++ b/stadlbauer/settings.py @@ -101,9 +101,15 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] +# Project specific + LOGIN_REDIRECT_URL = '/' LOGOUT_REDIRECT_URL = '/' +# Recipes specific + +ENFORCE_RECIPE_VERSION_URL = False + # Internationalization # https://docs.djangoproject.com/en/4.1/topics/i18n/ diff --git a/stadlbauer/urls.py b/stadlbauer/urls.py index 3f80979..2a9787c 100644 --- a/stadlbauer/urls.py +++ b/stadlbauer/urls.py @@ -19,6 +19,7 @@ from . import views urlpatterns = [ path('', views.index, name='index'), + path('recipes/', include('recipes.urls')), path('admin/', admin.site.urls), path('accounts/new-user/', views.new_user, name='new-user'), path('accounts/profile/', views.profile, name='profile'), diff --git a/templates/base_main.html b/templates/base_main.html index 65bbc33..42750a6 100644 --- a/templates/base_main.html +++ b/templates/base_main.html @@ -17,6 +17,9 @@
  • Create account
  • {% endif %} +
      + {% if perms.recipes %}
    • Recipes
    • {% endif %} +
    {% block main %} diff --git a/templates/index.html b/templates/index.html index f832f16..202c06b 100644 --- a/templates/index.html +++ b/templates/index.html @@ -2,4 +2,9 @@ {% block title %}Barn{% endblock %} {% block main %}

    Barn

    +
      + {% if perms.recipes %} +
    • Recipes

    • + {% endif %} +
    {% endblock %}