diff --git a/administration/views.py b/administration/views.py index 87cef5829487c57d581a5dc9b51f202ae4d1694f..8f4c8158860895b3f47512630bf581a7a5fe427d 100644 --- a/administration/views.py +++ b/administration/views.py @@ -9,7 +9,7 @@ from django.utils import timezone from administration.models import VerificationReport, VerificationSetting, DeletionHistory 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 app.models import Category, Materi, ViewStatistics, DownloadStatistics, Comment, Like, LaporanMateri, AdminNotification from authentication.models import User from datetime import datetime @@ -87,6 +87,8 @@ class DetailVerificationView(TemplateView): def get(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) + if(request.user.is_admin): + AdminNotification.objects.filter(materi=context["materi_data"]).delete() return self.render_to_response(context=context) diff --git a/app/admin.py b/app/admin.py index 8c38f3f3dad51e4585f3984282c2a4bec5349c1e..333a094883a54391f866114ba0b3d146ae5d181b 100644 --- a/app/admin.py +++ b/app/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin +from .models import AdminNotification # Register your models here. +admin.site.register(AdminNotification) \ No newline at end of file diff --git a/app/migrations/0028_adminnotification.py b/app/migrations/0028_adminnotification.py new file mode 100644 index 0000000000000000000000000000000000000000..c50ac34f7e7c30fe27215374bd50cbc26aa45b04 --- /dev/null +++ b/app/migrations/0028_adminnotification.py @@ -0,0 +1,21 @@ +# Generated by Django 3.1 on 2020-10-31 14:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0027_readlater'), + ] + + operations = [ + migrations.CreateModel( + name='AdminNotification', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('materi', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.materi')), + ], + ), + ] diff --git a/app/models.py b/app/models.py index fc88ba2ece8bdb5371cb8c88ad93e1130f81d3cb..9af91f66cb8094baf9cce6cf2b4573a98cf3ac58 100644 --- a/app/models.py +++ b/app/models.py @@ -329,4 +329,7 @@ class ReadLater(models.Model): timestamp = models.DateTimeField(default=timezone.now) class Meta: - unique_together = ["materi", "user"] \ No newline at end of file + unique_together = ["materi", "user"] + +class AdminNotification(models.Model): + materi = models.ForeignKey(Materi, on_delete=models.CASCADE) diff --git a/app/services.py b/app/services.py index d5990d1504b661f9aa1b4c88383acf5da9c92438..57ffa31f66c27b3c71f9026a636b471406c62995 100644 --- a/app/services.py +++ b/app/services.py @@ -19,7 +19,7 @@ from pydrive.drive import GoogleDrive from app.forms import SuntingProfilForm from app.models import (Category, Comment, DislikeComment, DownloadStatistics, Like, LikeComment, Materi, Rating, ReadLater, - ViewStatistics) + ViewStatistics, AdminNotification) from app.utils.fileManagementUtil import (get_random_filename, remove_image_exifdata) @@ -353,6 +353,7 @@ class UploadMateriService: @staticmethod def upload_materi(form, materi): materi.save() + AdminNotification.objects.create(materi=materi) kateg = form.cleaned_data["categories"] for i in kateg: materi.categories.add(i) @@ -401,6 +402,7 @@ class UploadMateriService: os.path.join(settings.MEDIA_ROOT,default_cover)) materi.save() + AdminNotification.objects.create(materi=materi) for c in excel["Categories"][i].split(","): materi.categories.add(categories.get(name=c)) @@ -426,6 +428,7 @@ class RevisiMateriService: materi.uploader = request.user materi.status = "REVISION" materi.save() + AdminNotification.objects.create(materi=materi) kateg = form.cleaned_data["categories"] for i in kateg: materi.categories.add(i) diff --git a/app/templates/sukses_admin.html b/app/templates/sukses_admin.html index 40692fdb1abd598551b99f2a644c22352e9f63d1..b40fbd810a520ab9df96a05bbbb203c02a66419d 100644 --- a/app/templates/sukses_admin.html +++ b/app/templates/sukses_admin.html @@ -47,6 +47,23 @@ <span> <a class="btn btn-primary main-content" href="/administration/">Halaman Administrasi</a> </span> + <div class="profile-margin"></div> + {% if notifications%} + <h3>Materi Baru</h3> + {% endif %} + <table class="table main-content"> + <tbody> + {% for i in notifications %} + <tr> + <td> + <a href="/administration/detail-verif/{{i.materi.id}}"> + Materi {{i.materi.title}} butuh verifikasi + </a> + </td> + </tr> + {% endfor %} + </tbody> + </table> </div> </div> </div> diff --git a/app/tests.py b/app/tests.py index 49096574e4684a161bcac4e8641571ba50db887d..f4a69296061a2a3910b24337a24becc93df5ab11 100644 --- a/app/tests.py +++ b/app/tests.py @@ -45,7 +45,7 @@ from app.views import UploadMateriHTML, add_rating_materi from .models import (Category, Comment, DislikeComment, DownloadStatistics, Like, LikeComment, Materi, Rating, RatingContributor, - ReadLater, ReqMaterial, Review, ViewStatistics) + ReadLater, ReqMaterial, Review, ViewStatistics, AdminNotification) from .services import DetailMateriService from .views import (DaftarKatalog, DashboardKontributorView, DetailMateri, KatalogPerKontributorView, MateriFavorite, @@ -3947,7 +3947,6 @@ class MateriStatsTest(TestCase): jobj = json.loads(response.content) self.assertEqual(len(jobj['labels']), 6) - class UploadMateriTest(TestCase): def setUp(self): self.client = Client() @@ -3985,4 +3984,52 @@ class UploadMateriTest(TestCase): self.client.post("/unggah/", data=data) - self.assertEqual(Materi.objects.count(), 1) \ No newline at end of file + self.assertEqual(Materi.objects.count(), 1) + +class AdminNotificationTest(TestCase): + + def setUp(self): + self.client = Client() + self.contributor_credential = { + "email": "kontributor@gov.id", + "password": id_generator() + } + self.admin_credential = { + "email": "admin@gov.id", + "password": id_generator() + } + self.public_credential = { + "email": "public@gov.id", + "password": id_generator() + } + self.kontributor = User.objects.create_contributor(**self.contributor_credential) + self.admin = User.objects.create_admin(**self.admin_credential) + self.public = User.objects.create_user(**self.public_credential) + self.setUpImage() + self.content = SimpleUploadedFile("ExampleFile221.pdf", b"Test file") + self.category = Category.objects.create(id="1", name="medis", description="kategori medis") + + @override_settings(MEDIA_ROOT=tempfile.gettempdir()) + def setUpImage(self): + self.cover = InMemoryUploadedFile( + BytesIO(base64.b64decode(TEST_IMAGE)), + field_name='tempfile', + name='tempfile.png', + content_type='image/png', + size=len(TEST_IMAGE), + charset='utf-8', + ) + + def test_notification_admin(self): + self.client.login(**self.contributor_credential) + self.client.post( + "/unggah/", data={"title":"Materi 1", "author":"Agas", "publisher":"Kelas SC", "release_year":"2000", + "descriptions":"Deskripsi Materi 1", 'categories':"1", + "cover":self.cover, "content":self.content, + "yt_video_id":"jNwz4L9MGVY"} + ) + materi = Materi.objects.get(title="Materi 1") + self.assertTrue(AdminNotification.objects.get(materi=materi.id)) + + + diff --git a/app/views.py b/app/views.py index 18dc1f83a52254611a1978cb144e53b4f2cc8696..81c9693e1dff73a140ab1e31f490a6f0dd3a46ac 100644 --- a/app/views.py +++ b/app/views.py @@ -34,7 +34,8 @@ from app.models import ( ReqMaterial, Rating, RatingContributor, SubmitVisitor, - ReadLater + ReadLater, + AdminNotification ) from authentication.models import User from .services import DafterKatalogService, DetailMateriService, LikeDislikeService, MateriFieldValidationHelperService, \ @@ -593,6 +594,10 @@ class SuksesLoginKontributorView(TemplateView): class SuksesLoginAdminView(TemplateView): template_name = "sukses_admin.html" + def getAdminNotification(self): + notifications = AdminNotification.objects.all() + return notifications + def dispatch(self, request, *args, **kwargs): if not request.user.is_admin: raise PermissionDenied(request) @@ -608,8 +613,10 @@ class SuksesLoginAdminView(TemplateView): current_user = self.request.user context["user"] = current_user - return self.render_to_response(context) + notifications = self.getAdminNotification() + context["notifications"] = notifications + return self.render_to_response(context) class PostsView(TemplateView):