示例#1
0
    def get_o2m_defaults(self, o2m_values, model, o2m_model, name, view_type, view_id,
                         o2m_view_type, o2m_view_id, editable, limit, offset, o2m_context, o2m_domain):

        view_id = view_id or False
        o2m_view_id = ast.literal_eval(o2m_view_id) or False
        o2m_view_type = o2m_view_type or 'form'
        context = dict(ast.literal_eval(o2m_context), **rpc.get_session().context)
        o2m_values = simplejson.loads(o2m_values)

        for o2m in o2m_values:
            o2m['id'] = 0

        if o2m_view_id:
            view = cache.fields_view_get(o2m_model, o2m_view_id, o2m_view_type, context)
        else:
            view = cache.fields_view_get(model, view_id, view_type, rpc.get_session().context)
            view = view['fields'][name]['views'][o2m_view_type]

        list_view = listgrid.List(name, model, view, ids=None, domain=o2m_domain, context=context, default_data=copy.deepcopy(o2m_values), limit=20, editable= editable,o2m=1)
        view=ustr(list_view.render())
        formated_o2m_values = []
        for o2m in o2m_values:
            o2m.pop('id', None)
            formated_o2m_values.append((0, 0, o2m))

        return dict(view=view, formated_o2m_values=ustr(formated_o2m_values))
示例#2
0
    def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw):
        grp_domain = ast.literal_eval(grp_domain)
        view = cache.fields_view_get(model, view_id, view_type, rpc.session.context.copy())
        group_by = ast.literal_eval(group_by)
        domain = grp_domain
        params = TinyDict(**kw)
        editable = params.editable
        selectable = params.selectable or 2
        context = params.context or {}
        context.update({'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain})
        group_level = ast.literal_eval(group_level)
        groups = ast.literal_eval(groups)

        offset = params.offset or 0
        limit = params.limit or 20
        args = {'editable': editable,
                'view_mode': ['tree', 'form', 'calendar', 'graph'],
                'nolinks': 1, 'group_by_ctx': group_by,
                'selectable': selectable,
                'multiple_group_by': True,
                'offset': offset, 'limit': limit,
                'sort_key': kw.get('sort_key'),
                'sort_order': kw.get('sort_order')}

        listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain= domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args)
        return listgrp.render()
示例#3
0
    def index(self, domain, context, view_id, search_domain='[]', action_id=None):
        context = ast.literal_eval(context)

        if not action_id:
            # This should not be needed anymore, but just in case users are
            # running the module with an older version of the web client...

            # to remove soon-ish
            action_id = rpc.RPCProxy('ir.actions.act_window').search(
                [('view_id','=',int(view_id))], context=context)
            if not action_id: return ""

            action_id = action_id[0]

        domain = ast.literal_eval(domain)
        domain.extend(ast.literal_eval(search_domain))

        scheme, netloc, _, _, _ = urlparse.urlsplit(cherrypy.request.base)
        share_root_url = urlparse.urlunsplit((
            scheme, netloc, '/openerp/login',
            'db=%(dbname)s&user=%(login)s&password=%(password)s', ''))

        context.update(
            #active_ids=share_wiz_id,
            #active_id=share_wiz_id[0],
            _terp_view_name='Share Wizard',
            share_root_url=share_root_url)
        Share = rpc.RPCProxy('share.wizard')
        sharing_view_id = Share.create({
            'domain': str(domain),
            'action_id': action_id and int(action_id)
        }, context)
        return openerp.controllers.actions.execute(
            Share.go_step_1([sharing_view_id], context),
            ids=[sharing_view_id], context=context)
示例#4
0
    def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw):
        grp_domain = ast.literal_eval(grp_domain)
        view = cache.fields_view_get(model, view_id, view_type, rpc.session.context.copy())
        group_by = ast.literal_eval(group_by)
        domain = grp_domain
        group_level = ast.literal_eval(group_level)
        groups = ast.literal_eval(groups)
        # build a new TinyDict to correctly handle _terp_* params
        params = TinyDict(**kw)
        editable = params.editable
        selectable = params.selectable or 2
        context = params.context or {}
        context.update({'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain})
        # we force offset to 0, as in group_by mode only 'limit' have an effect
        # (offset pagination in only for base grouping - which is handled by ListGroup)
        offset = 0
        limit = params.limit or 20
        args = {'editable': editable,
                'view_mode': ['tree', 'form', 'calendar', 'graph'],
                'nolinks': 1, 'group_by_ctx': group_by,
                'selectable': selectable,
                'multiple_group_by': True,
                'sort_key': kw.get('sort_key'),
                'offset': offset, 'limit': limit,
                'sort_order': kw.get('sort_order')}

        listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain= domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args)
        return listgrp.render()
示例#5
0
    def get_m2m(self, name, model, view_id, view_type, ids):
        view_id = ast.literal_eval(view_id) or False
        ids = ast.literal_eval(ids) or []
        view = cache.fields_view_get(model, view_id, view_type, rpc.get_session().context)

        m2m_view = listgrid.List(name, model, view, ids,limit=20, editable=True, m2m=1)
        m2m_view = ustr(m2m_view.render())
        return dict(m2m_view = m2m_view)
示例#6
0
 def groupbyDrag(self, model, children, domain):
     domain = ast.literal_eval(domain)[0]
     children = ast.literal_eval(children)
     if isinstance(children, list):
         children = list(children)
     else:
         children = [children]
     rpc.RPCProxy(model).write(children, {domain[0]: domain[2]})
     return {}
示例#7
0
 def groupbyDrag(self, model, children, domain):
     domain = ast.literal_eval(domain)[0]
     children = ast.literal_eval(children)
     if isinstance(children, list):
         children = list(children)
     else:
         children = [children]
     rpc.RPCProxy(model).write(children, {domain[0]: domain[2]})
     return {}
示例#8
0
    def get_m2m(self, name, model, view_id, view_type, ids):
        view_id = ast.literal_eval(view_id) or False
        ids = ast.literal_eval(ids) or []
        view = cache.fields_view_get(model, view_id, view_type,
                                     rpc.session.context)

        m2m_view = listgrid.List(name,
                                 model,
                                 view,
                                 ids,
                                 limit=20,
                                 editable=True,
                                 m2m=1)
        m2m_view = ustr(m2m_view.render())
        return dict(m2m_view=m2m_view)
    def multiple_groupby(self, model, name, grp_domain, group_by, view_id,
                         view_type, parent_group, group_level, groups, no_leaf,
                         **kw):
        grp_domain = ast.literal_eval(grp_domain)
        view = cache.fields_view_get(model, view_id, view_type,
                                     rpc.session.context.copy())
        group_by = ast.literal_eval(group_by)
        domain = grp_domain
        group_level = ast.literal_eval(group_level)
        groups = ast.literal_eval(groups)
        # build a new TinyDict to correctly handle _terp_* params
        params = TinyDict(**kw)
        editable = params.editable
        selectable = params.selectable or 2
        context = params.context or {}
        context.update({
            'group_by_no_leaf': int(no_leaf),
            'group_by': group_by,
            '__domain': domain
        })
        # we force offset to 0, as in group_by mode only 'limit' have an effect
        # (offset pagination in only for base grouping - which is handled by ListGroup)
        offset = 0
        limit = params.limit or 20
        args = {
            'editable': editable,
            'view_mode': ['tree', 'form', 'calendar', 'graph'],
            'nolinks': 1,
            'group_by_ctx': group_by,
            'selectable': selectable,
            'multiple_group_by': True,
            'sort_key': kw.get('sort_key'),
            'offset': offset,
            'limit': limit,
            'sort_order': kw.get('sort_order')
        }

        listgrp = listgroup.MultipleGroup(name,
                                          model,
                                          view,
                                          ids=None,
                                          domain=domain,
                                          parent_group=parent_group,
                                          group_level=group_level,
                                          groups=groups,
                                          context=context,
                                          **args)
        return listgrp.render()
示例#10
0
    def get_text(self):
        if self.value:
            if isinstance(self.value, (unicode, str)):
                return ast.literal_eval(self.value)
            return int(self.value)

        return 0
示例#11
0
    def get_text(self):
        if self.value:
            if isinstance(self.value, (unicode, str)):
                return ast.literal_eval(self.value)
            return int(self.value)

        return 0
示例#12
0
 def index(self, payload):
     decoded_payload = ast.literal_eval(
         zlib.decompress(
             base64.urlsafe_b64decode(str(payload))))
     action, data = decoded_payload['action'], decoded_payload['data']
     cherrypy.request.params.update(decoded_payload)
     return actions.execute(action, **data)
示例#13
0
    def menu(self, active=None, next=None):
        from openerp.widgets import tree_view
        
        try:
            id = int(active)
        except:
            id = False
            form.Form().reset_notebooks()
        ctx = rpc.session.context.copy()
        menus = rpc.RPCProxy("ir.ui.menu")

        domain = [('parent_id', '=', False)]
        user_menu_action_id = rpc.RPCProxy("res.users").read([rpc.session.uid], ['menu_id'], ctx)[0]['menu_id']
        if user_menu_action_id:
            act = rpc.RPCProxy('ir.actions.act_window').read([user_menu_action_id[0]], ['res_model', 'domain'], ctx)[0]
            if act['res_model'] == 'ir.ui.menu' and act['domain']:
                domain = literal_eval(act['domain'])

        ids = menus.search(domain, 0, 0, 0, ctx)
        parents = menus.read(ids, ['name', 'action', 'web_icon_data', 'web_icon_hover_data'], ctx)

        for parent in parents:
            if parent['id'] == id:
                parent['active'] = 'active'
                if parent.get('action') and not next:
                    next = url('/openerp/custom_action', action=id)
            # If only the hover image exists, use it as regular image as well
            if parent['web_icon_hover_data'] and not parent['web_icon_data']:
                parent['web_icon_data'] = parent['web_icon_hover_data']

        if next or active:
            if not id and ids:
                id = ids[0] 
            ids = menus.search([('parent_id', '=', id)], 0, 0, 0, ctx)
            tools = menus.read(ids, ['name', 'action'], ctx)
            #searching id for the hierarchycal tree view of ir.ui.menu 
            view_id = rpc.RPCProxy('ir.ui.view').search([('model','=','ir.ui.menu'),('type','=','tree')],0,0,'id')[0]
            view = cache.fields_view_get('ir.ui.menu', view_id, 'tree', {})
            fields = cache.fields_get(view['model'], False, ctx)
            
            for tool in tools:
                tid = tool['id']
                tool['tree'] = tree = tree_view.ViewTree(view, 'ir.ui.menu', tid,
                                        domain=[('parent_id', '=', tid)],
                                        context=ctx, action="/openerp/tree/action", fields=fields)
                tree._name = "tree_%s" %(tid)
                tree.tree.onselection = None
                tree.tree.onheaderclick = None
                tree.tree.showheaders = 0
        else:
            # display home action
            tools = None

        return dict(parents=parents, tools=tools, load_content=(next and next or ''),
                    welcome_messages=rpc.RPCProxy('publisher_warranty.contract').get_last_user_messages(_MAXIMUM_NUMBER_WELCOME_MESSAGES),
                    show_close_btn=rpc.session.uid == 1,
                    widgets=openobject.pooler.get_pool()\
                                      .get_controller('/openerp/widgets')\
                                      .user_home_widgets(ctx))
    def new(self,
            model,
            source=None,
            kind=0,
            text=None,
            domain=None,
            context=None,
            **kw):
        """Create new search view...

        @param model: the model
        @param source: the source, in case of m2m, m2o search
        @param kind: 0=normal, 1=m2o, 2=m2m
        @param text: do `name_search` if text is provided
        @param domain: the domain
        @param context: the context
        """

        params = TinyDict()

        params.model = model
        params.domain = domain or []
        params.context = context or {}

        params.source = source
        params.selectable = kind
        params.limit = params.limit or 50

        ctx = dict(rpc.session.context, **(params.context or {}))
        params.ids = []
        proxy = rpc.RPCProxy(model)
        params.search_text = False

        # parent's search_view has no business being in m2o or m2m
        if '_terp_context' in params and 'search_view' in params[
                '_terp_context']:
            params.get('_terp_context').pop('search_view', None)
        if text:
            params.search_text = True
            ids = proxy.name_search(text, params.domain or [], 'ilike', ctx,
                                    False)

            if ids:
                params.ids = [id[0] for id in ids]

                # For m2o, when name_search is called, then its result will be added to existing domain
                params.domain.append(('id', 'in', params.ids))

                params.count = len(ids)
            else:
                params.context['default_name'] = ustr(text)
        elif 'default_name' in params.context:
            del params.context['default_name']

        if kw.get('return_to'):
            params['return_to'] = ast.literal_eval(kw['return_to'])

        return self.create(params)
示例#15
0
    def index(self,
              domain,
              context,
              view_id,
              search_domain='[]',
              action_id=None):
        context = ast.literal_eval(context)

        if not action_id:
            # This should not be needed anymore, but just in case users are
            # running the module with an older version of the web client...

            # to remove soon-ish
            action_id = rpc.RPCProxy('ir.actions.act_window').search(
                [('view_id', '=', int(view_id))], context=context)
            if not action_id: return ""

            action_id = action_id[0]

        domain = ast.literal_eval(domain)
        domain.extend(ast.literal_eval(search_domain))

        share_model = 'share.wizard'

        scheme, netloc, _, _, _ = urlparse.urlsplit(cherrypy.request.base)
        share_root_url = urlparse.urlunsplit(
            (scheme, netloc, '/openerp/login',
             'db=%(dbname)s&user=%(login)s&password=%(password)s', ''))

        share_wiz_id = rpc.RPCProxy('ir.ui.menu').search([('name', '=',
                                                           'Share Wizard')])
        context.update(active_ids=share_wiz_id,
                       active_id=share_wiz_id[0],
                       _terp_view_name='Share Wizard',
                       share_root_url=share_root_url)
        sharing_view_id = rpc.RPCProxy(share_model).create(
            {
                'domain': str(domain),
                'action_id': action_id and int(action_id)
            }, context)
        return actions.execute(rpc.session.execute('object', 'execute',
                                                   share_model, 'go_step_1',
                                                   [sharing_view_id], context),
                               ids=[sharing_view_id],
                               context=context)
示例#16
0
    def multiple_groupby(self, model, name, grp_domain, group_by, view_id, view_type, parent_group, group_level, groups, no_leaf, **kw):
        grp_domain = ast.literal_eval(grp_domain)
        view = cache.fields_view_get(model, view_id, view_type, rpc.get_session().context.copy())
        group_by = ast.literal_eval(group_by)
        domain = grp_domain
        group_level = ast.literal_eval(group_level)
        groups = ast.literal_eval(groups)

        context = {'group_by_no_leaf': int(no_leaf), 'group_by': group_by, '__domain': domain}
        args = {'editable': True,
                'view_mode': ['tree', 'form', 'calendar', 'graph'],
                'nolinks': 1, 'group_by_ctx': group_by,
                'selectable': 2,
                'multiple_group_by': True,
                'sort_key': kw.get('sort_key'),
                'sort_order': kw.get('sort_order')}

        listgrp = listgroup.MultipleGroup(name, model, view, ids=None, domain= domain, parent_group=parent_group, group_level=group_level, groups=groups, context=context, **args)
        return listgrp.render()
    def groupbyDrag(self, model, children, domain, level='0'):
        """ update records represented by children domain based on groupby domain

        :param model: model to update
        :param children: children records domain or children record id
        :param domain: group_by domain will be convert to values
        """
        domain = ast.literal_eval(domain)
        children = ast.literal_eval(children)
        level = ast.literal_eval(level)
        if isinstance(children, list):
            children = list(children)
        else:
            children = [('id', '=', children)]
        # convert domain to values
        values = {}
        for i, d in enumerate(domain):
            if len(d) == 3 and i <= level:
                values[d[0]] = d[2]
        children_ids = rpc.RPCProxy(model).search(children)
        rpc.RPCProxy(model).write(children_ids, values)
        return {}
示例#18
0
    def groupbyDrag(self, model, children, domain, level='0'):
        """ update records represented by children domain based on groupby domain

        :param model: model to update
        :param children: children records domain or children record id
        :param domain: group_by domain will be convert to values
        """
        domain = ast.literal_eval(domain)
        children = ast.literal_eval(children)
        level = ast.literal_eval(level)
        if isinstance(children, list):
            children = list(children)
        else:
            children = [('id','=',children)]
        # convert domain to values
        values = {}
        for i, d in enumerate(domain):
            if len(d) == 3 and i <= level:
                values[d[0]] = d[2]
        children_ids = rpc.RPCProxy(model).search(children)
        rpc.RPCProxy(model).write(children_ids, values)
        return {}
示例#19
0
    def new(self, model, source=None, kind=0, text=None, domain=None, context=None, **kw):
        """Create new search view...

        @param model: the model
        @param source: the source, in case of m2m, m2o search
        @param kind: 0=normal, 1=m2o, 2=m2m
        @param text: do `name_search` if text is provided
        @param domain: the domain
        @param context: the context
        """

        params = TinyDict()

        params.model = model
        params.domain = domain or []
        params.context = context or {}

        params.source = source
        params.selectable = kind
        params.limit = params.limit or 50

        ctx = dict(rpc.session.context,
                   **(params.context or {}))
        params.ids = []
        proxy = rpc.RPCProxy(model)
        params.search_text = False

        # parent's search_view has no business being in m2o or m2m
        if '_terp_context' in params and 'search_view' in params['_terp_context']:
            params.get('_terp_context').pop('search_view', None)

        if text:
            params.search_text = True
            ids = proxy.name_search(text, params.domain or [], 'ilike', ctx, False)

            if ids:
                params.ids = [id[0] for id in ids]

                # For m2o, when name_search is called, then its result will be added to existing domain
                params.domain.append(('id','in', params.ids))

                params.count = len(ids)
            else:
                params.context['default_name'] = ustr(text)
        elif 'default_name'in params.context:
            del params.context['default_name']

        if kw.get('return_to'):
            params['return_to'] = ast.literal_eval(kw['return_to'])
            
        return self.create(params)
示例#20
0
    def multiple_groupby(self, model, name, grp_domain, group_by, view_id,
                         view_type, parent_group, group_level, groups, no_leaf,
                         **kw):
        grp_domain = ast.literal_eval(grp_domain)
        view = cache.fields_view_get(model, view_id, view_type,
                                     rpc.session.context.copy())
        group_by = ast.literal_eval(group_by)
        domain = grp_domain
        group_level = ast.literal_eval(group_level)
        groups = ast.literal_eval(groups)

        context = {
            'group_by_no_leaf': int(no_leaf),
            'group_by': group_by,
            '__domain': domain
        }
        args = {
            'editable': True,
            'view_mode': ['tree', 'form', 'calendar', 'graph'],
            'nolinks': 1,
            'group_by_ctx': group_by,
            'selectable': 2,
            'multiple_group_by': True,
            'sort_key': kw.get('sort_key'),
            'sort_order': kw.get('sort_order')
        }

        listgrp = listgroup.MultipleGroup(name,
                                          model,
                                          view,
                                          ids=None,
                                          domain=domain,
                                          parent_group=parent_group,
                                          group_level=group_level,
                                          groups=groups,
                                          context=context,
                                          **args)
        return listgrp.render()
示例#21
0
    def get_o2m_defaults(self, o2m_values, model, o2m_model, name, view_type,
                         view_id, o2m_view_type, o2m_view_id, editable, limit,
                         offset, o2m_context, o2m_domain):

        view_id = view_id or False
        o2m_view_id = ast.literal_eval(o2m_view_id) or False
        o2m_view_type = o2m_view_type or 'form'
        context = dict(ast.literal_eval(o2m_context), **rpc.session.context)
        o2m_values = simplejson.loads(o2m_values)

        for o2m in o2m_values:
            o2m['id'] = 0

        if o2m_view_id:
            view = cache.fields_view_get(o2m_model, o2m_view_id, o2m_view_type,
                                         context)
        else:
            view = cache.fields_view_get(model, view_id, view_type,
                                         rpc.session.context)
            view = view['fields'][name]['views'][o2m_view_type]

        list_view = listgrid.List(name,
                                  model,
                                  view,
                                  ids=None,
                                  domain=o2m_domain,
                                  context=context,
                                  default_data=copy.deepcopy(o2m_values),
                                  limit=20,
                                  editable=editable,
                                  o2m=1)
        view = ustr(list_view.render())
        formated_o2m_values = []
        for o2m in o2m_values:
            o2m.pop('id', None)
            formated_o2m_values.append((0, 0, o2m))

        return dict(view=view, formated_o2m_values=ustr(formated_o2m_values))
示例#22
0
    def count_sum(self, model, ids, sum_fields):
        selected_ids = ast.literal_eval(ids)
        sum_fields = sum_fields.split(",")
        ctx = rpc.get_session().context.copy()

        proxy = rpc.RPCProxy(model)
        res = proxy.read(selected_ids, sum_fields, ctx)

        total = []
        for field in sum_fields:
           total.append([])

        for i in range(len(selected_ids)):
            for k in range(len(sum_fields)):
                total[k].append(res[i][sum_fields[k]])

        total_sum = []
        for s in total:
            total_sum.append(str(sum(s)))

        return dict(sum = total_sum)
示例#23
0
    def count_sum(self, model, ids, sum_fields):
        selected_ids = ast.literal_eval(ids)
        sum_fields = sum_fields.split(",")
        ctx = rpc.session.context.copy()

        proxy = rpc.RPCProxy(model)
        res = proxy.read(selected_ids, sum_fields, ctx)

        total = []
        for field in sum_fields:
            total.append([])

        for i in range(len(selected_ids)):
            for k in range(len(sum_fields)):
                total[k].append(res[i][sum_fields[k]])

        total_sum = []
        for s in total:
            total_sum.append(str(sum(s)))

        return dict(sum=total_sum)
示例#24
0
    def get_fields(self, model, prefix='', name='', field_parent=None, **kw):

        parent_field = kw.get('ids').split(',')[0].split('/')
        if len(parent_field) == 1:
            parent_field = parent_field[0]
        else:
            parent_field = parent_field[-2]

        is_importing = kw.get('is_importing', False)
        import_compat = bool(int(kw.get('import_compat', True)))

        try:
            ctx = ast.literal_eval(kw['context'])
        except:
            ctx = {}

        ctx.update(**rpc.session.context)

        try:
            views = ast.literal_eval(kw['views'])
        except:
            views = {}

        fields = _fields_get_all(model, views, ctx)
        m2ofields = cherrypy.session.get('fld')
        if m2ofields:
            for i in m2ofields:
                if i == parent_field:
                    fields = {}
        else:
            m2ofields = []

        fields.update({
            'id': {
                'string': 'ID'
            },
            '.id': {
                'string': 'Database ID'
            }
        })

        fields_order = fields.keys()
        fields_order.sort(lambda x, y: -cmp(fields[x].get('string', ''),
                                            fields[y].get('string', '')))
        records = []

        for i, field in enumerate(fields_order):
            value = fields[field]
            record = {}

            if import_compat and value.get('readonly', False):
                ok = False
                for sl in value.get('states', {}).values():
                    for s in sl:
                        ok = ok or (s == ('readonly', False))
                if not ok: continue

            id = prefix + (prefix and '/' or '') + field
            nm = name + (name and '/' or '') + value['string']

            if is_importing and (value.get('type') not in ('reference',)) and (not value.get('readonly') \
                        or not dict(value.get('states', {}).get('draft', [('readonly', True)])).get('readonly', True)):

                record.update(id=id,
                              items={'name': nm},
                              action='javascript: void(0)',
                              target=None,
                              icon=None,
                              children=[],
                              required=value.get('required', False))

                records.append(record)

            elif not is_importing:

                record.update(id=id,
                              items={'name': nm},
                              action='javascript: void(0)',
                              target=None,
                              icon=None,
                              children=[])
                records.append(record)

            if len(nm.split('/')) < 3 and value.get('relation', False):

                if import_compat or is_importing:
                    ref = value.pop('relation')
                    proxy = rpc.RPCProxy(ref)
                    cfields = proxy.fields_get(False, rpc.session.context)
                    if (value['type'] == 'many2many') and not is_importing:
                        record['children'] = None
                        record['params'] = {
                            'model': ref,
                            'prefix': id,
                            'name': nm
                        }

                    elif (value['type']
                          == 'many2one') or (value['type'] == 'many2many'
                                             and is_importing):
                        m2ofields.append(field)
                        cfields_order = cfields.keys()
                        cfields_order.sort(
                            lambda x, y: -cmp(cfields[x].get('string', ''),
                                              cfields[y].get('string', '')))
                        children = []
                        for j, fld in enumerate(cfields_order):
                            cid = id + '/' + fld
                            cid = cid.replace(' ', '_')
                            children.append(cid)
                        record['children'] = children or None
                        record['params'] = {
                            'model': ref,
                            'prefix': id,
                            'name': nm
                        }
                        cherrypy.session['fld'] = m2ofields

                    else:
                        cfields_order = cfields.keys()
                        cfields_order.sort(
                            lambda x, y: -cmp(cfields[x].get('string', ''),
                                              cfields[y].get('string', '')))
                        children = []
                        for j, fld in enumerate(cfields_order):
                            cid = id + '/' + fld
                            cid = cid.replace(' ', '_')
                            children.append(cid)
                        record['children'] = children or None
                        record['params'] = {
                            'model': ref,
                            'prefix': id,
                            'name': nm
                        }

                else:
                    ref = value.pop('relation')
                    proxy = rpc.RPCProxy(ref)
                    cfields = proxy.fields_get(False, rpc.session.context)
                    cfields_order = cfields.keys()
                    cfields_order.sort(
                        lambda x, y: -cmp(cfields[x].get('string', ''),
                                          cfields[y].get('string', '')))
                    children = []
                    for j, fld in enumerate(cfields_order):
                        cid = id + '/' + fld
                        cid = cid.replace(' ', '_')
                        children.append(cid)
                    record['children'] = children or None
                    record['params'] = {'model': ref, 'prefix': id, 'name': nm}
                    cherrypy.session['fld'] = []

        records.reverse()
        return dict(records=records)
 def index(self, payload):
     decoded_payload = ast.literal_eval(
         zlib.decompress(base64.urlsafe_b64decode(str(payload))))
     action, data = decoded_payload['action'], decoded_payload['data']
     cherrypy.request.params.update(decoded_payload)
     return actions.execute(action, **data)
示例#26
0
    def eval_domain_filter(self, **kw):

        all_domains = kw.get('all_domains')
        custom_domains = kw.get('custom_domain')

        all_domains = eval(all_domains)

        domains = all_domains.get('domains')
        selection_domain = all_domains.get('selection_domain')
        search_context = all_domains.get('search_context')

        group_by_ctx = kw.get('group_by_ctx', [])
        if isinstance(group_by_ctx, str):
            group_by_ctx = cleanup_group_by(group_by_ctx).split(',')

        filter_status = all_domains.get('filter_status')
        if isinstance(filter_status, str):
            filter_status = ast.literal_eval(filter_status)

        if domains:
            domains = eval(domains)

        ctx = {}
        for fld_name, src_context in search_context.iteritems():
            c = src_context.get('context', {})
            v = src_context.get('value')
            if v and isinstance(v, basestring) and '__' in v:
                value, operator = v.split('__')
                v = int(value)
            ctx.update(expr_eval(c, {'self':v}))

        context = rpc.session.context
        if ctx:
            ctx.update(context)

        domain = []
        check_domain = all_domains.get('check_domain')

        if check_domain and isinstance(check_domain, basestring):
            domain = expr_eval(check_domain, context) or []

        search_data = {}
        model = kw.get('model')
        proxy = rpc.RPCProxy(model)
        res = proxy.fields_get(False, context)
        all_error = []
        fld = {}
        
        if domains:
            for field, value in domains.iteritems():
                
                if '/' in field:
                    fieldname, bound = field.split('/')
                else:
                    fieldname = field
                    bound = ''

                data = {}
                fld['type'] = res[fieldname].get('type')
                if fld['type'] == 'many2many':
                    fld['type'] = 'char'
                fld['value'] = value
                data[field] = fld

                try:
                    frm = TinyForm(**data).to_python()
                except TinyFormError, e:
                    error_field = e.field
                    error = ustr(e)
                    all_error.append(dict(error=error, error_field=error_field))
                    continue

                if bound in ('from', 'to'):
                    if bound == 'from': test = '>='
                    else: test = '<='

                    convert_format = openobject.i18n.format.convert_date_format_in_domain([(fieldname, test, value)], res, context)
                    domain.append(convert_format[0])
                    search_data.setdefault(fieldname, {})[bound] = convert_format[0][2]

                elif isinstance(value, bool) and value:
                    search_data[field] = 1

                elif isinstance(value, int) and not isinstance(value, bool):
                    domain.append((field, '=', value))
                    search_data[field] = value

                elif 'selection_' in value:
                    domain.append((field, '=', value.split('selection_')[1]))
                    search_data[field] = value.split('selection_')[1]

                elif fld['type'] == 'selection':
                    domain.append((field, '=', value))
                    search_data[field] = value

                else:
                    if not 'm2o_' in value:
                        operator = 'ilike'
                        if '__' in value:
                            value, operator = value.split('__')
                            value = int(value)
                        domain.append((field, operator, value))
                        search_data[field] = value
                    else:
                        search_data[field] = value.split('m2o_')[1]
            if all_error:
                return dict(all_error=all_error)
示例#27
0
    def get_fields(self, model, prefix='', name='', field_parent=None, **kw):

        parent_field = kw.get('ids').split(',')[0].split('/')
        if len(parent_field) == 1:
            parent_field = parent_field[0]
        else:
            parent_field = parent_field[-2]

        is_importing = kw.get('is_importing', False)
        import_compat= bool(int(kw.get('import_compat', True)))

        try:
            ctx = ast.literal_eval(kw['context'])
        except:
            ctx = {}

        ctx.update(**rpc.get_session().context)

        try:
            views = ast.literal_eval(kw['views'])
        except:
            views = {}

        fields = _fields_get_all(model, views, ctx)
        m2ofields = cherrypy.session.get('fld')
        if m2ofields:
            for i in m2ofields:
                if i == parent_field:
                    fields = {}
        else:
            m2ofields = []

        fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}})

        fields_order = fields.keys()
        fields_order.sort(lambda x,y: -cmp(fields[x].get('string', ''), fields[y].get('string', '')))
        records = []


        for i, field in enumerate(fields_order):
            value = fields[field]
            record = {}

            if import_compat and value.get('readonly', False):
                ok = False
                for sl in value.get('states', {}).values():
                    for s in sl:
                        ok = ok or (s==('readonly',False))
                if not ok: continue

            id = prefix + (prefix and '/' or '') + field
            nm = name + (name and '/' or '') + value['string']

            if is_importing and (value.get('type') not in ('reference',)) and (not value.get('readonly') \
                        or not dict(value.get('states', {}).get('draft', [('readonly', True)])).get('readonly', True)):

                record.update(id=id, items={'name': nm},
                              action='javascript: void(0)', target=None,
                              icon=None, children=[],
                              required=value.get('required', False))

                records.append(record)

            elif not is_importing:

                record.update(id=id, items={'name': nm},
                              action='javascript: void(0)', target=None,
                              icon=None, children=[],
                              required=value.get('required', False))
                records.append(record)


            if len(nm.split('/')) < 3 and value.get('relation', False):

                if import_compat or is_importing:
                    ref = value.pop('relation')
                    proxy = rpc.RPCProxy(ref)
                    cfields = proxy.fields_get(False, rpc.get_session().context)
                    if (value['type'] == 'many2many') and not is_importing:
                        record['children'] = None
                        record['params'] = {'model': ref, 'prefix': id, 'name': nm}

                    elif (value['type'] == 'many2one') or (value['type'] == 'many2many' and is_importing):
                        m2ofields.append(field)
                        cfields_order = cfields.keys()
                        cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
                        children = []
                        for j, fld in enumerate(cfields_order):
                            cid = id + '/' + fld
                            cid = cid.replace(' ', '_')
                            children.append(cid)
                        record['children'] = children or None
                        record['params'] = {'model': ref, 'prefix': id, 'name': nm}
                        cherrypy.session['fld'] = m2ofields

                    else:
                        cfields_order = cfields.keys()
                        cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
                        children = []
                        for j, fld in enumerate(cfields_order):
                            cid = id + '/' + fld
                            cid = cid.replace(' ', '_')
                            children.append(cid)
                        record['children'] = children or None
                        record['params'] = {'model': ref, 'prefix': id, 'name': nm}

                else:
                    ref = value.pop('relation')
                    proxy = rpc.RPCProxy(ref)
                    cfields = proxy.fields_get(False, rpc.get_session().context)
                    cfields_order = cfields.keys()
                    cfields_order.sort(lambda x,y: -cmp(cfields[x].get('string', ''), cfields[y].get('string', '')))
                    children = []
                    for j, fld in enumerate(cfields_order):
                        cid = id + '/' + fld
                        cid = cid.replace(' ', '_')
                        children.append(cid)
                    record['children'] = children or None
                    record['params'] = {'model': ref, 'prefix': id, 'name': nm}
                    cherrypy.session['fld'] = []

        records.reverse()
        return dict(records=records)
示例#28
0
                        search_data[field] = value
                    else:
                        search_data[field] = value.split('m2o_')[1]
            if all_error:
                return dict(all_error=all_error)

        if not custom_domains:
            custom_domains = []
        else:
            try:
                # from JS custom filters, data is sent as JSON
                custom_domains = simplejson.loads(custom_domains)
            except simplejson.decoder.JSONDecodeError:
                # from switchView, data is sent as Python literals
                # (with unicode strings and keys)
                custom_domains = ast.literal_eval(custom_domains)
        
        # conversion of the pseudo domain from the javascript to a valid domain
        ncustom_domain = []
        for i in xrange(max(len(custom_domains) - 1, 0)):
            ncustom_domain.append("|")
        for and_list in custom_domains:
            for i in xrange(max(len(and_list) - 1, 0)):
                ncustom_domain.append("&")
            ncustom_domain += [tuple(x) for x in and_list]

        if selection_domain and selection_domain not in ['blk', 'sf', 'mf']:
            selection_domain = expr_eval(selection_domain)
            if selection_domain:
                domain.extend(selection_domain)
    def eval_domain_filter(self, **kw):

        all_domains = kw.get('all_domains')
        custom_domains = kw.get('custom_domain')

        all_domains = eval(all_domains)

        domains = all_domains.get('domains')
        selection_domain = all_domains.get('selection_domain')
        search_context = all_domains.get('search_context')

        group_by_ctx = kw.get('group_by_ctx', [])
        if isinstance(group_by_ctx, str):
            group_by_ctx = cleanup_group_by(group_by_ctx).split(',')

        filter_status = all_domains.get('filter_status')
        if isinstance(filter_status, str):
            filter_status = ast.literal_eval(filter_status)

        if domains:
            domains = eval(domains)

        c = search_context.get('context', {})
        v = search_context.get('value')
        if v and isinstance(v, basestring) and '__' in v:
            value, operator = v.split('__')
            v = int(value)
        ctx = expr_eval(c, {'self': v})

        context = rpc.session.context
        if ctx:
            ctx.update(context)

        domain = []
        check_domain = all_domains.get('check_domain')

        if check_domain and isinstance(check_domain, basestring):
            domain = expr_eval(check_domain, context) or []
        m2o_filter_domain = all_domains.get('m2o_filter_domain', [])
        for dom in m2o_filter_domain:
            domain += expr_eval(dom['domain'], {'self': dom['self']}) or []
        search_data = {}
        model = kw.get('model')
        proxy = rpc.RPCProxy(model)
        res = proxy.fields_get(False, context)
        all_error = []
        fld = {}

        if domains:
            for field, value in domains.iteritems():

                if '/' in field:
                    fieldname, bound = field.split('/')
                else:
                    fieldname = field
                    bound = ''

                data = {}
                fld['type'] = res[fieldname].get('type')
                if fld['type'] == 'many2many':
                    fld['type'] = 'char'
                fld['value'] = value
                data[field] = fld

                try:
                    frm = TinyForm(**data).to_python()
                except TinyFormError, e:
                    error_field = e.field
                    error = ustr(e)
                    all_error.append(dict(error=error,
                                          error_field=error_field))
                    continue

                if bound in ('from', 'to'):
                    if bound == 'from': test = '>='
                    else: test = '<='

                    convert_format = openobject.i18n.format.convert_date_format_in_domain(
                        [(fieldname, test, value)], res, context)
                    domain.append(convert_format[0])
                    search_data.setdefault(fieldname,
                                           {})[bound] = convert_format[0][2]

                elif isinstance(value, bool) and value:
                    search_data[field] = 1

                elif isinstance(value, int) and not isinstance(value, bool):
                    domain.append((field, '=', value))
                    search_data[field] = value

                elif 'selection_' in value:
                    domain.append((field, '=', value.split('selection_')[1]))
                    search_data[field] = value.split('selection_')[1]

                elif fld['type'] == 'selection':
                    domain.append((field, '=', value))
                    search_data[field] = value

                else:
                    if not 'm2o_' in value:
                        operator = 'ilike'
                        if '__' in value:
                            value, operator = value.split('__')
                            value = int(value)
                        domain.append((field, operator, value))
                        search_data[field] = value
                    else:
                        search_data[field] = value.split('m2o_')[1]
            if all_error:
                return dict(all_error=all_error)