• 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

94.16
backend/api/v1/v1_forms/models.py
1
import uuid
1✔
2

3
from django.db import models
1✔
4

5
# Create your models here.
6
from api.v1.v1_forms.constants import (
1✔
7
    QuestionTypes,
8
    SubmissionTypes,
9
    AttributeTypes,
10
    FormAccessTypes,
11
)
12
from api.v1.v1_profile.models import Administration
1✔
13
from api.v1.v1_users.models import SystemUser
1✔
14
from django.contrib.postgres.fields import ArrayField
1✔
15

16

17
class Forms(models.Model):
1✔
18
    name = models.TextField()
1✔
19
    version = models.IntegerField(default=1)
1✔
20
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
1✔
21
    submission_types = ArrayField(
1✔
22
        models.IntegerField(choices=SubmissionTypes.FieldStr.items()),
23
        default=list,
24
        blank=True,
25
    )
26
    approval_instructions = models.JSONField(default=None, null=True)
1✔
27

28
    def __str__(self):
1✔
29
        return self.name
×
30

31
    class Meta:
1✔
32
        db_table = "form"
1✔
33

34

35
class FormApprovalAssignment(models.Model):
1✔
36
    form = models.ForeignKey(
1✔
37
        to=Forms, on_delete=models.CASCADE, related_name="form_data_approval"
38
    )
39
    administration = models.ForeignKey(
1✔
40
        to=Administration,
41
        on_delete=models.PROTECT,
42
        related_name="administration_data_approval",
43
    )
44
    user = models.ForeignKey(
1✔
45
        to=SystemUser,
46
        on_delete=models.CASCADE,
47
        related_name="user_data_approval",
48
    )
49
    updated = models.DateTimeField(default=None, null=True)
1✔
50

51
    def __str__(self):
1✔
52
        return self.user.email
×
53

54
    class Meta:
1✔
55
        db_table = "form_approval_assignment"
1✔
56

57

58
class QuestionGroup(models.Model):
1✔
59
    form = models.ForeignKey(
1✔
60
        to=Forms, on_delete=models.CASCADE, related_name="form_question_group"
61
    )
62
    name = models.CharField(max_length=255)
1✔
63
    label = models.TextField(null=True, default=None)
1✔
64
    order = models.BigIntegerField(null=True, default=None)
1✔
65

66
    def __str__(self):
1✔
67
        return self.name
×
68

69
    class Meta:
1✔
70
        unique_together = ("form", "name")
1✔
71
        constraints = [
1✔
72
            models.UniqueConstraint(
73
                fields=["form", "name"], name="unique_form_question_group"
74
            )
75
        ]
76
        db_table = "question_group"
1✔
77

78

79
class Questions(models.Model):
1✔
80
    form = models.ForeignKey(
1✔
81
        to=Forms, on_delete=models.CASCADE, related_name="form_questions"
82
    )
83
    question_group = models.ForeignKey(
1✔
84
        to=QuestionGroup,
85
        on_delete=models.CASCADE,
86
        related_name="question_group_question",
87
    )
88
    order = models.BigIntegerField(null=True, default=None)
1✔
89
    label = models.TextField()
1✔
90
    short_label = models.TextField(null=True, default=None)
1✔
91
    name = models.CharField(max_length=255, default=None, null=True)
1✔
92
    type = models.IntegerField(choices=QuestionTypes.FieldStr.items())
1✔
93
    meta = models.BooleanField(default=False)
1✔
94
    required = models.BooleanField(default=True)
1✔
95
    rule = models.JSONField(default=None, null=True)
1✔
96
    dependency = models.JSONField(default=None, null=True)
1✔
97
    api = models.JSONField(default=None, null=True)
1✔
98
    extra = models.JSONField(default=None, null=True)
1✔
99
    tooltip = models.JSONField(default=None, null=True)
1✔
100
    fn = models.JSONField(default=None, null=True)
1✔
101
    pre = models.JSONField(default=None, null=True)
1✔
102
    hidden = models.JSONField(default=None, null=True)
1✔
103
    display_only = models.BooleanField(default=False, null=True)
1✔
104
    default_value = models.JSONField(default=None, null=True)
1✔
105
    meta_uuid = models.BooleanField(default=False, null=True)
1✔
106
    disabled = models.JSONField(default=None, null=True)
1✔
107

108
    def __str__(self):
1✔
109
        return f"[TYPE: {self.type}] {self.label}"
×
110

111
    def to_definition(self):
1✔
112
        options = self.options.values("label", "value")
1✔
113
        return {
1✔
114
            "id": self.id,
115
            "qg_id": self.question_group.id,
116
            "order": (self.order or 0) + 1,
117
            "name": self.name,
118
            "label": self.label,
119
            "short_label": self.short_label,
120
            "type": QuestionTypes.FieldStr.get(self.type),
121
            "required": self.required,
122
            "hidden": self.hidden,
123
            "rule": self.rule,
124
            "dependency": self.dependency,
125
            "options": options,
126
            "extra": self.extra,
127
            "tooltip": self.tooltip,
128
            "fn": self.fn,
129
            "pre": self.pre,
130
            "display_only": self.display_only,
131
            "meta_uuid": self.meta_uuid,
132
            "default_value": self.default_value,
133
            "disabled": self.disabled,
134
        }
135

136
    class Meta:
1✔
137
        unique_together = ("form", "name")
1✔
138
        constraints = [
1✔
139
            models.UniqueConstraint(
140
                fields=["form", "name"], name="unique_form_question"
141
            )
142
        ]
143
        db_table = "question"
1✔
144

145

146
class QuestionOptions(models.Model):
1✔
147
    question = models.ForeignKey(
1✔
148
        to=Questions, on_delete=models.CASCADE, related_name="options"
149
    )
150
    order = models.BigIntegerField(null=True, default=None)
1✔
151
    label = models.TextField(default=None, null=True)
1✔
152
    value = models.CharField(max_length=255, default=None, null=True)
1✔
153
    other = models.BooleanField(default=False)
1✔
154
    color = models.TextField(default=None, null=True)
1✔
155

156
    def __str__(self):
1✔
157
        return self.value
×
158

159
    class Meta:
1✔
160
        unique_together = ("question", "value")
1✔
161
        constraints = [
1✔
162
            models.UniqueConstraint(
163
                fields=["question", "value"], name="unique_question_option"
164
            )
165
        ]
166
        db_table = "option"
1✔
167

168

169
class UserForms(models.Model):
1✔
170
    user = models.ForeignKey(
1✔
171
        to=SystemUser, on_delete=models.CASCADE, related_name="user_form"
172
    )
173
    form = models.ForeignKey(
1✔
174
        to=Forms, on_delete=models.CASCADE, related_name="form_user"
175
    )
176

177
    def __str__(self):
1✔
178
        return self.user.email
×
179

180
    class Meta:
1✔
181
        unique_together = ("user", "form")
1✔
182
        db_table = "user_form"
1✔
183

184

185
class FormAccess(models.Model):
1✔
186
    user_form = models.ForeignKey(
1✔
187
        to=UserForms,
188
        on_delete=models.CASCADE,
189
        related_name="user_form_access",
190
    )
191
    access_type = models.IntegerField(
1✔
192
        choices=FormAccessTypes.FieldStr.items()
193
    )
194

195
    def __str__(self):
1✔
196
        return self.user.email
×
197

198
    class Meta:
1✔
199
        db_table = "user_form_access"
1✔
200

201

202
class QuestionAttribute(models.Model):
1✔
203
    name = models.TextField(null=True, default=None)
1✔
204
    question = models.ForeignKey(
1✔
205
        to=Questions,
206
        on_delete=models.CASCADE,
207
        related_name="question_question_attribute",
208
    )
209
    attribute = models.IntegerField(choices=AttributeTypes.FieldStr.items())
1✔
210
    options = models.JSONField(default=None, null=True)
1✔
211

212
    def __str__(self):
1✔
213
        return self.name
×
214

215
    class Meta:
1✔
216
        unique_together = ("name", "question", "attribute", "options")
1✔
217
        db_table = "question_attribute"
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