From 0fedcb87c46fde024b381a8623adfa3f7fbb4106 Mon Sep 17 00:00:00 2001 From: thenav56 Date: Wed, 21 Apr 2021 10:28:31 +0545 Subject: [PATCH] Using cronjob to update project status - Using pytest as test runner. --- deployments/management/commands/__init__.py | 0 .../commands/update_project_status.py | 19 ++ deployments/models.py | 11 - deployments/serializers.py | 1 - deployments/snapshots/snap_tests.py | 202 +++++++++--------- deployments/test_views.py | 14 +- docker-compose.yml | 2 +- lang/tests.py | 1 - main/runserver.sh | 1 + pytest.ini | 4 + requirements.txt | 7 +- 11 files changed, 137 insertions(+), 125 deletions(-) create mode 100644 deployments/management/commands/__init__.py create mode 100644 deployments/management/commands/update_project_status.py create mode 100644 pytest.ini diff --git a/deployments/management/commands/__init__.py b/deployments/management/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/deployments/management/commands/update_project_status.py b/deployments/management/commands/update_project_status.py new file mode 100644 index 000000000..68e1302ae --- /dev/null +++ b/deployments/management/commands/update_project_status.py @@ -0,0 +1,19 @@ +from django.core.management.base import BaseCommand +from django.utils import timezone + +from deployments.models import Project, Statuses + + +class Command(BaseCommand): + help = 'Update project status using start/end date' + + def handle(self, *args, **options): + now = timezone.now().date() + + for projects, new_status in [ + (Project.objects.filter(start_date__gt=now), Statuses.PLANNED), + (Project.objects.filter(start_date__lt=now, end_date__gt=now), Statuses.ONGOING), + (Project.objects.filter(end_date__lt=now), Statuses.COMPLETED), + ]: + print(f'Total {str(new_status)} projects: {projects.count()}') + projects.update(status=new_status) diff --git a/deployments/models.py b/deployments/models.py index 94d06737a..39885e4ed 100644 --- a/deployments/models.py +++ b/deployments/models.py @@ -3,7 +3,6 @@ from enumfields import IntEnum from django.db import models -from django.utils import timezone from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django.utils.hashable import make_hashable @@ -393,16 +392,6 @@ def __str__(self): postfix = self.reporting_ns.society_name return '%s (%s)' % (self.name, postfix) - @property - def current_status_display(self): - # TODO: Update self.status instead using background task after celery is used in production? - now = timezone.now().date() - if now < self.start_date: - return Statuses.PLANNED - if now > self.end_date: - return Statuses.COMPLETED - return Statuses.ONGOING - def get_secondary_sectors_display(self): choices_dict = dict(make_hashable(SectorTags.choices())) return [ diff --git a/deployments/serializers.py b/deployments/serializers.py index cbdafe439..9ec2e54d8 100644 --- a/deployments/serializers.py +++ b/deployments/serializers.py @@ -165,7 +165,6 @@ class ProjectSerializer(EnumSupportSerializerMixin, ModelSerializer): operation_type_display = serializers.CharField(source='get_operation_type_display', read_only=True) status_display = serializers.CharField(source='get_status_display', read_only=True) secondary_sectors_display = serializers.ListField(source='get_secondary_sectors_display', read_only=True) - current_status_display = serializers.CharField(read_only=True) class Meta: model = Project diff --git a/deployments/snapshots/snap_tests.py b/deployments/snapshots/snap_tests.py index 18e9cf0bc..205906766 100644 --- a/deployments/snapshots/snap_tests.py +++ b/deployments/snapshots/snap_tests.py @@ -7,14 +7,6 @@ snapshots = Snapshot() -snapshots['TestProjectAPI::test_project_list_zero 1'] = { - 'count': 0, - 'next': None, - 'previous': None, - 'results': [ - ] -} - snapshots['TestProjectAPI::test_project_list_one 1'] = { 'count': 1, 'next': None, @@ -23,7 +15,6 @@ { 'actual_expenditure': 0, 'budget_amount': 0, - 'current_status_display': 'Completed', 'dtype': 3, 'dtype_detail': { 'id': 3, @@ -116,7 +107,6 @@ { 'actual_expenditure': 0, 'budget_amount': 0, - 'current_status_display': 'Completed', 'dtype': 3, 'dtype_detail': { 'id': 3, @@ -201,7 +191,6 @@ { 'actual_expenditure': 0, 'budget_amount': 0, - 'current_status_display': 'Completed', 'dtype': 6, 'dtype_detail': { 'id': 6, @@ -286,89 +275,9 @@ ] } -snapshots['TestProjectAPI::test_project_create 1'] = { - 'actual_expenditure': 0, - 'budget_amount': 0, - 'current_status_display': 'Completed', - 'dtype': None, - 'dtype_detail': None, - 'end_date': '2008-01-01', - 'event': None, - 'event_detail': None, - 'id': 1, - 'modified_at': '2019-03-23T00:00:00.123456Z', - 'name': 'Mock Project for Create API Test', - 'operation_type': 1, - 'operation_type_display': 'Emergency Operation', - 'primary_sector': 6, - 'primary_sector_display': 'Shelter', - 'programme_type': 2, - 'programme_type_display': 'Domestic', - 'project_country': 1, - 'project_country_detail': { - 'fdrs': None, - 'id': 1, - 'independent': None, - 'is_deprecated': False, - 'iso': 'IR', - 'iso3': 'Zmi', - 'name': 'HcqkdsmYSNrdDPaeyQrQQxgbsPyoyGTguFMIflmGDJTbcpHtvFzVkbwRwwOtpGrZdOqybJrojvzQifUyHRNORoApKjBtMvCIinPi', - 'record_type': 5, - 'record_type_display': 'Representative Office', - 'region': 1, - 'society_name': 'tSTHiBXjPKkueJIUhlujUbWuAAtCVOVrjXmgilbWNNrMKNoMooRbwfSXEiGMETPxlyFEikmocAWarAoVQmWnelCNFSuDpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBsNdSHjDPCfUGhlXLSIizAuCblDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnSnNdgKUOHfEUSMYTsBMuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqYettGJuXahRvvzUKNblmvvREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMhYWtTuTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRin' - }, - 'project_districts': [ - 1 - ], - 'project_districts_detail': [ - { - 'code': 'gMWkIuuRZt', - 'id': 1, - 'is_deprecated': False, - 'is_enclave': False, - 'name': 'faAOrAlJDTKWimlysJFctLtFJVDobYajqtOOEhPQsAlFSPpbhWrFeMVxLEKBqOREShxGUKbqkLdjuDSiwkdrxAOwdssHOeGmXOlW' - } - ], - 'reached_female': 0, - 'reached_male': 0, - 'reached_other': 0, - 'reached_total': 0, - 'regional_project': None, - 'regional_project_detail': None, - 'reporting_ns': 1, - 'reporting_ns_detail': { - 'fdrs': None, - 'id': 1, - 'independent': None, - 'is_deprecated': False, - 'iso': 'IR', - 'iso3': 'Zmi', - 'name': 'HcqkdsmYSNrdDPaeyQrQQxgbsPyoyGTguFMIflmGDJTbcpHtvFzVkbwRwwOtpGrZdOqybJrojvzQifUyHRNORoApKjBtMvCIinPi', - 'record_type': 5, - 'record_type_display': 'Representative Office', - 'region': 1, - 'society_name': 'tSTHiBXjPKkueJIUhlujUbWuAAtCVOVrjXmgilbWNNrMKNoMooRbwfSXEiGMETPxlyFEikmocAWarAoVQmWnelCNFSuDpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBsNdSHjDPCfUGhlXLSIizAuCblDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnSnNdgKUOHfEUSMYTsBMuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqYettGJuXahRvvzUKNblmvvREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMhYWtTuTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRin' - }, - 'secondary_sectors': [ - ], - 'secondary_sectors_display': [ - ], - 'start_date': '2008-01-01', - 'status': 1, - 'status_display': 'Ongoing', - 'target_female': 0, - 'target_male': 0, - 'target_other': 0, - 'target_total': 0, - 'user': 2, - 'visibility': 'public' -} - snapshots['TestProjectAPI::test_project_read 1'] = { 'actual_expenditure': 0, 'budget_amount': 0, - 'current_status_display': 'Completed', 'dtype': 3, 'dtype_detail': { 'id': 3, @@ -451,10 +360,100 @@ 'visibility': 'public' } +snapshots['TestProjectAPI::test_personnel_csv_api 1'] = '''country_from,deployment.comments,deployment.country_deployed_to.id,deployment.country_deployed_to.iso,deployment.country_deployed_to.iso3,deployment.country_deployed_to.name,deployment.country_deployed_to.society_name,deployment.event_deployed_to,deployment.id,end_date,id,is_active,name,role,start_date,type\r +,,10,go,obT,plfIgiUjOFBrwDSNpUHKDceuxcjMUOZgyGUfvOVtBzblVqUPVfBhYmKqtNGIYpSZdxKEnWBrVSXlrGQcMzlRsraAnbYAQirrDMYO,uoeNsUTMDLAOMvIyEJavvuwCjDVFnISkRyqzcQKfOFJwfnVHxtsWuCRDbjNLkNwKBAWbWsJVFpyIiyMhgznnhKslkXXVzJAwWnAMruXxOgQROWOuGIIzozFWDsCklzsaIvWDPlRgyLPAAAmObNoiNNGfMKUAbuNpkKOERfxbVMYPyJGmkDxUplETmuisebnKDDpRMCpYlDGPhZMvkpDUeaVcRRAHEyeYAqTIhTXMPITbCEUdsZzUXcxzTGOPCBYhgjqWLWYhUkxAQvjpYEnqgvPSeDTFWpWqvsSCvYCSqKrMcWijHsboxKxTstTkKOtETCRsjVZSijMsyqOobnLtjLaqxUGVHzENkwPjLGuHxyFPkHElEyaQevotnojrMXUYhPmwFDKOaVYYHoVmxQczOgvGerJIVIfZdCKHppqZVlSPpoSTDlcMrJrfVmUeiHtdnopLWLEDgIYduYOemEhCfEmgILnMFtKaLBhUCXPmLZONWDaqWAMr,,10,,10,True,,,,\r +,,9,lu,gSC,CcwiDUDrakwGGnwTHyGelPjwPUKvDTYirYWQtzePEyEMQlKTGXQHqiSuLLwLNzecbUkogQgFREuWoXZUYpglUyWAedNqhcVeCWxM,yiOKJmmqFCRsomVkBHZYmfLbOQgncZiaxXAKIevlRUUPHFmnKEGwwNJiZeCBOyeKfiYHtghFodMIvbosqyTwekseIKpHNGtzNdIShLEqPbcvAqmvWdinJUvWQdpFeZKNSWZcweAMVNfJEirUcgcFGoPwBEtYobdbXYZmIMyRRVbJEdyXySiBSBJihChNxwmvBdpofLaoAVWZYIKcZaUpdediClscuwMPpsiMzEQhQeeqInFTVwoCTtxXJsPpHruSIGgdwATNFrfniHotVJnhxUYjcpSCPWDhbFcrrLytfdrNyFbyyCconylQBIdQtcIWwbMWvqZWLnWbvUNBBYUVWdZgJyURsIDBKUKXHqkyDVpiarZRrfpXIsvKzcNrxrQqYPZXMahtKQuqlCDbCaDcwEOJnAdLfrNJueClqXYrqFioOljNPdohPclRGCLucJTodTqqbRwITcMpwgeGChGepnuKxRAePBsjbuMYxvAPxEsNbkxcsjLb,,9,,9,True,,,,\r +,,8,JX,yzM,vthgQaRJXivxVZxVXLHMxpPrnLyfgiOVMhcLPmmTCgeINvtUEWmIUjcimAJTqWJwxCOThBeEAHGYbkMrSiscKdYSmVzFRIGekCWG,rnlakKnLSaYGDGTUHqtosTrJhkocIpscOjrirYdPpnIhaPwOMxufTJqUiANsudOawoUrlqbIQXXLgUVSyPqOOMJnCournLOZWzjCoUUBxjEfFlDllmKFUlPsbtklzRMmejeBpDPzgUHiUWZaMgyybhaWPcipXfrjOMaYaYgIVvTfmiEWKCktvEjpdISrOIhbcgIsgGAjaoboByjwPsoRyRThFkhogsweNvhxfcMjlBHvMlRBjQRtNswgrFQxqZTZeYajXPjujyCUYYEehKBUrjfuilXywuFBESAMYOviZPpyAJFIIFIIoyfLTAHKXSZVoSfpxanbxJEihdwxXisDjJApnodVihSTjyUbSBxdSgQLeEMkbjxjfpeaKAjWlEViVHStEAUvCYPSashjdPcMWlGkazBRDJTqKGtToBkrfHyiVnzNdozlVJMeSDEuPPzykdZxPBmrggexMXvbpskIgenMaWtmJmOcprfKKcKYEcduftawWszG,,8,,8,True,,,,\r +,,7,Wx,cbm,lpiZcditLBGPWwtLIXjjEtMvsxaHLQRjdpGJdBwmmOmYevmQESSDMSvLKvNtAvkgDYcFoaOoSoDNnpEVXvZVynzlaxaewbJhjsCm,msloqUlvJplmblqgbRiyPYhvntDpxZxQkHZNBTehjiYmmIySxuMBOpcWNLmIsYjupdOYriGLFnUfYEYQNekGyWPWGxFHDluTxHSETFErLzOYLPcnomCpzntByKkxqJfiWfsCHwoLcDGNvBCDBAxZFuryblCoqPewfsGGIPfYroghexcImvmRvqtVXRrmTMiWTVIqaXtswYzzLWPaEPGWjzooUVnEoHLYJWDUDvYfumBXSAnCCJbxiKitVaFZQwvoABRWzWXSItuLbKYcijvKOZMMKzynzeIymEgvKCOtfkgRJlcSMFblmeysnosQHeDdxHakuAzkhiIAEVeynintBTQEkMKtLmGTRDrmajCezMZpHvKFDDKcVfsPDwSTYtzNZlAplNUBDyQlSKgzScpkrOIsQeSUUnFAWJhxeWgGXXuACkqnGcDbeOSRVDyvVzmzcaqhTiuQVDFDefJQpTCiErkkbMglshIVzkeQWaRrjCwlnTcRInCS,,7,,7,True,,,,\r +,,6,yC,uyC,CHQRfhjzzSLgVkexmvmMzhoBUFrWTXLLrWYZPzwEQMzFGrjXDghqFFoOibgVdeFRblyMRujtNNgWeQWHXFYDmsQFFGqIvZIIbWcB,DcclJQXtTkFBitTyFWhKRFQJRIKEEJkGdzqFLyNRwXsudbLcixwZVLbWOvygBwwAwdQpppPtLfSethvkbIucDQBKGArbSELbuyKyuKgZFgSRnvFGZWQvkNtxBmFOYeInsqdtKzZoNVfTLgLvreKZHEBnwYePtGZtBQIumAzqNGDQWJlbOTHlKFnQVDrOIZNXBKUOdHmxDjpjVRWtBAueOnArsPkqRMpzphjmbpZtDFJBBPcmkribqYZrQJlPcUFYbdfuMteAxQQfzUiphKVGhHQLXHqFfpMhXZuvLVyZVVpBnjglnrCAqLdFIxShuIBERprYjxETxtbPMcVQZdSYQpqJytOSxZRhIpCyazqtfWptnkCOuZXPAYcrfXFEVAvTBgkSqGewAMUJVuDSbWdPPlOCYPiazmOtuKfhkpHTXPWiMRAYuCEViqlRLuZsmfAxlzyKobbJPNOofDmqSkdzNBMqjfxkKhaTHBXDRFhoTnmYrsVFyiBn,,6,,6,True,,,,\r +,,5,nS,nNd,AttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHA,gKUOHfEUSMYTsBMuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqYettGJuXahRvvzUKNblmvvREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMhYWtTuTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRinUcDyTHhatcRMfvDcgHXQVtbKWtOnummsrIuXCQhrjkrhaNJGgnIwJurjTZsKpketNvICdibERdgydfBzlTMLOSSCNwtvmTWQZIfWWDKifZSDgDtRPTXDEoojNqxzlSQvYuDFbeEhwEDksXwMKiGgzTYguJPeYtIDzLApNpJkEyevnSLBYBKYvISplQQeVTKFhLMDuJgCltzeMgRMXyuFPQdfniLWOZaWjQjCIsyNKCmnRutKYRtBTwfLaNGzisdxJdaTJwhsbpBSLzOuTyzyBInQlEimJyxAjsQiiaePbjUFQBifiPZADYSMBNlDGB,,5,,5,True,,,,\r +,,4,aP,UNe,snWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRh,WVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHqyoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKLkiOGcKjdkqlHzMKObUUQsfnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGWhfEQiMIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHhHayPnSZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgnGzYvZJNSRTdkyO,,4,,4,True,,,,\r +,,3,nB,nFr,tcCqwfChXZpnZVLSwTNOBkNiYnnZdKwIrMIkuTssKrGRgiWYAdrPiSipjTupWRzFjKOrOAyCeOYXfzGVrSxDFuLaXUfUDOQSweYI,usvJKiKFYvRWdcgOYDbhkCDaBmSiPtkrfPxqfxQPkdzOtUSWoBPfTganEeiLoHRCaaSvhBSiEeoyfUZgguxtiyXWiPRjeHKaNPkCwUnOVjANRCnfgiWhLUywBuYiprPfpJMMUMsXSbQtnHMGmVzsPdYYpFyhpFOMeHaxuiyKAxIRlWEXebLeaqncdYzGsOTGXABSzfOIINjrftfGnZjIuzLOWPRPetSBUpdpfBhDNMdtQVQVlhaTiSakFwHHYUqkxiVXrUhXbvZBrHeqTKOeFDGxdFKkxkqXgKRUhoVGacapcExyjlcJZTVPAoupAUureKxhGRdloZHczeDsXtufJDaxmsKYtVNpDxLFXXmUIWYpjaAboIwOSavaWQyVUtgnHpAFdjTrfcoHASxDVfLgGiOzeLKdBQipsquZzSVuuCroemiXXLgjgkCDuAhIwXnCtDqhfkZRtTSMcnujfTpwzGdRtqlbzCJVJpgDgZYihadXoimzxROP,,3,,3,True,,,,\r +,,2,tJ,yPY,ECOtYrLdwGetDCcdxsePfNMGyDLJYVcCZKPmuMEGjdCgZvTfGPlcpTCCHHNkxxsyAXvRMdYOPvevgJRysqUQMjvfLQjwtPSQziMT,viQSVRHfPQBGxbxtlnvXFmoijesYgGXIVHcQvXNiMyjklSXNZkUCcAxRUpCNsWVYCoIptZYEmxRKCDXsXyGHAkmZMiqdPExJgTHhsfWkrCGjBfoCwbAdzGxpyfxobugTPvYjicsESiWTECNafbqnjJUMHBhXspthdpAOYNDehFMIbOGKpTjsBaNwpKAlQQfHxeHIGYGJbyEcOyxqVbwYewpUQOgXLVWvicwIvPlXRDSEOlZieTXDcsmcYmcutGzIEqcWPmswXdPvrhZxBzVCyvlFSFxZHrZfUBfBMlIsugfuQstCMTBkSCwCcUwNBrOYdeQOzxGZVRkbjMRYCciepXPxxyKcMjRCxxCWeKiHxzuPrphbVlFHyJhqXqTCnNsSFmhieClTCfZRuQwTeJIstkTTSOlYxGohmYipYFbxJKxDZJiNfetzTUEHAXAKeiuPeCDRHwiXJOLlXiBGdhHjtkkuTowHsfqmOJriOtNIfGPkLLjkQNUM,,2,,2,True,,,,\r +,,1,kD,yrO,OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgfygwwMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkI,SJoRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYRBMeyyMDHqJaRUhRIWrXPvhsBkDaUUqGWlGgOtOGMmjxWkIXHaMuFbhxZtpdpKffUFeWIXiiQEJkqHMBnIWUSmTtzQPxCHChpoevbLJoLoaeTOdoecveGprQFnIiUKKEpYEZAmggQBwBADUdRPPgdzUvZgpmmICiBlrDpeCZJgdPIafWpkAFEnzdkyayqYYDsBSUYJQTFjmsndLVIdVuddLEGHkdGfleMeRpzhKpLMcNfAQLKHuqnQTupqziQPtDuWeaDNKgeInGqiwepxskCITtNZPHaQJtQgiqhgVJjrsMnTvnROqGFqdfOBrcavXiOqkVCJTBJaheSjIcxLJjBictxYcwnRpQgwXJANVjpkZZlAblVvYAZQVZprkYSgycEomDwtYoobQmzvreXrwPGzRIvbhqlLqcgMBwUYuBMGhyKmqcTBaHZIRUVVQmxBeQv,,1,,1,True,,,,\r +''' + +snapshots['TestProjectAPI::test_project_create 1'] = { + 'actual_expenditure': 0, + 'budget_amount': 0, + 'dtype': None, + 'dtype_detail': None, + 'end_date': '2008-01-01', + 'event': None, + 'event_detail': None, + 'id': 1, + 'modified_at': '2019-03-23T00:00:00.123456Z', + 'name': 'Mock Project for Create API Test', + 'operation_type': 1, + 'operation_type_display': 'Emergency Operation', + 'primary_sector': 6, + 'primary_sector_display': 'Shelter', + 'programme_type': 2, + 'programme_type_display': 'Domestic', + 'project_country': 1, + 'project_country_detail': { + 'fdrs': None, + 'id': 1, + 'independent': None, + 'is_deprecated': False, + 'iso': 'IR', + 'iso3': 'Zmi', + 'name': 'HcqkdsmYSNrdDPaeyQrQQxgbsPyoyGTguFMIflmGDJTbcpHtvFzVkbwRwwOtpGrZdOqybJrojvzQifUyHRNORoApKjBtMvCIinPi', + 'record_type': 5, + 'record_type_display': 'Representative Office', + 'region': 1, + 'society_name': 'tSTHiBXjPKkueJIUhlujUbWuAAtCVOVrjXmgilbWNNrMKNoMooRbwfSXEiGMETPxlyFEikmocAWarAoVQmWnelCNFSuDpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBsNdSHjDPCfUGhlXLSIizAuCblDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnSnNdgKUOHfEUSMYTsBMuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqYettGJuXahRvvzUKNblmvvREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMhYWtTuTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRin' + }, + 'project_districts': [ + 1 + ], + 'project_districts_detail': [ + { + 'code': 'gMWkIuuRZt', + 'id': 1, + 'is_deprecated': False, + 'is_enclave': False, + 'name': 'faAOrAlJDTKWimlysJFctLtFJVDobYajqtOOEhPQsAlFSPpbhWrFeMVxLEKBqOREShxGUKbqkLdjuDSiwkdrxAOwdssHOeGmXOlW' + } + ], + 'reached_female': 0, + 'reached_male': 0, + 'reached_other': 0, + 'reached_total': 0, + 'regional_project': None, + 'regional_project_detail': None, + 'reporting_ns': 1, + 'reporting_ns_detail': { + 'fdrs': None, + 'id': 1, + 'independent': None, + 'is_deprecated': False, + 'iso': 'IR', + 'iso3': 'Zmi', + 'name': 'HcqkdsmYSNrdDPaeyQrQQxgbsPyoyGTguFMIflmGDJTbcpHtvFzVkbwRwwOtpGrZdOqybJrojvzQifUyHRNORoApKjBtMvCIinPi', + 'record_type': 5, + 'record_type_display': 'Representative Office', + 'region': 1, + 'society_name': 'tSTHiBXjPKkueJIUhlujUbWuAAtCVOVrjXmgilbWNNrMKNoMooRbwfSXEiGMETPxlyFEikmocAWarAoVQmWnelCNFSuDpBzXcMVyUuzNVKMIHPTYcHgCDcpHIzVcJyHWOdmsCztXsDkBsNdSHjDPCfUGhlXLSIizAuCblDLTmDfquSPTYkTUhfhTCOxfHTyUYGNkyJycXkvKQjkjlXTdAttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHAHnSnNdgKUOHfEUSMYTsBMuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqYettGJuXahRvvzUKNblmvvREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMhYWtTuTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRin' + }, + 'secondary_sectors': [ + ], + 'secondary_sectors_display': [ + ], + 'start_date': '2008-01-01', + 'status': 1, + 'status_display': 'Ongoing', + 'target_female': 0, + 'target_male': 0, + 'target_other': 0, + 'target_total': 0, + 'user': 2, + 'visibility': 'public' +} + snapshots['TestProjectAPI::test_project_update 1'] = { 'actual_expenditure': 0, 'budget_amount': 0, - 'current_status_display': 'Completed', 'dtype': 3, 'dtype_detail': { 'id': 3, @@ -547,15 +546,10 @@ snapshots['TestProjectAPI::test_project_delete 1'] = b'' -snapshots['TestProjectAPI::test_personnel_csv_api 1'] = '''country_from,deployment.comments,deployment.country_deployed_to.id,deployment.country_deployed_to.iso,deployment.country_deployed_to.iso3,deployment.country_deployed_to.name,deployment.country_deployed_to.society_name,deployment.event_deployed_to,deployment.id,end_date,id,is_active,name,role,start_date,type\r -,,10,go,obT,plfIgiUjOFBrwDSNpUHKDceuxcjMUOZgyGUfvOVtBzblVqUPVfBhYmKqtNGIYpSZdxKEnWBrVSXlrGQcMzlRsraAnbYAQirrDMYO,uoeNsUTMDLAOMvIyEJavvuwCjDVFnISkRyqzcQKfOFJwfnVHxtsWuCRDbjNLkNwKBAWbWsJVFpyIiyMhgznnhKslkXXVzJAwWnAMruXxOgQROWOuGIIzozFWDsCklzsaIvWDPlRgyLPAAAmObNoiNNGfMKUAbuNpkKOERfxbVMYPyJGmkDxUplETmuisebnKDDpRMCpYlDGPhZMvkpDUeaVcRRAHEyeYAqTIhTXMPITbCEUdsZzUXcxzTGOPCBYhgjqWLWYhUkxAQvjpYEnqgvPSeDTFWpWqvsSCvYCSqKrMcWijHsboxKxTstTkKOtETCRsjVZSijMsyqOobnLtjLaqxUGVHzENkwPjLGuHxyFPkHElEyaQevotnojrMXUYhPmwFDKOaVYYHoVmxQczOgvGerJIVIfZdCKHppqZVlSPpoSTDlcMrJrfVmUeiHtdnopLWLEDgIYduYOemEhCfEmgILnMFtKaLBhUCXPmLZONWDaqWAMr,,10,,10,True,,,,\r -,,9,lu,gSC,CcwiDUDrakwGGnwTHyGelPjwPUKvDTYirYWQtzePEyEMQlKTGXQHqiSuLLwLNzecbUkogQgFREuWoXZUYpglUyWAedNqhcVeCWxM,yiOKJmmqFCRsomVkBHZYmfLbOQgncZiaxXAKIevlRUUPHFmnKEGwwNJiZeCBOyeKfiYHtghFodMIvbosqyTwekseIKpHNGtzNdIShLEqPbcvAqmvWdinJUvWQdpFeZKNSWZcweAMVNfJEirUcgcFGoPwBEtYobdbXYZmIMyRRVbJEdyXySiBSBJihChNxwmvBdpofLaoAVWZYIKcZaUpdediClscuwMPpsiMzEQhQeeqInFTVwoCTtxXJsPpHruSIGgdwATNFrfniHotVJnhxUYjcpSCPWDhbFcrrLytfdrNyFbyyCconylQBIdQtcIWwbMWvqZWLnWbvUNBBYUVWdZgJyURsIDBKUKXHqkyDVpiarZRrfpXIsvKzcNrxrQqYPZXMahtKQuqlCDbCaDcwEOJnAdLfrNJueClqXYrqFioOljNPdohPclRGCLucJTodTqqbRwITcMpwgeGChGepnuKxRAePBsjbuMYxvAPxEsNbkxcsjLb,,9,,9,True,,,,\r -,,8,JX,yzM,vthgQaRJXivxVZxVXLHMxpPrnLyfgiOVMhcLPmmTCgeINvtUEWmIUjcimAJTqWJwxCOThBeEAHGYbkMrSiscKdYSmVzFRIGekCWG,rnlakKnLSaYGDGTUHqtosTrJhkocIpscOjrirYdPpnIhaPwOMxufTJqUiANsudOawoUrlqbIQXXLgUVSyPqOOMJnCournLOZWzjCoUUBxjEfFlDllmKFUlPsbtklzRMmejeBpDPzgUHiUWZaMgyybhaWPcipXfrjOMaYaYgIVvTfmiEWKCktvEjpdISrOIhbcgIsgGAjaoboByjwPsoRyRThFkhogsweNvhxfcMjlBHvMlRBjQRtNswgrFQxqZTZeYajXPjujyCUYYEehKBUrjfuilXywuFBESAMYOviZPpyAJFIIFIIoyfLTAHKXSZVoSfpxanbxJEihdwxXisDjJApnodVihSTjyUbSBxdSgQLeEMkbjxjfpeaKAjWlEViVHStEAUvCYPSashjdPcMWlGkazBRDJTqKGtToBkrfHyiVnzNdozlVJMeSDEuPPzykdZxPBmrggexMXvbpskIgenMaWtmJmOcprfKKcKYEcduftawWszG,,8,,8,True,,,,\r -,,7,Wx,cbm,lpiZcditLBGPWwtLIXjjEtMvsxaHLQRjdpGJdBwmmOmYevmQESSDMSvLKvNtAvkgDYcFoaOoSoDNnpEVXvZVynzlaxaewbJhjsCm,msloqUlvJplmblqgbRiyPYhvntDpxZxQkHZNBTehjiYmmIySxuMBOpcWNLmIsYjupdOYriGLFnUfYEYQNekGyWPWGxFHDluTxHSETFErLzOYLPcnomCpzntByKkxqJfiWfsCHwoLcDGNvBCDBAxZFuryblCoqPewfsGGIPfYroghexcImvmRvqtVXRrmTMiWTVIqaXtswYzzLWPaEPGWjzooUVnEoHLYJWDUDvYfumBXSAnCCJbxiKitVaFZQwvoABRWzWXSItuLbKYcijvKOZMMKzynzeIymEgvKCOtfkgRJlcSMFblmeysnosQHeDdxHakuAzkhiIAEVeynintBTQEkMKtLmGTRDrmajCezMZpHvKFDDKcVfsPDwSTYtzNZlAplNUBDyQlSKgzScpkrOIsQeSUUnFAWJhxeWgGXXuACkqnGcDbeOSRVDyvVzmzcaqhTiuQVDFDefJQpTCiErkkbMglshIVzkeQWaRrjCwlnTcRInCS,,7,,7,True,,,,\r -,,6,yC,uyC,CHQRfhjzzSLgVkexmvmMzhoBUFrWTXLLrWYZPzwEQMzFGrjXDghqFFoOibgVdeFRblyMRujtNNgWeQWHXFYDmsQFFGqIvZIIbWcB,DcclJQXtTkFBitTyFWhKRFQJRIKEEJkGdzqFLyNRwXsudbLcixwZVLbWOvygBwwAwdQpppPtLfSethvkbIucDQBKGArbSELbuyKyuKgZFgSRnvFGZWQvkNtxBmFOYeInsqdtKzZoNVfTLgLvreKZHEBnwYePtGZtBQIumAzqNGDQWJlbOTHlKFnQVDrOIZNXBKUOdHmxDjpjVRWtBAueOnArsPkqRMpzphjmbpZtDFJBBPcmkribqYZrQJlPcUFYbdfuMteAxQQfzUiphKVGhHQLXHqFfpMhXZuvLVyZVVpBnjglnrCAqLdFIxShuIBERprYjxETxtbPMcVQZdSYQpqJytOSxZRhIpCyazqtfWptnkCOuZXPAYcrfXFEVAvTBgkSqGewAMUJVuDSbWdPPlOCYPiazmOtuKfhkpHTXPWiMRAYuCEViqlRLuZsmfAxlzyKobbJPNOofDmqSkdzNBMqjfxkKhaTHBXDRFhoTnmYrsVFyiBn,,6,,6,True,,,,\r -,,5,nS,nNd,AttUXCsOlhimaNWqaDFFIZaMFpnLQEDACfMMapJrNOJndljdPwcjcQKMtvfdgAlkRsNQSSMKYJlDVLxcfXtuxyeWBJesEihSrvHA,gKUOHfEUSMYTsBMuqHKNwiNKFHUOFFZlNoTsmahbDOYhVnZNAAcvwJZOnaOmSsqYettGJuXahRvvzUKNblmvvREEZcPiEjODIvDYAVdHtKURuJIbnKRvZYwejrbvyOIkKMylMhYWtTuTcrAfFpxCtnHtlhxYcXmfCGbZEGjmvEUHtXujXgHRinUcDyTHhatcRMfvDcgHXQVtbKWtOnummsrIuXCQhrjkrhaNJGgnIwJurjTZsKpketNvICdibERdgydfBzlTMLOSSCNwtvmTWQZIfWWDKifZSDgDtRPTXDEoojNqxzlSQvYuDFbeEhwEDksXwMKiGgzTYguJPeYtIDzLApNpJkEyevnSLBYBKYvISplQQeVTKFhLMDuJgCltzeMgRMXyuFPQdfniLWOZaWjQjCIsyNKCmnRutKYRtBTwfLaNGzisdxJdaTJwhsbpBSLzOuTyzyBInQlEimJyxAjsQiiaePbjUFQBifiPZADYSMBNlDGB,,5,,5,True,,,,\r -,,4,aP,UNe,snWNHEJWPahQwCpPNNpcRuyYhyqIUsbHXxGZGCFcsPmuGfgkXIIaOenQOXnRBgnISVXBPeVRjbDTvcfedlYqJeKoqAyCOzBubyRh,WVLcSewGgsYRtMfsWCyzQbEkIoiVzYZIsOjtRYUPxaJJjhcaKMzIJftnVVUwnAPGjkloNqmhlQZKdWJDPJesQeqgmULFvwiQPpgsNemuFCvNQtSLjKKxZuBkaupYoTVPBrxiRUvEDCwXtFJglPMfriImqUOeUebGObLLzXLncJqIIEPXjxzoXLUsiDGGfzxGaQpZNRkWGiCklKKQjVUEwcoWFoeqxocQnHYxyEDccPugTHOrVqLIKlyPyxLPeHqyoHzwwFYEMaGiCkoeGPrnjlkxMThQoAZvUhEREEnLkPAbpciKLkiOGcKjdkqlHzMKObUUQsfnCMEEkoAMjYLXlNQGqkURvDMLeoyyigbmHGRAjMglENMcYIGWhfEQiMIaXRPBHAxcSHBoZEYXywLZVWSKgBiqEXofsMIAqmaTVYaKHhHayPnSZuAxgjBPLqqIBKxNrRzWnAJYJElxJJEqtKwXTzViQhVoCYSkgnGzYvZJNSRTdkyO,,4,,4,True,,,,\r -,,3,nB,nFr,tcCqwfChXZpnZVLSwTNOBkNiYnnZdKwIrMIkuTssKrGRgiWYAdrPiSipjTupWRzFjKOrOAyCeOYXfzGVrSxDFuLaXUfUDOQSweYI,usvJKiKFYvRWdcgOYDbhkCDaBmSiPtkrfPxqfxQPkdzOtUSWoBPfTganEeiLoHRCaaSvhBSiEeoyfUZgguxtiyXWiPRjeHKaNPkCwUnOVjANRCnfgiWhLUywBuYiprPfpJMMUMsXSbQtnHMGmVzsPdYYpFyhpFOMeHaxuiyKAxIRlWEXebLeaqncdYzGsOTGXABSzfOIINjrftfGnZjIuzLOWPRPetSBUpdpfBhDNMdtQVQVlhaTiSakFwHHYUqkxiVXrUhXbvZBrHeqTKOeFDGxdFKkxkqXgKRUhoVGacapcExyjlcJZTVPAoupAUureKxhGRdloZHczeDsXtufJDaxmsKYtVNpDxLFXXmUIWYpjaAboIwOSavaWQyVUtgnHpAFdjTrfcoHASxDVfLgGiOzeLKdBQipsquZzSVuuCroemiXXLgjgkCDuAhIwXnCtDqhfkZRtTSMcnujfTpwzGdRtqlbzCJVJpgDgZYihadXoimzxROP,,3,,3,True,,,,\r -,,2,tJ,yPY,ECOtYrLdwGetDCcdxsePfNMGyDLJYVcCZKPmuMEGjdCgZvTfGPlcpTCCHHNkxxsyAXvRMdYOPvevgJRysqUQMjvfLQjwtPSQziMT,viQSVRHfPQBGxbxtlnvXFmoijesYgGXIVHcQvXNiMyjklSXNZkUCcAxRUpCNsWVYCoIptZYEmxRKCDXsXyGHAkmZMiqdPExJgTHhsfWkrCGjBfoCwbAdzGxpyfxobugTPvYjicsESiWTECNafbqnjJUMHBhXspthdpAOYNDehFMIbOGKpTjsBaNwpKAlQQfHxeHIGYGJbyEcOyxqVbwYewpUQOgXLVWvicwIvPlXRDSEOlZieTXDcsmcYmcutGzIEqcWPmswXdPvrhZxBzVCyvlFSFxZHrZfUBfBMlIsugfuQstCMTBkSCwCcUwNBrOYdeQOzxGZVRkbjMRYCciepXPxxyKcMjRCxxCWeKiHxzuPrphbVlFHyJhqXqTCnNsSFmhieClTCfZRuQwTeJIstkTTSOlYxGohmYipYFbxJKxDZJiNfetzTUEHAXAKeiuPeCDRHwiXJOLlXiBGdhHjtkkuTowHsfqmOJriOtNIfGPkLLjkQNUM,,2,,2,True,,,,\r -,,1,kD,yrO,OhbVrpoiVgRVIfLBcbfnoGMbJmTPSIAoCLrZaWZkSBvrjnWvgfygwwMqZcUDIhyfJsONxKmTecQoXsfogyrDOxkxwnQrSRPeMOkI,SJoRuXXdocZuzrenKTunPFzPDjqipVJIqVLBLzxoiGFfWdhjOkYRBMeyyMDHqJaRUhRIWrXPvhsBkDaUUqGWlGgOtOGMmjxWkIXHaMuFbhxZtpdpKffUFeWIXiiQEJkqHMBnIWUSmTtzQPxCHChpoevbLJoLoaeTOdoecveGprQFnIiUKKEpYEZAmggQBwBADUdRPPgdzUvZgpmmICiBlrDpeCZJgdPIafWpkAFEnzdkyayqYYDsBSUYJQTFjmsndLVIdVuddLEGHkdGfleMeRpzhKpLMcNfAQLKHuqnQTupqziQPtDuWeaDNKgeInGqiwepxskCITtNZPHaQJtQgiqhgVJjrsMnTvnROqGFqdfOBrcavXiOqkVCJTBJaheSjIcxLJjBictxYcwnRpQgwXJANVjpkZZlAblVvYAZQVZprkYSgycEomDwtYoobQmzvreXrwPGzRIvbhqlLqcgMBwUYuBMGhyKmqcTBaHZIRUVVQmxBeQv,,1,,1,True,,,,\r -''' +snapshots['TestProjectAPI::test_project_list_zero 1'] = { + 'count': 0, + 'next': None, + 'previous': None, + 'results': [ + ] +} diff --git a/deployments/test_views.py b/deployments/test_views.py index 81e3b1227..34f37d4cc 100644 --- a/deployments/test_views.py +++ b/deployments/test_views.py @@ -1,6 +1,7 @@ import json import datetime from unittest import mock +from django.core import management from modeltranslation.utils import build_localized_fieldname from django.conf import settings @@ -374,23 +375,28 @@ def test_regional_project_get(self): 'links': sorted(resp['links'], key=lambda item: dict_to_string(item)), }) - @mock.patch('deployments.models.timezone') - def test_project_current_status(self, mock_timezone): + def test_project_current_status(self): + Project.objects.all().delete() project = ProjectFactory.create( start_date=datetime.date(2012, 11, 12), end_date=datetime.date(2012, 12, 13), status=Statuses.PLANNED.value, ) self.authenticate() + + patcher = mock.patch('django.utils.timezone.now') + mock_timezone_now = patcher.start() for now, current_status in [ (datetime.date(2011, 11, 11), Statuses.PLANNED), (datetime.date(2012, 11, 15), Statuses.ONGOING), (datetime.date(2012, 12, 14), Statuses.COMPLETED), ]: - mock_timezone.now.return_value.date.return_value = now + mock_timezone_now.return_value.date.return_value = now + management.call_command('update_project_status') response = self.client.get(f'/api/v2/project/{project.id}/') self.assert_200(response) - self.assertEqual(response.data['current_status_display'], str(current_status)) + self.assertEqual(response.data['status_display'], str(current_status)) + patcher.stop() class TranslationTest(APITestCase): diff --git a/docker-compose.yml b/docker-compose.yml index 98f069e05..f2f490ee6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -111,7 +111,7 @@ services: test: <<: *base_django_setup - command: python manage.py test -k + command: pytest --durations=10 test_snapshot_update: <<: *base_django_setup diff --git a/lang/tests.py b/lang/tests.py index 477b803b3..83730dc29 100644 --- a/lang/tests.py +++ b/lang/tests.py @@ -1,6 +1,5 @@ from django.conf import settings from django.core import management -from django.contrib.auth import get_permission_codename from django.contrib.auth.models import User, Permission from main.test_case import APITestCase diff --git a/main/runserver.sh b/main/runserver.sh index 7aa08252f..b5b35edef 100755 --- a/main/runserver.sh +++ b/main/runserver.sh @@ -48,6 +48,7 @@ printenv | sed 's/^\([a-zA-Z0-9_]*\)=\(.*\)$/export \1="\2"/g' > $HOME/.env (crontab -l 2>/dev/null; echo '10 2 * * * . /home/ifrc/.env; python /home/ifrc/go-api/manage.py scrape_pdfs >> /home/ifrc/logs/scrape_pdfs.log 2>&1') | crontab - (crontab -l 2>/dev/null; echo '30 1 * * * . /home/ifrc/.env; python /home/ifrc/go-api/manage.py ingest_databank >> /home/ifrc/logs/ingest_databank.log 2>&1') | crontab - (crontab -l 2>/dev/null; echo '*/5 * * * * . /home/ifrc/.env; python /home/ifrc/go-api/manage.py sync_molnix >> /home/ifrc/logs/sync_molnix.log 2>&1') | crontab - +(crontab -l 2>/dev/null; echo '* */6 * * * . /home/ifrc/.env; python /home/ifrc/go-api/manage.py update_project_status >> /home/ifrc/logs/update_project_status.log 2>&1') | crontab - service cron start tail -n 0 -f $HOME/logs/*.log & diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 000000000..0734a80fe --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +DJANGO_SETTINGS_MODULE = main.settings +log_cli = true +python_files = test*.py *_tests.py diff --git a/requirements.txt b/requirements.txt index b93cf71f4..451ce676f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -48,6 +48,7 @@ djangorestframework-csv==2.1.0 djangorestframework-guardian==0.1.1 djangorestframework==3.11.2 elasticsearch==6.0.0 +factory_boy==2.12.0 futures==3.1.1 fuzzywuzzy==0.17.0 graphene-django==2.0.0 @@ -69,6 +70,8 @@ promise==2.1 psycopg2==2.7.3.2 pycountry==19.8.18 pycparser==2.19 +pydash==4.8.0 +pytest-django==4.2.0 python-Levenshtein==0.12.0 python-dateutil==2.8.0 python-mimeparse==1.6.0 @@ -79,6 +82,7 @@ requests==2.21.0 setuptools==45 singledispatch==3.4.0.3 six==1.12.0 +snapshottest==0.5.1 tabula-py==1.2.0 typing==3.6.2 unicodecsv==0.14.1 @@ -87,6 +91,3 @@ urllib3==1.24.2 urllib3==1.24.2 wheel==0.30.0 xmltodict==0.11.0 -snapshottest==0.5.1 -factory_boy==2.12.0 -pydash==4.8.0