Fakultas Ilmu Komputer UI

views.py 33.7 KB
Newer Older
1
2
import mimetypes
import os
3
from io import BytesIO
4
from register.services import MailService
5

6
import django
7
from decouple import config
8
import pandas as pd
9
from django.conf import settings
10
from django.contrib import messages
11
12
13
from django.contrib.auth.views import PasswordChangeForm
from django.contrib.auth.views import PasswordChangeView
from django.core.exceptions import PermissionDenied, FieldError
14
from django.core.mail import send_mail
15
from django.core.paginator import Paginator
16
from django.db.models import Q, Avg, Count
17
18
from django.http import (Http404, HttpResponse, HttpResponseRedirect,
                         JsonResponse)
19
20
from django.shortcuts import get_object_or_404, redirect
from django.shortcuts import render
21
from django.template import loader
22
from django.urls import reverse
23
from django.urls import reverse_lazy
24
from django.views import defaults
25
from django.views.generic import TemplateView
26

27
from app.forms import SuntingProfilForm, UploadMateriForm, RatingContributorForm
28
29
30
from app.models import (
    Category,
    Comment,
31
    Review,
32
    Materi,
Yusuf T Ardho's avatar
Yusuf T Ardho committed
33
    LaporanMateri,
34
    ReqMaterial,
35
    Rating, RatingContributor,
Anthony Dewa Priyasembada's avatar
Anthony Dewa Priyasembada committed
36
37
    SubmitVisitor,
    ReadLater
38
)
39
from authentication.models import User
40
41
from .services import DafterKatalogService, DetailMateriService, LikeDislikeService, MateriFieldValidationHelperService, \
    DownloadViewMateriHelperService, UploadMateriService, EditProfileService, RevisiMateriService, \
Anthony Dewa Priyasembada's avatar
Anthony Dewa Priyasembada committed
42
    DownloadHistoryService, GoogleDriveUploadService, ReadLaterService
43

44
45
46
47
48
49
50
MISSING_PARAMETER_MESSAGE = "Missing parameter"
UNSUPPORTED_MESSAGE = "Unsuported method"
FILE_NOT_FOUND_MESSAGE = "File tidak dapat ditemukan."
UNGGAH_HTML = "unggah.html"
UNGGAH_URL = "/unggah/"
UNGGAH_EXCEL_URL = "/unggah_excel/"
LOGIN_URL = "/login/"
51

52
def permission_denied(request, exception, template_name="error_403.html"):
53
54
    return defaults.permission_denied(request, exception, template_name)

55

56
class DaftarKatalog(TemplateView):
igor lestin sianipar's avatar
igor lestin sianipar committed
57
    paginate_by = 2
58
59
60
61
62
63
64
    template_name = "app/katalog_materi.html"

    def get_context_data(self, **kwargs):
        return super().get_context_data(**kwargs)

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
65
        context["kategori_list"] = Category.objects.all()
66

67
        lst_materi = Materi.objects.filter(status="APPROVE").order_by("date_modified")
Mika dabelza abi's avatar
Mika dabelza abi committed
68
69
        url = ""

70
        lst_materi, url = DafterKatalogService.apply_options(lst_materi, request, url)
Saul Andre's avatar
Saul Andre committed
71

72

73
        context["materi_list"] = lst_materi
Mika dabelza abi's avatar
Mika dabelza abi committed
74
        paginator = Paginator(context["materi_list"], 15)
75
        page_number = request.GET.get("page")
Mika dabelza abi's avatar
Mika dabelza abi committed
76
77
78
79
        page_obj = paginator.get_page(page_number)
        context["materi_list"] = page_obj

        context["url"] = url
80
81
        return self.render_to_response(context=context)

82

83
84
class KatalogPerKontributorView(TemplateView):
    template_name = "app/katalog_kontri.html"
85

86
87
88
89
90
91
92
93
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        contributor = get_object_or_404(User, email=kwargs["email"])
        context["contributor"] = contributor
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
94
95
96
97
98

        materi_list = Materi.objects.filter(status="APPROVE", uploader=context["contributor"]).order_by(
            "date_modified"
        )

99
        paginator = Paginator(materi_list, 15)
100
        page_number = request.GET.get("page")
101
102
        materi_list_by_page = paginator.get_page(page_number)
        context["materi_list"] = materi_list_by_page
103
104
105
106
107
        contributor = context["contributor"]
        context["form_rating"] = RatingContributorForm(initial={
            "contributor": contributor,
            "user":request.user
        })
108
        context["avg_rating"] = User.objects.filter(email=kwargs["email"]) \
109
110
111
112
113
114
115
            .annotate(avg_rating=Avg("contributor__score"))[0]
        context["count_rating"] = RatingContributor.objects.filter(contributor=contributor).count()

        if request.user.is_authenticated:
            has_rated = RatingContributor.objects.filter(user=request.user, contributor=contributor).exists()
            context["has_rated"] = has_rated

116
        return self.render_to_response(context=context)
117

118
    def post(self, request, *args, **kwargs):
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
        context = self.get_context_data(**kwargs)
        if not request.user.is_authenticated:
            raise PermissionDenied(request)

        is_delete = request.POST.get('delete', None)
        is_update = request.POST.get('update', None)
        if is_delete:
            rating_contributor = get_object_or_404(
                RatingContributor, 
                user=request.user,
                contributor=context["contributor"]
            )
            rating_contributor.delete()
        elif is_update:
            score = request.POST.get('score', None)
            rating = RatingContributor.objects.filter(
                user=request.user,
                contributor=context["contributor"]
            ).first()
            
            if rating and score:
                rating.score = int(score)
                rating.save()
        else:
            data = RatingContributorForm(request.POST)
            if data.is_valid():
                data.save()
                
147
148
        return redirect("katalog-per-kontributor", email=kwargs["email"])

149
150
151
152
class DetailMateri(TemplateView):
    template_name = "app/detail_materi.html"

    def get_context_data(self, **kwargs):
153
154
155
156
        context = super(DetailMateri, self).get_context_data(**kwargs)
        if not self.request.session or not self.request.session.session_key:
            self.request.session.save()
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
157
158
159
        DetailMateriService.init_context_data(context, materi, self.request.session)
        published_date = DetailMateriService.set_published_date(materi)
        DetailMateriService.init_citation_and_materi_rating(context, materi, published_date, self.request)
160
        DetailMateriService.init_materi_download_count(context, materi)
161
162
163
164

        if self.request.user.is_authenticated:
            materi_rating = Rating.objects.filter(materi=materi, user=self.request.user).first()
            if materi_rating is not None:
165
                context['materi_rating_score'] = materi_rating.score
166

Anthony Dewa Priyasembada's avatar
Anthony Dewa Priyasembada committed
167
168
169
170
171
172
            materi_read_later = ReadLater.objects.filter(materi=materi, user=self.request.user).first()
            if materi_read_later is not None:
                context['is_in_read_later_list'] = True
            else:
                context['is_in_read_later_list'] = False

173
        context['is_authenticated'] = self.request.user.is_authenticated
174

175
        return context
176

177

178
179
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
180
        query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
181
        query_set_for_review = Review.objects.filter(materi=context["materi_data"])
182
        has_disliked, has_liked = DetailMateriService.find_comment_like_dislike(query_set_for_comment, self.request.session)
183
        context["comment_data"] = query_set_for_comment
184
        context["review_data"] = query_set_for_review
185
186
        context["has_liked_comment"] = has_liked
        context["has_disliked_comment"] = has_disliked
187
188
        return self.render_to_response(context=context)

189

190

191
    def post(self, request, *args, **kwargs):
192
193
        comment_text = request.POST.get("comment", None)
        review_text  = request.POST.get("review", None)
Yusuf T Ardho's avatar
Yusuf T Ardho committed
194
195
196
197
        report_text = request.POST.get("report", None)
        if ((comment_text == None or comment_text == "" ) and \
            (review_text == None or review_text == "") and \
            (report_text == None or report_text == "")):
198
199
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
200
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
201
            query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
202
            context["comment_data"] = query_set_for_comment
203
204
            query_set_for_review = Review.objects.filter(materi=context["materi_data"])
            context["review_data"] = query_set_for_review
205
            return self.render_to_response(context=context)
206

207
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
208
        user_obj = request.user if request.user.is_authenticated else None
209
        if user_obj:
210
            if (comment_text != None ):
211
                comment = Comment.objects.create(
212
                    comment=comment_text, username=DetailMateriService.get_user_name(request), materi=materi, user=user_obj
213
214
                )
                comment.save()
215
216
217
218
219
220
                materi_uploader = materi.uploader
                if materi_uploader.is_subscribing_to_material_comments and user_obj.email != materi_uploader.email:
                    email_content =  f'User dengan email {user_obj.email} ' + \
                        f'menambahkan komentar pada materi Anda dengan judul "{materi.title}".' + \
                        f'\nKomentar: "{comment.comment}".\n' + \
                        f'Silahkan akses halaman detail materi untuk berinteraksi lebih lanjut.'
221
222

                    MailService.send(
223
224
225
226
                        subject = 'DIGIPUS: Komentar Baru pada Materi Anda',
                        message = email_content,
                        from_email = getattr(settings, 'EMAIL_HOST_USER'),
                        recipient_list = [materi_uploader.email,],
227
                    ) 
228
            elif (review_text != None):
229
                review = Review.objects.create(
230
                    review=review_text, username=DetailMateriService.get_user_name(request), materi=materi, user=user_obj
231
232
                )
                review.save()
Yusuf T Ardho's avatar
Yusuf T Ardho committed
233
234
235
236
237
            elif (report_text != None):
                laporan_materi = LaporanMateri.objects.create(
                    materi=materi, laporan=report_text, user=user_obj
                )
                laporan_materi.save()
238
239
        return HttpResponseRedirect(request.path)

240

241
def toggle_like(request):
242
243
244
    if request.method == "POST":
        materi_id = request.POST.get("materi_id", None)
        session_id = request.POST.get("session_id", None)
245
        if materi_id is None or session_id is None:
246
            return JsonResponse({"success": False, "msg": MISSING_PARAMETER_MESSAGE})
247
        return JsonResponse(LikeDislikeService.apply_like_materi(materi_id, session_id))
248
    else:
249
        return JsonResponse({"success": False, "msg": UNSUPPORTED_MESSAGE})
250
251


252
def delete_comment(request, pk_materi, pk_comment):
253
254
    if not request.user.is_authenticated or not request.user.is_admin:
        raise PermissionDenied(request)
255
    comment = get_object_or_404(Comment, pk=pk_comment)
256
    url = "/materi/" + str(pk_materi) + "/"
257
258
259
    comment.delete()
    return HttpResponseRedirect(url)

260
def toggle_like_comment(request):
261
    comment_id = 0
262
263
264
265
    if request.method == "POST":
        comment_id = request.POST.get("comment_id", None)
        session_id = request.POST.get("session_id", None)
        if comment_id is None or session_id is None:
266
            return JsonResponse({"success": False, "msg": MISSING_PARAMETER_MESSAGE, "comment_id": comment_id})
267
        return JsonResponse(LikeDislikeService.apply_comment_like(comment_id, session_id))
268
    else:
269
        return JsonResponse({"success": False, "msg": UNSUPPORTED_MESSAGE, "comment_id": comment_id})
270

271

272
def toggle_dislike_comment(request):
273
    comment_id = 0
274
275
276
277
    if request.method == "POST":
        comment_id = request.POST.get("comment_id", None)
        session_id = request.POST.get("session_id", None)
        if comment_id is None or session_id is None:
278
            return JsonResponse({"success": False, "msg": MISSING_PARAMETER_MESSAGE, "comment_id": comment_id})
279
        return JsonResponse(LikeDislikeService.apply_comment_dislike(comment_id, session_id))
280
    else:
281
        return JsonResponse({"success": False, "msg": UNSUPPORTED_MESSAGE, "comment_id": comment_id})
282
283


284
def add_rating_materi(request):
285
    if request.method == "POST" and request.user.is_authenticated:
286

287
288
        materi_id = request.POST.get("materi_id", None)
        rating_score = request.POST.get("rating_score", None)
289
290


291
292
293
294
        is_valid_params, materi_id, \
        rating_score, response, \
        status_code = MateriFieldValidationHelperService.\
            validate_materi_rating_params(materi_id,rating_score)
295

296
297
        if not is_valid_params:
            return JsonResponse(response, status=status_code)
298

299
300
301
        is_valid_rating, materi, \
        response, status_code = MateriFieldValidationHelperService.\
            validate_materi_rating(materi_id, request.user)
302

303
304
        if not is_valid_rating:
            return JsonResponse(response, status=status_code)
305
306

        Rating(materi=materi, user=request.user, score=rating_score).save()
307
308
309
        return JsonResponse(
            {"success": True, "msg": "Rating successfully created", "rating_score": rating_score}, status=201
        )
310
311
312
    return JsonResponse({"success": False, "msg": "Forbidden"}, status=403)


313

314
315
316
317
318
def download_materi(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
    path = materi.content.path
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
319
320
321
        try:
            mimetype = mimetypes.guess_type(file_path)
            with open(file_path, "rb") as fh:
322
323
324
                return DownloadViewMateriHelperService.build_materi_response(fh, file_path,
                                                                             materi, mimetype, request,
                                                                             HttpResponse(fh.read(), content_type=mimetype[0]))
325
326
        except Exception:
            raise Http404(FILE_NOT_FOUND_MESSAGE)
327
    else:
328
        raise Http404(FILE_NOT_FOUND_MESSAGE)
329

igor lestin sianipar's avatar
igor lestin sianipar committed
330

331
332
333
334
335
336
def view_materi(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
    path = materi.content.path
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
        mimetype = mimetypes.guess_type(file_path)
337
338
339
        try:
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
340
                DownloadViewMateriHelperService.build_view_materi_response(file_path, materi, response)
341
                return response
342
343
        except Exception:
            raise Http404(FILE_NOT_FOUND_MESSAGE)
344
    else:
345
        raise Http404(FILE_NOT_FOUND_MESSAGE)
igor lestin sianipar's avatar
igor lestin sianipar committed
346

igor lestin sianipar's avatar
igor lestin sianipar committed
347

Selvy Fitriani's avatar
Selvy Fitriani committed
348
349
def delete_materi(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
350
351
352
    if request.user.is_superuser or request.user.is_admin:
        materi.soft_delete()
        return HttpResponseRedirect("/administration/")
Selvy Fitriani's avatar
Selvy Fitriani committed
353
354
355
    materi.delete()
    return HttpResponseRedirect("/dashboard/")

igor lestin sianipar's avatar
igor lestin sianipar committed
356
class UploadMateriView(TemplateView):
357
    template_name = UNGGAH_HTML
igor lestin sianipar's avatar
igor lestin sianipar committed
358
    context = {}
359
    redirect_path = "/unggah/"
igor lestin sianipar's avatar
igor lestin sianipar committed
360
361
362
363
364

    def get_context_data(self, **kwargs):
        context = super(UploadMateriView, self).get_context_data(**kwargs)
        return context

Saul Andre's avatar
Saul Andre committed
365
    def post(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
366
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
367
            raise PermissionDenied(request)
368
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
369
370
371
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
372
            konten = form.cleaned_data["content"]
373
374
            yt_url_id = form.cleaned_data['yt_video_id']
            if not UploadMateriService.validate_file_extension(konten, request, yt_url_id):
375
                return HttpResponseRedirect(UNGGAH_URL)
376
            UploadMateriService.upload_materi(form, materi)
377
            messages.success(request, "Materi berhasil diunggah, periksa riwayat unggah anda")
378
            return HttpResponseRedirect(UNGGAH_URL)
Saul Andre's avatar
Saul Andre committed
379
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
380
            context = self.get_context_data(**kwargs)
381
            context["form"] = form
382
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
383
384
            return self.render_to_response(context)

385
386


igor lestin sianipar's avatar
igor lestin sianipar committed
387
    def get(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
388
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
389
            raise PermissionDenied(request)
390

igor lestin sianipar's avatar
igor lestin sianipar committed
391
        context = self.get_context_data(**kwargs)
392
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
393
        return self.render_to_response(context)
394

395

396
class UploadMateriHTML(TemplateView):
397
    template_name = UNGGAH_HTML
398
    context = {}
igor lestin sianipar's avatar
igor lestin sianipar committed
399

400

401
402
403
404
405
class UploadMateriExcelView(TemplateView):
    template_name = "unggah_excel.html"
    context = {}

    def get_template_names(self):
406
        if self.request.path == UNGGAH_EXCEL_URL:
407
408
409
410
411
            template_name = "unggah_excel.html"
        return template_name

    def get(self, request, *args, **kwargs):

412
        if "template" in self.request.GET:
413

414
415
416
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
417
418

            with BytesIO() as b:
419
                writer = pd.ExcelWriter(b, engine="xlsxwriter")  # pylint: disable=abstract-class-instantiated
420
421
422
                data_frame.to_excel(writer, index=0)
                writer.save()
                response = HttpResponse(
423
424
                    b.getvalue(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                )
425
426
427
428
429
430
431
432
433
434

                response["Content-Disposition"] = "attachment; filename=template.xlsx"

                return response

        else:
            context = self.get_context_data(**kwargs)
            return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
435
436
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
437

438
        row, lines = excel.shape
439
        categories = Category.objects.all()
440

441
        field_length = {
442
443
444
            "title": 50,
            "author": 30,
            "publisher": 30,
445
446
447
448
449
450
        }

        message = None

        # First pass, validate input
        for i in range(row):
451

452
            # Validate Categories
453
            message = UploadMateriService.validate_excel_categories(categories, excel, i, message)
454

455
            message = UploadMateriService.validate_excel_field_length(excel, field_length, i, message)
456
457
458

            if message != None:
                break
459

460
461
        if message != None:
            messages.error(request, message)
462
            return HttpResponseRedirect(UNGGAH_EXCEL_URL)
463
464
465

        # Second pass, save data
        with django.db.transaction.atomic():
466
            UploadMateriService.upload_materi_excel(categories, excel, request, row)
467

468
        messages.success(request, "Materi berhasil diunggah")
469

470
        return HttpResponseRedirect(UNGGAH_EXCEL_URL)
471
472


473
474


475
class DashboardKontributorView(TemplateView):
476
    template_name = "dashboard.html"
477
478
479
480
481
482
483

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated or not request.user.is_contributor:
            raise PermissionDenied(request)
        return super(DashboardKontributorView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
484
        context = super(DashboardKontributorView, self).get_context_data(**kwargs)
485
486
487
488
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
489
490
491
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
492
        return self.render_to_response(context)
493

494

495
class ProfilView(TemplateView):
496
497
498
    template_name = "profil.html"

    def dispatch(self, request, *args, **kwargs):
499
        if not request.user.is_authenticated:
500
            raise PermissionDenied(request)
501
        return super(ProfilView, self).dispatch(request, *args, **kwargs)
502
503
504

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
505
        current_user = request.user
506
507
508
        context["user"] = current_user
        return self.render_to_response(context)

509

510
511
512
513
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

    def dispatch(self, request, *args, **kwargs):
514
        if not request.user.is_authenticated:
515
516
517
518
            raise PermissionDenied(request)
        return super(SuntingProfilView, self).dispatch(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
Samuel Dimas Partogi's avatar
Samuel Dimas Partogi committed
519
        current_user = self.request.user
520
521
522
523
524
525
526
527
528
529
        context = self.get_context_data(**kwargs)
        context["user"] = current_user
        context["form"] = SuntingProfilForm(instance=current_user)
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

        current_user = self.request.user
530

531
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
532
533
        if form.is_valid():
            current_user.default_profile_picture = True
534
535
536

            # Removing exifdata from profile picture on upload
            if request.FILES:
537
                EditProfileService.update_profile_picture(current_user, request)
538
            else:
539
                form.save()
540
            return HttpResponseRedirect("/profil/")
541
542
        else:
            context = self.get_context_data(**kwargs)
543
544
            context["form"] = form
            return self.render_to_response(context)
545

546

547
548
549
550
551
class ReqMateriView(TemplateView):
    template_name = "req_materi.html"

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated == False:
552
            return HttpResponseRedirect(LOGIN_URL)
553
554
555
        return super(ReqMateriView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
556
        context = super(ReqMateriView, self).get_context_data(**kwargs)
557
558
559
560
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
561
        context['requested_material'] = ReqMaterial.objects.all()
562
563
564
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
565
        title = request.POST.get("title", None)
566
        if title is None:
567
            return JsonResponse({"success": False, "msg": MISSING_PARAMETER_MESSAGE})
568
569
570
        ReqMaterial(title=title).save()
        return JsonResponse({"success": True, "msg": "Permintaan materi berhasil dikirimkan"})

571

572
573
574
575
576
577
578
class SuksesLoginKontributorView(TemplateView):
    template_name = "sukses_kontri.html"

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_contributor:
            raise PermissionDenied(request)
        return super(SuksesLoginKontributorView, self).dispatch(request, *args, **kwargs)
579

580
    def get_context_data(self, **kwargs):
581
        context = super(SuksesLoginKontributorView, self).get_context_data(**kwargs)
582
583
584
585
586
587
588
589
590
591
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)

        current_user = self.request.user
        context["user"] = current_user

        return self.render_to_response(context)

592

593
594
595
596
597
598
599
class SuksesLoginAdminView(TemplateView):
    template_name = "sukses_admin.html"

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_admin:
            raise PermissionDenied(request)
        return super(SuksesLoginAdminView, self).dispatch(request, *args, **kwargs)
600

601
602
603
604
605
606
607
608
609
610
611
612
    def get_context_data(self, **kwargs):
        context = super(SuksesLoginAdminView, self).get_context_data(**kwargs)
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)

        current_user = self.request.user
        context["user"] = current_user

        return self.render_to_response(context)

igor lestin sianipar's avatar
igor lestin sianipar committed
613

614
615
616
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
617
618

    def dispatch(self, request, *args, **kwargs):
619
        if not request.user.is_authenticated:
620
            raise PermissionDenied(request)
621
        return super(PostsView, self).dispatch(request, *args, **kwargs)
622
623

    def get(self, request, *args, **kwargs):
624
625
626
627
        context = super().get_context_data(**kwargs)
        user = self.request.user

        posts = Materi.objects.filter(uploader=user).order_by("-date_created")
628
        posts_data = {post.id: {"data": post, "comments": []} for post in posts}
629

630
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
631
632
633
634
635
636
637

        for comment in comments:
            posts_data[comment.materi.id]["comments"].append(comment)

        context["user"] = user
        context["posts"] = posts_data

638
        return self.render_to_response(context=context)
639

640

641
642
643
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

644
    def dispatch(self, request, *args, **kwargs):
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
        if not request.user.is_contributor:
            raise PermissionDenied(request)
        return super(RevisiMateriView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(RevisiMateriView, self).get_context_data(**kwargs)
        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
        context["materi"] = current_materi
        context["revisi_form"] = UploadMateriForm(instance=current_materi)
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

660
    def post(self, request, *args, **kwargs):
661
662
663
664
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
665
        form = UploadMateriForm(request.POST, request.FILES, instance=current_materi)
666
        if form.is_valid():
667
            RevisiMateriService.revisi_materi(form, request)
668
669
670
671
672
673
            return HttpResponseRedirect("/dashboard/")
        else:
            context = self.get_context_data(**kwargs)
            context["form_revisi"] = form
            return self.render_to_response(context)

674

Samuel Dimas's avatar
Samuel Dimas committed
675
676
677
678
679
680
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

681
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
682
683
684
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

685
    except Exception:
Samuel Dimas's avatar
Samuel Dimas committed
686

687
        template = loader.get_template("error-404.html")
Samuel Dimas's avatar
Samuel Dimas committed
688
        return HttpResponse(template.render(context, request))
689
690


691
692
693
694
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
695
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
696
697
698
699
700
701
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        if request.user.is_authenticated:
            current_user = self.request.user
702
            DownloadHistoryService.init_data_authenticated_user(context, current_user)
703
        else:
704
            DownloadHistoryService.init_data_guest_user(context, request)
705
        return self.render_to_response(context)
706

707

708
709
710
711
712
def save_to_gdrive(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
    path = materi.content.path
    file_path = os.path.join(settings.MEDIA_ROOT, path)
    if os.path.exists(file_path):
713
        GoogleDriveUploadService.upload_to_gdrive(file_path, materi.title)
714
    else:
715
        raise Http404(FILE_NOT_FOUND_MESSAGE)
716

Yaumi's avatar
Yaumi committed
717
718
    return HttpResponseRedirect(reverse('detail-materi', kwargs={'pk': pk}))

719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
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 = { mat.id: { "data": mat, "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)

Yaumi's avatar
Yaumi committed
747
class PasswordChangeViews(PasswordChangeView):
748

Yaumi's avatar
Yaumi committed
749
750
    from_class = PasswordChangeForm
    success_url = reverse_lazy('password_success')
Yaumi's avatar
Yaumi committed
751

Yaumi's avatar
Yaumi committed
752
def password_success(request):
753
    return render(request, 'password_success.html', {})
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777


def see_given_rating(request):
    if request.user.is_authenticated:
        order_by_key = request.GET.get('order_by_key', 'timestamp')

        if request.GET.get('order', '').lower() == 'asc':
            order_by = 'asc'
            query_order = ''
        else:
            order_by = 'dsc'
            query_order = '-'

        try:
            if order_by_key[0] == '-':
                order_by_key = order_by_key[1:]
            rating_list = Rating.objects.filter(user=request.user).order_by(query_order + order_by_key)
        except FieldError:
            order_by_key = 'timestamp'
            rating_list = Rating.objects.filter(user=request.user).order_by(query_order + order_by_key)

        return render(request, 'given-rating.html',
                      context={'rating_list': rating_list, 'order_by_key': order_by_key, 'order_by': order_by})
    return permission_denied(request, exception=None)
insan ramadhan's avatar
insan ramadhan committed
778
779
780
781
782
783

class SubmitVisitorView(TemplateView):
    template_name = "submit_visitor.html"

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated == False:
784
            return HttpResponseRedirect(LOGIN_URL)
insan ramadhan's avatar
insan ramadhan committed
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
        return super(SubmitVisitorView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(SubmitVisitorView, self).get_context_data(**kwargs)
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        title = request.POST.get("title", None)
        email = request.POST.get("email", None)
        user_id = request.POST.get("user_id", None)
        if title is None:
800
            return JsonResponse({"success": False, "msg": MISSING_PARAMETER_MESSAGE})
insan ramadhan's avatar
insan ramadhan committed
801
802
        SubmitVisitor(msg=title, user_id=user_id, email=email).save()
        return JsonResponse({"success": True, "msg": "Buku tamu berhasil ditambahkan"})
803

Anthony Dewa Priyasembada's avatar
Anthony Dewa Priyasembada committed
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
class ReadLaterView(TemplateView):
    template_name = 'baca-nanti.html'

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            raise PermissionDenied(request)
        return super(ReadLaterView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(ReadLaterView, self).get_context_data(**kwargs)
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        user = self.request.user
        context["read_later_list"] = ReadLater.objects.filter(user=user).order_by('-timestamp')
        return self.render_to_response(context)

def toggle_readlater(request):
    if request.method == "POST":
        materi_id = request.POST.get("materi_id", None)
        if materi_id is None:
826
            return JsonResponse({"success": False, "msg": MISSING_PARAMETER_MESSAGE})
Anthony Dewa Priyasembada's avatar
Anthony Dewa Priyasembada committed
827
828
829
        
        return JsonResponse(ReadLaterService.toggle_read_later(materi_id, request.user))
    else:
830
        return JsonResponse({"success": False, "msg": UNSUPPORTED_MESSAGE})
Anthony Dewa Priyasembada's avatar
Anthony Dewa Priyasembada committed
831

832
833
834
835
836
class StatisticsView(TemplateView):
    template_name = "statistik.html"

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated == False:
837
            return HttpResponseRedirect(LOGIN_URL)
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
        return super(StatisticsView, self).dispatch(request, *args, **kwargs)

    def get_stat_json(self):
        query = Category.objects.annotate(num=Count('materi')).order_by('-num')

        # Take maximum 10 Category
        result = []
        for e in query:
            if len(result) >= 6:
                break
            else:
                result.append(e)

        chart_data = {
                'labels': [e.name for e in result],
                'datasets': [{
                    'label': 'Jumlah Materi per Kategori',
                    'data': [e.num for e in result],
                    'backgroundColor': [
                        'rgba(255, 99, 132, 0.2)',
                        'rgba(54, 162, 235, 0.2)',
                        'rgba(255, 206, 86, 0.2)',
                        'rgba(75, 192, 192, 0.2)',
                        'rgba(153, 102, 255, 0.2)',
                        'rgba(255, 159, 64, 0.2)'
                    ],
                    'borderColor': [
                        'rgba(255, 99, 132, 1)',
                        'rgba(54, 162, 235, 1)',
                        'rgba(255, 206, 86, 1)',
                        'rgba(75, 192, 192, 1)',
                        'rgba(153, 102, 255, 1)',
                        'rgba(255, 159, 64, 1)'
                    ],
                    'borderWidth': 1
                }]
            }
        return chart_data

    def get(self, request, *args, **kwargs):
        if request.GET.get('data') == 'json':
            return JsonResponse(self.get_stat_json())

        else:
            context = self.get_context_data(**kwargs)

            query = Category.objects.annotate(num=Count('materi'))
            context['stats'] = query

            return self.render_to_response(context)
888
889
890
891
892
893
894
895
896
897
898
899
900
901

class MostContributor(TemplateView):
    template_name = "most-contributor.html"

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            raise PermissionDenied(request)
        return super(MostContributor, self).dispatch(request, *args, **kwargs)

    def count_contributor(self):
        count_materi = Materi.objects.all.count()
        content = {'count_materi':count_materi}
        print(content)
        return content