소스 검색

los metodos get y delete fueron implementados

robert2206 8 년 전
부모
커밋
2cd26a76df
6개의 변경된 파일208개의 추가작업 그리고 7개의 파일을 삭제
  1. 2 1
      __openerp__.py
  2. 117 6
      controllers/http_handler.py
  3. BIN
      controllers/http_handler.pyc
  4. 26 0
      controllers/resources.json
  5. 63 0
      models/models.py
  6. BIN
      models/models.pyc

+ 2 - 1
__openerp__.py

@@ -12,5 +12,6 @@
     'website': "http://www.eiru.com.py",
     'category': 'Tools',
     'version': '0.1',
-    'depends': ['base'],
+    'depends': ['sale', 'crm', 'base_geolocalize'],
+    'installable': True
 }

+ 117 - 6
controllers/http_handler.py

@@ -3,15 +3,23 @@ from openerp import http
 from openerp.http import request
 from passlib.context import CryptContext
 
-import werkzeug.wrappers
+import os
 import jwt
 import json
+import pickle
+import marshal
+from werkzeug.wrappers import Response
 
-crypt_context = CryptContext(
+CRYPT_CONTEXT = CryptContext(
     ['pbkdf2_sha512', 'md5_crypt'],
     deprecated=['md5_crypt'],
 )
 
+RESOURCES_MAP = None
+
+with open(os.path.dirname(__file__) + '/resources.json') as resources:
+    RESOURCES_MAP = json.load(resources)
+
 '''
     Class for manage authentication
 '''
@@ -45,7 +53,7 @@ class Auth(http.Controller):
     # --------------------------------------------------------------------------
     # Check JWT token auth
     # --------------------------------------------------------------------------
-    @http.route(['/api/check'], type = 'http', auth = 'none', cors = '*')
+    @http.route(['/api/check'], type = 'http', auth = 'none',  methods = ['POST'], cors = '*')
     def check_token(self, **args):
         try:
             user = request.env['res.users'].sudo().search([('jwt_token', '=', args['token'])])
@@ -64,14 +72,117 @@ class Auth(http.Controller):
     # Get context for encryption
     # --------------------------------------------------------------------------
     def get_crypt_context(self):
-        return crypt_context
+        return CRYPT_CONTEXT
 
 
 '''
     Class for manage rest api interaction
 '''
 class ApiManager(http.Controller):
+    RESOURCES_MAP = [
+        {'customers': 'res.partner'}
+    ]
+
+    # --------------------------------------------------------------------------
+    # Restify your request
+    # --------------------------------------------------------------------------
+    @http.route([
+                    '/api/<any(customers, leads, opportunities):resource>',
+                    '/api/<any(customers, leads, opportunities):resource>/<int:uid>'
+                ],
+                type = 'http',
+                auth = 'none',
+                cors = '*')
+    def restify(self, resource, uid = None):
+        if not self.resource_exists(resource):
+            return self.make_response({'error': 'resource not available'})
+
+        http_verb = request.httprequest.method
+
+        if http_verb == 'GET':
+            return self.http_get(resource, uid)
+
+        if http_verb == 'POST':
+            return json.dumps({'verb': 'POST'}, sort_keys = True)
+
+        if http_verb == 'PUT' or http_verb == 'PATCH':
+            return json.dumps({'verb': 'PUT OR PATCH'})
+
+        if http_verb == 'DELETE':
+            return self.http_delete(resource, uid)
+
+        return json.dumps({'error': 'method not allowed'})
+
+    # --------------------------------------------------------------------------
+    # Manage GET request
+    # --------------------------------------------------------------------------
+    def http_get(self, resource, uid):
+        model, filters = self.resource_inflater(resource)
+        data = []
+
+        if uid != None:
+            filters.append(('id', '=', uid))
+
+        result = request.env[model].sudo().search(filters)
+
+        for item in result:
+            data.append(item.dump())
+
+        return self.make_response(data);
+
+
+    # --------------------------------------------------------------------------
+    # Manage DELETE request
+    # --------------------------------------------------------------------------
+    def http_delete(self, resource, uid):
+        if uid == None:
+            return self.make_response({'error': 'uid not provided'})
 
-    @http.route(['/api/customers'], type = 'http', auth = 'none', cors = '*')
-    def customers(self):
+        model, filters = self.resource_inflater(resource)
+        result = request.env[model].sudo().browse(uid)
+
+        if not result.exists():
+            return self.make_response({'error': 'cannot be deleted'})
+
+        return self.make_response({'response': result.unlink()})
+
+    # --------------------------------------------------------------------------
+    # Make JSON response
+    # --------------------------------------------------------------------------
+    def make_response(self, data):
+        return Response(json.dumps(data), mimetype = 'application/json')
+
+    # --------------------------------------------------------------------------
+    # Manage JWT token validity
+    # --------------------------------------------------------------------------
+    def resource_exists(self, resource):
+        try:
+            model = RESOURCES_MAP[resource]['module']
+            module_name = model.replace('.', '_')
+
+            module = request.env['ir.module.module'].sudo().search([('name', '=', module_name)])
+
+            return True if module.state == 'installed' and len(module) != 0 else False
+        except Exception, e:
+            return False;
+
+    # --------------------------------------------------------------------------
+    # Manage JWT token validity
+    # --------------------------------------------------------------------------
+    def check_token(self, token):
         pass
+
+    # --------------------------------------------------------------------------
+    # Manage GET request
+    # --------------------------------------------------------------------------
+    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]))
+
+            return (model, filters)
+        except Exception, e:
+            return (None, None)

BIN
controllers/http_handler.pyc


+ 26 - 0
controllers/resources.json

@@ -0,0 +1,26 @@
+{
+	"customers": {
+		"model": "res.partner",
+		"filters": [
+			["customer", "=", true],
+			["active", "=", true]
+		],
+		"module": "sale"
+	},
+	"leads": {
+	  	"model": "crm.lead",
+	  	"filters": [
+	    	["type", "=", "lead"],
+	    	["active", "=", "active"]
+		],
+		"module": "crm"
+	},
+		"opportunities": {
+		"model": "crm.lead",
+		"filters": [
+			["type", "=", "opportunity"],
+			["active", "=", true]
+		],
+		"module": "crm"
+	}
+}

+ 63 - 0
models/models.py

@@ -8,3 +8,66 @@ class res_users(models.Model):
     _inherit = 'res.users'
 
     jwt_token = fields.Char(string = 'JWT Authentication Token');
+
+'''
+'''
+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
+        }
+
+'''
+'''
+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
+        }

BIN
models/models.pyc