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

akvo / rtmis / #1809

07 Jun 2024 05:56AM UTC coverage: 84.771% (-0.2%) from 84.954%
#1809

Pull #1527

coveralls-python

dedenbangkit
[#1526] Modify job.sh add params to CLI
Pull Request #1527: Feature/1526 label or value params for data export

3037 of 3718 branches covered (81.68%)

Branch coverage included in aggregate %.

6832 of 7924 relevant lines covered (86.22%)

0.86 hits per line

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

83.5
backend/utils/export_form.py
1
import pandas as pd
1✔
2

3
from api.v1.v1_forms.models import Forms, Questions
1✔
4

5

6
meta_columns = [
1✔
7
    "id",
8
    "created_at",
9
    "created_by",
10
    "updated_at",
11
    "updated_by",
12
    "datapoint_name",
13
    "administration",
14
    "geolocation",
15
    "submission_type",
16
]
17

18

19
def get_question_names(form: Forms):
1✔
20
    questions = []
1✔
21
    question_groups = form.form_question_group.all().order_by("order")
1✔
22
    for q in question_groups:
1✔
23
        questions.extend(
1✔
24
            q.question_group_question.all()
25
            .order_by("order")
26
            .values_list("id", "name", "type")
27
        )
28
    return questions
1✔
29

30

31
def get_definition(form: Forms):
1✔
32
    questions = (
1✔
33
        Questions.objects.filter(form=form)
34
        .order_by("question_group__order", "order")
35
        .all()
36
    )
37
    framed = []
1✔
38
    for i, q in enumerate([qs.to_definition() for qs in questions]):
1✔
39
        rule = ""
1✔
40
        dependency = ""
1✔
41
        if q["rule"]:
1!
42
            rule = []
×
43
            for r in q["rule"]:
×
44
                rtext = f"{r}: " + str(q["rule"][r])
×
45
                rule.append(rtext)
×
46
            rule = " ".join(rule)
×
47
        if q["dependency"]:
1✔
48
            dependency = []
1✔
49
            for d in q["dependency"]:
1✔
50
                did = Questions.objects.get(pk=d["id"]).name
1✔
51
                if d.get("options"):
1!
52
                    options = "|".join(d["options"])
1✔
53
                    dtext = f"{did}: " + options
1✔
54
                    dependency.append(dtext)
1✔
55
                if d.get("min"):
1!
56
                    dtext = f"{did}: higher than {d['min']}"
×
57
                    dependency.append(dtext)
×
58
                if d.get("max"):
1!
59
                    dtext = f"{did}: lower than {d['max']}"
×
60
                    dependency.append(dtext)
×
61
            dependency = "\n".join(dependency)
1✔
62
        if q["options"]:
1✔
63
            for o in q["options"]:
1✔
64
                framed.append(
1✔
65
                    {
66
                        "qg_id": q["qg_id"],
67
                        "order": q["order"],
68
                        "id": q["id"],
69
                        "name": q["name"],
70
                        "label": q["label"],
71
                        "type": q["type"],
72
                        "option": o["value"],
73
                        "option_label": o["label"],
74
                        "required": "YES" if q["required"] else "NO",
75
                        "rule": rule,
76
                        "dependency": dependency,
77
                        "indexer": i + 1,
78
                    }
79
                )
80
        else:
81
            framed.append(
1✔
82
                {
83
                    "qg_id": q["qg_id"],
84
                    "order": q["order"],
85
                    "id": q["id"],
86
                    "name": q["name"],
87
                    "label": q["label"],
88
                    "type": q["type"],
89
                    "option": None,
90
                    "option_label": None,
91
                    "required": "YES" if q["required"] else "NO",
92
                    "rule": rule,
93
                    "dependency": dependency,
94
                    "indexer": i + 1,
95
                }
96
            )
97
    return framed
1✔
98

99

100
def generate_definition_sheet(form: Forms, writer: pd.ExcelWriter):
1✔
101
    definitions = get_definition(form=form)
1✔
102
    df = pd.DataFrame(definitions)
1✔
103
    question_columns = [
1✔
104
        "name",
105
        "label",
106
        "type",
107
        "required",
108
        "rule",
109
        "dependency",
110
    ]
111
    df_questions = df[question_columns]
1✔
112
    df_questions = df_questions.drop_duplicates()
1✔
113
    df_questions.to_excel(writer, sheet_name="questions", index=False)
1✔
114
    df_options = df[["name", "option", "option_label"]]
1✔
115
    df_options = df_options.dropna(subset=["option"])
1✔
116
    df_options = df_options.drop_duplicates()
1✔
117
    df_options = df_options.rename(
1✔
118
        columns={
119
            "name": "question",
120
            "option": "option",
121
            "option_label": "label",
122
        }
123
    )
124
    df_options.to_excel(writer, sheet_name="options", index=False)
1✔
125

126

127
def rearrange_definition_columns(col_names: list):
1✔
128
    col_question = list(filter(lambda x: x not in meta_columns, col_names))
1✔
129
    if len(col_question) == len(col_names):
1!
130
        return col_question
×
131
    col_names = meta_columns + col_question
1✔
132
    return col_names
1✔
133

134

135
def blank_data_template(form: Forms, writer: pd.ExcelWriter):
1✔
136
    questions = questions = (
1✔
137
        Questions.objects.filter(form=form)
138
        .order_by("question_group__order", "order")
139
        .all()
140
    )
141
    data = pd.DataFrame(
1✔
142
        columns=[q.name for q in questions] + meta_columns, index=[0]
143
    )
144
    cols = list(data)
1✔
145
    col_names = rearrange_definition_columns(cols)
1✔
146
    data = data[col_names]
1✔
147
    data.to_excel(
1✔
148
        writer, sheet_name="data", startrow=1, header=False, index=False
149
    )
150
    workbook = writer.book
1✔
151
    worksheet = writer.sheets["data"]
1✔
152
    header_format = workbook.add_format(
1✔
153
        {"bold": True, "text_wrap": True, "valign": "top", "border": 1}
154
    )
155
    for col_num, value in enumerate(data.columns.values):
1✔
156
        worksheet.write(0, col_num, value, header_format)
1✔
157
    generate_definition_sheet(form=form, writer=writer)
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

© 2026 Coveralls, Inc