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 %}
+
+ {% for i in ingredients %}
+ - {{ i.text }}
+ {% endfor %}
+
+{{ 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 %}
+
+ {% endif %}
+
{% endblock %}