blob: 4cb644ae119c07e0b063caeeaf051c710f2d3d20 [file] [log] [blame]
Matteo Scandolod2044a42017-08-07 16:08:28 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070016from base import xproto_string_type, unquote
17
Zack Williams045b63d2019-01-22 16:30:57 -070018
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070019def xproto_type_to_ui_type(f):
20 try:
Zack Williams045b63d2019-01-22 16:30:57 -070021 content_type = f["options"]["content_type"]
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070022 content_type = eval(content_type)
Zack Williams045b63d2019-01-22 16:30:57 -070023 except BaseException:
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070024 content_type = None
25 pass
26
Zack Williams045b63d2019-01-22 16:30:57 -070027 if "choices" in f["options"]:
28 return "select"
29 elif content_type == "date":
30 return "date"
31 elif f["type"] == "bool":
32 return "boolean"
33 elif f["type"] == "string":
34 return xproto_string_type(f["options"])
35 elif f["type"] in ["int", "uint32", "int32"] or "link" in f:
36 return "number"
37 elif f["type"] in ["double", "float"]:
38 return "string"
39
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070040
41def xproto_options_choices_to_dict(choices):
42 list = []
43
44 for c in eval(choices):
Zack Williams045b63d2019-01-22 16:30:57 -070045 list.append({"id": c[0], "label": c[1]})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070046 if len(list) > 0:
47 return list
48 else:
49 return None
50
Zack Williams045b63d2019-01-22 16:30:57 -070051
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070052def xproto_validators(f):
53 # To be cleaned up when we formalize validation in xproto
54 validators = []
55
56 # bound-based validators
Zack Williams045b63d2019-01-22 16:30:57 -070057 bound_validators = [("max_length", "maxlength"), ("min", "min"), ("max", "max")]
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070058
59 for v0, v1 in bound_validators:
60 try:
Zack Williams045b63d2019-01-22 16:30:57 -070061 validators.append({"name": v1, "int_value": int(f["options"][v0])})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070062 except KeyError:
63 pass
64
65 # validators based on content_type
Zack Williams045b63d2019-01-22 16:30:57 -070066 content_type_validators = ["ip", "url", "email"]
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070067
68 for v in content_type_validators:
Zack Williams045b63d2019-01-22 16:30:57 -070069 # if f['name']=='ip': pdb.set_trace()
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070070 try:
Zack Williams045b63d2019-01-22 16:30:57 -070071 val = unquote(f["options"]["content_type"]) == v
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070072 if not val:
73 raise KeyError
74
Zack Williams045b63d2019-01-22 16:30:57 -070075 validators.append({"name": v, "bool_value": True})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070076 except KeyError:
77 pass
78
79 # required validator
80 try:
Zack Williams045b63d2019-01-22 16:30:57 -070081 required = f["options"]["blank"] == "False" and f["options"]["null"] == "False"
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070082 if required:
Zack Williams045b63d2019-01-22 16:30:57 -070083 validators.append({"name": "required", "bool_value": required})
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070084 except KeyError:
85 pass
86
87 return validators
88
Zack Williams045b63d2019-01-22 16:30:57 -070089
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070090def is_number(s):
91 try:
92 float(s)
93 return True
94 except ValueError:
95 return False
96
Zack Williams045b63d2019-01-22 16:30:57 -070097
Matteo Scandolo292cc2a2017-07-31 19:02:12 -070098def xproto_default_to_gui(default):
Scott Baker4839dec2019-02-27 16:50:37 -080099 # TODO: Using `eval` here is potentially dangerous as it may allow code injection
Matteo Scandolo292cc2a2017-07-31 19:02:12 -0700100 val = "null"
Scott Baker4839dec2019-02-27 16:50:37 -0800101 try:
102 if is_number(default):
103 val = str(default)
104 elif eval(default) is True:
105 val = "true"
106 elif eval(default) is False:
107 val = "false"
108 elif eval(default) is None:
109 val = "null"
110 else:
111 val = str(default)
112 except NameError:
113 # val was a function call, and we can't pass those to the GUI
Zack Williams045b63d2019-01-22 16:30:57 -0700114 val = "null"
Scott Baker4839dec2019-02-27 16:50:37 -0800115
Matteo Scandolo1f826a42017-08-02 12:02:02 -0700116 return val
117
118
119def xproto_links_to_modeldef_relations(llst):
120 outlist = []
121 seen = []
122 for l in llst:
123 try:
Zack Williams045b63d2019-01-22 16:30:57 -0700124 t = l["link_type"]
125 except KeyError as e:
Matteo Scandolo1f826a42017-08-02 12:02:02 -0700126 raise e
127
Zack Williams045b63d2019-01-22 16:30:57 -0700128 if l["peer"]["fqn"] not in seen and t != "manytomany":
129 on_field = "null"
130 if l["link_type"] == "manytoone":
131 on_field = l["src_port"]
132 elif l["link_type"] == "onetomany":
133 on_field = l["dst_port"]
134 outlist.append(
135 "- {model: %s, type: %s, on_field: %s}\n"
136 % (l["peer"]["name"], l["link_type"], on_field)
137 )
138 seen.append(l["peer"])
Matteo Scandolo1f826a42017-08-02 12:02:02 -0700139
Sapan Bhatiabfb233a2018-02-09 14:53:09 -0800140 return outlist