| |
| # Copyright 2017-present Open Networking Foundation |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| |
| import pdb |
| |
| def format_options_string(d): |
| if (not d): return '' |
| lst = [] |
| try: |
| for k,v in d.items(): |
| if (type(v)==int or type(v)==bool or type(v)==float): |
| lst.append('%s = %r'%(k,v)) |
| else: |
| lst.append('%s = "%s"'%(k,v)) |
| except: |
| pass |
| return '['+', '.join(lst)+']' |
| |
| |
| def map_django_to_xproto(f): |
| allowed_keys=['help_text','default','max_length','choices','blank','null','related_name','db_index'] |
| |
| m = {'help_text':{'_target':'help_text','':None}} |
| out = {} |
| |
| for k in allowed_keys: |
| try: |
| v = getattr(f,k) |
| except: |
| continue |
| |
| if (k=='choices' and v==[]): |
| continue |
| |
| if (k=='default' and type(v)==float): |
| pass |
| |
| if (k=='default' and 'function' in type(v).__name__): |
| v = v.__name__+"()" |
| |
| try: |
| n = v.__name__ |
| except AttributeError: |
| n = None |
| if (v is None or n=='NOT_PROVIDED'): |
| continue |
| |
| if (k in allowed_keys): |
| try: |
| kv2 = m[k] |
| if (kv2[v] is None): |
| continue |
| |
| out[kv2['_target']] = kv2[v] |
| except: |
| out[k] = v |
| return out |
| |
| |
| def xp_options(field): |
| output_dict = map_django_to_xproto(field) |
| t0 = field.type |
| |
| if (t0=='StrippedCharField'): |
| ctype = 'stripped' |
| elif (t0=='URLField'): |
| ctype = 'url' |
| elif (t0=='DateTimeField'): |
| ctype = 'date' |
| elif (t0=='GenericIPAddressField'): |
| ctype = 'ip' |
| else: |
| ctype = None |
| |
| if (ctype): |
| output_dict['content_type'] = ctype |
| |
| |
| return format_options_string(output_dict) |
| |
| def xp_to_xproto(field, idx): |
| at = type(field).__name__ |
| try: |
| t = field.get_internal_type() |
| except AttributeError: |
| t = type(field).__name__ |
| |
| link = False |
| through = None |
| |
| if (t=='CharField' or t=='TextField' or t=='SlugField'): |
| xptype = 'string' |
| elif (t=='BooleanField'): |
| xptype = 'bool' |
| elif (t=='ManyToManyField'): |
| if (at=='ManyToManyField'): |
| xptype = 'manytomany' |
| peer = field.related.model.__name__ |
| through = field.related.model.through |
| if (field.related.name): |
| dst_port = ':' + field.related.name |
| else: |
| dst_port = '' |
| else: |
| xptype = 'manytomany' |
| peer = field.related.model.__name__ |
| dst_port = '' |
| |
| |
| link = True |
| elif (t=='ForeignKey'): |
| xptype = 'manytoone' |
| peer = field.related.model.__name__ |
| if (field.related.name): |
| dst_port = ':' + field.related.name |
| else: |
| dst_port = '' |
| link = True |
| elif (t=='DateTimeField'): |
| xptype = 'string' |
| elif (t=='AutoField'): |
| xptype = 'int32' |
| elif (t=='BigIntegerField'): |
| xptype = 'int32' |
| elif (t=='IntegerField'): |
| xptype = 'int32' |
| elif (t=='PositiveIntegerField'): |
| xptype = 'uint32' |
| elif (t=='FloatField'): |
| xptype = 'float' |
| elif (t=='GenericIPAddressField'): |
| xptype = 'string' |
| elif (t=='OneToOneField'): |
| link = True |
| |
| else: |
| raise Exception('Bad field') |
| |
| if (field.null==False): |
| modifier = 'required' |
| else: |
| modifier = 'optional' |
| |
| if (link): |
| if (through): |
| dst_model = '%s/%s'%(peer,through) |
| else: |
| dst_model = '%s'%peer |
| |
| str = '%s %s %s->%s%s = %d'%(modifier, xptype, field.name, dst_model, dst_port, idx) |
| else: |
| str = '%s %s %s = %d'%(modifier, xptype, field.name, idx) |
| |
| return str |
| |