res[report.id] = False
return res
- def register_all(self, cr):
- """Report registration handler that may be overridden by subclasses to
- add their own kinds of report services.
- Loads all reports with no manual loaders (auto==True) and
- registers the appropriate services to implement them.
+ def _lookup_report(self, cr, name):
+ """
+ Look up a report definition.
"""
opj = os.path.join
- cr.execute("SELECT * FROM ir_act_report_xml WHERE auto=%s ORDER BY id", (True,))
- result = cr.dictfetchall()
- svcs = netsvc.Service._services
- for r in result:
- if svcs.has_key('report.'+r['report_name']):
- continue
- if r['report_rml'] or r['report_rml_content_data']:
- report_sxw('report.'+r['report_name'], r['model'],
- opj('addons',r['report_rml'] or '/'), header=r['header'])
- elif r['report_xsl'] and r['report_xml']:
- report_rml('report.'+r['report_name'], r['model'],
- opj('addons',r['report_xml']),
- r['report_xsl'] and opj('addons',r['report_xsl']))
+
+ # First lookup in the deprecated place, because if the report definition
+ # has not been updated, it is more likely the correct definition is there.
+ # Only reports with custom parser sepcified in Python are still there.
+ if 'report.' + name in openerp.report.interface.report_int._reports:
+ new_report = openerp.report.interface.report_int._reports['report.' + name]
+ else:
+ cr.execute("SELECT * FROM ir_act_report_xml WHERE report_name=%s", (name,))
+ r = cr.dictfetchone()
+ if r:
+ if r['report_rml'] or r['report_rml_content_data']:
+ if r['parser']:
+ kwargs = { 'parser': operator.attrgetter(r['parser'])(openerp.addons) }
+ else:
+ kwargs = {}
+ new_report = report_sxw('report.'+r['report_name'], r['model'],
+ opj('addons',r['report_rml'] or '/'), header=r['header'], register=False, **kwargs)
- elif r['report_xsl']:
++ elif r['report_xsl'] and r['report_xml']:
+ new_report = report_rml('report.'+r['report_name'], r['model'],
+ opj('addons',r['report_xml']),
+ r['report_xsl'] and opj('addons',r['report_xsl']), register=False)
+ else:
+ raise Exception, "Unhandled report type: %s" % r
+ else:
+ raise Exception, "Required report does not exist: %s" % r
+
+ return new_report
+
+ def render_report(self, cr, uid, res_ids, name, data, context=None):
+ """
+ Look up a report definition and render the report for the provided IDs.
+ """
+ new_report = self._lookup_report(cr, name)
+ return new_report.create(cr, uid, res_ids, data, context)
_name = 'ir.actions.report.xml'
_inherit = 'ir.actions.actions'
if operator in ('=ilike', '=like'):
operator = operator[1:]
query_args = {'name': search_name}
- limit_str = ''
- # TODO: simplify this in trunk with `display_name`, once it is stored
- # Perf note: a CTE expression (WITH ...) seems to have an even higher cost
- # than this query with duplicated CASE expressions. The bulk of
- # the cost is the ORDER BY, and it is inevitable if we want
- # relevant results for the next step, otherwise we'd return
- # a random selection of `limit` results.
- query = ('''SELECT partner.id FROM res_partner partner
- LEFT JOIN res_partner company
- ON partner.parent_id = company.id
- WHERE partner.email ''' + operator + ''' %(name)s OR
- CASE
- WHEN company.id IS NULL OR partner.is_company
- THEN partner.name
- ELSE company.name || ', ' || partner.name
- END ''' + operator + ''' %(name)s
- ORDER BY
- CASE
- WHEN company.id IS NULL OR partner.is_company
- THEN partner.name
- ELSE company.name || ', ' || partner.name
- END''')
++ query = ('''SELECT id FROM res_partner
++ WHERE email ''' + operator + ''' %(name)s
++ OR display_name ''' + operator + ''' %(name)s
++ ORDER BY display_name
++ ''')
if limit:
- limit_str = ' limit %(limit)s'
+ query += ' limit %(limit)s'
query_args['limit'] = limit
- cr.execute('''SELECT partner.id FROM res_partner partner
- LEFT JOIN res_partner company ON partner.parent_id = company.id
- WHERE partner.email ''' + operator +''' %(name)s OR
- partner.display_name ''' + operator + ' %(name)s ' + limit_str, query_args)
+ cr.execute(query, query_args)
ids = map(lambda x: x[0], cr.fetchall())
ids = self.search(cr, uid, [('id', 'in', ids)] + args, limit=limit, context=context)
if ids:
uid = 1 # safe fields only, so we write as super-user to bypass access rights
res = super(res_users, self).write(cr, uid, ids, values, context=context)
-
+ if 'company_id' in values:
+ for user in self.browse(cr, uid, ids, context=context):
+ # if partner is global we keep it that way
+ if user.partner_id.company_id and user.partner_id.company_id.id != values['company_id']:
+ user.partner_id.write({'company_id': user.company_id.id})
# clear caches linked to the users
- self.pool.get('ir.model.access').call_cache_clearing_methods(cr)
- clear = partial(self.pool.get('ir.rule').clear_cache, cr)
+ self.pool['ir.model.access'].call_cache_clearing_methods(cr)
+ clear = partial(self.pool['ir.rule'].clear_cache, cr)
map(clear, ids)
db = cr.dbname
if db in self._uid_cache: