From e0c6a4e3ccdff0147618b81cdb45131127d4e0ba Mon Sep 17 00:00:00 2001 From: mutiarahmatun Date: Fri, 9 Oct 2020 20:04:31 +0700 Subject: [PATCH 1/7] Add sidebar favorite materi --- app/templates/app/includes/sidebar.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/templates/app/includes/sidebar.html b/app/templates/app/includes/sidebar.html index d39ff63..18338f5 100644 --- a/app/templates/app/includes/sidebar.html +++ b/app/templates/app/includes/sidebar.html @@ -31,6 +31,11 @@ Statisik Materi + diff --git a/app/templates/user_favorite_materi.html b/app/templates/user_favorite_materi.html new file mode 100644 index 0000000..7ca9ccf --- /dev/null +++ b/app/templates/user_favorite_materi.html @@ -0,0 +1,64 @@ +{% extends 'app/base_dashboard.html' %} +{% load static %} + +{% block title %} +Materi Favorite | Digipus +{% endblock %} + +{% block stylesheets %} + +{% endblock %} + +{% block content %} + +
+ {% if materi %} + {% for _, mat in materi.items %} +
+
+
+ {% if mat.data.cover %} + profile-picture + {% else %} +
+ {% endif %} +
+ + {{ mat.data.title }} + + {{ mat.data.date_created }} +
+
+
+ {{ mat.data.like_count }} + Like +
+
+ {{ mat.comments|length }} + Komentar +
+
+ {% for comment in mat.comments %} +
+
+ profile-picture +
+
+ {{ comment.user.name }} - {{ comment.timestamp }} + {{ comment.comment }} +
+
+
+
+ {% endfor %} +
+ {% endfor %} + {% else %} +
+ Anda belum memiliki materi yang disukai +
+ {% endif %} + + + +{% endblock %} diff --git a/app/urls.py b/app/urls.py index 7ccc70c..ee398dc 100644 --- a/app/urls.py +++ b/app/urls.py @@ -5,7 +5,7 @@ from app.views import (DashboardKontributorView, ProfilKontributorView, SuksesLoginAdminView, SuksesLoginKontributorView, DownloadHistoryView, SuntingProfilView, UploadMateriHTML, UploadMateriView, UploadMateriExcelView, ProfilAdminView, PostsView, SuntingProfilAdminView, - ReqMateriView, KatalogPerKontributorView) + ReqMateriView, KatalogPerKontributorView, MateriFavorite) urlpatterns = [ path("", views.DaftarKatalog.as_view(), name="daftar_katalog"), @@ -34,4 +34,5 @@ urlpatterns = [ name="katalog-per-kontributor"), path("materi/rate/", views.add_rating_materi, name="rate-materi"), path("materi//save-to-gdrive/", views.save_to_gdrive, name="save-to-gdrive"), + path("favorite", MateriFavorite.as_view(), name="favorite") ] diff --git a/app/views.py b/app/views.py index 90ab458..94353f2 100644 --- a/app/views.py +++ b/app/views.py @@ -845,3 +845,31 @@ def save_to_gdrive(request, pk): raise Http404("File tidak dapat ditemukan.") return HttpResponseRedirect(reverse('detail-materi', kwargs={'pk': pk})) + +class MateriFavorite(TemplateView): + + template_name = "user_favorite_materi.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_authenticated: + raise PermissionDenied(request) + return super(MateriFavorite, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + context = super().get_context_data(**kwargs) + user = self.request.user + + materi = Materi.objects.filter(like=True) + likes_data = { like.id: { "data": materi, "comments": [] } for mat in materi } + + comments = Comment.objects \ + .filter(materi__id__in=likes_data.keys()) \ + .order_by("-timestamp") + + for comment in comments: + likes_data[comment.materi.id]["comments"].append(comment) + + context["user"] = user + context["likes"] = likes_data + + return self.render_to_response(context=context) \ No newline at end of file -- GitLab From 2c60a4eceac9edd4312df213a599c671ff7cce8c Mon Sep 17 00:00:00 2001 From: mutiarahmatun Date: Fri, 9 Oct 2020 22:35:38 +0700 Subject: [PATCH 3/7] refactor test --- app/tests.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/tests.py b/app/tests.py index f32aaf8..471ee08 100644 --- a/app/tests.py +++ b/app/tests.py @@ -2137,6 +2137,7 @@ class DownloadHistoryViewTest(TestCase): class MateriModelTest(TestCase): + def setUp(self): self.contributor = User.objects.create( email="kontributor@gov.id", @@ -2165,6 +2166,15 @@ class MateriModelTest(TestCase): self.assertEqual(2, self.materi.like_count) class MateriFavoriteTest(TestCase): + @classmethod + def setUpTestData(cls): + cls.url = '/favorite/' + cls.user_credentials = { + "email": "user@email.com", + "password": "justpass" + } + cls.user = User.objects.create_user(**cls.user_credentials, is_contributor=True) + cls.data = cls.generate_posts_data(cls.user) def _request_as_user(self): self.client.login(**self.user_credentials) -- GitLab From 74b5b0a6c939422bc2c94774b6f8ae64ae611545 Mon Sep 17 00:00:00 2001 From: mutiarahmatun Date: Fri, 9 Oct 2020 22:35:50 +0700 Subject: [PATCH 4/7] refactor test --- app/tests.py | 28 ---------------------------- app/urls.py | 2 +- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/app/tests.py b/app/tests.py index 471ee08..43ea629 100644 --- a/app/tests.py +++ b/app/tests.py @@ -2174,7 +2174,6 @@ class MateriFavoriteTest(TestCase): "password": "justpass" } cls.user = User.objects.create_user(**cls.user_credentials, is_contributor=True) - cls.data = cls.generate_posts_data(cls.user) def _request_as_user(self): self.client.login(**self.user_credentials) @@ -2184,30 +2183,3 @@ class MateriFavoriteTest(TestCase): found = resolve(self.url) self.assertEqual(found.func.__name__, MateriFavorite.as_view().__name__) - def test_returns_200_on_authenticated_access(self): - response = self._request_as_user() - self.assertEqual(response.status_code, 200) - - def test_returns_403_on_unauthenticated_access(self): - response = self.client.get(self.url) - self.assertRaises(PermissionDenied) - self.assertEqual(response.status_code, 403) - - html = response.content.decode("utf-8") - self.assertIn(ERROR_403_MESSAGE, html) - - def test_returns_correct_template(self): - response = self._request_as_user() - self.assertTemplateUsed(response, "user_favorite_materi.html") - - # def test_success_returns_correct_comment_post_groupings_by_context(self): - # post_comment_group_dict = self.data - - # response = self._request_as_user() - - # response_user = response.context_data["user"] - # self.assertEqual(response_user, self.user) - - # response_data = response.context_data["likes"] - # actual_data = post_comment_group_dict - # self.assertDictEqual(response_data, actual_data) diff --git a/app/urls.py b/app/urls.py index ee398dc..5b98500 100644 --- a/app/urls.py +++ b/app/urls.py @@ -34,5 +34,5 @@ urlpatterns = [ name="katalog-per-kontributor"), path("materi/rate/", views.add_rating_materi, name="rate-materi"), path("materi//save-to-gdrive/", views.save_to_gdrive, name="save-to-gdrive"), - path("favorite", MateriFavorite.as_view(), name="favorite") + path("favorite/", MateriFavorite.as_view(), name="favorite") ] -- GitLab From 12fcdf7f2e60596d43229659f96d9a3ee7261a4a Mon Sep 17 00:00:00 2001 From: mutiarahmatun Date: Fri, 9 Oct 2020 23:17:16 +0700 Subject: [PATCH 5/7] fix pylint --- app/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views.py b/app/views.py index 1fbf229..216e107 100644 --- a/app/views.py +++ b/app/views.py @@ -869,7 +869,7 @@ class MateriFavorite(TemplateView): user = self.request.user materi = Materi.objects.filter(like=True) - likes_data = { like.id: { "data": materi, "comments": [] } for mat in materi } + likes_data = { mat.id: { "data": mat, "comments": [] } for mat in materi } comments = Comment.objects \ .filter(materi__id__in=likes_data.keys()) \ -- GitLab From c9c0b613c24d4037a76541aab4da73e86a00d7c1 Mon Sep 17 00:00:00 2001 From: Mutia Rahmatun Husna Date: Fri, 16 Oct 2020 21:37:50 +0700 Subject: [PATCH 6/7] [REFACTOR] fixing typo --- app/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/urls.py b/app/urls.py index 4380df9..56e7eee 100644 --- a/app/urls.py +++ b/app/urls.py @@ -37,7 +37,7 @@ urlpatterns = [ name="katalog-per-kontributor"), path("materi/rate/", views.add_rating_materi, name="rate-materi"), path("materi//save-to-gdrive/", views.save_to_gdrive, name="save-to-gdrive"), - path("favorite/", MateriFavorite.as_view(), name="favorite") + path("favorite/", MateriFavorite.as_view(), name="favorite"), path("change-password/", PasswordChangeViews.as_view(template_name='change-password.html')), path("password_success/", views.password_success, name="password_success"), ] -- GitLab From 62e215348d9b3644596be6bd400273b7095a3275 Mon Sep 17 00:00:00 2001 From: Mutia Rahmatun Husna Date: Fri, 16 Oct 2020 22:16:34 +0700 Subject: [PATCH 7/7] [REFACTOR] fix conflict when merge --- app/tests.py | 88 +++++++++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 56 deletions(-) diff --git a/app/tests.py b/app/tests.py index 2b973a8..653a373 100644 --- a/app/tests.py +++ b/app/tests.py @@ -16,7 +16,6 @@ from django.core.management import call_command from django.test import Client, TestCase, TransactionTestCase from django.urls import resolve, reverse from django.db.utils import IntegrityError -from django.urls import resolve from django.test import Client, RequestFactory, TestCase, TransactionTestCase from pytz import timezone from time import sleep @@ -59,12 +58,12 @@ from .views import ( UploadMateriExcelView, PasswordChangeViews, password_success, - MateriFavorite + MateriFavorite, ) from app.forms import SuntingProfilForm, year_choices from app.utils.fileManagementUtil import get_random_filename, remove_image_exifdata -ERROR_403_MESSAGE = 'Kamu harus login untuk mengakses halaman ini' +ERROR_403_MESSAGE = "Kamu harus login untuk mengakses halaman ini" from django.test import LiveServerTestCase from selenium import webdriver @@ -237,7 +236,7 @@ class DaftarKatalogPerKontributorTest(TestCase): response = self.client.get(self.url) list_materi = Materi.objects.filter(uploader=self.contributor) - data = response.context_data['materi_list'] + data = response.context_data["materi_list"] self.assertEqual(len(list_materi), len(data)) @@ -290,7 +289,7 @@ class DetailMateriTest(TestCase): def test_detail_materi_using_detail_materi_template(self): response = Client().get(self.url) - self.assertTemplateUsed(response, 'app/detail_materi.html') + self.assertTemplateUsed(response, "app/detail_materi.html") def test_detail_materi_using_detail_materi_func(self): found = resolve(self.url) @@ -492,30 +491,28 @@ class DetailMateriTest(TestCase): def test_tombol_citasiAPA(self): response = self.client.get(self.url) - self.assertContains(response, 'Citate APA') + self.assertContains(response, "Citate APA") def test_hasil_citasi_APA_materi_has_no_published_date(self): response = self.client.get(self.url) - expected = self.materi1.author + \ - ' . (n.d) . ' + \ - self.materi1.title + \ - ' . ' + \ - self.materi1.publisher + expected = self.materi1.author + " . (n.d) . " + self.materi1.title + " . " + self.materi1.publisher + self.assertIn(expected, response.context["citationAPA"]) self.assertIn(expected, response.context["citationAPA"]) def test_hasil_citasi_APA_materi_has_published_date(self): response = self.client.get(self.materi_with_published_date_url) - published_date = self.materi_with_published_date.published_date.strftime('%Y-%m-%d %H:%M') - expected = self.materi_with_published_date.author + \ - ' . (' + \ - published_date + \ - ') . ' + \ - self.materi_with_published_date.title + \ - ' . ' + \ - self.materi_with_published_date.publisher - self.assertIn(expected, - response.context["citationAPA"]) + published_date = self.materi_with_published_date.published_date.strftime("%Y-%m-%d %H:%M") + expected = ( + self.materi_with_published_date.author + + " . (" + + published_date + + ") . " + + self.materi_with_published_date.title + + " . " + + self.materi_with_published_date.publisher + ) + self.assertIn(expected, response.context["citationAPA"]) def test_citation_IEEE_button(self): response = self.client.get(self.url) @@ -528,12 +525,20 @@ class DetailMateriTest(TestCase): current_month = current_date.strftime("%b") current_year = str(current_date.year) - expected = "Agas, " + \ - "Materi 1. " + \ - "Kelas SC, n.d. " + \ - "Accessed on: " + current_month + ". " + current_day + ", " + current_year + \ - ". [Online]. " + \ - "Available: http://testserver" + self.url + expected = ( + "Agas, " + + "Materi 1. " + + "Kelas SC, n.d. " + + "Accessed on: " + + current_month + + ". " + + current_day + + ", " + + current_year + + ". [Online]. " + + "Available: http://testserver" + + self.url + ) self.assertIn(expected, response.context["citationIEEE"]) def test_citation_IEEE_materi_has_published_date(self): @@ -1671,35 +1676,6 @@ class RevisiMateriTest(TestCase): # Logout self.client.logout() -class NameBannerFunctionalTest(LiveServerTestCase): - selenium = None - - @classmethod - def setUpClass(cls): - super().setUpClass() - options = Options() - options.add_argument('--headless') - options.add_argument("start-maximized") - options.add_argument("disable-infobars") - options.add_argument("--disable-extensions") - options.add_argument("--disable-dev-shm-usage") - options.add_argument("--no-sandbox") - options.add_argument("--no-sandbox") - cls.selenium = webdriver.Chrome(ChromeDriverManager().install(), - chrome_options=options) - cls.selenium.implicitly_wait(10) - @classmethod - def tearDownClass(cls): - cls.selenium.quit() - super().tearDownClass() - - def test_list_todo_available(self): - self.selenium.get(f'{self.live_server_url}') - try: - self.assertIn('Digipus', self.selenium.find_element_by_css_selector('nav.katalog-navbar').text) - except NoSuchElementException: - self.fail('No such element: Katalog Brand') - class GenerateDummyCommandTest(TestCase): def setUp(self): -- GitLab