blob: 9c52fbd0254c016e2163eb9a5e4d9ffd9819d21b [file] [log] [blame]
Sapan Bhatiad8e4a232017-07-12 21:20:06 -04001def django_content_type_string(xptags):
2 # Check possibility of KeyError in caller
3 content_type = xptags['content_type']
4
5 try:
6 content_type = eval(content_type)
7 except:
8 pass
9
10 if (content_type=='url'):
11 return 'URLField'
12 if (content_type=='date'):
13 return 'DateTimeField'
14 elif (content_type=='ip'):
15 return 'GenericIPAddressField'
16 elif (content_type=='stripped' or content_type=='"stripped"'):
17 return 'StrippedCharField'
18 else:
19 raise Exception('Unknown Type: %s'%content_type)
20
21def django_string_type(xptags):
22 try:
23 max_length = eval(xptags['max_length'])
24 except:
25 max_length = 1024 * 1024
26
27 if ('content_type' in xptags):
28 return django_content_type_string(xptags)
29 elif (max_length<1024*1024):
30 return 'CharField'
31 else:
32 return 'TextField'
33
34def xproto_django_type(xptype, xptags):
35 if (xptype=='string'):
36 return django_string_type(xptags)
37 elif (xptype=='float'):
38 return 'FloatField'
39 elif (xptype=='bool'):
40 return 'BooleanField'
41 elif (xptype=='uint32'):
42 return 'IntegerField'
43 elif (xptype=='int32'):
44 return 'IntegerField'
45 elif (xptype=='int64'):
46 return 'BigIntegerField'
47 else:
48 raise Exception('Unknown Type: %s'%xptype)
49
50def xproto_django_link_type(f):
51 if (f['link_type']=='manytoone'):
52 return 'ForeignKey'
53 elif (f['link_type']=='manytomany'):
54 if (f['dst_port']):
55 return 'ManyToManyField'
56 else:
57 return 'GenericRelation'
58
59def map_xproto_to_django(f):
60 allowed_keys=['help_text','default','max_length','modifier','blank','choices','db_index','null','editable','on_delete','verbose_name', 'auto_now_add']
61
62 m = {'modifier':{'optional':True, 'required':False, '_target':'null'}}
63 out = {}
64
65 for k,v in f['options'].items():
66 if (k in allowed_keys):
67 try:
68 kv2 = m[k]
69 out[kv2['_target']] = kv2[v]
70 except:
71 out[k] = v
72 return out
73
74def xproto_django_link_options_str(field, dport=None):
75 output_dict = map_xproto_to_django(field)
76
77 if (dport and (dport=='+' or '+' not in dport)):
78 output_dict['related_name'] = '%r'%dport
79
80 try:
81 if field['through']:
82 d = {}
83 if isinstance(field['through'], str):
84 split = field['through'].rsplit('.',1)
85 d['name'] = split[-1]
86 if len(split)==2:
87 d['package'] = split[0]
88 d['fqn'] = 'package' + '.' + d['name']
89 else:
90 d['fqn'] = d['name']
91 d['package'] = ''
92 else:
93 d = field['through']
94
95 if not d['name'].endswith('_'+field['name']):
96 output_dict['through'] = '%r'%d['fqn']
97 except KeyError:
98 pass
99
100 return format_options_string(output_dict)
101
102def format_options_string(d):
103 if (not d):
104 return ''
105 else:
106
107 lst = []
108 for k,v in d.items():
109 if (type(v)==str and k=='default' and v.endswith('()"')):
110 lst.append('%s = %s'%(k,v[1:-3]))
111 elif (type(v)==str and v.startswith('"')):
112 try:
113 tup = eval(v[1:-1])
114 if (type(tup)==tuple):
115 lst.append('%s = %r'%(k,tup))
116 else:
117 lst.append('%s = %s'%(k,v))
118 except:
119 lst.append('%s = %s'%(k,v))
120 elif (type(v)==bool):
121 lst.append('%s = %r'%(k,bool(v)))
122 else:
123 try:
124 lst.append('%s = %r'%(k,int(v)))
125 except ValueError:
126 lst.append('%s = %s'%(k,v))
127
128 return ', '.join(lst)
129
130def xproto_django_options_str(field, dport=None):
131 output_dict = map_xproto_to_django(field)
132
133 if (dport=='_'):
134 dport = '+'
135
136 if (dport and (dport=='+' or '+' not in dport)):
137 output_dict['related_name'] = '%r'%dport
138
139 return format_options_string(output_dict)