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

akvo / iwsims-demo / #93

30 Apr 2025 07:36AM UTC coverage: 86.373% (+0.07%) from 86.3%
#93

Pull #29

coveralls-python

ifirmawan
[#28] Remove any county, sub-County terms in the backend
Pull Request #29: Feature/28 eng 1232 data submission by admin super admin

2591 of 3118 branches covered (83.1%)

Branch coverage included in aggregate %.

5915 of 6730 relevant lines covered (87.89%)

0.88 hits per line

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

91.49
backend/api/v1/v1_data/management/commands/fake_data_seeder.py
1
from datetime import datetime, timedelta, time
1✔
2

3
import pandas as pd
1✔
4
from django.core.management import BaseCommand
1✔
5
from django.utils.timezone import make_aware
1✔
6

7
from faker import Faker
1✔
8

9
from iwsims.settings import COUNTRY_NAME
1✔
10
from api.v1.v1_data.models import FormData
1✔
11
from api.v1.v1_forms.constants import SubmissionTypes
1✔
12
from api.v1.v1_forms.models import Forms, UserForms, FormApprovalAssignment
1✔
13
from api.v1.v1_profile.constants import UserRoleTypes
1✔
14
from api.v1.v1_profile.models import Administration
1✔
15
from api.v1.v1_users.models import SystemUser
1✔
16
from api.v1.v1_mobile.models import MobileAssignment
1✔
17
from api.v1.v1_users.management.commands.fake_user_seeder import create_user
1✔
18
from api.v1.v1_data.functions import add_fake_answers
1✔
19

20
fake = Faker()
1✔
21

22

23
def get_mobile_user(user, form):
1✔
24
    mobile_user = user.mobile_assignments.filter(
1✔
25
        forms__id__in=[form.pk]
26
    ).first()
27
    if not mobile_user:
1✔
28
        mobile_user = MobileAssignment.objects.create_assignment(
1✔
29
            user=user, name=fake.user_name()
30
        )
31
        mobile_user.forms.add(form)
1✔
32
        user_path = "{0}{1}".format(
1✔
33
            user.user_access.administration.path,
34
            user.user_access.administration.id
35
        )
36
        mobile_adms = form.form_form_data.filter(
1✔
37
            administration__path__startswith=user_path
38
        ).values_list("administration", flat=True)
39
        if len(mobile_adms) == 0:
1✔
40
            mobile_adms = user.user_access \
1✔
41
                .administration \
42
                .parent_administration.order_by('?')[:6]
43
        mobile_user.administrations.set(mobile_adms)
1✔
44
    return mobile_user
1✔
45

46

47
def seed_data(
1✔
48
    form,
49
    fake_geo,
50
    created,
51
    administration,
52
    repeat
53
):
54
    for i in range(repeat):
1✔
55
        geo = fake_geo.iloc[i].to_dict()
1✔
56
        geo_value = [geo["X"], geo["Y"]]
1✔
57
        assignment = FormApprovalAssignment.objects.filter(
1✔
58
            form=form,
59
            administration=administration,
60
        ).first()
61
        if assignment:
1!
62
            user = SystemUser.objects.filter(
1✔
63
                user_form__form_id__in=[form.pk],
64
                user_access__administration=administration,
65
                user_access__role=UserRoleTypes.admin
66
            ).order_by('?').first()
67
            if not user:
1!
68
                user = create_user(
×
69
                    role=UserRoleTypes.admin,
70
                    administration=administration,
71
                    random_password=False,
72
                )
73
                UserForms.objects.get_or_create(
×
74
                    form=form, user=user
75
                )
76
            mobile_user = get_mobile_user(
1✔
77
                user=user, form=form
78
            )
79
            created_by = mobile_user.user
1✔
80
            adm_submission = mobile_user.administrations.order_by('?').first()
1✔
81
            data = FormData.objects.create(
1✔
82
                name=fake.pystr_format(),
83
                geo=geo_value,
84
                form=form,
85
                administration=adm_submission,
86
                created_by=created_by,
87
                submission_type=SubmissionTypes.registration,
88
            )
89
            data.created = make_aware(created)
1✔
90
            data.save()
1✔
91
            add_fake_answers(data)
1✔
92
            data.save_to_file
1✔
93

94

95
class Command(BaseCommand):
1✔
96
    def add_arguments(self, parser):
1✔
97
        parser.add_argument(
1✔
98
            "-r", "--repeat", nargs="?", const=5, default=5, type=int
99
        )
100
        parser.add_argument(
1✔
101
            "-t", "--test", nargs="?", const=False, default=False, type=bool
102
        )
103

104
    def handle(self, *args, **options):
1✔
105
        test = options.get("test")
1✔
106
        repeat = options.get("repeat")
1✔
107
        FormData.objects.all().delete()
1✔
108
        fake_geo = pd.read_csv(
1✔
109
            f"./source/{COUNTRY_NAME}_random_points.csv"
110
        )
111
        fake_geo = fake_geo.sample(frac=1).reset_index(drop=True)
1✔
112
        now_date = datetime.now()
1✔
113
        start_date = now_date - timedelta(days=5 * 365)
1✔
114
        created = fake.date_between(start_date, now_date)
1✔
115
        created = datetime.combine(created, time.min)
1✔
116
        level1_admins = (
1✔
117
            Administration.objects.filter(level__level=1)
118
            .distinct("name")
119
            .all()
120
        )
121
        for level1_admin in level1_admins:
1✔
122
            level1_admin_user = SystemUser.objects.filter(
1✔
123
                user_access__administration=level1_admin
124
            ).order_by('?').first()
125
            if not level1_admin_user:
1!
126
                create_user(
×
127
                    role=UserRoleTypes.admin,
128
                    administration=level1_admin,
129
                    random_password=False
130
                )
131
        for form in Forms.objects.all():
1✔
132
            if not test:
1!
133
                print(f"Seeding - {form.name}")
×
134
            administrations = [
1✔
135
                level3_admin
136
                for level1_admin in level1_admins
137
                for level2_admin in level1_admin.parent_administration.all()
138
                for level3_admin in level2_admin.parent_administration.all()
139
            ]
140
            for adm in administrations:
1✔
141
                seed_data(
1✔
142
                    form=form,
143
                    fake_geo=fake_geo,
144
                    created=created,
145
                    administration=adm,
146
                    repeat=repeat
147
                )
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