From 2dee280af99ddd248e6389b5f05ffb689f5bf13b Mon Sep 17 00:00:00 2001 From: jtweeder Date: Sun, 9 Jul 2023 22:44:21 -0500 Subject: [PATCH 1/3] build back end for post publication --- stewpot/admin.py | 11 +++ .../0002_meal_posting_share_meal_posting.py | 30 ++++++ .../0003_meal_posting_created_on.py | 20 ++++ stewpot/models.py | 14 +++ stewpot/test_stewpot.py | 17 ++++ stewpot/urls.py | 1 + stewpot/views.py | 25 ++++- templates/stewpot/meal_post.html | 97 +++++++++++++++++++ 8 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 stewpot/migrations/0002_meal_posting_share_meal_posting.py create mode 100644 stewpot/migrations/0003_meal_posting_created_on.py create mode 100644 templates/stewpot/meal_post.html diff --git a/stewpot/admin.py b/stewpot/admin.py index 8c38f3f..60721c5 100644 --- a/stewpot/admin.py +++ b/stewpot/admin.py @@ -1,3 +1,14 @@ from django.contrib import admin +from .models import meal_posting, share_meal # Register your models here. +class meal_postingAdmin(admin.ModelAdmin): + class meta: + model = meal_posting + +class share_mealAdmin(admin.ModelAdmin): + class meta: + model = share_meal + +admin.site.register(meal_posting, meal_postingAdmin) +admin.site.register(share_meal, share_mealAdmin) \ No newline at end of file diff --git a/stewpot/migrations/0002_meal_posting_share_meal_posting.py b/stewpot/migrations/0002_meal_posting_share_meal_posting.py new file mode 100644 index 0000000..6111f53 --- /dev/null +++ b/stewpot/migrations/0002_meal_posting_share_meal_posting.py @@ -0,0 +1,30 @@ +# Generated by Django 4.0.1 on 2023-07-09 21:37 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('stewpot', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='meal_posting', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=255)), + ('text', models.TextField()), + ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.AddField( + model_name='share_meal', + name='posting', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='stewpot.meal_posting'), + ), + ] diff --git a/stewpot/migrations/0003_meal_posting_created_on.py b/stewpot/migrations/0003_meal_posting_created_on.py new file mode 100644 index 0000000..ab69274 --- /dev/null +++ b/stewpot/migrations/0003_meal_posting_created_on.py @@ -0,0 +1,20 @@ +# Generated by Django 4.0.1 on 2023-07-10 03:07 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('stewpot', '0002_meal_posting_share_meal_posting'), + ] + + operations = [ + migrations.AddField( + model_name='meal_posting', + name='created_on', + field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), + preserve_default=False, + ), + ] diff --git a/stewpot/models.py b/stewpot/models.py index 4fd6620..26cc573 100644 --- a/stewpot/models.py +++ b/stewpot/models.py @@ -3,9 +3,23 @@ from django.contrib.auth.models import User +class meal_posting(models.Model): + title = models.CharField(max_length=255) + creator = models.ForeignKey(User, on_delete=models.CASCADE) + text = models.TextField() + created_on = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return self.title + + class share_meal(models.Model): title = models.CharField(max_length=255) creator = models.ForeignKey(User, on_delete=models.CASCADE) text = models.TextField() meal = models.ForeignKey(mstr_recipe, on_delete=models.CASCADE) created_on = models.DateTimeField(auto_now_add=True) + posting = models.ForeignKey(meal_posting, null=True, on_delete=models.CASCADE) + + def __str__(self): + return self.title \ No newline at end of file diff --git a/stewpot/test_stewpot.py b/stewpot/test_stewpot.py index aeaf75a..3bb2d98 100644 --- a/stewpot/test_stewpot.py +++ b/stewpot/test_stewpot.py @@ -30,6 +30,17 @@ def setUp(self): text='shared meal test', meal=self.tst_recipe) ) + self.meal_posting = (models.meal_posting + .objects.create(title='Test Posting', + creator=self.tst_user, + text='A Test Posting Post') + ) + self.share_meal_posting = (models.share_meal + .objects.create(title='PostingTest', + creator=self.tst_user, + text='Posting Meal Test', + meal=self.tst_recipe) + ) self.factory = RequestFactory() @@ -41,3 +52,9 @@ def test_share_start(self): request.user = self.tst_user response = views.start_share(request, self.tst_recipe.meal_id) self.assertEqual(response.status_code, 200) + + def test_posting(self): + request = self.factory.get(f'share/post') + request.user = self.tst_user + response = views.view_share(request, self.meal_posting.id) + self.assertEqual(response.status_code, 200) \ No newline at end of file diff --git a/stewpot/urls.py b/stewpot/urls.py index b56ed18..650ba6f 100644 --- a/stewpot/urls.py +++ b/stewpot/urls.py @@ -6,4 +6,5 @@ path('save/', share_views.start_share, name='start-shared'), path('', share_views.save_share, name='save-shared'), path('view/', share_views.view_share, name='view-shared'), + path('post/', share_views.view_posting, name='view-posting'), ] diff --git a/stewpot/views.py b/stewpot/views.py index 159b3d2..c066994 100644 --- a/stewpot/views.py +++ b/stewpot/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render, redirect from django.contrib.auth.decorators import login_required from meals.models import mstr_recipe -from stewpot.models import share_meal +from stewpot.models import share_meal, meal_posting from mealcurator.helperfuncs import check_blank # TODO: Let edits happen for things people shared @@ -56,3 +56,26 @@ def view_share(request, share_id): } template = 'stewpot/share.html' return render(request, template, context) + + +def view_posting(request, post_id): + posting = meal_posting.objects.get(id=post_id) + shared = (share_meal.objects.values('id', + 'title', + 'text', + 'meal_id', + 'meal__title', + 'meal__vegan', + 'meal__vegetarian', + 'meal__meal_time', + 'meal__cooking_time', + 'meal__dish_type', + 'meal__cooking_method', + 'meal__protein_type', + 'meal__rec_url') + .filter(posting=posting)) + + context = {'pp': posting, + 'shared_meals': shared} + template = 'stewpot/meal_post.html' + return render(request, template, context) diff --git a/templates/stewpot/meal_post.html b/templates/stewpot/meal_post.html new file mode 100644 index 0000000..09c2568 --- /dev/null +++ b/templates/stewpot/meal_post.html @@ -0,0 +1,97 @@ +{% extends "base.html" %} +{% load static %} +{% load cooks_extras %} + + +{% block css_style %} +.list{ + text-align: center; +} + +.container { + border-radius: 5px; + padding: 20px; +} + +{% endblock css_style %} + +{% block page_content %} +
+ + +

{{pp.title}}

+

{{pp.text}}

+ +{% for meal in shared_meals %} + +

{{meal.title}}

+ +
+ + + + + + + + + + + + + +
{{ meal.meal__title }}
Vegan: {{ meal.meal__vegan|yesno:"Yes,No" }}Vegetarian: {{ meal.meal__vegetarian|yesno:"Yes,No" }}
Meal Time: + {% if meal.meal__meal_time == 'bk' %} Breakfast + {% elif meal.meal__meal_time == 'lu' %} Lunch + {% elif meal.meal__meal_time == 'di' %} Dinner + {% elif meal.meal__meal_time == 'sd' %} Side Dish + {% elif meal.meal__meal_time == 'de' %} Dessert + {% elif meal.meal__meal_time == 'sn' %} Snack + {% endif %} +
Cooking Time: + {% if meal.meal__cooking_time == '20' %} Less than 20 Minutes + {% elif meal.meal__cooking_time == '40' %} 20 to 40 Minutes + {% elif meal.meal__cooking_time == '60' %} 40 to 60 Minutes + {% elif meal.meal__cooking_time == '61' %} Over 60 Minutes + {% endif %} +
Method: + {% if meal.meal__cooking_method == 'st' %} Stove Top + {% elif meal.meal__cooking_method == 'mi' %} Microwave + {% elif meal.meal__cooking_method == 'bl' %} Blender + {% elif meal.meal__cooking_method == 'gr' %} Grill + {% elif meal.meal__cooking_method == 'ov' %} Oven + {% elif meal.meal__cooking_method == 'pr' %} Pressure Cooker + {% elif meal.meal__cooking_method == 'sc' %} Slow Cooker + {% elif meal.meal__cooking_method == 'af' %} Air Fryer + {% elif meal.meal__cooking_method == 'ra' %} Raw/Uncooked + {% endif %} +
Dish Type: + {% if meal.meal__dish_type == 'sp' %} Soup + {% elif meal.meal__dish_type == 'bk' %} Baked Dish + {% elif meal.meal__dish_type == 'pa' %} Pasta + {% elif meal.meal__dish_type == 'cu' %} Curry + {% elif meal.meal__dish_type == 'ca' %} Casserole + {% elif meal.meal__dish_type == 'st' %} Stew + {% elif meal.meal__dish_type == 'sa' %} Salad + {% elif meal.meal__dish_type == 'lt' %} Light Dish + {% elif meal.meal__dish_type == 'sm' %} Smoothie + {% elif meal.meal__dish_type == 'na' %} Other + {% endif %} +
Protein Type: + {% if meal.meal__protein_type == 'be' %} Beef + {% elif meal.meal__protein_type == 'ch' %} Chicken + {% elif meal.meal__protein_type == 'pb' %} Plant Based + {% elif meal.meal__protein_type == 'se' %} Fish / Shellfish + {% elif meal.meal__protein_type == 'pk' %} Pork + {% elif meal.meal__protein_type == 'na' %} None + {% elif meal.meal__protein_type == 'ot' %} Other + {% endif %} +
+
+

{{meal.text}}

+ +{% endfor %} + +
+{% endblock %} + From 5434e0d765a445685a85a36ef55a7e4949f649f1 Mon Sep 17 00:00:00 2001 From: jtweeder Date: Tue, 11 Jul 2023 21:02:58 -0500 Subject: [PATCH 2/3] centered rec cards --- .gitignore | 1 + templates/stewpot/meal_post.html | 15 ++++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 441efff..f5f2132 100644 --- a/.gitignore +++ b/.gitignore @@ -111,3 +111,4 @@ venv.bak/ manage.py dev_static/ +meals/migrations/__pycache__/__init__.cpython-310.pyc diff --git a/templates/stewpot/meal_post.html b/templates/stewpot/meal_post.html index 09c2568..e5811c0 100644 --- a/templates/stewpot/meal_post.html +++ b/templates/stewpot/meal_post.html @@ -4,14 +4,11 @@ {% block css_style %} -.list{ - text-align: center; -} -.container { - border-radius: 5px; - padding: 20px; -} +#rec { + margin: auto; + padding: 10px + } {% endblock css_style %} @@ -24,9 +21,9 @@

{{pp.title}}

{% for meal in shared_meals %} -

{{meal.title}}

+

{{meal.title}}

-
+
From b546e74d82e3f5c7b218fe8243ad2994674393d5 Mon Sep 17 00:00:00 2001 From: jtweeder Date: Wed, 12 Jul 2023 19:05:05 -0500 Subject: [PATCH 3/3] final touches to launch blog feature --- stewpot/test_stewpot.py | 44 +++++++++++++++++++-------------- stewpot/tests.py | 3 --- stewpot/urls.py | 2 ++ stewpot/views.py | 19 ++++++++------ templates/base.html | 1 + templates/stewpot/postings.html | 28 +++++++++++++++++++++ 6 files changed, 68 insertions(+), 29 deletions(-) delete mode 100644 stewpot/tests.py create mode 100644 templates/stewpot/postings.html diff --git a/stewpot/test_stewpot.py b/stewpot/test_stewpot.py index 3bb2d98..c7491bf 100644 --- a/stewpot/test_stewpot.py +++ b/stewpot/test_stewpot.py @@ -8,22 +8,22 @@ class share_meal(TestCase): def setUp(self): self.tst_user = User.objects.create_user('john', - 'lennon@thebeatles.com', - 'johnpassword') + 'lennon@thebeatles.com', + 'johnpassword') self.tst_recipe = mstr_recipe.objects.create(meal_id=uuid.uuid1(), - title='TestTitle2', - rec_url="https://www.mealcurator.com", - vegan=False, - vegetarian=False, - meal_time='bk', - dish_type='sp', - cooking_method='st', - cooking_time='20', - times_selected=0, - sumreview=0, - numreview=0, - found_words="test" - ) + title='TestTitle2', + rec_url="https://www.mealcurator.com", + vegan=False, + vegetarian=False, + meal_time='bk', + dish_type='sp', + cooking_method='st', + cooking_time='20', + times_selected=0, + sumreview=0, + numreview=0, + found_words="test" + ) self.share_meal = (models.share_meal .objects.create(title='ShareTest', creator=self.tst_user, @@ -34,13 +34,13 @@ def setUp(self): .objects.create(title='Test Posting', creator=self.tst_user, text='A Test Posting Post') - ) + ) self.share_meal_posting = (models.share_meal .objects.create(title='PostingTest', creator=self.tst_user, text='Posting Meal Test', meal=self.tst_recipe) - ) + ) self.factory = RequestFactory() @@ -54,7 +54,13 @@ def test_share_start(self): self.assertEqual(response.status_code, 200) def test_posting(self): - request = self.factory.get(f'share/post') + request = self.factory.get('/share/post') request.user = self.tst_user response = views.view_share(request, self.meal_posting.id) - self.assertEqual(response.status_code, 200) \ No newline at end of file + self.assertEqual(response.status_code, 200) + + def test_blog(self): + request = self.factory.get('/share/post') + request.user = self.tst_user + response = views.home_postings(request) + self.assertEqual(response.status_code, 200) diff --git a/stewpot/tests.py b/stewpot/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/stewpot/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/stewpot/urls.py b/stewpot/urls.py index 650ba6f..3a66921 100644 --- a/stewpot/urls.py +++ b/stewpot/urls.py @@ -7,4 +7,6 @@ path('', share_views.save_share, name='save-shared'), path('view/', share_views.view_share, name='view-shared'), path('post/', share_views.view_posting, name='view-posting'), + path('post/', share_views.home_postings, name='home-postings'), + ] diff --git a/stewpot/views.py b/stewpot/views.py index c066994..472374a 100644 --- a/stewpot/views.py +++ b/stewpot/views.py @@ -8,22 +8,22 @@ # TODO: Let someone add a shared recipe to a list/make a list # TODO: Let Admins make multiple recipes and make a blogpost about them - -# Landing page for capturing title and text from user @login_required def start_share(request, meal_id): + """Landing page for capturing title and text from user""" meal = mstr_recipe.objects.get(meal_id=meal_id) template = 'stewpot/share.html' context = {'meal': meal, 'start': True} return render(request, template, context) - -# Create share_meal and redirect to view of it @login_required def save_share(request): + """Create share_meal and redirect to view of it""" if request.method == 'POST': - shared_title = check_blank(request.POST.get('shared_title'), 'A shared recipe from mealCurator') - shared_text = check_blank(request.POST.get('shared_text'), 'I found this on mealCurator and wanted to share it with you') + shared_title = check_blank(request.POST.get('shared_title'), + 'A shared recipe from mealCurator') + shared_text = check_blank(request.POST.get('shared_text'), + 'I found this on mealCurator and wanted to share it with you') shared_meal = mstr_recipe.objects.get(meal_id=request.POST.get('shared_meal')) shared = share_meal.objects.create( @@ -34,7 +34,6 @@ def save_share(request): ) return redirect('view-shared', shared.id) - # View a shared meal def view_share(request, share_id): shared = (share_meal.objects.values('id', @@ -79,3 +78,9 @@ def view_posting(request, post_id): 'shared_meals': shared} template = 'stewpot/meal_post.html' return render(request, template, context) + +def home_postings(request): + posts = meal_posting.objects.all().order_by('created_on') + context = {'posts': posts} + template = 'stewpot/postings.html' + return render(request, template, context) diff --git a/templates/base.html b/templates/base.html index 29b3e34..8b099f4 100644 --- a/templates/base.html +++ b/templates/base.html @@ -135,6 +135,7 @@ {% block botnavbar %}
{{ meal.meal__title }}
Vegan: {{ meal.meal__vegan|yesno:"Yes,No" }}Vegetarian: {{ meal.meal__vegetarian|yesno:"Yes,No" }}