Path:
strictdoc/export/html/form_objects/document_config_form_object.py
Lines:
195
Non-empty lines:
170
Non-empty lines covered with requirements:
170 / 170 (100.0%)
Functions:
9
Functions covered by requirements:
9 / 9 (100.0%)
1
"""2
@relation(SDOC-SRS-57, scope=file)3
"""4
5
from typing import Dict, List, Optional
6
7
from starlette.datastructures import FormData
8
9
from strictdoc.backend.sdoc.models.document import SDocDocument
10
from strictdoc.helpers.auto_described import auto_described
11
from strictdoc.helpers.cast import assert_cast
12
from strictdoc.helpers.form_data import ParsedFormData, parse_form_data
13
from strictdoc.helpers.mid import MID
14
from strictdoc.helpers.string import sanitize_html_form_field
15
from strictdoc.server.error_object import ErrorObject
16
17
18
@auto_described19
class DocumentMetadataFormField:
20
def __init__(
21
self,
22
field_mid: str,
23
field_name: str,
24
field_value: str,
25
):26
assert isinstance(field_value, str)
27
self.field_mid: str = field_mid
28
self.field_name: str = field_name
29
self.field_value: str = field_value
30
31
@staticmethod32
def create_from_document(
33
name: str, value: str
34
) -> "DocumentMetadataFormField":
35
return DocumentMetadataFormField(
36
field_mid=MID.create(), field_name=name, field_value=value
37
)38
39
def get_input_field_name(self) -> str:
40
return f"metadata[{self.field_mid}][name]"
41
42
def get_input_field_value(self) -> str:
43
return f"metadata[{self.field_mid}][value]"
44
45
46
@auto_described47
class DocumentConfigFormObject(ErrorObject):
48
def __init__(
49
self,
50
*,
51
document_mid: str,
52
document_title: str,
53
document_uid: Optional[str],
54
document_version: Optional[str],
55
document_classification: Optional[str],
56
document_requirement_prefix: Optional[str],
57
document_custom_metadata_fields: List[DocumentMetadataFormField],
58
):59
assert isinstance(document_mid, str), document_mid
60
assert isinstance(document_title, str), document_title
61
super().__init__()
62
self.document_mid: Optional[str] = document_mid
63
self.document_title: str = document_title
64
self.document_uid: Optional[str] = (
65
document_uid if document_uid is not None else ""
66
)67
self.document_version: Optional[str] = (
68
document_version if document_version is not None else ""
69
)70
self.document_classification: Optional[str] = (
71
document_classification72
if document_classification is not None
73
else ""
74
)75
self.document_requirement_prefix: Optional[str] = (
76
document_requirement_prefix77
if document_requirement_prefix is not None
78
else ""
79
)80
self.custom_metadata_fields: List[DocumentMetadataFormField] = (
81
document_custom_metadata_fields82
)83
84
@staticmethod85
def create_from_request(
86
*, document_mid: str, request_form_data: FormData
87
) -> "DocumentConfigFormObject":
88
request_form_data_as_list = [
89
(field_name, field_value)
90
for field_name, field_value in request_form_data.multi_items()
91
]92
request_form_dict: ParsedFormData = assert_cast(
93
parse_form_data(request_form_data_as_list), dict
94
)95
96
config_fields: Dict[str, str] = assert_cast(
97
request_form_dict["document"], dict
98
)99
100
metadata_fields: Dict[str, Dict[str, str]] = (
101
assert_cast(request_form_dict["metadata"], dict)
102
if "metadata" in request_form_dict
103
else {}
104
)105
106
document_title: str = (
107
config_fields["TITLE"] if "TITLE" in config_fields else ""
108
)109
document_title = sanitize_html_form_field(
110
document_title, multiline=False
111
)112
document_title = document_title if document_title is not None else ""
113
114
document_uid: str = ""
115
if "UID" in config_fields:
116
document_uid = config_fields["UID"]
117
document_uid = sanitize_html_form_field(
118
document_uid, multiline=False
119
)120
121
document_version: str = ""
122
if "VERSION" in config_fields:
123
document_version = config_fields["VERSION"]
124
document_version = sanitize_html_form_field(
125
document_version, multiline=False
126
)127
128
document_classification: str = ""
129
if "CLASSIFICATION" in config_fields:
130
document_classification = config_fields["CLASSIFICATION"]
131
document_classification = sanitize_html_form_field(
132
document_classification, multiline=False
133
)134
135
document_requirement_prefix: str = ""
136
if "PREFIX" in config_fields:
137
document_requirement_prefix = config_fields["PREFIX"]
138
document_requirement_prefix = sanitize_html_form_field(
139
document_requirement_prefix, multiline=False
140
)141
142
document_custom_metadata_fields: List[DocumentMetadataFormField] = []
143
for field_mid, field_dict in metadata_fields.items():
144
assert isinstance(field_dict, dict), type(field_dict)
145
146
field_name = field_dict["name"].strip()
147
field_value = field_dict["value"].strip()
148
149
document_custom_metadata_field = DocumentMetadataFormField(
150
field_mid=field_mid,
151
field_name=field_name,
152
field_value=field_value,
153
)154
document_custom_metadata_fields.append(
155
document_custom_metadata_field156
)157
158
form_object = DocumentConfigFormObject(
159
document_mid=document_mid,
160
document_title=document_title,
161
document_uid=document_uid,
162
document_version=document_version,
163
document_classification=document_classification,
164
document_requirement_prefix=document_requirement_prefix,
165
document_custom_metadata_fields=document_custom_metadata_fields,
166
)167
return form_object
168
169
@staticmethod170
def create_from_document(
171
*,
172
document: SDocDocument,
173
) -> "DocumentConfigFormObject":
174
assert isinstance(document, SDocDocument)
175
176
document_custom_metadata_fields: List[DocumentMetadataFormField] = []
177
for name, value in document.config.get_custom_metadata():
178
document_custom_metadata_field = (
179
DocumentMetadataFormField.create_from_document(
180
name=name, value=value
181
)182
)183
document_custom_metadata_fields.append(
184
document_custom_metadata_field185
)186
187
return DocumentConfigFormObject(
188
document_mid=document.reserved_mid,
189
document_title=document.title,
190
document_uid=document.config.uid,
191
document_version=document.config.version,
192
document_classification=document.config.classification,
193
document_requirement_prefix=document.config.requirement_prefix,
194
document_custom_metadata_fields=document_custom_metadata_fields,
195
)