diff --git a/administration/forms.py b/administration/forms.py index e00e85722ec07fec1517c4e4da6e898e35e46163..06d581b439e7a7a5aeeb9f8818ab08afa13a6c0b 100644 --- a/administration/forms.py +++ b/administration/forms.py @@ -26,16 +26,21 @@ class VerificationSettingForm(ModelForm): def __init__(self, *args, **kwargs): super(VerificationSettingForm, self).__init__(*args, **kwargs) for field_name, field in self.fields.items(): - field.widget.attrs["class"] = "widget-control" + field.widget.attrs["class"] = "widget-control mb-2 col col-md-8 col-lg-6 rounded-lg rounded-sm" + field.widget.attrs["placeholder"] = field_name + if field_name == "description": + field.widget.attrs["rows"] = "3" + class RegistrasiAdminForm(forms.ModelForm): password = forms.CharField(widget=forms.PasswordInput) password2 = forms.CharField(widget=forms.PasswordInput) + class Meta: model = User fields = ["name", "instansi", "nik", "alamat", "email", "nomor_telpon"] - + def __init__(self, *args, **kwargs): super(RegistrasiAdminForm, self).__init__(*args, **kwargs) for field_name, field in self.fields.items(): @@ -53,7 +58,7 @@ class RegistrasiAdminForm(forms.ModelForm): if password != password2: raise forms.ValidationError("Password tidak sama") return password - + def clean_email(self): email = self.cleaned_data.get("email") if not User.objects.filter(email=email).exists(): diff --git a/administration/templates/settings.html b/administration/templates/settings.html index 8fc294bf2a0a21848c4a18b431fe9380d855d03f..4cd62704a071afa06c279b137401ef137968d146 100644 --- a/administration/templates/settings.html +++ b/administration/templates/settings.html @@ -2,251 +2,347 @@ <!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 - {{ page_title }}</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 rel="icon" type="image/png" href="{% static 'images/icons/logo.ico' %}" /> - <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="verif.html"> - <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="#"> - <span>Statistik Materi</span></a> - </li> - - <!-- Divider --> - <hr class="sidebar-divider my-0"> - - <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> - - <!-- Divider --> - <hr class="sidebar-divider my-0"> - - <li class="nav-item"> - <a class="nav-link" href="/administration/kelola-kontributor/"> - <span>Kelola Kontributor</span></a> - </li> - - <li class="nav-item"> - <a class="nav-link" href="/administration/kelola-admin/"> - <span>Kelola Admin</span></a> - </li> - - <!-- Divider --> - <hr class="sidebar-divider my-0"> - - </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" aria-hidden="true"></i> - </button> - - <div class="sidebar-brand-text mx-3">Diskominfo Kota Depok</div> - - <!-- Topbar Navbar --> - <ul class="navbar-nav ml-auto"> - - <!-- Nav Item - Search Dropdown (Visible Only XS) --> - <li class="nav-item"> - <a class="nav-link" href="/dashboard/"> - <span class="mr-2 d-none d-lg-inline text-gray-600 small">Administrasi</span> - </a> - </li> - - <li class="nav-item"> - <a class="nav-link" href="/profil-admin/"> - <span class="mr-2 d-none d-lg-inline text-gray-600 small">Profil</span> - </a> - </li> - - <li class="nav-item"> - <a class="nav-link" href="/logout/"> - <span class="mr-2 d-none d-lg-inline text-gray-600 small">Logout</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">Admin</span> - {% if not user.default_profile_picture %} - <img class="img-profile rounded-circle" src="https://i.ibb.co/9wgPzyZ/default-image.png" alt="User profile picture"> - {% else %} - <img class="img-profile rounded-circle" src="{{ user.profile_picture.url }}" alt="User profile picture"> - {% endif %} - </a> - </li> - - </ul> - - </nav> - <!-- End of Topbar --> - - <!-- Begin Page Content --> - <div class="container-fluid"> - - <div class="card shadow mb-4"> - <div class="card-header py-3"> - <h6 class="m-0 font-weight-bold text-primary">{{ page_title }} Baru</h6> - </div> - <div class="card-body"> - <form method="POST"> - {% csrf_token %} - <label>Judul :</label>{{ form.title }}<br> - <label>Deskripsi :</label>{{ form.description }}<br> - <br> - <div class="row"> - <button class="primary_btn save" style="border-radius:20px;" type="submit"><i class="far fa-save" aria-hidden="true"></i> - Simpan</button> - </div> - </form> - </div> - </div> - - <!-- DataTales Example --> - <div class="card shadow mb-4"> - <div class="card-header py-3"> - <h6 class="m-0 font-weight-bold text-primary" id="titleTabel">{{ page_title }}</h6> - </div> - <div class="card-body"> - <div class="table-responsive"> - <table class="table table-bordered" id="dataTable" aria-describedby="titleTabel"> - <thead> - <tr> - <th scope="col">Item</th> - <th scope="col">Deskripsi</th> - <th scope="col"></th> - </tr> - </thead> - <tbody> - {% for item in items %} - <tr> - <th>{{item.title}}</th> - <th>{{item.description}}</th> - <th> </th> - </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" aria-hidden="true"></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 + <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 - {{ page_title }}</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 + rel="icon" + type="image/png" + href="{% static 'images/icons/logo.ico' %}" + /> + <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="verif.html" + > + <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="#"> + <span>Statistik Materi</span></a + > + </li> + + <!-- Divider --> + <hr class="sidebar-divider my-0" /> + + <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> + + <!-- Divider --> + <hr class="sidebar-divider my-0" /> + + <li class="nav-item"> + <a + class="nav-link" + href="/administration/kelola-kontributor/" + > + <span>Kelola Kontributor</span></a + > + </li> + + <li class="nav-item"> + <a class="nav-link" href="/administration/kelola-admin/"> + <span>Kelola Admin</span></a + > + </li> + + <!-- Divider --> + <hr class="sidebar-divider my-0" /> + </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" aria-hidden="true"></i> + </button> + + <div class="sidebar-brand-text mx-3"> + Diskominfo Kota Depok + </div> + + <!-- Topbar Navbar --> + <ul class="navbar-nav ml-auto"> + <!-- Nav Item - Search Dropdown (Visible Only XS) --> + <li class="nav-item"> + <a class="nav-link" href="/dashboard/"> + <span + class="mr-2 d-none d-lg-inline text-gray-600 small" + >Administrasi</span + > + </a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/profil-admin/"> + <span + class="mr-2 d-none d-lg-inline text-gray-600 small" + >Profil</span + > + </a> + </li> + + <li class="nav-item"> + <a class="nav-link" href="/logout/"> + <span + class="mr-2 d-none d-lg-inline text-gray-600 small" + >Logout</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" + >Admin</span + > + {% if not user.default_profile_picture %} + <img + class="img-profile rounded-circle" + src="https://i.ibb.co/9wgPzyZ/default-image.png" + alt="User profile picture" + /> + {% else %} + <img + class="img-profile rounded-circle" + src="{{ user.profile_picture.url }}" + alt="User profile picture" + /> + {% endif %} + </a> + </li> + </ul> + </nav> + <!-- End of Topbar --> + + <!-- Begin Page Content --> + <div class="container-fluid"> + <div class="card shadow mb-4"> + <div class="card-header py-3"> + <h6 class="m-0 font-weight-bold text-primary"> + {{ page_title }} Baru + </h6> + </div> + <div class="card-body"> + <form method="POST"> + {% csrf_token %} + <p class="h5 mb-3 border-bottom"> + Tambah Point Verifikasi + </p> + <div + class="judul d-flex align-items-baseline" + > + {{ form.title }} + </div> + <div + class="description d-flex align-items-baseline" + > + {{ form.description }} + </div> + <div class=""> + <button + class="primary_btn save" + style="border-radius:20px;" + type="submit" + > + <i + class="far fa-save" + aria-hidden="true" + ></i> + Tambahkan + </button> + </div> + </form> + </div> + </div> + + <!-- DataTales Example --> + <div class="card shadow mb-4"> + <div class="card-header py-3"> + <h6 + class="m-0 font-weight-bold text-primary" + id="titleTabel" + > + {{ page_title }} + </h6> + </div> + <div class="card-body"> + <div class="table-responsive"> + <table + class="table table-bordered" + id="dataTable" + aria-describedby="titleTabel" + > + <thead> + <tr> + <th scope="col">Item</th> + <th scope="col">Deskripsi</th> + <th scope="col"></th> + </tr> + </thead> + <tbody> + {% for item in items %} + <tr> + <th>{{item.title}}</th> + <th>{{item.description}}</th> + <th class="verif-buttons"> + <a + href="/administration/verification/{{item.id}}/" + class="accept-button" + style="background-color:#4e73df" + >Edit</a + > + </th> + </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" aria-hidden="true"></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> diff --git a/administration/tests.py b/administration/tests.py index c13d1bcf6542b7aa866d0aebde5d71e5e34dea6c..df0e75d50b4f1bdbe8c486a3cde9fb3987b94a32 100644 --- a/administration/tests.py +++ b/administration/tests.py @@ -795,4 +795,40 @@ class RegistrasiAdminTest(TestCase): self.assertContains(response, 'Dasbor - Kelola Admin') - self.assertNotContains(response, 'Fake Title') \ No newline at end of file + self.assertNotContains(response, 'Fake Title') + +class EditVerificationTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_credential = { + "email": "admin@gov.id", + "password": id_generator() + } + self.admin = get_user_model().objects.create_user( + **self.admin_credential, name="Admin", is_admin=True) + models.VerificationSetting(title='test', description="desc test") + self.verification = models.VerificationSetting.objects.first() + self.url = '/administration/setting/verification/' + str(self.verification.id) + '/edit/' + + def test_edit_verification_admin_access(self): + self.client.login(**self.admin_credential) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertNotEqual(response.status_code, 404) + self.assertNotEqual(response.status_code, 403) + + def test_verification_detail_anonymous_access(self): + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + self.assertNotEqual(response.status_code, 200) + + def test_verifikasi_materi_using_correct_template(self): + self.client.login(**self.admin_credential) + found = resolve(self.url) + self.assertEqual(found.func.__name__, views.EditVerificationView.__name__) + + def test_edit_verifikasi_item_content(self): + self.client.login(**self.admin_credential) + response = self.client.get(self.url) + self.assertContains(response, self.verification.title) + self.assertContains(response, self.verification.description) \ No newline at end of file diff --git a/administration/urls.py b/administration/urls.py index 97e8d0c073d1d17b4df750c9ac9393b0935dc5a7..481aa0a37c4d9b92840a58755adf3dea204f6c74 100644 --- a/administration/urls.py +++ b/administration/urls.py @@ -8,6 +8,7 @@ urlpatterns = [ path("", VerificationView.as_view()), path("detail-verif/<int:pk>/", DetailVerificationView.as_view()), path("setting/verification/", VerificationSettingView.as_view()), + path("setting/verification/<int:pk>/edit", VerificationSettingView.as_view()), path("setting/category/", CategorySettingView.as_view()), path("kelola-kontributor/", KelolaKontributorView.as_view()), path("profil/<int:pk>/", ProfileContributorAdminView.as_view()), diff --git a/administration/views.py b/administration/views.py index a85f2ccab9b754fd4b775692a9a40d107e05dc6c..64dd31415ae3d41f373319ae4f93a0e2e1f2983c 100644 --- a/administration/views.py +++ b/administration/views.py @@ -125,7 +125,6 @@ class VerificationSettingView(TemplateView): context["form"] = form return self.render_to_response(context) - class CategorySettingView(TemplateView): template_name = "settings.html"