Fakultas Ilmu Komputer UI

views.py 31.7 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
38

39
40

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

43

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

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

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

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

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

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

        context["url"] = url
103
104
        return self.render_to_response(context=context)

105

106
107
class KatalogPerKontributorView(TemplateView):
    template_name = "app/katalog_kontri.html"
108

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

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

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

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

136

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

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

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

164
        return context
165
166
167

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

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

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

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

200

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


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

226

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

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

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

271

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

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

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


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

igor lestin sianipar's avatar
igor lestin sianipar committed
332

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

igor lestin sianipar's avatar
igor lestin sianipar committed
350

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

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

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

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

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

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

Samuel Dimas's avatar
Samuel Dimas committed
398

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

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


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

420
        if "template" in self.request.GET:
421

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

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

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

446
        row, lines = excel.shape
447
        categories = Category.objects.all()
448

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

        message = None

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

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

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

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

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

            if message != None:
                break
478

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

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

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

498
        messages.success(request, "Materi berhasil diunggah")
499

500
        return HttpResponseRedirect("/unggah_excel/")
501
502


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

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

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

522

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

541

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

560

561
562
563
564
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

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

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

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

599
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
600
601
602
                form.save()

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

igor lestin sianipar's avatar
igor lestin sianipar committed
611

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

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

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

650
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
651
652
653
                form.save()

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

662

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

686

687
688
689
690
691
692
693
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)
694

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

707

708
709
710
711
712
713
714
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)
715

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

729
730
731
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
732
733

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

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

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

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

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

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

753
        return self.render_to_response(context=context)
754

755

756
757
758
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

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

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

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

796

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

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

807
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
808

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


813
814
815
816
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

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

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

835

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

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

847

848
849
850
851
852
853
854
855
856
857
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.")

858
859
    return HttpResponseRedirect(reverse("detail-materi", kwargs={"pk": pk}))