• 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

97.42
backend/api/v1/v1_data/functions.py
1
import re
1✔
2
from django.core.cache import cache
1✔
3
from datetime import datetime
1✔
4
from uuid import uuid4
1✔
5
from django.utils import timezone
1✔
6
from datetime import timedelta
1✔
7
from api.v1.v1_forms.constants import QuestionTypes, SubmissionTypes
1✔
8
from api.v1.v1_data.models import (
1✔
9
    FormData,
10
    PendingAnswers,
11
    Answers,
12
)
13
from api.v1.v1_profile.models import Entity, EntityData
1✔
14
from faker import Faker
1✔
15

16
fake = Faker()
1✔
17

18

19
def get_cache(name):
1✔
20
    name = re.sub(r"[\W_]+", "_", name)
1✔
21
    today = datetime.now().strftime("%Y%m%d")
1✔
22
    cache_name = f"{today}-{name}"
1✔
23
    data = cache.get(cache_name)
1✔
24
    if data:
1✔
25
        return data
1✔
26
    return None
1✔
27

28

29
def create_cache(name, resp, timeout=None):
1✔
30
    name = re.sub(r"[\W_]+", "_", name)
1✔
31
    today = datetime.now().strftime("%Y%m%d")
1✔
32
    cache_name = f"{today}-{name}"
1✔
33
    cache.add(cache_name, resp, timeout=timeout)
1✔
34

35

36
def set_answer_data(data, question):
1✔
37
    name = None
1✔
38
    value = None
1✔
39
    option = None
1✔
40

41
    if question.type == QuestionTypes.geo:
1✔
42
        option = data.geo
1✔
43
    elif question.type == QuestionTypes.administration:
1✔
44
        name = data.administration.name
1✔
45
        value = data.administration.id
1✔
46
    elif question.type == QuestionTypes.text:
1✔
47
        name = fake.company() if question.meta else fake.sentence(nb_words=3)
1✔
48
    elif question.type == QuestionTypes.number:
1✔
49
        value = fake.random_int(min=10, max=50)
1✔
50
    elif question.type == QuestionTypes.option:
1✔
51
        option = [question.options.order_by("?").first().value]
1✔
52
        if (
1!
53
            question.default_value and "submission_type"
54
            in question.default_value
55
        ):
56
            st_value = SubmissionTypes.FieldStr.get(
×
57
                data.submission_type
58
            ).lower()
59
            option = [option[0].replace("submission_type", st_value)]
×
60
    elif question.type == QuestionTypes.multiple_option:
1✔
61
        option = list(
1✔
62
            question.options.order_by("?")
63
            .values_list("value", flat=True)[
64
                0: fake.random_int(min=1, max=3)
65
            ]
66
        )
67
    elif question.type == QuestionTypes.photo:
1✔
68
        name = fake.image_url()
1✔
69
    elif question.type == QuestionTypes.date:
1✔
70
        name = fake.date_between_dates(
1✔
71
            date_start=timezone.datetime.now().date() - timedelta(days=90),
72
            date_end=timezone.datetime.now().date(),
73
        ).strftime("%m/%d/%Y")
74
    elif (
1✔
75
        question.type == QuestionTypes.cascade
76
        and question.extra
77
        and question.extra.get("type") == "entity"
78
    ):
79
        entity, created = Entity.objects.get_or_create(
1✔
80
            name=question.extra.get("name")
81
        )
82
        name = None
1✔
83
        if entity:
1!
84
            ed = (
1✔
85
                entity.entity_data.filter(administration=data.administration)
86
                .order_by("?")
87
                .first()
88
            )
89
            if ed:
1✔
90
                name = ed.name
1✔
91
        if not name:
1✔
92
            prefix = "{0}".format(
1✔
93
                entity.name if created else question.extra.get("name")
94
            )
95
            entity_adm = data.administration
1✔
96
            name = f"{prefix} {entity_adm.name}"
1✔
97
            EntityData.objects.get_or_create(
1✔
98
                entity=entity,
99
                name=name,
100
                administration=entity_adm,
101
            )
102
    else:
103
        pass
104

105
    if question.meta_uuid:
1✔
106
        name = uuid4()
1✔
107

108
    return name, value, option
1✔
109

110

111
def add_fake_answers(data):
1✔
112
    form = data.form
1✔
113
    meta_name = []
1✔
114
    for question in form.form_questions.all().order_by(
1✔
115
        "question_group__order", "order"
116
    ):
117
        name, value, option = set_answer_data(data, question)
1✔
118
        if question.meta:
1✔
119
            if name:
1✔
120
                meta_name.append(name)
1✔
121
            elif option and question.type != QuestionTypes.geo:
1✔
122
                meta_name.append(",".join(option))
1✔
123
            elif value and question.type != QuestionTypes.administration:
1✔
124
                meta_name.append(str(value))
1✔
125
            else:
126
                pass
127

128
        if question.type == QuestionTypes.administration:
1✔
129
            name = None
1✔
130

131
        seed = True
1✔
132
        if question.dependency:
1✔
133
            for d in question.dependency:
1✔
134
                if isinstance(data, FormData):
1✔
135
                    prev_answer = Answers.objects.filter(
1✔
136
                        data=data, question_id=d.get("id")
137
                    ).first()
138
                else:  # PendingFormData
139
                    prev_answer = PendingAnswers.objects.filter(
1✔
140
                        pending_data=data, question_id=d.get("id")
141
                    ).first()
142
                if prev_answer and prev_answer.options:
1✔
143
                    seed = False
1✔
144
                    for o in prev_answer.options:
1✔
145
                        if o in d.get("options"):
1✔
146
                            seed = True
1✔
147
        if seed:
1✔
148
            if isinstance(data, FormData):
1✔
149
                Answers.objects.create(
1✔
150
                    data=data,
151
                    question=question,
152
                    name=name,
153
                    value=value,
154
                    options=option,
155
                    created_by=data.created_by,
156
                )
157
            else:  # PendingFormData
158
                PendingAnswers.objects.create(
1✔
159
                    pending_data=data,
160
                    question=question,
161
                    name=name,
162
                    value=value,
163
                    options=option,
164
                    created_by=data.created_by,
165
                )
166
    data.name = " - ".join(meta_name)
1✔
167
    data.save()
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