From d7866504397544a3db71d23314bc0689c6bf1b35 Mon Sep 17 00:00:00 2001
From: Salsabila Hava Qabita <salsabila.hava@ui.ac.id>
Date: Sun, 1 Nov 2020 02:43:31 +0700
Subject: [PATCH] [#49] Material: User Review (Admin Moderation)

---
 app/templates/app/detail_materi.html        |   6 ++++
 app/tests.py                                |  38 ++++++++++++++++++++
 app/urls.py                                 |   2 ++
 app/views.py                                |   9 ++++-
 digipus/__pycache__/settings.cpython-36.pyc | Bin 4184 -> 4208 bytes
 5 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/app/templates/app/detail_materi.html b/app/templates/app/detail_materi.html
index c8141ef..e4a6562 100644
--- a/app/templates/app/detail_materi.html
+++ b/app/templates/app/detail_materi.html
@@ -435,6 +435,12 @@ div.review {
                             {{ review.timestamp|naturaltime }}
                         </p>
                     </div>
+                    {% if user.is_admin %}
+                    <a class="ml-auto p-1 bd-highlight close"
+                        href="{% url 'delete-review' materi_data.id review.id %}">
+                        <span aria-hidden="true">&times;</span>
+                    </a>
+                    {% endif %}
                 </div>
                 <div  class = 'review'>
                 <p class="paragraph">{{review.review}}</p>
diff --git a/app/tests.py b/app/tests.py
index f4a6929..27bc5b1 100644
--- a/app/tests.py
+++ b/app/tests.py
@@ -858,6 +858,44 @@ class DetailMateriTest(TestCase):
         self.client.post(url, {"review": "This is new review by Anonymous"})
         response = self.client.get(url)
         self.assertContains(response, "Anonymous")
+
+    def create_and_delete_review(self, is_admin=False, is_contributor=False):
+        url = self.url
+        self.client.login(**self.admin_credential)
+        self.client.post(url, {"review": "A review by Anonymous"})
+        delete_url = "/review/delete/" + str(self.materi1.id) + "/" + str(
+            Review.objects.get(review="A review by Anonymous").id)
+        if is_admin:
+            self.client.login(**self.admin_credential)
+        if is_contributor:
+            self.client.login(**self.contributor_credential)
+        if not is_admin and not is_contributor:
+            self.client.login(**self.anonymous_credential)
+        response = self.client.get(delete_url)
+        return response
+    
+    def test_delete_review_by_admin(self):
+        self.create_and_delete_review(is_admin=True)
+        count = Review.objects.all().filter(review="A review by Anonymous").count()
+        self.assertEqual(count, 0)
+
+    def test_delete_review_by_contributor(self):
+        response = self.create_and_delete_review(is_contributor=True)
+
+        self.assertRaises(PermissionDenied)
+        self.assertEqual(response.status_code, 403)
+
+        count = Review.objects.all().filter(review="A review by Anonymous").count()
+        self.assertEqual(count, 1)
+
+    def test_delete_review_by_regular_user(self):
+        response = self.create_and_delete_review()
+
+        self.assertRaises(PermissionDenied)
+        self.assertEqual(response.status_code, 403)
+
+        count = Review.objects.all().filter(review="A review by Anonymous").count()
+        self.assertEqual(count, 1)
     
     def test_detail_materi_contains_review_count(self):
         url = self.url
diff --git a/app/urls.py b/app/urls.py
index b48be94..f89a060 100644
--- a/app/urls.py
+++ b/app/urls.py
@@ -15,6 +15,8 @@ urlpatterns = [
     path("materi/like/", views.toggle_like, name="PostLikeToggle"),
     path("delete/<int:pk_materi>/<int:pk_comment>",
          views.delete_comment, name="delete-comment"),
+    path("review/delete/<int:pk_materi>/<int:pk_review>",
+        views.delete_review, name="delete-review"),
     path("comment/like/", views.toggle_like_comment, name="comment-like-toggle"),
     path("comment/dislike/", views.toggle_dislike_comment, name="comment-dislike-toggle"),
     path("materi/<int:pk>/delete", views.delete_materi, name="detele-materi"),
diff --git a/app/views.py b/app/views.py
index 81c9693..bba8b37 100644
--- a/app/views.py
+++ b/app/views.py
@@ -258,6 +258,14 @@ def delete_comment(request, pk_materi, pk_comment):
     comment.delete()
     return HttpResponseRedirect(url)
 
+def delete_review(request, pk_materi, pk_review):
+    if not request.user.is_authenticated or not request.user.is_admin:
+        raise PermissionDenied(request)
+    review = get_object_or_404(Review, pk=pk_review)
+    url_materi = "/materi/" + str(pk_materi) + "/"
+    review.delete()
+    return HttpResponseRedirect(url_materi)
+
 def toggle_like_comment(request):
     comment_id = 0
     if request.method == "POST":
@@ -281,7 +289,6 @@ def toggle_dislike_comment(request):
     else:
         return JsonResponse({"success": False, "msg": UNSUPPORTED_MESSAGE, "comment_id": comment_id})
 
-
 def add_rating_materi(request):
     if request.method == "POST" and request.user.is_authenticated:
 
diff --git a/digipus/__pycache__/settings.cpython-36.pyc b/digipus/__pycache__/settings.cpython-36.pyc
index 2e8d5505327c65aad19bcc06e556bd3f737fca54..d738b3ddbb6740940b2b34c9c7651fa292ceac82 100644
GIT binary patch
delta 686
zcmcbi@IgV@n3tF9(Y(3w(&7vZj~S4FAOiz~0|Ns?@uZ2$t@SCA>4H&$DN-rYDKaUt
zDRL?DDGDiyDbnejQ9>z7QNk(8Q6ecSsf<}1S)!>tDXPs(>5M5#DQYR|DH<u7DO%|)
znT#pgb6C<Dqr_5lqQp~KQgl=KQuI>vdzqsoQdv?A;5^AxmJ~xcPbyVn0%H-YL5fj|
z@ni!=vHE7lRF)Kr6w79&6stLGnT%1=c{!<)6BvskG8v+zQyH^lQmmU9qhwQ=vgA@_
zQ*2Ufdzn(DQ;cjF@?27-CNLJYfYq_2Sf|QE?Z>88BE=}h4(=cOW~LN}IZT<1QS~4z
zAf9w=W=dm>Qb=)%QcQ79ami#%XN*!xag9<=af?z(QHoMcQHoMaQHoMeWzXVIaZhE>
z(g2g1DITfpSz0Ncsq9(WDPEbZQ97wCDc&hQDZaf-QM#!tDSj#bV74CI0RhcSQTi!?
zQ3mzMLg|cAhABZ&MsTs<W~M0Pl#nQsl+Y;Cl&~nXl<<^@bjD1^DD#xaD2r5<l&F+w
zu+f&OEGaQ5v0%1UDoaXSN<5ftoywAukdg>y+oUK(*{0}4*`+WAGiW9y>M$}eY~IWC
znu$A#v$Qz1D7`c@C3W)()@htko~~9g!Kt~a#U-gl3g$5Zz5zZl0Y&+hso4tNsX2+o
z3PuJ-1~IvbMOm47i8;C{ndzAYrNuEYx;V9@Br`9)Sg)Y+7Kcr4eoARhsvS2d^_`g9
L&u={W0RIdCTQR|F

delta 655
zcmeyMa6>`an3tF9o%!5&Pca6D#|%h7fPsO*fq{Xcc)~>G*7|gTD8UrT6sZ*H6qyv+
z6uA`n6onM2bj~QD6vZgv6s0JU6y;RLERHPERGt)-W~Ow;6vY(P6txuf6pa+kbe2rU
z6s<Wd>5NfgDcVuusVpfvseCEADSExkQ4*;vDf)1pWGYLF0h}k5DlvhvNH3+{FvTd9
zCB?XzF_k671WcNONi#5Mo?_9=lwvuDEt4@yIxi<xasp#fSSCZ1bSh((Oo~-AW0Y(v
zQ<hw+Y>IV?O)pcbbc&%3L!L{j)C9(&Ca^k|6suHusDrSmt<RH4F-)<A`_QhLDaC#c
z6UaKam_svD8e^0~ier>wic^YnCSy8dlv0XIlyZt|luC+Xlxm7%lv;{nlzJ+A7JrIc
zDtnd&nAA*hPi4>2O7Tc#&(cou%w&zyNo7g#O7Twd>1B%2O=U^(O{w<-bM)Yr`8P8~
z>8Aul86b<KGe#Mv1V$Ob#e$ldqKs35qfAmlqD)glqs&smQo_?2GZ~}IQzD`)Qdv?W
zQ=-5oTc)z4M5n}n*;c76DX}SWV77HCOG<o7f(V#nlcE@9o1z<Km%<dxpqaRN7t;r(
z&0ATgahf^kXXNLm>KCO}W+dk6yW}UA=BDPA6zd202KeabCKhF7<|XFnrevmP7L*q2
V!|2If{8Eg^CNJeTo_vdc8UWcnwmAR*

-- 
GitLab