Skip to content

Commit

Permalink
Fix #9: add comment functionality
Browse files Browse the repository at this point in the history
  • Loading branch information
Godsmith committed Nov 17, 2021
1 parent 22e9a82 commit 81381d1
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 5 deletions.
46 changes: 46 additions & 0 deletions planner/migrations/0006_comment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Generated by Django 3.2.9 on 2021-11-17 19:32

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),
("planner", "0005_auto_20211117_2002"),
]

operations = [
migrations.CreateModel(
name="Comment",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("text", models.TextField(blank=True, max_length=200)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"author",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
(
"meal",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="planner.meal"
),
),
],
),
]
8 changes: 8 additions & 0 deletions planner/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,11 @@ def weekday_name(self) -> str:

def text(self) -> str:
return self.MEAL_NAME_DELIMITER.join(meal.name for meal in self.meals.all())


class Comment(models.Model):
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
meal = models.ForeignKey(Meal, on_delete=models.CASCADE)
text = models.TextField(max_length=200, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
8 changes: 8 additions & 0 deletions planner/templates/planner/createcomment.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{% extends 'base.html' %}

{% block content %}
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
{% endblock %}
11 changes: 11 additions & 0 deletions planner/templates/planner/meal_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,17 @@ <h2>{{ object.name }}
<th scope="row">Steps</th>
<td>{{ object.steps|linebreaks }}</td>
</tr>
<tr>
<th scope="row">Comments<br><a class="btn btn-light" href="{% url 'planner:createcomment' pk=object.id %}">
<i class="bi bi-chat-left-text"></i>
</a></th>
<td>
{% for comment in object.comment_set.all %}
<div>{{ comment.author }} {{ comment.created_at }}</div>
<div>{{ comment.text|linebreaks }}</div>
{% endfor %}
</td>
</tr>
</tbody>
</table>
{% endblock %}
14 changes: 13 additions & 1 deletion planner/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def setUp(self):
self.day = Day.objects.create(date=timezone.now().date(), user=user1)
self.client.login(username="user1", password="user1")

def test_shows_properties(self):
def test_shows_all_properties(self):
response = self.client.get(
reverse("planner:showmeal", kwargs={"pk": self.meal.pk})
)
Expand All @@ -93,3 +93,15 @@ def test_shows_properties(self):
]:
with self.subTest():
self.assertIn(text, str(response.content))

def test_posting_comment_shows_that_comment(self):
self.client.post(
reverse("planner:createcomment", kwargs={"pk": self.meal.pk}),
data={"text": "My comment text"},
)
response = self.client.get(
reverse("planner:showmeal", kwargs={"pk": self.meal.pk})
)
for text in ["user1", "My comment text"]:
with self.subTest():
self.assertIn(text, str(response.content))
5 changes: 5 additions & 0 deletions planner/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,9 @@
path("day/<date>", views.DayView.as_view(), name="day"),
path("meal/edit/<slug:pk>", views.MealUpdateView.as_view(), name="updatemeal"),
path("meal/show/<slug:pk>", views.MealDetailView.as_view(), name="showmeal"),
path(
"meal/comment/<slug:pk>",
views.CommentCreateView.as_view(),
name="createcomment",
),
]
29 changes: 25 additions & 4 deletions planner/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
from typing import List

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.shortcuts import render, get_object_or_404
from django.urls import reverse
from django.views import View
from django.views.generic import UpdateView, DetailView
from django.views.generic import UpdateView, DetailView, CreateView

from .models import Day, Meal
from .models import Day, Meal, Comment


def index(request):
Expand All @@ -32,7 +32,9 @@ class MealUpdateView(UpdateView):
model = Meal
template_name = "planner/updatemeal.html"
fields = ["name", "source", "persons", "time", "ingredients", "steps"]
success_url = "/" # reverse("index") # this does not work for some reason
success_url = (
"/" # reverse("index") # this does not work; must be in get_success_url
)

def form_valid(self, form):
"""Add author to the created Meal object, since it is a mandatory field"""
Expand Down Expand Up @@ -78,3 +80,22 @@ def post(self, request, *args, **kwargs):
day.meals.set(meals)

return HttpResponseRedirect(reverse("planner:index"))


class CommentCreateView(CreateView):
model = Comment
template_name = "planner/createcomment.html"
fields = ["text"]

def get_success_url(self):
return reverse("planner:showmeal", kwargs={"pk": self.kwargs["pk"]})

def form_valid(self, form):
"""Add author to the created Meal object, since it is a mandatory field"""
form.instance.author = self.request.user

meal_pk = self.kwargs["pk"]
meal = get_object_or_404(Meal, pk=meal_pk)
form.instance.meal = meal

return super().form_valid(form)

0 comments on commit 81381d1

Please sign in to comment.