diff --git a/administration/forms.py b/administration/forms.py index 4d6da0c5e20705a6e5945754cc04eb17b81b8196..3c350d456e8a335027f923edb5c008e01af802bc 100644 --- a/administration/forms.py +++ b/administration/forms.py @@ -146,3 +146,15 @@ class EditAdminStatusForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(EditAdminStatusForm, self).__init__(*args, **kwargs) + + +class EditKontributorStatusForm(forms.ModelForm): + + is_active = forms.BooleanField(required=False) + + class Meta: + model = User + fields = ["is_active"] + + def __init__(self, *args, **kwargs): + super(EditKontributorStatusForm, self).__init__(*args, **kwargs) diff --git a/administration/templates/edit_kontributor.html b/administration/templates/edit_kontributor.html new file mode 100644 index 0000000000000000000000000000000000000000..47e16ef164f42dc12bc70358741ae0ca3a566c9d --- /dev/null +++ b/administration/templates/edit_kontributor.html @@ -0,0 +1,27 @@ +{% extends 'administration/base_administrasi.html' %} +{% load static %} + +{% block content %} +<div class="card shadow mb-4"> + <div class="card-header py-3"> + <h6 class="m-0 font-weight-bold text-primary"> + Edit {{ page_title }} + </h6> + </div> + <div class="card-body"> + <form method="POST"> + {% csrf_token %} + {{ item.name }} + <div class="status d-flex align-items-baseline"> + {{ form.is_active }} <br> Active + </div> + <div class=""> + <button class="btn-sm btn-primary rounded p-12" type="submit"> + <i class="far fa-save" aria-hidden="true"></i> + Simpan + </button> + </div> + </form> + </div> +</div> +{% endblock %} \ No newline at end of file diff --git a/administration/templates/kelola_kontributor.html b/administration/templates/kelola_kontributor.html index 21b94fc5bc769c604ed0e78dddcc854b05f8dc8b..9fee87a117739e6a0c9b1c6f06b6976a87d7a621 100644 --- a/administration/templates/kelola_kontributor.html +++ b/administration/templates/kelola_kontributor.html @@ -23,6 +23,7 @@ <th scope="col">Nama</th> <th scope="col">NIK</th> <th scope="col">Instansi</th> + <th scope="col">Status</th> <th scope="col">Detail</th> </tr> </thead> @@ -31,6 +32,7 @@ <th scope="col">Nama</th> <th scope="col">NIK</th> <th scope="col">Instansi</th> + <th scope="col">Status</th> <th scope="col">Detail</th> </tr> </tr> @@ -41,8 +43,10 @@ <td>{{ user.name }}</td> <td>{{ user.nik }}</td> <td>{{ user.instansi }}</td> + <td>{% if user.is_active %} Active {% else %} Inactive {% endif %}</td> <td class="verif-buttons"> <span> + <a href="/administration/setting/kontributor/{{ user.id }}/edit" class="accept-button button-decoration" role="button">Edit</a> <a href="/administration/profil/{{ user.id }}/" class="accept-button button-decoration">Detail</a> <button type="button" class="reject-button button-decoration" data-toggle="modal" data-target="#confirmModal{{ user.id }}">Hapus</button> <div class="modal fade" id="confirmModal{{ user.id }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> diff --git a/administration/tests.py b/administration/tests.py index eedbf4c10ca54a788845f82f760fad8496430c14..6ba9e50b788c568dd4ce4661922f25283005647b 100644 --- a/administration/tests.py +++ b/administration/tests.py @@ -5,7 +5,7 @@ from django.urls import resolve from administration import models, views from administration.utils import id_generator -from administration.forms import EditAdminStatusForm +from administration.forms import EditAdminStatusForm, EditKontributorStatusForm from app.models import Category, Materi, LaporanMateri from authentication.models import User from bs4 import BeautifulSoup @@ -1577,3 +1577,85 @@ class RejectReportTest(TestCase): response = self.client.get(self.url + '100/') self.assertEqual(response.status_code, 404) self.client.logout() + + +class EditKontributorStatusFormTests(TestCase): + def test_set_active_admin(self): + form = EditKontributorStatusForm(data={"is_active": True}) + + self.assertEqual(form.is_valid(), True) + + def test_set_inactive_admin(self): + form = EditKontributorStatusForm(data={"is_active": False}) + + self.assertEqual(form.is_valid(), True) + +class EditKontributorStatusTests(TestCase): + + def setUp(self): + self.client = Client() + self.kontrib_credential = { + "email": "kontrib@gov.id", + "password": id_generator() + } + self.admin_credential = { + "email": "admin@gov.id", + "password": id_generator() + } + self.kontrib = get_user_model().objects.create_user( + **self.kontrib_credential, name="Kontributor", is_contributor=True) + self.admin = get_user_model().objects.create_user( + **self.admin_credential, name="Admin", is_admin=True) + + self.dummy_kontributor = User(name='dummy_kontributor', is_contributor=True, email="dummy_kontributor@example.com") + self.dummy_kontributor.save() + + self.dummy_admin = User(name='dummy_admin', is_admin=True, email="dummy_admin@example.com") + self.dummy_admin.save() + + self.edit_url_dummy_admin = self.url_generator_edit_kontributor(self.dummy_admin.id) + self.edit_url_dummy_kontributor = self.url_generator_edit_kontributor(self.dummy_kontributor.id) + + def url_generator_edit_kontributor(self, id): + return "/administration/setting/kontributor/" + str(id) + EDIT_ENDPOINT + + + def test_get_edit_kontributor_html_content(self): + self.client.login(**self.admin_credential) + response = self.client.get(self.edit_url_dummy_kontributor) + self.assertContains(response, self.dummy_kontributor.name) + + def test_cannot_edit_set_active_admin_as_admin(self): + self.client.login(**self.admin_credential) + self.client.get(self.edit_url_dummy_admin) + response = self.client.post(self.edit_url_dummy_admin, {"is_active": "on"}) + self.assertEqual(response.status_code, 403) + + def test_edit_set_active_kontributor_as_admin(self): + self.dummy_kontributor.is_active = False + self.client.login(**self.admin_credential) + self.client.get(self.edit_url_dummy_kontributor) + response = self.client.post(self.edit_url_dummy_kontributor, {"is_active": "on"}) + self.dummy_kontributor.refresh_from_db() + + self.assertEqual(response.status_code, 302) + self.assertEqual(self.dummy_kontributor.is_active, True) + + + def test_edit_set_inactive_kontributor_as_admin(self): + self.dummy_kontributor.is_active = True + self.client.login(**self.admin_credential) + self.client.get(self.edit_url_dummy_kontributor) + response = self.client.post(self.edit_url_dummy_kontributor, {"is_active": "false"}) + self.dummy_kontributor.refresh_from_db() + + self.assertEqual(response.status_code, 302) + self.assertEqual(self.dummy_kontributor.is_active, False) + + def test_cannot_access_edit_page_as_user(self): + self.client.login(**self.kontrib_credential) + response = self.client.get(self.edit_url_dummy_admin) + + self.assertEqual(response.status_code, 403) + + diff --git a/administration/urls.py b/administration/urls.py index 22ba7a66b15ddab39b4e480104eb97d9f11fe12d..339e4d590476ead7397f0bc246060d0f690b0af2 100644 --- a/administration/urls.py +++ b/administration/urls.py @@ -9,6 +9,7 @@ from administration.views import VerificationView, DetailVerificationView, \ delete_verification, StatisticsView, \ StatisticApiView, EditCategoryView, \ EditAdminStatusView, delete_category, \ + EditKontributorStatusView, \ generatedummy, KelolaMateriView, \ LaporanMateriView, LaporanMateriDetailView, \ tolak_laporan, blok_materi @@ -35,6 +36,8 @@ urlpatterns = [ path("kelola-admin/tambah/", RegistrasiAdminView.as_view()), path("setting/admin/<int:pk>/edit", EditAdminStatusView.as_view(), name="edit-admin-status"), + path("setting/kontributor/<int:pk>/edit", + EditKontributorStatusView.as_view(), name="edit-admin-status"), path("hapus-admin/<int:pk>/", delete_admin), path("hapus-kontributor/<int:pk>/", delete_contributor), path("kelola-materi/", KelolaMateriView.as_view()), diff --git a/administration/views.py b/administration/views.py index 8c96ead8fc43209b0e2db647ddb6aa483667d1f2..65519deb8353157a6cce53d405d1936f1c78dc72 100644 --- a/administration/views.py +++ b/administration/views.py @@ -7,7 +7,7 @@ from django.views.generic import TemplateView, View from django.contrib import messages from django.utils import timezone from administration.models import VerificationReport, VerificationSetting, DeletionHistory -from administration.forms import CategoryForm, VerificationSettingForm, RegistrasiAdminForm, PeriodForm, EditAdminStatusForm +from administration.forms import CategoryForm, VerificationSettingForm, RegistrasiAdminForm, PeriodForm, EditAdminStatusForm, EditKontributorStatusForm from administration.services import StatisticService, DetailVerificationService, LaporanMateriService from app.models import Category, Materi, ViewStatistics, DownloadStatistics, Comment, Like, LaporanMateri from authentication.models import User @@ -417,6 +417,36 @@ class EditAdminStatusView(TemplateView): form.save() return HttpResponseRedirect(ADMINISTRATION_MANAGEMENT) + +class EditKontributorStatusView(TemplateView): + template_name = "edit_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(EditKontributorStatusView, self).dispatch(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(EditKontributorStatusView, self).get_context_data(**kwargs) + context["page_title"] = "Admin Status" + context["item"] = User.objects.get(id=kwargs["pk"]) + context["form"] = EditKontributorStatusForm(instance=context["item"]) + return context + + def get(self, request, *args, **kwargs): + context = self.get_context_data(**kwargs) + return self.render_to_response(context=context) + + def post(self, request, *args, **kwargs): + user_object = self.get_context_data(**kwargs)["item"] + if not user_object.is_contributor: + raise PermissionDenied(request) + form = EditKontributorStatusForm( + request.POST, instance=user_object) + form.save() + return HttpResponseRedirect('/administration/kelola-kontributor/') + + def delete_admin(request, *args, **kwargs): if not request.user.is_authenticated or not request.user.is_admin: raise PermissionDenied(request) @@ -457,7 +487,7 @@ def delete_verification(request, *args, **kwargs): pk=kwargs["pk_verification"]) queryObject.archived = True queryObject.description = "Telah dihapus pada " + \ - str(datetime.now().strftime("%m/%d/%Y, %H:%M:%S")) + " WIB" + str(timezone.now().strftime("%m/%d/%Y, %H:%M:%S")) + " WIB" queryObject.archived_by = request.user queryObject.save() messages.success(request, "Point verifikasi berhasil dihapus") @@ -473,7 +503,7 @@ def delete_category(request, *args, **kwargs): pk=kwargs["pk_category"]) queryObject.archived = True queryObject.description = "Telah dihapus pada " + \ - str(datetime.now().strftime("%m/%d/%Y, %H:%M:%S")) + " WIB" + str(timezone.now().strftime("%m/%d/%Y, %H:%M:%S")) + " WIB" queryObject.archived_by = request.user queryObject.save() messages.success(request, "Kategori " + diff --git a/register/services.py b/register/services.py index 5786c9a6bd1abbefbeb0ca27adf666404e2e734f..603855b114790a85861dc06a4200f2c777256cd9 100644 --- a/register/services.py +++ b/register/services.py @@ -16,6 +16,7 @@ class RegistrationService: new_user.password = make_password(data["password"]) new_user.is_contributor = True + new_user.is_active = False new_user.save() create_result["user"] = new_user except ValidationError as e: diff --git a/register/templates/index.html b/register/templates/index.html index 97cf8e78bff9ce666a5a7aefb9b7fca817352812..59038d68afae38d6f70fe4e4d419237c5fcbe6ce 100644 --- a/register/templates/index.html +++ b/register/templates/index.html @@ -110,6 +110,11 @@ </div> </div> + + {% if message %} + <div class="text-success txt1" id="registrasi">{{ message }}</div> + <div class="txt1">Kembali ke <a href="/" class="txt1">halaman utama</a></div> + {% endif %} </form> <div class="login100-more" style="background-image: url('../static/images/bg-03.jpg'); z-index: 0;"> diff --git a/register/views.py b/register/views.py index 97c4e766c7c983141fc4ac3750fa88a43efeb28b..3d8112fef3563207ce1cdb5b294e6ff26c340acc 100644 --- a/register/views.py +++ b/register/views.py @@ -19,13 +19,14 @@ class index(TemplateView): form = UserForm(request.POST) if form.is_valid(): create_user_service = RegistrationService.create_new_contributor(data, form) + context = self.get_context_data(**kwargs) + if not create_user_service["success"]: - context = self.get_context_data(**kwargs) context["form"] = create_user_service["form"] return self.render_to_response(context) - login(request, create_user_service["user"]) - return HttpResponseRedirect("/sukses-kontributor/") + context["message"] = "Registrasi Berhasil. Mohon tunggu approval dari staf kami." + return self.render_to_response(context) else: context = self.get_context_data(**kwargs) context["form"] = form