From 2a1a04ecd5ad77ea49b33e4f1cc91492f7d0cd45 Mon Sep 17 00:00:00 2001 From: Putu <i.gusti78@ui.ac.id> Date: Wed, 29 Apr 2020 04:29:59 +0700 Subject: [PATCH] [RED] Test detail verification page. --- administration/templates/detail_verif.html | 132 +++++++++++++++ administration/templates/verif.html | 18 ++- administration/tests.py | 178 ++++++++++----------- administration/urls.py | 3 +- administration/views.py | 64 ++++++-- app/models.py | 3 +- 6 files changed, 276 insertions(+), 122 deletions(-) create mode 100644 administration/templates/detail_verif.html diff --git a/administration/templates/detail_verif.html b/administration/templates/detail_verif.html new file mode 100644 index 0000000..f9de9b2 --- /dev/null +++ b/administration/templates/detail_verif.html @@ -0,0 +1,132 @@ +{% extends 'app/detail_materi.html' %} + +{% block title %} +Pratinjau Materi +{% endblock title %} +{% block verification %} +<nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow"> + + <!-- Sidebar Toggle (Topbar) --> + <button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3"> + <i class="fa fa-bars"></i> + </button> + + <div class="sidebar-brand-text mx-3">Pratinjau Materi</div> + + <!-- Topbar Navbar --> + <ul class="navbar-nav ml-auto"> + + <li class="nav-item"> + <button data-toggle="modal" data-target="#myModal" id="checklistButton" class="btn" + style="background-color:#4e73df;color: azure;"> + Tampilkan Kriteria + </button> + </li> + + </ul> + +</nav> + +<!-- Modal --> +<div class="modal fade" id="myModal" role="dialog"> + <div class="modal-dialog modal-xl"> + + <!-- Modal content--> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title">Kriteria Verifikasi</h4> + <button type="button" class="close" data-dismiss="modal">×</button> + </div> + <div class="modal-body"> + {% if error %} + <h4>Terjadi Kesalahan, coba lagi.</h4> + {% endif %} + {% for kriteria in kriteria_list %} + <div class="row m-2"> + <div class="col-8"> + {{kriteria.title}} + </div> + <div class="col-2"> + <div class="custom-control custom-radio custom-control-inline"> + <input id="kriteria{{ forloop.counter }}Ya" type="radio" + name="kriteria{{ forloop.counter }}" class="custom-control-input kriteria-ok" value=1> + <label class="custom-control-label" for="kriteria{{ forloop.counter }}Ya">Ya</label> + </div> + </div> + <div class="col-2"> + <div class="custom-control custom-radio custom-control-inline"> + <input checked id="kriteria{{ forloop.counter }}Tidak" type="radio" + name="kriteria{{ forloop.counter }}" class="custom-control-input" value=0> + <label class="custom-control-label" for="kriteria{{ forloop.counter }}Tidak">Tidak</label> + </div> + </div> + </div> + {% endfor %} + <span><small>Kontributor tidak dapat melihat point-point verifikasi, jika materi ditolak tuliskan alasan + penolakan tersebut di kolom tanggapan.</small></span> + <hr> + <form method="POST" id="submitForm"> + {% csrf_token %} + + <label for="feedbackMateri">Tanggapan terhadap materi untuk Kontributor :</label> + <textarea name="feedback" id="feedbackMateri" class="form-control" rows="6"></textarea> + </form> + + </div> + <div class="modal-footer"> + <button disabled class="accept-button btn" type="submit" name="action" value="approve" form="submitForm" + style="background-color: #28a745;border-radius: .25rem;color: azure;" + id="approveButton">Terima</button> + <button disabled class="reject-button btn" type="submit" name="action" value="disapprove" + form="submitForm" style="background-color: #dc3545;border-radius: .25rem;color: azure;" + id="disapproveButton">Tolak</button> + <button type="button" class="btn" data-dismiss="modal">Tutup</button> + </div> + </div> + + </div> +</div> +{% endblock verification %} +{% block extra_scripts %} +<script> + function cekRadio() { + res = true + x = document.getElementsByClassName("kriteria-ok") + for (index = 0; index < x.length; index++) { + if (x[index].checked == false) { + res = false; + break; + } + } + return res; + } + function cekFeedback() { + if (!$.trim($("#feedbackMateri").val())) { + return false; + } else { + return true; + } + } + + $(document).ready(function () { + var approveButton = document.getElementById("approveButton") + var disapproveButton = document.getElementById("disapproveButton") + $(":input").change(function () { + console.log("Running test") + var statusRadio = cekRadio(); + var statusFeedback = cekFeedback(); + if (statusFeedback) { + disapproveButton.disabled = false; + if (statusRadio) { + approveButton.disabled = false; + } else { + approveButton.disabled = true; + } + } else { + disapproveButton.disabled = true; + approveButton.disabled = true; + } + }); + }); +</script> +{% endblock extra_scripts %} \ No newline at end of file diff --git a/administration/templates/verif.html b/administration/templates/verif.html index 0ab4e3a..19ca715 100644 --- a/administration/templates/verif.html +++ b/administration/templates/verif.html @@ -161,17 +161,20 @@ </tr> </tfoot> <tbody> + {% for materi in materi_list %} <tr> - {% for materi in materi_list %} - <td>{{ materi.tittle }}</td> + <td>{{ materi.title }}</td> <td>{{ materi.uploader.name }}</td> - <td>{{ materi.status.1 }}</td> - {% if materi.status.0 == "PENDING" %} - <td class="verif-buttons"><a href="/administration/api/approve/{{materi.id}}/" class="accept-button">Terima</a><a href="/administration/api/disapprove/{{materi.id}}/" - class="reject-button">Tolak</a></td> + <td>{{ materi.status.label }}</td> + {% if materi.status == "PENDING" %} + <td class="verif-buttons"> + <a href="/administration/detail-verif/{{materi.id}}/" class="accept-button" + style="background-color:#4e73df">Detail</a> + <a href="/administration/api/approve/{{materi.id}}/" class="accept-button">Terima</a> + <a href="/administration/api/disapprove/{{materi.id}}/" class="reject-button">Tolak</a></td> {% endif %} - {% endfor %} </tr> + {% endfor %} </tbody> </table> </div> @@ -206,7 +209,6 @@ </a> <!-- Bootstrap core JavaScript--> - <!-- <script src="{% static 'vendor/jquery/jquery.min.js' %}"></script> --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> diff --git a/administration/tests.py b/administration/tests.py index eed4aff..ac8a8e0 100644 --- a/administration/tests.py +++ b/administration/tests.py @@ -3,129 +3,117 @@ from django.test import Client, TestCase from django.urls import resolve from administration import models, views -from app.models import Materi +from app.models import Materi, Category class VerifikasiMateriTest(TestCase): def setUp(self): self.client = Client() - - # def test_verifikasi_materi_url_exist(self): - # response = self.client.get('/administration/') - # self.assertEqual(response.status_code, 200) - - # def test_verifikasi_materi_using_correct_template(self): - # found = resolve('/administration/') - # self.assertEqual(found.func.__name__, views.verification.__name__) - - # found2 = resolve('/admin/') - # self.assertNotEqual(found2.func.__name__, views.verification.__name__) - - # def test_verifikasi_materi_title(self): - # response = self.client.get('/administration/') - - # self.assertContains(response, 'Dasbor - Verifikasi Materi') - - # self.assertNotContains(response, 'Fake Title') - - # def test_verifikasi_materi_content(self): - # response = self.client.get('/administration/') - - # self.assertContains(response, 'Judul Materi') - # self.assertContains(response, 'Nama Kontributor') - # self.assertContains(response, 'Status') - - # self.assertNotContains(response, 'Halaman Katalog') + self.url = "/administration/setting/verification/" + self.model = models.VerificationSetting + self.admin = get_user_model().objects.create_user( + password="admin123", email="admin@admin.com", is_admin=True) + self.contributor = get_user_model().objects.create_user( + password="kontributor123", email="kontributor@kontributor.com", is_contributor=True + ) + self.materi = Materi(title="LK 3", author="Agas", uploader=self.contributor, + publisher="Kelas SC", descriptions="COntoh pengerjaan LK 3", status="PENDING").save() def test_verifikasi_materi_url_exist(self): - response = self.client.get('/administration/detail') + # Login + self.client.login(email="admin@admin.com", + password="admin123") + response = self.client.get('/administration/') self.assertEqual(response.status_code, 200) def test_verifikasi_materi_using_correct_template(self): - found = resolve('/administration/detail') - self.assertEqual(found.func.__name__, views.detail.__name__) - - found2 = resolve('/admin/') - self.assertNotEqual(found2.func.__name__, views.verification.__name__) + # Login + self.client.login(email="admin@admin.com", + password="admin123") + found = resolve('/administration/') + self.assertEqual(found.func.__name__, views.VerificationView.__name__) def test_verifikasi_materi_title(self): - response = self.client.get('/administration/detail') + # Login + self.client.login(email="admin@admin.com", + password="admin123") + response = self.client.get('/administration/') self.assertContains(response, 'Dasbor - Verifikasi Materi') self.assertNotContains(response, 'Fake Title') def test_verifikasi_materi_content(self): - response = self.client.get('/administration/detail') + # Login + self.client.login(email="admin@admin.com", + password="admin123") + response = self.client.get('/administration/') - self.assertContains(response, 'Judul Verifikasi') - self.assertContains(response, 'Deskripsi') - self.assertContains(response, 'Tombol') + self.assertContains(response, 'LK 3') + self.assertContains(response, self.contributor.name) self.assertNotContains(response, 'Halaman Katalog') + +class DetailVerifikasiMateriTest(TestCase): + def setUp(self): + self.client = Client() + self.view = views.DetailVerificationView + self.template_name = "detai_verif.html" + self.model = models.VerificationSetting + self.admin = get_user_model().objects.create_user( + password="admin123", email="admin@admin.com", is_admin=True) + self.contributor = get_user_model().objects.create_user( + password="kontributor123", email="kontributor@kontributor.com", is_contributor=True + ) + self.materi = Materi(id = 1, title="LK 3", author="Agas", uploader=self.contributor, + publisher="Kelas SC", descriptions="COntoh pengerjaan LK 3", status="PENDING").save() + self.url = f"/administration/detail-verif/1/" + + def test_dashboard_kontributor_view(self): + found = resolve(self.url) + self.assertEqual(found.func.__name__, self.view.as_view().__name__) + + def test_dashboard_kontributor_template(self): + # Login + self.client.login(email="admin@admin.com", + password="admin123") + # Test + response = self.client.get(self.url) + self.assertTemplateUsed(response, self.template_name) + # Logout + self.client.logout() + + def test_dashboard_kontributor_url(self): + # Login + self.client.login(email="admin@admin.com", + password="admin123") + # Test + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + # Logout + self.client.logout() + + class SettingVerifikasiTest(TestCase): def setUp(self): self.client = Client() self.url = "/administration/setting/verification/" self.model = models.VerificationSetting - self.admin = get_user_model().objects.create_user(password="admin123", email="admin@admin.com", is_admin=True) + self.admin = get_user_model().objects.create_user( + password="admin123", email="admin@admin.com", is_admin=True) self.contributor = get_user_model().objects.create_user( password="kontributor123", email="kontributor@kontributor.com", is_contributor=True ) - # def test_setting_verifikasi_url_exist(self): - # # Test not authenticated - # response = self.client.get(self.url) - # self.assertEqual(response.status_code, 403) - - # # Test Contributor - # self.client.login(email = 'kontributor@kontributor.com', password = 'kontributor123') - # response = self.client.get(self.url) - # self.assertEqual(response.status_code, 403) - # self.client.logout() - - # # Test Admin - # self.client.login(email = 'admin@admin.com', password = 'admin123') - # response = self.client.get(self.url) - # self.assertEqual(response.status_code, 200) - - # def test_setting_verifikasi_template(self): - # self.client.login(email = 'admin@admin.com', password = 'admin123') - # response = self.client.get(self.url) - # self.assertTemplateUsed(response, 'setting_verifikasi.html') - - # def test_setting_verifikasi_func(self): - # found = resolve(self.url) - # self.assertEqual(found.func.__name__, views.VerificationSettingView.as_view().__name__) - - # def test_setting_verifikasi_model(self): - # self.assertEqual(self.model.objects.all().count(), 0) - # s1 = self.model(title = "Point 1",description= "Deskripsi Point 1") - # s1.save() - # self.assertEqual(self.model.objects.all().count(), 1) - - # def test_setting_verifikasi_table(self): - # # Login - # self.client.login(email = 'admin@admin.com', password = 'admin123') - - # # View table - # response = self.client.get(self.url) - # self.assertNotIn(response.content, b'Point 1') - - # # Add new setting - # data = { - # "tittle":"Point 1", - # "description":"Deskripsi Point 1" - # } - # response = self.client.post(self.url, data) - # self.assertIn(response.content, b'Point 1') - # self.assertEqual(response.status_code, 200) - - # # Add new setting, missing value - # data = { - # "description":"Deskripsi Point 2" - # } - # response = self.client.post(self.url, data) - # self.assertNotIn(response.content, b'Deskripsi Point 2') - # self.assertEqual(response.status_code, 200) + +class SettingKategoriTest(TestCase): + def setUp(self): + self.client = Client() + self.url = "/administration/setting/category/" + self.model = Category + self.admin = get_user_model().objects.create_user( + password="admin123", email="admin@admin.com", is_admin=True) + self.contributor = get_user_model().objects.create_user( + password="kontributor123", email="kontributor@kontributor.com", is_contributor=True + ) diff --git a/administration/urls.py b/administration/urls.py index 411a95d..448e912 100644 --- a/administration/urls.py +++ b/administration/urls.py @@ -6,8 +6,7 @@ app_name = "administration" urlpatterns = [ path("", views.VerificationView.as_view()), - path("api/approve/<int:pk>", views.approve), - path("api/disapprove/<int:pk>", views.disapprove), + path("detail-verif/<int:pk>/", views.DetailVerificationView.as_view()), path("setting/verification/", views.VerificationSettingView.as_view()), path("setting/category/", views.CategorySettingView.as_view()), ] diff --git a/administration/views.py b/administration/views.py index 704f6e2..cf4b189 100644 --- a/administration/views.py +++ b/administration/views.py @@ -13,35 +13,67 @@ from .models import VerificationSetting class VerificationView(TemplateView): template_name = "verif.html" + def dispatch(self, request, *args, **kwargs): + if not request.user.is_authenticated or not request.user.is_admin: + raise PermissionDenied(request) + return super(VerificationView, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(VerificationView, self).get_context_data(**kwargs) + context["materi_list"] = Materi.objects.filter(status='PENDING') + return context + def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) return self.render_to_response(context) -def approve(request, pk): - if request.user.is_authenticated == False or request.user.is_admin != True: - raise PermissionDenied(request) - materi = get_object_or_404(Materi, pk=pk) - materi.status = ("APPROVE", "Diterima") - materi.save() - return render(request, "verif.html") +class DetailVerificationView(TemplateView): + template_name = "detail_verif.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_authenticated or not request.user.is_admin: + raise PermissionDenied(request) + return super(DetailVerificationView, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(DetailVerificationView, + self).get_context_data(**kwargs) + context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"]) + context["kriteria_list"] = VerificationSetting.objects.filter( + archived=False) + return context + def post(self, request, *args, **kwargs): + materi = get_object_or_404(Materi, pk=kwargs["pk"]) + feedback = request.POST.get("feedback") + if request.POST.get("action") == "approve": + materi.status = "APPROVE" + materi.feedback = feedback + materi.save() + elif request.POST.get("action") == "disapprove": + materi.status = "DISAPPROVE" + materi.feedback = feedback + materi.save() + else: + context = self.get_context_data(**kwargs) + context["error"] = True + return self.render_to_response(context=context) + return HttpResponseRedirect("/administration/") -def disapprove(request, pk): - if request.user.is_authenticated == False or request.user.is_admin != True: - raise PermissionDenied(request) - materi = get_object_or_404(Materi, pk=pk) - materi.status = ("DISAPROVE", "Ditolat") - materi.save() - return render(request, "verif.html") + def get(self, request, *args, **kwargs): + context = self.get_context_data(**kwargs) + return self.render_to_response(context=context) class VerificationSettingView(TemplateView): template_name = "setting_verifikasi.html" def get_context_data(self, **kwargs): - context = super(VerificationSettingView, self).get_context_data(**kwargs) - context["verification_settings"] = VerificationSetting.objects.filter(archived=False) + context = super(VerificationSettingView, + self).get_context_data(**kwargs) + context["verification_settings"] = VerificationSetting.objects.filter( + archived=False) return context def get(self, request, *args, **kwargs): diff --git a/app/models.py b/app/models.py index 76f8a26..a5dc86a 100644 --- a/app/models.py +++ b/app/models.py @@ -50,7 +50,8 @@ class Materi(models.Model): uploader = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) 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]) + status = models.CharField(max_length=30, choices=VERIFICATION_STATUS, default=VERIFICATION_STATUS[0][0]) categories = models.ManyToManyField(Category) comments = models.ManyToManyField(Comment) feedback = models.TextField(blank=True, default="") + \ No newline at end of file -- GitLab