[FIX] crm: simplify + fix multiple programming errors in partner merge wizard

bzr revid: odo@openerp.com-20130508162742-qxdrjg93r6md1tw5
This commit is contained in:
Olivier Dony 2013-05-08 18:27:42 +02:00
parent cffffc9cd6
commit 4229cff81c
2 changed files with 26 additions and 84 deletions

View File

@ -108,16 +108,20 @@ class MergePartnerAutomatic(osv.TransientModel):
'maximum_group': fields.integer("Maximum of Group of Contacts"), 'maximum_group': fields.integer("Maximum of Group of Contacts"),
} }
_defaults = { def default_get(self, cr, uid, fields, context=None):
'state': 'option', if context is None:
} context = {}
res = super(MergePartnerAutomatic, self).default_get(cr, uid, fields, context)
if context.get('active_model') == 'res.partner' and context.get('active_ids'):
partner_ids = context['active_ids']
res['state'] = 'selection'
res['partner_ids'] = partner_ids
res['dst_partner_id'] = self._get_ordered_partner(cr, uid, partner_ids, context=context)[-1].id
return res
def onchange_partner_ids(self, cr, uid, ids, partner_ids=[], context=None): _defaults = {
if partner_ids and isinstance(partner_ids[0], (list, tuple)): 'state': 'option'
partner_ids = partner_ids[0][2] }
else:
partner_ids = []
return {'domain': {'dst_partner_id': [('id', 'in', partner_ids)]}}
def get_fk_on(self, cr, table): def get_fk_on(self, cr, table):
q = """ SELECT cl1.relname as table, q = """ SELECT cl1.relname as table,
@ -262,7 +266,6 @@ class MergePartnerAutomatic(osv.TransientModel):
if field._type not in ('many2many', 'one2many', 'function'): if field._type not in ('many2many', 'one2many', 'function'):
for item in itertools.chain(src_partners, [dst_partner]): for item in itertools.chain(src_partners, [dst_partner]):
if item[column]: if item[column]:
print column, item[column]
values[column] = write_serializer(column, item[column]) values[column] = write_serializer(column, item[column])
values.pop('id', None) values.pop('id', None)
@ -275,19 +278,15 @@ class MergePartnerAutomatic(osv.TransientModel):
_logger.info('Skip recursive partner hierarchies for parent_id %s of partner: %s', parent_id, dst_partner.id) _logger.info('Skip recursive partner hierarchies for parent_id %s of partner: %s', parent_id, dst_partner.id)
@mute_logger('openerp.osv.expression', 'openerp.osv.orm') @mute_logger('openerp.osv.expression', 'openerp.osv.orm')
def _merge(self, cr, uid, partner_ids, dst_partner_id=None, context=None): def _merge(self, cr, uid, partner_ids, dst_partner=None, context=None):
proxy = self.pool.get('res.partner') proxy = self.pool.get('res.partner')
partner_ids = proxy.exists(cr, uid, list(partner_ids), context=context) partner_ids = proxy.exists(cr, uid, list(partner_ids), context=context)
if len(partner_ids) < 2: if len(partner_ids) < 2:
return return
if dst_partner_id and dst_partner_id in partner_ids: if dst_partner and dst_partner.id in partner_ids:
partner_obj = self.pool.get('res.partner') src_partners = proxy.browse(cr, uid, [id for id in partner_ids if id != dst_partner.id], context=context)
def f(x):
return x != dst_partner_id
src_partners = partner_obj.browse(cr, uid, list(filter(f, partner_ids)), context=context)
dst_partner = partner_obj.browse(cr, uid, list(partner_ids), context=context)
else: else:
ordered_partners = self._get_ordered_partner(cr, uid, partner_ids, context) ordered_partners = self._get_ordered_partner(cr, uid, partner_ids, context)
dst_partner = ordered_partners[-1] dst_partner = ordered_partners[-1]
@ -707,52 +706,11 @@ class MergePartnerAutomatic(osv.TransientModel):
self._merge(cr, uid, partner_ids, this.dst_partner_id, context=context) self._merge(cr, uid, partner_ids, this.dst_partner_id, context=context)
this.current_line_id.unlink() if this.current_line_id:
this.current_line_id.unlink()
return self._next_screen(cr, uid, this, context) return self._next_screen(cr, uid, this, context)
def merge_multi(self, cr, uid, ids, context=None):
active_model = context.get('active_model')
if active_model != 'res.partner':
raise osv.except_osv(
_('Error'),
_('This wizard can only used with the Partners')
)
partner_ids = context.get('active_ids', [])
MINIMAL_NUMBER = 2
if len(partner_ids) < MINIMAL_NUMBER:
raise osv.except_osv(
_('Error'),
_("You can't use this wizard with only one Partner")
)
ordered_partner = self._get_ordered_partner(cr, uid, partner_ids, context)
def f(x): return x.id
current_line_id = self.pool.get('base.partner.merge.line').create(cr, uid, {'min_id': ordered_partner[-1].id, 'aggr_ids': map(f, ordered_partner)})
context.update({
'default_state': 'selection',
'default_partner_ids': [(6, 0, partner_ids)],
'default_dst_partner_id': ordered_partner[-1].id,
'default_current_line_id': current_line_id,
'default_number_group': 1,
'default_maximum_group': 1,
})
action = {
'view_type': 'form',
'view_mode': 'form',
'res_model': self._name,
'res_id': False,
'type': 'ir.actions.act_window',
'target': 'new',
'context': context
}
return action
def auto_set_parent_id(self, cr, uid, ids, context=None): def auto_set_parent_id(self, cr, uid, ids, context=None):
assert is_integer_list(ids) assert is_integer_list(ids)

View File

@ -68,9 +68,9 @@
OpenERP will propose you to merge only those having OpenERP will propose you to merge only those having
all these fields in common. (not one of the fields). all these fields in common. (not one of the fields).
</p> </p>
<group attrs="{'invisible': [('state', 'not in', ('selection', 'finished'))]}"> <group attrs="{'invisible': ['|', ('state', 'not in', ('selection', 'finished')), ('number_group', '=', 0)]}">
<field name="state" invisible="1" /> <field name="state" invisible="1" />
<field name="number_group" invisible="0" /> <field name="number_group"/>
</group> </group>
<group string="Search duplicates based on duplicated data in" <group string="Search duplicates based on duplicated data in"
attrs="{'invisible': [('state', 'not in', ('option',))]}"> attrs="{'invisible': [('state', 'not in', ('option',))]}">
@ -98,16 +98,15 @@
redirected to the aggregated contact. You can remove redirected to the aggregated contact. You can remove
contacts from this list to avoid merging them. contacts from this list to avoid merging them.
</p> </p>
<field name="dst_partner_id" attrs="{'required': [('state', '=', 'selection')]}"/> <field name="dst_partner_id" domain="[('id', 'in', partner_ids and partner_ids[0] and partner_ids[0][2] or False)]" attrs="{'required': [('state', '=', 'selection')]}"/>
<field name="partner_ids" nolabel="1" on_change="onchange_partner_ids(partner_ids)"> <field name="partner_ids" nolabel="1">
<tree string="Partners"> <tree string="Partners">
<field name="id" /> <field name="id" />
<field name="name" /> <field name="display_name" />
<field name="email" /> <field name="email" />
<field name="is_company" /> <field name="is_company" />
<field name="vat" /> <field name="vat" />
<field name="country_id" /> <field name="country_id" />
<field name="parent_id" />
</tree> </tree>
</field> </field>
</group> </group>
@ -115,24 +114,9 @@
</form> </form>
</field> </field>
</record> </record>
<record model="ir.actions.server" <act_window id="action_partner_merge" res_model="base.partner.merge.automatic.wizard" src_model="res.partner"
id="ir_actions_server_merge_automatic"> target="new" multi="True" key2="client_action_multi" view_mode="form" name="Automatic Merge"/>
<field name="code">action = pool.get('base.partner.merge.automatic.wizard').merge_multi(cr, uid, None, context)</field>
<field name="condition">True</field>
<field name="model_id" ref="base.model_res_partner" />
<field name="name">Automatic Merge</field>
<field name="sequence" eval="5" />
<field name="state">code</field>
<field name="type">ir.actions.server</field>
</record>
<record model="ir.values" id="ir_open_merge_automatic">
<field name="key2" eval="'client_action_multi'" />
<field name="model">res.partner</field>
<field name="name">Automatic Merge</field>
<field name="value" eval="'ir.actions.server,%d' % ir_actions_server_merge_automatic" />
</record>
</data> </data>