Browse Source

Merge pull request #32 from avanzosc/8.0-mass_editing

[ADD] Migrated <mass_editing> for Odoo
pull/18/head
Pedro M. Baeza 10 years ago
parent
commit
4765f546f4
  1. 71
      __unported__/mass_editing/mass_editing_view.xml
  2. 0
      mass_editing/ChangeLog.txt
  3. 8
      mass_editing/__init__.py
  4. 25
      mass_editing/__openerp__.py
  5. 2
      mass_editing/i18n/es.po
  6. 0
      mass_editing/i18n/fr.po
  7. 0
      mass_editing/i18n/fr_CA.po
  8. 0
      mass_editing/i18n/mass_editing.pot
  9. 10
      mass_editing/models/__init__.py
  10. 42
      mass_editing/models/ir_model_fields.py
  11. 60
      mass_editing/models/mass_object.py
  12. 0
      mass_editing/security/ir.model.access.csv
  13. 98
      mass_editing/views/mass_editing_view.xml
  14. 23
      mass_editing/wizard/__init__.py
  15. 26
      mass_editing/wizard/mass_editing_wizard.py

71
__unported__/mass_editing/mass_editing_view.xml

@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_mass_object_form">
<field name="name">mass.object.form</field>
<field name="model">mass.object</field>
<field name="arch" type="xml">
<form string="Object">
<field name="name"/>
<field name="model_id" on_change="onchange_model(model_id)"/>
<field name="model_ids" invisible="1"/>
<notebook colspan="4">
<page string="Fields">
<field name="field_ids" colspan="4" nolabel="1"
domain="[('ttype', 'not in', ['reference', 'function']), ('model_id', 'in', model_ids[0][2])]"/>
</page>
<page string="Advanced">
<group colspan="2" col="2">
<button name="create_action" string="Add sidebar button" type="object" icon="gtk-execute"
colspan="2" attrs="{'invisible':[('ref_ir_act_window','!=',False)]}"
help="Display a button in the sidebar of related documents to open a composition wizard"/>
<field name="ref_ir_act_window" attrs="{'invisible':[('ref_ir_act_window','=',False)]}"/>
<field name="ref_ir_value" attrs="{'invisible':[('ref_ir_act_window','=',False)]}"/>
<button name="unlink_action" string="Remove sidebar button" type="object" icon="gtk-delete"
attrs="{'invisible':[('ref_ir_act_window','=',False)]}" colspan="2" />
</group>
</page>
</notebook>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_mass_object_tree">
<field name="name">mass.object.tree</field>
<field name="model">mass.object</field>
<field name="arch" type="xml">
<tree string="Object">
<field name="name"/>
<field name="model_id"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_mass_object_form">
<field name="name">Mass Editing</field>
<field name="res_model">mass.object</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_mass_object_tree" />
</record>
<record id="action_mass_object_form_view1" model="ir.actions.act_window.view">
<field eval="10" name="sequence"/>
<field name="view_mode">tree</field>
<field name="view_id" ref="view_mass_object_tree"/>
<field name="act_window_id" ref="action_mass_object_form"/>
</record>
<record id="action_mass_object_form_view2" model="ir.actions.act_window.view">
<field eval="20" name="sequence"/>
<field name="view_mode">form</field>
<field name="view_id" ref="view_mass_object_form"/>
<field name="act_window_id" ref="action_mass_object_form"/>
</record>
<menuitem id="menu_mass_editing" name="Mass Editing" parent="base.menu_config" sequence="6"/>
<menuitem id="menu_mass_object_view" action="action_mass_object_form" parent="menu_mass_editing"/>
</data>
</openerp>

0
__unported__/mass_editing/ChangeLog.txt → mass_editing/ChangeLog.txt

8
__unported__/mass_editing/wizard/__init__.py → mass_editing/__init__.py

@ -2,7 +2,8 @@
############################################################################## ##############################################################################
# #
# This module uses OpenERP, Open Source Management Solution Framework. # This module uses OpenERP, Open Source Management Solution Framework.
# Copyright (C) 2012-Today Serpent Consulting Services (<http://www.serpentcs.com>)
# Copyright (C):
# 2012-Today Serpent Consulting Services (<http://www.serpentcs.
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -19,6 +20,5 @@
# #
############################################################################## ##############################################################################
import mass_editing_wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
from . import models
from . import wizard

25
__unported__/mass_editing/__openerp__.py → mass_editing/__openerp__.py

@ -23,27 +23,28 @@
"name": "Mass Editing", "name": "Mass Editing",
"version": "1.3", "version": "1.3",
"author": "Serpent Consulting Services", "author": "Serpent Consulting Services",
"contributors": [
"Oihane Crucelaegui <oihanecrucelaegi@gmail.com>",
],
"category": "Tools", "category": "Tools",
"website": "http://www.serpentcs.com", "website": "http://www.serpentcs.com",
"description": """ "description": """
This module provides the functionality to add, update or remove the values"""
"""of more than one records on the fly at the same time.
This module provides the functionality to add, update or remove the values
of more than one records on the fly at the same time.
You can configure mass editing for any OpenERP model. You can configure mass editing for any OpenERP model.
The video explaining the features and how-to for OpenERP Version 6"""
""" is here http://t.co/wukYMx1A
The video explaining the features and how-to for OpenERP Version 7 is"""
""" here : http://www.youtube.com/watch?v=9BH0o74A748&feature=youtu.be
For more details/customization/feedback contact us on"""
""" contact@serpentcs.com.
The video explaining the features and how-to for OpenERP Version 6
is here http://t.co/wukYMx1A
The video explaining the features and how-to for OpenERP Version 7 is
here : http://www.youtube.com/watch?v=9BH0o74A748&feature=youtu.be
For more details/customization/feedback contact us on
contact@serpentcs.com.
""", """,
'depends': ['base'], 'depends': ['base'],
'data': [ 'data': [
"security/ir.model.access.csv", "security/ir.model.access.csv",
'mass_editing_view.xml',
'views/mass_editing_view.xml',
], ],
'installable': False,
'installable': True,
'application': True, 'application': True,
'auto_install': False, 'auto_install': False,
} }
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

2
__unported__/mass_editing/i18n/es.po → mass_editing/i18n/es.po

@ -59,7 +59,7 @@ msgstr "Campos"
#: code:addons/mass_editing/mass_editing.py:62 #: code:addons/mass_editing/mass_editing.py:62
#, python-format #, python-format
msgid "Mass Editing (%s)" msgid "Mass Editing (%s)"
msgstr "Edición Masica (%s)"
msgstr "Edición Masiva (%s)"
#. module: mass_editing #. module: mass_editing
#: view:mass.object:0 #: view:mass.object:0

0
__unported__/mass_editing/i18n/fr.po → mass_editing/i18n/fr.po

0
__unported__/mass_editing/i18n/fr_CA.po → mass_editing/i18n/fr_CA.po

0
__unported__/mass_editing/i18n/mass_editing.pot → mass_editing/i18n/mass_editing.pot

10
__unported__/mass_editing/__init__.py → mass_editing/models/__init__.py

@ -2,7 +2,8 @@
############################################################################## ##############################################################################
# #
# This module uses OpenERP, Open Source Management Solution Framework. # This module uses OpenERP, Open Source Management Solution Framework.
# Copyright (C) 2012-Today Serpent Consulting Services (<http://www.serpentcs.com>)
# Copyright (C):
# 2012-Today Serpent Consulting Services (<http://www.serpentcs.com>)
# #
# This program is free software: you can redistribute it and/or modify # This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -19,8 +20,5 @@
# #
############################################################################## ##############################################################################
import mass_editing
import wizard
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
from . import ir_model_fields
from . import mass_object

42
mass_editing/models/ir_model_fields.py

@ -0,0 +1,42 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# This module uses OpenERP, Open Source Management Solution Framework.
# Copyright (C):
# 2012-Today Serpent Consulting Services (<http://www.serpentcs.com>)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
from openerp.osv import orm
class IrModelFields(orm.Model):
_inherit = 'ir.model.fields'
def search(
self, cr, uid, args, offset=0, limit=0, order=None, context=None,
count=False):
model_domain = []
for domain in args:
if domain[0] == 'model_id' and domain[2]\
and type(domain[2]) != list:
model_domain += [(
'model_id', 'in', map(int, domain[2][1:-1].split(',')))]
else:
model_domain.append(domain)
return super(IrModelFields, self).search(
cr, uid, model_domain, offset=offset, limit=limit, order=order,
context=context, count=count)

60
__unported__/mass_editing/mass_editing.py → mass_editing/models/mass_object.py

@ -20,32 +20,12 @@
# #
############################################################################## ##############################################################################
from openerp.osv import orm, fields, osv
from openerp import SUPERUSER_ID
from openerp.osv import orm, fields
from openerp.tools.translate import _ from openerp.tools.translate import _
class ir_model_fields(orm.Model):
_inherit = 'ir.model.fields'
def search(
self, cr, uid, args, offset=0, limit=0, order=None, context=None,
count=False):
model_domain = []
for domain in args:
if domain[0] == 'model_id' and domain[2]\
and type(domain[2]) != list:
model_domain += [(
'model_id', 'in', map(int, domain[2][1:-1].split(',')))]
else:
model_domain.append(domain)
return super(ir_model_fields, self).search(
cr, uid, model_domain, offset=offset, limit=limit, order=order,
context=context, count=count)
ir_model_fields()
class mass_object(orm.Model):
class MassObject(orm.Model):
_name = "mass.object" _name = "mass.object"
_columns = { _columns = {
@ -75,7 +55,7 @@ class mass_object(orm.Model):
if not model_id: if not model_id:
return {'value': {'model_ids': [(6, 0, [])]}} return {'value': {'model_ids': [(6, 0, [])]}}
model_ids = [model_id] model_ids = [model_id]
model_obj = self.pool.get('ir.model')
model_obj = self.pool['ir.model']
active_model_obj = self.pool.get(model_obj.browse( active_model_obj = self.pool.get(model_obj.browse(
cr, uid, model_id).model) cr, uid, model_id).model)
if active_model_obj._inherits: if active_model_obj._inherits:
@ -87,12 +67,12 @@ class mass_object(orm.Model):
def create_action(self, cr, uid, ids, context=None): def create_action(self, cr, uid, ids, context=None):
vals = {} vals = {}
action_obj = self.pool.get('ir.actions.act_window')
ir_values_obj = self.pool.get('ir.values')
action_obj = self.pool['ir.actions.act_window']
ir_values_obj = self.pool['ir.values']
for data in self.browse(cr, uid, ids, context=context): for data in self.browse(cr, uid, ids, context=context):
src_obj = data.model_id.model src_obj = data.model_id.model
button_name = _('Mass Editing (%s)') % data.name button_name = _('Mass Editing (%s)') % data.name
vals['ref_ir_act_window'] = action_obj.create(cr, uid, {
vals['ref_ir_act_window'] = action_obj.create(cr, SUPERUSER_ID, {
'name': button_name, 'name': button_name,
'type': 'ir.actions.act_window', 'type': 'ir.actions.act_window',
'res_model': 'mass.editing.wizard', 'res_model': 'mass.editing.wizard',
@ -103,7 +83,7 @@ class mass_object(orm.Model):
'target': 'new', 'target': 'new',
'auto_refresh': 1, 'auto_refresh': 1,
}, context) }, context)
vals['ref_ir_value'] = ir_values_obj.create(cr, uid, {
vals['ref_ir_value'] = ir_values_obj.create(cr, SUPERUSER_ID, {
'name': button_name, 'name': button_name,
'model': src_obj, 'model': src_obj,
'key2': 'client_action_multi', 'key2': 'client_action_multi',
@ -122,28 +102,28 @@ class mass_object(orm.Model):
for template in self.browse(cr, uid, ids, context=context): for template in self.browse(cr, uid, ids, context=context):
try: try:
if template.ref_ir_act_window: if template.ref_ir_act_window:
self.pool.get('ir.actions.act_window').unlink(
cr, uid, template.ref_ir_act_window.id, context)
act_window_obj = self.pool['ir.actions.act_window']
act_window_obj.unlink(
cr, SUPERUSER_ID, [template.ref_ir_act_window.id],
context=context)
if template.ref_ir_value: if template.ref_ir_value:
ir_values_obj = self.pool.get('ir.values')
ir_values_obj = self.pool['ir.values']
ir_values_obj.unlink( ir_values_obj.unlink(
cr, uid, template.ref_ir_value.id, context)
cr, SUPERUSER_ID, template.ref_ir_value.id,
context=context)
except: except:
raise osv.except_osv(
raise orm.except_orm(
_("Warning"), _("Warning"),
_("Deletion of the action record failed.")) _("Deletion of the action record failed."))
return True return True
def unlink(self, cr, uid, ids, context=None): def unlink(self, cr, uid, ids, context=None):
self.unlink_action(cr, uid, ids, context)
return super(mass_object, self).unlink(cr, uid, ids, context)
self.unlink_action(cr, uid, ids, context=context)
return super(MassObject, self).unlink(cr, uid, ids, context=context)
def copy(self, cr, uid, record_id, default=None, context=None): def copy(self, cr, uid, record_id, default=None, context=None):
if default is None: if default is None:
default = {} default = {}
default.update({'name': '', 'field_ids': []}) default.update({'name': '', 'field_ids': []})
return super(mass_object, self).copy(
cr, uid, record_id, default, context)
mass_object()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
return super(MassObject, self).copy(
cr, uid, record_id, default, context=context)

0
__unported__/mass_editing/security/ir.model.access.csv → mass_editing/security/ir.model.access.csv

98
mass_editing/views/mass_editing_view.xml

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_mass_object_form">
<field name="name">mass.object.form</field>
<field name="model">mass.object</field>
<field name="arch" type="xml">
<form string="Object">
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only" />
<h1>
<field name="name" required="1" />
</h1>
<group>
<field name="model_id" required="1"
on_change="onchange_model_id(model_id)" />
<field name="model_ids" invisible="1" />
</group>
</div>
<div class="oe_right oe_button_box" name="buttons">
<field name="ref_ir_act_window"
invisible="1" />
<button class="oe_inline oe_stat_button"
name="create_action" type="object"
attrs="{'invisible':[('ref_ir_act_window','!=',False)]}"
icon="fa-plus"
help="Display a button in the sidebar of related documents to open a composition wizard">
<div>Add<br />Sidebar Button</div>
</button>
<button name="unlink_action" type="object"
class="oe_stat_button" icon="fa-minus"
attrs="{'invisible':[('ref_ir_act_window','=',False)]}"
help="Remove the contextual action to use this template on related documents"
widget="statinfo">
<div>Remove<br />Sidebar Button</div>
</button>
</div>
<notebook colspan="4">
<page string="Fields">
<field name="field_ids" colspan="4"
nolabel="1"
domain="[('ttype', 'not in', ['reference', 'function']), ('model_id', 'in', model_ids[0][2])]" />
</page>
<page string="Advanced" attrs="{'invisible':[('ref_ir_act_window','=',False)]}">
<group colspan="2" col="2">
<field name="ref_ir_act_window" />
<field name="ref_ir_value" />
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="view_mass_object_tree">
<field name="name">mass.object.tree</field>
<field name="model">mass.object</field>
<field name="arch" type="xml">
<tree string="Object">
<field name="name" />
<field name="model_id" />
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="action_mass_object_form">
<field name="name">Mass Editing</field>
<field name="res_model">mass.object</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_mass_object_tree" />
</record>
<record id="action_mass_object_form_view1" model="ir.actions.act_window.view">
<field eval="10" name="sequence" />
<field name="view_mode">tree</field>
<field name="view_id" ref="view_mass_object_tree" />
<field name="act_window_id" ref="action_mass_object_form" />
</record>
<record id="action_mass_object_form_view2" model="ir.actions.act_window.view">
<field eval="20" name="sequence" />
<field name="view_mode">form</field>
<field name="view_id" ref="view_mass_object_form" />
<field name="act_window_id" ref="action_mass_object_form" />
</record>
<menuitem id="menu_mass_editing" name="Mass Editing"
parent="base.menu_administration" sequence="6" />
<menuitem id="menu_mass_object_view" action="action_mass_object_form"
parent="menu_mass_editing" />
</data>
</openerp>

23
mass_editing/wizard/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# This module uses OpenERP, Open Source Management Solution Framework.
# Copyright (C):
# 2012-Today Serpent Consulting Services (<http://www.serpentcs.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
##############################################################################
from . import mass_editing_wizard

26
__unported__/mass_editing/wizard/mass_editing_wizard.py → mass_editing/wizard/mass_editing_wizard.py

@ -25,19 +25,16 @@ import openerp.tools as tools
from lxml import etree from lxml import etree
class mass_editing_wizard(orm.TransientModel):
class MassEditingWizard(orm.TransientModel):
_name = 'mass.editing.wizard' _name = 'mass.editing.wizard'
_columns = {
}
def fields_view_get( def fields_view_get(
self, cr, uid, view_id=None, view_type='form', context=None, self, cr, uid, view_id=None, view_type='form', context=None,
toolbar=False, submenu=False): toolbar=False, submenu=False):
result = super(mass_editing_wizard, self).fields_view_get(
result = super(MassEditingWizard, self).fields_view_get(
cr, uid, view_id, view_type, context, toolbar, submenu) cr, uid, view_id, view_type, context, toolbar, submenu)
if context.get('mass_editing_object'): if context.get('mass_editing_object'):
mass_object = self.pool.get('mass.object')
mass_object = self.pool['mass.object']
editing_data = mass_object.browse( editing_data = mass_object.browse(
cr, uid, context.get('mass_editing_object'), context) cr, uid, context.get('mass_editing_object'), context)
all_fields = {} all_fields = {}
@ -46,8 +43,9 @@ class mass_editing_wizard(orm.TransientModel):
xml_group = etree.SubElement(xml_form, 'group', {'colspan': '4'}) xml_group = etree.SubElement(xml_form, 'group', {'colspan': '4'})
etree.SubElement(xml_group, 'label', { etree.SubElement(xml_group, 'label', {
'string': '', 'colspan': '2'}) 'string': '', 'colspan': '2'})
xml_group = etree.SubElement(xml_form, 'group', {'colspan': '4'})
model_obj = self.pool.get(context.get('active_model'))
xml_group = etree.SubElement(xml_form, 'group', {'colspan': '4',
'col': '4'})
model_obj = self.pool[context.get('active_model')]
field_info = model_obj.fields_get(cr, uid, [], context) field_info = model_obj.fields_get(cr, uid, [], context)
for field in editing_data.field_ids: for field in editing_data.field_ids:
if field.ttype == "many2many": if field.ttype == "many2many":
@ -174,11 +172,12 @@ class mass_editing_wizard(orm.TransientModel):
etree.SubElement( etree.SubElement(
xml_form, 'separator', {'string': '', 'colspan': '4'}) xml_form, 'separator', {'string': '', 'colspan': '4'})
xml_group3 = etree.SubElement(xml_form, 'footer', {}) xml_group3 = etree.SubElement(xml_form, 'footer', {})
etree.SubElement(xml_group3, 'button', {
'string': 'Close', 'icon': "gtk-close", 'special': 'cancel'})
etree.SubElement(xml_group3, 'button', { etree.SubElement(xml_group3, 'button', {
'string': 'Apply', 'icon': "gtk-execute", 'string': 'Apply', 'icon': "gtk-execute",
'type': 'object', 'name': "action_apply"})
'type': 'object', 'name': "action_apply",
'class': "oe_highlight"})
etree.SubElement(xml_group3, 'button', {
'string': 'Close', 'icon': "gtk-close", 'special': 'cancel'})
root = xml_form.getroottree() root = xml_form.getroottree()
result['arch'] = etree.tostring(root) result['arch'] = etree.tostring(root)
result['fields'] = all_fields result['fields'] = all_fields
@ -207,11 +206,8 @@ class mass_editing_wizard(orm.TransientModel):
if dict: if dict:
model_obj.write( model_obj.write(
cr, uid, context.get('active_ids'), dict, context) cr, uid, context.get('active_ids'), dict, context)
result = super(mass_editing_wizard, self).create(cr, uid, {}, context)
result = super(MassEditingWizard, self).create(cr, uid, {}, context)
return result return result
def action_apply(self, cr, uid, ids, context=None): def action_apply(self, cr, uid, ids, context=None):
return {'type': 'ir.actions.act_window_close'} return {'type': 'ir.actions.act_window_close'}
mass_editing_wizard()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
Loading…
Cancel
Save