Filtrar Estados al seleccionar un país

Asked by Carlos Lopez

Buenas noches a todas y todos.
He modificado el FormView correspondiente a las Compañias incluyendo Estaos; Municipios y Asentamientos, sin embargo, necesito filtrar los Estados cuando el usuario selecciona un Paíz, de la misma forma filtrar los Municipios cuando el usuario selecciona un Estado y filtrar los Asentamientos al seleccionar un Municipio.
Y honestamente no tengo idea de como diseñar esta funcionalidad.
Espero me puedan orientar.

Question information

Language:
Spanish Edit question
Status:
Answered
For:
openerp-mexico-localization Edit question
Assignee:
No assignee Edit question
Last query:
Last reply:
Revision history for this message
Jorge Pintor (zg439j8kf0uccph0xv-webmaster-3457vpxnee6hb9i7q4) said :
#1

Yo tambien habia pensado lo mismo, gracias por adelantarte! (Y), lo de filtardo por país yo recuerdo que la funcionalidad ya estaba, aunque no se si con la localización se perdió. Por el lado del los municipios creo que es lo mejor ya que muchos municipios se repiten por estado (como Benito Juarez que hay como 15).

Saludos!

Revision history for this message
Carlos Lopez (carlos-agustin) said :
#2

Hola a todas y todos.
Pues bien, revisando documentación encontre que una opción para realizar el filtrado es modificar el código XML del ForView.
Este sería un ejemplo:
<group string="Dirección">
 <field name="partner_id" readonly="1" required="0" groups="base.group_no_one"/>
 <field name="country_id"/>
 <field name="country_id"/>
 <field name="state_id" domain="[('country_id','=',country_id)]"/>
 <field name="x_municipio_id" domain="[('x_state_id','=',state_id)]"/>
 <field name="x_asentamiento_id" domain="[('x_municipio_id','=',x_municipio_id)]"/>
 <field name="zip" style="width: 34%"/>
 <field name="street"/>
 <field name="x_num_ext"/>
 <field name="x_num_int"/>
</group>

Como observaran he definido las tablas utilizando la funcionalidad de OpenERP.
Sin embargo, cuando cargo los municipios y asentamientos estos no están ordenados, OpenERP me así me los mostrará.
La única forma que he encontrado es crear una clase para municipios y asentamientos respectivamente:
class CountryStateMpo(osv.osv):
    _description="Municipio"
    _name = 'res.country.state.mpo'
    _columns = {
        'state_id': fields.many2one('res.country.state', 'Municipio', required=True),
        'name': fields.char('Municipio', size=200, required=True, help='Nombre del municipio'),
        'code': fields.char('State Code', size=5, help='Clave del municipio', required=True),
    }
    _order = 'name'

Mi epregunta sobre esto último es: ¿Hay alguna forma de hacer preubas unitarias de la o las clases?

El script de carga de los municipios esta en Perl:

#!/usr/bin/perl -w
use DBI;

#****************************************************************************************************
# REALIZA LA TRANSFORMACION DE LOS .DBF A PG
#****************************************************************************************************
# EN LAPTOP
my $textos = '/home/openerp/textos';

my $db = 'openerp';
my $host = 'localhost';
my $user = 'openerp';
my $password = 'TUPASSWORD';
my $strSql = '';
my $flag = 0;

$dbhPg = DBI->connect("dbi:Pg:dbname=$db;host=$host", $user, $password) or die();
$dbhPg->do("SET client_min_messages = error;");

#****************************************************************************************************
#
#****************************************************************************************************
sub strzeros {
 my $cadena=$_[0];
 my $ceros=$_[1];
 my $str=$cadena;
 for (my $a=length($cadena); $a<=$ceros; $a++) {$str='0'.$str;}
 return $str;
}

#****************************************************************************************************
# EL ARCIVO TXT DE SEPOMES LE CAMBIO LA CODIFICACION DE ISO-8859-1 A UTF-8
# iconv -f ISO-8859-1 -t UTF-8 CPdescarga.txt > CPdescarga.utf8.txt
#****************************************************************************************************
$dbhPg->do("DROP TABLE IF EXISTS sepomex;");
$dbhPg->do("
CREATE TABLE sepomex (
 d_codigo VARCHAR(250),
 d_asenta VARCHAR(250),
 d_tipo_asenta VARCHAR(250),
 d_mnpio VARCHAR(250),
 d_estado VARCHAR(250),
 d_ciudad VARCHAR(250),
 d_cp VARCHAR(250),
 c_estado VARCHAR(250),
 c_oficina VARCHAR(250),
 c_cp VARCHAR(250),
 c_tipo_asenta VARCHAR(250),
 c_mnpio VARCHAR(250),
 id_asenta_cpcons VARCHAR(250),
 d_zona VARCHAR(250),
 c_cve_ciudad VARCHAR(250)
);") or die();
$dbhPg->do("copy sepomex from '/opt/openerp/textos/CPdescarga.utf8.txt' delimiter '|';");
$dbhPg->do("COMMENT ON TABLE sepomex IS 'SEPOMEX';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_codigo IS 'Código Postal asentamiento';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_asenta IS 'Nombre asentamiento';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_tipo_asenta IS 'Tipo de asentamiento (Catálogo SEPOMEX)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_mnpio IS 'Nombre Municipio (INEGI, Marzo 2013)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_estado IS 'Nombre Entidad (INEGI, Marzo 2013)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_ciudad IS 'Nombre Ciudad (Catálogo SEPOMEX)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_cp IS 'Código Postal de la Administración Postal que reparte al asentamiento';");
$dbhPg->do("COMMENT ON COLUMN sepomex.c_estado IS 'Clave Entidad (INEGI, Marzo 2013)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.c_oficina IS 'Código Postal de la Administración Postal que reparte al asentamiento';");
$dbhPg->do("COMMENT ON COLUMN sepomex.c_cp IS 'Campo Vacio';");
$dbhPg->do("COMMENT ON COLUMN sepomex.c_tipo_asenta IS 'Clave Tipo de asentamiento (Catálogo SEPOMEX)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.c_mnpio IS 'Clave Municipio (INEGI, Marzo 2013)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.id_asenta_cpcons IS 'Identificador único del asentamiento (nivel municipal)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.d_zona IS 'Zona en la que se ubica el asentamiento (Urbano/Rural)';");
$dbhPg->do("COMMENT ON COLUMN sepomex.c_cve_ciudad IS 'Clave Ciudad (Catálogo SEPOMEX)';");

 $dbhPg->do("DROP TABLE IF EXISTS res_country_state_mpo_asen;");
 $dbhPg->do("DROP TABLE IF EXISTS res_country_state_mpo");
 $dbhPg->do("
 CREATE TABLE res_country_state_mpo (
  id SERIAL PRIMARY KEY NOT NULL,
  create_uid INTEGER DEFAULT 1,
  create_date timestamp without time zone DEFAULT now(),
  write_uid INTEGER DEFAULT 1,
  write_date timestamp without time zone DEFAULT now(),
  state_id INTEGER,
  name VARCHAR(250),
  code VARCHAR(5),
  CONSTRAINT mpo_state_uid_fkey FOREIGN KEY (state_id) REFERENCES res_country_state(id) ON DELETE SET NULL,
  CONSTRAINT mpo_create_uid_fkey FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL,
  CONSTRAINT mpo_write_uid_fkey FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL
 );
 ");
$dbhPg->do("COMMENT ON TABLE res_country_state_mpo IS 'Municipios';");
$dbhPg->do("COMMENT ON COLUMN res_country_state_mpo.state_id IS 'Id del estado';");

$dbhPg->do("INSERT INTO res_country_state_mpo (state_id, name, code)
(
SELECT a.id, b.d_mnpio, b.c_estado || b.c_mnpio
FROM res_country_state AS a, (
SELECT c_estado, c_mnpio, d_mnpio FROM sepomex
GROUP BY c_estado, c_mnpio, d_mnpio
ORDER BY c_estado, c_mnpio, d_mnpio) AS b
WHERE a.country_id = 157 and a.code = b.c_estado
ORDER BY b.c_estado, b.c_mnpio
);
");

 $dbhPg->do("
 CREATE TABLE res_country_state_mpo_asen (
  id SERIAL PRIMARY KEY NOT NULL,
  create_uid INTEGER,
  create_date timestamp without time zone DEFAULT now(),
  write_uid INTEGER DEFAULT 1,
  write_date timestamp without time zone DEFAULT now(),
  municipio_id INTEGER DEFAULT 1,
  code VARCHAR(9),
  name VARCHAR(250),
  cp VARCHAR(5),
  CONSTRAINT asen_mpo_uid_fkey FOREIGN KEY (municipio_id) REFERENCES res_country_state_mpo(id) ON DELETE SET NULL,
  CONSTRAINT asen_create_uid_fkey FOREIGN KEY (create_uid) REFERENCES res_users(id) ON DELETE SET NULL,
  CONSTRAINT asen_write_uid_fkey FOREIGN KEY (write_uid) REFERENCES res_users(id) ON DELETE SET NULL
 );
 ");

$dbhPg->do("INSERT INTO res_country_state_mpo_asen (municipio_id, name, code, cp)
(
SELECT a.id, b.d_asenta, b.c_estado || b.c_mnpio || b.id_asenta_cpcons, b.d_codigo
FROM res_country_state_mpo AS a, sepomex AS b
WHERE a.code = (b.c_estado || b.c_mnpio)
ORDER BY b.c_estado, b.c_mnpio, b.id_asenta_cpcons);
");

$dbhPg->disconnect;
exit();

Muchas gracias.

Revision history for this message
Moisés López - http://www.vauxoo.com (moylop260) said :
#3

Puedes hacer pruebas unitarias con test-yaml
https://doc.openerp.com/6.0/contribute/15_guidelines/coding_guidelines_testing/#automated-yaml-tests-guideline

Precisamente, se está haciendo un trabajo para migrar todo lo relacionado a
este tipo de temas a este proyecto:
https://code.launchpad.net/~partner-contact-core-editors/partner-contact-management/7.0

Por lo pronto, pueden trabajar en una MP a la oml y de ahí vamos
gestionando que runbot esté en verde en su propuesta de merge.

De antemano gracias por su colaboración.

2013/11/21 Carlos Lopez <email address hidden>

> Question #239506 on openerp-mexico-localization changed:
> https://answers.launchpad.net/openerp-mexico-localization/+question/239506
>
> Carlos Lopez posted a new comment:
> Hola a todas y todos.
> Pues bien, revisando documentación encontre que una opción para realizar
> el filtrado es modificar el código XML del ForView.
> Este sería un ejemplo:
> <group string="Dirección">
> <field name="partner_id" readonly="1" required="0"
> groups="base.group_no_one"/>
> <field name="country_id"/>
> <field name="country_id"/>
> <field name="state_id" domain="[('country_id','=',country_id)]"/>
> <field name="x_municipio_id"
> domain="[('x_state_id','=',state_id)]"/>
> <field name="x_asentamiento_id"
> domain="[('x_municipio_id','=',x_municipio_id)]"/>
> <field name="zip" style="width: 34%"/>
> <field name="street"/>
> <field name="x_num_ext"/>
> <field name="x_num_int"/>
> </group>
>
> Como observaran he definido las tablas utilizando la funcionalidad de
> OpenERP.
> Sin embargo, cuando cargo los municipios y asentamientos estos no están
> ordenados, OpenERP me así me los mostrará.
> La única forma que he encontrado es crear una clase para municipios y
> asentamientos respectivamente:
> class CountryStateMpo(osv.osv):
> _description="Municipio"
> _name = 'res.country.state.mpo'
> _columns = {
> 'state_id': fields.many2one('res.country.state', 'Municipio',
> required=True),
> 'name': fields.char('Municipio', size=200, required=True,
> help='Nombre del municipio'),
> 'code': fields.char('State Code', size=5, help='Clave del
> municipio', required=True),
> }
> _order = 'name'
>
> Mi epregunta sobre esto último es: ¿Hay alguna forma de hacer preubas
> unitarias de la o las clases?
>
> El script de carga de los municipios esta en Perl:
>
> #!/usr/bin/perl -w
> use DBI;
>
>
> #****************************************************************************************************
> # REALIZA LA TRANSFORMACION DE LOS .DBF A PG
>
> #****************************************************************************************************
> # EN LAPTOP
> my $textos = '/home/openerp/textos';
>
> my $db = 'openerp';
> my $host = 'localhost';
> my $user = 'openerp';
> my $password = 'TUPASSWORD';
> my $strSql = '';
> my $flag = 0;
>
> $dbhPg = DBI->connect("dbi:Pg:dbname=$db;host=$host", $user, $password) or
> die();
> $dbhPg->do("SET client_min_messages = error;");
>
>
> #****************************************************************************************************
> #
>
> #****************************************************************************************************
> sub strzeros {
> my $cadena=$_[0];
> my $ceros=$_[1];
> my $str=$cadena;
> for (my $a=length($cadena); $a<=$ceros; $a++) {$str='0'.$str;}
> return $str;
> }
>
>
> #****************************************************************************************************
> # EL ARCIVO TXT DE SEPOMES LE CAMBIO LA CODIFICACION DE ISO-8859-1 A UTF-8
> # iconv -f ISO-8859-1 -t UTF-8 CPdescarga.txt > CPdescarga.utf8.txt
>
> #****************************************************************************************************
> $dbhPg->do("DROP TABLE IF EXISTS sepomex;");
> $dbhPg->do("
> CREATE TABLE sepomex (
> d_codigo VARCHAR(250),
> d_asenta VARCHAR(250),
> d_tipo_asenta VARCHAR(250),
> d_mnpio VARCHAR(250),
> d_estado VARCHAR(250),
> d_ciudad VARCHAR(250),
> d_cp VARCHAR(250),
> c_estado VARCHAR(250),
> c_oficina VARCHAR(250),
> c_cp VARCHAR(250),
> c_tipo_asenta VARCHAR(250),
> c_mnpio VARCHAR(250),
> id_asenta_cpcons VARCHAR(250),
> d_zona VARCHAR(250),
> c_cve_ciudad VARCHAR(250)
> );") or die();
> $dbhPg->do("copy sepomex from '/opt/openerp/textos/CPdescarga.utf8.txt'
> delimiter '|';");
> $dbhPg->do("COMMENT ON TABLE sepomex IS 'SEPOMEX';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_codigo IS 'Código Postal
> asentamiento';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_asenta IS 'Nombre asentamiento';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_tipo_asenta IS 'Tipo de
> asentamiento (Catálogo SEPOMEX)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_mnpio IS 'Nombre Municipio (INEGI,
> Marzo 2013)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_estado IS 'Nombre Entidad (INEGI,
> Marzo 2013)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_ciudad IS 'Nombre Ciudad (Catálogo
> SEPOMEX)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_cp IS 'Código Postal de la
> Administración Postal que reparte al asentamiento';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.c_estado IS 'Clave Entidad (INEGI,
> Marzo 2013)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.c_oficina IS 'Código Postal de la
> Administración Postal que reparte al asentamiento';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.c_cp IS 'Campo Vacio';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.c_tipo_asenta IS 'Clave Tipo de
> asentamiento (Catálogo SEPOMEX)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.c_mnpio IS 'Clave Municipio (INEGI,
> Marzo 2013)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.id_asenta_cpcons IS 'Identificador
> único del asentamiento (nivel municipal)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.d_zona IS 'Zona en la que se ubica
> el asentamiento (Urbano/Rural)';");
> $dbhPg->do("COMMENT ON COLUMN sepomex.c_cve_ciudad IS 'Clave Ciudad
> (Catálogo SEPOMEX)';");
>
> $dbhPg->do("DROP TABLE IF EXISTS res_country_state_mpo_asen;");
> $dbhPg->do("DROP TABLE IF EXISTS res_country_state_mpo");
> $dbhPg->do("
> CREATE TABLE res_country_state_mpo (
> id SERIAL PRIMARY KEY NOT NULL,
> create_uid INTEGER DEFAULT 1,
> create_date timestamp without time zone DEFAULT now(),
> write_uid INTEGER DEFAULT 1,
> write_date timestamp without time zone DEFAULT now(),
> state_id INTEGER,
> name VARCHAR(250),
> code VARCHAR(5),
> CONSTRAINT mpo_state_uid_fkey FOREIGN KEY (state_id)
> REFERENCES res_country_state(id) ON DELETE SET NULL,
> CONSTRAINT mpo_create_uid_fkey FOREIGN KEY (create_uid)
> REFERENCES res_users(id) ON DELETE SET NULL,
> CONSTRAINT mpo_write_uid_fkey FOREIGN KEY (write_uid)
> REFERENCES res_users(id) ON DELETE SET NULL
> );
> ");
> $dbhPg->do("COMMENT ON TABLE res_country_state_mpo IS 'Municipios';");
> $dbhPg->do("COMMENT ON COLUMN res_country_state_mpo.state_id IS 'Id del
> estado';");
>
> $dbhPg->do("INSERT INTO res_country_state_mpo (state_id, name, code)
> (
> SELECT a.id, b.d_mnpio, b.c_estado || b.c_mnpio
> FROM res_country_state AS a, (
> SELECT c_estado, c_mnpio, d_mnpio FROM sepomex
> GROUP BY c_estado, c_mnpio, d_mnpio
> ORDER BY c_estado, c_mnpio, d_mnpio) AS b
> WHERE a.country_id = 157 and a.code = b.c_estado
> ORDER BY b.c_estado, b.c_mnpio
> );
> ");
>
> $dbhPg->do("
> CREATE TABLE res_country_state_mpo_asen (
> id SERIAL PRIMARY KEY NOT NULL,
> create_uid INTEGER,
> create_date timestamp without time zone DEFAULT now(),
> write_uid INTEGER DEFAULT 1,
> write_date timestamp without time zone DEFAULT now(),
> municipio_id INTEGER DEFAULT 1,
> code VARCHAR(9),
> name VARCHAR(250),
> cp VARCHAR(5),
> CONSTRAINT asen_mpo_uid_fkey FOREIGN KEY (municipio_id)
> REFERENCES res_country_state_mpo(id) ON DELETE SET NULL,
> CONSTRAINT asen_create_uid_fkey FOREIGN KEY (create_uid)
> REFERENCES res_users(id) ON DELETE SET NULL,
> CONSTRAINT asen_write_uid_fkey FOREIGN KEY (write_uid)
> REFERENCES res_users(id) ON DELETE SET NULL
> );
> ");
>
> $dbhPg->do("INSERT INTO res_country_state_mpo_asen (municipio_id, name,
> code, cp)
> (
> SELECT a.id, b.d_asenta, b.c_estado || b.c_mnpio || b.id_asenta_cpcons,
> b.d_codigo
> FROM res_country_state_mpo AS a, sepomex AS b
> WHERE a.code = (b.c_estado || b.c_mnpio)
> ORDER BY b.c_estado, b.c_mnpio, b.id_asenta_cpcons);
> ");
>
> $dbhPg->disconnect;
> exit();
>
>
> Muchas gracias.
>
> --
> You received this question notification because you are an answer
> contact for openerp-mexico-localization.
>

--
Moisés López Calderón
Vauxoo - OpenERP's Gold Partner
mobile: (+521) 477-752-22-30
Tel: (+52) 477-773-33-46
skype: moylop260
web: http://www.vauxoo.com
twitter: @moylop260
            @vauxoo

Can you help with this problem?

Provide an answer of your own, or ask Carlos Lopez for more information if necessary.

To post a message you must log in.