Fakultas Ilmu Komputer UI

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

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

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

44

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

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

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

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

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

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

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

106

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

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

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

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

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

137

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

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

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

167
        return context
168
169
170

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

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

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

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

204

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


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

230

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

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

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

275

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

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

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


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

igor lestin sianipar's avatar
igor lestin sianipar committed
336

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

igor lestin sianipar's avatar
igor lestin sianipar committed
354

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

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

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

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

igor lestin sianipar's avatar
igor lestin sianipar committed
397
        context = self.get_context_data(**kwargs)
398
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
399
        return self.render_to_response(context)
400

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

Samuel Dimas's avatar
Samuel Dimas committed
407

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

412
413
414
415
416
417
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


418
419
420
421
422
423
424
425
426
427
428
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):

429
        if "template" in self.request.GET:
430

431
432
433
            data_frame = pd.DataFrame(
                {"Title": [], "Author": [], "Publisher": [], "Categories": [], "Description": [],}
            )
434
435

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

                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):
452
453
        excel_file = request.FILES["excel"]
        excel = pd.read_excel(excel_file)
454

455
        row, lines = excel.shape
456
        categories = Category.objects.all()
457

458
        field_length = {
459
460
461
            "title": 50,
            "author": 30,
            "publisher": 30,
462
463
464
465
466
467
        }

        message = None

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

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

476
477
            if len(excel["Title"][i]) > field_length["title"]:
                message = f"Title maksimal %d karakter" % field_length["title"]
478

479
480
            if len(excel["Author"][i]) > field_length["author"]:
                message = f"Author maksimal %d karakter" % field_length["author"]
481

482
483
            if len(excel["Publisher"][i]) > field_length["publisher"]:
                message = f"Publisher maksimal %d karakter" % field_length["publisher"]
484
485
486

            if message != None:
                break
487

488
489
        if message != None:
            messages.error(request, message)
490
            return HttpResponseRedirect("/unggah_excel/")
491
492
493
494
495

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

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

507
        messages.success(request, "Materi berhasil diunggah")
508

509
        return HttpResponseRedirect("/unggah_excel/")
510
511


512
class DashboardKontributorView(TemplateView):
513
    template_name = "dashboard.html"
514
515
516
517
518
519
520

    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):
521
        context = super(DashboardKontributorView, self).get_context_data(**kwargs)
522
523
524
525
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
526
527
528
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
529
        return self.render_to_response(context)
530

531

532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
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)
549

550

551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
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)

569

570
571
572
573
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

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

597
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
598
        if form.is_valid():
599
            current_user.default_profile_picture = True
600
601
602

            # Removing exifdata from profile picture on upload
            if request.FILES:
603
                f_name = request.FILES["profile_picture"].name
604
605
                f_name = get_random_filename(f_name)
                f_path = settings.MEDIA_ROOT + "/" + f_name
606
                request.FILES["profile_picture"].name = f_name
607

608
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
609
610
611
                form.save()

                remove_image_exifdata(f_path)
612
            else:
613
                form.save()
614
615
616
617
618
            return HttpResponseRedirect("/profil/")
        else:
            context = self.get_context_data(**kwargs)
            context["form"] = form
            return self.render_to_response(context)
619

igor lestin sianipar's avatar
igor lestin sianipar committed
620

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

648
        form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
649
650
        if form.is_valid():
            current_user.default_profile_picture = True
651
652
653

            # Removing exifdata from profile picture on upload
            if request.FILES:
654
                f_name = request.FILES["profile_picture"].name
655
656
                f_name = get_random_filename(f_name)
                f_path = settings.MEDIA_ROOT + "/" + f_name
657
                request.FILES["profile_picture"].name = f_name
658

659
                form = SuntingProfilForm(request.POST, request.FILES, instance=current_user)
660
661
662
                form.save()

                remove_image_exifdata(f_path)
663
            else:
664
                form.save()
665
666
667
            return HttpResponseRedirect("/profil-admin/")
        else:
            context = self.get_context_data(**kwargs)
668
669
            context["form"] = form
            return self.render_to_response(context)
670

671

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

695

696
697
698
699
700
701
702
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)
703

704
    def get_context_data(self, **kwargs):
705
        context = super(SuksesLoginKontributorView, self).get_context_data(**kwargs)
706
707
708
709
710
711
712
713
714
715
        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)

716

717
718
719
720
721
722
723
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)
724

725
726
727
728
729
730
731
732
733
734
735
736
    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
737

738
739
740
class PostsView(TemplateView):

    template_name = "user_uploaded_posts.html"
741
742

    def dispatch(self, request, *args, **kwargs):
743
        if not request.user.is_authenticated:
744
            raise PermissionDenied(request)
745
        return super(PostsView, self).dispatch(request, *args, **kwargs)
746
747

    def get(self, request, *args, **kwargs):
748
749
750
751
        context = super().get_context_data(**kwargs)
        user = self.request.user

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

754
        comments = Comment.objects.filter(materi__id__in=posts_data.keys()).order_by("-timestamp")
755
756
757
758
759
760
761

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

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

762
        return self.render_to_response(context=context)
763

764

765
766
767
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

768
    def dispatch(self, request, *args, **kwargs):
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
        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)

784
    def post(self, request, *args, **kwargs):
785
786
787
788
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)

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

805

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

812
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
813
814
815
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

816
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
817

818
        template = loader.get_template("error-404.html")
Samuel Dimas's avatar
Samuel Dimas committed
819
        return HttpResponse(template.render(context, request))
820
821


822
823
824
825
class DownloadHistoryView(TemplateView):
    template_name = "download_history.html"

    def get_context_data(self, **kwargs):
826
        context = super(DownloadHistoryView, self).get_context_data(**kwargs)
827
828
829
830
831
832
        return context

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

844

845
846
847
848
849
850
851
def upload_to_gdrive(file_path, title):
    gauth = GoogleAuth()
    gauth.LocalWebserverAuth()

    drive = GoogleDrive(gauth)
    file1 = drive.CreateFile()
    file1.SetContentFile(file_path)
852
853
    file1["title"] = title
    print("title: %s, mimeType: %s" % (file1["title"], file1["mimeType"]))
854
855
    file1.Upload()

856

857
858
859
860
861
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):
862
        upload_to_gdrive(file_path, materi.title)
863
864
865
    else:
        raise Http404("File tidak dapat ditemukan.")

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

Yaumi's avatar
Yaumi committed
868
class PasswordChangeView(PasswordChangeView):
Yaumi's avatar
Yaumi committed
869
    
Yaumi's avatar
Yaumi committed
870
871
    from_class = PasswordChangeForm
    success_url = reverse_lazy('password_success')
Yaumi's avatar
Yaumi committed
872

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