Browse Source

[IMP] base_location: Updated to v8 syntax and uses. Added filters in some views. Added two columns in respective tree views.

14.0
Alejandro Santana 10 years ago
committed by Pedro M. Baeza
parent
commit
46427a488d
  1. 20
      base_location/README.rst
  2. 6
      base_location/__init__.py
  3. 31
      base_location/__openerp__.py
  4. 82
      base_location/better_zip.py
  5. 63
      base_location/better_zip_view.xml
  6. 20
      base_location/company_view.xml
  7. 10
      base_location/models/__init__.py
  8. 67
      base_location/models/better_zip.py
  9. 39
      base_location/models/company.py
  10. 31
      base_location/models/partner.py
  11. 8
      base_location/models/state.py
  12. 30
      base_location/partner_view.xml
  13. 26
      base_location/state_view.xml
  14. 70
      base_location/views/better_zip_view.xml
  15. 21
      base_location/views/company_view.xml
  16. 27
      base_location/views/partner_view.xml
  17. 17
      base_location/views/res_country_view.xml
  18. 26
      base_location/views/state_view.xml

20
base_location/README.rst

@ -0,0 +1,20 @@
Enhanced ZIP management
=======================
This module introduces a better zip/npa management system.
It enables zip, city, state and country auto-completion on partners and companies.
Also allows different search filters.
Author
------
- Nicolas Bessi. (Copyright Camptocamp SA)
Contributors
------------
- Ignacio Ibeas (Acysos S.L.)
- Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>
- Alejandro Santana <alejandrosantana@anubia.es>

6
base_location/__init__.py

@ -4,6 +4,7 @@
# Author: Nicolas Bessi. Copyright Camptocamp SA # Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com> # Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com> # Ignacio Ibeas <ignacio@acysos.com>
# Alejandro Santana <alejandrosantana@anubia.es>
# #
# 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 Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -20,7 +21,4 @@
# #
############################################################################## ##############################################################################
from . import better_zip
from . import partner
from . import state
from . import company
from . import models

31
base_location/__openerp__.py

@ -4,6 +4,7 @@
# Author: Nicolas Bessi. Copyright Camptocamp SA # Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com> # Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com> # Ignacio Ibeas <ignacio@acysos.com>
# Alejandro Santana <alejandrosantana@anubia.es>
# #
# 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 Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -19,18 +20,28 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################## ##############################################################################
{'name': 'Location management (aka Better ZIP)',
'version': '0.3',
{
'name': 'Location management (aka Better ZIP)',
'version': '8.0.1.0.0',
'depends': ['base'], 'depends': ['base'],
'author': 'Camptocamp',
'description': """
Introduces a better zip/npa management system.
It enables zip/city auto-completion on partners""",
'author': "Camptocamp,"
"ACYSOS S.L.,"
"Alejandro Santana,"
"Serv. Tecnol. Avanzados - Pedro M. Baeza,"
"Odoo Community Association (OCA)",
'license': "AGPL-3",
'contributors': [
'Pedro M. Baeza <pedro.baeza@serviciosbaeza.com>',
'Ignacio Ibeas (Acysos S.L.)',
'Alejandro Santana <alejandrosantana@anubia.es>',
],
'summary': '''Enhanced zip/npa management system''',
'website': 'http://www.camptocamp.com', 'website': 'http://www.camptocamp.com',
'data': ['better_zip_view.xml',
'state_view.xml',
'company_view.xml',
'partner_view.xml',
'data': ['views/better_zip_view.xml',
'views/state_view.xml',
'views/res_country_view.xml',
'views/company_view.xml',
'views/partner_view.xml',
'security/ir.model.access.csv'], 'security/ir.model.access.csv'],
'installable': True, 'installable': True,
'active': False, 'active': False,

82
base_location/better_zip.py

@ -1,82 +0,0 @@
# -*- coding: utf-8 -*-
#
#
# Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
#
from openerp.osv import orm, fields
class BetterZip(orm.Model):
" City/locations completion object"
_name = "res.better.zip"
_description = __doc__
_order = "priority"
_columns = {'priority': fields.integer('Priority', deprecated=True),
'name': fields.char('ZIP'),
'city': fields.char('City', required=True),
'state_id': fields.many2one('res.country.state', 'State'),
'country_id': fields.many2one('res.country', 'Country'),
'code': fields.char('City Code', size=64,
help="The official code for the city"),
}
_defaults = {'priority': 100}
def name_get(self, cursor, uid, ids, context=None):
res = []
for bzip in self.browse(cursor, uid, ids, context=context):
if bzip.name:
name = [bzip.name, bzip.city]
else:
name = [bzip.city]
if bzip.state_id:
name.append(bzip.state_id.name)
if bzip.country_id:
name.append(bzip.country_id.name)
res.append((bzip.id, ", ".join(name)))
return res
def onchange_state_id(self, cr, uid, ids, state_id=False, context=None):
result = {}
if state_id:
state = self.pool['res.country.state'].browse(
cr, uid, state_id, context=context)
if state:
result['value'] = {'country_id': state.country_id.id}
return result
def name_search(
self, cr, uid, name, args=None, operator='ilike', context=None,
limit=100
):
if args is None:
args = []
if context is None:
context = {}
ids = []
if name:
ids = self.search(
cr, uid, [('name', 'ilike', name)] + args, limit=limit)
if not ids:
ids = self.search(
cr, uid, [('city', operator, name)] + args, limit=limit)
return self.name_get(cr, uid, ids, context=context)

63
base_location/better_zip_view.xml

@ -1,63 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="better_zip_form">
<field name="name">res.better.zip.form</field>
<field name="model">res.better.zip</field>
<field name="arch" type="xml">
<form string="ZIP" version="7.0">
<group col="4">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="priority"/>
<field name="state_id" on_change="onchange_state_id(state_id)"/>
<field name="country_id"/>
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="better_zip_tree">
<field name="name">res.better.zip.tree</field>
<field name="model">res.better.zip</field>
<field name="arch" type="xml">
<tree string="ZIP">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="country_id"/>
<field name="priority"/>
</tree>
</field>
</record>
<record id="view_better_zip_filter" model="ir.ui.view">
<field name="name">res.better.zip.select</field>
<field name="model">res.better.zip</field>
<field name="arch" type="xml">
<search string="Search city">
<field name="name"/>
<field name="city"/>
</search>
</field>
</record>
<record id="action_zip_tree" model="ir.actions.act_window">
<field name="name">Cites/locations Management</field>
<field name="res_model">res.better.zip</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field ref="better_zip_tree" name="view_id"/>
<field name="search_view_id" ref="view_better_zip_filter"/>
</record>
<menuitem
name="Cities/Locations Management"
id="zip_base"
parent="base.menu_localisation"
action="action_zip_tree"
/>
</data>
</openerp>

20
base_location/company_view.xml

@ -1,20 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Add cities to the company form -->
<record id="view_company_form_city" model="ir.ui.view">
<field name="name">res.company.form.city</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form"/>
<field name="arch" type="xml">
<field name="street2" position="after">
<field name="better_zip_id"
options="{'create_name_field': 'city'}"
colspan="4"
on_change="on_change_city(better_zip_id)"
placeholder="City completion" />
</field>
</field>
</record>
</data>
</openerp>

10
base_location/models/__init__.py

@ -0,0 +1,10 @@
# -*- coding: utf-8 -*-
#
# License, author and contributors information in:
# __openerp__.py file at the root folder of this module.
#
from . import better_zip
from . import partner
from . import state
from . import company

67
base_location/models/better_zip.py

@ -0,0 +1,67 @@
# -*- coding: utf-8 -*-
#
#
# Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com>
# Alejandro Santana <alejandrosantana@anubia.es>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero 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 Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
from openerp import models, fields, api
class BetterZip(models.Model):
'''City/locations completion object'''
_name = "res.better.zip"
_description = __doc__
_order = "name asc"
name = fields.Char('ZIP')
code = fields.Char('City Code', size=64,
help="The official code for the city")
city = fields.Char('City', required=True)
state_id = fields.Many2one('res.country.state', 'State')
country_id = fields.Many2one('res.country', 'Country')
@api.multi
def name_get(self):
res = []
for bzip in self:
if bzip.name:
name = [bzip.name, bzip.city]
else:
name = [bzip.city]
if bzip.state_id:
name.append(bzip.state_id.name)
if bzip.country_id:
name.append(bzip.country_id.name)
res.append((bzip.id, ", ".join(name)))
return res
@api.onchange('state_id')
def onchange_state_id(self):
if self.state_id:
self.country_id = self.state_id.country_id
@api.model
def name_search(self, name, args=None, operator='ilike', limit=100):
args = args or []
recs = self.browse()
if name:
recs = self.search([('name', 'ilike', name)] + args, limit=limit)
if not recs:
recs = self.search([('city', operator, name)] + args, limit=limit)
return recs.name_get()

39
base_location/company.py → base_location/models/company.py

@ -4,6 +4,7 @@
# Author: Nicolas Bessi. Copyright Camptocamp SA # Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com> # Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com> # Ignacio Ibeas <ignacio@acysos.com>
# Alejandro Santana <alejandrosantana@anubia.es>
# #
# 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 Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -19,31 +20,25 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# #
from openerp.osv import orm, fields
from openerp import models, fields, api
class ResCompany(orm.Model):
class ResCompany(models.Model):
_inherit = 'res.company' _inherit = 'res.company'
def on_change_city(self, cr, uid, ids, zip_id, context=None):
result = {}
if context is None:
context = {}
if zip_id:
bzip = self.pool['res.better.zip'].browse(
cr, uid, zip_id, context=context)
result = {'value': {
'zip': bzip.name,
'country_id': bzip.country_id.id if bzip.country_id else False,
'city': bzip.city,
'state_id': bzip.state_id.id if bzip.state_id else False
}
}
return result
@api.one
@api.onchange('better_zip_id')
def on_change_city(self):
if self.better_zip_id:
self.zip = self.better_zip_id.name
self.city = self.better_zip_id.city
self.state_id = self.better_zip_id.state_id
self.country_id = self.better_zip_id.country_id
_columns = {
'better_zip_id': fields.many2one(
'res.better.zip', 'Location', select=1,
help=('Use the city name or the zip code to search the location')),
}
better_zip_id = fields.Many2one(
'res.better.zip',
string='Location',
select=1,
help='Use the city name or the zip code to search the location',
)

31
base_location/partner.py → base_location/models/partner.py

@ -4,6 +4,7 @@
# Author: Nicolas Bessi. Copyright Camptocamp SA # Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com> # Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com> # Ignacio Ibeas <ignacio@acysos.com>
# Alejandro Santana <alejandrosantana@anubia.es>
# #
# 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 Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -19,24 +20,18 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# #
from openerp.osv import orm, fields
from openerp import models, fields, api
class ResPartner(orm.Model):
_inherit = "res.partner"
_columns = {'zip_id': fields.many2one('res.better.zip', 'City/Location')}
class ResPartner(models.Model):
_inherit = 'res.partner'
zip_id = fields.Many2one('res.better.zip', 'City/Location')
def onchange_zip_id(self, cursor, uid, ids, zip_id, context=None):
if not zip_id:
return {}
if isinstance(zip_id, list):
zip_id = zip_id[0]
bzip = self.pool['res.better.zip'].browse(
cursor, uid, zip_id, context=context)
return {'value': {
'zip': bzip.name,
'city': bzip.city,
'country_id': bzip.country_id.id if bzip.country_id else False,
'state_id': bzip.state_id.id if bzip.state_id else False,
}
}
@api.one
@api.onchange('zip_id')
def onchange_zip_id(self):
if self.zip_id:
self.zip = self.zip_id.name
self.city = self.zip_id.city
self.state_id = self.zip_id.state_id
self.country_id = self.zip_id.country_id

8
base_location/state.py → base_location/models/state.py

@ -4,6 +4,7 @@
# Author: Nicolas Bessi. Copyright Camptocamp SA # Author: Nicolas Bessi. Copyright Camptocamp SA
# Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com> # Contributor: Pedro Manuel Baeza <pedro.baeza@serviciosbaeza.com>
# Ignacio Ibeas <ignacio@acysos.com> # Ignacio Ibeas <ignacio@acysos.com>
# Alejandro Santana <alejandrosantana@anubia.es>
# #
# 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 Affero General Public License as # it under the terms of the GNU Affero General Public License as
@ -19,12 +20,11 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# #
from openerp.osv import orm, fields
from openerp import models, fields
class ResCountryState(orm.Model):
class ResCountryState(models.Model):
_inherit = 'res.country.state' _inherit = 'res.country.state'
_columns = {'better_zip_ids': fields.one2many(
'res.better.zip', 'state_id', 'Cities')}
better_zip_ids = fields.One2many('res.better.zip', 'state_id', 'Cities')

30
base_location/partner_view.xml

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">res.partner.zip_id.2</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<div class="address_format" position="before">
<field name="zip_id"
options="{'create_name_field': 'city'}"
on_change="onchange_zip_id(zip_id)"
placeholder="City completion"
attrs="{'invisible': [('use_parent_address','=',True)]}"
class="oe_edit_only"
/>
</div>
<xpath expr="//field[@name='child_ids']/form//div[@class='address_format']" position="before">
<field name="zip_id"
options="{'create_name_field': 'city'}"
on_change="onchange_zip_id(zip_id)"
placeholder="City completion"
attrs="{'invisible': [('use_parent_address','=',True)]}"
class="oe_edit_only"
/>
</xpath>
</field>
</record>
</data>
</openerp>

26
base_location/state_view.xml

@ -1,26 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Add cities to the State form -->
<record model="ir.ui.view" id="view_country_state_form2">
<field name="name">view_country_state_form2</field>
<field name="model">res.country.state</field>
<field name="inherit_id" ref="base.view_country_state_form"/>
<field name="arch" type="xml">
<field name="country_id" position="after">
<field name="better_zip_ids"
context="{'country_id': country_id}"
colspan="4"
nolabel="1">
<tree editable="top">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="country_id"/>
</tree>
</field>
</field>
</field>
</record>
</data>
</openerp>

70
base_location/views/better_zip_view.xml

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="better_zip_form">
<field name="name">res.better.zip.form</field>
<field name="model">res.better.zip</field>
<field name="arch" type="xml">
<form string="ZIP" version="7.0">
<group col="4">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="state_id"/>
<field name="country_id"/>
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="better_zip_tree">
<field name="name">res.better.zip.tree</field>
<field name="model">res.better.zip</field>
<field name="arch" type="xml">
<tree string="ZIP">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="state_id"/>
<field name="country_id"/>
</tree>
</field>
</record>
<record id="view_better_zip_filter" model="ir.ui.view">
<field name="name">res.better.zip.select</field>
<field name="model">res.better.zip</field>
<field name="arch" type="xml">
<search string="Search city">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="state_id"/>
<field name="country_id"/>
<group expand="0" string="Group By">
<filter string="State" domain="[]" context="{'group_by':'state_id'}"/>
<filter string="Country" domain="[]" context="{'group_by':'country_id'}"/>
</group>
</search>
</field>
</record>
<record id="action_zip_tree" model="ir.actions.act_window">
<field name="name">Cites/locations Management</field>
<field name="res_model">res.better.zip</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field ref="better_zip_tree" name="view_id"/>
<field name="search_view_id" ref="view_better_zip_filter"/>
</record>
<menuitem
name="Cities/Locations Management"
id="zip_base"
parent="base.menu_localisation"
action="action_zip_tree"
/>
</data>
</openerp>

21
base_location/views/company_view.xml

@ -0,0 +1,21 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Add cities to the company form -->
<record id="view_company_form_city" model="ir.ui.view">
<field name="name">res.company.form.city</field>
<field name="model">res.company</field>
<field name="inherit_id" ref="base.view_company_form" />
<field name="arch" type="xml">
<field name="street2" position="after">
<field name="better_zip_id"
options="{'create_name_field': 'city'}"
colspan="4"
placeholder="City completion" />
</field>
</field>
</record>
</data>
</openerp>

27
base_location/views/partner_view.xml

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">res.partner.zip_id.2</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<div class="address_format" position="before">
<field name="zip_id"
options="{'create_name_field': 'city'}"
placeholder="City completion"
attrs="{'invisible': [('use_parent_address','=',True)]}"
class="oe_edit_only" />
</div>
<xpath expr="//field[@name='child_ids']/form//div[@class='address_format']" position="before">
<field name="zip_id" options="{'create_name_field': 'city'}"
placeholder="City completion"
attrs="{'invisible': [('use_parent_address','=',True)]}"
class="oe_edit_only" />
</xpath>
</field>
</record>
</data>
</openerp>

17
base_location/views/res_country_view.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="view_country_search" model="ir.ui.view">
<field name="name">res.country.search</field>
<field name="model">res.country</field>
<field name="arch" type="xml">
<search string="Country">
<field name="name"/>
<field name="code"/>
</search>
</field>
</record>
</data>
</openerp>

26
base_location/views/state_view.xml

@ -0,0 +1,26 @@
<?xml version="1.0"?>
<openerp>
<data>
<!-- Add cities to the State form -->
<record model="ir.ui.view" id="view_country_state_form2">
<field name="name">view_country_state_form2</field>
<field name="model">res.country.state</field>
<field name="inherit_id" ref="base.view_country_state_form"/>
<field name="arch" type="xml">
<field name="country_id" position="after">
<field name="better_zip_ids"
context="{'country_id': country_id}"
colspan="4"
nolabel="1">
<tree editable="top">
<field name="name"/>
<field name="code"/>
<field name="city"/>
<field name="country_id"/>
</tree>
</field>
</field>
</field>
</record>
</data>
</openerp>
Loading…
Cancel
Save