Browse Source

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

pull/638/head
Alejandro Santana 10 years ago
committed by Pedro M. Baeza
parent
commit
c01ba9d8f1
  1. 20
      base_location/README.rst
  2. 6
      base_location/__init__.py
  3. 43
      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

43
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,19 +20,29 @@
# 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',
'depends': ['base'],
'author': 'Camptocamp',
'description': """
Introduces a better zip/npa management system.
It enables zip/city auto-completion on partners""",
'website': 'http://www.camptocamp.com',
'data': ['better_zip_view.xml',
'state_view.xml',
'company_view.xml',
'partner_view.xml',
'security/ir.model.access.csv'],
'installable': True,
'active': False,
}
{
'name': 'Location management (aka Better ZIP)',
'version': '8.0.1.0.0',
'depends': ['base'],
'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',
'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'],
'installable': True,
'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