From 3726d3ea274fee7cfd03dbdb6c6f941dcbaef8c5 Mon Sep 17 00:00:00 2001 From: Inigo Ramli Date: Mon, 31 May 2021 11:48:05 +0700 Subject: [PATCH 1/2] Filter Log Aktivitas --- .../migrations/0009_auto_20210516_1918.py | 263 ++++++++++++++++- .../migrations/0014_auto_20210516_1918.py | 269 +++++++++++++++++- apps/cases/tests/test_units/test_models.py | 3 +- .../tests/test_units/test_serializers.py | 2 +- .../tests/test_units/test_exportables.py | 3 +- apps/exportables/utils.py | 2 +- apps/logs/serializers.py | 29 ++ apps/logs/tests/test_units/test_logs.py | 52 +++- apps/logs/views.py | 24 +- docker-compose.yml | 4 - 10 files changed, 628 insertions(+), 23 deletions(-) diff --git a/apps/accounts/migrations/0009_auto_20210516_1918.py b/apps/accounts/migrations/0009_auto_20210516_1918.py index f63d07a..15535c9 100644 --- a/apps/accounts/migrations/0009_auto_20210516_1918.py +++ b/apps/accounts/migrations/0009_auto_20210516_1918.py @@ -13,16 +13,273 @@ class Migration(migrations.Migration): migrations.AddField( model_name='accounthistory', name='last_modified_at', - field=models.DateTimeField(auto_now=True), + field=models.DateTimeField( + auto_now=True), ), migrations.AlterField( model_name='account', name='sub_district', - field=models.CharField(choices=[('Beji', 'Beji'), ('Beji Timur', 'Beji Timur'), ('Kemirimuka', 'Kemirimuka'), ('Kukusan', 'Kukusan'), ('Pondok Cina', 'Pondok Cina'), ('Tanah Baru', 'Tanah Baru'), ('Bojongsari Baru', 'Bojongsari Baru'), ('Bojongsari Lama', 'Bojongsari Lama'), ('Curug', 'Curug'), ('Duren Mekar', 'Duren Mekar'), ('Duren Seribu', 'Duren Seribu'), ('Pondok Petir', 'Pondok Petir'), ('Serua', 'Serua'), ('Cilodong', 'Cilodong'), ('Jatimulya', 'Jatimulya'), ('Kalibaru', 'Kalibaru'), ('Kalimulya', 'Kalimulya'), ('Sukamaju', 'Sukamaju'), ('Cisalak Pasar', 'Cisalak Pasar'), ('Curug', 'Curug'), ('Harjamukti', 'Harjamukti'), ('Mekarsari', 'Mekarsari'), ('Pasir Gunung Selatan', 'Pasir Gunung Selatan'), ('Tugu', 'Tugu'), ('Cinere', 'Cinere'), ('Gandul', 'Gandul'), ('Pangkalan Jati', 'Pangkalan Jati'), ('Pangkalan Jati Baru', 'Pangkalan Jati Baru'), ('Bojong Pondok Terong', 'Bojong Pondok Terong'), ('Cipayung', 'Cipayung'), ('Cipayung Jaya', 'Cipayung Jaya'), ('Pondok Jaya', 'Pondok Jaya'), ('Ratujaya', 'Ratujaya'), ('Grogol', 'Grogol'), ('Krukut', 'Krukut'), ('Limo', 'Limo'), ('Meruyung', 'Meruyung'), ('Depok Jaya', 'Depok'), ('Depok Jaya', 'Depok Jaya'), ('Mampang', 'Mampang'), ('Pancoran Mas', 'Pancoran Mas'), ('Rangkapan Jaya', 'Rangkapan Jaya'), ('Rangkapan Jaya Baru', 'Rangkapan Jaya Baru'), ('Bedahan', 'Bedahan'), ('Cinangka', 'Cinangka'), ('Kedaung', 'Kedaung'), ('Pasir Putih', 'Pasir Putih'), ('Pengasinan', 'Pengasinan'), ('Sawangan Baru', 'Sawangan Baru'), ('Sawangan Lama', 'Sawangan Lama'), ('Abadijaya', 'Abadijaya'), ('Bakti Jaya', 'Bakti Jaya'), ('Cisalak', 'Cisalak'), ('Mekar Jaya', 'Mekar Jaya'), ('Sukmajaya', 'Sukmajaya'), ('Tirtajaya', 'Tirtajaya'), ('Cilangkap', 'Cilangkap'), ('Cimpaeun', 'Cimpaeun'), ('Jatijajar', 'Jatijajar'), ('Leuwinanggung', 'Leuwinanggung'), ('Sukamaju Baru', 'Sukamaju Baru'), ('Sukatani', 'Sukatani'), ('Tapos', 'Tapos')], max_length=128), + field=models.CharField( + choices=[ + ('Beji', + 'Beji'), + ('Beji Timur', + 'Beji Timur'), + ('Kemirimuka', + 'Kemirimuka'), + ('Kukusan', + 'Kukusan'), + ('Pondok Cina', + 'Pondok Cina'), + ('Tanah Baru', + 'Tanah Baru'), + ('Bojongsari Baru', + 'Bojongsari Baru'), + ('Bojongsari Lama', + 'Bojongsari Lama'), + ('Curug', + 'Curug'), + ('Duren Mekar', + 'Duren Mekar'), + ('Duren Seribu', + 'Duren Seribu'), + ('Pondok Petir', + 'Pondok Petir'), + ('Serua', + 'Serua'), + ('Cilodong', + 'Cilodong'), + ('Jatimulya', + 'Jatimulya'), + ('Kalibaru', + 'Kalibaru'), + ('Kalimulya', + 'Kalimulya'), + ('Sukamaju', + 'Sukamaju'), + ('Cisalak Pasar', + 'Cisalak Pasar'), + ('Curug', + 'Curug'), + ('Harjamukti', + 'Harjamukti'), + ('Mekarsari', + 'Mekarsari'), + ('Pasir Gunung Selatan', + 'Pasir Gunung Selatan'), + ('Tugu', + 'Tugu'), + ('Cinere', + 'Cinere'), + ('Gandul', + 'Gandul'), + ('Pangkalan Jati', + 'Pangkalan Jati'), + ('Pangkalan Jati Baru', + 'Pangkalan Jati Baru'), + ('Bojong Pondok Terong', + 'Bojong Pondok Terong'), + ('Cipayung', + 'Cipayung'), + ('Cipayung Jaya', + 'Cipayung Jaya'), + ('Pondok Jaya', + 'Pondok Jaya'), + ('Ratujaya', + 'Ratujaya'), + ('Grogol', + 'Grogol'), + ('Krukut', + 'Krukut'), + ('Limo', + 'Limo'), + ('Meruyung', + 'Meruyung'), + ('Depok Jaya', + 'Depok'), + ('Depok Jaya', + 'Depok Jaya'), + ('Mampang', + 'Mampang'), + ('Pancoran Mas', + 'Pancoran Mas'), + ('Rangkapan Jaya', + 'Rangkapan Jaya'), + ('Rangkapan Jaya Baru', + 'Rangkapan Jaya Baru'), + ('Bedahan', + 'Bedahan'), + ('Cinangka', + 'Cinangka'), + ('Kedaung', + 'Kedaung'), + ('Pasir Putih', + 'Pasir Putih'), + ('Pengasinan', + 'Pengasinan'), + ('Sawangan Baru', + 'Sawangan Baru'), + ('Sawangan Lama', + 'Sawangan Lama'), + ('Abadijaya', + 'Abadijaya'), + ('Bakti Jaya', + 'Bakti Jaya'), + ('Cisalak', + 'Cisalak'), + ('Mekar Jaya', + 'Mekar Jaya'), + ('Sukmajaya', + 'Sukmajaya'), + ('Tirtajaya', + 'Tirtajaya'), + ('Cilangkap', + 'Cilangkap'), + ('Cimpaeun', + 'Cimpaeun'), + ('Jatijajar', + 'Jatijajar'), + ('Leuwinanggung', + 'Leuwinanggung'), + ('Sukamaju Baru', + 'Sukamaju Baru'), + ('Sukatani', + 'Sukatani'), + ('Tapos', + 'Tapos')], + max_length=128), ), migrations.AlterField( model_name='accounthistory', name='sub_district', - field=models.CharField(choices=[('Beji', 'Beji'), ('Beji Timur', 'Beji Timur'), ('Kemirimuka', 'Kemirimuka'), ('Kukusan', 'Kukusan'), ('Pondok Cina', 'Pondok Cina'), ('Tanah Baru', 'Tanah Baru'), ('Bojongsari Baru', 'Bojongsari Baru'), ('Bojongsari Lama', 'Bojongsari Lama'), ('Curug', 'Curug'), ('Duren Mekar', 'Duren Mekar'), ('Duren Seribu', 'Duren Seribu'), ('Pondok Petir', 'Pondok Petir'), ('Serua', 'Serua'), ('Cilodong', 'Cilodong'), ('Jatimulya', 'Jatimulya'), ('Kalibaru', 'Kalibaru'), ('Kalimulya', 'Kalimulya'), ('Sukamaju', 'Sukamaju'), ('Cisalak Pasar', 'Cisalak Pasar'), ('Curug', 'Curug'), ('Harjamukti', 'Harjamukti'), ('Mekarsari', 'Mekarsari'), ('Pasir Gunung Selatan', 'Pasir Gunung Selatan'), ('Tugu', 'Tugu'), ('Cinere', 'Cinere'), ('Gandul', 'Gandul'), ('Pangkalan Jati', 'Pangkalan Jati'), ('Pangkalan Jati Baru', 'Pangkalan Jati Baru'), ('Bojong Pondok Terong', 'Bojong Pondok Terong'), ('Cipayung', 'Cipayung'), ('Cipayung Jaya', 'Cipayung Jaya'), ('Pondok Jaya', 'Pondok Jaya'), ('Ratujaya', 'Ratujaya'), ('Grogol', 'Grogol'), ('Krukut', 'Krukut'), ('Limo', 'Limo'), ('Meruyung', 'Meruyung'), ('Depok Jaya', 'Depok'), ('Depok Jaya', 'Depok Jaya'), ('Mampang', 'Mampang'), ('Pancoran Mas', 'Pancoran Mas'), ('Rangkapan Jaya', 'Rangkapan Jaya'), ('Rangkapan Jaya Baru', 'Rangkapan Jaya Baru'), ('Bedahan', 'Bedahan'), ('Cinangka', 'Cinangka'), ('Kedaung', 'Kedaung'), ('Pasir Putih', 'Pasir Putih'), ('Pengasinan', 'Pengasinan'), ('Sawangan Baru', 'Sawangan Baru'), ('Sawangan Lama', 'Sawangan Lama'), ('Abadijaya', 'Abadijaya'), ('Bakti Jaya', 'Bakti Jaya'), ('Cisalak', 'Cisalak'), ('Mekar Jaya', 'Mekar Jaya'), ('Sukmajaya', 'Sukmajaya'), ('Tirtajaya', 'Tirtajaya'), ('Cilangkap', 'Cilangkap'), ('Cimpaeun', 'Cimpaeun'), ('Jatijajar', 'Jatijajar'), ('Leuwinanggung', 'Leuwinanggung'), ('Sukamaju Baru', 'Sukamaju Baru'), ('Sukatani', 'Sukatani'), ('Tapos', 'Tapos')], max_length=128), + field=models.CharField( + choices=[ + ('Beji', + 'Beji'), + ('Beji Timur', + 'Beji Timur'), + ('Kemirimuka', + 'Kemirimuka'), + ('Kukusan', + 'Kukusan'), + ('Pondok Cina', + 'Pondok Cina'), + ('Tanah Baru', + 'Tanah Baru'), + ('Bojongsari Baru', + 'Bojongsari Baru'), + ('Bojongsari Lama', + 'Bojongsari Lama'), + ('Curug', + 'Curug'), + ('Duren Mekar', + 'Duren Mekar'), + ('Duren Seribu', + 'Duren Seribu'), + ('Pondok Petir', + 'Pondok Petir'), + ('Serua', + 'Serua'), + ('Cilodong', + 'Cilodong'), + ('Jatimulya', + 'Jatimulya'), + ('Kalibaru', + 'Kalibaru'), + ('Kalimulya', + 'Kalimulya'), + ('Sukamaju', + 'Sukamaju'), + ('Cisalak Pasar', + 'Cisalak Pasar'), + ('Curug', + 'Curug'), + ('Harjamukti', + 'Harjamukti'), + ('Mekarsari', + 'Mekarsari'), + ('Pasir Gunung Selatan', + 'Pasir Gunung Selatan'), + ('Tugu', + 'Tugu'), + ('Cinere', + 'Cinere'), + ('Gandul', + 'Gandul'), + ('Pangkalan Jati', + 'Pangkalan Jati'), + ('Pangkalan Jati Baru', + 'Pangkalan Jati Baru'), + ('Bojong Pondok Terong', + 'Bojong Pondok Terong'), + ('Cipayung', + 'Cipayung'), + ('Cipayung Jaya', + 'Cipayung Jaya'), + ('Pondok Jaya', + 'Pondok Jaya'), + ('Ratujaya', + 'Ratujaya'), + ('Grogol', + 'Grogol'), + ('Krukut', + 'Krukut'), + ('Limo', + 'Limo'), + ('Meruyung', + 'Meruyung'), + ('Depok Jaya', + 'Depok'), + ('Depok Jaya', + 'Depok Jaya'), + ('Mampang', + 'Mampang'), + ('Pancoran Mas', + 'Pancoran Mas'), + ('Rangkapan Jaya', + 'Rangkapan Jaya'), + ('Rangkapan Jaya Baru', + 'Rangkapan Jaya Baru'), + ('Bedahan', + 'Bedahan'), + ('Cinangka', + 'Cinangka'), + ('Kedaung', + 'Kedaung'), + ('Pasir Putih', + 'Pasir Putih'), + ('Pengasinan', + 'Pengasinan'), + ('Sawangan Baru', + 'Sawangan Baru'), + ('Sawangan Lama', + 'Sawangan Lama'), + ('Abadijaya', + 'Abadijaya'), + ('Bakti Jaya', + 'Bakti Jaya'), + ('Cisalak', + 'Cisalak'), + ('Mekar Jaya', + 'Mekar Jaya'), + ('Sukmajaya', + 'Sukmajaya'), + ('Tirtajaya', + 'Tirtajaya'), + ('Cilangkap', + 'Cilangkap'), + ('Cimpaeun', + 'Cimpaeun'), + ('Jatijajar', + 'Jatijajar'), + ('Leuwinanggung', + 'Leuwinanggung'), + ('Sukamaju Baru', + 'Sukamaju Baru'), + ('Sukatani', + 'Sukatani'), + ('Tapos', + 'Tapos')], + max_length=128), ), ] diff --git a/apps/cases/migrations/0014_auto_20210516_1918.py b/apps/cases/migrations/0014_auto_20210516_1918.py index 21d726a..1766291 100644 --- a/apps/cases/migrations/0014_auto_20210516_1918.py +++ b/apps/cases/migrations/0014_auto_20210516_1918.py @@ -13,26 +13,285 @@ class Migration(migrations.Migration): migrations.AddField( model_name='casesubjecthistory', name='last_modified_at', - field=models.DateTimeField(auto_now=True), + field=models.DateTimeField( + auto_now=True), ), migrations.AddField( model_name='investigationcasehistory', name='last_modified_at', - field=models.DateTimeField(auto_now=True), + field=models.DateTimeField( + auto_now=True), ), migrations.AddField( model_name='monitoringcasehistory', name='last_modified_at', - field=models.DateTimeField(auto_now=True), + field=models.DateTimeField( + auto_now=True), ), migrations.AlterField( model_name='casesubject', name='sub_district', - field=models.CharField(choices=[('Beji', 'Beji'), ('Beji Timur', 'Beji Timur'), ('Kemirimuka', 'Kemirimuka'), ('Kukusan', 'Kukusan'), ('Pondok Cina', 'Pondok Cina'), ('Tanah Baru', 'Tanah Baru'), ('Bojongsari Baru', 'Bojongsari Baru'), ('Bojongsari Lama', 'Bojongsari Lama'), ('Curug', 'Curug'), ('Duren Mekar', 'Duren Mekar'), ('Duren Seribu', 'Duren Seribu'), ('Pondok Petir', 'Pondok Petir'), ('Serua', 'Serua'), ('Cilodong', 'Cilodong'), ('Jatimulya', 'Jatimulya'), ('Kalibaru', 'Kalibaru'), ('Kalimulya', 'Kalimulya'), ('Sukamaju', 'Sukamaju'), ('Cisalak Pasar', 'Cisalak Pasar'), ('Curug', 'Curug'), ('Harjamukti', 'Harjamukti'), ('Mekarsari', 'Mekarsari'), ('Pasir Gunung Selatan', 'Pasir Gunung Selatan'), ('Tugu', 'Tugu'), ('Cinere', 'Cinere'), ('Gandul', 'Gandul'), ('Pangkalan Jati', 'Pangkalan Jati'), ('Pangkalan Jati Baru', 'Pangkalan Jati Baru'), ('Bojong Pondok Terong', 'Bojong Pondok Terong'), ('Cipayung', 'Cipayung'), ('Cipayung Jaya', 'Cipayung Jaya'), ('Pondok Jaya', 'Pondok Jaya'), ('Ratujaya', 'Ratujaya'), ('Grogol', 'Grogol'), ('Krukut', 'Krukut'), ('Limo', 'Limo'), ('Meruyung', 'Meruyung'), ('Depok Jaya', 'Depok'), ('Depok Jaya', 'Depok Jaya'), ('Mampang', 'Mampang'), ('Pancoran Mas', 'Pancoran Mas'), ('Rangkapan Jaya', 'Rangkapan Jaya'), ('Rangkapan Jaya Baru', 'Rangkapan Jaya Baru'), ('Bedahan', 'Bedahan'), ('Cinangka', 'Cinangka'), ('Kedaung', 'Kedaung'), ('Pasir Putih', 'Pasir Putih'), ('Pengasinan', 'Pengasinan'), ('Sawangan Baru', 'Sawangan Baru'), ('Sawangan Lama', 'Sawangan Lama'), ('Abadijaya', 'Abadijaya'), ('Bakti Jaya', 'Bakti Jaya'), ('Cisalak', 'Cisalak'), ('Mekar Jaya', 'Mekar Jaya'), ('Sukmajaya', 'Sukmajaya'), ('Tirtajaya', 'Tirtajaya'), ('Cilangkap', 'Cilangkap'), ('Cimpaeun', 'Cimpaeun'), ('Jatijajar', 'Jatijajar'), ('Leuwinanggung', 'Leuwinanggung'), ('Sukamaju Baru', 'Sukamaju Baru'), ('Sukatani', 'Sukatani'), ('Tapos', 'Tapos')], max_length=128), + field=models.CharField( + choices=[ + ('Beji', + 'Beji'), + ('Beji Timur', + 'Beji Timur'), + ('Kemirimuka', + 'Kemirimuka'), + ('Kukusan', + 'Kukusan'), + ('Pondok Cina', + 'Pondok Cina'), + ('Tanah Baru', + 'Tanah Baru'), + ('Bojongsari Baru', + 'Bojongsari Baru'), + ('Bojongsari Lama', + 'Bojongsari Lama'), + ('Curug', + 'Curug'), + ('Duren Mekar', + 'Duren Mekar'), + ('Duren Seribu', + 'Duren Seribu'), + ('Pondok Petir', + 'Pondok Petir'), + ('Serua', + 'Serua'), + ('Cilodong', + 'Cilodong'), + ('Jatimulya', + 'Jatimulya'), + ('Kalibaru', + 'Kalibaru'), + ('Kalimulya', + 'Kalimulya'), + ('Sukamaju', + 'Sukamaju'), + ('Cisalak Pasar', + 'Cisalak Pasar'), + ('Curug', + 'Curug'), + ('Harjamukti', + 'Harjamukti'), + ('Mekarsari', + 'Mekarsari'), + ('Pasir Gunung Selatan', + 'Pasir Gunung Selatan'), + ('Tugu', + 'Tugu'), + ('Cinere', + 'Cinere'), + ('Gandul', + 'Gandul'), + ('Pangkalan Jati', + 'Pangkalan Jati'), + ('Pangkalan Jati Baru', + 'Pangkalan Jati Baru'), + ('Bojong Pondok Terong', + 'Bojong Pondok Terong'), + ('Cipayung', + 'Cipayung'), + ('Cipayung Jaya', + 'Cipayung Jaya'), + ('Pondok Jaya', + 'Pondok Jaya'), + ('Ratujaya', + 'Ratujaya'), + ('Grogol', + 'Grogol'), + ('Krukut', + 'Krukut'), + ('Limo', + 'Limo'), + ('Meruyung', + 'Meruyung'), + ('Depok Jaya', + 'Depok'), + ('Depok Jaya', + 'Depok Jaya'), + ('Mampang', + 'Mampang'), + ('Pancoran Mas', + 'Pancoran Mas'), + ('Rangkapan Jaya', + 'Rangkapan Jaya'), + ('Rangkapan Jaya Baru', + 'Rangkapan Jaya Baru'), + ('Bedahan', + 'Bedahan'), + ('Cinangka', + 'Cinangka'), + ('Kedaung', + 'Kedaung'), + ('Pasir Putih', + 'Pasir Putih'), + ('Pengasinan', + 'Pengasinan'), + ('Sawangan Baru', + 'Sawangan Baru'), + ('Sawangan Lama', + 'Sawangan Lama'), + ('Abadijaya', + 'Abadijaya'), + ('Bakti Jaya', + 'Bakti Jaya'), + ('Cisalak', + 'Cisalak'), + ('Mekar Jaya', + 'Mekar Jaya'), + ('Sukmajaya', + 'Sukmajaya'), + ('Tirtajaya', + 'Tirtajaya'), + ('Cilangkap', + 'Cilangkap'), + ('Cimpaeun', + 'Cimpaeun'), + ('Jatijajar', + 'Jatijajar'), + ('Leuwinanggung', + 'Leuwinanggung'), + ('Sukamaju Baru', + 'Sukamaju Baru'), + ('Sukatani', + 'Sukatani'), + ('Tapos', + 'Tapos')], + max_length=128), ), migrations.AlterField( model_name='casesubjecthistory', name='sub_district', - field=models.CharField(choices=[('Beji', 'Beji'), ('Beji Timur', 'Beji Timur'), ('Kemirimuka', 'Kemirimuka'), ('Kukusan', 'Kukusan'), ('Pondok Cina', 'Pondok Cina'), ('Tanah Baru', 'Tanah Baru'), ('Bojongsari Baru', 'Bojongsari Baru'), ('Bojongsari Lama', 'Bojongsari Lama'), ('Curug', 'Curug'), ('Duren Mekar', 'Duren Mekar'), ('Duren Seribu', 'Duren Seribu'), ('Pondok Petir', 'Pondok Petir'), ('Serua', 'Serua'), ('Cilodong', 'Cilodong'), ('Jatimulya', 'Jatimulya'), ('Kalibaru', 'Kalibaru'), ('Kalimulya', 'Kalimulya'), ('Sukamaju', 'Sukamaju'), ('Cisalak Pasar', 'Cisalak Pasar'), ('Curug', 'Curug'), ('Harjamukti', 'Harjamukti'), ('Mekarsari', 'Mekarsari'), ('Pasir Gunung Selatan', 'Pasir Gunung Selatan'), ('Tugu', 'Tugu'), ('Cinere', 'Cinere'), ('Gandul', 'Gandul'), ('Pangkalan Jati', 'Pangkalan Jati'), ('Pangkalan Jati Baru', 'Pangkalan Jati Baru'), ('Bojong Pondok Terong', 'Bojong Pondok Terong'), ('Cipayung', 'Cipayung'), ('Cipayung Jaya', 'Cipayung Jaya'), ('Pondok Jaya', 'Pondok Jaya'), ('Ratujaya', 'Ratujaya'), ('Grogol', 'Grogol'), ('Krukut', 'Krukut'), ('Limo', 'Limo'), ('Meruyung', 'Meruyung'), ('Depok Jaya', 'Depok'), ('Depok Jaya', 'Depok Jaya'), ('Mampang', 'Mampang'), ('Pancoran Mas', 'Pancoran Mas'), ('Rangkapan Jaya', 'Rangkapan Jaya'), ('Rangkapan Jaya Baru', 'Rangkapan Jaya Baru'), ('Bedahan', 'Bedahan'), ('Cinangka', 'Cinangka'), ('Kedaung', 'Kedaung'), ('Pasir Putih', 'Pasir Putih'), ('Pengasinan', 'Pengasinan'), ('Sawangan Baru', 'Sawangan Baru'), ('Sawangan Lama', 'Sawangan Lama'), ('Abadijaya', 'Abadijaya'), ('Bakti Jaya', 'Bakti Jaya'), ('Cisalak', 'Cisalak'), ('Mekar Jaya', 'Mekar Jaya'), ('Sukmajaya', 'Sukmajaya'), ('Tirtajaya', 'Tirtajaya'), ('Cilangkap', 'Cilangkap'), ('Cimpaeun', 'Cimpaeun'), ('Jatijajar', 'Jatijajar'), ('Leuwinanggung', 'Leuwinanggung'), ('Sukamaju Baru', 'Sukamaju Baru'), ('Sukatani', 'Sukatani'), ('Tapos', 'Tapos')], max_length=128), + field=models.CharField( + choices=[ + ('Beji', + 'Beji'), + ('Beji Timur', + 'Beji Timur'), + ('Kemirimuka', + 'Kemirimuka'), + ('Kukusan', + 'Kukusan'), + ('Pondok Cina', + 'Pondok Cina'), + ('Tanah Baru', + 'Tanah Baru'), + ('Bojongsari Baru', + 'Bojongsari Baru'), + ('Bojongsari Lama', + 'Bojongsari Lama'), + ('Curug', + 'Curug'), + ('Duren Mekar', + 'Duren Mekar'), + ('Duren Seribu', + 'Duren Seribu'), + ('Pondok Petir', + 'Pondok Petir'), + ('Serua', + 'Serua'), + ('Cilodong', + 'Cilodong'), + ('Jatimulya', + 'Jatimulya'), + ('Kalibaru', + 'Kalibaru'), + ('Kalimulya', + 'Kalimulya'), + ('Sukamaju', + 'Sukamaju'), + ('Cisalak Pasar', + 'Cisalak Pasar'), + ('Curug', + 'Curug'), + ('Harjamukti', + 'Harjamukti'), + ('Mekarsari', + 'Mekarsari'), + ('Pasir Gunung Selatan', + 'Pasir Gunung Selatan'), + ('Tugu', + 'Tugu'), + ('Cinere', + 'Cinere'), + ('Gandul', + 'Gandul'), + ('Pangkalan Jati', + 'Pangkalan Jati'), + ('Pangkalan Jati Baru', + 'Pangkalan Jati Baru'), + ('Bojong Pondok Terong', + 'Bojong Pondok Terong'), + ('Cipayung', + 'Cipayung'), + ('Cipayung Jaya', + 'Cipayung Jaya'), + ('Pondok Jaya', + 'Pondok Jaya'), + ('Ratujaya', + 'Ratujaya'), + ('Grogol', + 'Grogol'), + ('Krukut', + 'Krukut'), + ('Limo', + 'Limo'), + ('Meruyung', + 'Meruyung'), + ('Depok Jaya', + 'Depok'), + ('Depok Jaya', + 'Depok Jaya'), + ('Mampang', + 'Mampang'), + ('Pancoran Mas', + 'Pancoran Mas'), + ('Rangkapan Jaya', + 'Rangkapan Jaya'), + ('Rangkapan Jaya Baru', + 'Rangkapan Jaya Baru'), + ('Bedahan', + 'Bedahan'), + ('Cinangka', + 'Cinangka'), + ('Kedaung', + 'Kedaung'), + ('Pasir Putih', + 'Pasir Putih'), + ('Pengasinan', + 'Pengasinan'), + ('Sawangan Baru', + 'Sawangan Baru'), + ('Sawangan Lama', + 'Sawangan Lama'), + ('Abadijaya', + 'Abadijaya'), + ('Bakti Jaya', + 'Bakti Jaya'), + ('Cisalak', + 'Cisalak'), + ('Mekar Jaya', + 'Mekar Jaya'), + ('Sukmajaya', + 'Sukmajaya'), + ('Tirtajaya', + 'Tirtajaya'), + ('Cilangkap', + 'Cilangkap'), + ('Cimpaeun', + 'Cimpaeun'), + ('Jatijajar', + 'Jatijajar'), + ('Leuwinanggung', + 'Leuwinanggung'), + ('Sukamaju Baru', + 'Sukamaju Baru'), + ('Sukatani', + 'Sukatani'), + ('Tapos', + 'Tapos')], + max_length=128), ), ] diff --git a/apps/cases/tests/test_units/test_models.py b/apps/cases/tests/test_units/test_models.py index 7d9c64e..ab4f2a8 100644 --- a/apps/cases/tests/test_units/test_models.py +++ b/apps/cases/tests/test_units/test_models.py @@ -3,6 +3,7 @@ from django.core.exceptions import ValidationError from ...models import CaseSubject, CaseSubjectHistory + class CaseSubjectModelTest(TestCase): def test_validate_inconsistent_district_data_should_raise_error(self): case_subject = CaseSubject(district='Beji', sub_district='Limo') @@ -12,4 +13,4 @@ class CaseSubjectModelTest(TestCase): class CaseSubjectHistoryModelTest(TestCase): def test_validate_inconsistent_district_data_should_raise_error(self): case_subject = CaseSubjectHistory(district='Beji', sub_district='Limo') - self.assertRaises(ValidationError, case_subject.save) \ No newline at end of file + self.assertRaises(ValidationError, case_subject.save) diff --git a/apps/cases/tests/test_units/test_serializers.py b/apps/cases/tests/test_units/test_serializers.py index 2c0c85b..6eecb5d 100644 --- a/apps/cases/tests/test_units/test_serializers.py +++ b/apps/cases/tests/test_units/test_serializers.py @@ -42,7 +42,7 @@ class CaseSubjectHistorySerializerTest(TestCase): "action_type": 'Create', "recorded_at": case_subject_history.recorded_at, } - + serializer = CaseSubjectHistorySerializer(data=data) serializer.is_valid() diff --git a/apps/exportables/tests/test_units/test_exportables.py b/apps/exportables/tests/test_units/test_exportables.py index 8207861..ddd942d 100644 --- a/apps/exportables/tests/test_units/test_exportables.py +++ b/apps/exportables/tests/test_units/test_exportables.py @@ -134,7 +134,8 @@ class ExportableViewTest(APITestCase): response_data = json.loads(response.content) self.assertEqual(response_data["total_count"], 5) - def test_filter_exportable_empty_return_values(self): # TODO: H+1 to H+2 causes this test to fail. Need attention + # TODO: H+1 to H+2 causes this test to fail. Need attention + def test_filter_exportable_empty_return_values(self): start_date = datetime.now(tz=pytz.timezone(settings.TIME_ZONE)) + timedelta(days=2) end_date = datetime.now(tz=pytz.timezone(settings.TIME_ZONE)) + timedelta(days=3) url = "/exportables/?start_date={}&end_date={}".format( diff --git a/apps/exportables/utils.py b/apps/exportables/utils.py index cf8c18f..44ea31e 100644 --- a/apps/exportables/utils.py +++ b/apps/exportables/utils.py @@ -122,7 +122,7 @@ def get_datetime_from_iso_format(iso_date, tz=pytz.utc, hour_type='start') -> dt minute = 59 second = 59 - dates = iso_date.split("-") + dates = str(iso_date[0:10]).split("-") try: date = dt.datetime(year=int(dates[0]), month=int(dates[1]), diff --git a/apps/logs/serializers.py b/apps/logs/serializers.py index 270bce9..40e3716 100644 --- a/apps/logs/serializers.py +++ b/apps/logs/serializers.py @@ -1,4 +1,10 @@ +from datetime import datetime from rest_framework import serializers +import pytz + +from django.utils.translation import gettext_lazy as _ +from django.core.exceptions import ValidationError +from django.conf import settings from apps.accounts.serializers import AccountSerializer from apps.accounts.models import AccountHistory, Account @@ -13,6 +19,7 @@ from apps.constants import ( MODEL_NAME_INVESTIGATION_CASE, MODEL_NAME_MONITORING_CASE, ) +from apps.exportables.utils import get_datetime_from_iso_format class LogSerializer(serializers.Serializer): @@ -50,3 +57,25 @@ class LogSerializer(serializers.Serializer): author = Account.objects.filter(id=instance.author).first() return AccountSerializer(author).data + + +class LogQuerySerializer(serializers.Serializer): + start_date = serializers.DateField(required=False) + end_date = serializers.DateField(required=False) + is_admin = serializers.NullBooleanField(required=False) + start_date = serializers.DateField(default=datetime(1, 1, 2).date()) + end_date = serializers.DateField(default=datetime(9999, 12, 30).date()) + + def validate(self, data): + try: + data['start_date'] = get_datetime_from_iso_format( + str(data['start_date']), pytz.timezone(settings.TIME_ZONE), 'start') + data['end_date'] = get_datetime_from_iso_format( + str(data['end_date']), pytz.timezone(settings.TIME_ZONE), 'end') + except ValueError as e: + raise ValidationError(_("Date format invalid, must be using iso format 'YYYY-MM-DD'.")) + + if data['end_date'] < data['start_date']: + raise ValidationError(_("Invalid date range.")) + + return data diff --git a/apps/logs/tests/test_units/test_logs.py b/apps/logs/tests/test_units/test_logs.py index 26553af..6ad9050 100644 --- a/apps/logs/tests/test_units/test_logs.py +++ b/apps/logs/tests/test_units/test_logs.py @@ -1,13 +1,14 @@ import json import pytz -from datetime import datetime +from django.conf import settings +from datetime import datetime, timedelta from rest_framework import status from rest_framework.authtoken.models import Token from rest_framework.test import APITestCase, APIClient from apps.accounts.tests.factories.accounts import AccountFactory, UserFactory -from apps.cases.models import CaseSubject -from apps.cases.tests.factories.case_subjects import CaseSubjectFactory +from apps.cases.models import CaseSubject, CaseSubjectHistory +from apps.cases.tests.factories.case_subjects import CaseSubjectFactory, CaseSubjectHistoryFactory from apps.cases.tests.factories.cases import InvestigationCaseFactory from apps.constants import HEADER_PREFIX, TIMEZONE @@ -25,10 +26,27 @@ class ActivityLogViewTest(APITestCase): cls.admin_account = AccountFactory(admin=True, user=admin_user) cls.admin_token, _ = Token.objects.get_or_create(user=admin_user) - case_subject = CaseSubjectFactory(author=cls.officer_account) + now = datetime.now(tz=pytz.timezone(settings.TIME_ZONE)) + case_subject_1 = CaseSubjectFactory(author=cls.admin_account) + case_subject_2 = CaseSubjectFactory(author=cls.officer_account) + case_subject_3 = CaseSubjectFactory(author=cls.officer_account) + CaseSubjectHistory.objects.filter( + object_id=case_subject_1.id).update( + recorded_at=now - + timedelta( + days=3)) + CaseSubjectHistory.objects.filter( + object_id=case_subject_2.id).update( + recorded_at=now - + timedelta( + days=2)) + + cls.case = InvestigationCaseFactory( + author=cls.officer_account, case_subject=case_subject_1, + ) cls.case = InvestigationCaseFactory( - author=cls.officer_account, case_subject=case_subject, + author=cls.admin_account, case_subject=case_subject_2, ) def get_logs_response(self): @@ -40,4 +58,26 @@ class ActivityLogViewTest(APITestCase): def test_list_only_current_author_logs_success(self): self.client = APIClient(HTTP_AUTHORIZATION=HEADER_PREFIX + self.officer_token.key) - self.assertIn('"count":2', self.get_logs_response()) + self.assertIn('"count":5', self.get_logs_response()) + + def test_list_only_logs_in_time_range_success(self): + self.client = APIClient(HTTP_AUTHORIZATION=HEADER_PREFIX + self.officer_token.key) + + start_date = datetime.now(tz=pytz.timezone(settings.TIME_ZONE)) - timedelta(days=1) + end_date = datetime.now(tz=pytz.timezone(settings.TIME_ZONE)) + timedelta(days=1) + url = "/logs/?start_date={}&end_date={}".format( + start_date.isoformat()[0:10], end_date.isoformat()[0:10]) + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + response_string = response.rendered_content.decode("utf-8") + self.assertIn('"count":3', response_string) + + def test_list_only_logs_made_by_admin_success(self): + self.client = APIClient(HTTP_AUTHORIZATION=HEADER_PREFIX + self.officer_token.key) + url = "/logs/?is_admin=true" + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + response_string = response.rendered_content.decode("utf-8") + self.assertIn('"count":2', response_string) diff --git a/apps/logs/views.py b/apps/logs/views.py index dc66a39..5c098ff 100644 --- a/apps/logs/views.py +++ b/apps/logs/views.py @@ -1,8 +1,10 @@ +import pytz from itertools import chain from rest_framework import status from rest_framework.generics import ListAPIView from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination +from django.conf import settings from django_filters.rest_framework import DjangoFilterBackend from apps.accounts.models import AccountHistory @@ -14,6 +16,12 @@ from apps.cases.models import ( from apps.commons.permissions import IsAuthenticated from apps.logs.serializers import LogSerializer +from apps.exportables.utils import ( + get_datetime_from_iso_format +) + +from .serializers import LogQuerySerializer + class LogAPIView(ListAPIView): filter_backends = (DjangoFilterBackend,) @@ -21,7 +29,21 @@ class LogAPIView(ListAPIView): def _get_logs_queryset(self, queryset, request): account = request.user.account - return queryset.filter(author=account) + result = queryset + + query = LogQuerySerializer(data=request.query_params) + query.is_valid(raise_exception=True) + query = query.validated_data + + if 'start_date' in query and 'end_date' in query: + start_date = get_datetime_from_iso_format( + str(query['start_date']), pytz.timezone(settings.TIME_ZONE), 'start') + end_date = get_datetime_from_iso_format( + str(query['end_date']), pytz.timezone(settings.TIME_ZONE), 'end') + result = result.filter(recorded_at__range=(start_date, end_date)) + if 'is_admin' in query: + result = result.filter(author__is_admin=query['is_admin']) + return result def get_queryset(self, request): account = request.user.account diff --git a/docker-compose.yml b/docker-compose.yml index 241ea81..d6d611c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,8 +49,6 @@ services: locust: image: tbcare/locust:development - ports: - - '8089:8089' networks: - monitoring volumes: @@ -77,8 +75,6 @@ services: grafana: image: grafana/grafana - ports: - - '3000:3000' networks: - monitoring volumes: -- GitLab From 2600382e65d99da7bb7c877e39322341d2f80f2f Mon Sep 17 00:00:00 2001 From: Inigo Ramli Date: Sat, 5 Jun 2021 22:05:10 +0700 Subject: [PATCH 2/2] Change log pagination to 20 --- apps/logs/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/logs/views.py b/apps/logs/views.py index dc66a39..1036b16 100644 --- a/apps/logs/views.py +++ b/apps/logs/views.py @@ -46,6 +46,7 @@ class LogAPIView(ListAPIView): logs_querysets = sorted(logs_querysets, key=lambda x: x.recorded_at, reverse=True) paginator = PageNumberPagination() + paginator.page_size = 20 context = paginator.paginate_queryset(logs_querysets, request) serializer = LogSerializer(context, many=True) -- GitLab