• 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

94.2
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
    FormTypes,
9
    AttributeTypes,
10
    SubmissionTypes,
11
    FormAccessTypes,
12
)
13
from api.v1.v1_profile.models import Administration
1✔
14
from api.v1.v1_users.models import SystemUser
1✔
15
from django.contrib.postgres.fields import ArrayField
1✔
16

17

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

32
    def __str__(self):
1✔
33
        return self.name
×
34

35
    class Meta:
1✔
36
        db_table = "form"
1✔
37

38

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

55
    def __str__(self):
1✔
56
        return self.user.email
×
57

58
    class Meta:
1✔
59
        db_table = "form_approval_assignment"
1✔
60

61

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

70
    def __str__(self):
1✔
71
        return self.name
×
72

73
    class Meta:
1✔
74
        unique_together = ("form", "name")
1✔
75
        constraints = [
1✔
76
            models.UniqueConstraint(
77
                fields=["form", "name"], name="unique_form_question_group"
78
            )
79
        ]
80
        db_table = "question_group"
1✔
81

82

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

112
    def __str__(self):
1✔
113
        return f"[TYPE: {self.type}] {self.label}"
×
114

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

140
    class Meta:
1✔
141
        unique_together = ("form", "name")
1✔
142
        constraints = [
1✔
143
            models.UniqueConstraint(
144
                fields=["form", "name"], name="unique_form_question"
145
            )
146
        ]
147
        db_table = "question"
1✔
148

149

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

160
    def __str__(self):
1✔
161
        return self.value
×
162

163
    class Meta:
1✔
164
        unique_together = ("question", "value")
1✔
165
        constraints = [
1✔
166
            models.UniqueConstraint(
167
                fields=["question", "value"], name="unique_question_option"
168
            )
169
        ]
170
        db_table = "option"
1✔
171

172

173
class UserForms(models.Model):
1✔
174
    user = models.ForeignKey(
1✔
175
        to=SystemUser, on_delete=models.CASCADE, related_name="user_form"
176
    )
177
    form = models.ForeignKey(
1✔
178
        to=Forms, on_delete=models.CASCADE, related_name="form_user"
179
    )
180

181
    def __str__(self):
1✔
182
        return self.user.email
×
183

184
    class Meta:
1✔
185
        unique_together = ("user", "form")
1✔
186
        db_table = "user_form"
1✔
187

188

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

199
    def __str__(self):
1✔
200
        return self.user.email
×
201

202
    class Meta:
1✔
203
        db_table = "user_form_access"
1✔
204

205

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

216
    def __str__(self):
1✔
217
        return self.name
×
218

219
    class Meta:
1✔
220
        unique_together = ("name", "question", "attribute", "options")
1✔
221
        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