Pārlūkot izejas kodu

Added delete functionality for facebook/google reviews

Mohidul Islam 3 gadi atpakaļ
vecāks
revīzija
1f0b2eb4a1

+ 18 - 0
dashboard/static/main.css

@@ -106,3 +106,21 @@ a.article-title:hover {
     margin-left: 2px;
     margin-left: 2px;
     padding: 2px 10px;
     padding: 2px 10px;
 }
 }
+
+.review-content{
+  display: flex;
+  flex-direction: row;
+}
+
+.review__remove-btn{
+  float: right;
+}
+.review__description{
+  margin: auto;
+  text-align: center;
+}
+
+.review__content-detail{
+  display: flex;
+  flex-direction: column;
+}

+ 2 - 2
dashboard/templates/dashboard.html

@@ -8,8 +8,8 @@
     <img class="rounded-circle article-img" src="{{ review.reviewer_photo }}">
     <img class="rounded-circle article-img" src="{{ review.reviewer_photo }}">
     <div class="media-body">
     <div class="media-body">
         <div class="article-metadata">
         <div class="article-metadata">
-            <span class="mr-2"><b>{{ review.reviewer_name }}</b></span>
-            <small class="text-muted">{{ review.update_time|date:"F d, Y" }}</small>
+          <a class="mr-2" href="{% url 'detail-review' review.review_id %}"><b>{{ review.reviewer_name }}</b></a>
+          <small class="text-muted">{{ review.update_time|date:"F d, Y" }}</small>
             <small class="text-muted"> at <b>{{ review.location.care_name }}</b></small>
             <small class="text-muted"> at <b>{{ review.location.care_name }}</b></small>
             <span style="color: #a41515; float: right">{{ review.star_rating }} X &#9733</span>
             <span style="color: #a41515; float: right">{{ review.star_rating }} X &#9733</span>
         </div>
         </div>

+ 48 - 0
dashboard/templates/review_details.html

@@ -0,0 +1,48 @@
+{% extends 'base.html' %}
+{% load crispy_forms_tags %}
+
+{% block content %}
+<div class="review__content-detail">
+    <div>
+        <a class="review__remove-btn" type="button" data-toggle="modal" data-target="#exampleModal">
+            <i class="fa fa-trash fa-3x" aria-hidden="true"></i>
+        </a>
+    </div>
+    <div class="review-content">
+        <div><img src="{{ review.reviewer_photo }}" alt="" height="144px"></div>
+        <div class="review__description">
+            <h3>{{ review.reviewer_name }}</h3>
+            <span>Posted on {{ review.location.care_name }}</span> <br>
+            <span>Posted at {{ review.create_time | date:"M dS, Y" }}</span>
+            <div>
+                {% for i in "x"|rjust:review.star_rating %}
+                    <span style="color: #a41515;">&#9733</span>
+                {% endfor %}
+            </div>
+        </div>
+    </div>
+    <p class="mt-5">{{ review.comment }}</p>
+    <p class="mt-5">{{ review.reply.replied_text }}</p>
+
+<!-- Modal -->
+<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+        <div class="modal-header">
+            <h5 class="modal-title" id="exampleModalLabel">Do you want to remove this reivew?</h5>
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+            <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+        <div class="modal-body">
+            This will delete the review from the database and might add it while syncing with the google review API.
+        </div>
+        <div class="modal-footer">
+            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+            <a type="button" class="btn btn-primary" href="{% url 'delete-review' review.review_id %}">Remove</a>
+        </div>
+        </div>
+    </div>
+</div>
+</div> 
+{% endblock content %}

+ 3 - 1
dashboard/urls.py

@@ -1,8 +1,10 @@
 from django.urls import path
 from django.urls import path
-from .views import ReviewListByLocationView, UnRepliedReviewList, ReviewListView
+from .views import ReviewListByLocationView, UnRepliedReviewList, ReviewListView, DeleteReview, ReviewDetails
 
 
 urlpatterns = [
 urlpatterns = [
     path('', UnRepliedReviewList.as_view(), name='un-replied-review'),
     path('', UnRepliedReviewList.as_view(), name='un-replied-review'),
     path('list/', ReviewListView.as_view(), name='review-list'),
     path('list/', ReviewListView.as_view(), name='review-list'),
     path('list/<location_id>/', ReviewListByLocationView.as_view(), name='review-list-by-location'),
     path('list/<location_id>/', ReviewListByLocationView.as_view(), name='review-list-by-location'),
+    path('delete/<review_id>/', DeleteReview.as_view(), name='delete-review'),
+    path('details/<pk>/', ReviewDetails.as_view(), name='detail-review'),
 ]
 ]

+ 19 - 1
dashboard/views.py

@@ -1,7 +1,8 @@
+from django.db import models
 from django.utils import timezone
 from django.utils import timezone
 from django.shortcuts import render, redirect
 from django.shortcuts import render, redirect
 from django.contrib import messages
 from django.contrib import messages
-from django.views.generic import View
+from django.views.generic import View, DetailView
 from django.shortcuts import get_object_or_404
 from django.shortcuts import get_object_or_404
 from review.models import Review, Reply
 from review.models import Review, Reply
 from review.forms import ReplyForm
 from review.forms import ReplyForm
@@ -103,3 +104,20 @@ class UnRepliedReviewList(LoginRequiredMixin, PermissionRequiredMixin, View):
             reviews = paginator.page(paginator.num_pages)
             reviews = paginator.page(paginator.num_pages)
         context = {'reviews': reviews, 'form': form}
         context = {'reviews': reviews, 'form': form}
         return render(request, 'dashboard.html', context=context)
         return render(request, 'dashboard.html', context=context)
+
+
+
+class DeleteReview(LoginRequiredMixin, PermissionRequiredMixin, View):
+    permission_required = 'is_admin'
+    
+    def get(self, requset, review_id, *args, **kwargs):
+        review = Review.objects.filter(review_id=review_id).first()
+        res = review.delete()
+        return redirect('un-replied-review')
+
+
+class ReviewDetails(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
+    permission_required = 'is_admin'
+    model = Review
+    template_name='review_details.html'
+    context_object_name='review'

+ 7 - 5
facebook_app/templates/facebook-reviews.html

@@ -9,11 +9,13 @@
         <div class="article-metadata">
         <div class="article-metadata">
             <small class="text-muted">{{ review.create_time|date:"F d, Y" }}</small>
             <small class="text-muted">{{ review.create_time|date:"F d, Y" }}</small>
             <small class="text-muted"> at <b>{{ review.page }}</b></small>
             <small class="text-muted"> at <b>{{ review.page }}</b></small>
-            {% if review.recommendation_type %}
-                <span style="color: green; float: right">Recommended</span>
-            {% else %}
-                <span style="color: red; float: right">Not Recommended</span>
-            {% endif %}
+            <a href="{% url 'facebook-reviews-details' review.id %}">
+              {% if review.recommendation_type %}
+                  <span style="color: green; float: right">Recommended</span>
+              {% else %}
+                  <span style="color: red; float: right">Not Recommended</span>
+              {% endif %}
+            </a>
           <button class="btn btn-link"><a href="https://facebook.com/{{ review.id }}" target="_blank">Link</a></button>
           <button class="btn btn-link"><a href="https://facebook.com/{{ review.id }}" target="_blank">Link</a></button>
         </div>
         </div>
         {% if review.review_text %}
         {% if review.review_text %}

+ 38 - 0
facebook_app/templates/facebook_review_details.html

@@ -0,0 +1,38 @@
+{% extends 'base.html' %}
+{% load crispy_forms_tags %}
+
+{% block content %}
+<div class="review__content-detail">
+    <div>
+        <a class="review__remove-btn" type="button" data-toggle="modal" data-target="#exampleModal">
+            <i class="fa fa-trash fa-3x" aria-hidden="true"></i>
+        </a>
+    </div>
+    <div class="review-content">
+            <span>A facebook user: Posted at {{ review.create_time | date:"M dS, Y" }}</span> <br>
+    </div>
+    <p class="mt-5">{{ review.review_text }}</p>
+    <p class="mt-5">{{ review.facebookreviewreply.replied_text }}</p>
+
+<!-- Modal -->
+<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+        <div class="modal-header">
+            <h5 class="modal-title" id="exampleModalLabel">Do you want to remove this reivew?</h5>
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+            <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+        <div class="modal-body">
+            This will delete the review from the database and might add it while syncing with the google review API.
+        </div>
+        <div class="modal-footer">
+            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+            <a type="button" class="btn btn-primary" href="{% url 'facebook-reviews-delete' review.id %}">Remove</a>
+        </div>
+        </div>
+    </div>
+</div>
+</div> 
+{% endblock content %}

+ 3 - 1
facebook_app/urls.py

@@ -1,7 +1,9 @@
 from django.urls import path
 from django.urls import path
-from .views import FacebookReviews, FacebookReviewPrediction
+from .views import FacebookReviews, FacebookReviewPrediction, ReviewDetails, DeleteReview
 
 
 urlpatterns = [
 urlpatterns = [
     path('', FacebookReviews.as_view(), name='facebook-reviews'),
     path('', FacebookReviews.as_view(), name='facebook-reviews'),
     path('prediction/<id>', FacebookReviewPrediction.as_view(), name='facebook-reviews-prediction'),
     path('prediction/<id>', FacebookReviewPrediction.as_view(), name='facebook-reviews-prediction'),
+    path('details/<pk>', ReviewDetails.as_view(), name='facebook-reviews-details'),
+    path('delete/<review_id>', DeleteReview.as_view(), name='facebook-reviews-delete'),
 ]
 ]

+ 16 - 1
facebook_app/views.py

@@ -1,6 +1,6 @@
 from django.shortcuts import render
 from django.shortcuts import render
 from django.shortcuts import redirect
 from django.shortcuts import redirect
-from django.views.generic import View
+from django.views.generic import View, DetailView
 from django.contrib import messages
 from django.contrib import messages
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
 from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
@@ -107,3 +107,18 @@ class FacebookReviewPrediction(LoginRequiredMixin, PermissionRequiredMixin, View
 
 
         }
         }
         return render(request, 'facebook-reviews.html', context=context)
         return render(request, 'facebook-reviews.html', context=context)
+
+
+class ReviewDetails(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
+    permission_required = 'is_admin'
+    model = FacebookReview
+    template_name='facebook_review_details.html'
+    context_object_name='review'
+
+class DeleteReview(LoginRequiredMixin, PermissionRequiredMixin, View):
+    permission_required = 'is_admin'
+    
+    def get(self, requset, review_id, *args, **kwargs):
+        review = FacebookReview.objects.filter(id=review_id).first()
+        res = review.delete()
+        return redirect('facebook-reviews')