示例#1
0
 def search_read(self,
                 model,
                 domain=None,
                 fields=None,
                 context=None,
                 limit=80,
                 offset=0,
                 order=None,
                 **kw):
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     domain = domain and parse_value(domain) or []
     fields = fields and parse_value(fields) or None
     limit = limit and int(limit) or None
     offset = offset and int(offset) or None
     model = request.env[model].with_context(ctx)
     result = model.search_read(domain,
                                fields=fields,
                                offset=offset,
                                limit=limit,
                                order=order)
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=ResponseEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)
示例#2
0
 def read_group(self,
                model,
                domain,
                fields,
                groupby,
                context=None,
                offset=0,
                limit=None,
                orderby=False,
                lazy=True,
                **kw):
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     domain = domain and parse_value(domain) or []
     fields = fields and parse_value(fields) or []
     groupby = groupby and parse_value(groupby) or []
     limit = limit and int(limit) or None
     offset = offset and int(offset) or None
     lazy = misc.str2bool(lazy)
     model = request.env[model].with_context(ctx)
     result = model.read_group(domain,
                               fields,
                               groupby,
                               offset=offset,
                               limit=limit,
                               orderby=orderby,
                               lazy=lazy)
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=ResponseEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)
示例#3
0
 def search(self,
            model,
            domain=None,
            context=None,
            count=False,
            limit=80,
            offset=0,
            order=None,
            **kw):
     ctx = request.session.context.copy()
     ctx.update({'prefetch_fields': False})
     ctx.update(context and parse_value(context) or {})
     domain = domain and parse_value(domain) or []
     count = count and misc.str2bool(count) or None
     limit = limit and int(limit) or None
     offset = offset and int(offset) or None
     model = request.env[model].with_context(ctx)
     result = model.search(domain,
                           offset=offset,
                           limit=limit,
                           order=order,
                           count=count)
     if not count:
         result = result.ids
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=ResponseEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)
示例#4
0
 def unlink(self, model, ids=None, context=None, **kw):
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     ids = ids and parse_value(ids) or []
     records = request.env[model].with_context(ctx).browse(ids)
     result = records.unlink()
     content = json.dumps(result, sort_keys=True, indent=4, cls=ResponseEncoder)
     return Response(content, content_type='application/json;charset=utf-8', status=200)
示例#5
0
 def create(self, model, values=None, context=None, **kw):
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     values = values and parse_value(values) or {}
     model = request.env[model].with_context(ctx)
     result = model.create(values).ids
     content = json.dumps(result, sort_keys=True, indent=4, cls=ResponseEncoder)
     return Response(content, content_type='application/json;charset=utf-8', status=200)
示例#6
0
 def call(self, model, method, ids=None, context=None, args=None, kwargs=None, **kw):
     check_method_name(method)
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     ids = ids and parse_value(ids) or []
     args = args and parse_value(args) or []
     kwargs = kwargs and parse_value(kwargs) or {}
     records = request.env[model].with_context(ctx).browse(ids)
     result = getattr(records, method)(*args, **kwargs)
     content = json.dumps(result, sort_keys=True, indent=4, cls=RecordEncoder)
     return Response(content, content_type='application/json;charset=utf-8', status=200)
示例#7
0
 def report(self,
            report,
            ids,
            type='PDF',
            context=None,
            options=None,
            file_response=False,
            **kw):
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     ids = ids and parse_value(ids) or []
     options = options and parse_value(options) or {}
     result = {'report': report, 'type': type}
     report = request.env['ir.actions.report']._get_report_from_name(report)
     if type.lower() == "html":
         data = report.with_context(ctx).render_qweb_html(ids,
                                                          data=options)[0]
         result.update({
             'content': base64.b64encode(data),
             'content_type': 'text/html',
             'content_length': len(data)
         })
     elif type.lower() == "pdf":
         data = report.with_context(ctx).render_qweb_pdf(ids,
                                                         data=options)[0]
         result.update({
             'content': base64.b64encode(data),
             'content_type': 'application/pdf',
             'content_length': len(data)
         })
     elif type.lower() == "text":
         data = report.with_context(ctx).render_qweb_text(ids,
                                                          data=options)[0]
         result.update({
             'content': base64.b64encode(data),
             'content_type': 'text/plain',
             'content_length': len(data)
         })
     else:
         return exceptions.NotFound()
     if file_response and misc.str2bool(file_response):
         headers = [('Content-Type', result.get('content_type')),
                    ('Content-Length', result.get('content_length'))]
         response = request.make_response(data, headers)
     else:
         content = json.dumps(result,
                              sort_keys=True,
                              indent=4,
                              cls=ResponseEncoder)
         response = Response(content,
                             content_type='application/json;charset=utf-8',
                             status=200)
     return response
示例#8
0
 def fields(self, model, fields=None, attributes=None, **kw):
     fields = fields and parse_value(fields) or None
     attributes = attributes and parse_value(attributes) or None
     result = request.env[model].fields_get(allfields=fields,
                                            attributes=attributes)
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=ResponseEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)
示例#9
0
 def upload(self, model, id, field=None, context=None, **kw):
     ctx = request.session.context.copy()
     ctx.update(context and parse_value(context) or {})
     files = request.httprequest.files.getlist('ufile')
     if field is not None and len(files) == 1:
         record = request.env[model].with_context(ctx).browse(int(id))
         result = record.write({field: base64.b64encode(files[0].read())})
     else:
         result = []
         for ufile in files:
             attachment = request.env['ir.attachment'].create({
                 'datas':
                 base64.encodestring(ufile.read()),
                 'datas_fname':
                 ufile.filename,
                 'name':
                 ufile.filename,
                 'res_model':
                 model,
                 'res_id':
                 int(id),
             })
             result.append(attachment.id)
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=RecordEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)
示例#10
0
 def custom(self, context=None, **kw):
     endpoint = kw.get('custom', False)
     if endpoint and endpoint.exists():
         ctx = request.session.context.copy()
         ctx.update(context and parse_value(context) or {})
         return endpoint.with_context(ctx).evaluate(request.params)
     return exceptions.NotFound()
示例#11
0
 def _get_eval_context(self, endpoint, params={}):
     active_id = params.get('id', None)
     active_ids = params.get('ids', [])
     if active_id and isinstance(active_id, (str, bytes, bytearray)):
         try:
             active_id = parse_value(active_id)
         except:
             try:
                 active_id = int(active_id)
             except:
                 active_id = None
     if active_ids and isinstance(active_ids, (str, bytes, bytearray)):
         try:
             active_ids = parse_value(active_ids)
         except:
             active_ids = None
     active_id = active_id or self.env.context.get('active_id')
     active_ids = active_ids or self.env.context.get('active_ids')
     return {'active_id': active_id, 'active_ids': active_ids}
示例#12
0
 def access(self, model, ids, operation='read', fields=None, **kw):
     ids = ids and parse_value(ids) or []
     fields = fields and parse_value(fields) or None
     try:
         rights = request.env[model].check_access_rights(operation)
         rules = request.env[model].browse(ids).check_access_rule(
             operation) is None
         fields = request.env[model].check_field_access_rights(
             operation, fields=fields)
         result = rights and rules and bool(fields)
     except (AccessError, UserError):
         raise
         result = False
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=ResponseEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)
示例#13
0
 def custom(self, context=None, **kw):
     endpoint = kw.get('custom', False)
     if endpoint and endpoint.exists():
         ctx = request.session.context.copy()
         ctx.update(context and parse_value(context) or {})
         result = endpoint.with_context(ctx).evaluate(request.params)
         content = json.dumps(result,
                              sort_keys=True,
                              indent=4,
                              cls=RecordEncoder)
         return Response(content,
                         content_type='application/json;charset=utf-8',
                         status=200)
     return exceptions.NotFound()
示例#14
0
 def access_rules(self, model, ids, operation='read', **kw):
     ids = ids and parse_value(ids) or []
     try:
         result = request.env[model].browse(ids).check_access_rule(
             operation) is None
     except (AccessError, UserError):
         result = False
     content = json.dumps(result,
                          sort_keys=True,
                          indent=4,
                          cls=ResponseEncoder)
     return Response(content,
                     content_type='application/json;charset=utf-8',
                     status=200)