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

akvo / rtmis / #1040

05 Apr 2024 01:51PM UTC coverage: 79.093% (-0.06%) from 79.155%
#1040

push

coveralls-python

dedenbangkit
Handle min max dependency question

2373 of 3160 branches covered (75.09%)

Branch coverage included in aggregate %.

5723 of 7076 relevant lines covered (80.88%)

0.81 hits per line

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

65.26
backend/utils/export_form.py
1
import os
1✔
2
import pathlib
1✔
3

4
import pandas as pd
1✔
5

6
from api.v1.v1_forms.models import Forms, Questions
1✔
7
from api.v1.v1_users.models import SystemUser
1✔
8

9

10
def get_definition(form: Forms):
1✔
11
    questions = Questions.objects.filter(form=form).order_by(
1✔
12
        "question_group__order", "order").all()
13
    framed = []
1✔
14
    for i, q in enumerate([qs.to_definition() for qs in questions]):
1✔
15
        rule = ""
1✔
16
        dependency = ""
1✔
17
        if q["rule"]:
1!
18
            rule = []
×
19
            for r in q["rule"]:
×
20
                rtext = f"{r}: " + str(q["rule"][r])
×
21
                rule.append(rtext)
×
22
            rule = " ".join(rule)
×
23
        if q["dependency"]:
1!
24
            dependency = []
×
25
            for d in q["dependency"]:
×
26
                did = Questions.objects.get(pk=d["id"]).name
×
27
                if d.get("options"):
×
28
                    options = "|".join(d["options"])
×
29
                    dtext = f"{did}: " + options
×
30
                    dependency.append(dtext)
×
31
                if d.get("min"):
×
32
                    dtext = f"{did}: higher than {d['min']}"
×
33
                    dependency.append(dtext)
×
34
                if d.get("max"):
×
35
                    dtext = f"{did}: lower than {d['max']}"
×
36
                    dependency.append(dtext)
×
37
            dependency = "\n".join(dependency)
×
38
        if q["options"]:
1✔
39
            for o in q["options"]:
1✔
40
                framed.append({
1✔
41
                    "qg_id": q["qg_id"],
42
                    "order": q["order"],
43
                    "id": q["id"],
44
                    "name": q["name"],
45
                    "label": q["label"],
46
                    "type": q["type"],
47
                    "option": o["value"],
48
                    "option_label": o["label"],
49
                    "required": "YES" if q["required"] else "NO",
50
                    "rule": rule,
51
                    "dependency": dependency,
52
                    "indexer": i + 1
53
                })
54
        else:
55
            framed.append({
1✔
56
                "qg_id": q["qg_id"],
57
                "order": q["order"],
58
                "id": q["id"],
59
                "name": q["name"],
60
                "label": q["label"],
61
                "type": q["type"],
62
                "option": None,
63
                "option_label": None,
64
                "required": "YES" if q["required"] else "NO",
65
                "rule": rule,
66
                "dependency": dependency,
67
                "indexer": i + 1
68
            })
69
    return framed
1✔
70

71

72
def generate_definition_sheet(form: Forms, writer: pd.ExcelWriter):
1✔
73
    definitions = get_definition(form=form)
1✔
74
    df = pd.DataFrame(definitions)
1✔
75
    question_columns = [
1✔
76
        "name", "label", "type",
77
        "required", "rule", "dependency"
78
    ]
79
    df_questions = df[question_columns]
1✔
80
    df_questions.to_excel(writer, sheet_name='questions', index=False)
1✔
81
    df_options = df[["name", "option", "option_label"]]
1✔
82
    df_options = df_options.dropna(subset=["option"])
1✔
83
    df_options = df_options.drop_duplicates()
1✔
84
    df_options = df_options.rename(columns={
1✔
85
        "name": "question",
86
        "option": "option",
87
        "option_label": "label"
88
    })
89
    df_options.to_excel(writer, sheet_name='options', index=False)
1✔
90

91

92
def generate_excel(form: Forms, user: SystemUser):
1✔
93
    questions = questions = Questions.objects.filter(form=form).order_by(
1✔
94
        "question_group__order", "order").all()
95
    data = pd.DataFrame(
1✔
96
        columns=['{0}|{1}'.format(q.id, q.name) for q in questions], index=[0])
97
    form_name = form.name
1✔
98
    filename = f"{form.id}-{form_name}"
1✔
99
    directory = 'tmp'
1✔
100
    pathlib.Path(directory).mkdir(parents=True, exist_ok=True)
1✔
101
    filepath = f"./{directory}/{filename}.xlsx"
1✔
102
    if os.path.exists(filepath):
1!
103
        os.remove(filepath)
×
104
    writer = pd.ExcelWriter(filepath, engine='xlsxwriter')
1✔
105
    data.to_excel(writer,
1✔
106
                  sheet_name='data',
107
                  startrow=1,
108
                  header=False,
109
                  index=False)
110
    workbook = writer.book
1✔
111
    worksheet = writer.sheets['data']
1✔
112
    header_format = workbook.add_format({
1✔
113
        'bold': True,
114
        'text_wrap': True,
115
        'valign': 'top',
116
        'border': 1
117
    })
118
    for col_num, value in enumerate(data.columns.values):
1✔
119
        worksheet.write(0, col_num, value, header_format)
1✔
120
    generate_definition_sheet(form=form, writer=writer)
1✔
121
    writer.save()
1✔
122
    return filepath
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