Fakultas Ilmu Komputer UI

views.py 16.7 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
9
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
10
from django.db.models import Q
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
20
from app.forms import SuntingProfilForm, UploadMateriForm
from app.models import Category, Comment, Materi, Like, ViewStatistics, DownloadStatistics
21
from authentication.models import User
22

23
24

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

40
        getSearch = request.GET.get('search')
41
        if getSearch:
42
            list = Materi.objects.filter(
43
                Q(title__icontains=getSearch) |
44
                Q(author__icontains=getSearch) |
45
46
                Q(uploader__name__icontains=getSearch) |
                Q(descriptions__icontains=getSearch) |
47
                Q(publisher__icontains=getSearch)
48
49
            ).distinct()
            context["materi_list"] = list.filter(status="APPROVE")
Saul Andre's avatar
Saul Andre committed
50

51
52
53
        getKategori = request.GET.get("kategori")
        if getKategori:
            pkGet = request.GET.get("kategori")
54
55
56
57
            kategori = Category.objects.get(pk=pkGet)
            list = Materi.objects.filter(categories=kategori.pk)
            context["materi_list"] = list.filter(status="APPROVE")

58
        getSort = request.GET.get("sort")
59
60
        if getSort:
            list = Materi.objects.all().filter(status="APPROVE")
61
62
63
64
65
66
            if(getSort == "judul"):
                context["materi_list"] = list.order_by('title')
            elif(getSort == "penulis"):
                context["materi_list"] = list.order_by('author')
            elif(getSort == "pengunggah"):
                context["materi_list"] = list.order_by('uploader')
67

68
69
        return self.render_to_response(context=context)

70

71
72
73
74
class DetailMateri(TemplateView):
    template_name = "app/detail_materi.html"

    def get_context_data(self, **kwargs):
75
76
77
78
79
80
81
82
83
        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
        context["has_liked"] = Like.objects.filter(
            materi=materi, session_id=self.request.session.session_key).exists()
        return context
84
85
86

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
87
88
        query_set_for_comment = Comment.objects.filter(
            materi=context["materi_data"])
89
        context["comment_data"] = query_set_for_comment
90
91
        return self.render_to_response(context=context)

92
93
    def get_user_name(self, request):
        user_name = ""
94
95
96
        if isinstance(request.user, AnonymousUser):
            user_name = "Anonim"
        elif request.user.is_admin:
97
98
99
100
101
            user_name = "Admin"
        elif request.user.is_contributor:
            user_name = request.user.name
        return user_name

102
    def post(self, request, *args, **kwargs):
103
        commentText = request.POST.get("comment", None)
104
        if commentText == None or commentText == "":
105
106
            context = self.get_context_data(*args, **kwargs)
            context["error_message"] = "Anda belum menuliskan komentar"
107
            context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"])
108
109
            query_set_for_comment = Comment.objects.filter(
                materi=context["materi_data"])
110
            context["comment_data"] = query_set_for_comment
111
            return self.render_to_response(context=context)
112

113
        materi = get_object_or_404(Materi, pk=kwargs["pk"])
114
115
116
        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)
117
118
119
        comment.save()
        return HttpResponseRedirect(request.path)

120

121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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"})


142
143
144
145
146
147
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)

148

149
150
151
152
153
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):
154
155
156
157
158
159
160
161
162
163
        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.")
164
165
166
167
168
169
170
171
172
    else:
        raise Http404("File tidak dapat ditemukan.")

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)
173
174
175
176
177
178
179
180
181
        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.")
182
183
    else:
        raise Http404("File tidak dapat ditemukan.")
igor lestin sianipar's avatar
igor lestin sianipar committed
184
185

class UploadMateriView(TemplateView):
186
    template_name = "unggah.html"
igor lestin sianipar's avatar
igor lestin sianipar committed
187
188
189
190
191
192
    context = {}

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

Saul Andre's avatar
Saul Andre committed
193
    def post(self, request, *args, **kwargs):
igor lestin sianipar's avatar
igor lestin sianipar committed
194
195
        if request.user.is_authenticated == False:
            raise PermissionDenied(request)
196
        form = UploadMateriForm(request.POST, request.FILES)
igor lestin sianipar's avatar
igor lestin sianipar committed
197
198
199
200
        if form.is_valid():
            materi = form.save(commit=False)
            materi.uploader = request.user
            materi.save()
201
202
203
            kateg = form.cleaned_data['categories']
            for i in kateg:
                materi.categories.add(i)
204
            messages.success(request, "Materi berhasil diunggah, periksa riwayat unggah anda")
205
            return HttpResponseRedirect("/unggah/")
Saul Andre's avatar
Saul Andre committed
206
        else:
igor lestin sianipar's avatar
igor lestin sianipar committed
207
            context = self.get_context_data(**kwargs)
208
            context["form"] = form
209
            messages.error(request, "Terjadi kesalahan pada pengisian data")
igor lestin sianipar's avatar
igor lestin sianipar committed
210
211
212
213
214
215
            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)
216
        context["form"] = UploadMateriForm
igor lestin sianipar's avatar
igor lestin sianipar committed
217
        return self.render_to_response(context)
218

Samuel Dimas's avatar
Samuel Dimas committed
219

220
221
222
223
224
225
226
227
228
class UploadMateriHTML(TemplateView):
    template_name = "unggah.html"
    context = {}
    def get_template_names(self):
        if self.request.path == "/unggah/":
            template_name = "unggah.html"
        return template_name


229
class DashboardKontributorView(TemplateView):
230
    template_name = "dashboard.html"
231
232
233
234
235
236
237

    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):
238
239
        context = super(DashboardKontributorView,
                        self).get_context_data(**kwargs)
240
241
242
243
        return context

    def get(self, request, *args, **kwargs):
        context = self.get_context_data(**kwargs)
244
245
246
        current_user = self.request.user
        materi_list = current_user.materi_set.all()
        context["materi_list"] = materi_list
247
        return self.render_to_response(context)
248

249

250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
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)
267

268

269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
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)

287

288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
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
306
        context["form"] = SuntingProfilForm(instance=current_user)
307
308
309
310
311
312
        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
313
        current_user = self.request.user
314
315
        form = SuntingProfilForm(
            request.POST, request.FILES, instance=current_user)
316
        if form.is_valid():
317
            current_user.default_profile_picture = True
Samuel Dimas Partogi's avatar
Samuel Dimas Partogi committed
318
            form.save()
319
320
321
322
323
            return HttpResponseRedirect("/profil/")
        else:
            context = self.get_context_data(**kwargs)
            context["form"] = form
            return self.render_to_response(context)
324

325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
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):
        context = super(SuntingProfilAdminView, 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

        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)
359
360
            context["form"] = form
            return self.render_to_response(context)
361

362

363
364
365
366
367
368
369
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)
370

371
    def get_context_data(self, **kwargs):
372
373
        context = super(SuksesLoginKontributorView,
                        self).get_context_data(**kwargs)
374
375
376
377
378
379
380
381
382
383
        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)

384

385
386
387
388
389
390
391
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)
392

393
394
395
396
397
398
399
400
401
402
403
404
    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)

405
406
407
408
class CommentsView(TemplateView):
    template_name = "comments.html"

    def dispatch(self, request, *args, **kwargs):
409
        if not request.user.pk == kwargs["pk_user"] :
410
411
412
413
414
            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
415
416
417
        user = get_object_or_404(User, pk=kwargs["pk_user"])
        users_materi = Materi.objects.filter(uploader=user)
        numb_of_comments = 0 
418
        qset_comments = Comment.objects.none()
Saul Andre's avatar
Saul Andre committed
419
420
421
        for materi in users_materi:
            materi_comments = Comment.objects.filter(materi=materi).count()
            numb_of_comments += materi_comments
422
423
            qset_comments |= Comment.objects.filter(materi=materi)
        context['comments'] = qset_comments.order_by('-timestamp')
Saul Andre's avatar
Saul Andre committed
424
425
        context["numb_of_comments"] = numb_of_comments
        context["numb_of_materi"] = users_materi.count()
426
427
428
429
430
        return context

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

Samuel Dimas's avatar
Samuel Dimas committed
432
433
434
435
436
437
def pages(request):
    context = {}
    # All resource paths end in .html.
    # Pick out the html file name from the url. And load that template.
    try:

438
        load_template = request.path.split("/")[-1]
Samuel Dimas's avatar
Samuel Dimas committed
439
440
441
        template = loader.get_template(load_template)
        return HttpResponse(template.render(context, request))

442
    except Exception as e:
Samuel Dimas's avatar
Samuel Dimas committed
443

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