Fakultas Ilmu Komputer UI

views.py 24.2 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.core.exceptions import PermissionDenied
from django.core.paginator import Paginator
from django.db.models import Q
12
13
from django.http import (Http404, HttpResponse, HttpResponseRedirect,
                         JsonResponse)
14
from django.shortcuts import get_object_or_404, redirect
15
from django.template import loader
16
from django.urls import reverse
17
from django.views import defaults
18
from django.views.generic import TemplateView
19

20
from app.forms import SuntingProfilForm, UploadMateriForm, RatingContributorForm
21
22
23
24
25
26
27
from app.models import (
    Category,
    Comment,
    Materi,
    ReqMaterial,
    Rating,
)
28
from authentication.models import User
29
30
31
from .services import DafterKatalogService, DetailMateriService, LikeDislikeService, MateriFieldValidationHelperService, \
    DownloadViewMateriHelperService, UploadMateriService, EditProfileService, RevisiMateriService, \
    DownloadHistoryService, GoogleDriveUploadService
32
33
34
35
from django.contrib.auth.views import PasswordChangeForm
from django.urls import reverse_lazy
from django.contrib.auth.views import PasswordChangeView
from django.shortcuts import render
36

37

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

41

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

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

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

58

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

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

68

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

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

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

85
        paginator = Paginator(materi_list, 15)
86
        page_number = request.GET.get("page")
87
88
        materi_list_by_page = paginator.get_page(page_number)
        context["materi_list"] = materi_list_by_page
89
        contributor = get_object_or_404(User, email=kwargs["email"])
90
        context["form_rating"] = RatingContributorForm(initial={"user": contributor})
91
        return self.render_to_response(context=context)
92

93
94
95
96
    def post(self, request, *args, **kwargs):
        data = RatingContributorForm(request.POST)
        if data.is_valid():
            data.save()
97
98
        return redirect("katalog-per-kontributor", email=kwargs["email"])

99

100
101
102
103
class DetailMateri(TemplateView):
    template_name = "app/detail_materi.html"

    def get_context_data(self, **kwargs):
104
105
106
107
        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"])
108
109
110
        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)
111
112
113
114

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

119
        return context
120

121

122
123
    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
124
        query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
125
        has_disliked, has_liked = DetailMateriService.find_comment_like_dislike(query_set_for_comment, self.request.session)
126
        context["comment_data"] = query_set_for_comment
127
128
        context["has_liked"] = has_liked
        context["has_disliked"] = has_disliked
129
130
        return self.render_to_response(context=context)

131

132

133
    def post(self, request, *args, **kwargs):
134
        commentText = request.POST.get("comment", None)
135
        if commentText == None or commentText == "":
136
137
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
138
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
139
            query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
140
            context["comment_data"] = query_set_for_comment
141
            return self.render_to_response(context=context)
142

143
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
144
        user_obj = request.user if request.user.is_authenticated else None
145
146
        if user_obj:
            comment = Comment.objects.create(
147
                comment=commentText, username=DetailMateriService.get_user_name(request), materi=materi, user=user_obj
148
149
            )
            comment.save()
150
151
        return HttpResponseRedirect(request.path)

152

153
def toggle_like(request):
154
155
156
    if request.method == "POST":
        materi_id = request.POST.get("materi_id", None)
        session_id = request.POST.get("session_id", None)
157
158
        if materi_id is None or session_id is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
159
        return JsonResponse(LikeDislikeService.apply_like_materi(materi_id, session_id))
160
161
162
163
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method"})


164
def delete_comment(request, pk_materi, pk_comment):
165
166
    if not request.user.is_authenticated or not request.user.is_admin:
        raise PermissionDenied(request)
167
    comment = get_object_or_404(Comment, pk=pk_comment)
168
    url = "/materi/" + str(pk_materi) + "/"
169
170
171
    comment.delete()
    return HttpResponseRedirect(url)

172
def toggle_like_comment(request):
173
    comment_id = 0
174
175
176
177
178
    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})
179
        return JsonResponse(LikeDislikeService.apply_comment_like(comment_id, session_id))
180
181
182
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method", "comment_id": comment_id})

183

184
def toggle_dislike_comment(request):
185
    comment_id = 0
186
187
188
189
190
    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})
191
        return JsonResponse(LikeDislikeService.apply_comment_dislike(comment_id, session_id))
192
193
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method", "comment_id": comment_id})
194
195


196
def add_rating_materi(request):
197
    if request.method == "POST" and request.user.is_authenticated:
198

199
200
        materi_id = request.POST.get("materi_id", None)
        rating_score = request.POST.get("rating_score", None)
201
202


203
204
205
206
        is_valid_params, materi_id, \
        rating_score, response, \
        status_code = MateriFieldValidationHelperService.\
            validate_materi_rating_params(materi_id,rating_score)
207

208
209
        if not is_valid_params:
            return JsonResponse(response, status=status_code)
210

211
212
213
        is_valid_rating, materi, \
        response, status_code = MateriFieldValidationHelperService.\
            validate_materi_rating(materi_id, request.user)
214

215
216
        if not is_valid_rating:
            return JsonResponse(response, status=status_code)
217
218

        Rating(materi=materi, user=request.user, score=rating_score).save()
219
220
221
        return JsonResponse(
            {"success": True, "msg": "Rating successfully created", "rating_score": rating_score}, status=201
        )
222
223
224
    return JsonResponse({"success": False, "msg": "Forbidden"}, status=403)


225

226
227
228
229
230
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):
231
232
233
        try:
            mimetype = mimetypes.guess_type(file_path)
            with open(file_path, "rb") as fh:
234
235
236
                return DownloadViewMateriHelperService.build_materi_response(fh, file_path,
                                                                             materi, mimetype, request,
                                                                             HttpResponse(fh.read(), content_type=mimetype[0]))
237
238
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
239
240
241
    else:
        raise Http404("File tidak dapat ditemukan.")

igor lestin sianipar's avatar
igor lestin sianipar committed
242

243
244
245
246
247
248
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)
249
250
251
        try:
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
252
                DownloadViewMateriHelperService.build_view_materi_response(file_path, materi, response)
253
254
255
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
256
257
    else:
        raise Http404("File tidak dapat ditemukan.")
igor lestin sianipar's avatar
igor lestin sianipar committed
258

igor lestin sianipar's avatar
igor lestin sianipar committed
259

Selvy Fitriani's avatar
Selvy Fitriani committed
260
261
def delete_materi(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
262
263
264
    if request.user.is_superuser or request.user.is_admin:
        materi.soft_delete()
        return HttpResponseRedirect("/administration/")
Selvy Fitriani's avatar
Selvy Fitriani committed
265
266
267
    materi.delete()
    return HttpResponseRedirect("/dashboard/")

igor lestin sianipar's avatar
igor lestin sianipar committed
268
class UploadMateriView(TemplateView):
269
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
270
271
272
273
274
275
    context = {}

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

Saul Andre's avatar
Saul Andre committed
276
    def post(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
277
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
278
            raise PermissionDenied(request)
279
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
280
281
282
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
283
            konten = form.cleaned_data["content"]
284
            if not UploadMateriService.validate_file_extension(konten, request):
285
                return HttpResponseRedirect("/unggah/")
286
            UploadMateriService.upload_materi(form, materi)
287
            messages.success(request, "Materi berhasil diunggah, periksa riwayat unggah anda")
288
            return HttpResponseRedirect("/unggah/")
Saul Andre's avatar
Saul Andre committed
289
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
290
            context = self.get_context_data(**kwargs)
291
            context["form"] = form
292
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
293
294
            return self.render_to_response(context)

295
296


igor lestin sianipar's avatar
igor lestin sianipar committed
297
    def get(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
298
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
299
            raise PermissionDenied(request)
300

igor lestin sianipar's avatar
igor lestin sianipar committed
301
        context = self.get_context_data(**kwargs)
302
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
303
        return self.render_to_response(context)
304

305

306

Samuel Dimas's avatar
Samuel Dimas committed
307

308
309
310
class UploadMateriHTML(TemplateView):
    template_name = "unggah.html"
    context = {}
igor lestin sianipar's avatar
igor lestin sianipar committed
311

312
313
314
315
316
317
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


318
319
320
321
322
323
324
325
326
327
328
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):

329
        if "template" in self.request.GET:
330

331
332
333
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
334
335

            with BytesIO() as b:
336
                writer = pd.ExcelWriter(b, engine="xlsxwriter")  # pylint: disable=abstract-class-instantiated
337
338
339
                data_frame.to_excel(writer, index=0)
                writer.save()
                response = HttpResponse(
340
341
                    b.getvalue(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                )
342
343
344
345
346
347
348
349
350
351

                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):
352
353
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
354

355
        row, lines = excel.shape
356
        categories = Category.objects.all()
357

358
        field_length = {
359
360
361
            "title": 50,
            "author": 30,
            "publisher": 30,
362
363
364
365
366
367
        }

        message = None

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

369
            # Validate Categories
370
            message = UploadMateriService.validate_excel_categories(categories, excel, i, message)
371

372
            message = UploadMateriService.validate_excel_field_length(excel, field_length, i, message)
373
374
375

            if message != None:
                break
376

377
378
        if message != None:
            messages.error(request, message)
379
            return HttpResponseRedirect("/unggah_excel/")
380
381
382

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

385
        messages.success(request, "Materi berhasil diunggah")
386

387
        return HttpResponseRedirect("/unggah_excel/")
388
389


390
391


392
class DashboardKontributorView(TemplateView):
393
    template_name = "dashboard.html"
394
395
396
397
398
399
400

    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):
401
        context = super(DashboardKontributorView, self).get_context_data(**kwargs)
402
403
404
405
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
406
407
408
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
409
        return self.render_to_response(context)
410

411

412
class ProfilView(TemplateView):
413
414
415
    template_name = "profil.html"

    def dispatch(self, request, *args, **kwargs):
416
        if not request.user.is_authenticated:
417
            raise PermissionDenied(request)
418
        return super(ProfilView, self).dispatch(request, *args, **kwargs)
419
420
421

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

426

427
428
429
430
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

    def dispatch(self, request, *args, **kwargs):
431
        if not request.user.is_authenticated:
432
433
434
435
            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
436
        current_user = self.request.user
437
438
439
440
441
442
443
444
445
446
        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
447

448
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
449
450
        if form.is_valid():
            current_user.default_profile_picture = True
451
452
453

            # Removing exifdata from profile picture on upload
            if request.FILES:
454
                EditProfileService.update_profile_picture(current_user, request)
455
            else:
456
                form.save()
457
            return HttpResponseRedirect("/profil/")
458
459
        else:
            context = self.get_context_data(**kwargs)
460
461
            context["form"] = form
            return self.render_to_response(context)
462

463

464
465
466
467
468
469
470
471
472
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):
473
        context = super(ReqMateriView, self).get_context_data(**kwargs)
474
475
476
477
478
479
480
        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):
481
        title = request.POST.get("title", None)
482
483
484
485
486
        if title is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
        ReqMaterial(title=title).save()
        return JsonResponse({"success": True, "msg": "Permintaan materi berhasil dikirimkan"})

487

488
489
490
491
492
493
494
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)
495

496
    def get_context_data(self, **kwargs):
497
        context = super(SuksesLoginKontributorView, self).get_context_data(**kwargs)
498
499
500
501
502
503
504
505
506
507
        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)

508

509
510
511
512
513
514
515
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)
516

517
518
519
520
521
522
523
524
525
526
527
528
    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
529

530
531
532
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
533
534

    def dispatch(self, request, *args, **kwargs):
535
        if not request.user.is_authenticated:
536
            raise PermissionDenied(request)
537
        return super(PostsView, self).dispatch(request, *args, **kwargs)
538
539

    def get(self, request, *args, **kwargs):
540
541
542
543
        context = super().get_context_data(**kwargs)
        user = self.request.user

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

546
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
547
548
549
550
551
552
553

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

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

554
        return self.render_to_response(context=context)
555

556

557
558
559
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

560
    def dispatch(self, request, *args, **kwargs):
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
        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)

576
    def post(self, request, *args, **kwargs):
577
578
579
580
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
581
        form = UploadMateriForm(request.POST, request.FILES, instance=current_materi)
582
        if form.is_valid():
583
            RevisiMateriService.revisi_materi(form, request)
584
585
586
587
588
589
            return HttpResponseRedirect("/dashboard/")
        else:
            context = self.get_context_data(**kwargs)
            context["form_revisi"] = form
            return self.render_to_response(context)

590

Samuel Dimas's avatar
Samuel Dimas committed
591
592
593
594
595
596
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

597
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
598
599
600
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

601
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
602

603
        template = loader.get_template("error-404.html")
Samuel Dimas's avatar
Samuel Dimas committed
604
        return HttpResponse(template.render(context, request))
605
606


607
608
609
610
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
611
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
612
613
614
615
616
617
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        if request.user.is_authenticated:
            current_user = self.request.user
618
            DownloadHistoryService.init_data_authenticated_user(context, current_user)
619
        else:
620
            DownloadHistoryService.init_data_guest_user(context, request)
621
        return self.render_to_response(context)
622

623

624
625
626
627
628
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):
629
        GoogleDriveUploadService.upload_to_gdrive(file_path, materi.title)
630
631
632
    else:
        raise Http404("File tidak dapat ditemukan.")

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

635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
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
663
class PasswordChangeViews(PasswordChangeView):
Yaumi's avatar
Yaumi committed
664
    
Yaumi's avatar
Yaumi committed
665
666
    from_class = PasswordChangeForm
    success_url = reverse_lazy('password_success')
Yaumi's avatar
Yaumi committed
667

Yaumi's avatar
Yaumi committed
668
def password_success(request):
669
    return render(request, 'password_success.html', {})