Fakultas Ilmu Komputer UI

views.py 26.1 KB
Newer Older
1
2
import mimetypes
import os
3
from io import BytesIO
4

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

24
from app.forms import SuntingProfilForm, UploadMateriForm, RatingContributorForm
25
26
27
from app.models import (
    Category,
    Comment,
28
    Review,
29
30
    Materi,
    ReqMaterial,
31
    Rating, RatingContributor,
32
)
33
from authentication.models import User
34
35
36
37
from .services import DafterKatalogService, DetailMateriService, LikeDislikeService, MateriFieldValidationHelperService, \
    DownloadViewMateriHelperService, UploadMateriService, EditProfileService, RevisiMateriService, \
    DownloadHistoryService, GoogleDriveUploadService

38

39
def permission_denied(request, exception, template_name="error_403.html"):
40
41
    return defaults.permission_denied(request, exception, template_name)

42

43
class DaftarKatalog(TemplateView):
igor lestin sianipar's avatar
igor lestin sianipar committed
44
    paginate_by = 2
45
46
47
48
49
50
51
    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)
52
        context["kategori_list"] = Category.objects.all()
53

Mika dabelza abi's avatar
Mika dabelza abi committed
54
        lstMateri = Materi.objects.filter(status="APPROVE").order_by("date_modified")
Mika dabelza abi's avatar
Mika dabelza abi committed
55
56
        url = ""

57
        lstMateri, url = DafterKatalogService.apply_options(lstMateri, request, url)
Saul Andre's avatar
Saul Andre committed
58

59

Mika dabelza abi's avatar
Mika dabelza abi committed
60
        context["materi_list"] = lstMateri
Mika dabelza abi's avatar
Mika dabelza abi committed
61
        paginator = Paginator(context["materi_list"], 15)
62
        page_number = request.GET.get("page")
Mika dabelza abi's avatar
Mika dabelza abi committed
63
64
65
66
        page_obj = paginator.get_page(page_number)
        context["materi_list"] = page_obj

        context["url"] = url
67
68
        return self.render_to_response(context=context)

69

70
71
class KatalogPerKontributorView(TemplateView):
    template_name = "app/katalog_kontri.html"
72

73
74
75
76
77
78
79
80
    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)
81
82
83
84
85

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

86
        paginator = Paginator(materi_list, 15)
87
        page_number = request.GET.get("page")
88
89
        materi_list_by_page = paginator.get_page(page_number)
        context["materi_list"] = materi_list_by_page
90
        contributor = get_object_or_404(User, email=kwargs["email"])
91
        context["form_rating"] = RatingContributorForm(initial={"user": contributor})
92
93
94
        context["avg_rating"] = User.objects.filter(email=kwargs["email"]) \
            .annotate(avg_rating=Avg("ratingcontributor__score"))[0]
        context["count_rating"] = RatingContributor.objects.filter(user=contributor).count()
95
        return self.render_to_response(context=context)
96

97
98
99
100
    def post(self, request, *args, **kwargs):
        data = RatingContributorForm(request.POST)
        if data.is_valid():
            data.save()
101
102
        return redirect("katalog-per-kontributor", email=kwargs["email"])

103

104
105
106
107
class DetailMateri(TemplateView):
    template_name = "app/detail_materi.html"

    def get_context_data(self, **kwargs):
108
109
110
111
        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"])
112
113
114
        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)
115
116
117
118

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

121
        context['is_authenticated'] = self.request.user.is_authenticated
122

123
        return context
124

125

126
127
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
128
        query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
129
        query_set_for_review = Review.objects.filter(materi=context["materi_data"])
130
        has_disliked, has_liked = DetailMateriService.find_comment_like_dislike(query_set_for_comment, self.request.session)
131
        context["comment_data"] = query_set_for_comment
132
        context["review_data"] = query_set_for_review
133
134
        context["has_liked"] = has_liked
        context["has_disliked"] = has_disliked
135
136
        return self.render_to_response(context=context)

137

138

139
    def post(self, request, *args, **kwargs):
140
141
142
        comment_text = request.POST.get("comment", None)
        review_text  = request.POST.get("review", None)
        if ((comment_text == None or comment_text == "" )and (review_text == None or review_text == "")):
143
144
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
145
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
146
            query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
147
            context["comment_data"] = query_set_for_comment
148
149
            query_set_for_review = Review.objects.filter(materi=context["materi_data"])
            context["review_data"] = query_set_for_review
150
            return self.render_to_response(context=context)
151

152
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
153
        user_obj = request.user if request.user.is_authenticated else None
154
        if user_obj:
155
            if (comment_text != None ):
156
                comment = Comment.objects.create(
157
                    comment=comment_text, username=DetailMateriService.get_user_name(request), materi=materi, user=user_obj
158
159
                )
                comment.save()
160
            elif (review_text != None):
161
                review = Review.objects.create(
162
                    review=review_text, username=DetailMateriService.get_user_name(request), materi=materi, user=user_obj
163
164
                )
                review.save()
165
166
        return HttpResponseRedirect(request.path)

167

168
def toggle_like(request):
169
170
171
    if request.method == "POST":
        materi_id = request.POST.get("materi_id", None)
        session_id = request.POST.get("session_id", None)
172
173
        if materi_id is None or session_id is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
174
        return JsonResponse(LikeDislikeService.apply_like_materi(materi_id, session_id))
175
176
177
178
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method"})


179
def delete_comment(request, pk_materi, pk_comment):
180
181
    if not request.user.is_authenticated or not request.user.is_admin:
        raise PermissionDenied(request)
182
    comment = get_object_or_404(Comment, pk=pk_comment)
183
    url = "/materi/" + str(pk_materi) + "/"
184
185
186
    comment.delete()
    return HttpResponseRedirect(url)

187
def toggle_like_comment(request):
188
    comment_id = 0
189
190
191
192
193
    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:
            return JsonResponse({"success": False, "msg": "Missing parameter", "comment_id": comment_id})
194
        return JsonResponse(LikeDislikeService.apply_comment_like(comment_id, session_id))
195
196
197
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method", "comment_id": comment_id})

198

199
def toggle_dislike_comment(request):
200
    comment_id = 0
201
202
203
204
205
    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:
            return JsonResponse({"success": False, "msg": "Missing parameter", "comment_id": comment_id})
206
        return JsonResponse(LikeDislikeService.apply_comment_dislike(comment_id, session_id))
207
208
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method", "comment_id": comment_id})
209
210


211
def add_rating_materi(request):
212
    if request.method == "POST" and request.user.is_authenticated:
213

214
215
        materi_id = request.POST.get("materi_id", None)
        rating_score = request.POST.get("rating_score", None)
216
217


218
219
220
221
        is_valid_params, materi_id, \
        rating_score, response, \
        status_code = MateriFieldValidationHelperService.\
            validate_materi_rating_params(materi_id,rating_score)
222

223
224
        if not is_valid_params:
            return JsonResponse(response, status=status_code)
225

226
227
228
        is_valid_rating, materi, \
        response, status_code = MateriFieldValidationHelperService.\
            validate_materi_rating(materi_id, request.user)
229

230
231
        if not is_valid_rating:
            return JsonResponse(response, status=status_code)
232
233

        Rating(materi=materi, user=request.user, score=rating_score).save()
234
235
236
        return JsonResponse(
            {"success": True, "msg": "Rating successfully created", "rating_score": rating_score}, status=201
        )
237
238
239
    return JsonResponse({"success": False, "msg": "Forbidden"}, status=403)


240

241
242
243
244
245
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):
246
247
248
        try:
            mimetype = mimetypes.guess_type(file_path)
            with open(file_path, "rb") as fh:
249
250
251
                return DownloadViewMateriHelperService.build_materi_response(fh, file_path,
                                                                             materi, mimetype, request,
                                                                             HttpResponse(fh.read(), content_type=mimetype[0]))
252
253
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
254
255
256
    else:
        raise Http404("File tidak dapat ditemukan.")

igor lestin sianipar's avatar
igor lestin sianipar committed
257

258
259
260
261
262
263
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)
264
265
266
        try:
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
267
                DownloadViewMateriHelperService.build_view_materi_response(file_path, materi, response)
268
269
270
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
271
272
    else:
        raise Http404("File tidak dapat ditemukan.")
igor lestin sianipar's avatar
igor lestin sianipar committed
273

igor lestin sianipar's avatar
igor lestin sianipar committed
274

Selvy Fitriani's avatar
Selvy Fitriani committed
275
276
def delete_materi(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
277
278
279
    if request.user.is_superuser or request.user.is_admin:
        materi.soft_delete()
        return HttpResponseRedirect("/administration/")
Selvy Fitriani's avatar
Selvy Fitriani committed
280
281
282
    materi.delete()
    return HttpResponseRedirect("/dashboard/")

igor lestin sianipar's avatar
igor lestin sianipar committed
283
class UploadMateriView(TemplateView):
284
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
285
286
287
288
289
290
    context = {}

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

Saul Andre's avatar
Saul Andre committed
291
    def post(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
292
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
293
            raise PermissionDenied(request)
294
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
295
296
297
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
298
            konten = form.cleaned_data["content"]
299
300
            yt_url_id = form.cleaned_data['yt_video_id']
            if not UploadMateriService.validate_file_extension(konten, request, yt_url_id):
301
                return HttpResponseRedirect("/unggah/")
302
            UploadMateriService.upload_materi(form, materi)
303
            messages.success(request, "Materi berhasil diunggah, periksa riwayat unggah anda")
304
            return HttpResponseRedirect("/unggah/")
Saul Andre's avatar
Saul Andre committed
305
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
306
            context = self.get_context_data(**kwargs)
307
            context["form"] = form
308
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
309
310
            return self.render_to_response(context)

311
312


igor lestin sianipar's avatar
igor lestin sianipar committed
313
    def get(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
314
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
315
            raise PermissionDenied(request)
316

igor lestin sianipar's avatar
igor lestin sianipar committed
317
        context = self.get_context_data(**kwargs)
318
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
319
        return self.render_to_response(context)
320

321

322
323
324
class UploadMateriHTML(TemplateView):
    template_name = "unggah.html"
    context = {}
igor lestin sianipar's avatar
igor lestin sianipar committed
325

326
327
328
329
330
331
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


332
333
334
335
336
337
338
339
340
341
342
class UploadMateriExcelView(TemplateView):
    template_name = "unggah_excel.html"
    context = {}

    def get_template_names(self):
        if self.request.path == "/unggah_excel/":
            template_name = "unggah_excel.html"
        return template_name

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

343
        if "template" in self.request.GET:
344

345
346
347
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
348
349

            with BytesIO() as b:
350
                writer = pd.ExcelWriter(b, engine="xlsxwriter")  # pylint: disable=abstract-class-instantiated
351
352
353
                data_frame.to_excel(writer, index=0)
                writer.save()
                response = HttpResponse(
354
355
                    b.getvalue(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                )
356
357
358
359
360
361
362
363
364
365

                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):
366
367
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
368

369
        row, lines = excel.shape
370
        categories = Category.objects.all()
371

372
        field_length = {
373
374
375
            "title": 50,
            "author": 30,
            "publisher": 30,
376
377
378
379
380
381
        }

        message = None

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

383
            # Validate Categories
384
            message = UploadMateriService.validate_excel_categories(categories, excel, i, message)
385

386
            message = UploadMateriService.validate_excel_field_length(excel, field_length, i, message)
387
388
389

            if message != None:
                break
390

391
392
        if message != None:
            messages.error(request, message)
393
            return HttpResponseRedirect("/unggah_excel/")
394
395
396

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

399
        messages.success(request, "Materi berhasil diunggah")
400

401
        return HttpResponseRedirect("/unggah_excel/")
402
403


404
405


406
class DashboardKontributorView(TemplateView):
407
    template_name = "dashboard.html"
408
409
410
411
412
413
414

    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):
415
        context = super(DashboardKontributorView, self).get_context_data(**kwargs)
416
417
418
419
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
420
421
422
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
423
        return self.render_to_response(context)
424

425

426
class ProfilView(TemplateView):
427
428
429
    template_name = "profil.html"

    def dispatch(self, request, *args, **kwargs):
430
        if not request.user.is_authenticated:
431
            raise PermissionDenied(request)
432
        return super(ProfilView, self).dispatch(request, *args, **kwargs)
433
434
435

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
436
        current_user = request.user
437
438
439
        context["user"] = current_user
        return self.render_to_response(context)

440

441
442
443
444
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

    def dispatch(self, request, *args, **kwargs):
445
        if not request.user.is_authenticated:
446
447
448
449
            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
450
        current_user = self.request.user
451
452
453
454
455
456
457
458
459
460
        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
461

462
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
463
464
        if form.is_valid():
            current_user.default_profile_picture = True
465
466
467

            # Removing exifdata from profile picture on upload
            if request.FILES:
468
                EditProfileService.update_profile_picture(current_user, request)
469
            else:
470
                form.save()
471
            return HttpResponseRedirect("/profil/")
472
473
        else:
            context = self.get_context_data(**kwargs)
474
475
            context["form"] = form
            return self.render_to_response(context)
476

477

478
479
480
481
482
483
484
485
486
class ReqMateriView(TemplateView):
    template_name = "req_materi.html"

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated == False:
            return HttpResponseRedirect("/login/")
        return super(ReqMateriView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
487
        context = super(ReqMateriView, self).get_context_data(**kwargs)
488
489
490
491
492
493
494
        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):
495
        title = request.POST.get("title", None)
496
497
498
499
500
        if title is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
        ReqMaterial(title=title).save()
        return JsonResponse({"success": True, "msg": "Permintaan materi berhasil dikirimkan"})

501

502
503
504
505
506
507
508
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)
509

510
    def get_context_data(self, **kwargs):
511
        context = super(SuksesLoginKontributorView, self).get_context_data(**kwargs)
512
513
514
515
516
517
518
519
520
521
        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)

522

523
524
525
526
527
528
529
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)
530

531
532
533
534
535
536
537
538
539
540
541
542
    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
543

544
545
546
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
547
548

    def dispatch(self, request, *args, **kwargs):
549
        if not request.user.is_authenticated:
550
            raise PermissionDenied(request)
551
        return super(PostsView, self).dispatch(request, *args, **kwargs)
552
553

    def get(self, request, *args, **kwargs):
554
555
556
557
        context = super().get_context_data(**kwargs)
        user = self.request.user

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

560
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
561
562
563
564
565
566
567

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

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

568
        return self.render_to_response(context=context)
569

570

571
572
573
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

574
    def dispatch(self, request, *args, **kwargs):
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
        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)

590
    def post(self, request, *args, **kwargs):
591
592
593
594
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
595
        form = UploadMateriForm(request.POST, request.FILES, instance=current_materi)
596
        if form.is_valid():
597
            RevisiMateriService.revisi_materi(form, request)
598
599
600
601
602
603
            return HttpResponseRedirect("/dashboard/")
        else:
            context = self.get_context_data(**kwargs)
            context["form_revisi"] = form
            return self.render_to_response(context)

604

Samuel Dimas's avatar
Samuel Dimas committed
605
606
607
608
609
610
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

611
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
612
613
614
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

615
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
616

617
        template = loader.get_template("error-404.html")
Samuel Dimas's avatar
Samuel Dimas committed
618
        return HttpResponse(template.render(context, request))
619
620


621
622
623
624
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
625
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
626
627
628
629
630
631
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        if request.user.is_authenticated:
            current_user = self.request.user
632
            DownloadHistoryService.init_data_authenticated_user(context, current_user)
633
        else:
634
            DownloadHistoryService.init_data_guest_user(context, request)
635
        return self.render_to_response(context)
636

637

638
639
640
641
642
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):
643
        GoogleDriveUploadService.upload_to_gdrive(file_path, materi.title)
644
645
646
    else:
        raise Http404("File tidak dapat ditemukan.")

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

649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
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
677
class PasswordChangeViews(PasswordChangeView):
678

Yaumi's avatar
Yaumi committed
679
680
    from_class = PasswordChangeForm
    success_url = reverse_lazy('password_success')
Yaumi's avatar
Yaumi committed
681

Yaumi's avatar
Yaumi committed
682
def password_success(request):
683
    return render(request, 'password_success.html', {})
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707


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)