-##############################################################################\r
-# Copyright (c) 2015 Orange\r
-# guyrodrigue.koffi@orange.com / koffirodrigue@gmail.com\r
-# All rights reserved. This program and the accompanying materials\r
-# are made available under the terms of the Apache License, Version 2.0\r
-# which accompanies this distribution, and is available at\r
-# http://www.apache.org/licenses/LICENSE-2.0\r
-# feng.xiaowei@zte.com.cn mv Pod to pod_models.py 5-18-2016\r
-# feng.xiaowei@zte.com.cn add MetaCreateResponse/MetaGetResponse 5-18-2016\r
-# feng.xiaowei@zte.com.cn mv TestProject to project_models.py 5-19-2016\r
-# feng.xiaowei@zte.com.cn delete meta class 5-19-2016\r
-# feng.xiaowei@zte.com.cn add CreateResponse 5-19-2016\r
-# feng.xiaowei@zte.com.cn mv TestCase to testcase_models.py 5-20-2016\r
-# feng.xiaowei@zte.com.cn mv TestResut to result_models.py 5-23-2016\r
-# feng.xiaowei@zte.com.cn add ModelBase 12-20-2016\r
-##############################################################################\r
-import copy\r
-\r
-from opnfv_testapi.tornado_swagger import swagger\r
-\r
-\r
-class ModelBase(object):\r
-\r
- def _format(self, excludes):\r
- new_obj = copy.deepcopy(self)\r
- dicts = new_obj.__dict__\r
- for k in dicts.keys():\r
- if k in excludes:\r
- del dicts[k]\r
- elif dicts[k]:\r
- if hasattr(dicts[k], 'format'):\r
- dicts[k] = dicts[k].format()\r
- elif isinstance(dicts[k], list):\r
- hs = list()\r
- [hs.append(h.format() if hasattr(h, 'format') else str(h))\r
- for h in dicts[k]]\r
- dicts[k] = hs\r
- elif not isinstance(dicts[k], (str, int, float, dict)):\r
- dicts[k] = str(dicts[k])\r
- return dicts\r
-\r
- def format(self):\r
- return self._format(['_id'])\r
-\r
- def format_http(self):\r
- return self._format([])\r
-\r
- @staticmethod\r
- def attr_parser():\r
- return {}\r
-\r
- @classmethod\r
- def from_dict(cls, a_dict):\r
- if a_dict is None:\r
- return None\r
-\r
- attr_parser = cls.attr_parser()\r
- t = cls()\r
- for k, v in a_dict.iteritems():\r
- value = v\r
- if isinstance(v, dict) and k in attr_parser:\r
- value = attr_parser[k].from_dict(v)\r
- elif isinstance(v, list) and k in attr_parser:\r
- value = []\r
- for item in v:\r
- value.append(attr_parser[k].from_dict(item))\r
-\r
- t.__setattr__(k, value)\r
-\r
- return t\r
-\r
-\r
-@swagger.model()\r
-class CreateResponse(ModelBase):\r
- def __init__(self, href=''):\r
- self.href = href\r
-\r
-\r
-@swagger.model()\r
-class Versions(ModelBase):\r
- """\r
- @property versions:\r
- @ptype versions: C{list} of L{Version}\r
- """\r
-\r
- def __init__(self):\r
- self.versions = list()\r
-\r
- @staticmethod\r
- def attr_parser():\r
- return {'versions': Version}\r
-\r
-\r
-@swagger.model()\r
-class Version(ModelBase):\r
- def __init__(self, version=None, description=None):\r
- self.version = version\r
- self.description = description\r
+##############################################################################
+# Copyright (c) 2015 Orange
+# guyrodrigue.koffi@orange.com / koffirodrigue@gmail.com
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+# feng.xiaowei@zte.com.cn mv Pod to pod_models.py 5-18-2016
+# feng.xiaowei@zte.com.cn add MetaCreateResponse/MetaGetResponse 5-18-2016
+# feng.xiaowei@zte.com.cn mv TestProject to project_models.py 5-19-2016
+# feng.xiaowei@zte.com.cn delete meta class 5-19-2016
+# feng.xiaowei@zte.com.cn add CreateResponse 5-19-2016
+# feng.xiaowei@zte.com.cn mv TestCase to testcase_models.py 5-20-2016
+# feng.xiaowei@zte.com.cn mv TestResut to result_models.py 5-23-2016
+# feng.xiaowei@zte.com.cn add ModelBase 12-20-2016
+##############################################################################
+import ast
+import copy
+
+from opnfv_testapi.tornado_swagger import swagger
+
+
+class ModelBase(object):
+
+ def format(self):
+ return self._format(['_id'])
+
+ def format_http(self):
+ return self._format([])
+
+ @classmethod
+ def from_dict(cls, a_dict):
+ if a_dict is None:
+ return None
+
+ attr_parser = cls.attr_parser()
+ t = cls()
+ for k, v in a_dict.iteritems():
+ value = v
+ if isinstance(v, dict) and k in attr_parser:
+ value = attr_parser[k].from_dict(v)
+ elif isinstance(v, list) and k in attr_parser:
+ value = []
+ for item in v:
+ value.append(attr_parser[k].from_dict(item))
+
+ t.__setattr__(k, value)
+
+ return t
+
+ @classmethod
+ def from_dict_with_raise(cls, a_dict):
+ if a_dict is None:
+ return None
+
+ attr_parser = cls.attr_parser()
+ t = cls()
+ for k, v in a_dict.iteritems():
+ if k not in t.__dict__:
+ raise AttributeError(
+ '{} has no attribute {}'.format(cls.__name__, k))
+ value = v
+ if isinstance(v, dict) and k in attr_parser:
+ value = attr_parser[k].from_dict_with_raise(v)
+ elif isinstance(v, list) and k in attr_parser:
+ value = []
+ for item in v:
+ value.append(attr_parser[k].from_dict_with_raise(item))
+
+ t.__setattr__(k, value)
+
+ return t
+
+ @staticmethod
+ def attr_parser():
+ return {}
+
+ def _format(self, excludes):
+ new_obj = copy.deepcopy(self)
+ dicts = new_obj.__dict__
+ for k in dicts.keys():
+ if k in excludes:
+ del dicts[k]
+ elif dicts[k]:
+ dicts[k] = self._obj_format(dicts[k])
+ return dicts
+
+ def _obj_format(self, obj):
+ if self._has_format(obj):
+ obj = obj.format()
+ elif isinstance(obj, unicode):
+ try:
+ obj = self._obj_format(ast.literal_eval(obj))
+ except:
+ try:
+ obj = str(obj)
+ except:
+ obj = obj
+ elif isinstance(obj, list):
+ hs = list()
+ for h in obj:
+ hs.append(self._obj_format(h))
+ obj = hs
+ elif not isinstance(obj, (str, int, float, dict)):
+ obj = str(obj)
+ return obj
+
+ @staticmethod
+ def _has_format(obj):
+ return not isinstance(obj, (str, unicode)) and hasattr(obj, 'format')
+
+
+@swagger.model()
+class CreateResponse(ModelBase):
+ def __init__(self, href=''):
+ self.href = href
+
+
+@swagger.model()
+class Versions(ModelBase):
+ """
+ @property versions:
+ @ptype versions: C{list} of L{Version}
+ """
+
+ def __init__(self):
+ self.versions = list()
+
+ @staticmethod
+ def attr_parser():
+ return {'versions': Version}
+
+
+@swagger.model()
+class Version(ModelBase):
+ def __init__(self, version=None, description=None):
+ self.version = version
+ self.description = description