diff --git a/app/models.py b/app/models.py index 39911d3e01ef2efdba9f0a661c5b0b6ce458ec9f..b0333c1da1f631395826008f2b1a75437535b41c 100644 --- a/app/models.py +++ b/app/models.py @@ -70,6 +70,13 @@ class Materi(models.Model): count = Like.objects.filter(materi=self).count() return count + @property + def is_like(self): + like = False + if Like.objects.filter(materi=self).exists(): + like = True + + class Comment(models.Model): username = models.CharField(max_length=100) profile = models.CharField(max_length=100, default=getRandomColor) diff --git a/app/templates/app/includes/sidebar.html b/app/templates/app/includes/sidebar.html index 18338f5f504edc29b60e49b0f6c0cc3220069520..ff0bb3adb420af54f491adcdc994bd422f1991d6 100644 --- a/app/templates/app/includes/sidebar.html +++ b/app/templates/app/includes/sidebar.html @@ -32,7 +32,7 @@ </a> </li> <li class="nav-item"> - <a class="nav-link" href="#"> + <a class="nav-link" href="{% url 'favorite' %}"> <span>Favorite Materi</span> </a> </li> diff --git a/app/templates/user_favorite_materi.html b/app/templates/user_favorite_materi.html new file mode 100644 index 0000000000000000000000000000000000000000..7ca9ccffc1b172244c76e97fe59a9db72a231a0f --- /dev/null +++ b/app/templates/user_favorite_materi.html @@ -0,0 +1,64 @@ +{% extends 'app/base_dashboard.html' %} +{% load static %} + +{% block title %} +<title>Materi Favorite | Digipus</title> +{% endblock %} + +{% block stylesheets %} +<link rel="stylesheet" type="text/css" href="{% static 'app/css/user_uploaded_posts.css' %}"/> +{% endblock %} + +{% block content %} + +<div style="padding: 1rem 0" id="like"> + {% if materi %} + {% for _, mat in materi.items %} + <div id="mat-{{ mat.data.id }}"> + <div class="posts-space-between-container bg-white rounded shadow" style="margin: 0.5rem 2rem; padding: 1rem;"> + <div id="posts-user-profile"> + {% if mat.data.cover %} + <img id="posts-img" src="{{ post.data.cover.url }}" alt="profile-picture"/> + {% else %} + </div style="background-color: grey; width: 100px; height: 100px;"> + {% endif %} + <div id="posts-info"> + <span><a class="ml-auto p-1 link" style="text-align: left; font-size: 2rem;" href="{% url 'detail-materi' post.data.id %}"> + {{ mat.data.title }} + </a></span> + <span style="font-size: 0.75rem; padding-left: 0.3rem;">{{ mat.data.date_created }}</span> + </div> + </div> + <div class="posts-vertically-centered ml-auto pr-4"> + <span id="post-like-count-{{post.data.id}}">{{ mat.data.like_count }}</span> + <span>Like</span> + </div> + <div class="posts-vertically-centered"> + <span>{{ mat.comments|length }}</span> + <span>Komentar</span> + </div> + </div> + {% for comment in mat.comments %} + <div id="post-{{ post.data.id }}-comment-{{ comment.id }}"> + <div id="posts-comment-info" class="bg-white rounded shadow" > + <img id="posts-profile-picture" src="{{ comment.user.profile_picture.url }}" alt="profile-picture" width="40px" height="40px" style="margin: 18px"/> + <div style="display: flex; align-items: center;"> + <div style="display: flex; flex-direction: column;"> + <span style="font-size: 0.9rem;"><strong>{{ comment.user.name }}</strong> - {{ comment.timestamp }}</span> + {{ comment.comment }} + </div> + </div> + </div> + </div> + {% endfor %} + </div> + {% endfor %} + {% else %} + <div class="text-center h5"> + Anda belum memiliki materi yang disukai + </div> + {% endif %} + +</div> + +{% endblock %} diff --git a/app/urls.py b/app/urls.py index 7ccc70c3a5dc1c82dbcb59772f950b9a04e9c2da..ee398dc154f43962ddded97e31c2a85aceee1113 100644 --- a/app/urls.py +++ b/app/urls.py @@ -5,7 +5,7 @@ from app.views import (DashboardKontributorView, ProfilKontributorView, SuksesLoginAdminView, SuksesLoginKontributorView, DownloadHistoryView, SuntingProfilView, UploadMateriHTML, UploadMateriView, UploadMateriExcelView, ProfilAdminView, PostsView, SuntingProfilAdminView, - ReqMateriView, KatalogPerKontributorView) + ReqMateriView, KatalogPerKontributorView, MateriFavorite) urlpatterns = [ path("", views.DaftarKatalog.as_view(), name="daftar_katalog"), @@ -34,4 +34,5 @@ urlpatterns = [ name="katalog-per-kontributor"), path("materi/rate/", views.add_rating_materi, name="rate-materi"), path("materi/<int:pk>/save-to-gdrive/", views.save_to_gdrive, name="save-to-gdrive"), + path("favorite", MateriFavorite.as_view(), name="favorite") ] diff --git a/app/views.py b/app/views.py index 90ab4581fcbc9582420cf266ecb51a6e7c10c206..94353f25fa8f3d8365220d22aaf2134d0c30b00f 100644 --- a/app/views.py +++ b/app/views.py @@ -845,3 +845,31 @@ def save_to_gdrive(request, pk): raise Http404("File tidak dapat ditemukan.") return HttpResponseRedirect(reverse('detail-materi', kwargs={'pk': pk})) + +class MateriFavorite(TemplateView): + + template_name = "user_favorite_materi.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_authenticated: + raise PermissionDenied(request) + return super(MateriFavorite, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + context = super().get_context_data(**kwargs) + user = self.request.user + + materi = Materi.objects.filter(like=True) + likes_data = { like.id: { "data": materi, "comments": [] } for mat in materi } + + comments = Comment.objects \ + .filter(materi__id__in=likes_data.keys()) \ + .order_by("-timestamp") + + for comment in comments: + likes_data[comment.materi.id]["comments"].append(comment) + + context["user"] = user + context["likes"] = likes_data + + return self.render_to_response(context=context) \ No newline at end of file