From c05b7fc3b725a9107e20bc7f6e28c0fe3920017a Mon Sep 17 00:00:00 2001 From: Saul Andre <saulandreee@gmail.com> Date: Mon, 4 May 2020 16:48:30 +0700 Subject: [PATCH] [GREEN] implementing form input for add comment --- app/fixtures/initial.json | 5 - ...430_1749.py => 0002_auto_20200501_1426.py} | 24 ++--- app/migrations/0003_auto_20200504_1246.py | 23 ++++ app/models.py | 19 ++-- app/templates/app/detail_materi.html | 16 +-- app/tests.py | 102 +++++++++++------- app/views.py | 56 +++++----- 7 files changed, 141 insertions(+), 104 deletions(-) rename app/migrations/{0002_auto_20200430_1749.py => 0002_auto_20200501_1426.py} (59%) create mode 100644 app/migrations/0003_auto_20200504_1246.py diff --git a/app/fixtures/initial.json b/app/fixtures/initial.json index 2f354aa..ab0d05b 100644 --- a/app/fixtures/initial.json +++ b/app/fixtures/initial.json @@ -18,10 +18,5 @@ "model": "app.category", "pk": 4, "fields": { "name": "kategori 2", "description": "Sebuah kategori 2" } - }, - { - "model": "app.comment", - "pk": 1, - "fields": { "user": "Admin", "profile": "ffffff", "comment": "Diskusi disini yuk!" } } ] diff --git a/app/migrations/0002_auto_20200430_1749.py b/app/migrations/0002_auto_20200501_1426.py similarity index 59% rename from app/migrations/0002_auto_20200430_1749.py rename to app/migrations/0002_auto_20200501_1426.py index 72d34b1..8ca0633 100644 --- a/app/migrations/0002_auto_20200430_1749.py +++ b/app/migrations/0002_auto_20200501_1426.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.3 on 2020-04-30 10:49 +# Generated by Django 3.0.3 on 2020-05-01 07:26 from django.db import migrations, models import django.db.models.deletion @@ -11,23 +11,23 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RemoveField( + model_name='materi', + name='comments', + ), + migrations.AddField( + model_name='comment', + name='materi', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='app.Materi'), + ), migrations.AlterField( model_name='comment', name='profile', - field=models.CharField(default='dc2050', max_length=100), + field=models.CharField(default='a7f173', max_length=100), ), migrations.AlterField( model_name='comment', name='user', - field=models.CharField(default='558d2f17185f4a0596fe3362549614a2', max_length=100), - ), - migrations.RemoveField( - model_name='materi', - name='comments', - ), - migrations.AddField( - model_name='materi', - name='comments', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='app.Comment'), + field=models.CharField(default='8e66c40ba5d8428b8e6f31ee283cd114', max_length=100), ), ] diff --git a/app/migrations/0003_auto_20200504_1246.py b/app/migrations/0003_auto_20200504_1246.py new file mode 100644 index 0000000..12ee512 --- /dev/null +++ b/app/migrations/0003_auto_20200504_1246.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.3 on 2020-05-04 05:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0002_auto_20200501_1426'), + ] + + operations = [ + migrations.AlterField( + model_name='comment', + name='profile', + field=models.CharField(default='57aa9d', max_length=100), + ), + migrations.AlterField( + model_name='comment', + name='user', + field=models.CharField(default='20c57b83234747c2a7fe3bcf3f484d99', max_length=100), + ), + ] diff --git a/app/models.py b/app/models.py index 93ec045..03a5d45 100644 --- a/app/models.py +++ b/app/models.py @@ -29,15 +29,6 @@ class Category(models.Model): def __str__(self): return self.name - -class Comment(models.Model): - user = models.CharField(max_length=100, default=getRandomUserId()) - profile = models.CharField(max_length=100, default=getRandomColor()) - comment = models.CharField(max_length=150, default="comments") - - def __str__(self): - return self.user - class Materi(models.Model): cover = models.ImageField() content = models.FileField() @@ -47,6 +38,14 @@ class Materi(models.Model): publisher = models.CharField(max_length=30, default="publiser") descriptions = models.TextField(default="descriptions") status = models.CharField(max_length=30, choices=VERIFICATION_STATUS, default=VERIFICATION_STATUS[0]) - comments = models.ForeignKey(Comment, on_delete=models.CASCADE, default=1) categories = models.ManyToManyField(Category) feedback = models.TextField(blank=True, default="") + +class Comment(models.Model): + user = models.CharField(max_length=100, default=getRandomUserId()) + profile = models.CharField(max_length=100, default=getRandomColor()) + comment = models.CharField(max_length=150, default="comments") + materi = models.ForeignKey(Materi, on_delete=models.CASCADE, null=True) + + def __str__(self): + return self.user diff --git a/app/templates/app/detail_materi.html b/app/templates/app/detail_materi.html index 84afa0c..d54b99f 100644 --- a/app/templates/app/detail_materi.html +++ b/app/templates/app/detail_materi.html @@ -85,32 +85,34 @@ Materi <nav class="navbar navbar-expand-sm"> <ul class="navbar-nav"> <li class="nav-item"> - <a class="nav-link" href="#section1">Deskripsi</a> + <a class="nav-link" href="#deskripsi">Deskripsi</a> </li> <li class="nav-item"> - <a class="nav-link" href="#section2">Komentar</a> + <a class="nav-link" href="#komentar">Komentar</a> </li> </ul> </nav> - <div id="section1" class="container-fluid description-wrapper"> + <div id="deskripsi" class="container-fluid description-wrapper"> <h1>Deskripsi</h1> <div class="col col-8 description"> <p>{{materi_data.descriptions}}</p> </div> </div> - <div id="section2" class="container-fluid comments-wrapper"> + <div id="komentar" class="container-fluid comments-wrapper"> <h1>Komentar</h1> <div class="add-comments col col-8 "> <form method="POST"> {% csrf_token %} <div class="form-group"> - <textarea placeholder="komentar..." class="form-control" id="exampleFormControlTextarea1" rows="3" name="comment"></textarea> - </div> + <textarea placeholder="komentar..." class="form-control" + id="exampleFormControlTextarea1" + rows="3" name="comment" required + ></textarea> <button type="submit" class="btn btn-book shadow-sm p-2 mb-1 bg-white rounded">Kirim</button> </div> </form> </div> - {% for comment in materi_data.comments.all %} + {% for comment in comment_data %} <div class="col col-8 comment shadow-sm p-3 mb-1 bg-white rounded"> <div class="d-flex bd-highlight mb-3 align-items-center user"> <span style="background-color: #{{comment.profile}}" class="profile p-1 bd-highligh"></span> diff --git a/app/tests.py b/app/tests.py index 1122f4c..f8eaeae 100644 --- a/app/tests.py +++ b/app/tests.py @@ -1,5 +1,7 @@ import json + +from django.core.files.uploadedfile import SimpleUploadedFile from django.core import serializers from django.test import Client, TestCase from django.urls import resolve @@ -7,6 +9,10 @@ from authentication.models import User from django.core.files import File from .models import Category, Comment, Materi from .views import DaftarKatalog, DetailMateri +from django.contrib.auth import get_user_model + + + class DaftarKatalogTest(TestCase): @@ -62,29 +68,46 @@ class DaftarKatalogTest(TestCase): class DetailMateriTest(TestCase): def setUp(self): - User.objects._create_user(email="alice@acme.com", password="acmecorp", is_admin=True) - User.objects._create_user(email="kontrib@kontrib.com", password="acmecorp", is_contributor=True) - - def get_url_for_detail_materi(): - materi = Materi.objects.create() - materi.title = "wahyu" - materi.author = "Saul Andre Lumban Gaol" - materi.publisher = "Diskominfo Depok" - materi.descriptions = "This is test descriptions" - url = "/materi/" + str(materi.id) + "/" - return url + self.client = Client() + self.admin_credential = { + "email": "admin@gov.id", + "password": "passwordtest" + } + self.contributor_credential = { + "email": "kontributor@gov.id", + "password": "passwordtest" + } + self.anonymous_credential = { + "email": "anonymous@gov.id", + "password": "passwordtest" + } + self.admin = get_user_model().objects.create_user( + **self.admin_credential, name="Admin", is_admin=True) + self.contributor = get_user_model().objects.create_user( + **self.contributor_credential, name="Kontributor", is_contributor=True) + self.anonymous = get_user_model().objects.create_user( + **self.anonymous_credential, name="Anonymous" + ) + self.cover = SimpleUploadedFile("Cherprang_Areekul40_nJM9dGt.jpg", b"Test file") + self.content = SimpleUploadedFile("Bahan_PA_RKK.pdf", b"Test file") + + Materi(title="Materi 1", author="Agas", uploader=self.contributor, + publisher="Kelas SC", descriptions="Deskripsi Materi 1", + status="PENDING", cover=self.cover, content=self.content, feedback="").save() + self.materi1 = Materi.objects.first() + self.url= "/materi/" + str(self.materi1.id) + "/" def test_detail_materi_url_exist(self): - response = Client().get(self.get_url_for_detail_materi()) + response = Client().get(self.url) self.assertEqual(response.status_code,200) self.assertNotEqual(response.status_code, 404) def test_detail_materi_using_detail_materi_template(self): - response = Client().get(self.get_url_for_detail_materi()) + response = Client().get(self.url) self.assertTemplateUsed(response, 'app/detail_materi.html') def test_detail_materi_using_detail_materi_func(self): - found = resolve(self.get_url_for_detail_materi()) + found = resolve(self.url) self.assertEqual(found.func.__name__, DetailMateri.as_view().__name__) def test_category_models_can_create_new_object(self): @@ -104,40 +127,43 @@ class DetailMateriTest(TestCase): self.assertNotEqual(test.__str__(), "userlain") def test_post_blank_comment(self): - url = self.get_url_for_detail_materi() - response = Client().post(url, {"comment": ""}) - self.assertIn("error_message", response.context_data) - self.assertIn("Anda belum menuliskan komentar", response.context_data["error_message"]) - - def test_comment_rendered_to_interface(self): - url = self.get_url_for_detail_materi() - Client().post(url, {"comment": "This is my new comment"}) + url = self.url + self.client.login(**self.anonymous_credential) + response = self.client.post(url, {"comment": ""}) + self.assertIn("error_message", response.context) + self.assertIn("Anda belum menuliskan komentar", response.context["error_message"]) + + def test_comment_rendered_to_template(self): + url = self.url + self.client.login(**self.contributor_credential) + self.client.post(url, {"comment": "This is my new comment"}) response = Client().get(url) self.assertContains(response, "This is my new comment") - + def test_comment_by_admin(self): - url = self.get_url_for_detail_materi() - Client().post("/login_admin/", {"email": "alice@acme.com", "pass": "acmecorp"}) - Client().post(url, {"comment": "This is new comment by Admin"}) - response = Client.get(url) + url = self.url + self.client.login(**self.admin_credential) + self.client.post(url, {"comment": "This is new comment by Admin"}) + response = self.client.get(url) self.assertContains(response, "Admin") def test_comment_by_kontributor(self): - url = self.get_url_for_detail_materi() - Client().post("/login/", {"email": "kontrib@kontrib.com", "pass": "acmecorp"}) - Client().post(url, {"comment": "This is new comment by Contributor"}) - response = Client.get(url) - self.assertContains(response, "Contributor") + url = self.url + self.client.login(**self.contributor_credential) + self.client.post(url, {"comment": "This is new comment by Contributor"}) + response = self.client.get(url) + self.assertContains(response, "Kontributor") def test_comment_by_anonymous(self): - url = self.get_url_for_detail_materi() - Client().get("/logout/") - Client().post(url, {"comment": "This is new comment by Anonymous"}) - response = Client.get(url) - self.assertContains(response, "Anonymous") + url = self.url + self.client.get("/logout/") + self.client.login(**self.anonymous_credential) + self.client.post(url, {"comment": "This is new comment by Anonymous"}) + response = self.client.get(url) + self.assertContains(response, "Anonim") def test_detail_materi_contains_form_comment(self): - response = Client.get(self.get_url_for_detail_materi()) + response = self.client.get(self.url) self.assertContains(response, "komentar...") diff --git a/app/views.py b/app/views.py index 8e185b2..a284a5b 100644 --- a/app/views.py +++ b/app/views.py @@ -69,51 +69,43 @@ class DetailMateri(TemplateView): def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"]) + query_set_for_comment = Comment.objects.filter(materi = context["materi_data"]) + context["comment_data"] = query_set_for_comment return self.render_to_response(context=context) + def get_user_name(self, request): + user_name = "" + if request.user.is_admin: + user_name = "Admin" + elif request.user.is_contributor: + user_name = request.user.name + else: + user_name = "Anonim" + + return user_name + def post(self, request, *args, **kwargs): commentText = request.POST.get("comment", None) - url = request.path - materi = get_object_or_404(Materi, pk=kwargs['pk']) - if commentText == None or commentText== '': + if commentText == None or commentText == "": context = self.get_context_data(*args, **kwargs) context["error_message"] = "Anda belum menuliskan komentar" + context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"]) + query_set_for_comment = Comment.objects.filter(materi = context["materi_data"]) + context["comment_data"] = query_set_for_comment return self.render_to_response(context=context) - else: - comment = Comment.objects.create(comment=commentText) - if request.user.is_authenticated: - if request.user.is_superuser: - username = "Admin" - else: - username = request.user.name - comment.user = username - comment.save() - materi.comments.add(comment) - materi.save() - return HttpResponseRedirect(url) - else: - comment.user = "Anonim" - comment.save() - materi.comments.add(comment) - materi.save() - return HttpResponseRedirect(url) - + + materi = get_object_or_404(Materi, pk=kwargs["pk"]) + comment = Comment.objects.create(comment=commentText, + user=self.get_user_name(request), materi=materi) + comment.save() + return HttpResponseRedirect(request.path) + def delete_comment(request, pk_materi, pk_comment): - materi = get_object_or_404(Materi, pk=pk_materi) comment = get_object_or_404(Comment, pk=pk_comment) url = '/materi/' + str(pk_materi) + "/" - materi.comments.remove(comment) comment.delete() return HttpResponseRedirect(url) -def method1(param1, param2): - temp1 = param1*param2 - return temp1 - -def total_gaji_setahun(gaji, jml_bulan): - total_gaji = gaji*jml_bulan - return total_gaji - def download_materi(request, pk): materi = get_object_or_404(Materi, pk=pk) path = materi.content.path -- GitLab