Selaa lähdekoodia

respuesta de datos con formato automático a través de reflección de objetos

robert2206 8 vuotta sitten
vanhempi
commit
1ada949bdc
5 muutettua tiedostoa jossa 81 lisäystä ja 178 poistoa
  1. 11 12
      controllers/http_handler.py
  2. BIN
      controllers/http_handler.pyc
  3. 30 0
      controllers/resources.json
  4. 40 166
      models/models.py
  5. BIN
      models/models.pyc

+ 11 - 12
controllers/http_handler.py

@@ -171,7 +171,8 @@ class ApiManager(http.Controller):
             return self.make_response({ 'error': 'cannot be process request' }, 400) # bad request
 
         resource = data['resource']
-        model, filters = self.resource_inflater(resource)
+        model, filters, blacklist = self.resource_inflater(resource)
+
         response_data = []
 
         if 'uid' in data:
@@ -180,7 +181,7 @@ class ApiManager(http.Controller):
         result = request.env[model].sudo().search(filters)
 
         for item in result:
-            response_data.append(item.dump())
+            response_data.append(item.dump(blacklist))
 
         self.make_info_log('To send data response')
         return self.make_response(response_data);
@@ -192,7 +193,7 @@ class ApiManager(http.Controller):
         if len(data) <= 1 or 'uid' in data:
             return self.make_response({ 'error': 'cannot be process request' }, 400) # bad request
 
-        model, filters = self.resource_inflater(data['resource'])
+        model = self.resource_inflater(data['resource'])[0]
         data = self.digest_data(data)
 
         try:
@@ -210,7 +211,7 @@ class ApiManager(http.Controller):
             return self.make_response({ 'error': 'cannot be process request' }, 400) # bad request
 
         uid = data['uid']
-        model, filters = self.resource_inflater(data['resource'])
+        model = self.resource_inflater(data['resource'])[0]
         data = self.digest_data(data)
 
         try:
@@ -257,7 +258,7 @@ class ApiManager(http.Controller):
         resource = data['resource']
         uid = data['uid']
 
-        model, filters = self.resource_inflater(resource)
+        model = self.resource_inflater(resource)[0]
         result = request.env[model].sudo().browse(uid)
 
         if not result.exists():
@@ -338,17 +339,15 @@ class ApiManager(http.Controller):
     # --------------------------------------------------------------------------
     def resource_inflater(self, resource):
         try:
-            model = RESOURCES_MAP[resource]['model']
-            filters = []
-
-            for i in range(len(RESOURCES_MAP[resource]['filters'])):
-                filters.append(tuple(RESOURCES_MAP[resource]['filters'][i]))
+            model = str(RESOURCES_MAP[resource]['model'])
+            filters = [tuple(f) for f in list(RESOURCES_MAP[resource]['filters'])]
+            blacklist = list(RESOURCES_MAP[resource]['blacklist'])
 
             self.make_info_log('Successfully resource inflated')
-            return (model, filters)
+            return (model, filters, blacklist)
         except Exception, e:
             self.make_error_log('Cannot inflate resource')
-            return (None, None)
+            return (None, None, None)
 
     # --------------------------------------------------------------------------
     # Get context for encryption

BIN
controllers/http_handler.pyc


+ 30 - 0
controllers/resources.json

@@ -5,6 +5,7 @@
 			["sale_ok", "=", true],
 			["active", "=", true]
 		],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"product_product": {
@@ -12,26 +13,31 @@
 		"filters": [
 			["active", "=", true]
 		],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"product_attribute_line": {
 		"model": "product.attribute.line",
 		"filters": [],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"product_attribute": {
 		"model": "product.attribute",
 		"filters": [],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"product_attribute_price": {
 		"model": "product.attribute.price",
 		"filters": [],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"product_attribute_value": {
 		"model": "product.attribute.value",
 		"filters": [],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"customer": {
@@ -40,6 +46,7 @@
 			["customer", "=", true],
 			["active", "=", true]
 		],
+		"blacklist": [],
 		"module": "sale"
 	},
 	"lead": {
@@ -48,6 +55,7 @@
 	    	["type", "=", "lead"],
 	    	["active", "=", "active"]
 		],
+		"blacklist": [],
 		"module": "crm"
 	},
 	"opportunity": {
@@ -56,6 +64,7 @@
 			["type", "=", "opportunity"],
 			["active", "=", true]
 		],
+		"blacklist": [],
 		"module": "crm"
 	},
   "user": {
@@ -64,6 +73,26 @@
       ["active", "=", true],
 			["jwt_token", "!=", false]
     ],
+		"blacklist": [
+			"property_account_position",
+			"ref_companies",
+			"alias_defaults",
+			"alias_parent_model_id",
+			"alias_id",
+			"property_stock_customer",
+			"property_product_pricelist",
+			"id_pos_order",
+			"title",
+			"child_ids",
+			"property_stock_supplier",
+			"user_ids",
+			"property_account_receivable",
+			"contract_ids",
+			"commercial_partner_id",
+			"message_followers_ids",
+			"notify_email",
+			"employee_ids"
+		],
     "module": "sale"
   },
   "partner": {
@@ -71,6 +100,7 @@
     "filters": [
       ["active", "=", true]
     ],
+		"blacklist": [],
     "module": "sale"
   }
 }

+ 40 - 166
models/models.py

@@ -2,6 +2,28 @@
 from openerp import models, fields
 import inspect
 
+DEFAULT_BLACKLIST = ['create_uid', '__last_update', 'sequence', 'write_uid', 'write_date']
+
+'''
+'''
+def serialize(obj, blacklist = []):
+    attributes = [a for a in inspect.getmembers(obj, lambda a:not(inspect.isroutine(a))) if a[0] == '_fields']
+    data = {}
+
+    for field in dict(attributes[0][1]):
+        if field in blacklist:
+            continue
+
+        obj_value = getattr(obj, field)
+
+        if 'class' in str(type(obj_value)):
+            data[field] = [o.id for o in obj_value] if obj_value else []
+            continue
+
+        data[field] = getattr(obj, field)
+
+    return data
+
 '''
     Users class with token field for manage authentication
 '''
@@ -10,216 +32,68 @@ class res_users(models.Model):
 
     jwt_token = fields.Char(string = 'JWT Authentication Token');
 
-    def dump(self):
-        return {
-            'id': self.id,
-            'name': self.name,
-            'login': self.login,
-            'email': self.email,
-            'image_small': self.image_small,
-            'image_medium': self.image_medium,
-            'jwt_token': self.jwt_token,
-            'company_id': self.company_id.id,
-            'partner_id': self.partner_id.id,
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class res_partner(models.Model):
     _inherit = 'res.partner'
 
-    def dump(self):
-        return {
-            'id': self.id,
-            'name': self.name,
-            'display_name': self.display_name,
-            'phone': self.phone,
-            'mobile': self.mobile,
-            'email': self.email,
-            'birthdate': self.birthdate,
-            'city': self.city,
-            'street': self.street,
-            'partner_latitude': self.partner_latitude,
-            'partner_longitude': self.partner_longitude,
-            'image_medium': self.image_medium,
-            'image_small': self.image_small,
-            'comment': self.comment,
-            'phonecall_count': self.phonecall_count,
-            'opportunity_count': self.opportunity_count,
-            'meeting_count': self.meeting_count,
-            'journal_item_count': self.journal_item_count,
-            'sale_order_count': self.sale_order_count,
-            'contracts_count': self.contracts_count,
-            'company_id': self.company_id.id,
-            'country_id': self.country_id.id
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class crm_lead(models.Model):
     _inherit = 'crm.lead'
 
-    def dump(self):
-        return {
-            'id': self.id,
-            'name': self.name,
-            'display_name': self.display_name,
-            'phone': self.phone,
-            'mobile': self.mobile,
-            'city': self.city,
-            'street': self.street,
-            'street2': self.street2,
-            'partner_name': self.partner_name,
-            'contact_name': self.contact_name,
-            'date_open': self.day_open,
-            'day_close': self.day_close,
-            'day_open': self.day_open,
-            'priority': self.priority,
-            'probability': self.probability,
-            'planned_cost': self.planned_cost,
-            'description': self.description,
-            'meeting_count': self.meeting_count,
-            'partner_id': self.partner_id.id,
-            'company_id': self.company_id.id,
-            'stage_id': self.stage_id.id,
-            'campaign_id': self.campaign_id.id,
-            'country_id': self.country_id.id
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 '''
 '''
 class product_template(models.Model):
     _inherit = 'product.template'
 
-    def dump(self):
-        return {
-            'active': self.active,
-            'alternative_product_ids': [alt.id for alt in self.alternative_product_ids] if self.alternative_product_ids else [],
-            'attribute_line_ids': [line.id for line in self.attribute_line_ids] if self.attribute_line_ids else [],
-            'color': self.color,
-            'company_id': self.company_id.id if self.company_id.id else None,
-            'categ_id': self.categ_id.id if self.categ_id.id else None,
-            'default_code': self.default_code if self.default_code else None,
-            'description': self.description if self.description else None,
-            'display_name': self.display_name,
-            'ean13': self.ean13 if self.ean13 else None,
-            'factory_barcode': self.factory_barcode if self.factory_reference else None,
-            'factory_reference': self.factory_reference if self.factory_reference else None,
-            'flip_image': self.flip_image if hasattr(self, 'flip_image') else None,
-            'image_medium': self.image_medium,
-            'image_small': self.image_small,
-            'is_flip_image': self.is_flip_image if hasattr(self, 'is_flip_image') else False,
-            'is_product_variant': self.is_product_variant,
-            'list_price': self.list_price,
-            'mes_type': self.mes_type,
-            'multiple_image': self.multiple_image if hasattr(self, 'multiple_image') else False,
-            'name': self.name,
-            'price': self.price,
-            'product_variant_count': self.product_variant_count,
-            'product_variant_ids': [variant.id for variant in self.product_variant_ids] if self.product_variant_ids else [],
-            'purchase_ok': self.purchase_ok if hasattr(self, 'purchase_ok') else False,
-            'qty_available': self.qty_available if hasattr(self, 'qty_available') else 0,
-            'rental': self.rental if hasattr(self, 'rental') else False,
-            'sale_ok': self.sale_ok if hasattr(self, 'sale_ok') else False,
-            'type': self.type if hasattr(self, 'type') else None,
-            'website_published': self.website_published if hasattr(self, 'website_published') else False
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class product_attribute_line(models.Model):
     _inherit = 'product.attribute.line'
 
-    def dump(self):
-        return {
-            'attribute_id': self.attribute_id.id if self.attribute_id.id else None,
-            'create_date': self.create_date,
-            'display_name': self.display_name,
-            'id': self.id,
-            'product_tmpl_id': self.product_tmpl_id.id if self.product_tmpl_id.id else None,
-            'value_ids': [value.id for value in self.value_ids] if self.value_ids else []
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class product_attribute(models.Model):
     _inherit = 'product.attribute'
 
-    def dump(self):
-        return {
-            'active': self.active,
-            'create_date': self.create_date,
-            'display_name': self.display_name,
-            'id': self.id,
-            'name': self.name,
-            'type': self.type,
-            'value_ids': [value.id for value in self.value_ids] if self.value_ids else []
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class product_attribute_price(models.Model):
     _inherit = 'product.attribute.price'
 
-    def dump(self):
-        attributes = inspect(self, lambda a:not(isroutine(a)))
-        print '----------------------------------------------------------------'
-        print attributes
-        print '----------------------------------------------------------------'
-        
-        return {
-            'response': 'ok'
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class product_attribute_value(models.Model):
     _inherit = 'product.attribute.value'
 
-    def dump(self):
-        return {
-            'attribute_id': self.attribute_id.id if self.attribute_id.id else None,
-            'color': self.color if self.color else None,
-            'create_date': self.create_date,
-            'display_name': self.display_name,
-            'id': self.id,
-            'name': self.name,
-            'price_extra': self.price_extra,
-            'price_ids': [price.id for price in self.price_ids] if self.price_ids else [],
-            'product_ids': [product.id for product in self.product_ids] if self.product_ids else []
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist + DEFAULT_BLACKLIST)
 
 '''
 '''
 class product_product(models.Model):
     _inherit = 'product.product'
 
-    def dump(self):
-        return {
-            'active': self.active,
-            'alternative_product_ids': [alternative.id for alternative in self.alternative_product_ids] if self.alternative_product_ids else [],
-            'attribute_line_ids': [alt.id for alt in self.attribute_line_ids] if self.attribute_line_ids else [],
-            'attribute_value_ids': [value.id for value in self.attribute_value_ids] if self.attribute_value_ids else [],
-            'categ_id': self.categ_id.id if self.categ_id else None,
-            'code': self.code,
-            'company_id': self.company_id.id if self.company_id else None,
-            'create_date': self.create_date,
-            'default_code': self.default_code if self.default_code else None,
-            'description': self.description if self.description else None,
-            'display_name': self.display_name,
-            'ean13': self.ean13 if self.ean13 else None,
-            'factory_barcode': self.factory_barcode if self.factory_barcode else None,
-            'factory_reference': self.factory_reference if self.factory_reference else None,
-            'image_medium': self.image_medium,
-            'image_small': self.image_small,
-            'image_variant': self.image_variant,
-            'id': self.id,
-            'is_product_variant': self.is_product_variant,
-            'list_price': self.list_price,
-            'name': self.name,
-            'name_template': self.name_template,
-            'price': self.price,
-            'price_extra': self.price_extra,
-            'product_tmpl_id': self.product_tmpl_id.id if self.product_tmpl_id else None,
-            'product_variant_count': self.product_variant_count,
-            'product_variant_ids': [variant.id for variant in self.product_variant_ids] if self.product_variant_ids else []
-        }
+    def dump(self, blacklist = []):
+        return serialize(self, blacklist, DEFAULT_BLACKLIST)

BIN
models/models.pyc