Fakultas Ilmu Komputer UI

views.py 34.5 KB
Newer Older
1
2
import mimetypes
import os
3
import datetime
4
5

from django.conf import settings
6
from django.contrib import messages
7
from django.contrib.auth.models import AnonymousUser
8
from django.core.exceptions import PermissionDenied, ValidationError
Mika dabelza abi's avatar
Mika dabelza abi committed
9
from django.db.models import Q, Count
10
11
from django.http import (Http404, HttpResponse, HttpResponseRedirect,
                         JsonResponse)
12
from django.urls import reverse
13
from django.shortcuts import get_object_or_404, redirect
14
from django.template import loader
15
16
from django.views import defaults
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
17
from django.views.generic import TemplateView
18
from administration.models import VerificationReport
19
from app.forms import SuntingProfilForm, UploadMateriForm, RatingContributorForm
20
21
22
from app.models import (
    Category,
    Comment,
23
    DislikeComment,
24
25
    Materi,
    Like,
26
    LikeComment,
27
28
29
30
31
32
    ViewStatistics,
    DownloadStatistics,
    ReqMaterial,
    Rating,
    RatingContributor,
)
33
from app.utils.fileManagementUtil import get_random_filename, remove_image_exifdata
34
from authentication.models import User
35
import django
36
37
import pandas as pd
from io import BytesIO
38
from django.contrib import messages
39
40
41
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from pydrive.auth import AuthenticationRejected
42

43
def permission_denied(request, exception, template_name="error_403.html"):
44
45
    return defaults.permission_denied(request, exception, template_name)

46

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

Mika dabelza abi's avatar
Mika dabelza abi committed
58
        lstMateri = Materi.objects.filter(status="APPROVE").order_by("date_modified")
Mika dabelza abi's avatar
Mika dabelza abi committed
59
60
        url = ""

61
        getSearch = request.GET.get("search")
62
        if getSearch:
Mika dabelza abi's avatar
Mika dabelza abi committed
63
            url = url + "&search={0}".format(getSearch)
64
65
66
67
68
69
70
71
72
73
            lstMateri = (
                lstMateri.search(getSearch)
                .filter(
                    Q(author__icontains=getSearch)
                    | Q(uploader__name__icontains=getSearch)
                    | Q(descriptions__icontains=getSearch)
                    | Q(publisher__icontains=getSearch)
                )
                .distinct()
            )
Saul Andre's avatar
Saul Andre committed
74

75
76
        getKategori = request.GET.get("kategori")
        if getKategori:
Mika dabelza abi's avatar
Mika dabelza abi committed
77
78
            url = url + "&kategori={0}".format(getKategori)
            kategori = Category.objects.get(pk=getKategori)
Mika dabelza abi's avatar
Mika dabelza abi committed
79
            lstMateri = lstMateri.filter(categories=kategori.pk)
80

81
        getSort = request.GET.get("sort")
82
        if getSort:
Mika dabelza abi's avatar
Mika dabelza abi committed
83
            url = url + "&sort={0}".format(getSort)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
            if(getSort == "judul"):
                lstMateri = lstMateri.order_by('title')
            elif(getSort == "penulis"):
                lstMateri = lstMateri.order_by('author')
            elif(getSort == "pengunggah"):
                lstMateri = lstMateri.order_by('uploader')
            elif(getSort == "terbaru"):
                lstMateri = lstMateri.order_by('-date_created')
            elif(getSort == "terlama"):
                lstMateri = lstMateri.order_by('date_created')
            elif(getSort == "terpopuler"):
                lstMateri = lstMateri.annotate(count=Count('like__id')).order_by('-count')
            elif(getSort == "jumlah_unduh"):
                lstMateri = lstMateri.annotate(count=Count('unduh__id')).order_by('-count')
98

Mika dabelza abi's avatar
Mika dabelza abi committed
99
        context["materi_list"] = lstMateri
Mika dabelza abi's avatar
Mika dabelza abi committed
100
        paginator = Paginator(context["materi_list"], 15)
101
        page_number = request.GET.get("page")
Mika dabelza abi's avatar
Mika dabelza abi committed
102
103
104
105
        page_obj = paginator.get_page(page_number)
        context["materi_list"] = page_obj

        context["url"] = url
106
107
        return self.render_to_response(context=context)

108

109
110
class KatalogPerKontributorView(TemplateView):
    template_name = "app/katalog_kontri.html"
111

112
113
114
115
116
117
118
119
    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)
120
121
122
123
124

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

125
        paginator = Paginator(materi_list, 15)
126
        page_number = request.GET.get("page")
127
128
        materi_list_by_page = paginator.get_page(page_number)
        context["materi_list"] = materi_list_by_page
129
        contributor = get_object_or_404(User, email=kwargs["email"])
130
        context["form_rating"] = RatingContributorForm(initial={"user": contributor})
131
        return self.render_to_response(context=context)
132

133
134
135
136
    def post(self, request, *args, **kwargs):
        data = RatingContributorForm(request.POST)
        if data.is_valid():
            data.save()
137
138
        return redirect("katalog-per-kontributor", email=kwargs["email"])

139

140
141
142
143
class DetailMateri(TemplateView):
    template_name = "app/detail_materi.html"

    def get_context_data(self, **kwargs):
144
145
146
147
148
149
        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"])
        context["session_id"] = self.request.session.session_key
        context["materi_data"] = materi
150
        context["report"] = VerificationReport.objects.filter(materi=materi)
151
152
153
154
155
156
157
        context["has_liked"] = Like.objects.filter(materi=materi, session_id=self.request.session.session_key).exists()
        publishedDate = ""
        if materi.published_date == None:
            publishedDate = "n.d"
        else:
            publishedDate = materi.published_date.strftime("%Y-%m-%d %H:%M")
        citationAPA = materi.author + " . (" + publishedDate + ") . " + materi.title + " . " + materi.publisher
158
        context["citationAPA"] = citationAPA
159
        context["citationIEEE"] = get_citation_ieee(self.request, materi)
160
        context["materi_rating_score"] = 0
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
166
167
                context['materi_rating_score'] = materi_rating.score
        
        context['is_authenticated'] = self.request.user.is_authenticated
168

169
        return context
170
171
172

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
173
        query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
174
175
176
177
178
        has_liked = {}
        has_disliked = {}
        for comment in query_set_for_comment:
            has_liked[comment.id] = LikeComment.objects.filter(comment=comment, session_id=self.request.session.session_key).exists()
            has_disliked[comment.id] = DislikeComment.objects.filter(comment=comment, session_id=self.request.session.session_key).exists()
179
        context["comment_data"] = query_set_for_comment
180
181
        context["has_liked"] = has_liked
        context["has_disliked"] = has_disliked
182
183
        return self.render_to_response(context=context)

184
185
    def get_user_name(self, request):
        user_name = ""
186
187
188
        if isinstance(request.user, AnonymousUser):
            user_name = "Anonim"
        elif request.user.is_admin:
189
190
191
192
193
            user_name = "Admin"
        elif request.user.is_contributor:
            user_name = request.user.name
        return user_name

194
    def post(self, request, *args, **kwargs):
195
        commentText = request.POST.get("comment", None)
196
        if commentText == None or commentText == "":
197
198
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
199
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
200
            query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
201
            context["comment_data"] = query_set_for_comment
202
            return self.render_to_response(context=context)
203

204
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
205
        user_obj = request.user if request.user.is_authenticated else None
206
207
208
209
210
        if user_obj:
            comment = Comment.objects.create(
                comment=commentText, username=self.get_user_name(request), materi=materi, user=user_obj
            )
            comment.save()
211
212
        return HttpResponseRedirect(request.path)

213

214
def toggle_like(request):
215
216
217
    if request.method == "POST":
        materi_id = request.POST.get("materi_id", None)
        session_id = request.POST.get("session_id", None)
218
219
220
        if materi_id is None or session_id is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
        materi = get_object_or_404(Materi, pk=materi_id)
221
        has_liked = Like.objects.filter(materi=materi, session_id=session_id).exists()
222
        if has_liked:
223
            like = get_object_or_404(Like, materi=materi, session_id=session_id)
224
225
226
227
228
229
230
231
232
            like.delete()
            return JsonResponse({"success": True, "liked": True})
        else:
            Like(materi=materi, session_id=session_id).save()
            return JsonResponse({"success": True, "liked": False})
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method"})


233
234
def delete_comment(request, pk_materi, pk_comment):
    comment = get_object_or_404(Comment, pk=pk_comment)
235
    url = "/materi/" + str(pk_materi) + "/"
236
237
238
    comment.delete()
    return HttpResponseRedirect(url)

239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
def toggle_like_comment(request):
    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})
        comment = get_object_or_404(Comment, pk=comment_id)
        has_liked = LikeComment.objects.filter(comment=comment, session_id=session_id).exists()
        if has_liked:
            like = get_object_or_404(LikeComment, comment=comment, session_id=session_id)
            like.delete()
            return JsonResponse({"success": True, "liked": True, "comment_id": comment_id})
        else:
            LikeComment(comment=comment, session_id=session_id).save()
            return JsonResponse({"success": True, "liked": False, "comment_id": comment_id})
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method", "comment_id": comment_id})

def toggle_dislike_comment(request):
    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})
        comment = get_object_or_404(Comment, pk=comment_id)
        has_disliked = DislikeComment.objects.filter(comment=comment, session_id=session_id).exists()
        if has_disliked:
            dislike = get_object_or_404(DislikeComment, comment=comment, session_id=session_id)
            dislike.delete()
            return JsonResponse({"success": True, "disliked": True, "comment_id": comment_id})
        else:
            DislikeComment(comment=comment, session_id=session_id).save()
            return JsonResponse({"success": True, "disliked": False, "comment_id": comment_id})
    else:
        return JsonResponse({"success": False, "msg": "Unsuported method", "comment_id": comment_id})
274

275
276
277
278
279
280
def get_citation_ieee(request, materi):
    current_date = datetime.datetime.now()
    current_day = str(current_date.day)
    current_month = current_date.strftime("%b")
    current_year = str(current_date.year)
    published_date = ""
281
    if materi.published_date == None:
282
        published_date = "n.d"
283
284
285
    else:
        published_date = materi.published_date.strftime("%Y")

286
287
288
289
290
291
    author_list = materi.author.split(",")
    author_list_abbrv = ""
    for author_name in author_list:
        author_name_split = author_name.split(" ")
        author_name_abbrv = ""
        for j, name in enumerate(author_name_split):
292
            if j < (len(author_name_split) - 1):
293
294
295
296
297
298
                abbrv_name = name[0].upper()
                author_name_abbrv = author_name_abbrv + abbrv_name + ". "
            else:
                author_name_abbrv = author_name_abbrv + name
        author_list_abbrv = author_list_abbrv + author_name_abbrv + ", "

299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
    citation_result = (
        author_list_abbrv
        + materi.title
        + ". "
        + materi.publisher
        + ", "
        + published_date
        + ". "
        + "Accessed on: "
        + current_month
        + ". "
        + current_day
        + ", "
        + current_year
        + ". [Online]. "
        + "Available: "
        + request.build_absolute_uri()
    )
317
    return citation_result
318

319

320
def add_rating_materi(request):
321
    if request.method == "POST" and request.user.is_authenticated:
322

323
324
        materi_id = request.POST.get("materi_id", None)
        rating_score = request.POST.get("rating_score", None)
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349

        if materi_id is None or rating_score is None:
            return JsonResponse({"success": False, "msg": "Missing param"}, status=422)
        try:
            rating_score = int(rating_score)
        except ValueError:
            return JsonResponse({"success": False, "msg": "rating_score must be an integer"}, status=422)

        try:
            materi_id = int(materi_id)
        except ValueError:
            return JsonResponse({"success": False, "msg": "materi_id must be an integer"}, status=422)

        if rating_score not in range(1, 6):
            return JsonResponse({"success": False, "msg": "Rating must be an integer from 1 to 5"}, status=422)

        materi = Materi.objects.filter(pk=materi_id).first()

        if materi is None:
            return JsonResponse({"success": False, "msg": "Materi does not exist"}, status=422)

        if Rating.objects.filter(materi=materi, user=request.user).first() is not None:
            return JsonResponse({"success": False, "msg": "Rating already exist"}, status=409)

        Rating(materi=materi, user=request.user, score=rating_score).save()
350
351
352
        return JsonResponse(
            {"success": True, "msg": "Rating successfully created", "rating_score": rating_score}, status=201
        )
353
354
355
    return JsonResponse({"success": False, "msg": "Forbidden"}, status=403)


356
357
358
359
360
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):
361
362
363
364
        try:
            mimetype = mimetypes.guess_type(file_path)
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
365
                response["Content-Disposition"] = "attachment; filename=" + os.path.basename(file_path)
366
367
368
369
                if request.user.is_authenticated:
                    DownloadStatistics(materi=materi, downloader=request.user).save()
                else:
                    downloaded_materi = DownloadStatistics.objects.create(materi=materi)
370
371
372
                    if "downloaded_materi" not in request.session:
                        request.session["downloaded_materi"] = []
                    request.session["downloaded_materi"].append(downloaded_materi.pk)
373
                    request.session.modified = True
374
375
376
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
377
378
379
    else:
        raise Http404("File tidak dapat ditemukan.")

igor lestin sianipar's avatar
igor lestin sianipar committed
380

381
382
383
384
385
386
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)
387
388
389
        try:
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
390
                response["Content-Disposition"] = "inline; filename=" + os.path.basename(file_path)
391
392
393
394
                ViewStatistics(materi=materi).save()
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
395
396
    else:
        raise Http404("File tidak dapat ditemukan.")
igor lestin sianipar's avatar
igor lestin sianipar committed
397

igor lestin sianipar's avatar
igor lestin sianipar committed
398

Selvy Fitriani's avatar
Selvy Fitriani committed
399
400
401
402
403
def delete_materi(request, pk):
    materi = get_object_or_404(Materi, pk=pk)
    materi.delete()
    return HttpResponseRedirect("/dashboard/")

igor lestin sianipar's avatar
igor lestin sianipar committed
404
class UploadMateriView(TemplateView):
405
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
406
407
408
409
410
411
    context = {}

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

Saul Andre's avatar
Saul Andre committed
412
    def post(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
413
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
414
            raise PermissionDenied(request)
415
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
416
417
418
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
419
            konten = form.cleaned_data["content"]
420
421
422
423
424
            try:
                self.validate_file_extension(konten)
            except ValidationError:
                messages.error(request, "Materi gagal diunggah, format file tidak sesuai")
                return HttpResponseRedirect("/unggah/")
igor lestin sianipar's avatar
igor lestin sianipar committed
425
            materi.save()
426
            kateg = form.cleaned_data["categories"]
427
428
            for i in kateg:
                materi.categories.add(i)
429
            messages.success(request, "Materi berhasil diunggah, periksa riwayat unggah anda")
430
            return HttpResponseRedirect("/unggah/")
Saul Andre's avatar
Saul Andre committed
431
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
432
            context = self.get_context_data(**kwargs)
433
            context["form"] = form
434
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
435
436
437
            return self.render_to_response(context)

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

igor lestin sianipar's avatar
igor lestin sianipar committed
441
        context = self.get_context_data(**kwargs)
442
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
443
        return self.render_to_response(context)
444

445
446
    def validate_file_extension(self, value):
        ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
447
        valid_extensions = [".pdf", ".doc", ".docx", ".jpg", ".png", ".xlsx", ".xls", ".mp4", ".mp3"]
448
        if not ext.lower() in valid_extensions:
449
            raise ValidationError("Unsupported file extension.")
450

Samuel Dimas's avatar
Samuel Dimas committed
451

452
453
454
class UploadMateriHTML(TemplateView):
    template_name = "unggah.html"
    context = {}
igor lestin sianipar's avatar
igor lestin sianipar committed
455

456
457
458
459
460
461
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


462
463
464
465
466
467
468
469
470
471
472
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):

473
        if "template" in self.request.GET:
474

475
476
477
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
478
479

            with BytesIO() as b:
480
                writer = pd.ExcelWriter(b, engine="xlsxwriter")  # pylint: disable=abstract-class-instantiated
481
482
483
                data_frame.to_excel(writer, index=0)
                writer.save()
                response = HttpResponse(
484
485
                    b.getvalue(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                )
486
487
488
489
490
491
492
493
494
495

                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):
496
497
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
498

499
        row, lines = excel.shape
500
        categories = Category.objects.all()
501

502
        field_length = {
503
504
505
            "title": 50,
            "author": 30,
            "publisher": 30,
506
507
508
509
510
511
        }

        message = None

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

513
            # Validate Categories
514
            for c in excel["Categories"][i].split(","):
515
516
517
518
519
                sel_cat = categories.filter(name=c)
                if sel_cat.count() == 0:
                    message = f"Kategori %s tidak ditemukan" % c
                    break

520
521
            if len(excel["Title"][i]) > field_length["title"]:
                message = f"Title maksimal %d karakter" % field_length["title"]
522

523
524
            if len(excel["Author"][i]) > field_length["author"]:
                message = f"Author maksimal %d karakter" % field_length["author"]
525

526
527
            if len(excel["Publisher"][i]) > field_length["publisher"]:
                message = f"Publisher maksimal %d karakter" % field_length["publisher"]
528
529
530

            if message != None:
                break
531

532
533
        if message != None:
            messages.error(request, message)
534
            return HttpResponseRedirect("/unggah_excel/")
535
536
537
538
539

        # Second pass, save data
        with django.db.transaction.atomic():
            for i in range(row):
                materi = Materi(
540
541
542
543
544
545
                    title=excel["Title"][i],
                    author=excel["Author"][i],
                    publisher=excel["Publisher"][i],
                    descriptions=excel["Description"][i],
                    uploader=request.user,
                )
546
                materi.save()
547
548

                for c in excel["Categories"][i].split(","):
549
550
                    materi.categories.add(categories.get(name=c))

551
        messages.success(request, "Materi berhasil diunggah")
552

553
        return HttpResponseRedirect("/unggah_excel/")
554
555


556
class DashboardKontributorView(TemplateView):
557
    template_name = "dashboard.html"
558
559
560
561
562
563
564

    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):
565
        context = super(DashboardKontributorView, self).get_context_data(**kwargs)
566
567
568
569
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
570
571
572
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
573
        return self.render_to_response(context)
574

575

576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
class ProfilAdminView(TemplateView):
    template_name = "profil-admin.html"

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

    def get_context_data(self, **kwargs):
        context = super(ProfilAdminView, 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)
593

594

595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
class ProfilKontributorView(TemplateView):
    template_name = "profil.html"

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

    def get_context_data(self, **kwargs):
        context = super(ProfilKontributorView, 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)

613

614
615
616
617
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

    def dispatch(self, request, *args, **kwargs):
618
        if not request.user.is_authenticated or not request.user.is_contributor:
619
620
621
622
623
624
625
626
627
628
629
630
631
            raise PermissionDenied(request)
        return super(SuntingProfilView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(SuntingProfilView, 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

Samuel Dimas Partogi's avatar
Samuel Dimas Partogi committed
632
        context["form"] = SuntingProfilForm(instance=current_user)
633
634
635
636
637
638
        return self.render_to_response(context)

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

Samuel Dimas Partogi's avatar
Samuel Dimas Partogi committed
639
        current_user = self.request.user
640

641
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
642
        if form.is_valid():
643
            current_user.default_profile_picture = True
644
645
646

            # Removing exifdata from profile picture on upload
            if request.FILES:
647
                f_name = request.FILES["profile_picture"].name
648
649
                f_name = get_random_filename(f_name)
                f_path = settings.MEDIA_ROOT + "/" + f_name
650
                request.FILES["profile_picture"].name = f_name
651

652
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
653
654
655
                form.save()

                remove_image_exifdata(f_path)
656
            else:
657
                form.save()
658
659
660
661
662
            return HttpResponseRedirect("/profil/")
        else:
            context = self.get_context_data(**kwargs)
            context["form"] = form
            return self.render_to_response(context)
663

igor lestin sianipar's avatar
igor lestin sianipar committed
664

665
666
667
668
669
670
671
672
673
class SuntingProfilAdminView(TemplateView):
    template_name = "sunting_admin.html"

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

    def get_context_data(self, **kwargs):
674
        context = super(SuntingProfilAdminView, self).get_context_data(**kwargs)
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
        return context

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

        current_user = self.request.user
        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
691

692
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
693
694
        if form.is_valid():
            current_user.default_profile_picture = True
695
696
697

            # Removing exifdata from profile picture on upload
            if request.FILES:
698
                f_name = request.FILES["profile_picture"].name
699
700
                f_name = get_random_filename(f_name)
                f_path = settings.MEDIA_ROOT + "/" + f_name
701
                request.FILES["profile_picture"].name = f_name
702

703
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
704
705
706
                form.save()

                remove_image_exifdata(f_path)
707
            else:
708
                form.save()
709
710
711
            return HttpResponseRedirect("/profil-admin/")
        else:
            context = self.get_context_data(**kwargs)
712
713
            context["form"] = form
            return self.render_to_response(context)
714

715

716
717
718
719
720
721
722
723
724
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):
725
        context = super(ReqMateriView, self).get_context_data(**kwargs)
726
727
728
729
730
731
732
        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):
733
        title = request.POST.get("title", None)
734
735
736
737
738
        if title is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
        ReqMaterial(title=title).save()
        return JsonResponse({"success": True, "msg": "Permintaan materi berhasil dikirimkan"})

739

740
741
742
743
744
745
746
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)
747

748
    def get_context_data(self, **kwargs):
749
        context = super(SuksesLoginKontributorView, self).get_context_data(**kwargs)
750
751
752
753
754
755
756
757
758
759
        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)

760

761
762
763
764
765
766
767
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)
768

769
770
771
772
773
774
775
776
777
778
779
780
    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
781

782
783
784
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
785
786

    def dispatch(self, request, *args, **kwargs):
787
        if not request.user.is_authenticated:
788
            raise PermissionDenied(request)
789
        return super(PostsView, self).dispatch(request, *args, **kwargs)
790
791

    def get(self, request, *args, **kwargs):
792
793
794
795
        context = super().get_context_data(**kwargs)
        user = self.request.user

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

798
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
799
800
801
802
803
804
805

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

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

806
        return self.render_to_response(context=context)
807

808

809
810
811
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

812
    def dispatch(self, request, *args, **kwargs):
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
        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)

828
    def post(self, request, *args, **kwargs):
829
830
831
832
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
833
        form = UploadMateriForm(request.POST, request.FILES, instance=current_materi)
834
835
836
837
838
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
            materi.status = "REVISION"
            materi.save()
839
            kateg = form.cleaned_data["categories"]
840
841
842
843
844
845
846
847
848
            for i in kateg:
                materi.categories.add(i)
            materi.save()
            return HttpResponseRedirect("/dashboard/")
        else:
            context = self.get_context_data(**kwargs)
            context["form_revisi"] = form
            return self.render_to_response(context)

849

Samuel Dimas's avatar
Samuel Dimas committed
850
851
852
853
854
855
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

856
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
857
858
859
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

860
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
861

862
        template = loader.get_template("error-404.html")
Samuel Dimas's avatar
Samuel Dimas committed
863
        return HttpResponse(template.render(context, request))
864
865


866
867
868
869
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
870
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
871
872
873
874
875
876
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        if request.user.is_authenticated:
            current_user = self.request.user
877
            riwayat_list = current_user.riwayat_unduh.all().order_by("-timestamp")
878
879
880
            context["riwayat_list"] = riwayat_list
            context["user_name"] = current_user.name
        else:
881
882
883
            has_downloaded_materi = "downloaded_materi" in request.session
            downloaded_materi = request.session["downloaded_materi"] if has_downloaded_materi else []
            riwayat_list = DownloadStatistics.objects.filter(pk__in=downloaded_materi).order_by("-timestamp")
884
            context["riwayat_list"] = riwayat_list
885
            context["user_name"] = "Guest"
886
        return self.render_to_response(context)
887

888

889
890
891
892
893
894
895
def upload_to_gdrive(file_path, title):
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()

    drive = GoogleDrive(gauth)
    file1 = drive.CreateFile()
    file1.SetContentFile(file_path)
896
897
    file1["title"] = title
    print("title: %s, mimeType: %s" % (file1["title"], file1["mimeType"]))
898
899
    file1.Upload()

900

901
902
903
904
905
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):
906
        upload_to_gdrive(file_path, materi.title)
907
908
909
    else:
        raise Http404("File tidak dapat ditemukan.")

910
    return HttpResponseRedirect(reverse('detail-materi', kwargs={'pk': pk}))