Jelajahi Sumber

bug resuelto en la resolución de relaciones muchos a muchos

robert2206 8 tahun lalu
induk
melakukan
cc4e961b8e
5 mengubah file dengan 101 tambahan dan 23 penghapusan
  1. 17 10
      controllers/http_handler.py
  2. TEMPAT SAMPAH
      controllers/http_handler.pyc
  3. 12 1
      controllers/resources.json
  4. 72 12
      models/models.py
  5. TEMPAT SAMPAH
      models/models.pyc

+ 17 - 10
controllers/http_handler.py

@@ -172,7 +172,6 @@ class ApiManager(http.Controller):
 
         resource = data['resource']
         model, filters, exclude = self.resource_inflater(resource)
-
         response_data = []
 
         if 'uid' in data:
@@ -197,7 +196,8 @@ class ApiManager(http.Controller):
         data = self.digest_data(data)
 
         try:
-            result = request.env[model].sudo().create(data)
+            print '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> POST'
+            result = request.env[model].with_context(request.context).create(data)
 
             return self.make_response(result.id)
         except Exception, e:
@@ -215,14 +215,23 @@ class ApiManager(http.Controller):
         data = self.digest_data(data)
 
         try:
-            result = request.env[model].sudo().browse(uid)
+            model = request.env[model]
+            result = model.sudo().browse(uid)
 
             if not result.exists():
                 return self.make_response({ 'error': 'cannot be updated' })
 
             self.make_info_log('To update object')
-            return self.make_response({ 'response': result.sudo().write(data) })
+            for item in result:
+                deserialized_data = item.deserialize("update", data)
+                ok = item.write(deserialized_data)
+
+                if not ok:
+                    raise Exception('Cannot write')
+
+            return self.make_response({ 'response': True })
         except Exception, e:
+            print e
             return self.make_response({ 'response': False })
 
     # --------------------------------------------------------------------------
@@ -240,12 +249,6 @@ class ApiManager(http.Controller):
         if 'remote_id' in data:
             del data['remote_id']
 
-        for key in data:
-            try:
-                data[key] = json.loads(data[key])
-            except Exception, e:
-                continue;
-
         return data
 
     # --------------------------------------------------------------------------
@@ -323,8 +326,12 @@ class ApiManager(http.Controller):
 
             self.make_info_log('Token is valid')
             request.context['lang'] = user.lang
+            request.session['context']['lang'] = user.lang
+            request.session['uid'] = user.id
+
             return True
         except Exception, e:
+            print e
             self.make_error_log('Token is not valid')
             return False
 

TEMPAT SAMPAH
controllers/http_handler.pyc


+ 12 - 1
controllers/resources.json

@@ -5,7 +5,18 @@
 			["sale_ok", "=", true],
 			["active", "=", true]
 		],
-		"exclude": [],
+		"exclude": [
+			"active",
+			"message_followers_ids",
+			"message_ids",
+			"message_is_follower",
+			"message_last_post",
+			"message_summary",
+			"message_unread",
+			"outgoing_qty",
+			"packaging_ids",
+			"route_ids"
+		],
 		"module": "sale"
 	},
 	"product_product": {

+ 72 - 12
models/models.py

@@ -1,6 +1,5 @@
 # -*- coding: utf-8 -*-
 from openerp import models, fields
-import inspect
 
 DEFAULT_FIELDS_EXCLUDED = [
     'self',
@@ -10,42 +9,100 @@ DEFAULT_FIELDS_EXCLUDED = [
     'sequence',
     'write_uid',
     'write_date',
-    'tz',
-    'lang'
+    'tz'
 ]
 
 '''
+    Serialize object
 '''
 def serialize(self, exclude = []):
     fields = self.fields_get()
+    field_names = exclude + DEFAULT_FIELDS_EXCLUDED
     data = {}
 
     for field in fields:
-        if field in (exclude + DEFAULT_FIELDS_EXCLUDED):
+        if field in field_names:
             continue
+
         definition = fields[field]
 
         if 'exportable' in definition:
             continue
 
-
         value = getattr(self, field)
+        def_type = definition['type']
 
-        if definition['type'] in ('char', 'text', 'html', 'date', 'datetime'):
+        if def_type in ['char', 'text', 'html', 'date', 'datetime']:
             data[field] = value if type(value) is not bool else None
+            continue
 
-        if definition['type'] in ('many2one'):
-            data[field] = value.id if value.id else None
+        if def_type in ['integer', 'float', 'boolean', 'binary']:
+            data[field] = value
+            continue
 
-        if definition['type'] in ('one2many', 'many2many'):
+        if def_type in ['one2many', 'many2many']:
             data[field] = [obj.id for obj in value] if value else []
+            continue
 
-        if definition['type'] in ('integer', 'float', 'boolean', 'selection', 'binary'):
-            data[field] = value
+        if def_type == 'many2one':
+            data[field] = value.id if value.id else None
+            continue
+
+        if def_type == 'selection':
+            data[field] = value if value else None
 
     return data
 
-models.Model.serialize = serialize
+'''
+    Deserialize data
+'''
+def deserialize(self, to = "create", data = None):
+    fields = self.fields_get();
+    field_names = list(set(fields.keys()) - set(DEFAULT_FIELDS_EXCLUDED))
+    deserialized_data = {}
+
+    for item in data:
+        if item not in field_names:
+            continue
+
+        definition = fields[item]
+        value = data[item]
+        def_type = definition['type']
+
+        if def_type in ['char', 'text', 'html', 'date', 'datetime', 'selection']:
+            deserialized_data[item] = str(value) if value != 'null' else False
+            continue
+
+        if def_type == 'one2many':
+            continue
+
+        if def_type == 'many2many':
+            if to == 'update':
+                deserialized_data[item] = [(6, 0, map(lambda i: int(i), value.split(',')))] if value else None
+            else:
+                pass
+            continue
+
+        if def_type == 'many2one':
+            deserialized_data[item] = int(value) if value != 'null' else False
+            continue
+
+        if def_type == 'integer':
+            deserialized_data[item] = int(value)
+            continue
+
+        if def_type == 'float':
+            deserialized_data[item] = float(value)
+            continue
+
+        if def_type == 'boolean':
+            deserialized_data[item] = False if value == 'false' else True
+            continue
+
+        if def_type == 'binary':
+            deserialized_data[item] = str(value) if value != 'null' else None
+
+    return deserialized_data
 
 '''
     Users class with token field for manage authentication
@@ -54,3 +111,6 @@ class res_users(models.Model):
     _inherit = 'res.users'
 
     jwt_token = fields.Char(string = 'JWT Authentication Token');
+
+models.Model.serialize = serialize
+models.Model.deserialize = deserialize

TEMPAT SAMPAH
models/models.pyc