Fakultas Ilmu Komputer UI

views.py 31.9 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
from django.http import Http404, HttpResponse, HttpResponseRedirect, JsonResponse
11
from django.urls import reverse
12
from django.shortcuts import get_object_or_404, redirect
13
from django.template import loader
14
15
from django.views import defaults
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
16
from django.views.generic import TemplateView
17
from administration.models import VerificationReport
18
from app.forms import SuntingProfilForm, UploadMateriForm, RatingContributorForm
19
20
21
22
23
24
25
26
27
28
29
from app.models import (
    Category,
    Comment,
    Materi,
    Like,
    ViewStatistics,
    DownloadStatistics,
    ReqMaterial,
    Rating,
    RatingContributor,
)
30
from app.utils.fileManagementUtil import get_random_filename, remove_image_exifdata
31
from authentication.models import User
32
import django
33
34
import pandas as pd
from io import BytesIO
35
36
37
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from pydrive.auth import AuthenticationRejected
Yaumi's avatar
Yaumi committed
38
39
40
41
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
42

43
44

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

47

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

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

62
        getSearch = request.GET.get("search")
63
        if getSearch:
Mika dabelza abi's avatar
Mika dabelza abi committed
64
            url = url + "&search={0}".format(getSearch)
65
66
67
68
69
70
71
72
73
74
            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
75

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

82
        getSort = request.GET.get("sort")
83
        if getSort:
Mika dabelza abi's avatar
Mika dabelza abi committed
84
            url = url + "&sort={0}".format(getSort)
85
86
87
88
89
90
91
92
93
94
95
96
            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")
97

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

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

107

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

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

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

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

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

138

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

    def get_context_data(self, **kwargs):
143
144
145
146
147
148
        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
149
        context["report"] = VerificationReport.objects.filter(materi=materi)
150
151
152
153
154
155
156
        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
157
        context["citationAPA"] = citationAPA
158
        context["citationIEEE"] = get_citation_ieee(self.request, materi)
159
        context["materi_rating_score"] = 0
160
161
162
163

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

166
        return context
167
168
169

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
170
        query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
171
        context["comment_data"] = query_set_for_comment
172
173
        return self.render_to_response(context=context)

174
175
    def get_user_name(self, request):
        user_name = ""
176
177
178
        if isinstance(request.user, AnonymousUser):
            user_name = "Anonim"
        elif request.user.is_admin:
179
180
181
182
183
            user_name = "Admin"
        elif request.user.is_contributor:
            user_name = request.user.name
        return user_name

184
    def post(self, request, *args, **kwargs):
185
        commentText = request.POST.get("comment", None)
186
        if commentText == None or commentText == "":
187
188
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
189
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
190
            query_set_for_comment = Comment.objects.filter(materi=context["materi_data"])
191
            context["comment_data"] = query_set_for_comment
192
            return self.render_to_response(context=context)
193

194
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
195
        user_obj = request.user if request.user.is_authenticated else None
196
197
198
        comment = Comment.objects.create(
            comment=commentText, username=self.get_user_name(request), materi=materi, user=user_obj
        )
199
200
201
        comment.save()
        return HttpResponseRedirect(request.path)

202

203
def toggle_like(request):
204
205
206
    if request.method == "POST":
        materi_id = request.POST.get("materi_id", None)
        session_id = request.POST.get("session_id", None)
207
208
209
        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)
210
        has_liked = Like.objects.filter(materi=materi, session_id=session_id).exists()
211
        if has_liked:
212
            like = get_object_or_404(Like, materi=materi, session_id=session_id)
213
214
215
216
217
218
219
220
221
            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"})


222
223
def delete_comment(request, pk_materi, pk_comment):
    comment = get_object_or_404(Comment, pk=pk_comment)
224
    url = "/materi/" + str(pk_materi) + "/"
225
226
227
    comment.delete()
    return HttpResponseRedirect(url)

228

229
230
231
232
233
234
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 = ""
235
    if materi.published_date == None:
236
        published_date = "n.d"
237
238
239
    else:
        published_date = materi.published_date.strftime("%Y")

240
241
242
243
244
245
    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):
246
            if j < (len(author_name_split) - 1):
247
248
249
250
251
252
                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 + ", "

253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
    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()
    )
271
    return citation_result
272

273

274
def add_rating_materi(request):
275
    if request.method == "POST" and request.user.is_authenticated:
276

277
278
        materi_id = request.POST.get("materi_id", None)
        rating_score = request.POST.get("rating_score", None)
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303

        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()
304
305
306
        return JsonResponse(
            {"success": True, "msg": "Rating successfully created", "rating_score": rating_score}, status=201
        )
307
308
309
    return JsonResponse({"success": False, "msg": "Forbidden"}, status=403)


310
311
312
313
314
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):
315
316
317
318
        try:
            mimetype = mimetypes.guess_type(file_path)
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
319
                response["Content-Disposition"] = "attachment; filename=" + os.path.basename(file_path)
320
321
322
323
                if request.user.is_authenticated:
                    DownloadStatistics(materi=materi, downloader=request.user).save()
                else:
                    downloaded_materi = DownloadStatistics.objects.create(materi=materi)
324
325
326
                    if "downloaded_materi" not in request.session:
                        request.session["downloaded_materi"] = []
                    request.session["downloaded_materi"].append(downloaded_materi.pk)
327
                    request.session.modified = True
328
329
330
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
331
332
333
    else:
        raise Http404("File tidak dapat ditemukan.")

igor lestin sianipar's avatar
igor lestin sianipar committed
334

335
336
337
338
339
340
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)
341
342
343
        try:
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
344
                response["Content-Disposition"] = "inline; filename=" + os.path.basename(file_path)
345
346
347
348
                ViewStatistics(materi=materi).save()
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
349
350
    else:
        raise Http404("File tidak dapat ditemukan.")
igor lestin sianipar's avatar
igor lestin sianipar committed
351

igor lestin sianipar's avatar
igor lestin sianipar committed
352

igor lestin sianipar's avatar
igor lestin sianipar committed
353
class UploadMateriView(TemplateView):
354
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
355
356
357
358
359
360
    context = {}

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

Saul Andre's avatar
Saul Andre committed
361
    def post(self, request, *args, **kwargs):
Steven Kusuman's avatar
Steven Kusuman committed
362
        if request.user.is_authenticated == False or not request.user.is_contributor:
igor lestin sianipar's avatar
igor lestin sianipar committed
363
            raise PermissionDenied(request)
364
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
365
366
367
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
368
            konten = form.cleaned_data["content"]
369
370
371
372
373
            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
374
            materi.save()
375
            kateg = form.cleaned_data["categories"]
376
377
            for i in kateg:
                materi.categories.add(i)
378
            messages.success(request, "Materi berhasil diunggah, periksa riwayat unggah anda")
379
            return HttpResponseRedirect("/unggah/")
Saul Andre's avatar
Saul Andre committed
380
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
381
            context = self.get_context_data(**kwargs)
382
            context["form"] = form
383
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
384
385
386
            return self.render_to_response(context)

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

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

394
395
    def validate_file_extension(self, value):
        ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
396
        valid_extensions = [".pdf", ".doc", ".docx", ".jpg", ".png", ".xlsx", ".xls", ".mp4", ".mp3"]
397
        if not ext.lower() in valid_extensions:
398
            raise ValidationError("Unsupported file extension.")
399

Samuel Dimas's avatar
Samuel Dimas committed
400

401
402
403
class UploadMateriHTML(TemplateView):
    template_name = "unggah.html"
    context = {}
igor lestin sianipar's avatar
igor lestin sianipar committed
404

405
406
407
408
409
410
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


411
412
413
414
415
416
417
418
419
420
421
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):

422
        if "template" in self.request.GET:
423

424
425
426
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
427
428

            with BytesIO() as b:
429
                writer = pd.ExcelWriter(b, engine="xlsxwriter")  # pylint: disable=abstract-class-instantiated
430
431
432
                data_frame.to_excel(writer, index=0)
                writer.save()
                response = HttpResponse(
433
434
                    b.getvalue(), content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                )
435
436
437
438
439
440
441
442
443
444

                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):
445
446
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
447

448
        row, lines = excel.shape
449
        categories = Category.objects.all()
450

451
        field_length = {
452
453
454
            "title": 50,
            "author": 30,
            "publisher": 30,
455
456
457
458
459
460
        }

        message = None

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

462
            # Validate Categories
463
            for c in excel["Categories"][i].split(","):
464
465
466
467
468
                sel_cat = categories.filter(name=c)
                if sel_cat.count() == 0:
                    message = f"Kategori %s tidak ditemukan" % c
                    break

469
470
            if len(excel["Title"][i]) > field_length["title"]:
                message = f"Title maksimal %d karakter" % field_length["title"]
471

472
473
            if len(excel["Author"][i]) > field_length["author"]:
                message = f"Author maksimal %d karakter" % field_length["author"]
474

475
476
            if len(excel["Publisher"][i]) > field_length["publisher"]:
                message = f"Publisher maksimal %d karakter" % field_length["publisher"]
477
478
479

            if message != None:
                break
480

481
482
        if message != None:
            messages.error(request, message)
483
            return HttpResponseRedirect("/unggah_excel/")
484
485
486
487
488

        # Second pass, save data
        with django.db.transaction.atomic():
            for i in range(row):
                materi = Materi(
489
490
491
492
493
494
                    title=excel["Title"][i],
                    author=excel["Author"][i],
                    publisher=excel["Publisher"][i],
                    descriptions=excel["Description"][i],
                    uploader=request.user,
                )
495
                materi.save()
496
497

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

500
        messages.success(request, "Materi berhasil diunggah")
501

502
        return HttpResponseRedirect("/unggah_excel/")
503
504


505
class DashboardKontributorView(TemplateView):
506
    template_name = "dashboard.html"
507
508
509
510
511
512
513

    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):
514
        context = super(DashboardKontributorView, self).get_context_data(**kwargs)
515
516
517
518
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
519
520
521
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
522
        return self.render_to_response(context)
523

524

525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
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)
542

543

544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
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)

562

563
564
565
566
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

    def dispatch(self, request, *args, **kwargs):
567
        if not request.user.is_authenticated or not request.user.is_contributor:
568
569
570
571
572
573
574
575
576
577
578
579
580
            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
581
        context["form"] = SuntingProfilForm(instance=current_user)
582
583
584
585
586
587
        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
588
        current_user = self.request.user
589

590
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
591
        if form.is_valid():
592
            current_user.default_profile_picture = True
593
594
595

            # Removing exifdata from profile picture on upload
            if request.FILES:
596
                f_name = request.FILES["profile_picture"].name
597
598
                f_name = get_random_filename(f_name)
                f_path = settings.MEDIA_ROOT + "/" + f_name
599
                request.FILES["profile_picture"].name = f_name
600

601
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
602
603
604
                form.save()

                remove_image_exifdata(f_path)
605
            else:
606
                form.save()
607
608
609
610
611
            return HttpResponseRedirect("/profil/")
        else:
            context = self.get_context_data(**kwargs)
            context["form"] = form
            return self.render_to_response(context)
612

igor lestin sianipar's avatar
igor lestin sianipar committed
613

614
615
616
617
618
619
620
621
622
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):
623
        context = super(SuntingProfilAdminView, self).get_context_data(**kwargs)
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
        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
640

641
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
642
643
        if form.is_valid():
            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
            return HttpResponseRedirect("/profil-admin/")
        else:
            context = self.get_context_data(**kwargs)
661
662
            context["form"] = form
            return self.render_to_response(context)
663

664

665
666
667
668
669
670
671
672
673
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):
674
        context = super(ReqMateriView, self).get_context_data(**kwargs)
675
676
677
678
679
680
681
        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):
682
        title = request.POST.get("title", None)
683
684
685
686
687
        if title is None:
            return JsonResponse({"success": False, "msg": "Missing parameter"})
        ReqMaterial(title=title).save()
        return JsonResponse({"success": True, "msg": "Permintaan materi berhasil dikirimkan"})

688

689
690
691
692
693
694
695
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)
696

697
    def get_context_data(self, **kwargs):
698
        context = super(SuksesLoginKontributorView, self).get_context_data(**kwargs)
699
700
701
702
703
704
705
706
707
708
        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)

709

710
711
712
713
714
715
716
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)
717

718
719
720
721
722
723
724
725
726
727
728
729
    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
730

731
732
733
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
734
735

    def dispatch(self, request, *args, **kwargs):
736
        if not request.user.is_authenticated:
737
            raise PermissionDenied(request)
738
        return super(PostsView, self).dispatch(request, *args, **kwargs)
739
740

    def get(self, request, *args, **kwargs):
741
742
743
744
        context = super().get_context_data(**kwargs)
        user = self.request.user

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

747
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
748
749
750
751
752
753
754

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

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

755
        return self.render_to_response(context=context)
756

757

758
759
760
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

761
    def dispatch(self, request, *args, **kwargs):
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
        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)

777
    def post(self, request, *args, **kwargs):
778
779
780
781
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
782
        form = UploadMateriForm(request.POST, request.FILES, instance=current_materi)
783
784
785
786
787
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
            materi.status = "REVISION"
            materi.save()
788
            kateg = form.cleaned_data["categories"]
789
790
791
792
793
794
795
796
797
            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)

798

Samuel Dimas's avatar
Samuel Dimas committed
799
800
801
802
803
804
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

805
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
806
807
808
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

809
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
810

811
        template = loader.get_template("error-404.html")
Samuel Dimas's avatar
Samuel Dimas committed
812
        return HttpResponse(template.render(context, request))
813
814


815
816
817
818
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
819
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
820
821
822
823
824
825
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
        if request.user.is_authenticated:
            current_user = self.request.user
826
            riwayat_list = current_user.riwayat_unduh.all().order_by("-timestamp")
827
828
829
            context["riwayat_list"] = riwayat_list
            context["user_name"] = current_user.name
        else:
830
831
832
            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")
833
            context["riwayat_list"] = riwayat_list
834
            context["user_name"] = "Guest"
835
        return self.render_to_response(context)
836

837

838
839
840
841
842
843
844
def upload_to_gdrive(file_path, title):
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()

    drive = GoogleDrive(gauth)
    file1 = drive.CreateFile()
    file1.SetContentFile(file_path)
845
846
    file1["title"] = title
    print("title: %s, mimeType: %s" % (file1["title"], file1["mimeType"]))
847
848
    file1.Upload()

849

850
851
852
853
854
855
856
857
858
859
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):
        with open(file_path, "rb") as fh:
            upload_to_gdrive(file_path, materi.title)
    else:
        raise Http404("File tidak dapat ditemukan.")

860
    return HttpResponseRedirect(reverse("detail-materi", kwargs={"pk": pk}))
Yaumi's avatar
Yaumi committed
861
    
Yaumi's avatar
Yaumi committed
862
class PasswordChangeView(PasswordChangeView):
Yaumi's avatar
Yaumi committed
863
    
Yaumi's avatar
Yaumi committed
864
865
    from_class = PasswordChangeForm
    success_url = reverse_lazy('password_success')
Yaumi's avatar
Yaumi committed
866

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