diff --git a/administration/templates/daftar_kontributor.html b/administration/templates/daftar_kontributor.html new file mode 100644 index 0000000000000000000000000000000000000000..0aae1bbcb4b319f54441f4c55a7715db9f33a306 --- /dev/null +++ b/administration/templates/daftar_kontributor.html @@ -0,0 +1,230 @@ +{% load static %} + +<!DOCTYPE html> +<html lang="en"> + +<head> + + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <meta name="description" content=""> + <meta name="author" content=""> + + <title>Dasbor Kontributor</title> + + <!-- Custom fonts for this template --> + <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet"> + + <!-- Custom styles for this template --> + <link href="{% static 'css/sb-admin-2.min.css' %}" rel="stylesheet"> + <link rel="stylesheet" href="{% static 'css/button.css' %}"> + + <!-- Custom styles for this page --> + <link href="{% static 'vendor/datatables/dataTables.bootstrap4.min.css' %}" rel="stylesheet"> + +</head> + +<body id="page-top" style="font-family: 'Poppins', sans-serif;"> + + <!-- Page Wrapper --> + <div id="wrapper"> + + <!-- Sidebar --> + <ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar"> + + <!-- Sidebar - Brand --> + <a class="sidebar-brand d-flex align-items-center justify-content-center" href="{% url 'daftar_katalog' %}"> + <div class="sidebar-brand-icon rotate-n-15"> + </div> + <div class="sidebar-brand-text mx-3">Digipus</div> + </a> + + <!-- Divider --> + <hr class="sidebar-divider my-0"> + + <!-- Nav Item - Dashboard --> + <li class="nav-item"> + <a class="nav-link" href="/administration/"> + <span>Verifikasi Materi</span></a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/administration/daftar-kontributor/"> + <span>Daftar Kontributor</span></a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="#"> + <span>Statistik Materi</span></a> + </li> + + <!-- Divider --> + <hr class="sidebar-divider"> + + <li class="nav-item"> + <a class="nav-link" href="/administration/setting/verification/"> + <span>Pengaturan Verifikasi</span></a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/administration/setting/category/"> + <span>Pengaturan Kategori</span></a> + </li> + + </ul> + <!-- End of Sidebar --> + + <!-- Content Wrapper --> + <div id="content-wrapper" class="d-flex flex-column"> + + <!-- Main Content --> + <div id="content"> + + <!-- Topbar --> + <nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow"> + + <!-- Sidebar Toggle (Topbar) --> + <button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3"> + <i class="fa fa-bars"></i> + </button> + + <div class="sidebar-brand-text mx-3">Diskominfo Kota Depok</div> + + <!-- Topbar Navbar --> + <ul class="navbar-nav ml-auto"> + + <li class="nav-item"> + <a class="nav-link" href="/dashboard/"> + <span class="mr-2 d-none d-lg-inline text-gray-600 small">Dasbor</span> + </a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/profil/"> + <span class="mr-2 d-none d-lg-inline text-gray-600 small">Profil</span> + </a> + </li> + + <div class="topbar-divider d-none d-sm-block"></div> + + <!-- Nav Item - User Information --> + <li class="nav-item dropdown no-arrow"> + <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" + aria-haspopup="true" aria-expanded="false"> + <span class="mr-2 d-none d-lg-inline text-gray-600 small">{{ user.name }}</span> + <img class="img-profile rounded-circle" src="{{ user.profile_picture.url}}"> + </a> + </li> + + </ul> + + </nav> + <!-- End of Topbar --> + + <!-- Begin Page Content --> + <div class="container-fluid"> + + <!-- Page Heading --> + <h1 class="h3 mb-2 text-gray-800">Daftar Kontributor</h1> + <p class="mb-4">Tekan tombol detail untuk informasi lebih lanjut tentang kontributor</p> + + <!-- DataTales Example --> + <div class="card shadow mb-4"> + <div class="card-header py-3"> + <h6 class="m-0 font-weight-bold text-primary">Tabel Daftar Kontributor</h6> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table class="table table-bordered" id="dataTable" width="100%" cellspacing="0"> + <thead> + <tr> + <th>Nama</th> + <th>NIK</th> + <th>Instansi</th> + <th>Detail</th> + </tr> + </thead> + <tfoot> + <tr> + <th>Nama</th> + <th>NIK</th> + <th>Instansi</th> + <th>Detail</th> + </tr> + </tr> + </tfoot> + <tbody> + {% for user in users %} + <tr> + <td>{{ user.name }}</td> + <td>{{ user.nik }}</td> + <td>{{ user.instansi }}</td> + <td class="verif-buttons"> + <a href="/administration/profil/{{ user.id }}/" class="accept-button" + style="background-color:#4e73df">Detail + </a> + </td> + </tr> + {% endfor %} + </tbody> + </table> + </div> + </div> + </div> + + </div> + <!-- /.container-fluid --> + + </div> + <!-- End of Main Content --> + + <!-- Footer --> + <footer class="sticky-footer bg-white"> + <div class="container my-auto"> + <div class="copyright text-center my-auto"> + <span>Copyright © Diskominfo Kota Depok 2020</span> + </div> + </div> + </footer> + <!-- End of Footer --> + + </div> + <!-- End of Content Wrapper --> + + </div> + <!-- End of Page Wrapper --> + + <!-- Scroll to Top Button--> + <a class="scroll-to-top rounded" href="#page-top"> + <i class="fas fa-angle-up"></i> + </a> + + <!-- Bootstrap core JavaScript--> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" + integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" + crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" + integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" + crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" + integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" + crossorigin="anonymous"></script> + + <!-- Core plugin JavaScript--> + <script src="https://code.jquery.com/jquery-3.5.0.min.js" + integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ=" crossorigin="anonymous"></script> + + <!-- Custom scripts for all pages--> + <script src="{% static 'js/sb-admin-2.min.js' %}"></script> + + <!-- Page level plugins --> + <script src="{% static 'vendor/datatables/jquery.dataTables.min.js' %}"></script> + <script src="{% static 'vendor/datatables/dataTables.bootstrap4.min.js' %}"></script> + + <!-- Page level custom scripts --> + <script src="{% static 'js/demo/datatables-demo.js' %}"></script> + +</body> + +</html> \ No newline at end of file diff --git a/administration/templates/detail_kontri_admin.html b/administration/templates/detail_kontri_admin.html new file mode 100644 index 0000000000000000000000000000000000000000..d75e5e1792e55b59436f74c75bf12697d6b64eeb --- /dev/null +++ b/administration/templates/detail_kontri_admin.html @@ -0,0 +1,206 @@ +{% load static %} + +<!DOCTYPE html> +<html lang="en"> + +<head> + + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <meta name="description" content=""> + <meta name="author" content=""> + + <title>Profil Kontributor</title> + + <!-- Custom fonts for this template --> + <link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet"> + + <!-- Custom styles for this template --> + <link href="{% static 'css/sb-admin-2.min.css' %}" rel="stylesheet"> + <link rel="stylesheet" href="{% static 'css/button.css' %}"> + + <!-- Custom styles for this page --> + <link href="{% static 'vendor/datatables/dataTables.bootstrap4.min.css' %}" rel="stylesheet"> + +</head> + +<body id="page-top" style="font-family: 'Poppins', sans-serif;"> + + <!-- Page Wrapper --> + <div id="wrapper"> + + <!-- Sidebar --> + <ul class="navbar-nav bg-gradient-primary sidebar sidebar-dark accordion" id="accordionSidebar"> + + <!-- Sidebar - Brand --> + <a class="sidebar-brand d-flex align-items-center justify-content-center" href="{% url 'daftar_katalog' %}"> + <div class="sidebar-brand-icon rotate-n-15"> + </div> + <div class="sidebar-brand-text mx-3">Digipus</div> + </a> + + <!-- Divider --> + <hr class="sidebar-divider my-0"> + + <!-- Nav Item - Dashboard --> + <li class="nav-item"> + <a class="nav-link" href="/administration/"> + <span>Verifikasi Materi</span></a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/administration/daftar-kontributor/"> + <span>Daftar Kontributor</span></a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="#"> + <span>Statistik Materi</span></a> + </li> + + <!-- Divider --> + <hr class="sidebar-divider"> + + <li class="nav-item"> + <a class="nav-link" href="/administration/setting/verification/"> + <span>Pengaturan Verifikasi</span></a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/administration/setting/category/"> + <span>Pengaturan Kategori</span></a> + </li> + + </ul> + <!-- End of Sidebar --> + + <!-- Content Wrapper --> + <div id="content-wrapper" class="d-flex flex-column"> + + <!-- Main Content --> + <div id="content"> + + <!-- Topbar --> + <nav class="navbar navbar-expand navbar-light bg-white topbar mb-4 static-top shadow"> + + <!-- Sidebar Toggle (Topbar) --> + <button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3"> + <i class="fa fa-bars"></i> + </button> + + <div class="sidebar-brand-text mx-3">Diskominfo Kota Depok</div> + + <!-- Topbar Navbar --> + <ul class="navbar-nav ml-auto"> + + <div class="topbar-divider d-none d-sm-block"></div> + + <!-- Nav Item - User Information --> + <li class="nav-item dropdown no-arrow"> + <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" + aria-haspopup="true" aria-expanded="false"> + <span class="mr-2 d-none d-lg-inline text-gray-600 small">{{ user.name }}</span> + <img class="img-profile rounded-circle" src="{{ user.profile_picture.url }}"> + </a> + </li> + + </ul> + + </nav> + <!-- End of Topbar --> + + <!-- Begin Page Content --> + <div class="container-fluid"> + <div class="profile-content white-text"> + <div> + <img src="{{ user.profile_picture.url }}" alt="Photo" class="img-thumbnail"></img> + <div class="profile-margin"></div> + <h2>{{ user.name }}</h2> + <h4>{{ user.email }}</h4> + <h4>{{ user.biography }}</h4> + <div class="profile-margin"></div> + <table> + <tr> + <td class="profile-data">Instansi</td> + <td>{{ user.instansi }}</td> + </tr> + + <td class="profile-data">LinkedIn</td> + <td><a href="https://linkedin.com">{{ user.linkedin }}</a></td> + </tr> + + <tr> + <td class="profile-data">Facebook</td> + <td><a href="https://facebook.com">{{ user.facebook }}</a></td> + </tr> + + <tr> + <td class="profile-data">Twitter</td> + <td><a href="https://twitter.com">{{ user.twitter }}</a></td> + </tr> + + <tr> + <td class="profile-data">Instagram</td> + <td><a href="https://instagram.com">{{ user.instagram }}</a></td> + </tr> + </table> + <a class="btn btn-primary btn-admin" href="/administration/daftar-kontributor/">Kembali ke Daftar Kontributor</a> + </div> + </div> + + </div> + <!-- /.container-fluid --> + + </div> + <!-- End of Main Content --> + + <!-- Footer --> + <footer class="sticky-footer bg-white"> + <div class="container my-auto"> + <div class="copyright text-center my-auto"> + <span>Copyright © Diskominfo Kota Depok 2020</span> + </div> + </div> + </footer> + <!-- End of Footer --> + + </div> + <!-- End of Content Wrapper --> + + </div> + <!-- End of Page Wrapper --> + + <!-- Scroll to Top Button--> + <a class="scroll-to-top rounded" href="#page-top"> + <i class="fas fa-angle-up"></i> + </a> + + <!-- Bootstrap core JavaScript--> + <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" + integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" + crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" + integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" + crossorigin="anonymous"></script> + <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" + integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" + crossorigin="anonymous"></script> + + <!-- Core plugin JavaScript--> + <script src="https://code.jquery.com/jquery-3.5.0.min.js" + integrity="sha256-xNzN2a4ltkB44Mc/Jz3pT4iU1cmeR0FkXs4pru/JxaQ=" crossorigin="anonymous"></script> + + <!-- Custom scripts for all pages--> + <script src="{% static 'js/sb-admin-2.min.js' %}"></script> + + <!-- Page level plugins --> + <script src="{% static 'vendor/datatables/jquery.dataTables.min.js' %}"></script> + <script src="{% static 'vendor/datatables/dataTables.bootstrap4.min.js' %}"></script> + + <!-- Page level custom scripts --> + <script src="{% static 'js/demo/datatables-demo.js' %}"></script> + +</body> + +</html> \ No newline at end of file diff --git a/administration/templates/verif.html b/administration/templates/verif.html index 3168195c19a56ee829926b973fed4c7516fa10aa..27b0c2bcd8eef84614657e5877f89d69c8b25b68 100644 --- a/administration/templates/verif.html +++ b/administration/templates/verif.html @@ -50,7 +50,7 @@ </li> <li class="nav-item"> - <a class="nav-link" href="index.html"> + <a class="nav-link" href="/administration/daftar-kontributor/"> <span>Daftar Kontributor</span></a> </li> @@ -124,7 +124,7 @@ <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="mr-2 d-none d-lg-inline text-gray-600 small">Admin</span> - <img class="img-profile rounded-circle" src="https://source.unsplash.com/QAB-WJcbgJk/60x60" alt="User profile picture"> + <img class="img-profile rounded-circle" src="{{ user.profile_picture.url }}" alt="User profile picture"> </a> </li> diff --git a/administration/tests.py b/administration/tests.py index c0db824f2d99ebb9d86eca961bb143a4b6521e54..ca934429445f0c26dd7f674c3475427a597e2a98 100644 --- a/administration/tests.py +++ b/administration/tests.py @@ -173,7 +173,6 @@ class DetailVerifikasiMateriTest(TestCase): response = self.client.get(self.url_materi_1) self.assertEqual(response.status_code, 403) - def test_verification_detail_approve(self): # Login self.client.login(**self.admin_credential) @@ -210,7 +209,6 @@ class DetailVerifikasiMateriTest(TestCase): # Logout self.client.logout() - def test_verification_detail_disapprove(self): # Login self.client.login(**self.admin_credential) @@ -501,3 +499,112 @@ class SettingCategoriTest(TestCase): self.assertNotIn('Deskripsi Kategori 1', el) # Logout self.client.logout() + +class ContributorListTest(TestCase ): + def setUp(self): + self.client = Client() + self.url = '/administration/daftar-kontributor/' + self.admin_credential = { + "email": "admin@gov.id", + "password": id_generator() + } + self.contributor_credential = { + "email": "kontributor@gov.id", + "password": id_generator() + } + self.admin = get_user_model().objects.create_user( + **self.admin_credential, name="Admin", is_admin=True) + self.contributor = get_user_model().objects.create_user( + **self.contributor_credential, name="Kontributor", is_contributor=True + ) + self.cover = SimpleUploadedFile( + "cover.jpg", + b"Test file" + ) + self.content = SimpleUploadedFile( + "content.txt", + b"Test file" + ) + Materi(title="Materi 1", author="Agas", uploader=self.contributor, + publisher="Kelas SC", descriptions="Deskripsi Materi 1", + status="PENDING", cover=self.cover, content=self.content, feedback="").save() + self.materi1 = Materi.objects.first() + + def test_contributor_list_access(self): + # Login + self.client.login(**self.admin_credential) + # Test + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + # Logout + self.client.logout() + + def test_contributor_list_contributor_access(self): + # Login + self.client.login(**self.contributor_credential) + # Test + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + # Logout + self.client.logout() + + def test_contributor_list_anonymous_access(self): + # Test + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + + def test_contributor_list_using_correct_template(self): + # Login + self.client.login(**self.admin_credential) + found = resolve(self.url) + self.assertEqual(found.func.__name__, views.ContributorListView.__name__) + + def test_contributor_list_title(self): + # Login + self.client.login(**self.admin_credential) + response = self.client.get(self.url) + + self.assertContains(response, 'Dasbor Kontributor') + + self.assertNotContains(response, 'Fake Title') + +class ProfileContributorAdminTest(TestCase): + def setUp(self): + self.client = Client() + self.url = '/administration/profil/1/' + self.admin_credential = { + "email": "admin@gov.id", + "password": id_generator() + } + self.contributor_credential = { + "email": "kontributor@gov.id", + "password": id_generator() + } + self.admin = get_user_model().objects.create_user( + **self.admin_credential, name="Admin", is_admin=True) + self.contributor = get_user_model().objects.create_user( + **self.contributor_credential, name="Kontributor", is_contributor=True + ) + self.cover = SimpleUploadedFile( + "cover.jpg", + b"Test file" + ) + self.content = SimpleUploadedFile( + "content.txt", + b"Test file" + ) + Materi(title="Materi 1", author="Agas", uploader=self.contributor, + publisher="Kelas SC", descriptions="Deskripsi Materi 1", + status="PENDING", cover=self.cover, content=self.content, feedback="").save() + self.materi1 = Materi.objects.first() + + def test_profile_contributor_admin_anonymous_access(self): + # Test + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + + def test_profile_contributor_admin_using_correct_template(self): + # Login + self.client.login(**self.admin_credential) + found = resolve(self.url) + self.assertEqual(found.func.__name__, views.ProfileContributorAdminView.__name__) \ No newline at end of file diff --git a/administration/urls.py b/administration/urls.py index 448e912263bc91f445a9968a112a7fe5ffd38bf8..aca44aa93941c89a41d6ac3d5b89275550172713 100644 --- a/administration/urls.py +++ b/administration/urls.py @@ -9,4 +9,6 @@ urlpatterns = [ path("detail-verif/<int:pk>/", views.DetailVerificationView.as_view()), path("setting/verification/", views.VerificationSettingView.as_view()), path("setting/category/", views.CategorySettingView.as_view()), + path("daftar-kontributor/", views.ContributorListView.as_view()), + path("profil/<int:pk>/", views.ProfileContributorAdminView.as_view()), ] diff --git a/administration/views.py b/administration/views.py index 6a11b59bcb40beed5b5ece1e69601c345d19a4ac..4f580376f4f8f291eaf88af753717d20fdf39930 100644 --- a/administration/views.py +++ b/administration/views.py @@ -4,6 +4,7 @@ from django.shortcuts import get_object_or_404, render from django.views.generic import TemplateView from app.models import Category, Materi +from authentication.models import User from .forms import CategoryForm, VerificationSettingForm from .models import VerificationSetting, VerificationReport @@ -154,3 +155,38 @@ class CategorySettingView(TemplateView): context = self.get_context_data(**kwargs) context["form"] = form return self.render_to_response(context) + +class ContributorListView(TemplateView): + template_name = "daftar_kontributor.html" + + def dispatch(self, request, *args, **kwargs): + if not request.user.is_authenticated or not request.user.is_admin: + raise PermissionDenied(request) + + return super(ContributorListView, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(ContributorListView, self).get_context_data(**kwargs) + context["users"] = User.objects.filter(is_contributor=True) + return context + + def get(self, request, *args, **kwargs): + context = self.get_context_data(**kwargs) + return self.render_to_response(context) + +class ProfileContributorAdminView(TemplateView): + template_name = "detail_kontri_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(ProfileContributorAdminView, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + return super().get_context_data(**kwargs) + + def get(self, request, *args, **kwargs): + context = self.get_context_data(**kwargs) + context["user"] = get_object_or_404(User, pk=kwargs["pk"]) + return self.render_to_response(context=context) \ No newline at end of file diff --git a/app/migrations/0021_auto_20200507_1936.py b/app/migrations/0021_auto_20200507_1936.py new file mode 100644 index 0000000000000000000000000000000000000000..107e6ba1c409fd72f36146c6a8c3a10d2285b5b6 --- /dev/null +++ b/app/migrations/0021_auto_20200507_1936.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.3 on 2020-05-07 12:36 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0020_auto_20200506_2309'), + ] + + operations = [ + migrations.AddField( + model_name='materi', + name='pages', + field=models.IntegerField(default=0), + ), + migrations.AlterField( + model_name='comment', + name='profile', + field=models.CharField(default='93572f', max_length=100), + ), + ] diff --git a/app/models.py b/app/models.py index 5d59162f7b3b21c28168bfb89934cdf628d52872..4171ba423dab8083072baeb48fa3067c44e9133a 100644 --- a/app/models.py +++ b/app/models.py @@ -31,6 +31,7 @@ class Materi(models.Model): # ubah jadi one to one ke kontributor uploader = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) publisher = models.CharField(max_length=30, default="publiser") + pages = models.IntegerField(default=0) descriptions = models.TextField(default="descriptions") status = models.CharField( max_length=30, choices=VERIFICATION_STATUS, default=VERIFICATION_STATUS[0][0]) diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html index 2e99f5e020ece2883d1d0c0b70233e61b2f12339..30f64a18e698195d2056474e5fe97db3e866d968 100644 --- a/app/templates/dashboard.html +++ b/app/templates/dashboard.html @@ -147,7 +147,7 @@ <td>{{materi.author}}</td> <td>{{materi.status}}</td> <td class="verif-buttons"> - <a href="/dashboard/detail-materi/{{materi.id}}/" class="accept-button" + <a href="/materi/{{materi.id}}/" class="accept-button" style="background-color:#4e73df">Detail </a> </td> diff --git a/app/templates/detail_materi_kontributor.html b/app/templates/detail_materi_kontributor.html deleted file mode 100644 index 3944a9e1d985a8978972e53190e5920df8a36399..0000000000000000000000000000000000000000 --- a/app/templates/detail_materi_kontributor.html +++ /dev/null @@ -1,110 +0,0 @@ -{% extends 'base.html' %} -{% load static %} - -{% block header %} -<link rel="stylesheet" type="text/css" href="{% static 'app/css/detail_materi.css' %}"> -<link href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,400;0,500;1,100&display=swap" rel="stylesheet"> -{% endblock header %} - -{% block title %} -Materi -{% endblock title %} - -{% block content %} - {% block verification %} {% endblock verification %} - <div class="container"> - <div class="row materi-data"> - <div class="col col-3 cover"> - <img src={{materi_data.cover.url}} alt="cover"> - </div> - <div class="col col-6 ml-3 book"> - <h2>{{materi_data.title}}</h2> - <div class="category-wrapper"> - {% for category in materi_data.categories.all %} - <span class="mr-1">#{{category.name}}</span> - {% endfor %} - </div> - <div class="info-wrapper"> - <div class="info" id="1"> - <dt class="col col-4"> - <p class="info-name">Penulis</p> - </dt> - <dd> - <p class="info-content">{{materi_data.author}}</p> - </dd> - </div> - <div class="info" id="1"> - <dt class="col col-4"> - <p class="info-name">Penerbit</p> - </dt> - <dd> - <p class="info-content">{{materi_data.publisher}}</p> - </dd> - </div> - <div class="info" id="1"> - <dt class="col col-4"> - <p class="info-name">Jumlah Halaman</p> - </dt> - <dd> - <p class="info-content">{{materi_data.author}}</p> - </dd> - </div> - <div class="info" id="1"> - <dt class="col col-4"> - <p class="info-name">Ukuran File</p> - </dt> - <dd> - <p class="info-content">{{materi_data.content.size|filesizeformat}}</p> - </dd> - </div> - </div> - <a href="{% url 'view-materi' materi_data.id %}" class="btn btn-link btn-book shadow-sm p-2 mb-1 bg-white rounded">Baca</a> - <a href="{% url 'download-materi' materi_data.id %}" class="btn btn-link btn-book shadow-sm p-2 mb-1 bg-white rounded">Unduh</a> - <button class="btn btn-link btn-book shadow-sm p-2 mb-1 bg-white rounded">Bagikan</button> - </div> - </div> - <div class="row menu-wrapper"> - <nav class="navbar navbar-expand-sm"> - <ul class="navbar-nav"> - <li class="nav-item"> - <a class="nav-link" href="#section1">Deskripsi</a> - </li> - <li class="nav-item"> - <a class="nav-link" href="#section2">Komentar</a> - </li> - </ul> - </nav> - <div id="section1" class="container-fluid description-wrapper"> - <h1>Deskripsi</h1> - <div class="col col-8 description"> - <p>{{materi_data.descriptions}}</p> - </div> - </div> - <div id="section2" class="container-fluid comments-wrapper"> - <h1>Komentar</h1> - <div class="add-comments col col-8 "> - <form> - <div class="form-group"> - <textarea placeholder="komentar..." - class="form-control mb-2" - id="exampleFormControlTextarea1" - rows="3"> - </textarea> - <button type="submit" class="btn btn-book shadow-sm p-2 mb-1 bg-white rounded">Confirm identity</button> - </div> - </form> - - </div> - {% for comment in materi_data.comments.all %} - <div class="col col-8 comment shadow-sm p-3 mb-1 bg-white rounded"> - <div class="user"> - <span class="profile"></span> - <p><b>{{comment.user}}</b></p> - </div> - <p class="text">{{comment.comment}}</p> - </div> - {% endfor %} - </div> - </div> - </div> -{% endblock content %} diff --git a/app/templates/sunting.html b/app/templates/sunting.html index e0e6b93a774c44aa42e741c15797326f19189ecb..d8db0deea87268f848c1b486f9efdb306ff73cec 100644 --- a/app/templates/sunting.html +++ b/app/templates/sunting.html @@ -127,7 +127,7 @@ <div class="form-margin"></div> <div class="col-md-6"> <div class="fieldWrapper"> - <button type="submit" class="btn btn-success" style="background-color: #615CFD; border-color: #615CFD;">Simpan</button> + <button type="submit" class="btn btn-success btn-edit" style="background-color: #615CFD; border-color: #615CFD;">Simpan</button> </div> </div> </form> diff --git a/app/tests.py b/app/tests.py index cba29645f410db8701af8aecaf6c3f30f0975cd7..3686e80d1cff933cad1dc937337a4ffeb20bd618 100644 --- a/app/tests.py +++ b/app/tests.py @@ -8,7 +8,7 @@ from django.urls import resolve from authentication.models import User from django.contrib.auth import get_user_model from django.core.files import File -from .views import DaftarKatalog, DetailMateri, DashboardKontributorView, ProfilKontributorView, SuntingProfilView, DetailMateriKontributorView +from .views import DaftarKatalog, DetailMateri, DashboardKontributorView, ProfilKontributorView, SuntingProfilView from .models import Materi, Category, Comment from app.views import UploadMateriHTML, UploadMateriView @@ -393,27 +393,4 @@ class SuntingProfilTest(TestCase): response = self.client.get(self.url) self.assertEqual(response.status_code, 200) # Logout - self.client.logout() - -class DetailMateriKontributorTest(TestCase): - def test_detail_materi_using_detail_materi_func(self): - found = resolve("/dashboard/detail-materi/3/") - self.assertEqual(found.func.__name__, DetailMateriKontributorView.as_view().__name__) - - def test_category_models_can_create_new_object(self): - test = Category.objects.create( - id="1", name="medis", description="kategori medis") - countData = Category.objects.all().count() - self.assertEqual(1, countData) - self.assertNotEqual(0, countData) - self.assertEqual(test.__str__(), "medis") - self.assertNotEqual(test.__str__(), "saul") - - def test_comment_models_can_create_new_object(self): - test = Comment.objects.create( - user="saul", profile="121212", comment="232323") - countData = Comment.objects.all().count() - self.assertEqual(1, countData) - self.assertNotEqual(0, countData) - self.assertEqual(test.__str__(), "saul") - self.assertNotEqual(test.__str__(), "userlain") + self.client.logout() \ No newline at end of file diff --git a/app/urls.py b/app/urls.py index 73751c3be3c535feff8bc28c32885fa7a2965c02..6a239cfae8e907543c0a84d80ef31b47362c3934 100644 --- a/app/urls.py +++ b/app/urls.py @@ -1,7 +1,7 @@ from django.urls import path, re_path from app import views -from app.views import UploadMateriHTML, DashboardKontributorView, UploadMateriView, ProfilKontributorView, SuntingProfilView, DetailMateriKontributorView +from app.views import UploadMateriHTML, DashboardKontributorView, UploadMateriView, ProfilKontributorView, SuntingProfilView urlpatterns = [ path("", views.DaftarKatalog.as_view(), name="daftar_katalog"), @@ -10,7 +10,6 @@ urlpatterns = [ path("materi/<int:pk>/unduh", views.download_materi, name="download-materi"), path("materi/<int:pk>/view", views.view_materi, name="view-materi"), path("dashboard/", DashboardKontributorView.as_view(), name="dashboard"), - path("dashboard/detail-materi/<int:pk>/", views.DetailMateriKontributorView.as_view()), path("unggah/", UploadMateriView.as_view(), name="unggah"), path("profil/", ProfilKontributorView.as_view(), name="profil"), path("sunting/", SuntingProfilView.as_view(), name="sunting"), diff --git a/app/views.py b/app/views.py index f4dedec679ed6ec364687078a9408359ec705151..0d7b3e75ae811e702cae2c551bcd6179aff45e9d 100644 --- a/app/views.py +++ b/app/views.py @@ -196,22 +196,6 @@ class DashboardKontributorView(TemplateView): context["materi_list"] = materi_list return self.render_to_response(context) -class DetailMateriKontributorView(TemplateView): - template_name = "detail_materi_kontributor.html" - - def dispatch(self, request, *args, **kwargs): - if not request.user.is_contributor: - raise PermissionDenied(request) - return super(DetailMateriKontributorView, self).dispatch(request, *args, **kwargs) - - def get_context_data(self, **kwargs): - return super().get_context_data(**kwargs) - - def get(self, request, *args, **kwargs): - context = self.get_context_data(**kwargs) - context["materi_data"] = get_object_or_404(Materi, pk=kwargs["pk"]) - return self.render_to_response(context) - class ProfilKontributorView(TemplateView): template_name = "profil.html" @@ -248,23 +232,17 @@ class SuntingProfilView(TemplateView): current_user = self.request.user context["user"] = current_user - context["form"] = SuntingProfilForm() + 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) - form = SuntingProfilForm(request.POST, request.FILES) + current_user = self.request.user + form = SuntingProfilForm(request.POST, request.FILES, instance=current_user) if form.is_valid(): - current_user = request.user - current_user.profile_picture = request.FILES["profile_picture"] - current_user.linkedin = request.POST["linkedin"] - current_user.facebook = request.POST["facebook"] - current_user.twitter = request.POST["twitter"] - current_user.instagram = request.POST["instagram"] - current_user.biography = request.POST["biography"] - current_user.save() + form.save() return HttpResponseRedirect("/profil/") else: context = self.get_context_data(**kwargs) diff --git a/staticfiles/css/button.css b/staticfiles/css/button.css index daef6c66c5c78c327379464cc1bec9d5bb6e344f..f5159238c7d272ef490c579f40b1881e217985f9 100755 --- a/staticfiles/css/button.css +++ b/staticfiles/css/button.css @@ -9,6 +9,7 @@ box-shadow: 2px; color: white; margin-right: 5px; + padding: 0 5px; } .reject-button { @@ -67,10 +68,18 @@ } .form-margin { - margin: 20px; + margin-top: 20px; } .profile-data { font-size: 25px; padding-right: 50px; +} + +.btn-edit { + margin-bottom: 15px; +} + +.btn-admin { + margin-top: 20px; } \ No newline at end of file