• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

akvo / iwsims-demo / #72

28 Apr 2025 03:28AM UTC coverage: 86.134% (+1.1%) from 85.024%
#72

push

coveralls-python

web-flow
Merge pull request #20 from akvo/feature/19-eng-1231-dynamic-level-approval

Feature/19 eng 1231 dynamic level approval

2646 of 3188 branches covered (83.0%)

Branch coverage included in aggregate %.

5995 of 6844 relevant lines covered (87.59%)

0.88 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

89.52
backend/api/v1/v1_users/management/commands/demo_approval_flow.py
1
import re
1✔
2
import random
1✔
3
from faker import Faker
1✔
4
from django.core.management import BaseCommand
1✔
5
from api.v1.v1_profile.constants import UserRoleTypes, UserDesignationTypes
1✔
6
from api.v1.v1_profile.models import Administration, Access, Levels
1✔
7
from api.v1.v1_users.models import SystemUser, Organisation
1✔
8
from api.v1.v1_forms.models import Forms, UserForms, FormAccess
1✔
9
from api.v1.v1_forms.models import FormApprovalAssignment
1✔
10
from api.v1.v1_forms.constants import FormTypes, FormAccessTypes
1✔
11
from api.v1.v1_mobile.models import MobileAssignment
1✔
12
fake = Faker()
1✔
13

14

15
def create_approver(form, administration, organisation):
1✔
16
    email = ("{0}.{1}@test.com").format(
1✔
17
        re.sub('[^A-Za-z0-9]+', '', administration.name.lower()),
18
        random.randint(10, 100)
19
    )
20
    last_name = "Approver"
1✔
21
    role = UserRoleTypes.admin  # Default to admin role
1✔
22
    if administration.level.level == 1:
1✔
23
        last_name = "Admin"
1✔
24
    # check if someone has access to ancestor adminisration
25
    approver, created = SystemUser.objects.get_or_create(
1✔
26
        email=email,
27
    )
28
    if created:
1✔
29
        approver.set_password("test")
1✔
30
        approver.organisation = organisation
1✔
31
        approver.first_name = administration.name
1✔
32
        approver.last_name = last_name
1✔
33
        approver.phone_number = fake.msisdn()
1✔
34
        approver.designation = fake.random_element(
1✔
35
            elements=UserDesignationTypes.FieldStr.keys()
36
        )
37
        approver.save()
1✔
38
        Access.objects.create(
1✔
39
            user=approver,
40
            role=role,
41
            administration=administration
42
        )
43
    # Create UserForms with approver access type
44
    user_form, _ = UserForms.objects.get_or_create(form=form, user=approver)
1✔
45
    # Ensure the user has approver access for this form
46
    FormAccess.objects.get_or_create(
1✔
47
        user_form=user_form,
48
        access_type=FormAccessTypes.approve
49
    )
50
    # Create form approval assignment
51
    assignment = FormApprovalAssignment.objects.create(
1✔
52
        form=form,
53
        administration=administration,
54
        user=approver
55
    )
56
    return assignment
1✔
57

58

59
class Command(BaseCommand):
1✔
60
    def add_arguments(self, parser):
1✔
61
        parser.add_argument(
1✔
62
            "-t", "--test", nargs="?", const=False, default=False, type=bool
63
        )
64

65
    def handle(self, *args, **options):
1✔
66
        test = options.get("test")
1✔
67
        forms = Forms.objects.filter(type=FormTypes.county).all()
1✔
68
        for form in forms:
1✔
69
            last_level = Levels.objects.order_by('-level')[1:2].first()
1✔
70
            administrations = Administration.objects.filter(
1✔
71
                level=last_level
72
            )
73
            if test:
1!
74
                administrations = administrations.all()
1✔
75
            else:
76
                administrations = administrations.order_by('?')[:2]
×
77
            for administration in administrations:
1✔
78
                ancestors = administration.ancestors.filter(
1✔
79
                    level__level__gt=0
80
                )
81
                ancestors |= Administration.objects.filter(
1✔
82
                    id=administration.id
83
                )
84
                organisation = Organisation.objects.order_by('?').first()
1✔
85
                for ancestor in ancestors:
1✔
86
                    assignment = FormApprovalAssignment.objects \
1✔
87
                        .filter(
88
                            form=form,
89
                            administration=ancestor
90
                        ).first()
91
                    last_name = "Approver"
1✔
92
                    if ancestor.level.level == 1:
1✔
93
                        last_name = "Admin"
1✔
94
                    if not assignment:
1!
95
                        assignment = create_approver(
1✔
96
                            form=form,
97
                            administration=ancestor,
98
                            organisation=organisation,
99
                        )
100
                    if not test:
1!
101
                        print("Level: {} ({})".format(
×
102
                            ancestor.level.level,
103
                            ancestor.level.name
104
                        ))
105
                        print(f"- Administration Name: {ancestor.name}")
×
106
                        print("- Approver: {} ({})".format(
×
107
                            assignment.user.email,
108
                            last_name
109
                        ))
110
                # create user
111
                email = "{0}.{1}@test.com".format(
1✔
112
                    re.sub(
113
                        '[^A-Za-z0-9]+', '', administration.name.lower()
114
                    ),
115
                    random.randint(200, 300)
116
                )
117
                submitter, created = SystemUser.objects.get_or_create(
1✔
118
                    email=email,
119
                )
120
                if created:
1✔
121
                    submitter.set_password("test")
1✔
122
                    submitter.organisation = organisation
1✔
123
                    submitter.first_name = administration.name
1✔
124
                    submitter.last_name = "User"
1✔
125
                    submitter.phone_number = fake.msisdn()
1✔
126
                    submitter.designation = UserDesignationTypes.sa
1✔
127
                    submitter.save()
1✔
128
                    Access.objects.create(
1✔
129
                        user=submitter,
130
                        role=UserRoleTypes.admin,
131
                        administration=ancestor
132
                    )
133
                user_form, _ = UserForms.objects.get_or_create(
1✔
134
                    form=form,
135
                    user=submitter
136
                )
137
                FormAccess.objects.get_or_create(
1✔
138
                    user_form=user_form,
139
                    access_type=FormAccessTypes.edit
140
                )
141
                FormAccess.objects.get_or_create(
1✔
142
                    user_form=user_form,
143
                    access_type=FormAccessTypes.read
144
                )
145
                if not test:
1!
146
                    print("\nData entry:")
×
147
                    print(f"- Administration: {administration.full_name}")
×
148
                    print("- Email: {}\n".format(submitter.email))
×
149
                mobile_assignment = MobileAssignment.objects.create_assignment(
1✔
150
                    user=submitter,
151
                    name=fake.user_name(),
152
                )
153
                mobile_adms = administration.parent_administration\
1✔
154
                    .order_by('?')[:2]
155
                mobile_assignment.administrations.add(
1✔
156
                    *mobile_adms
157
                )
158
                mobile_assignment.forms.add(form)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc