diff --git a/apps/accounts/migrations/0009_auto_20210516_1918.py b/apps/accounts/migrations/0009_auto_20210516_1918.py index f63d07a70b97f81f8b830f41f6cdfb674298ffb2..15535c9264d1da252afd586b08e088c5ae95bf4f 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 21d726a4a722c339cd0eb892557916407fca6ba2..17662919bf97cb7bdda1756108aaf55891609ddb 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 7d9c64e54a876c769e66369ff4d16982ea9b9ec3..ab4f2a8a2dd977e26c85bd711eff0c96be980372 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 2c0c85bcb32db42dcf7ab7a5a4a7c2b9fb9811b3..6eecb5dc099106f1247b765a5ed7cc9add97aa51 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 8207861c87d3a6e11ea255d7a125262794e1074a..ddd942db36e2e669bd3976a4b2ad5325ae470d45 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 cf8c18f6d677bdf59a7e355af738c45eac4445f5..44ea31ec7d5574800d0e355cb6cd079c734cb18b 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 270bce9d408688387a31322c0d71bf3794495e05..40e37163a64d35e96c1846372fedbc2e8b64c4da 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 26553af4587e919bb61472f49daf95eb5f431c15..6ad9050f2c588f0bd4489c89dd386b2cb027207a 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 dc66a399aa40a68ba6b207820ce46e46f3176f02..811b5f0e804e61fbbca49b59ed434d97e75e8401 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 @@ -46,6 +68,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) diff --git a/docker-compose.yml b/docker-compose.yml index 241ea814777e373020c944d8cbf52dea182ad20e..d6d611c9be5d9bab4e956c1285d94d13837ba2ed 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: