diff --git a/.gitignore b/.gitignore index f27d1d58c..55c197741 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ __pycache__ __pycache__/* *.pyc migrations +requirements.txt +.gitignore +**/migrations/* diff --git a/cpims/__pycache__/apps.cpython-310.pyc b/cpims/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index e65a834a4..000000000 Binary files a/cpims/__pycache__/apps.cpython-310.pyc and /dev/null differ diff --git a/cpims/settings.py b/cpims/settings.py index 6c296b00e..c3069627a 100644 --- a/cpims/settings.py +++ b/cpims/settings.py @@ -56,6 +56,7 @@ 'cpovc_help', 'cpovc_ctip', 'cpovc_afc', + 'cpovc_mobile', 'cpovc_stat_inst', 'cpovc_institutions', 'notifications', @@ -105,8 +106,13 @@ 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'cpims_gok', +<<<<<<< HEAD + 'USER': 'postgres', + 'PASSWORD': 'test', +======= 'USER': 'cpimsdbuser', 'PASSWORD': 'Xaen!ee8', +>>>>>>> mobile_approval 'HOST': '127.0.0.1', 'PORT': '5432', } } diff --git a/cpovc_afc/migrations/0001_initial.py b/cpovc_afc/migrations/0001_initial.py index e1cecf136..0c9368cc2 100644 --- a/cpovc_afc/migrations/0001_initial.py +++ b/cpovc_afc/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.utils.timezone diff --git a/cpovc_afc/migrations/0002_auto_20221108_0852.py b/cpovc_afc/migrations/0002_auto_20221108_0852.py deleted file mode 100644 index f08fc58ac..000000000 --- a/cpovc_afc/migrations/0002_auto_20221108_0852.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models -from django.conf import settings - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_forms', '0001_initial'), - ('cpovc_afc', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='afcmain', - name='case', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_forms.OVCCaseRecord'), - ), - migrations.AddField( - model_name='afcmain', - name='created_by', - field=models.ForeignKey(on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL, blank=True), - ), - ] diff --git a/cpovc_afc/migrations/0002_initial.py b/cpovc_afc/migrations/0002_initial.py index 6d44a3084..c5b5fa674 100644 --- a/cpovc_afc/migrations/0002_initial.py +++ b/cpovc_afc/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('cpovc_forms', '0001_initial'), ('cpovc_afc', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/cpovc_afc/migrations/0003_auto_20221108_0852.py b/cpovc_afc/migrations/0003_auto_20221108_0852.py deleted file mode 100644 index f87957951..000000000 --- a/cpovc_afc/migrations/0003_auto_20221108_0852.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models -from django.conf import settings - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_registry', '0001_initial'), - ('cpovc_afc', '0002_auto_20221108_0852'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_forms', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='afcmain', - name='org_unit', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_registry.RegOrgUnit'), - ), - migrations.AddField( - model_name='afcmain', - name='person', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_registry.RegPerson'), - ), - migrations.AddField( - model_name='afcinfo', - name='care', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_afc.AFCMain'), - ), - migrations.AddField( - model_name='afcinfo', - name='person', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_registry.RegPerson'), - ), - migrations.AddField( - model_name='afcforms', - name='event', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_afc.AFCEvents'), - ), - migrations.AddField( - model_name='afcevents', - name='care', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_afc.AFCMain'), - ), - migrations.AddField( - model_name='afcevents', - name='case', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_forms.OVCCaseRecord'), - ), - migrations.AddField( - model_name='afcevents', - name='created_by', - field=models.ForeignKey(on_delete=models.CASCADE, to=settings.AUTH_USER_MODEL, blank=True), - ), - migrations.AddField( - model_name='afcevents', - name='person', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_registry.RegPerson'), - ), - ] diff --git a/cpovc_afc/migrations/0003_initial.py b/cpovc_afc/migrations/0003_initial.py index 4a8a3f79d..ca88f76ce 100644 --- a/cpovc_afc/migrations/0003_initial.py +++ b/cpovc_afc/migrations/0003_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_registry', '0001_initial'), - ('cpovc_forms', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('cpovc_afc', '0002_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cpovc_forms', '0001_initial'), + ('cpovc_registry', '0001_initial'), ] operations = [ diff --git a/cpovc_afc/migrations/0004_alter_afcforms_item_value.py b/cpovc_afc/migrations/0004_alter_afcforms_item_value.py deleted file mode 100644 index 62a10167d..000000000 --- a/cpovc_afc/migrations/0004_alter_afcforms_item_value.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-04-23 08:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_afc', '0003_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='afcforms', - name='item_value', - field=models.CharField(max_length=10), - ), - ] diff --git a/cpovc_afc/migrations/0004_alter_afcquestions_id.py b/cpovc_afc/migrations/0004_alter_afcquestions_id.py deleted file mode 100644 index 3f8d13d58..000000000 --- a/cpovc_afc/migrations/0004_alter_afcquestions_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.3 on 2022-11-08 06:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_afc', '0003_auto_20221108_0852'), - ] - - operations = [ - migrations.AlterField( - model_name='afcquestions', - name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), - ), - ] diff --git a/cpovc_afc/migrations/0005_afcmain_care_sub_type.py b/cpovc_afc/migrations/0005_afcmain_care_sub_type.py deleted file mode 100644 index e1c2276f1..000000000 --- a/cpovc_afc/migrations/0005_afcmain_care_sub_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.3 on 2022-11-14 07:39 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_afc', '0004_alter_afcquestions_id'), - ] - - operations = [ - migrations.AddField( - model_name='afcmain', - name='care_sub_type', - field=models.CharField(blank=True, max_length=5, null=True), - ), - ] diff --git a/cpovc_afc/migrations/0006_alter_afcinfo_item_value.py b/cpovc_afc/migrations/0006_alter_afcinfo_item_value.py deleted file mode 100644 index 828f97041..000000000 --- a/cpovc_afc/migrations/0006_alter_afcinfo_item_value.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.0.4 on 2023-04-23 11:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_afc', '0005_afcmain_care_sub_type'), - ] - - operations = [ - migrations.AlterField( - model_name='afcinfo', - name='item_value', - field=models.CharField(max_length=10), - ), - ] diff --git a/cpovc_api/functions.py b/cpovc_api/functions.py index 50973aece..fe47c13e3 100644 --- a/cpovc_api/functions.py +++ b/cpovc_api/functions.py @@ -1,12 +1,20 @@ import json import uuid from django.utils import timezone +from django.db.models import Count + from cpovc_main.models import ListQuestions from cpovc_main.functions import convert_date, get_days_difference from cpovc_afc.models import AFCMain, AFCEvents -from cpovc_forms.models import OVCPlacement -from cpovc_registry.models import RegOrgUnit +from cpovc_forms.models import OVCPlacement, OVCCaseCategory, OVCCaseRecord +from cpovc_registry.models import ( + RegOrgUnit, RegPerson, RegPersonsOrgUnits, RegPersonsTypes, + RegPersonsExternalIds) + +from cpovc_auth.models import AppUser +from cpovc_ovc.models import OVCRegistration + from django.conf import settings MEDIA_ROOT = settings.MEDIA_ROOT @@ -356,4 +364,234 @@ def get_data(request, f_id, f_type=1): print('Error - %s' % str(e)) return None else: - return f_data \ No newline at end of file + return f_data + + +def get_child_units(org_ids): + """Method to do the organisation tree.""" + try: + # print org_ids + orgs = RegOrgUnit.objects.filter( + parent_org_unit_id__in=org_ids).values_list('id', flat=True) + print('Check Org Unit level - %s' % (str(orgs))) + except Exception as e: + print('No parent unit - %s' % (str(e))) + return [] + else: + return list(orgs) + + +def get_attached_orgs(request): + """Method to get attached units.""" + try: + orgs = [] + dcs = 'Directorate of Children Services (DCS)' + person_id = request.user.reg_person_id + person_orgs = RegPersonsOrgUnits.objects.filter( + person_id=person_id, is_void=False) + reg_pri, reg_ovc, reg_pri_name = 2, False, dcs + all_roles, all_ous = [], [] + for p_org in person_orgs: + p_roles = [] + org_id = p_org.org_unit_id + org_name = p_org.org_unit.org_unit_name + reg_assist = p_org.reg_assistant + if reg_assist: + p_roles.append('REGA') + all_roles.append('REGA') + reg_prim = p_org.primary_unit + if reg_prim: + reg_pri = org_id + reg_pri_name = org_name + reg_ovc = p_org.org_unit.handle_ovc + if reg_ovc: + p_roles.append('ROVC') + all_roles.append('ROVC') + reg_ovc = True + pvals = {org_id: p_roles} + orgs.append(pvals) + all_ous.append(str(org_id)) + # allroles = ','.join(list(set(all_roles))) + # allous = ','.join(all_ous) + child_ous = get_child_units([reg_pri]) + vals = {'perms': orgs, 'ou_id': reg_pri, + 'attached_ou': all_ous, 'perms_ou': all_roles, + 'reg_ovc': reg_ovc, 'ou_name': reg_pri_name, + 'ou_attached': child_ous} + except Exception as e: + print('Error with dashboard - %s' % (str(e))) + return {} + else: + return vals + + +def dcs_dashboard(request, params): + """Method to get dashboard totals.""" + try: + dash = {} + vals = {'TBVC': 0, 'TBGR': 0, 'TWGE': 0, 'TWNE': 0} + pr_ouid = int(request.session.get('ou_primary', 0)) + if request.user.is_superuser or pr_ouid == 2: + person_types = RegPersonsTypes.objects.filter( + is_void=False, date_ended=None).values( + 'person_type_id').annotate(dc=Count('person_type_id')) + for person_type in person_types: + vals[person_type['person_type_id']] = person_type['dc'] + dash['children'] = vals['TBVC'] + dash['caregivers'] = vals['TBGR'] + dash['government'] = vals['TWGE'] + dash['ngo'] = vals['TWNE'] + # Get org units + org_units = RegOrgUnit.objects.filter(is_void=False).count() + dash['org_units'] = org_units + # Case categories to find pending cases + cases_category = OVCCaseCategory.objects.filter(is_void=False) + # Case records counts + case_records = OVCCaseRecord.objects.filter(is_void=False) + case_counts = cases_category.count() + dash['case_records'] = case_counts + # Workforce members + workforce_members = RegPersonsExternalIds.objects.filter( + identifier_type_id='IWKF', is_void=False).count() + workforce_members = AppUser.objects.distinct( + 'reg_person_id').count() + dash['workforce_members'] = workforce_members + # Get pending + cases = case_records.filter(case_stage=0).values_list( + 'case_id', flat=True).distinct() + pending_count = cases_category.filter( + case_id_id__in=cases).count() + dash['pending_cases'] = pending_count + # Child registrations + ptypes = RegPersonsTypes.objects.filter( + person_type_id='TBVC', is_void=False, + date_ended=None).values_list('person_id', flat=True) + cregs = RegPerson.objects.filter(id__in=ptypes).values( + 'created_at').annotate(unit_count=Count('created_at')) + # Institution Population + dash['inst_pop'] = {'B': 0, 'G': 0} + else: + # Org units + cbo_id = request.session.get('ou_primary', 0) + cbo_ids = request.session.get('ou_attached', []) + print(cbo_ids) + org_id = int(cbo_id) + org_ids = get_orgs_child(org_id) + # Workforce members using Appuser + person_orgs = RegPersonsOrgUnits.objects.select_related().filter( + org_unit_id__in=org_ids, is_void=False, + date_delinked=None).values_list('person_id', flat=True) + users = AppUser.objects.filter( + reg_person_id__in=person_orgs) + user_ids = users.values_list('id', flat=True) + print('user ids', user_ids) + users_count = users.count() + dash['workforce_members'] = users_count + person_types = RegPersonsTypes.objects.filter( + is_void=False, date_ended=None, + person__created_by_id__in=user_ids).values( + 'person_type_id').annotate(dc=Count('person_type_id')) + for person_type in person_types: + vals[person_type['person_type_id']] = person_type['dc'] + dash['children'] = vals['TBVC'] + dash['caregivers'] = vals['TBGR'] + dash['government'] = vals['TWGE'] + dash['ngo'] = vals['TWNE'] + # Get org units + orgs_count = len(org_ids) - 1 if len(org_ids) > 1 else 1 + dash['org_units'] = orgs_count + # Org unit cases + case_ids = OVCCaseGeo.objects.select_related().filter( + report_orgunit_id__in=org_ids, + is_void=False).values_list('case_id_id', flat=True) + # Case records counts + case_records = OVCCaseRecord.objects.filter( + case_id__in=case_ids, is_void=False) + # Case categories to find pending cases + cases_category = OVCCaseCategory.objects.filter( + is_void=False, case_id_id__in=case_ids) + case_counts = cases_category.count() + dash['case_records'] = case_counts + # Get pending + cases = case_records.filter( + case_stage=0, case_id__in=case_ids).values_list( + 'case_id', flat=True).distinct() + pending_count = cases_category.filter( + case_id_id__in=cases).count() + dash['pending_cases'] = pending_count + # Child registrations + ptypes = RegPersonsTypes.objects.filter( + person_type_id='TBVC', is_void=False, + date_ended=None).values_list('person_id', flat=True) + cregs = RegPerson.objects.filter( + id__in=ptypes, created_by_id__in=user_ids).values( + 'created_at').annotate(unit_count=Count('created_at')) + # Institution Population + inst_pop = {'B': 0, 'G': 0} + ou_type = request.session.get('ou_type', None) + print('OU TYPE', ou_type) + if ou_type: + inst_id = request.session.get('ou_primary', 0) + ou_attached = request.session.get('ou_attached', 0) + print('OU ID', inst_id, ou_attached) + inst_pops = OVCPlacement.objects.filter( + residential_institution_name=str(inst_id), + is_active=True, is_void=False).values( + 'person__sex_id').annotate( + dcount=Count('person__sex_id')) + for ipop in inst_pops: + if str(ipop['person__sex_id']) == 'SFEM': + inst_pop['G'] = ipop['dcount'] + else: + inst_pop['B'] = ipop['dcount'] + dash['inst_pop'] = inst_pop + # OVC + oregs = OVCRegistration.objects.values( + 'registration_date').annotate( + unit_count=Count('registration_date')) + child_regs, case_regs, ovc_regs = {}, {}, {} + for creg in cregs: + the_date = creg['created_at'] + # cdate = '1900-01-01' + cdate = the_date.strftime('%d-%b-%y') + # child_regs[str(cdate)] = creg['unit_count'] + for oreg in oregs: + the_date = oreg['registration_date'] + # cdate = the_date.strftime('%d-%b-%y') + # ovc_regs[str(cdate)] = oreg['unit_count'] + # Case Records + ovc_regs = case_records.values( + 'date_case_opened').annotate(unit_count=Count('date_case_opened')) + for ovc_reg in ovc_regs: + the_date = ovc_reg['date_case_opened'] + # cdate = '1900-01-01' + # cdate = the_date.strftime('%d-%b-%y') + # case_regs[str(cdate)] = ovc_reg['unit_count'] + # Case categories Top 5 + case_categories = cases_category.values( + 'case_category').annotate(unit_count=Count( + 'case_category')).order_by('-unit_count') + dash['child_regs'] = child_regs + dash['ovc_regs'] = [] + dash['case_regs'] = case_regs + dash['case_cats'] = [] + except Exception as e: + print('error with dash - %s' % (str(e))) + dash = {} + dash['children'] = 0 + dash['caregivers'] = 0 + dash['government'] = 0 + dash['ngo'] = 0 + dash['org_units'] = 0 + dash['case_records'] = 0 + dash['workforce_members'] = 0 + dash['pending_cases'] = 0 + dash['child_regs'] = [] + dash['ovc_regs'] = [] + dash['case_regs'] = [] + dash['case_cats'] = 0 + # Institution Population + dash['inst_pop'] = {'B': 0, 'G': 0} + return dash + else: + return dash diff --git a/cpovc_api/urls.py b/cpovc_api/urls.py index 969a94a9e..1293025e4 100644 --- a/cpovc_api/urls.py +++ b/cpovc_api/urls.py @@ -18,5 +18,6 @@ # path('crs-old/', views.BasicCRSView.as_view()), path('crs/', views.basic_crs), path('lookup/', views.get_settings, name='settings_lookup'), - path('dreams/', views.dreams), + path('dreams/', views.dreams), + path('user/', views.user_account), ] diff --git a/cpovc_api/views.py b/cpovc_api/views.py index e34304e5f..0d30df73b 100644 --- a/cpovc_api/views.py +++ b/cpovc_api/views.py @@ -455,3 +455,41 @@ def dreams(request): return Response({'details': msg}) else: return Response(results) + + +@api_view(['GET', 'POST']) +def user_account(request): + try: + results = {'status': 0, 'message': 'Does not exist'} + if request.method == 'GET': + # account_id = request.user.id + print(request.query_params) + cpims_id = request.query_params.get('person_id') + username = request.query_params.get('username') + if username and cpims_id: + user = AppUser.objects.filter(username=username) + if user.exists(): + results = {'status': 1, 'message': 'Existing username'} + else: + regp = AppUser.objects.filter(reg_person_id=cpims_id) + if regp.exists(): + results = {'status': 2, 'message': 'Existing account'} + else: + results = {'status': 3, 'message': 'Missing Params'} + if request.method == 'POST': + cpims_id = request.data.get('person_id') + username = request.data.get('username') + password = request.data.get('password') + if username and cpims_id and password: + user = AppUser.objects.create_user( + username=username, reg_person=cpims_id, + password=password) + results = {'status': 4, 'message': 'Success', 'user_id': user.id} + else: + results = {'status': 5, 'message': 'Missing Params', 'user_id': 0} + except Exception as e: + msg = 'Error getting OVC details - %s' % (str(e)) + print(msg) + return Response({'status': 9, 'message': 'Error'}) + else: + return Response(results) \ No newline at end of file diff --git a/cpovc_auth/migrations/0001_initial.py b/cpovc_auth/migrations/0001_initial.py index 65d2c0d98..c1fd1a0dc 100644 --- a/cpovc_auth/migrations/0001_initial.py +++ b/cpovc_auth/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 import django.contrib.auth.models from django.db import migrations, models diff --git a/cpovc_auth/migrations/0002_initial.py b/cpovc_auth/migrations/0002_initial.py index a964596ec..dbd7bd133 100644 --- a/cpovc_auth/migrations/0002_initial.py +++ b/cpovc_auth/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_auth', '0001_initial'), ('cpovc_main', '0002_initial'), - ('cpovc_registry', '0001_initial'), + ('cpovc_auth', '0001_initial'), ('auth', '0012_alter_user_first_name_max_length'), + ('cpovc_registry', '0001_initial'), ] operations = [ diff --git a/cpovc_auth/migrations/0003_alter_appuser_password_changed_timestamp.py b/cpovc_auth/migrations/0003_alter_appuser_password_changed_timestamp.py deleted file mode 100644 index 699dca51c..000000000 --- a/cpovc_auth/migrations/0003_alter_appuser_password_changed_timestamp.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.0.4 on 2023-04-23 11:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_auth', '0002_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='appuser', - name='password_changed_timestamp', - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/cpovc_ctip/migrations/0001_initial.py b/cpovc_ctip/migrations/0001_initial.py index a1cd8d214..8ca175ce9 100644 --- a/cpovc_ctip/migrations/0001_initial.py +++ b/cpovc_ctip/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.utils.timezone diff --git a/cpovc_ctip/migrations/0002_ctipmain_case.py b/cpovc_ctip/migrations/0002_ctipmain_case.py deleted file mode 100644 index 9a82838a7..000000000 --- a/cpovc_ctip/migrations/0002_ctipmain_case.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_forms', '0001_initial'), - ('cpovc_ctip', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='ctipmain', - name='case', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_forms.OVCCaseRecord'), - ), - ] diff --git a/cpovc_ctip/migrations/0002_initial.py b/cpovc_ctip/migrations/0002_initial.py index 6891d67f2..08beb03a2 100644 --- a/cpovc_ctip/migrations/0002_initial.py +++ b/cpovc_ctip/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion @@ -9,8 +9,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_forms', '0001_initial'), ('cpovc_ctip', '0001_initial'), + ('cpovc_forms', '0001_initial'), ] operations = [ diff --git a/cpovc_ctip/migrations/0003_auto_20221108_0852.py b/cpovc_ctip/migrations/0003_auto_20221108_0852.py deleted file mode 100644 index d36704264..000000000 --- a/cpovc_ctip/migrations/0003_auto_20221108_0852.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_registry', '0001_initial'), - ('cpovc_forms', '0001_initial'), - ('cpovc_ctip', '0002_ctipmain_case'), - ] - - operations = [ - migrations.AddField( - model_name='ctipmain', - name='person', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_registry.RegPerson'), - ), - migrations.AddField( - model_name='ctipforms', - name='event', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_ctip.CTIPEvents'), - ), - migrations.AddField( - model_name='ctipevents', - name='case', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_forms.OVCCaseRecord'), - ), - migrations.AddField( - model_name='ctipevents', - name='person', - field=models.ForeignKey(on_delete=models.CASCADE, to='cpovc_registry.RegPerson'), - ), - ] diff --git a/cpovc_ctip/migrations/0003_initial.py b/cpovc_ctip/migrations/0003_initial.py index aa5a65c0a..c91b56692 100644 --- a/cpovc_ctip/migrations/0003_initial.py +++ b/cpovc_ctip/migrations/0003_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion diff --git a/cpovc_ctip/migrations/0004_alter_ctipmain_id.py b/cpovc_ctip/migrations/0004_alter_ctipmain_id.py deleted file mode 100644 index c0ed93d83..000000000 --- a/cpovc_ctip/migrations/0004_alter_ctipmain_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.3 on 2022-11-08 06:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_ctip', '0003_auto_20221108_0852'), - ] - - operations = [ - migrations.AlterField( - model_name='ctipmain', - name='id', - field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), - ), - ] diff --git a/cpovc_forms/migrations/0001_initial.py b/cpovc_forms/migrations/0001_initial.py index e5a702f17..a5821b92f 100644 --- a/cpovc_forms/migrations/0001_initial.py +++ b/cpovc_forms/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 import datetime from django.db import migrations, models diff --git a/cpovc_forms/migrations/0002_initial.py b/cpovc_forms/migrations/0002_initial.py index da99e4764..71c2aeb67 100644 --- a/cpovc_forms/migrations/0002_initial.py +++ b/cpovc_forms/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -11,11 +11,11 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_forms', '0001_initial'), + ('cpovc_ovc', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_main', '0002_initial'), + ('cpovc_forms', '0001_initial'), ('cpovc_registry', '0001_initial'), - ('cpovc_ovc', '0001_initial'), + ('cpovc_main', '0002_initial'), ] operations = [ diff --git a/cpovc_forms/migrations/0003_ovccaselocation_report_city_and_more.py b/cpovc_forms/migrations/0003_ovccaselocation_report_city_and_more.py deleted file mode 100644 index 2e8804166..000000000 --- a/cpovc_forms/migrations/0003_ovccaselocation_report_city_and_more.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 4.0.4 on 2022-11-20 10:28 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0002_initial'), - ('cpovc_forms', '0002_initial'), - ] - - operations = [ - migrations.AddField( - model_name='ovccaselocation', - name='report_city', - field=models.CharField(max_length=150, null=True), - ), - migrations.AddField( - model_name='ovccaselocation', - name='report_country_code', - field=models.CharField(max_length=4, null=True), - ), - migrations.AddField( - model_name='ovccaselocation', - name='report_sublocation', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='sub_location', to='cpovc_main.setuplocation'), - ), - migrations.AlterField( - model_name='ovccaselocation', - name='case', - field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='cpovc_forms.ovccaserecord'), - ), - migrations.AlterField( - model_name='ovccaselocation', - name='report_location', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='location', to='cpovc_main.setuplocation'), - ), - ] diff --git a/cpovc_help/migrations/0001_initial.py b/cpovc_help/migrations/0001_initial.py index d2d27a71f..44cd10ca6 100644 --- a/cpovc_help/migrations/0001_initial.py +++ b/cpovc_help/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models diff --git a/cpovc_help/migrations/0002_initial.py b/cpovc_help/migrations/0002_initial.py index daad57672..bb81ce3b3 100644 --- a/cpovc_help/migrations/0002_initial.py +++ b/cpovc_help/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion diff --git a/cpovc_main/migrations/0001_initial.py b/cpovc_main/migrations/0001_initial.py index 21cc1b8ea..b97c453b5 100644 --- a/cpovc_main/migrations/0001_initial.py +++ b/cpovc_main/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion @@ -340,6 +340,8 @@ class Migration(migrations.Migration): ('timestamp_created', models.DateTimeField(auto_now=True, null=True)), ('timestamp_updated', models.DateTimeField(auto_now=True, null=True)), ('is_void', models.BooleanField(default=False)), + ('db_field_name', models.CharField(blank=True, max_length=60, null=True)), + ('question_number', models.CharField(blank=True, max_length=10, null=True)), ('form', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cpovc_main.forms')), ], options={ diff --git a/cpovc_main/migrations/0002_initial.py b/cpovc_main/migrations/0002_initial.py index 5c41698e9..8ec7a316a 100644 --- a/cpovc_main/migrations/0002_initial.py +++ b/cpovc_main/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion diff --git a/cpovc_main/migrations/0003_alter_setuplist_item_description_short.py b/cpovc_main/migrations/0003_alter_setuplist_item_description_short.py deleted file mode 100644 index 0c43df841..000000000 --- a/cpovc_main/migrations/0003_alter_setuplist_item_description_short.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-06-26 08:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0002_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='setuplist', - name='item_description_short', - field=models.CharField(max_length=100, null=True), - ), - ] diff --git a/cpovc_main/migrations/0004_alter_forms_date_ended_alter_forms_form_area_id_and_more.py b/cpovc_main/migrations/0004_alter_forms_date_ended_alter_forms_form_area_id_and_more.py deleted file mode 100644 index e481707f6..000000000 --- a/cpovc_main/migrations/0004_alter_forms_date_ended_alter_forms_form_area_id_and_more.py +++ /dev/null @@ -1,58 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 11:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0003_alter_setuplist_item_description_short'), - ] - - operations = [ - migrations.AlterField( - model_name='forms', - name='date_ended', - field=models.DateField(blank=True, null=True), - ), - migrations.AlterField( - model_name='forms', - name='form_area_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='forms', - name='form_guid', - field=models.CharField(max_length=10), - ), - migrations.AlterField( - model_name='forms', - name='form_subject_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='forms', - name='form_title', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AlterField( - model_name='forms', - name='form_type_id', - field=models.CharField(blank=True, max_length=4, null=True), - ), - migrations.AlterField( - model_name='forms', - name='org_unit_id_filled_paper', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='forms', - name='person_id_filled_paper', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AlterField( - model_name='forms', - name='timestamp_updated', - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/cpovc_main/migrations/0005_alter_forms_options_alter_listquestions_options_and_more.py b/cpovc_main/migrations/0005_alter_forms_options_alter_listquestions_options_and_more.py deleted file mode 100644 index aa3641efc..000000000 --- a/cpovc_main/migrations/0005_alter_forms_options_alter_listquestions_options_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 11:19 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0004_alter_forms_date_ended_alter_forms_form_area_id_and_more'), - ] - - operations = [ - migrations.AlterModelOptions( - name='forms', - options={'verbose_name': 'Generic Form', 'verbose_name_plural': 'Generic Forms'}, - ), - migrations.AlterModelOptions( - name='listquestions', - options={'verbose_name': 'Generic Question', 'verbose_name_plural': 'Generic Questions'}, - ), - migrations.AddField( - model_name='listquestions', - name='form', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cpovc_main.forms'), - ), - ] diff --git a/cpovc_main/migrations/0006_listquestions_answer_field_id.py b/cpovc_main/migrations/0006_listquestions_answer_field_id.py deleted file mode 100644 index 06c6383e8..000000000 --- a/cpovc_main/migrations/0006_listquestions_answer_field_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 11:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0005_alter_forms_options_alter_listquestions_options_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='listquestions', - name='answer_field_id', - field=models.CharField(blank=True, max_length=60, null=True), - ), - ] diff --git a/cpovc_main/migrations/0007_listquestions_question_required.py b/cpovc_main/migrations/0007_listquestions_question_required.py deleted file mode 100644 index 3d3988d01..000000000 --- a/cpovc_main/migrations/0007_listquestions_question_required.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 12:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0006_listquestions_answer_field_id'), - ] - - operations = [ - migrations.AddField( - model_name='listquestions', - name='question_required', - field=models.BooleanField(default=True), - ), - ] diff --git a/cpovc_main/migrations/0008_alter_listquestions_answer_type_id.py b/cpovc_main/migrations/0008_alter_listquestions_answer_type_id.py deleted file mode 100644 index e7ce74a70..000000000 --- a/cpovc_main/migrations/0008_alter_listquestions_answer_type_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 08:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0007_listquestions_question_required'), - ] - - operations = [ - migrations.AlterField( - model_name='listquestions', - name='answer_type_id', - field=models.CharField(blank=True, choices=[('FMSL', 'Select'), ('FMRD', 'Radio'), ('FMCB', 'Checkbox'), ('FMTF', 'TextField'), ('FMTA', 'TextArea')], max_length=4, null=True), - ), - ] diff --git a/cpovc_main/migrations/0009_alter_listquestions_answer_set_id.py b/cpovc_main/migrations/0009_alter_listquestions_answer_set_id.py deleted file mode 100644 index 3bd42c33c..000000000 --- a/cpovc_main/migrations/0009_alter_listquestions_answer_set_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 08:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_main', '0008_alter_listquestions_answer_type_id'), - ] - - operations = [ - migrations.AlterField( - model_name='listquestions', - name='answer_set_id', - field=models.IntegerField(choices=[(1, 'Text'), (2, 'Number'), (3, 'Date')], db_index=True, null=True), - ), - ] diff --git a/cpovc_manage/migrations/0001_initial.py b/cpovc_manage/migrations/0001_initial.py index 96ec707ac..1e1d094a2 100644 --- a/cpovc_manage/migrations/0001_initial.py +++ b/cpovc_manage/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion diff --git a/cpovc_missing_child/__pycache__/__init__.cpython-310.pyc b/cpovc_missing_child/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 47267202e..000000000 Binary files a/cpovc_missing_child/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/cpovc_missing_child/__pycache__/admin.cpython-310.pyc b/cpovc_missing_child/__pycache__/admin.cpython-310.pyc deleted file mode 100644 index 6a4c2afbc..000000000 Binary files a/cpovc_missing_child/__pycache__/admin.cpython-310.pyc and /dev/null differ diff --git a/cpovc_missing_child/__pycache__/apps.cpython-310.pyc b/cpovc_missing_child/__pycache__/apps.cpython-310.pyc deleted file mode 100644 index 89d3d3b1a..000000000 Binary files a/cpovc_missing_child/__pycache__/apps.cpython-310.pyc and /dev/null differ diff --git a/cpovc_missing_child/__pycache__/models.cpython-310.pyc b/cpovc_missing_child/__pycache__/models.cpython-310.pyc deleted file mode 100644 index dac704804..000000000 Binary files a/cpovc_missing_child/__pycache__/models.cpython-310.pyc and /dev/null differ diff --git a/cpovc_missing_child/migrations/__pycache__/__init__.cpython-310.pyc b/cpovc_missing_child/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 7a982ba35..000000000 Binary files a/cpovc_missing_child/migrations/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/cpovc_mobile/models.py b/cpovc_mobile/models.py index 71a836239..ef1eb630c 100644 --- a/cpovc_mobile/models.py +++ b/cpovc_mobile/models.py @@ -1,3 +1,117 @@ +from enum import Enum, auto +import uuid from django.db import models +from django.utils import timezone +from cpovc_forms.models import OVCCaseRecord +from cpovc_registry.models import ( RegOrgUnit, AppUser) # Create your models here. + +class ApprovalStatus(Enum): + NEUTRAL = auto() # stored as 1 in the DB + TRUE = auto() # stored as 2 in the DB + FALSE = auto() # stored as 3 in the DB +# CRS Staging +class OVCBasicCRSMobile(models.Model): + # Make case_id primary key + case_id = models.UUIDField( + primary_key=True, default=uuid.uuid1) + case_serial = models.CharField(max_length=50, default='XXXX') + case_reporter = models.CharField(max_length=5) + reporter_telephone = models.CharField(max_length=15, null=True) + reporter_county = models.CharField(max_length=3, null=True) + reporter_sub_county = models.CharField(max_length=3, null=True) + reporter_ward = models.CharField(max_length=100, null=True) + reporter_village = models.CharField(max_length=100, null=True) + case_date = models.DateField(default=timezone.now) + perpetrator = models.CharField(max_length=5, null=True) + county = models.CharField(max_length=3) + constituency = models.CharField(max_length=3) + organization_unit = models.CharField(max_length=100) + case_landmark = models.CharField(max_length=50, null=True) + hh_economic_status = models.CharField(max_length=5) + family_status = models.CharField(max_length=5) + mental_condition = models.CharField(max_length=5) + physical_condition = models.CharField(max_length=5) + other_condition = models.CharField(max_length=5) + risk_level = models.CharField(max_length=5) + referral = models.CharField(max_length=5, default='ANNO') + referral_detail = models.CharField(max_length=200, null=True) + summon = models.CharField(max_length=5, default='ANNO') + case_narration = models.TextField(null=True) + longitude = models.DecimalField(max_digits=10, decimal_places=7, null=True) + latitude = models.DecimalField(max_digits=10, decimal_places=7, null=True) + account = models.ForeignKey(AppUser, on_delete=models.CASCADE, default=1) + case_params = models.TextField(null=True) + status = models.IntegerField(default=0) + case_comments = models.TextField(null=True) + case_record = models.ForeignKey( + OVCCaseRecord, blank=True, null=True, on_delete=models.CASCADE) + case_org_unit = models.ForeignKey( + RegOrgUnit, blank=True, null=True, on_delete=models.CASCADE) + timestamp_created = models.DateTimeField(default=timezone.now) + is_void = models.BooleanField(default=False) + is_accepted = models.IntegerField( + choices=[(status.value, status.name) for status in ApprovalStatus], + default=ApprovalStatus.NEUTRAL.value + ) + app_form_metadata = models.CharField(max_length=500, default="{}") + + class Meta: + db_table = 'ovc_basic_case_record_mobile' + verbose_name = 'Basic Case Record Staging' + verbose_name_plural = 'Basic Case Records Staging' + + def __unicode__(self): + """To be returned by admin actions.""" + return '%s' % (self.case_serial) + + +class OVCBasicCategoryMobile(models.Model): + # Make case_id primary key + category_id = models.UUIDField( + primary_key=True, default=uuid.uuid1, editable=False) + case_category = models.CharField(max_length=5) + case_sub_category = models.CharField(max_length=5, null=True) + case_date_event = models.DateField(default=timezone.now) + case_nature = models.CharField(max_length=5) + case_place_of_event = models.CharField(max_length=5) + case = models.ForeignKey(OVCBasicCRSMobile, on_delete=models.CASCADE) + is_void = models.BooleanField(default=False) + + class Meta: + db_table = 'ovc_basic_category_mobile' + verbose_name = 'Basic Category' + verbose_name_plural = 'Basic Category' + + def __unicode__(self): + """To be returned by admin actions.""" + return '%s' % (self.case_category) + + +class OVCBasicPersonMobile(models.Model): + # Make case_id primary key + person_id = models.UUIDField( + primary_key=True, default=uuid.uuid1, editable=False) + relationship = models.CharField(max_length=5, null=True) + person_type = models.CharField( + max_length=5, choices=( + ('PTRD', 'Reporter'), ('PTPD', 'Perpetrator'), + ('PTCH', 'Child'), ('PTCG', 'Guardian'))) + first_name = models.CharField(max_length=50) + surname = models.CharField(max_length=50) + other_names = models.CharField(max_length=50, null=True) + dob = models.DateField(null=True) + sex = models.CharField(max_length=5, null=True) + case = models.ForeignKey(OVCBasicCRSMobile, on_delete=models.CASCADE) + is_void = models.BooleanField(default=False) + + class Meta: + db_table = 'ovc_basic_person_mobile' + verbose_name = 'Basic Person' + verbose_name_plural = 'Basic Persons' + + def __unicode__(self): + """To be returned by admin actions.""" + return '%s - %s %s' % ( + self.get_person_type_display(), self.first_name, self.surname) \ No newline at end of file diff --git a/cpovc_mobile/serializers.py b/cpovc_mobile/serializers.py index 29347228c..17b360b44 100644 --- a/cpovc_mobile/serializers.py +++ b/cpovc_mobile/serializers.py @@ -2,7 +2,10 @@ from rest_framework import serializers from cpovc_forms.models import OVCCaseRecord, OVCCaseCategory -from cpovc_registry.models import RegPerson, RegPersonsGuardians, RegPersonsSiblings +from cpovc_mobile.models import OVCBasicCRSMobile, OVCBasicCategoryMobile, OVCBasicPersonMobile +from cpovc_registry.models import ( + RegPerson, RegPersonsGuardians, RegPersonsSiblings, + RegPersonsOrgUnits) class PerpetratorField(serializers.Field): @@ -70,3 +73,50 @@ def get_case_categories(self, obj): is_void=False, case_id_id=obj.case_id) return categories.values( 'case_category', 'date_of_event', 'place_of_event', 'case_nature') + + +class CRSSerializerMobile(serializers.ModelSerializer): + """Case Serializer.""" + + class Meta: + model = OVCBasicCRSMobile + fields = ('case_id', 'case_serial', 'case_reporter', + 'reporter_telephone', 'reporter_county', + 'reporter_sub_county', 'reporter_ward', + 'reporter_village', 'case_date', 'perpetrator', + 'county', 'constituency', 'organization_unit', + 'case_landmark', 'hh_economic_status', 'family_status', + 'mental_condition', 'physical_condition', 'other_condition', + 'risk_level', 'referral', 'summon', 'case_narration', + 'account', 'case_params', 'longitude', 'latitude','app_form_metadata') + + +class CRSCategorySerializerMobile(serializers.ModelSerializer): + class Meta: + model = OVCBasicCategoryMobile + fields = ('category_id', 'case_category', 'case_sub_category', + 'case_date_event', 'case_nature', 'case_place_of_event', + 'case') + + +class CRSPersonserializerMobile(serializers.ModelSerializer): + class Meta: + model = OVCBasicPersonMobile + fields = ('person_id', 'relationship', 'person_type', + 'first_name', 'surname', 'other_names', + 'dob', 'sex', 'case') + + + + + +class MobileUserSerializer(serializers.ModelSerializer): + + org_unit_name = serializers.CharField(source='org_unit_id') + + class Meta: + model = RegPersonsOrgUnits + fields = ('person_id', 'org_unit_id', 'org_unit_name') + + def get_org_unit_name(self, obj): + return obj \ No newline at end of file diff --git a/cpovc_mobile/tests.py b/cpovc_mobile/tests.py index 5dd9348bd..179db688a 100644 --- a/cpovc_mobile/tests.py +++ b/cpovc_mobile/tests.py @@ -23,7 +23,7 @@ print(token) -url = base_url + '/mobile/caseload/' +url = base_url + '/mobile/settings/' # url = base_url + '/form/HMF/' response = requests.get(url, headers=headers) diff --git a/cpovc_mobile/urls.py b/cpovc_mobile/urls.py index 1d8a0c903..1961c6ba0 100644 --- a/cpovc_mobile/urls.py +++ b/cpovc_mobile/urls.py @@ -1,16 +1,23 @@ from django.urls import path, re_path -from . import views +from cpovc_mobile import views # This should contain urls related to Mobile App endpoints ONLY urlpatterns = [ path("", views.ovc_mobile_home, name="ovc_mobile_home"), - # path('caseload/', views.ovc_mobile_caseload, name='ovc_mobile_caseload'), + # Set up path("caseload/", views.CaseloadViewSet.as_view()), - # path('crs/', views.CaseloadViewSet.as_view()), - # path('follow_up/', views.CaseloadViewSet.as_view()), + path('settings/', views.MobileUser.as_view()), + path('metadata/', views.MobileMetadata.as_view()), + # Forms path("crs/", views.ovc_mobile_crs, name="ovc_mobile_crs"), + path('forms/', views.ovc_mobile_forms, name='ovc_mobile_forms'), + # Follow ups path("follow_up/", views.ovc_mobile_follow_up, name="ovc_mobile_follow_up"), + + + # Others + path('notifications/', views.MobileNotifications.as_view()), # Approval urls UI path("mobile-approval/", views.mobile_app_home, name="mobile_app_home"), re_path( diff --git a/cpovc_mobile/views.py b/cpovc_mobile/views.py index 6d76856ff..224e6099f 100644 --- a/cpovc_mobile/views.py +++ b/cpovc_mobile/views.py @@ -1,13 +1,56 @@ +import json +import uuid +from decimal import Decimal +from datetime import datetime from rest_framework.decorators import api_view from rest_framework.response import Response from django.urls import reverse from django.http import HttpResponseRedirect, HttpResponse, JsonResponse from django.contrib import messages from rest_framework import viewsets, generics, status +from django.core.paginator import Paginator +from rest_framework.views import APIView + +from cpovc_api.functions import dcs_dashboard, get_attached_orgs from cpovc_forms.models import OVCCaseRecord, OVCCaseGeo -from cpovc_mobile.serializers import CaseRecordSerializer -from django.shortcuts import render, redirect + +from cpovc_mobile.models import OVCBasicCRSMobile, OVCBasicCategoryMobile, OVCBasicPersonMobile +from cpovc_mobile.serializers import CRSCategorySerializerMobile, CRSPersonserializerMobile, CRSSerializerMobile, CaseRecordSerializer, MobileUserSerializer +from cpovc_registry.models import RegOrgUnit + + + +# functions +def save_person(case_id, person_type, req_data): + try: + if person_type == 'PTCH': + data = {'first_name': req_data.get('child_first_name')} + data['surname'] = req_data.get('child_surname') + data['other_names'] = req_data.get('child_other_names') + data['dob'] = req_data.get('child_dob') + data['sex'] = req_data.get('child_sex') + data['relationship'] = 'TBVC' + elif person_type == 'PTRD': + data = {'first_name': req_data.get('reporter_first_name')} + data['surname'] = req_data.get('reporter_surname') + data['other_names'] = req_data.get('reporter_other_names') + data['dob'] = req_data.get('reporter_dob') + data['sex'] = req_data.get('reporter_sex') + data['relationship'] = req_data.get('relation') + else: + data = req_data + data['person_type'] = person_type + data['case'] = case_id + # print data + serializer = CRSPersonserializerMobile(data=data) + if serializer.is_valid(): + serializer.save() + else: + print(person_type, serializer.errors) + except Exception as e: + print('Error saving data - %s' % str(e)) + passfrom django.shortcuts import render, redirect from cpovc_forms.views import forms_registry from django.contrib.auth.decorators import login_required @@ -46,8 +89,187 @@ def get_queryset(self): return case_obj -@api_view(["POST"]) +# @api_view(["POST", 'PUT', 'PATCH', 'DELETE']) +# def ovc_mobile_crs(request): +# """Method to handle Mobile CRS endpoints.""" +# try: +# results = {"message": "Saved Successfull"} + +# return(Response(results, status=201 )) +# except Exception as e: +# raise e +# else: +# pass + + +@api_view(['GET', 'POST', 'PATCH']) def ovc_mobile_crs(request): + try: + print(request.method) + if request.method == 'GET': + account_id = request.user.id + queryset = OVCBasicCRSMobile.objects.filter(account=account_id,is_accepted=1).values() + case_id = request.query_params.get('case_id') + if case_id: + queryset = queryset.filter(case_id=case_id,account=account_id,is_accepted=1) + response_list = [] + if queryset: + for query in queryset: + cases = query + print("cases...........",cases['app_form_metadata']) + + qs = OVCBasicCategoryMobile.objects.filter(case_id=case_id) + ps = OVCBasicPersonMobile.objects.filter(case_id=case_id) + categories = list(qs.values()) + persons = list(ps.values()) + cases['categories'] = [] + cases['caregivers'] = [] + cases['perpetrators'] = [] + cases['children'] = [] + cases['reporters'] = [] + cases['app_form_metadata'] = json.loads(cases['app_form_metadata'].replace("'", "\"")) + del cases['is_void'] + for category in categories: + del category['category_id'] + del category['is_void'] + cases['categories'].append(category) + for person in persons: + del person['case_id'] + del person['person_id'] + del person['is_void'] + ptype = person['person_type'] + if ptype == 'PTPD': + cases['perpetrators'].append(person) + if ptype == 'PTCG': + cases['caregivers'].append(person) + if ptype == 'PTCH': + cases['children'].append(person) + if ptype == 'PTRD': + cases['reporters'].append(person) + response_list.append(cases) + #paginate + paginator = Paginator(response_list, 50) + page_number = request.GET.get("page") + page_obj = paginator.get_page(page_number) + current_page = list(page_obj) + + return Response({ + "results": current_page, + "page": page_obj.number, + "total_pages": paginator.num_pages + }) + + else: + return Response({'details': 'Case Does not Exist'}) + # Insert a new record for CRS + elif request.method == 'POST': + # print (request.user.username) + case_uid = uuid.uuid1() + account_id = request.user.id + perpetrators = request.data.get('perpetrators') + perpetrator = request.data.get('perpetrator') + caregivers = request.data.get('caregivers') + reporter = request.data.get('reporter') + reporter_tel = request.data.get('reporter_telephone') + lon = request.data.get('longitude') + lat = request.data.get('latitude') + hes = request.data.get('hh_economic_status') + risk_level = request.data.get('risk_level') + physical_condition = request.data.get('physical_condition') + family_statuses = request.data.get('family_status') + case_id = request.data.get('case_id', case_uid) + print('lon', lon, 'lat', lat) + print('-*-' * 50) + print(request.data) + print('-*-' * 50) + print(request.META) + print('-*-' * 50) + family_status = family_statuses.split( + ',')[0] if family_statuses else '' + data = {'case_category': request.data.get('case_category'), + 'county': request.data.get('county'), + 'constituency': request.data.get('constituency'), + 'child_dob': request.data.get('child_dob'), + 'perpetrator': perpetrator, + 'case_landmark': request.data.get('case_landmark'), + 'case_narration': request.data.get('case_narration'), + 'child_sex': request.data.get('child_sex'), + 'reporter_telephone': reporter_tel, + 'case_reporter': request.data.get('case_reporter'), + 'organization_unit': request.data.get('organization_unit'), + 'hh_economic_status': hes, + 'family_status': family_status, + 'mental_condition': request.data.get('mental_condition'), + 'physical_condition': physical_condition, + 'other_condition': request.data.get('other_condition'), + 'case_date': request.data.get('case_date'), + 'case_params': str(request.data), 'case_id': case_id, + 'account': account_id, "risk_level": risk_level, + 'app_form_metadata':json.dumps(request.data.get('app_form_metadata')) + } + if lon and lat: + data["longitude"] = round(Decimal(float(lon)), 7) + data["latitude"] = round(Decimal(float(lat)), 7) + print(data) + case_data = OVCBasicCRSMobile(case_id=case_id) + if case_data: + serializer = CRSSerializerMobile(case_data, data=data) + else: + serializer = CRSSerializerMobile(data=data) + if serializer.is_valid(): + serializer.save() + case_id = serializer.data['case_id'] + case_details = request.data.get('case_details') + for case in case_details: + category = case['category'] + sub_category = None + if 'sub_category' in case: + sub_category = case['sub_category'] + print('CASE', category, case) + cat_data = {'case': case_id, 'case_category': category, + 'case_date_event': case['date_of_event'], + 'case_nature': case['nature_of_event'], + 'case_place_of_event': case['place_of_event'], + 'case_sub_category': sub_category} + cserializer = CRSCategorySerializerMobile(data=cat_data) + if cserializer.is_valid(): + cserializer.save() + else: + print(cserializer.errors) + if perpetrator == 'PKNW': + for data in perpetrators: + save_person(case_id, 'PTPD', data) + if caregivers: + for data in caregivers: + save_person(case_id, 'PTCG', data) + if reporter != 'CRSF': + save_person(case_id, 'PTRD', request.data) + # Child details + save_person(case_id, 'PTCH', request.data) + print('CASE OK', serializer.data) + return Response(serializer.data, + status=status.HTTP_201_CREATED) + else: + print('CASE ERROR', serializer.errors) + return Response(serializer.errors, + status=status.HTTP_400_BAD_REQUEST) + # update + elif request.method == 'PATCH': + case_id = request.data.get('case_id') + is_accepted = request.data.get('is_accepted') + case_data = OVCBasicCRSMobile.objects.get(case_id=case_id) + case_data.is_accepted = is_accepted + + case_data.save() + return Response({'Case Updated': 'Is accepted field updated'},) + + except Exception as e: + print('Error submitting API Case - %s' % str(e)) + return Response({'details': 'Error saving Case details'}) + + +@api_view(['POST', 'PUT', 'PATCH', 'DELETE']) +def ovc_mobile_follow_up(request): """Method to handle Mobile CRS endpoints.""" try: results = {"message": "Saved Successfull"} @@ -59,8 +281,8 @@ def ovc_mobile_crs(request): pass -@api_view(["POST"]) -def ovc_mobile_follow_up(request): +@api_view(["POST", 'PUT', 'PATCH', 'DELETE']) +def ovc_mobile_forms(request): """Method to handle Mobile CRS endpoints.""" try: results = {"message": "Saved Successfull"} @@ -286,3 +508,61 @@ def view_mobile_case_record_sheet(request, id): redirect_url = reverse(forms_registry) return HttpResponseRedirect(forms_registry) # return render(request, "mobile/home.html", {}) + + + +class MobileUser(APIView): + + serializer_class = MobileUserSerializer + + def get(self, request, *args, **kwargs): + # postid = kwargs.get('postid') + person_id = request.user.reg_person_id + person_obj = request.user.reg_person + first_name = person_obj.first_name + surname = person_obj.surname + onames = person_obj.surname + other_names = onames if onames else '' + person_names = '%s %s' % (first_name, surname) + # + user_orgs = get_attached_orgs(request) + results = dcs_dashboard(request, user_orgs) + results['org_unit'] = user_orgs['ou_name'] + results['org_unit_id'] = user_orgs['ou_id'] + parent_ou_id = results['org_unit_id'] + cous = RegOrgUnit.objects.filter( + parent_org_unit_id=parent_ou_id, is_void=False) + org_units = [] + # Children Units + for cou in cous: + org_units.append({'org_unit_id': cou.id, + 'org_unit_name': cou.org_unit_name, + 'primary_unit': False}) + + results['person_id'] = person_id + results['person_names'] = person_names + results['person_first_name'] = first_name + results['person_surname'] = surname + results['person_other_names'] = other_names + results['org_units'] = org_units + results['org_units_count'] = cous.count() + results['sync_timestamp'] = datetime.now() + return Response(results) + +class MobileMetadata(APIView): + + serializer_class = MobileUserSerializer + + def get(self, request, *args, **kwargs): + results = {"message": "Successfull"} + return Response(results) + + +class MobileNotifications(APIView): + + serializer_class = MobileUserSerializer + + def get(self, request, *args, **kwargs): + results = [{"text": "Referral out", "category": "Referral", + "timestamp": datetime.now(), "count": 4} ] + return Response(results) \ No newline at end of file diff --git a/cpovc_ovc/migrations/0001_initial.py b/cpovc_ovc/migrations/0001_initial.py index 54109c2e5..de85e00cd 100644 --- a/cpovc_ovc/migrations/0001_initial.py +++ b/cpovc_ovc/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -12,9 +12,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_registry', '0001_initial'), ('cpovc_main', '0002_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cpovc_registry', '0001_initial'), ] operations = [ diff --git a/cpovc_registry/migrations/0001_initial.py b/cpovc_registry/migrations/0001_initial.py index 736c05ea2..c03bd4ebb 100644 --- a/cpovc_registry/migrations/0001_initial.py +++ b/cpovc_registry/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models diff --git a/cpovc_registry/migrations/0002_delete_photo.py b/cpovc_registry/migrations/0002_delete_photo.py deleted file mode 100644 index 230a8dc20..000000000 --- a/cpovc_registry/migrations/0002_delete_photo.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 4.1.7 on 2023-05-02 08:02 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_registry', '0001_initial'), - ] - - operations = [ - migrations.DeleteModel( - name='Photo', - ), - ] diff --git a/cpovc_registry/migrations/0003_photo.py b/cpovc_registry/migrations/0003_photo.py deleted file mode 100644 index 00a4b3192..000000000 --- a/cpovc_registry/migrations/0003_photo.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 4.1.7 on 2023-05-02 08:04 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_registry', '0002_delete_photo'), - ] - - operations = [ - migrations.CreateModel( - name='Photo', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('photo_passport', models.FileField(upload_to='photos/')), - ('photo_fullsize', models.FileField(null=True, upload_to='photos/')), - ('timestamp_created', models.DateTimeField(default=django.utils.timezone.now)), - ('timestamp_updated', models.DateTimeField(default=django.utils.timezone.now)), - ('is_void', models.BooleanField(default=False)), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regperson')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'Person Photo', - 'verbose_name_plural': 'Person Photos', - 'db_table': 'reg_person_photo', - }, - ), - ] diff --git a/cpovc_registry/migrations/0004_photo_has_consent.py b/cpovc_registry/migrations/0004_photo_has_consent.py deleted file mode 100644 index b03d6c9cb..000000000 --- a/cpovc_registry/migrations/0004_photo_has_consent.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-06-26 08:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_registry', '0003_photo'), - ] - - operations = [ - migrations.AddField( - model_name='photo', - name='has_consent', - field=models.BooleanField(default=False), - ), - ] diff --git a/cpovc_reports/migrations/0001_initial.py b/cpovc_reports/migrations/0001_initial.py index 1d71c425f..140c5192b 100644 --- a/cpovc_reports/migrations/0001_initial.py +++ b/cpovc_reports/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.db import migrations, models import django.db.models.deletion diff --git a/cpovc_settings/migrations/0001_initial.py b/cpovc_settings/migrations/0001_initial.py index cda2e4f26..3cb11bbce 100644 --- a/cpovc_settings/migrations/0001_initial.py +++ b/cpovc_settings/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -12,8 +12,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_forms', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cpovc_forms', '0001_initial'), ('cpovc_registry', '0001_initial'), ] diff --git a/cpovc_stat_inst/migrations/0001_initial.py b/cpovc_stat_inst/migrations/0001_initial.py index 88ad3fd23..70a9da4dd 100644 --- a/cpovc_stat_inst/migrations/0001_initial.py +++ b/cpovc_stat_inst/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.1.7 on 2023-10-30 06:33 +# Generated by Django 4.1.4 on 2024-06-18 15:58 from django.conf import settings from django.db import migrations, models @@ -12,8 +12,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('cpovc_forms', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cpovc_forms', '0001_initial'), ('cpovc_registry', '0001_initial'), ] diff --git a/cpovc_stat_inst/migrations/0002_alter_si_admission_table_simain.py b/cpovc_stat_inst/migrations/0002_alter_si_admission_table_simain.py deleted file mode 100644 index c46985da7..000000000 --- a/cpovc_stat_inst/migrations/0002_alter_si_admission_table_simain.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 09:08 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import uuid - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_forms', '0002_initial'), - ('cpovc_registry', '0004_photo_has_consent'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_stat_inst', '0001_initial'), - ] - - operations = [ - migrations.AlterModelTable( - name='si_admission', - table='ovc_si_admission', - ), - migrations.CreateModel( - name='SIMain', - fields=[ - ('si_id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False)), - ('case_status', models.BooleanField(default=None, null=True)), - ('case_stage', models.IntegerField(default=0)), - ('case_date', models.DateField()), - ('timestamp_created', models.DateTimeField(default=django.utils.timezone.now)), - ('timestamp_modified', models.DateTimeField(default=django.utils.timezone.now)), - ('is_void', models.BooleanField(default=False)), - ('case', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_forms.ovccaserecord')), - ('created_by', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('org_unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regorgunit')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regperson')), - ], - options={ - 'verbose_name': 'Statutory Institutions Care', - 'verbose_name_plural': 'Statutory Institutions Cares', - 'db_table': 'ovc_si_main', - }, - ), - ] diff --git a/cpovc_stat_inst/migrations/0003_alter_si_admission_table_delete_simain.py b/cpovc_stat_inst/migrations/0003_alter_si_admission_table_delete_simain.py deleted file mode 100644 index 00e06e333..000000000 --- a/cpovc_stat_inst/migrations/0003_alter_si_admission_table_delete_simain.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 09:09 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0002_alter_si_admission_table_simain'), - ] - - operations = [ - migrations.AlterModelTable( - name='si_admission', - table='ovc_si_main', - ), - migrations.DeleteModel( - name='SIMain', - ), - ] diff --git a/cpovc_stat_inst/migrations/0004_alter_si_admission_table.py b/cpovc_stat_inst/migrations/0004_alter_si_admission_table.py deleted file mode 100644 index bad588a4b..000000000 --- a/cpovc_stat_inst/migrations/0004_alter_si_admission_table.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 09:15 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0003_alter_si_admission_table_delete_simain'), - ] - - operations = [ - migrations.AlterModelTable( - name='si_admission', - table='ovc_si_admission', - ), - ] diff --git a/cpovc_stat_inst/migrations/0005_simain.py b/cpovc_stat_inst/migrations/0005_simain.py deleted file mode 100644 index 7484414b4..000000000 --- a/cpovc_stat_inst/migrations/0005_simain.py +++ /dev/null @@ -1,41 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 09:15 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import uuid - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_forms', '0002_initial'), - ('cpovc_registry', '0004_photo_has_consent'), - ('cpovc_stat_inst', '0004_alter_si_admission_table'), - ] - - operations = [ - migrations.CreateModel( - name='SIMain', - fields=[ - ('si_id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False)), - ('case_status', models.BooleanField(default=None, null=True)), - ('case_stage', models.IntegerField(default=0)), - ('case_date', models.DateField()), - ('timestamp_created', models.DateTimeField(default=django.utils.timezone.now)), - ('timestamp_modified', models.DateTimeField(default=django.utils.timezone.now)), - ('is_void', models.BooleanField(default=False)), - ('case', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_forms.ovccaserecord')), - ('created_by', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('org_unit', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regorgunit')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regperson')), - ], - options={ - 'verbose_name': 'Statutory Institutions Care', - 'verbose_name_plural': 'Statutory Institutions Cares', - 'db_table': 'ovc_si_registration', - }, - ), - ] diff --git a/cpovc_stat_inst/migrations/0006_sievents_afcforms.py b/cpovc_stat_inst/migrations/0006_sievents_afcforms.py deleted file mode 100644 index 8c2f08735..000000000 --- a/cpovc_stat_inst/migrations/0006_sievents_afcforms.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 16:54 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import uuid - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_forms', '0002_initial'), - ('cpovc_registry', '0004_photo_has_consent'), - ('cpovc_stat_inst', '0005_simain'), - ] - - operations = [ - migrations.CreateModel( - name='SIEvents', - fields=[ - ('event_id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False)), - ('event_count', models.IntegerField(default=1)), - ('event_date', models.DateField()), - ('form_id', models.CharField(blank=True, max_length=3)), - ('timestamp_created', models.DateTimeField(default=django.utils.timezone.now)), - ('timestamp_modified', models.DateTimeField(default=django.utils.timezone.now)), - ('is_void', models.BooleanField(default=False)), - ('care', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_stat_inst.simain')), - ('case', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_forms.ovccaserecord')), - ('created_by', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regperson')), - ], - options={ - 'verbose_name': 'SI Event', - 'verbose_name_plural': 'SI Events', - 'db_table': 'ovc_si_event', - }, - ), - migrations.CreateModel( - name='AFCForms', - fields=[ - ('form_id', models.UUIDField(default=uuid.uuid1, editable=False, primary_key=True, serialize=False)), - ('question_id', models.CharField(max_length=12)), - ('item_value', models.CharField(max_length=10)), - ('item_detail', models.TextField(blank=True, null=True)), - ('timestamp_created', models.DateTimeField(default=django.utils.timezone.now)), - ('timestamp_modified', models.DateTimeField(default=django.utils.timezone.now)), - ('is_void', models.BooleanField(default=False)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='cpovc_stat_inst.sievents')), - ], - options={ - 'verbose_name': 'SI Form data', - 'verbose_name_plural': 'SI Forms data', - 'db_table': 'ovc_si_form', - }, - ), - ] diff --git a/cpovc_stat_inst/migrations/0007_simain_org_type.py b/cpovc_stat_inst/migrations/0007_simain_org_type.py deleted file mode 100644 index 69f82d7a6..000000000 --- a/cpovc_stat_inst/migrations/0007_simain_org_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-14 18:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0006_sievents_afcforms'), - ] - - operations = [ - migrations.AddField( - model_name='simain', - name='org_type', - field=models.CharField(blank=True, max_length=5, null=True), - ), - ] diff --git a/cpovc_stat_inst/migrations/0008_alter_si_vacancyapp_options.py b/cpovc_stat_inst/migrations/0008_alter_si_vacancyapp_options.py deleted file mode 100644 index a1174a528..000000000 --- a/cpovc_stat_inst/migrations/0008_alter_si_vacancyapp_options.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 07:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0007_simain_org_type'), - ] - - operations = [ - migrations.AlterModelOptions( - name='si_vacancyapp', - options={'verbose_name': 'SI Vacancy Application', 'verbose_name_plural': 'SI Vacancy Applications'}, - ), - ] diff --git a/cpovc_stat_inst/migrations/0009_alter_si_admission_commital_court_order_and_more.py b/cpovc_stat_inst/migrations/0009_alter_si_admission_commital_court_order_and_more.py deleted file mode 100644 index d05c60fcb..000000000 --- a/cpovc_stat_inst/migrations/0009_alter_si_admission_commital_court_order_and_more.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 08:09 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0008_alter_si_vacancyapp_options'), - ] - - operations = [ - migrations.AlterField( - model_name='si_admission', - name='commital_court_order', - field=models.CharField(blank=True, choices=[('AYES', 'Yes'), ('ANNO', 'No')], max_length=5, null=True), - ), - migrations.AlterField( - model_name='si_admission', - name='consent_form_signed', - field=models.CharField(blank=True, choices=[('AYES', 'Yes'), ('ANNO', 'No')], max_length=5, null=True), - ), - migrations.AlterField( - model_name='si_admission', - name='not_contact_child', - field=models.CharField(blank=True, choices=[('AYES', 'Yes'), ('ANNO', 'No')], max_length=5, null=True), - ), - ] diff --git a/cpovc_stat_inst/migrations/0010_si_vacancyapp_approved_by_si_vacancyapp_institution_and_more.py b/cpovc_stat_inst/migrations/0010_si_vacancyapp_approved_by_si_vacancyapp_institution_and_more.py deleted file mode 100644 index ca95815fa..000000000 --- a/cpovc_stat_inst/migrations/0010_si_vacancyapp_approved_by_si_vacancyapp_institution_and_more.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 13:20 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('cpovc_registry', '0004_photo_has_consent'), - ('cpovc_stat_inst', '0009_alter_si_admission_commital_court_order_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='si_vacancyapp', - name='approved_by', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='approver', to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='si_vacancyapp', - name='institution', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regorgunit'), - preserve_default=False, - ), - migrations.AlterField( - model_name='si_vacancyapp', - name='created_by', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - migrations.AlterField( - model_name='si_vacancyapp', - name='date_of_approved', - field=models.DateField(blank=True, null=True), - ), - migrations.AlterField( - model_name='si_vacancyapp', - name='magistrate_court', - field=models.CharField(blank=True, max_length=100, null=True), - ), - migrations.AlterField( - model_name='si_vacancyapp', - name='months_approved', - field=models.IntegerField(default=0), - ), - ] diff --git a/cpovc_stat_inst/migrations/0011_alter_si_vacancyapp_institution_and_more.py b/cpovc_stat_inst/migrations/0011_alter_si_vacancyapp_institution_and_more.py deleted file mode 100644 index df465627d..000000000 --- a/cpovc_stat_inst/migrations/0011_alter_si_vacancyapp_institution_and_more.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 13:20 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_registry', '0004_photo_has_consent'), - ('cpovc_stat_inst', '0010_si_vacancyapp_approved_by_si_vacancyapp_institution_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='si_vacancyapp', - name='institution', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cpovc_registry.regorgunit'), - ), - migrations.AlterField( - model_name='si_vacancyapp', - name='months_approved', - field=models.IntegerField(default=0, null=True), - ), - ] diff --git a/cpovc_stat_inst/migrations/0012_remove_si_vacancyapp_cci_placed_and_more.py b/cpovc_stat_inst/migrations/0012_remove_si_vacancyapp_cci_placed_and_more.py deleted file mode 100644 index 369442357..000000000 --- a/cpovc_stat_inst/migrations/0012_remove_si_vacancyapp_cci_placed_and_more.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-15 13:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0011_alter_si_vacancyapp_institution_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='si_vacancyapp', - name='cci_placed', - ), - migrations.AddField( - model_name='si_vacancyapp', - name='holding_place', - field=models.CharField(blank=True, max_length=100, null=True), - ), - ] diff --git a/cpovc_stat_inst/migrations/0013_remove_sievents_case_alter_simain_case.py b/cpovc_stat_inst/migrations/0013_remove_sievents_case_alter_simain_case.py deleted file mode 100644 index 391f0c168..000000000 --- a/cpovc_stat_inst/migrations/0013_remove_sievents_case_alter_simain_case.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-16 08:36 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_forms', '0002_initial'), - ('cpovc_stat_inst', '0012_remove_si_vacancyapp_cci_placed_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='sievents', - name='case', - ), - migrations.AlterField( - model_name='simain', - name='case', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='cpovc_forms.ovccaserecord'), - ), - ] diff --git a/cpovc_stat_inst/migrations/0014_simain_case_number.py b/cpovc_stat_inst/migrations/0014_simain_case_number.py deleted file mode 100644 index d8c6f236a..000000000 --- a/cpovc_stat_inst/migrations/0014_simain_case_number.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-16 08:46 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0013_remove_sievents_case_alter_simain_case'), - ] - - operations = [ - migrations.AddField( - model_name='simain', - name='case_number', - field=models.CharField(blank=True, max_length=12), - ), - ] diff --git a/cpovc_stat_inst/migrations/0015_alter_sievents_form_id.py b/cpovc_stat_inst/migrations/0015_alter_sievents_form_id.py deleted file mode 100644 index 19545d1ee..000000000 --- a/cpovc_stat_inst/migrations/0015_alter_sievents_form_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-16 09:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0014_simain_case_number'), - ] - - operations = [ - migrations.AlterField( - model_name='sievents', - name='form_id', - field=models.CharField(blank=True, max_length=5), - ), - ] diff --git a/cpovc_stat_inst/migrations/0016_alter_sievents_form_id.py b/cpovc_stat_inst/migrations/0016_alter_sievents_form_id.py deleted file mode 100644 index 4a4f1c25f..000000000 --- a/cpovc_stat_inst/migrations/0016_alter_sievents_form_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-16 09:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0015_alter_sievents_form_id'), - ] - - operations = [ - migrations.AlterField( - model_name='sievents', - name='form_id', - field=models.CharField(blank=True, max_length=10), - ), - ] diff --git a/cpovc_stat_inst/migrations/0017_rename_afcforms_siforms.py b/cpovc_stat_inst/migrations/0017_rename_afcforms_siforms.py deleted file mode 100644 index b690832ac..000000000 --- a/cpovc_stat_inst/migrations/0017_rename_afcforms_siforms.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-16 09:13 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0016_alter_sievents_form_id'), - ] - - operations = [ - migrations.RenameModel( - old_name='AFCForms', - new_name='SIForms', - ), - ] diff --git a/cpovc_stat_inst/migrations/0018_alter_siforms_question_id.py b/cpovc_stat_inst/migrations/0018_alter_siforms_question_id.py deleted file mode 100644 index dfba1ea71..000000000 --- a/cpovc_stat_inst/migrations/0018_alter_siforms_question_id.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-08-16 09:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('cpovc_stat_inst', '0017_rename_afcforms_siforms'), - ] - - operations = [ - migrations.AlterField( - model_name='siforms', - name='question_id', - field=models.CharField(max_length=50), - ), - ] diff --git a/cpovc_stat_inst/parameters.py b/cpovc_stat_inst/parameters.py index 40cc079d9..0be4f6b37 100644 --- a/cpovc_stat_inst/parameters.py +++ b/cpovc_stat_inst/parameters.py @@ -140,7 +140,11 @@ FPERM['FMSI037F'] = {0: [''], 1: ['CRU'], 2: ['CRU'], 3: ['RUD']} FPERM['FMSI038F'] = {0: [''], 1: ['CRU'], 2: ['CRU'], 3: ['RUD']} +<<<<<<< HEAD +INSTM={} +======= # missing INSTM = {} INSTM[''] = [''] +>>>>>>> mobile_approval diff --git a/requirements.txt b/requirements.txt index ad93c5702..b8c941850 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,23 +1,61 @@ +asgiref==3.8.1 +attrs==23.2.0 +barcode==1.0.4 +Brotli==1.1.0 +certifi==2024.6.2 +cffi==1.16.0 +charset-normalizer==3.3.2 +cssselect2==0.7.0 +diff-match-patch==20230430 Django==4.1.4 -django-crispy-forms==2.1 -jellyfish==1.0.3 -pillow==10.3.0 -psycopg2-binary==2.9.9 -reportlab==4.0.7 +django-crispy-forms==2.0 +django-import-export==4.0.8 +django-model-utils==4.5.1 djangorestframework==3.14.0 djangorestframework-simplejwt==5.3.0 +# djangorestframework-simplejwt==5.2.2 +drf-extensions==0.7.1 +drf-spectacular==0.27.2 +drf-spectacular-sidecar==2024.6.1 +et-xmlfile==1.1.0 +fonttools==4.53.0 +html5lib==1.1 +idna==3.7 +inflection==0.5.1 +jellyfish==1.0.3 +jsonfield==3.1.0 +jsonschema==4.22.0 +jsonschema-specifications==2023.12.1 +Levenshtein==0.25.1 +numpy==1.26.4 openpyxl==3.1.3 +pandas==2.1.3 +pillow==10.3.0 +psycopg2-binary==2.9.9 +pycparser==2.22 +pydyf==0.10.0 +PyJWT==2.8.0 +pyphen==0.15.0 python-dateutil==2.8.2 -jellyfish==1.0.3 +python-Levenshtein==0.25.1 python-memcached==1.59 -pandas==2.1.3 +pytz==2024.1 +PyYAML==6.0.1 +rapidfuzz==3.9.3 +referencing==0.35.1 +reportlab==4.0.7 +requests==2.32.3 +rpds-py==0.18.1 +segno==1.6.1 +six==1.16.0 +sqlparse==0.5.0 +tablib==3.5.0 +tinycss2==1.3.0 +typing_extensions==4.12.2 +tzdata==2024.1 +uritemplate==4.1.1 +urllib3==2.2.1 +weasyprint==62.2 +webencodings==0.5.1 XlsxWriter==3.1.9 -drf-extensions==0.7.1 -requests==2.31.0 -segno==1.6.0 -weasyprint==60.1 -jsonfield==3.1.0 -django-import-export==3.3.3 -django-model-utils==4.3.1 -drf-spectacular -drf-spectacular-sidecar +zopfli==0.2.3 \ No newline at end of file