-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodel.py
More file actions
138 lines (119 loc) · 5.15 KB
/
model.py
File metadata and controls
138 lines (119 loc) · 5.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"""This module contains the model class of the application."""
import json
from typing import List, Tuple
from requests import Request, Session
from wx import LogError, LogMessage
class Model:
"""The model class of the application."""
def __init__(self):
self.session = Session()
def prepare_submissions(self, env_url: str, token: str, submissions: dict):
"""Parses the submissions input by the user."""
endpoint = "api/submissions" if env_url.endswith("/") else "/api/submissions"
url = env_url + endpoint
headers = {"Authorization": f"Token {token}"}
prepared_requests: List[Tuple] = []
for sub_id, sub_data in submissions.items():
req = Request(method="POST", url=url, headers=headers)
data: List[Tuple] = []
if "meta" in sub_data:
sub_meta = {}
external_id = None
for meta_key, meta_value in sub_data["meta"].items():
if meta_key == "state":
continue
if meta_key == "External ID":
external_id = meta_value
continue
if meta_key == "Priority" or meta_key == "Find Sections":
data.append((meta_key.replace(" ", "_").lower(), meta_value))
continue
sub_meta[meta_key.replace(" ", "_").lower()] = meta_value
data.extend(
[
("submission_metadata", json.dumps(sub_meta)),
("external_id", external_id),
]
)
if "documents" in sub_data:
files: List[Tuple] = []
for doc in sub_data["documents"].values():
if not doc["content"]:
del doc
continue
if "meta" in doc:
template = {"sv_labels": []}
for meta_key, meta_value in doc["meta"].items():
if meta_key == "state":
continue
template["sv_labels"].append(
{"label": meta_key, "value": meta_value}
)
data.append(("document_metadata", json.dumps(template)))
if "content" in doc:
try:
files.append(("document", open(doc["content"], "rb")))
except:
LogError(f"Cannot open file {doc['content']}.")
req.files = files
if data:
req.data = data
preped_req = self.session.prepare_request(req)
prepared_requests.append((sub_id, preped_req))
return prepared_requests
def upload_submissions(self, env_url: str, token: str, submissions: dict):
""""""
ssl = True if "https" in env_url else False
prepared_requests = self.prepare_submissions(
env_url=env_url.strip(), token=token.strip(), submissions=submissions
)
for tup in prepared_requests:
req = tup[1]
try:
if ssl:
resp = self.session.send(req, verify=False)
else:
resp = self.session.send(req)
except:
LogError(
"ERROR !\n"
"Please verify the URL and Token are correct"
" and also that you have access to the "
"desired environment!"
)
else:
if str(resp.status_code).startswith("5"):
Model.log_submission_result(
sub_id=tup[0], resp_status=resp.status_code
)
return
resp_content = json.loads(resp.content)
Model.log_submission_result(
sub_id=tup[0],
resp_status=resp.status_code,
resp_content=resp_content,
)
@staticmethod
def log_submission_result(
sub_id=None, resp_status=None, resp_content: dict = None
) -> None:
"""Shows a log dialog to the user after a submission request
has been sent and has a response; this log dialog lets the user
know what the status of the uploaded submission is."""
# TODO - move this method to the controller or main view
if str(resp_status).startswith("2"):
sub_db_id = resp_content["submission_id"]
LogMessage(
f"Submission {sub_id} - SUCCESS !\n"
f"HTTP Status Code - {resp_status}.\n"
f"Submission's database id is {sub_db_id}."
)
else:
err_msg = (
f"Submission {sub_id} - FAILURE !\n"
+ f"HTTP Status Code - {resp_status}.\n"
)
if resp_content:
err = resp_content["error"]
err_msg += f'The returned error message is - \n"{err}" .'
LogMessage(err_msg)