Fakultas Ilmu Komputer UI

views.py 19.9 KB
Newer Older
1
2
3
4
import mimetypes
import os

from django.conf import settings
5
from django.contrib.auth.models import AnonymousUser
6
from django.contrib import messages
7
from django.core import serializers
8
from django.core.exceptions import PermissionDenied, ValidationError
9
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
Mika dabelza abi's avatar
Mika dabelza abi committed
10
from django.db.models import Q, Count
11
12
13
14
from django.http import (Http404, HttpResponse, HttpResponseRedirect,
                         JsonResponse)
from django.shortcuts import get_object_or_404, redirect, render
from django.template import loader
15
from django.urls import reverse
igor lestin sianipar's avatar
igor lestin sianipar committed
16
from django.views.generic import TemplateView, ListView
17
from .models import Category, Comment, Materi
igor lestin sianipar's avatar
igor lestin sianipar committed
18
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
19
from administration.models import VerificationReport
20
21
from app.forms import SuntingProfilForm, UploadMateriForm
from app.models import Category, Comment, Materi, Like, ViewStatistics, DownloadStatistics
22
from authentication.models import User
23

24
25

class DaftarKatalog(TemplateView):
igor lestin sianipar's avatar
igor lestin sianipar committed
26
    paginate_by = 2
27
28
29
30
31
32
33
    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)
34
        context["kategori_list"] = Category.objects.all()
35
        try:
36
37
            context["materi_list"] = Materi.objects.all().filter(
                status="APPROVE")
38
39
        except:
            context["materi_list"] = None
40

Mika dabelza abi's avatar
Mika dabelza abi committed
41
42
43
        list = Materi.objects.filter(status="APPROVE")
        url = ""

44
        getSearch = request.GET.get('search')
45
        if getSearch:
Mika dabelza abi's avatar
Mika dabelza abi committed
46
47
            url = url + "&search={0}".format(getSearch)
            list = list.filter(
48
                Q(title__icontains=getSearch) |
49
                Q(author__icontains=getSearch) |
50
51
                Q(uploader__name__icontains=getSearch) |
                Q(descriptions__icontains=getSearch) |
52
                Q(publisher__icontains=getSearch)
53
            ).distinct()
Saul Andre's avatar
Saul Andre committed
54

55
56
        getKategori = request.GET.get("kategori")
        if getKategori:
Mika dabelza abi's avatar
Mika dabelza abi committed
57
58
59
            url = url + "&kategori={0}".format(getKategori)
            kategori = Category.objects.get(pk=getKategori)
            list = list.filter(categories=kategori.pk)
60

61
        getSort = request.GET.get("sort")
62
        if getSort:
Mika dabelza abi's avatar
Mika dabelza abi committed
63
            url = url + "&sort={0}".format(getSort)
64
            if(getSort == "judul"):
Mika dabelza abi's avatar
Mika dabelza abi committed
65
                list = list.order_by('title')
66
            elif(getSort == "penulis"):
Mika dabelza abi's avatar
Mika dabelza abi committed
67
                list = list.order_by('author')
68
            elif(getSort == "pengunggah"):
Mika dabelza abi's avatar
Mika dabelza abi committed
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
                list = list.order_by('uploader')
            elif(getSort == "terbaru"):
                list = list.order_by('-date_created')
            elif(getSort == "terlama"):
                list = list.order_by('date_created')            
            elif(getSort == "terpopuler"):
                list = list.annotate(count=Count('like__id')).order_by('-count')
                    
        context["materi_list"] = list
        paginator = Paginator(context["materi_list"], 15)
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        context["materi_list"] = page_obj

        context["url"] = url
84

igor lestin sianipar's avatar
igor lestin sianipar committed
85
86
87
88
89
        paginator = Paginator(context["materi_list"], 15)
        page_number = request.GET.get('page')
        page_obj = paginator.get_page(page_number)
        context["materi_list"] = page_obj

90
91
        return self.render_to_response(context=context)

92

93
94
95
96
class DetailMateri(TemplateView):
    template_name = "app/detail_materi.html"

    def get_context_data(self, **kwargs):
97
98
99
100
101
102
        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
103
        context["report"] = VerificationReport.objects.filter(materi=materi)
104
105
106
        context["has_liked"] = Like.objects.filter(
            materi=materi, session_id=self.request.session.session_key).exists()
        return context
107
108
109

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
110
111
        query_set_for_comment = Comment.objects.filter(
            materi=context["materi_data"])
112
        context["comment_data"] = query_set_for_comment
113
114
        return self.render_to_response(context=context)

115
116
    def get_user_name(self, request):
        user_name = ""
117
118
119
        if isinstance(request.user, AnonymousUser):
            user_name = "Anonim"
        elif request.user.is_admin:
120
121
122
123
124
            user_name = "Admin"
        elif request.user.is_contributor:
            user_name = request.user.name
        return user_name

125
    def post(self, request, *args, **kwargs):
126
        commentText = request.POST.get("comment", None)
127
        if commentText == None or commentText == "":
128
129
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
130
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
131
132
            query_set_for_comment = Comment.objects.filter(
                materi=context["materi_data"])
133
            context["comment_data"] = query_set_for_comment
134
            return self.render_to_response(context=context)
135

136
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
137
138
139
        user_obj = request.user if request.user.is_authenticated else None
        comment = Comment.objects.create(comment=commentText,
                                         username=self.get_user_name(request), materi=materi, user=user_obj)
140
141
142
        comment.save()
        return HttpResponseRedirect(request.path)

143

144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
def toggle_like(request):
    if request.method == 'POST':
        materi_id = request.POST.get('materi_id', None)
        session_id = request.POST.get('session_id', None)
        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)
        has_liked = Like.objects.filter(
            materi=materi, session_id=session_id).exists()
        if has_liked:
            like = get_object_or_404(
                Like, materi=materi, session_id=session_id)
            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"})


165
166
167
168
169
170
def delete_comment(request, pk_materi, pk_comment):
    comment = get_object_or_404(Comment, pk=pk_comment)
    url = '/materi/' + str(pk_materi) + "/"
    comment.delete()
    return HttpResponseRedirect(url)

171

172
173
174
175
176
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):
177
178
179
180
181
182
183
184
185
186
        try:
            mimetype = mimetypes.guess_type(file_path)
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
                response["Content-Disposition"] = "attachment; filename=" + \
                    os.path.basename(file_path)
                DownloadStatistics(materi=materi).save()
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
187
188
189
    else:
        raise Http404("File tidak dapat ditemukan.")

igor lestin sianipar's avatar
igor lestin sianipar committed
190

191
192
193
194
195
196
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)
197
198
199
200
201
202
203
204
205
        try:
            with open(file_path, "rb") as fh:
                response = HttpResponse(fh.read(), content_type=mimetype[0])
                response["Content-Disposition"] = "inline; filename=" + \
                    os.path.basename(file_path)
                ViewStatistics(materi=materi).save()
                return response
        except Exception as e:
            raise Http404("File tidak dapat ditemukan.")
206
207
    else:
        raise Http404("File tidak dapat ditemukan.")
igor lestin sianipar's avatar
igor lestin sianipar committed
208

igor lestin sianipar's avatar
igor lestin sianipar committed
209

igor lestin sianipar's avatar
igor lestin sianipar committed
210
class UploadMateriView(TemplateView):
211
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
212
213
214
215
216
217
    context = {}

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

Saul Andre's avatar
Saul Andre committed
218
    def post(self, request, *args, **kwargs):
igor lestin sianipar's avatar
igor lestin sianipar committed
219
220
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)
221
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
222
223
224
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
225
226
227
228
229
230
            konten = form.cleaned_data['content']
            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
231
            materi.save()
232
233
234
            kateg = form.cleaned_data['categories']
            for i in kateg:
                materi.categories.add(i)
igor lestin sianipar's avatar
igor lestin sianipar committed
235
236
            messages.success(
                request, "Materi berhasil diunggah, periksa riwayat unggah anda")
237
            return HttpResponseRedirect("/unggah/")
Saul Andre's avatar
Saul Andre committed
238
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
239
            context = self.get_context_data(**kwargs)
240
            context["form"] = form
241
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
242
243
244
245
246
247
            return self.render_to_response(context)

    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)
        context = self.get_context_data(**kwargs)
248
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
249
        return self.render_to_response(context)
250
251
252
253
254
255
    
    def validate_file_extension(self, value):
        ext = os.path.splitext(value.name)[1]  # [0] returns path+filename
        valid_extensions = ['.pdf', '.doc', '.docx', '.jpg', '.png', '.xlsx', '.xls', '.mp4', '.mp3']
        if not ext.lower() in valid_extensions:
            raise ValidationError('Unsupported file extension.')
256

Samuel Dimas's avatar
Samuel Dimas committed
257

258
259
260
class UploadMateriHTML(TemplateView):
    template_name = "unggah.html"
    context = {}
igor lestin sianipar's avatar
igor lestin sianipar committed
261

262
263
264
265
266
267
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


268
class DashboardKontributorView(TemplateView):
269
    template_name = "dashboard.html"
270
271
272
273
274
275
276

    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):
277
278
        context = super(DashboardKontributorView,
                        self).get_context_data(**kwargs)
279
280
281
282
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
283
284
285
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
286
        return self.render_to_response(context)
287

288

289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
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)
306

307

308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
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)

326

327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
class SuntingProfilView(TemplateView):
    template_name = "sunting.html"

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_contributor:
            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
345
        context["form"] = SuntingProfilForm(instance=current_user)
346
347
348
349
350
351
        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
352
        current_user = self.request.user
353
354
        form = SuntingProfilForm(
            request.POST, request.FILES, instance=current_user)
355
        if form.is_valid():
356
            current_user.default_profile_picture = True
Samuel Dimas Partogi's avatar
Samuel Dimas Partogi committed
357
            form.save()
358
359
360
361
362
            return HttpResponseRedirect("/profil/")
        else:
            context = self.get_context_data(**kwargs)
            context["form"] = form
            return self.render_to_response(context)
363

igor lestin sianipar's avatar
igor lestin sianipar committed
364

365
366
367
368
369
370
371
372
373
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):
igor lestin sianipar's avatar
igor lestin sianipar committed
374
375
        context = super(SuntingProfilAdminView,
                        self).get_context_data(**kwargs)
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
        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
        form = SuntingProfilForm(
            request.POST, request.FILES, instance=current_user)
        if form.is_valid():
            current_user.default_profile_picture = True
            form.save()
            return HttpResponseRedirect("/profil-admin/")
        else:
            context = self.get_context_data(**kwargs)
400
401
            context["form"] = form
            return self.render_to_response(context)
402

403

404
405
406
407
408
409
410
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)
411

412
    def get_context_data(self, **kwargs):
413
414
        context = super(SuksesLoginKontributorView,
                        self).get_context_data(**kwargs)
415
416
417
418
419
420
421
422
423
424
        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)

425

426
427
428
429
430
431
432
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)
433

434
435
436
437
438
439
440
441
442
443
444
445
    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
446

447
448
449
450
class CommentsView(TemplateView):
    template_name = "comments.html"

    def dispatch(self, request, *args, **kwargs):
igor lestin sianipar's avatar
igor lestin sianipar committed
451
        if not request.user.pk == kwargs["pk_user"]:
452
453
454
455
456
            raise PermissionDenied(request)
        return super(CommentsView, self).dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(CommentsView, self).get_context_data(**kwargs)
Saul Andre's avatar
Saul Andre committed
457
458
        user = get_object_or_404(User, pk=kwargs["pk_user"])
        users_materi = Materi.objects.filter(uploader=user)
igor lestin sianipar's avatar
igor lestin sianipar committed
459
        numb_of_comments = 0
460
        qset_comments = Comment.objects.none()
Saul Andre's avatar
Saul Andre committed
461
462
463
        for materi in users_materi:
            materi_comments = Comment.objects.filter(materi=materi).count()
            numb_of_comments += materi_comments
464
465
            qset_comments |= Comment.objects.filter(materi=materi)
        context['comments'] = qset_comments.order_by('-timestamp')
Saul Andre's avatar
Saul Andre committed
466
467
        context["numb_of_comments"] = numb_of_comments
        context["numb_of_materi"] = users_materi.count()
468
469
470
471
472
        return context

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

474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
class RevisiMateriView(TemplateView):
    template_name = "revisi.html"

    def dispatch(self, request, *args, **kwargs):        
        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)

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

        current_materi = get_object_or_404(Materi, pk=kwargs["pk"])
        form = UploadMateriForm(
            request.POST, request.FILES, instance=current_materi)
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
            materi.status = "REVISION"
            materi.save()
            kateg = form.cleaned_data['categories']
            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)

Samuel Dimas's avatar
Samuel Dimas committed
515
516
517
518
519
520
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

521
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
522
523
524
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

525
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
526

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