Fakultas Ilmu Komputer UI

views.py 31.8 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

Selvy Fitriani's avatar
Selvy Fitriani committed
351
352
353
354
355
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
356
class UploadMateriView(TemplateView):
357
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
358
359
360
361
362
363
    context = {}

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

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

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

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

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

Samuel Dimas's avatar
Samuel Dimas committed
403

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

408
409
410
411
412
413
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


414
415
416
417
418
419
420
421
422
423
424
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):

425
        if "template" in self.request.GET:
426

427
428
429
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
430
431

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

                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):
448
449
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
450

451
        row, lines = excel.shape
452
        categories = Category.objects.all()
453

454
        field_length = {
455
456
457
            "title": 50,
            "author": 30,
            "publisher": 30,
458
459
460
461
462
463
        }

        message = None

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

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

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

475
476
            if len(excel["Author"][i]) > field_length["author"]:
                message = f"Author maksimal %d karakter" % field_length["author"]
477

478
479
            if len(excel["Publisher"][i]) > field_length["publisher"]:
                message = f"Publisher maksimal %d karakter" % field_length["publisher"]
480
481
482

            if message != None:
                break
483

484
485
        if message != None:
            messages.error(request, message)
486
            return HttpResponseRedirect("/unggah_excel/")
487
488
489
490
491

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

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

503
        messages.success(request, "Materi berhasil diunggah")
504

505
        return HttpResponseRedirect("/unggah_excel/")
506
507


508
class DashboardKontributorView(TemplateView):
509
    template_name = "dashboard.html"
510
511
512
513
514
515
516

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

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

527

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

546

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

565

566
567
568
569
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

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

593
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
594
        if form.is_valid():
595
            current_user.default_profile_picture = True
596
597
598

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

604
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
605
606
607
                form.save()

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

igor lestin sianipar's avatar
igor lestin sianipar committed
616

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

644
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
645
646
        if form.is_valid():
            current_user.default_profile_picture = True
647
648
649

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

655
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
656
657
658
                form.save()

                remove_image_exifdata(f_path)
659
            else:
660
                form.save()
661
662
663
            return HttpResponseRedirect("/profil-admin/")
        else:
            context = self.get_context_data(**kwargs)
664
665
            context["form"] = form
            return self.render_to_response(context)
666

667

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

691

692
693
694
695
696
697
698
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)
699

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

712

713
714
715
716
717
718
719
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)
720

721
722
723
724
725
726
727
728
729
730
731
732
    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
733

734
735
736
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
737
738

    def dispatch(self, request, *args, **kwargs):
739
        if not request.user.is_authenticated:
740
            raise PermissionDenied(request)
741
        return super(PostsView, self).dispatch(request, *args, **kwargs)
742
743

    def get(self, request, *args, **kwargs):
744
745
746
747
        context = super().get_context_data(**kwargs)
        user = self.request.user

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

750
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
751
752
753
754
755
756
757

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

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

758
        return self.render_to_response(context=context)
759

760

761
762
763
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

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

780
    def post(self, request, *args, **kwargs):
781
782
783
784
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

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

801

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

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

812
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
813

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


818
819
820
821
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
822
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
823
824
825
826
827
828
        return context

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

840

841
842
843
844
845
846
847
def upload_to_gdrive(file_path, title):
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()

    drive = GoogleDrive(gauth)
    file1 = drive.CreateFile()
    file1.SetContentFile(file_path)
848
849
    file1["title"] = title
    print("title: %s, mimeType: %s" % (file1["title"], file1["mimeType"]))
850
851
    file1.Upload()

852

853
854
855
856
857
858
859
860
861
862
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.")

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