[MERGE] forward port of branch 8.0 up to dc41a9b

This commit is contained in:
Christophe Simonis
2015-03-02 18:19:34 +01:00
41 changed files with 363 additions and 229 deletions
+90 -83
View File
@@ -4,6 +4,8 @@ Ajay Javiya <aja@tinyerp.com>
Ajay Javiya <aja@tinyerp.com> <aja@openerp.com> Ajay Javiya <aja@tinyerp.com> <aja@openerp.com>
Akash Balar <aba@tinyerp.com> Akash Balar <aba@tinyerp.com>
Akash Balar <aba@tinyerp.com> <aba@openerp.com> Akash Balar <aba@tinyerp.com> <aba@openerp.com>
Akta Dakwala <eda@tinyerp.com>
Akta Dakwala <eda@tinyerp.com> EDA(Axelor) <>
Albert Cervera i Areny <albert@nan-tic.com> Albert Cervera i Areny <albert@nan-tic.com>
Albert Cervera i Areny <albert@nan-tic.com> Albert Cervera i Areny - http://www.NaN-tic.com <> Albert Cervera i Areny <albert@nan-tic.com> Albert Cervera i Areny - http://www.NaN-tic.com <>
Albert Cervera i Areny <albert@nan-tic.com> Albert Cervera i Areny <> Albert Cervera i Areny <albert@nan-tic.com> Albert Cervera i Areny <>
@@ -20,6 +22,7 @@ Alexis de Lattre <alexis.delattre@akretion.com>
Alexis de Lattre <alexis.delattre@akretion.com> <alexis@via.ecp.fr> Alexis de Lattre <alexis.delattre@akretion.com> <alexis@via.ecp.fr>
Alexis de Lattre <alexis.delattre@akretion.com> Alexis de Lattre <> Alexis de Lattre <alexis.delattre@akretion.com> Alexis de Lattre <>
Alexis de Lattre <alexis.delattre@akretion.com> alexis.delattre@akretion.com <> Alexis de Lattre <alexis.delattre@akretion.com> alexis.delattre@akretion.com <>
Aliane Abdelouahab <abdelouahab_al@yahoo.fr>
Aline Preillon <apr@odoo.com> Aline Preillon <apr@odoo.com>
Aline Preillon <apr@odoo.com> <aline@aline-laptop> Aline Preillon <apr@odoo.com> <aline@aline-laptop>
Amit Bhavsar <amb@tinyerp.com> Amit Bhavsar <amb@tinyerp.com>
@@ -103,6 +106,9 @@ Atul Patel <atp@tinyerp.com> ATP(OpenERP) <>
Atul Patel <atp@tinyerp.com> ATUL (OpenERP) <> Atul Patel <atp@tinyerp.com> ATUL (OpenERP) <>
Atul Patel <atp@tinyerp.com> atp (OpenERP) <> Atul Patel <atp@tinyerp.com> atp (OpenERP) <>
Augustin Cisterne-Kaas <augustin.cisternekaas@elico-corp.com> Augustin Cisterne-Kaas <ajite@Aerith.local> Augustin Cisterne-Kaas <augustin.cisternekaas@elico-corp.com> Augustin Cisterne-Kaas <ajite@Aerith.local>
Avdhesh Patel <avp@tinyerp.com>
Avdhesh Patel <avp@tinyerp.com> AVP(Axelor) <>
Avdhesh Patel <avp@tinyerp.com> avp <openerp@openerp-laptop>
Baskhuu Jacara <baskhuujacara@gmail.com> Jacara <> Baskhuu Jacara <baskhuujacara@gmail.com> Jacara <>
Baskhuu Jacara <baskhuujacara@gmail.com> jacara <> Baskhuu Jacara <baskhuujacara@gmail.com> jacara <>
Benoit Guillot <benoit.guillot@akretion.com> Benoit Guillot <benoit.guillot@akretion.com>
@@ -113,6 +119,7 @@ Bharat Devnani <bde@tinyerp.com> <bde@tiny2-desktop>
Bharat Devnani <bde@tinyerp.com> Bharat Devnani (Open ERP) <> Bharat Devnani <bde@tinyerp.com> Bharat Devnani (Open ERP) <>
Bharat Devnani <bde@tinyerp.com> Bharat Devnani(OpenERP) <> Bharat Devnani <bde@tinyerp.com> Bharat Devnani(OpenERP) <>
Bharat Devnani <bde@tinyerp.com> bde@tinyerp.com <> Bharat Devnani <bde@tinyerp.com> bde@tinyerp.com <>
Bhatt Chintal <bch@tinyerp.com> bch <>
Bhavik Bagdiya <bba@tinyerp.com> Bhavik Bagdiya <bba@tinyerp.com>
Bhavik Bagdiya <bba@tinyerp.com> <bba@openerp.com> Bhavik Bagdiya <bba@tinyerp.com> <bba@openerp.com>
Bhumi Patel <bpa@openerp.com> Bhumi Patel <bpa@openerp.com>
@@ -217,6 +224,8 @@ Dhara Shah <dsh@tinyerp.com> Dhara (OpenERP) <>
Dhara Shah <dsh@tinyerp.com> Dhara <dhara@dhara-laptop> Dhara Shah <dsh@tinyerp.com> Dhara <dhara@dhara-laptop>
Dhara Shah <dsh@tinyerp.com> dsh (Open ERP) <> Dhara Shah <dsh@tinyerp.com> dsh (Open ERP) <>
Dhara Shah <dsh@tinyerp.com> dsh(Open ERP) <> Dhara Shah <dsh@tinyerp.com> dsh(Open ERP) <>
Dharmesh Rathod <dra@tinyerp.com> <dharmesh247@gmail.com>
Dharmesh Rathod <dra@tinyerp.com> DRA Axelor <>
Dharmraj Jhala <dja@tinyerp.com> Dharmraj Jhala <dja@tinyerp.com>
Dharmraj Jhala <dja@tinyerp.com> <dizzy.zala@gmail.com> Dharmraj Jhala <dja@tinyerp.com> <dizzy.zala@gmail.com>
Dharmraj Jhala <dja@tinyerp.com> <dja@openerp.com> Dharmraj Jhala <dja@tinyerp.com> <dja@openerp.com>
@@ -320,6 +329,7 @@ Guewen Baconnier <guewen.baconnier@camptocamp.com> Guewen Baconnier <>
Guillem Barba <guillem@alcarrer.net> Guillem Barba <> Guillem Barba <guillem@alcarrer.net> Guillem Barba <>
Guillem Barba <guillem@alcarrer.net> guillem <> Guillem Barba <guillem@alcarrer.net> guillem <>
Guillermo Bisheimer <gbisheimer@bys-control.com.ar> Guillermo Bisheimer <gbisheimer@bys-control.com.ar>
Gulamfarid Ghanchi <ggh@tinyerp.com>
Géry Debongnie <ged@odoo.com> Géry Debongnie <ged@odoo.com>
Géry Debongnie <ged@odoo.com> <gde@openerp.com> Géry Debongnie <ged@odoo.com> <gde@openerp.com>
Géry Debongnie <ged@odoo.com> <ged@openerp.com> Géry Debongnie <ged@odoo.com> <ged@openerp.com>
@@ -330,6 +340,7 @@ Hardik Ansodariya <han@tinyerp.com> Hardik Ansodariya (OpenERP) <>
Hardik Ansodariya <han@tinyerp.com> Hardik Ansodariya <> Hardik Ansodariya <han@tinyerp.com> Hardik Ansodariya <>
Hardik R. Shamnani <hsa@tinyerp.com> Hardik R. Shamnani <hsa@tinyerp.com>
Hardik R. Shamnani <hsa@tinyerp.com> hsa-tinyerp <> Hardik R. Shamnani <hsa@tinyerp.com> hsa-tinyerp <>
Hardik Sanchawat <hsa@tinyerp.com> Hardik Sanchawat (OpenERP) <>
Harshad Modi <hmo@tinyerp.com> Harshad Modi <hmo@tinyerp.com>
Harshad Modi <hmo@tinyerp.com> HMO (Open ERP) <> Harshad Modi <hmo@tinyerp.com> HMO (Open ERP) <>
Harshad Modi <hmo@tinyerp.com> HMO(OpenERP) <> Harshad Modi <hmo@tinyerp.com> HMO(OpenERP) <>
@@ -345,6 +356,7 @@ Herbert Petersen <office@conexus.at> Conexus.at <>
Hiral Patel <hip@tinyerp.com> Hiral Patel <hip@tinyerp.com>
Hitesh Trivedi <htr@tinyerp.com> <htr@openerp.com> Hitesh Trivedi <htr@tinyerp.com> <htr@openerp.com>
Hugo Santos <hugo.santos@factorlibre.com> hugo <> Hugo Santos <hugo.santos@factorlibre.com> hugo <>
Hugo Santos <hugo.santos@factorlibre.com> hugosdsantos <hugosdsantos@gmail.com>
Humberto Arocha <hbto@vauxoo.com> hbto(humbertoarocha) <> Humberto Arocha <hbto@vauxoo.com> hbto(humbertoarocha) <>
Husen Daudi <hda@tinyerp.com> Husen Daudi <hda@tinyerp.com>
Husen Daudi <hda@tinyerp.com> <hda@hda-desktop> Husen Daudi <hda@tinyerp.com> <hda@hda-desktop>
@@ -352,6 +364,7 @@ Husen Daudi <hda@tinyerp.com> <hda@hda-laptop>
Husen Daudi <hda@tinyerp.com> <hda@hda> Husen Daudi <hda@tinyerp.com> <hda@hda>
Husen Daudi <hda@tinyerp.com> <husen@husen-laptop> Husen Daudi <hda@tinyerp.com> <husen@husen-laptop>
Husen Daudi <hda@tinyerp.com> JVO,HDA <> Husen Daudi <hda@tinyerp.com> JVO,HDA <>
Husen Daudi <hda@tinyerp.com> ashish <ashish@ashish-laptop>
Husen Daudi <hda@tinyerp.com> hda(Open ERP) <> Husen Daudi <hda@tinyerp.com> hda(Open ERP) <>
Husen Daudi <hda@tinyerp.com> hda@tinyerp.com <> Husen Daudi <hda@tinyerp.com> hda@tinyerp.com <>
Husen Daudi (Serpent CS) <husen.daudi@serpentcs.com> Husen Daudi (Serpent CS) <husen.daudi@serpentcs.com>
@@ -412,6 +425,10 @@ Jean-Baptiste Aubort <jean-baptiste.aubort@camptocamp.com> <jbaubort@wichside>
Jean-Christophe Vassort <jcv@openerp.com> Jean-Christophe Vassort <jcv@openerp.com>
Jean-Christophe Vassort <jcv@openerp.com> Jean-Christophe Vassort <jcv@openerp.com>
Jean-Sebastien Suzanne <jssuzanne@anybox.fr> Jean-Sebastien SUZANNE <> Jean-Sebastien Suzanne <jssuzanne@anybox.fr> Jean-Sebastien SUZANNE <>
Jenil Malavia <jma@tinyerp.com>
Jenil Malavia <jma@tinyerp.com> JMA(OpenEPR) <>
Jenil Malavia <jma@tinyerp.com> JMA(OpenERP) <>
Jenil Malavia <jma@tinyerp.com> Jenil(OpenERP) <>
Jeremy Kersten <jke@odoo.com> Jeremy Kersten <jke@odoo.com>
Jeremy Kersten <jke@odoo.com> <jke@openerp.com> Jeremy Kersten <jke@odoo.com> <jke@openerp.com>
Jeremy Kersten <jke@odoo.com> jke-openerp <> Jeremy Kersten <jke@odoo.com> jke-openerp <>
@@ -422,6 +439,7 @@ Jigar Amin <jam@tinyerp.com>
Jigar Amin <jam@tinyerp.com> <jam@openerp.com> Jigar Amin <jam@tinyerp.com> <jam@openerp.com>
Jigar Amin <jam@tinyerp.com> JAM (OpenERP) <> Jigar Amin <jam@tinyerp.com> JAM (OpenERP) <>
Jigar Amin <jam@tinyerp.com> JAM(OpenERP) <> Jigar Amin <jam@tinyerp.com> JAM(OpenERP) <>
Jigar Amin <jam@tinyerp.com> amami <>
Jigar Amin <jam@tinyerp.com> jam <> Jigar Amin <jam@tinyerp.com> jam <>
Jignesh Rathod <jir@tinyerp.com> Jignesh Rathod <jir@tinyerp.com>
Jignesh Rathod <jir@tinyerp.com> <jir@jir-desktop> Jignesh Rathod <jir@tinyerp.com> <jir@jir-desktop>
@@ -461,6 +479,9 @@ Kuldeep Joshi <kjo@tinyerp.com>
Kuldeep Joshi <kjo@tinyerp.com> <th_dev2@openerp.co.in> Kuldeep Joshi <kjo@tinyerp.com> <th_dev2@openerp.co.in>
Kuldeep Joshi <kjo@tinyerp.com> kjo <> Kuldeep Joshi <kjo@tinyerp.com> kjo <>
Kunal Chavda <kch@tinyerp.com> Kunal Chavda <kch@tinyerp.com>
Kunal Mathur <kum@tinyerp.com>
Kunal Mathur <kum@tinyerp.com> <kum@tinyerp.co.in>
Kunal Mathur <kum@tinyerp.com> KUM(OpenERP) <>
Laetitia Gangloff <laetitia.gangloff@acsone.eu> Laetitia Gangloff <laetitia.gangloff@acsone.eu>
Launchpad <codehost@crowberry> Launchpad <codehost@crowberry>
Launchpad <codehost@crowberry> Launchpad Translations on behalf of openerp <> Launchpad <codehost@crowberry> Launchpad Translations on behalf of openerp <>
@@ -497,6 +518,8 @@ Mantavya Gajjar <mga@tinyerp.com> <mga@tinyerp.co.in>
Mantavya Gajjar <mga@tinyerp.com> MGA(OpenERP) <> Mantavya Gajjar <mga@tinyerp.com> MGA(OpenERP) <>
Mantavya Gajjar <mga@tinyerp.com> Matvaya Gajjar(Openerp) <> Mantavya Gajjar <mga@tinyerp.com> Matvaya Gajjar(Openerp) <>
Mantavya Gajjar <mga@tinyerp.com> mga@tinyerp.com <> Mantavya Gajjar <mga@tinyerp.com> mga@tinyerp.com <>
Manuel Abadia <info@tiedra.net> Manu <>
Manuel Abadia <info@tiedra.net> Manu, Jigar Amin - OpenERP <>
Marcelo Hamra <marcelo.hamra@gmail.com> Marcelo Hamra <> Marcelo Hamra <marcelo.hamra@gmail.com> Marcelo Hamra <>
Marcelo Hamra <marcelo.hamra@gmail.com> marcelo <marcelo@hakuna> Marcelo Hamra <marcelo.hamra@gmail.com> marcelo <marcelo@hakuna>
Mario Arias Badila <the.clone.master@gmail.com> Mario Arias Badila <the.clone.master@gmail.com>
@@ -579,6 +602,7 @@ Nicolas Bessi <nicolas.bessi@camptocamp.com>
Nicolas Bessi <nicolas.bessi@camptocamp.com> Nicolas <> Nicolas Bessi <nicolas.bessi@camptocamp.com> Nicolas <>
Nicolas Bessi <nicolas.bessi@camptocamp.com> Nicolas Bessi(C2C) <> Nicolas Bessi <nicolas.bessi@camptocamp.com> Nicolas Bessi(C2C) <>
Nicolas Bessi <nicolas.bessi@camptocamp.com> nicolas.bessi@camptocamp.com <> Nicolas Bessi <nicolas.bessi@camptocamp.com> nicolas.bessi@camptocamp.com <>
Nicolas De Smet <zyphos@zyphos.be> Zyph0s <>
Nicolas Seinlet <nse@odoo.com> <nicolas@seinlet.com> Nicolas Seinlet <nse@odoo.com> <nicolas@seinlet.com>
Nicolas Vanhoren <niv@openerp.com> Nicolas Vanhoren <niv@openerp.com>
Nicolas Vanhoren <niv@openerp.com> <nicolas.vanhoren@openerp.com> Nicolas Vanhoren <niv@openerp.com> <nicolas.vanhoren@openerp.com>
@@ -592,6 +616,9 @@ Niels Huylebroeck <niels@bubbles-it.be> Niels Huylebroeck <>
Niels Huylebroeck <niels@bubbles-it.be> Niels(Red15) <> Niels Huylebroeck <niels@bubbles-it.be> Niels(Red15) <>
Niels Huylebroeck <niels@bubbles-it.be> Niels(Rrd15) <> Niels Huylebroeck <niels@bubbles-it.be> Niels(Rrd15) <>
Niels Huylebroeck <niels@bubbles-it.be> Red15 <> Niels Huylebroeck <niels@bubbles-it.be> Red15 <>
Nikunj Jani <jni@tinyerp.com>
Nikunj Jani <jni@tinyerp.com> <jni@tinyerp.co.in>
Nikunj Jani <jni@tinyerp.com> Reporting Team(JNI OpenERP) <>
Nimesh Contractor <nco@tinyerp.com> Nimesh Contractor <nco@tinyerp.com>
Oliver Laurent <olivier.laurent@acsone.eu> Oliver Laurent <olivier.laurent@acsone.eu>
Olivier Dony <odo@openerp.com> Olivier Dony <odo@openerp.com>
@@ -599,24 +626,33 @@ Olivier Dony <odo@openerp.com> <olinether@gmail.com>
Olivier Dony <odo@openerp.com> <olivier@Olivier-Donys-MacBook-Pro.local> Olivier Dony <odo@openerp.com> <olivier@Olivier-Donys-MacBook-Pro.local>
Olivier Dony <odo@openerp.com> Odowan Kenobi <> Olivier Dony <odo@openerp.com> Odowan Kenobi <>
Olivier Dony <odo@openerp.com> Olivier Dony <> Olivier Dony <odo@openerp.com> Olivier Dony <>
Olivier Dony <odo@openerp.com> Olvier Dony <> Olivier Dony <odo@openerp.com> Olivier Laurent, Olivier Dony <>
Olivier Dony <odo@openerp.com> OpenERP Framework R&D Team <> Olivier Dony <odo@openerp.com> OpenERP Framework R&D Team <>
Olivier Dony <odo@openerp.com> odo@tinyerp.com <> Olivier Dony <odo@openerp.com> odo@tinyerp.com <>
Olivier Dossmann <od@tempo-consulting.fr> Olivier DOSSMANN <olivier@tempo-laptop> Olivier Dossmann <od@tempo-consulting.fr> Olivier DOSSMANN <olivier@tempo-laptop>
Olivier Laurent <olt@odoo.com> Olivier Laurent <olt@odoo.com>
Olivier Laurent <olt@odoo.com> <olt@openerp.com> Olivier Laurent <olt@odoo.com> <olt@openerp.com>
Olivier Laurent <olt@odoo.com> <olt@tinyerp.com> Olivier Laurent <olt@odoo.com> <olt@tinyerp.com>
Olivier Laurent <olt@odoo.com> Olivier Laurent, Olivier Dony <>
Olivier Laurent <olt@odoo.com> olt at tinyerp <> Olivier Laurent <olt@odoo.com> olt at tinyerp <>
Olivier Laurent <olt@odoo.com> olt@tinyerp.com <> Olivier Laurent <olt@odoo.com> olt@tinyerp.com <>
Olivier Macchioni <olivier.macchioni@wingo.ch> <mac@Olivier-Macchionis-MacBook-Pro-2.local>
Omar Castiñeira Saavedra <omar@pexego.es> Omar Castiñeira Saavedra <omar@pexego.es>
Omar Castiñeira Saavedra <omar@pexego.es> Omar (Pexego) <> Omar Castiñeira Saavedra <omar@pexego.es> Omar (Pexego) <>
Omar Castiñeira Saavedra <omar@pexego.es> Omar <omar@pexego.es> Omar Castiñeira Saavedra <omar@pexego.es> Omar <omar@pexego.es>
Omar Castiñeira Saavedra <omar@pexego.es> Omar(Pexego),Anup(OpenERP) <> Omar Castiñeira Saavedra <omar@pexego.es> Omar(Pexego),Anup(OpenERP) <>
Omar Castiñeira Saavedra <omar@pexego.es> omar7r <> Omar Castiñeira Saavedra <omar@pexego.es> omar7r <>
Ostap Yakovenko <OstapYakovenko@users.noreply.github.com>
Pankaj Joshi <pji@tinyerp.com> Pankaj Joshi <pji@tinyerp.com>
Pankaj Joshi <pji@tinyerp.com> Pankaj Joshi <pji@openerp.com> Pankaj Joshi <pji@tinyerp.com> Pankaj Joshi <pji@openerp.com>
Pankita Shah <shp@tinyerp.com> Pankita Shah <shp@tinyerp.com>
Pankti Parikh <pap@tinyerp.com>
Pankti Parikh <pap@tinyerp.com> <pap@tinyerp.co.in>
Pankti Parikh <pap@tinyerp.com> PAP (Openerp) <>
Pankti Parikh <pap@tinyerp.com> PAP(OpenERP) <>
Pankti Parikh <pap@tinyerp.com> PAP(Openerp) <>
Pankti Parikh <pap@tinyerp.com> pap (OpenERP) <>
Pankti Parikh <pap@tinyerp.com> pap(openerp) <>
Pankti Parikh <pap@tinyerp.com> pap@tinyerp.com <>
Panos Christeas <xrg@openerp.com> Panos Christeas <xrg@openerp.com>
Panos Christeas <xrg@openerp.com> <p_chr...@hol.gr> Panos Christeas <xrg@openerp.com> <p_chr...@hol.gr>
Panos Christeas <xrg@openerp.com> <p_christ@hol.gr> Panos Christeas <xrg@openerp.com> <p_christ@hol.gr>
@@ -640,8 +676,10 @@ Pariket Trivedi <ptr@tinyerp.com> <trivedi.pariket@gmail.com>
Parth Gajjar <pga@tinyerp.com> Parth Gajjar <pga@tinyerp.com>
Parthiv Patel <parthiv@techreceptives.com> Parthiv Patel <parthiv@techreceptives.com>
Parthiv Patel <parthiv@techreceptives.com> <parthivgls@gmail.com> Parthiv Patel <parthiv@techreceptives.com> <parthivgls@gmail.com>
Patrick Monnerat <pm@datasphere.ch> Patrik <>
Patrick Thieuleux <patrick.thieuleux@groupes.be> Patrick Thieuleux <> Patrick Thieuleux <patrick.thieuleux@groupes.be> Patrick Thieuleux <>
Paul J Stevens <pjstevns@gmail.com> Paul J Stevens <> Paul J Stevens <pjstevns@gmail.com> Paul J Stevens <>
Paul Rad-Dupuy <signup@vivisci.com> vivisci <>
Paulius Sladkevičius <komsas@gmail.com> Paulius Sladkevičius <komsas@gmail.com>
Paulius Sladkevičius <komsas@gmail.com> Paulius Sladkevičius <paulius@hacbee.com> Paulius Sladkevičius <komsas@gmail.com> Paulius Sladkevičius <paulius@hacbee.com>
Paulius Sladkevičius <komsas@gmail.com> Paulius Sladkevičius <paulius@hbee.eu> Paulius Sladkevičius <komsas@gmail.com> Paulius Sladkevičius <paulius@hbee.eu>
@@ -654,6 +692,7 @@ Peter Langenberg <pl@agaplan.eu> Peter Langenberg <>
Philu <philubert@gmail.com> philubert@gmail.com <> Philu <philubert@gmail.com> philubert@gmail.com <>
Phong Nguyen <phong.nguyen_thanh@yahoo.com> <phongnt@phongnt-laptop> Phong Nguyen <phong.nguyen_thanh@yahoo.com> <phongnt@phongnt-laptop>
Phong Nguyen <phong.nguyen_thanh@yahoo.com> Phong Nguyen-Thanh <> Phong Nguyen <phong.nguyen_thanh@yahoo.com> Phong Nguyen-Thanh <>
Phuong Lu <phu@odoo.com> phu <>
Pinakin Nayi <pna@tinyerp.com> Pinakin Nayi <pna@tinyerp.com>
Pinakin Nayi <pna@tinyerp.com> <pna@openerp.com> Pinakin Nayi <pna@tinyerp.com> <pna@openerp.com>
Pinakin Nayi <pna@tinyerp.com> Pinakin Nai(OpenERP) <> Pinakin Nayi <pna@tinyerp.com> Pinakin Nai(OpenERP) <>
@@ -732,6 +771,10 @@ Ravi Gohil <rgo@tinyerp.com>
Ravi Gohil <rgo@tinyerp.com> <rgo@openerp.com> Ravi Gohil <rgo@tinyerp.com> <rgo@openerp.com>
Ravi Gohil <rgo@tinyerp.com> Ravi Gohil (OpenERP) <> Ravi Gohil <rgo@tinyerp.com> Ravi Gohil (OpenERP) <>
Ravi Gohil <rgo@tinyerp.com> rgo <> Ravi Gohil <rgo@tinyerp.com> rgo <>
Ravindra Mekhiya <rme@tinyerp.com>
Ravindra Mekhiya <rme@tinyerp.com> <rme@rme-desktop>
Ravindra Mekhiya <rme@tinyerp.com> RME(OpenERP) <>
Ravindra Mekhiya <rme@tinyerp.com> Ravindra Mekhiya (OpenERP) <>
Ravish Murari <rmu@tinyerp.com> Ravish Murari <rmu@tinyerp.com>
Ravish Murari <rmu@tinyerp.com> <rmu@openerp.com> Ravish Murari <rmu@tinyerp.com> <rmu@openerp.com>
Ravish Murari <rmu@tinyerp.com> Ravish(OpenERP) <> Ravish Murari <rmu@tinyerp.com> Ravish(OpenERP) <>
@@ -767,6 +810,11 @@ Rikenkumar Bhorania <rch@tinyerp.com> RCH(OpenERP). <>
Rikenkumar Bhorania <rch@tinyerp.com> rch (Open ERP) <> Rikenkumar Bhorania <rch@tinyerp.com> rch (Open ERP) <>
Rikenkumar Bhorania <rch@tinyerp.com> rch (OpenERP) <> Rikenkumar Bhorania <rch@tinyerp.com> rch (OpenERP) <>
Rikenkumar Bhorania <rch@tinyerp.com> rch(OpenERP) <> Rikenkumar Bhorania <rch@tinyerp.com> rch(OpenERP) <>
Rima Vora <rvo@tinyerp.com>
Rima Vora <rvo@tinyerp.com> <rvo@tinyerp.co.in>
Rima Vora <rvo@tinyerp.com> RVO <>
Rima Vora <rvo@tinyerp.com> RVO(OpenERP) <>
Rima Vora <rvo@tinyerp.com> Rvo(Open ERP) <>
Robert Sevcik <robajz@robajz.info> Robajz <> Robert Sevcik <robajz@robajz.info> Robajz <>
Roberto López López <rlo@openerp.com> Roberto López López <rlo@openerp.com>
Rohan Nayani <ron@tinyerp.com> Rohan Nayani <ron@tinyerp.com>
@@ -785,8 +833,23 @@ Rucha Patel <rpa@tinyerp.com> <ruchakpatel@gmail.com>
Rucha Patel <rpa@tinyerp.com> RPA(OpenERP) <> Rucha Patel <rpa@tinyerp.com> RPA(OpenERP) <>
Rucha Patel <rpa@tinyerp.com> rpa(Open ERP) <> Rucha Patel <rpa@tinyerp.com> rpa(Open ERP) <>
Rucha Patel <rpa@tinyerp.com> rpa-openerp <> Rucha Patel <rpa@tinyerp.com> rpa-openerp <>
Sabrina Romero <sabrina@vauxoo.com>
Saiyed Azadahmed <saz@tinyerp.com>
Saiyed Azadahmed <saz@tinyerp.com> <azaz.201186@gmail.com>
Saiyed Azadahmed <saz@tinyerp.com> SAZ (Open ERP) <>
Saiyed Azadahmed <saz@tinyerp.com> SAZ (OpenERP) <>
Saiyed Azadahmed <saz@tinyerp.com> SAZ (Opn ERP) <>
Saiyed Azadahmed <saz@tinyerp.com> SAZ (OprnERP) <>
Saiyed Azadahmed <saz@tinyerp.com> SAZ(OpenERP) <>
Saiyed Azadahmed <saz@tinyerp.com> SAz <>
Saiyed Azadahmed <saz@tinyerp.com> saz <>
Saiyed Azadahmed <saz@tinyerp.com> saz(OpenERP) <>
Saiyed Azadahmed <saz@tinyerp.com> saz(openerp) <>
Salvatore Trimarchi <salvatore@trigluu.com> Salvatore Trimarchi <salvatore@trigluu.com>
Salvi Angjeli <s_angjeli@yahoo.com> Salvi Angjeli <> Salvi Angjeli <s_angjeli@yahoo.com> Salvi Angjeli <>
Sananaz Mansuri <sma@tinyerp.com>
Sananaz Mansuri <sma@tinyerp.com> SMA(OpenERP) <>
Sananaz Mansuri <sma@tinyerp.com> sma@tinyerp.com <>
Sandy Carter <sandy.carter@savoirfairelinux.com> Sandy Carter <sandy.carter@savoirfairelinux.com>
Sandy Carter <sandy.carter@savoirfairelinux.com> <bwrsandman@gmail.com> Sandy Carter <sandy.carter@savoirfairelinux.com> <bwrsandman@gmail.com>
Sanjay Gohel <sgo@tinyerp.com> Sanjay Gohel <sgo@tinyerp.com>
@@ -818,6 +881,7 @@ Sheth Sunny <sus@tinyerp.com>
Sheth Sunny <sus@tinyerp.com> <sus@openerp.com> Sheth Sunny <sus@tinyerp.com> <sus@openerp.com>
Sheth Sunny <sus@tinyerp.com> <sus@sus-desktop> Sheth Sunny <sus@tinyerp.com> <sus@sus-desktop>
Sheth Sunny <sus@tinyerp.com> sus <tiny@tiny-desktop> Sheth Sunny <sus@tinyerp.com> sus <tiny@tiny-desktop>
Shyamli Singh <ssi@tinyerp.com>
Simon Lejeune <sle@openerp.com> Simon Lejeune <sle@openerp.com>
Simon Lejeune <sle@openerp.com> <openerp-sle@openerp-sle.home> Simon Lejeune <sle@openerp.com> <openerp-sle@openerp-sle.home>
Simone Orsi <simahawk@gmail.com> Simone Orsi <simahawk@gmail.com>
@@ -897,6 +961,11 @@ Ujjvala Collins <uco@tinyerp.com> uco(OpenERP) <>
Vadim Chobanu <enquiries@enapps.co.uk> Vadim - SmartMode LTD <> Vadim Chobanu <enquiries@enapps.co.uk> Vadim - SmartMode LTD <>
Vaibhav Darji <vda@tinyerp.com> Vaibhav Darji <vda@tinyerp.com>
Vaibhav Darji <vda@tinyerp.com> <vdavda@tinyerp.com> Vaibhav Darji <vda@tinyerp.com> <vdavda@tinyerp.com>
Vaishali Thakkar <vth@tinyerp.com>
Vaishali Thakkar <vth@tinyerp.com> VTH(OpenERP) <>
Valencia Rodrigues <vro@tinyerp.com>
Valencia Rodrigues <vro@tinyerp.com> VRO(OpenERP) <>
Vee <vitridex@gmail.com> vitridex <>
Vianney da Costa <vianney.dacosta@akretion.com.br> Vianney da Costa <vianney.dacosta@akretion.com.br>
Vianney da Costa <vianney.dacosta@akretion.com.br> Vianney - www.akretion.com.br <> Vianney da Costa <vianney.dacosta@akretion.com.br> Vianney - www.akretion.com.br <>
Vianney da Costa <vianney.dacosta@akretion.com.br> Vianney,Anup(OpenERP) <> Vianney da Costa <vianney.dacosta@akretion.com.br> Vianney,Anup(OpenERP) <>
@@ -941,6 +1010,9 @@ Xavier Morel <xmo@odoo.com> <xmo@tinyerp.com>
Xavier Morel <xmo@odoo.com> Xavier Morel <> Xavier Morel <xmo@odoo.com> Xavier Morel <>
Xavier Morel <xmo@odoo.com> Xavier(OpenERP) <> Xavier Morel <xmo@odoo.com> Xavier(OpenERP) <>
Xavier Morel <xmo@odoo.com> xmo <> Xavier Morel <xmo@odoo.com> xmo <>
Yajushi Yagnik <yya@tinyerp.com>
Yajushi Yagnik <yya@tinyerp.com> YYA(Axelor) <>
Yajushi Yagnik <yya@tinyerp.com> YYA(OpenERP) <>
Yann Papouin <yann.papouin@gmail.com> Yann Papouin <yann.papouin@gmail.com>
Yann Papouin <yann.papouin@gmail.com> Yann Papouin <> Yann Papouin <yann.papouin@gmail.com> Yann Papouin <>
Yann Papouin <yann.papouin@gmail.com> Yann papouin <> Yann Papouin <yann.papouin@gmail.com> Yann papouin <>
@@ -950,6 +1022,7 @@ Yannick Vaucher <yannick.vaucher@camptocamp.com> Yannick Vaucher <>
Yannick Vaucher <yannick.vaucher@camptocamp.com> Yannick Vaucher <yvaucher@camptocamp.com> Yannick Vaucher <yannick.vaucher@camptocamp.com> Yannick Vaucher <yvaucher@camptocamp.com>
Yannick Vaucher <yannick.vaucher@camptocamp.com> Yannick Vaucher@Camptocamp <> Yannick Vaucher <yannick.vaucher@camptocamp.com> Yannick Vaucher@Camptocamp <>
Yogesh Parekh <ypa@tinyerp.com> Yogesh Parekh <ypa@tinyerp.com>
Yogesh Parekh <ypa@tinyerp.com> <yogeshparekh1988@gmail.com>
Yogesh Parekh <ypa@tinyerp.com> <ypa@openerp.com> Yogesh Parekh <ypa@tinyerp.com> <ypa@openerp.com>
Yogesh Sakhreliya <ysa@tinyerp.com> Yogesh Sakhreliya <ysa@tinyerp.com>
Yogesh Sakhreliya <ysa@tinyerp.com> <ysa-openerp@ysa-openerp> Yogesh Sakhreliya <ysa@tinyerp.com> <ysa-openerp@ysa-openerp>
@@ -968,63 +1041,12 @@ Yury Tello <ytello@cubicerp.com>
Yury Tello <ytello@cubicerp.com> <info@cubicerp.com> Yury Tello <ytello@cubicerp.com> <info@cubicerp.com>
_FIXME ajm <ajm@tinyerp.com> _FIXME ajm <ajm@tinyerp.com>
_FIXME ajm <ajm@tinyerp.com> AJM (OpenERP) <> _FIXME ajm <ajm@tinyerp.com> AJM (OpenERP) <>
_FIXME bch <bch@tinyerp.com> bch <>
_FIXME ggh <ggh@tinyerp.com>
_FIXME jma <jma@tinyerp.com>
_FIXME jma <jma@tinyerp.com> JMA(OpenEPR) <>
_FIXME jma <jma@tinyerp.com> JMA(OpenERP) <>
_FIXME jni <jni@tinyerp.com>
_FIXME jni <jni@tinyerp.com> <jni@tinyerp.co.in>
_FIXME jni <jni@tinyerp.com> Reporting Team(JNI OpenERP) <>
_FIXME kum <kum@tinyerp.com>
_FIXME kum <kum@tinyerp.com> <kum@tinyerp.co.in>
_FIXME kum <kum@tinyerp.com> KUM(OpenERP) <>
_FIXME pap <pap@tinyerp.com>
_FIXME pap <pap@tinyerp.com> <pap@tinyerp.co.in>
_FIXME pap <pap@tinyerp.com> PAP (Openerp) <>
_FIXME pap <pap@tinyerp.com> PAP(OpenERP) <>
_FIXME pap <pap@tinyerp.com> PAP(Openerp) <>
_FIXME pap <pap@tinyerp.com> pap (OpenERP) <>
_FIXME pap <pap@tinyerp.com> pap(openerp) <>
_FIXME pap <pap@tinyerp.com> pap@tinyerp.com <>
_FIXME rde <rde@tinyerp.com> rde <> _FIXME rde <rde@tinyerp.com> rde <>
_FIXME rme <rme@tinyerp.com>
_FIXME rme <rme@tinyerp.com> <rme@rme-desktop>
_FIXME rme <rme@tinyerp.com> RME(OpenERP) <>
_FIXME rvo <rvo@tinyerp.com>
_FIXME rvo <rvo@tinyerp.com> <rvo@tinyerp.co.in>
_FIXME rvo <rvo@tinyerp.com> RVO <>
_FIXME rvo <rvo@tinyerp.com> RVO(OpenERP) <>
_FIXME rvo <rvo@tinyerp.com> Rvo(Open ERP) <>
_FIXME saz <saz@tinyerp.com>
_FIXME saz <saz@tinyerp.com> <azaz.201186@gmail.com>
_FIXME saz <saz@tinyerp.com> SAZ (Open ERP) <>
_FIXME saz <saz@tinyerp.com> SAZ (OpenERP) <>
_FIXME saz <saz@tinyerp.com> SAZ (Opn ERP) <>
_FIXME saz <saz@tinyerp.com> SAZ (OprnERP) <>
_FIXME saz <saz@tinyerp.com> SAZ(OpenERP) <>
_FIXME saz <saz@tinyerp.com> SAz <>
_FIXME saz <saz@tinyerp.com> saz <>
_FIXME saz <saz@tinyerp.com> saz(OpenERP) <>
_FIXME saz <saz@tinyerp.com> saz(openerp) <>
_FIXME sma <sma@tinyerp.com>
_FIXME sma <sma@tinyerp.com> SMA(OpenERP) <>
_FIXME sma <sma@tinyerp.com> sma@tinyerp.com <>
_FIXME sme <sme@tinyerp.com> _FIXME sme <sme@tinyerp.com>
_FIXME sme <sme@tinyerp.com> SME(OpenERP) <> _FIXME sme <sme@tinyerp.com> SME(OpenERP) <>
_FIXME sme <sme@tinyerp.com> SME(Tiny/Axelor) <> _FIXME sme <sme@tinyerp.com> SME(Tiny/Axelor) <>
_FIXME sme <sme@tinyerp.com> SME(tiny/Axelor) <> _FIXME sme <sme@tinyerp.com> SME(tiny/Axelor) <>
_FIXME sme <sme@tinyerp.com> sme <> _FIXME sme <sme@tinyerp.com> sme <>
_FIXME ssi <ssi@tinyerp.com>
_FIXME vro <vro@tinyerp.com>
_FIXME vro <vro@tinyerp.com> VRO(OpenERP) <>
_FIXME vth <vth@tinyerp.com>
_FIXME vth <vth@tinyerp.com> VTH(OpenERP) <>
_FIXME yya <eda@tinyerp.com>
_FIXME yya <eda@tinyerp.com> EDA(Axelor) <>
_FIXME yya <yya@tinyerp.com>
_FIXME yya <yya@tinyerp.com> YYA(Axelor) <>
_FIXME yya <yya@tinyerp.com> YYA(OpenERP) <>
__FIXME bhumi <bhumi@tinyerp.com> <bhumi195@gmail.com> __FIXME bhumi <bhumi@tinyerp.com> <bhumi195@gmail.com>
__FIXME tiny <tiny@tinyerp.com> __FIXME tiny <tiny@tinyerp.com>
__FIXME tiny <tiny@tinyerp.com> <tiny@tiny-desktop> __FIXME tiny <tiny@tinyerp.com> <tiny@tiny-desktop>
@@ -1032,25 +1054,22 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# TODO INTERNAL # TODO INTERNAL
# 2 AVP(Axelor) <>
# 1 DRA(Axelor) <>
# 1 avp <openerp@openerp-laptop>
# 2 Priyanka Jani(OpenERP Trainee) <> # 2 Priyanka Jani(OpenERP Trainee) <>
# 2 Hardik Sanchawat (OpenERP) <>
# 2 Jenil(OpenERP) <>
# 1 Dhruvit Darji(OpenERP Trainee) <> # 1 Dhruvit Darji(OpenERP Trainee) <>
# 1 Ravindra Mekhiya (OpenERP) <>
# 1 Yogesh Parekh (OpenERP Trainee) <yogeshparekh1988@gmail.com>
# 1 Nikita Parmar (OpenERP Trainee) <nikky.nikita89@gmail.com> # 1 Nikita Parmar (OpenERP Trainee) <nikky.nikita89@gmail.com>
# 1 Sejal Bhut (OpenERP Trainee) <sejalpatel125@gmail.com> # 1 Sejal Bhut (OpenERP Trainee) <sejalpatel125@gmail.com>
# 1 Amit (Open ERP) <>
# 1 phu <>
# 1 vba <> # 1 vba <>
# TODO INTERNAL Conflict
# 1 Amit (Open ERP) <>
# 1 Ajay Patel <apa@openerp.com> # 1 Ajay Patel <apa@openerp.com>
# 1 Yogesh(Open ERP) <> # 1 Yogesh(Open ERP) <>
# 1 Yogesh(OpenERP) <> # 1 Yogesh(OpenERP) <>
# 1 Chirag <chirag@chirag-desktop> # 1 Chirag <chirag@chirag-desktop>
# TODO INTERNAL Couples
# 1 ACH,Jay <> # 1 ACH,Jay <>
# 2 JMA,VRA <> # 2 JMA,VRA <>
# 2 Vir,Amp <> # 2 Vir,Amp <>
@@ -1088,6 +1107,8 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 Olivier Dony, Jay Vora <> # 1 Olivier Dony, Jay Vora <>
# 1 Christophe Simonis, Olivier Dony <> # 1 Christophe Simonis, Olivier Dony <>
# TODO INTERNAL Team Leaders
# 2 Framework Team <> # 2 Framework Team <>
# 2 OpenERP R&D Framework Team <> # 2 OpenERP R&D Framework Team <>
# 2 Quality Team <> # 2 Quality Team <>
@@ -1095,6 +1116,8 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 Mod2 Team(OpenERP) <> # 1 Mod2 Team(OpenERP) <>
# 1 OnDemand Open Object User <odoo@saas> # 1 OnDemand Open Object User <odoo@saas>
# TODO INTERNAL Leading Space
# 1 Amit Dodiya (OpenERP) <> # 1 Amit Dodiya (OpenERP) <>
# 1 Amit Dodiya(OpenERP) <> # 1 Amit Dodiya(OpenERP) <>
# 1 Jean-Christophe VASSORT <> # 1 Jean-Christophe VASSORT <>
@@ -1108,7 +1131,6 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 2 jkei <jerome.keirse@gmail.com> # 2 jkei <jerome.keirse@gmail.com>
# 2 richierichrawr <richierichrawr@users.noreply.github.com> # 2 richierichrawr <richierichrawr@users.noreply.github.com>
# 2 watermelonjuice <watermelonjuice@users.noreply.github.com> # 2 watermelonjuice <watermelonjuice@users.noreply.github.com>
# 1 vrenaville <vincent.renaville@camptocamp.com>
# 2 youring <youring@gmail.com> # 2 youring <youring@gmail.com>
# 2 Дмитро Катюха <Dmytro.Katyukha@jbm.com.ua> # 2 Дмитро Катюха <Dmytro.Katyukha@jbm.com.ua>
# 1 jbeficent <jordi.ballester@eficent.com> # 1 jbeficent <jordi.ballester@eficent.com>
@@ -1117,9 +1139,7 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 jmustonen <jmusto@gmail.com> # 1 jmustonen <jmusto@gmail.com>
# 1 celm1990 <celm1990@hotmail.com> # 1 celm1990 <celm1990@hotmail.com>
# 1 cysnake4713 <cysnake4713@gmail.com> # 1 cysnake4713 <cysnake4713@gmail.com>
# 1 dharmesh rathod <dharmesh247@gmail.com>
# 1 driou <a.bourroux@gmail.com> # 1 driou <a.bourroux@gmail.com>
# 1 dsabrinarg <sabrina@vauxoo.com>
# 1 eneldoserrata <eneldoserrata@gmail.com> # 1 eneldoserrata <eneldoserrata@gmail.com>
# 1 fdesmottes <fdesmottes@nuxly.com> # 1 fdesmottes <fdesmottes@nuxly.com>
# 1 g.shipilov <g.shipilov@it1> # 1 g.shipilov <g.shipilov@it1>
@@ -1127,38 +1147,25 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 senthilnathang <bornspy@gmail.com> # 1 senthilnathang <bornspy@gmail.com>
# 1 the-digital-engineer <the-digital-engineer@users.noreply.github.com> # 1 the-digital-engineer <the-digital-engineer@users.noreply.github.com>
# 1 yingliu4203 <yingliu4203@gmail.com> # 1 yingliu4203 <yingliu4203@gmail.com>
# 1 hugosdsantos <hugosdsantos@gmail.com>
# 1 krnkris <krnkris@users.noreply.github.com> # 1 krnkris <krnkris@users.noreply.github.com>
# 1 buke <wangbuke@gmail.com> # 1 buke <wangbuke@gmail.com>
# 1 OstapYakovenko <OstapYakovenko@users.noreply.github.com>
# 1 DEEP SILVER ACCESSORY <fordeep@hotmail.com> # 1 DEEP SILVER ACCESSORY <fordeep@hotmail.com>
# 1 neps1192 <neps1192@gmail.com> # 1 neps1192 <neps1192@gmail.com>
# 1 ALIANE Abdelouahab <abdelouahab_al@yahoo.fr>
# 1 Invitu <contact@invitu.com> # 1 Invitu <contact@invitu.com>
# 1 Jorge <jcamacho@trey.es> # 1 Jorge <jcamacho@trey.es>
# 1 Maria G <mariagr@europeanstonetile.com> # 1 Maria G <mariagr@europeanstonetile.com>
# 1 Mack <mackz@sina.com> # 1 Mack <mackz@sina.com>
# TODO MISSING INFO # TODO MISSING INFO EMAIL
# 1 Olivier Macchioni <mac@Olivier-Macchionis-MacBook-Pro-2.local>
# Email not found
# 2 Denis Seleznyov <> # 2 Denis Seleznyov <>
# Email not found
# 1 openerp user <openerp@openerp6desktop> # 1 openerp user <openerp@openerp6desktop>
# Name: Milan Tribuson # Name: Milan Tribuson
# email not found
# 1 Manu, Jigar Amin - OpenERP <>
# 1 Ferchu <>
# 1 Patrik <>
# 1 R.Messier <> # 1 R.Messier <>
# 1 Manu <> # Name: Raphael Messier
# 1 Zyph0s <>
# 1 amami <> # 1 Ferchu <>
# 1 vitridex <> # Launchpad: https://launchpad.net/~fgb
# 1 vivisci <>
# 1 ashish <ashish@ashish-laptop>
+1 -1
View File
@@ -17,6 +17,7 @@ recursive-include openerp *.rng
recursive-include openerp *.rst recursive-include openerp *.rst
recursive-include openerp *.sass recursive-include openerp *.sass
recursive-include openerp *.sql recursive-include openerp *.sql
recursive-include openerp *.template
recursive-include openerp *.txt recursive-include openerp *.txt
recursive-include openerp *.ttf recursive-include openerp *.ttf
recursive-include openerp *.woff recursive-include openerp *.woff
@@ -25,4 +26,3 @@ recursive-include openerp *.xml
recursive-include openerp *.yml recursive-include openerp *.yml
recursive-exclude * *.py[co] recursive-exclude * *.py[co]
recursive-exclude * *.hg* recursive-exclude * *.hg*
graft openerp/cli/templates
+2 -2
View File
@@ -397,8 +397,8 @@ class payment_line(osv.osv):
break break
return {'value': data} return {'value': data}
def fields_get(self, cr, uid, fields=None, context=None): def fields_get(self, cr, uid, fields=None, context=None, write_access=True, attributes=None):
res = super(payment_line, self).fields_get(cr, uid, fields, context) res = super(payment_line, self).fields_get(cr, uid, fields, context, write_access, attributes)
if 'communication2' in res: if 'communication2' in res:
res['communication2'].setdefault('states', {}) res['communication2'].setdefault('states', {})
res['communication2']['states']['structured'] = [('readonly', True)] res['communication2']['states']['structured'] = [('readonly', True)]
+2 -2
View File
@@ -105,7 +105,7 @@ class CompanyLDAP(osv.osv):
if results and len(results) == 1: if results and len(results) == 1:
dn = results[0][0] dn = results[0][0]
conn = self.connect(conf) conn = self.connect(conf)
conn.simple_bind_s(dn, password) conn.simple_bind_s(dn, password.encode('utf-8'))
conn.unbind() conn.unbind()
entry = results[0] entry = results[0]
except ldap.INVALID_CREDENTIALS: except ldap.INVALID_CREDENTIALS:
@@ -141,7 +141,7 @@ class CompanyLDAP(osv.osv):
try: try:
conn = self.connect(conf) conn = self.connect(conf)
conn.simple_bind_s(conf['ldap_binddn'] or '', conn.simple_bind_s(conf['ldap_binddn'] or '',
conf['ldap_password'] or '') conf['ldap_password'].encode('utf-8') or '')
results = conn.search_st(conf['ldap_base'], ldap.SCOPE_SUBTREE, results = conn.search_st(conf['ldap_base'], ldap.SCOPE_SUBTREE,
filter, retrieve_attributes, timeout=60) filter, retrieve_attributes, timeout=60)
conn.unbind() conn.unbind()
@@ -281,7 +281,8 @@ class account_analytic_line(osv.osv):
details.append("%s" % (line['unit_amount'], )) details.append("%s" % (line['unit_amount'], ))
if data.get('name', False): if data.get('name', False):
details.append(line['name']) details.append(line['name'])
note.append(u' - '.join(map(lambda x: unicode(x) or '',details))) if details:
note.append(u' - '.join(map(lambda x: unicode(x) or '',details)))
if note: if note:
curr_line['name'] += "\n" + ("\n".join(map(lambda x: unicode(x) or '',note))) curr_line['name'] += "\n" + ("\n".join(map(lambda x: unicode(x) or '',note)))
invoice_line_obj.create(cr, uid, curr_line, context=context) invoice_line_obj.create(cr, uid, curr_line, context=context)
+4 -2
View File
@@ -26,7 +26,9 @@ class procurement_order(osv.osv):
_inherit = "procurement.order" _inherit = "procurement.order"
def create(self, cr, uid, vals, context=None): def create(self, cr, uid, vals, context=None):
context = context or {}
procurement_id = super(procurement_order, self).create(cr, uid, vals, context=context) procurement_id = super(procurement_order, self).create(cr, uid, vals, context=context)
self.run(cr, uid, [procurement_id], context=context) if not context.get('procurement_autorun_defer'):
self.check(cr, uid, [procurement_id], context=context) self.run(cr, uid, [procurement_id], context=context)
self.check(cr, uid, [procurement_id], context=context)
return procurement_id return procurement_id
-1
View File
@@ -186,7 +186,6 @@ FaceTime HD Camera, 1.2 MP Photos</field>
<field name="type">consu</field> <field name="type">consu</field>
<field name="uom_id" ref="product_uom_unit"/> <field name="uom_id" ref="product_uom_unit"/>
<field name="uom_po_id" ref="product_uom_unit"/> <field name="uom_po_id" ref="product_uom_unit"/>
<field name="description">Custom computer assembled on order based on customer's requirement.</field>
<field name="description_sale">Bose's smallest portable Bluetooth speaker</field> <field name="description_sale">Bose's smallest portable Bluetooth speaker</field>
<field name="default_code">B3423</field> <field name="default_code">B3423</field>
</record> </record>
+12 -5
View File
@@ -197,6 +197,13 @@ class purchase_order(osv.osv):
('done', 'Done'), ('done', 'Done'),
('cancel', 'Cancelled') ('cancel', 'Cancelled')
] ]
READONLY_STATES = {
'confirmed': [('readonly', True)],
'approved': [('readonly', True)],
'done': [('readonly', True)]
}
_track = { _track = {
'state': { 'state': {
'purchase.mt_rfq_confirmed': lambda self, cr, uid, obj, ctx=None: obj.state == 'confirmed', 'purchase.mt_rfq_confirmed': lambda self, cr, uid, obj, ctx=None: obj.state == 'confirmed',
@@ -225,16 +232,16 @@ class purchase_order(osv.osv):
copy=False), copy=False),
'date_approve':fields.date('Date Approved', readonly=1, select=True, copy=False, 'date_approve':fields.date('Date Approved', readonly=1, select=True, copy=False,
help="Date on which purchase order has been approved"), help="Date on which purchase order has been approved"),
'partner_id':fields.many2one('res.partner', 'Supplier', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, states=READONLY_STATES,
change_default=True, track_visibility='always'), change_default=True, track_visibility='always'),
'dest_address_id':fields.many2one('res.partner', 'Customer Address (Direct Delivery)', 'dest_address_id':fields.many2one('res.partner', 'Customer Address (Direct Delivery)',
states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, states=READONLY_STATES,
help="Put an address if you want to deliver directly from the supplier to the customer. " \ help="Put an address if you want to deliver directly from the supplier to the customer. " \
"Otherwise, keep empty to deliver to your own company." "Otherwise, keep empty to deliver to your own company."
), ),
'location_id': fields.many2one('stock.location', 'Destination', required=True, domain=[('usage','<>','view')], states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]} ), 'location_id': fields.many2one('stock.location', 'Destination', required=True, domain=[('usage','<>','view')], states=READONLY_STATES),
'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states={'confirmed':[('readonly',True)], 'approved':[('readonly',True)],'done':[('readonly',True)]}, help="The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities."), 'pricelist_id':fields.many2one('product.pricelist', 'Pricelist', required=True, states=READONLY_STATES, help="The pricelist sets the currency used for this purchase order. It also computes the supplier price for the selected products/quantities."),
'currency_id': fields.many2one('res.currency','Currency', readonly=True, required=True,states={'draft': [('readonly', False)],'sent': [('readonly', False)]}), 'currency_id': fields.many2one('res.currency','Currency', required=True, states=READONLY_STATES),
'state': fields.selection(STATE_SELECTION, 'Status', readonly=True, 'state': fields.selection(STATE_SELECTION, 'Status', readonly=True,
help="The status of the purchase order or the quotation request. " help="The status of the purchase order or the quotation request. "
"A request for quotation is a purchase order in a 'Draft' status. " "A request for quotation is a purchase order in a 'Draft' status. "
@@ -173,6 +173,7 @@ class purchase_requisition(osv.osv):
'order_id': purchase_id, 'order_id': purchase_id,
'product_id': product.id, 'product_id': product.id,
'account_analytic_id': requisition_line.account_analytic_id.id, 'account_analytic_id': requisition_line.account_analytic_id.id,
'taxes_id': [(6, 0, vals.get('taxes_ids', []))],
}) })
return vals return vals
+4 -2
View File
@@ -690,7 +690,7 @@ class sale_order(osv.osv):
:return: True :return: True
""" """
context = dict(context) context = context or {}
context['lang'] = self.pool['res.users'].browse(cr, uid, uid).lang context['lang'] = self.pool['res.users'].browse(cr, uid, uid).lang
procurement_obj = self.pool.get('procurement.order') procurement_obj = self.pool.get('procurement.order')
sale_line_obj = self.pool.get('sale.order.line') sale_line_obj = self.pool.get('sale.order.line')
@@ -714,7 +714,9 @@ class sale_order(osv.osv):
if (line.state == 'done') or not line.product_id: if (line.state == 'done') or not line.product_id:
continue continue
vals = self._prepare_order_line_procurement(cr, uid, order, line, group_id=order.procurement_group_id.id, context=context) vals = self._prepare_order_line_procurement(cr, uid, order, line, group_id=order.procurement_group_id.id, context=context)
proc_id = procurement_obj.create(cr, uid, vals, context=context) ctx = context.copy()
ctx['procurement_autorun_defer'] = True
proc_id = procurement_obj.create(cr, uid, vals, context=ctx)
proc_ids.append(proc_id) proc_ids.append(proc_id)
#Confirm procurement order such that rules will be applied on it #Confirm procurement order such that rules will be applied on it
#note that the workflow normally ensure proc_ids isn't an empty list #note that the workflow normally ensure proc_ids isn't an empty list
+1 -1
View File
@@ -40,7 +40,7 @@
<record id="mt_order_confirmed" model="mail.message.subtype"> <record id="mt_order_confirmed" model="mail.message.subtype">
<field name="name">Sales Order Confirmed</field> <field name="name">Sales Order Confirmed</field>
<field name="res_model">sale.order</field> <field name="res_model">sale.order</field>
<field name="default" eval="True"/> <field name="default" eval="False"/>
<field name="description">Quotation confirmed</field> <field name="description">Quotation confirmed</field>
</record> </record>
+81 -49
View File
@@ -94,11 +94,29 @@ class product_product(osv.osv):
operator = context.get('compute_child', True) and 'child_of' or 'in' operator = context.get('compute_child', True) and 'child_of' or 'in'
domain = context.get('force_company', False) and ['&', ('company_id', '=', context['force_company'])] or [] domain = context.get('force_company', False) and ['&', ('company_id', '=', context['force_company'])] or []
return ( locations = location_obj.browse(cr, uid, location_ids, context=context)
domain + [('location_id', operator, location_ids)], if operator == "child_of" and locations and locations[0].parent_left != 0:
domain + ['&', ('location_dest_id', operator, location_ids), '!', ('location_id', operator, location_ids)], loc_domain = []
domain + ['&', ('location_id', operator, location_ids), '!', ('location_dest_id', operator, location_ids)] dest_loc_domain = []
) for loc in locations:
if loc_domain:
loc_domain = ['|'] + loc_domain + ['&', ('location_id.parent_left', '>=', loc.parent_left), ('location_id.parent_left', '<', loc.parent_right)]
dest_loc_domain = ['|'] + dest_loc_domain + ['&', ('location_dest_id.parent_left', '>=', loc.parent_left), ('location_dest_id.parent_left', '<', loc.parent_right)]
else:
loc_domain += ['&', ('location_id.parent_left', '>=', loc.parent_left), ('location_id.parent_left', '<', loc.parent_right)]
dest_loc_domain += ['&', ('location_dest_id.parent_left', '>=', loc.parent_left), ('location_dest_id.parent_left', '<', loc.parent_right)]
return (
domain + loc_domain,
domain + ['&'] + dest_loc_domain + ['!'] + loc_domain,
domain + ['&'] + loc_domain + ['!'] + dest_loc_domain
)
else:
return (
domain + [('location_id', operator, location_ids)],
domain + ['&', ('location_dest_id', operator, location_ids), '!', ('location_id', operator, location_ids)],
domain + ['&', ('location_id', operator, location_ids), '!', ('location_dest_id', operator, location_ids)]
)
def _get_domain_dates(self, cr, uid, ids, context): def _get_domain_dates(self, cr, uid, ids, context):
from_date = context.get('from_date', False) from_date = context.get('from_date', False)
@@ -115,7 +133,8 @@ class product_product(osv.osv):
field_names = field_names or [] field_names = field_names or []
domain_products = [('product_id', 'in', ids)] domain_products = [('product_id', 'in', ids)]
domain_quant, domain_move_in, domain_move_out = self._get_domain_locations(cr, uid, ids, context=context) domain_quant, domain_move_in, domain_move_out = [], [], []
domain_quant_loc, domain_move_in_loc, domain_move_out_loc = self._get_domain_locations(cr, uid, ids, context=context)
domain_move_in += self._get_domain_dates(cr, uid, ids, context=context) + [('state', 'not in', ('done', 'cancel', 'draft'))] + domain_products domain_move_in += self._get_domain_dates(cr, uid, ids, context=context) + [('state', 'not in', ('done', 'cancel', 'draft'))] + domain_products
domain_move_out += self._get_domain_dates(cr, uid, ids, context=context) + [('state', 'not in', ('done', 'cancel', 'draft'))] + domain_products domain_move_out += self._get_domain_dates(cr, uid, ids, context=context) + [('state', 'not in', ('done', 'cancel', 'draft'))] + domain_products
domain_quant += domain_products domain_quant += domain_products
@@ -129,9 +148,12 @@ class product_product(osv.osv):
moves_in = [] moves_in = []
moves_out = [] moves_out = []
else: else:
domain_move_in += domain_move_in_loc
domain_move_out += domain_move_out_loc
moves_in = self.pool.get('stock.move').read_group(cr, uid, domain_move_in, ['product_id', 'product_qty'], ['product_id'], context=context) moves_in = self.pool.get('stock.move').read_group(cr, uid, domain_move_in, ['product_id', 'product_qty'], ['product_id'], context=context)
moves_out = self.pool.get('stock.move').read_group(cr, uid, domain_move_out, ['product_id', 'product_qty'], ['product_id'], context=context) moves_out = self.pool.get('stock.move').read_group(cr, uid, domain_move_out, ['product_id', 'product_qty'], ['product_id'], context=context)
domain_quant += domain_quant_loc
quants = self.pool.get('stock.quant').read_group(cr, uid, domain_quant, ['product_id', 'qty'], ['product_id'], context=context) quants = self.pool.get('stock.quant').read_group(cr, uid, domain_quant, ['product_id', 'qty'], ['product_id'], context=context)
quants = dict(map(lambda x: (x['product_id'][0], x['qty']), quants)) quants = dict(map(lambda x: (x['product_id'][0], x['qty']), quants))
@@ -163,17 +185,33 @@ class product_product(osv.osv):
if operator == '=': if operator == '=':
operator = '==' operator = '=='
product_ids = self.search(cr, uid, [], context=context)
ids = [] ids = []
if product_ids: if name == 'qty_available':
#TODO: use a query instead of this browse record which is probably making the too much requests, but don't forget res.append(('id', 'in', self._search_qty_available(cr, uid, operator, value, context)))
#the context that can be set with a location, an owner... else:
for element in self.browse(cr, uid, product_ids, context=context): product_ids = self.search(cr, uid, [], context=context)
if eval(str(element[field]) + operator + str(value)): if product_ids:
ids.append(element.id) #TODO: Still optimization possible when searching virtual quantities
res.append(('id', 'in', ids)) for element in self.browse(cr, uid, product_ids, context=context):
if eval(str(element[field]) + operator + str(value)):
ids.append(element.id)
res.append(('id', 'in', ids))
return res return res
def _search_qty_available(self, cr, uid, operator, value, context):
domain_quant = []
if context.get('lot_id'):
domain_quant.append(('lot_id', '=', context['lot_id']))
if context.get('owner_id'):
domain_quant.append(('owner_id', '=', context['owner_id']))
if context.get('package_id'):
domain_quant.append(('package_id', '=', context['package_id']))
domain_quant += self._get_domain_locations(cr, uid, [], context=context)[0]
quants = self.pool.get('stock.quant').read_group(cr, uid, domain_quant, ['product_id', 'qty'], ['product_id'], context=context)
quants = dict(map(lambda x: (x['product_id'][0], x['qty']), quants))
quants = dict((k, v) for k, v in quants.iteritems() if eval(str(v) + operator + str(value)))
return(list(quants))
def _product_available_text(self, cr, uid, ids, field_names=None, arg=False, context=None): def _product_available_text(self, cr, uid, ids, field_names=None, arg=False, context=None):
res = {} res = {}
for product in self.browse(cr, uid, ids, context=context): for product in self.browse(cr, uid, ids, context=context):
@@ -294,41 +332,35 @@ class product_template(osv.osv):
_inherit = 'product.template' _inherit = 'product.template'
def _product_available(self, cr, uid, ids, name, arg, context=None): def _product_available(self, cr, uid, ids, name, arg, context=None):
res = dict.fromkeys(ids, 0) prod_available = {}
for product in self.browse(cr, uid, ids, context=context): product_ids = self.browse(cr, uid, ids, context=context)
res[product.id] = { var_ids = []
# "reception_count": sum([p.reception_count for p in product.product_variant_ids]), for product in product_ids:
# "delivery_count": sum([p.delivery_count for p in product.product_variant_ids]), var_ids += [p.id for p in product.product_variant_ids]
"qty_available": sum([p.qty_available for p in product.product_variant_ids]), variant_available= self.pool['product.product']._product_available(cr, uid, var_ids, context=context)
"virtual_available": sum([p.virtual_available for p in product.product_variant_ids]),
"incoming_qty": sum([p.incoming_qty for p in product.product_variant_ids]), for product in product_ids:
"outgoing_qty": sum([p.outgoing_qty for p in product.product_variant_ids]), qty_available = 0
virtual_available = 0
incoming_qty = 0
outgoing_qty = 0
for p in product.product_variant_ids:
qty_available += variant_available[p.id]["qty_available"]
virtual_available += variant_available[p.id]["virtual_available"]
incoming_qty += variant_available[p.id]["incoming_qty"]
outgoing_qty += variant_available[p.id]["outgoing_qty"]
prod_available[product.id] = {
"qty_available": qty_available,
"virtual_available": virtual_available,
"incoming_qty": incoming_qty,
"outgoing_qty": outgoing_qty,
} }
return res return prod_available
def _search_product_quantity(self, cr, uid, obj, name, domain, context): def _search_product_quantity(self, cr, uid, obj, name, domain, context):
prod = self.pool.get("product.product") prod = self.pool.get("product.product")
res = [] product_variant_ids = prod.search(cr, uid, domain, context=context)
for field, operator, value in domain: return [('product_variant_ids', 'in', product_variant_ids)]
#to prevent sql injections
assert field in ('qty_available', 'virtual_available', 'incoming_qty', 'outgoing_qty'), 'Invalid domain left operand'
assert operator in ('<', '>', '=', '!=', '<=', '>='), 'Invalid domain operator'
assert isinstance(value, (float, int)), 'Invalid domain right operand'
if operator == '=':
operator = '=='
product_ids = prod.search(cr, uid, [], context=context)
ids = []
if product_ids:
#TODO: use a query instead of this browse record which is probably making the too much requests, but don't forget
#the context that can be set with a location, an owner...
for element in prod.browse(cr, uid, product_ids, context=context):
if eval(str(element[field]) + operator + str(value)):
ids.append(element.id)
res.append(('product_variant_ids', 'in', ids))
return res
def _product_available_text(self, cr, uid, ids, field_names=None, arg=False, context=None): def _product_available_text(self, cr, uid, ids, field_names=None, arg=False, context=None):
res = {} res = {}
@@ -372,13 +404,13 @@ class product_template(osv.osv):
# fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'), # fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
# 'delivery_count': fields.function(_product_available, multi='qty_available', # 'delivery_count': fields.function(_product_available, multi='qty_available',
# fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'), # fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
'qty_available': fields.function(_product_available, multi='qty_available', 'qty_available': fields.function(_product_available, multi='qty_available', digits_compute=dp.get_precision('Product Unit of Measure'),
fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'), fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
'virtual_available': fields.function(_product_available, multi='qty_available', 'virtual_available': fields.function(_product_available, multi='qty_available', digits_compute=dp.get_precision('Product Unit of Measure'),
fnct_search=_search_product_quantity, type='float', string='Quantity Available'), fnct_search=_search_product_quantity, type='float', string='Quantity Available'),
'incoming_qty': fields.function(_product_available, multi='qty_available', 'incoming_qty': fields.function(_product_available, multi='qty_available', digits_compute=dp.get_precision('Product Unit of Measure'),
fnct_search=_search_product_quantity, type='float', string='Incoming'), fnct_search=_search_product_quantity, type='float', string='Incoming'),
'outgoing_qty': fields.function(_product_available, multi='qty_available', 'outgoing_qty': fields.function(_product_available, multi='qty_available', digits_compute=dp.get_precision('Product Unit of Measure'),
fnct_search=_search_product_quantity, type='float', string='Outgoing'), fnct_search=_search_product_quantity, type='float', string='Outgoing'),
'route_ids': fields.many2many('stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes', domain="[('product_selectable', '=', True)]", 'route_ids': fields.many2many('stock.location.route', 'stock_route_product', 'product_id', 'route_id', 'Routes', domain="[('product_selectable', '=', True)]",
+60 -41
View File
@@ -296,7 +296,7 @@ class stock_quant(osv.osv):
_columns = { _columns = {
'name': fields.function(_get_quant_name, type='char', string='Identifier'), 'name': fields.function(_get_quant_name, type='char', string='Identifier'),
'product_id': fields.many2one('product.product', 'Product', required=True, ondelete="restrict", readonly=True, select=True), 'product_id': fields.many2one('product.product', 'Product', required=True, ondelete="restrict", readonly=True, select=True),
'location_id': fields.many2one('stock.location', 'Location', required=True, ondelete="restrict", readonly=True, select=True), 'location_id': fields.many2one('stock.location', 'Location', required=True, ondelete="restrict", readonly=True, select=True, auto_join=True),
'qty': fields.float('Quantity', required=True, help="Quantity of products in this quant, in the default unit of measure of the product", readonly=True, select=True), 'qty': fields.float('Quantity', required=True, help="Quantity of products in this quant, in the default unit of measure of the product", readonly=True, select=True),
'product_uom_id': fields.related('product_id', 'uom_id', type='many2one', relation="product.uom", string='Unit of Measure', readonly=True), 'product_uom_id': fields.related('product_id', 'uom_id', type='many2one', relation="product.uom", string='Unit of Measure', readonly=True),
'package_id': fields.many2one('stock.quant.package', string='Package', help="The package containing this quant", readonly=True, select=True), 'package_id': fields.many2one('stock.quant.package', string='Package', help="The package containing this quant", readonly=True, select=True),
@@ -1770,8 +1770,10 @@ class stock_move(osv.osv):
'product_packaging': fields.many2one('product.packaging', 'Prefered Packaging', help="It specifies attributes of packaging like type, quantity of packaging,etc."), 'product_packaging': fields.many2one('product.packaging', 'Prefered Packaging', help="It specifies attributes of packaging like type, quantity of packaging,etc."),
'location_id': fields.many2one('stock.location', 'Source Location', required=True, select=True, states={'done': [('readonly', True)]}, help="Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations."), 'location_id': fields.many2one('stock.location', 'Source Location', required=True, select=True, auto_join=True,
'location_dest_id': fields.many2one('stock.location', 'Destination Location', required=True, states={'done': [('readonly', True)]}, select=True, help="Location where the system will stock the finished products."), states={'done': [('readonly', True)]}, help="Sets a location if you produce at a fixed location. This can be a partner location if you subcontract the manufacturing operations."),
'location_dest_id': fields.many2one('stock.location', 'Destination Location', required=True, states={'done': [('readonly', True)]}, select=True,
auto_join=True, help="Location where the system will stock the finished products."),
'partner_id': fields.many2one('res.partner', 'Destination Address ', states={'done': [('readonly', True)]}, help="Optional address where goods are to be delivered, specifically used for allotment"), 'partner_id': fields.many2one('res.partner', 'Destination Address ', states={'done': [('readonly', True)]}, help="Optional address where goods are to be delivered, specifically used for allotment"),
@@ -2587,7 +2589,7 @@ class stock_inventory(osv.osv):
:rtype: list of tuple :rtype: list of tuple
""" """
#default available choices #default available choices
res_filter = [('none', _('All products')), ('product', _('One product only'))] res_filter = [('none', _('All products')), ('partial', _('Manual Selection of Products')), ('product', _('One product only'))]
settings_obj = self.pool.get('stock.config.settings') settings_obj = self.pool.get('stock.config.settings')
config_ids = settings_obj.search(cr, uid, [], limit=1, order='id DESC', context=context) config_ids = settings_obj.search(cr, uid, [], limit=1, order='id DESC', context=context)
#If we don't have updated config until now, all fields are by default false and so should be not dipslayed #If we don't have updated config until now, all fields are by default false and so should be not dipslayed
@@ -2630,7 +2632,10 @@ class stock_inventory(osv.osv):
'partner_id': fields.many2one('res.partner', 'Inventoried Owner', readonly=True, states={'draft': [('readonly', False)]}, help="Specify Owner to focus your inventory on a particular Owner."), 'partner_id': fields.many2one('res.partner', 'Inventoried Owner', readonly=True, states={'draft': [('readonly', False)]}, help="Specify Owner to focus your inventory on a particular Owner."),
'lot_id': fields.many2one('stock.production.lot', 'Inventoried Lot/Serial Number', readonly=True, states={'draft': [('readonly', False)]}, help="Specify Lot/Serial Number to focus your inventory on a particular Lot/Serial Number.", copy=False), 'lot_id': fields.many2one('stock.production.lot', 'Inventoried Lot/Serial Number', readonly=True, states={'draft': [('readonly', False)]}, help="Specify Lot/Serial Number to focus your inventory on a particular Lot/Serial Number.", copy=False),
'move_ids_exist': fields.function(_get_move_ids_exist, type='boolean', string=' Stock Move Exists?', help='technical field for attrs in view'), 'move_ids_exist': fields.function(_get_move_ids_exist, type='boolean', string=' Stock Move Exists?', help='technical field for attrs in view'),
'filter': fields.selection(_get_available_filters, 'Selection Filter', required=True), 'filter': fields.selection(_get_available_filters, 'Inventory of', required=True,
help="If you do an entire inventory, you can choose 'All Products' and it will prefill the inventory with the current stock. If you only do some products "\
"(e.g. Cycle Counting) you can choose 'Manual Selection of Products' and the system won't propose anything. You can also let the "\
"system propose for a single product / lot /... "),
'total_qty': fields.function(_get_total_qty, type="float"), 'total_qty': fields.function(_get_total_qty, type="float"),
} }
@@ -2742,25 +2747,11 @@ class stock_inventory(osv.osv):
for inventory in self.browse(cr, uid, ids, context=context): for inventory in self.browse(cr, uid, ids, context=context):
# If there are inventory lines already (e.g. from import), respect those and set their theoretical qty # If there are inventory lines already (e.g. from import), respect those and set their theoretical qty
line_ids = [line.id for line in inventory.line_ids] line_ids = [line.id for line in inventory.line_ids]
if not line_ids: if not line_ids and inventory.filter != 'partial':
#compute the inventory lines and create them #compute the inventory lines and create them
vals = self._get_inventory_lines(cr, uid, inventory, context=context) vals = self._get_inventory_lines(cr, uid, inventory, context=context)
for product_line in vals: for product_line in vals:
inventory_line_obj.create(cr, uid, product_line, context=context) inventory_line_obj.create(cr, uid, product_line, context=context)
else:
# On import calculate theoretical quantity
quant_obj = self.pool.get("stock.quant")
for line in inventory.line_ids:
dom = [('company_id', '=', line.company_id.id), ('location_id', 'child_of', line.location_id.id), ('lot_id', '=', line.prod_lot_id.id),
('product_id','=', line.product_id.id), ('owner_id', '=', line.partner_id.id)]
if line.package_id:
dom += [('package_id', '=', line.package_id.id)]
quants = quant_obj.search(cr, uid, dom, context=context)
tot_qty = 0
for quant in quant_obj.browse(cr, uid, quants, context=context):
tot_qty += quant.qty
inventory_line_obj.write(cr, uid, [line.id], {'theoretical_qty': tot_qty}, context=context)
return self.write(cr, uid, ids, {'state': 'confirm', 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)}) return self.write(cr, uid, ids, {'state': 'confirm', 'date': time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)})
def _get_inventory_lines(self, cr, uid, inventory, context=None): def _get_inventory_lines(self, cr, uid, inventory, context=None):
@@ -2816,6 +2807,19 @@ class stock_inventory_line(osv.osv):
def _get_prodlot_change(self, cr, uid, ids, context=None): def _get_prodlot_change(self, cr, uid, ids, context=None):
return self.pool.get('stock.inventory.line').search(cr, uid, [('prod_lot_id', 'in', ids)], context=context) return self.pool.get('stock.inventory.line').search(cr, uid, [('prod_lot_id', 'in', ids)], context=context)
def _get_theoretical_qty(self, cr, uid, ids, name, args, context=None):
res = {}
quant_obj = self.pool["stock.quant"]
uom_obj = self.pool["product.uom"]
for line in self.browse(cr, uid, ids, context=context):
quant_ids = self._get_quants(cr, uid, line, context=context)
quants = quant_obj.browse(cr, uid, quant_ids, context=context)
tot_qty = sum([x.qty for x in quants])
if line.product_uom_id and line.product_id.uom_id.id != line.product_uom_id.id:
tot_qty = uom_obj._compute_qty_obj(cr, uid, line.product_id.uom_id, tot_qty, line.product_uom_id, context=context)
res[line.id] = tot_qty
return res
_columns = { _columns = {
'inventory_id': fields.many2one('stock.inventory', 'Inventory', ondelete='cascade', select=True), 'inventory_id': fields.many2one('stock.inventory', 'Inventory', ondelete='cascade', select=True),
'location_id': fields.many2one('stock.location', 'Location', required=True, select=True), 'location_id': fields.many2one('stock.location', 'Location', required=True, select=True),
@@ -2826,7 +2830,8 @@ class stock_inventory_line(osv.osv):
'company_id': fields.related('inventory_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, select=True, readonly=True), 'company_id': fields.related('inventory_id', 'company_id', type='many2one', relation='res.company', string='Company', store=True, select=True, readonly=True),
'prod_lot_id': fields.many2one('stock.production.lot', 'Serial Number', domain="[('product_id','=',product_id)]"), 'prod_lot_id': fields.many2one('stock.production.lot', 'Serial Number', domain="[('product_id','=',product_id)]"),
'state': fields.related('inventory_id', 'state', type='char', string='Status', readonly=True), 'state': fields.related('inventory_id', 'state', type='char', string='Status', readonly=True),
'theoretical_qty': fields.float('Theoretical Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), readonly=True), 'theoretical_qty': fields.function(_get_theoretical_qty, type='float', digits_compute=dp.get_precision('Product Unit of Measure'),
store=True, readonly=True, string="Theoretical Quantity"),
'partner_id': fields.many2one('res.partner', 'Owner'), 'partner_id': fields.many2one('res.partner', 'Owner'),
'product_name': fields.related('product_id', 'name', type='char', string='Product Name', store={ 'product_name': fields.related('product_id', 'name', type='char', string='Product Name', store={
'product.product': (_get_product_name_change, ['name', 'default_code'], 20), 'product.product': (_get_product_name_change, ['name', 'default_code'], 20),
@@ -2843,7 +2848,7 @@ class stock_inventory_line(osv.osv):
} }
_defaults = { _defaults = {
'product_qty': 1, 'product_qty': 0,
} }
def create(self, cr, uid, values, context=None): def create(self, cr, uid, values, context=None):
@@ -2854,6 +2859,37 @@ class stock_inventory_line(osv.osv):
values['product_uom_id'] = product_obj.browse(cr, uid, values.get('product_id'), context=context).uom_id.id values['product_uom_id'] = product_obj.browse(cr, uid, values.get('product_id'), context=context).uom_id.id
return super(stock_inventory_line, self).create(cr, uid, values, context=context) return super(stock_inventory_line, self).create(cr, uid, values, context=context)
def _get_quants(self, cr, uid, line, context=None):
quant_obj = self.pool["stock.quant"]
dom = [('company_id', '=', line.company_id.id), ('location_id', 'child_of', line.location_id.id), ('lot_id', '=', line.prod_lot_id.id),
('product_id','=', line.product_id.id), ('owner_id', '=', line.partner_id.id), ('package_id', '=', line.package_id.id)]
quants = quant_obj.search(cr, uid, dom, context=context)
return quants
def onchange_createline(self, cr, uid, ids, location_id=False, product_id=False, uom_id=False, package_id=False, prod_lot_id=False, partner_id=False, company_id=False, context=None):
quant_obj = self.pool["stock.quant"]
uom_obj = self.pool["product.uom"]
res = {'value': {}}
# If no UoM already put the default UoM of the product
if product_id and not uom_id:
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
res['value']['product_uom_id'] = product.uom_id.id
res['domain'] = {'product_uom_id': [('category_id','=',product.uom_id.category_id.id)]}
uom_id = product.uom_id.id
# Calculate theoretical quantity by searching the quants as in quants_get
if product_id and location_id:
product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
if not company_id:
company_id = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.id
dom = [('company_id', '=', company_id), ('location_id', 'child_of', location_id), ('lot_id', '=', prod_lot_id),
('product_id','=', product_id), ('owner_id', '=', partner_id), ('package_id', '=', package_id)]
quants = quant_obj.search(cr, uid, dom, context=context)
th_qty = sum([x.qty for x in quant_obj.browse(cr, uid, quants, context=context)])
if product_id and uom_id and product.uom_id.id != uom_id:
th_qty = uom_obj._compute_qty(cr, uid, product.uom_id.id, th_qty, uom_id)
res['value']['theoretical_qty'] = th_qty
return res
def _resolve_inventory_line(self, cr, uid, inventory_line, context=None): def _resolve_inventory_line(self, cr, uid, inventory_line, context=None):
stock_move_obj = self.pool.get('stock.move') stock_move_obj = self.pool.get('stock.move')
diff = inventory_line.theoretical_qty - inventory_line.product_qty diff = inventory_line.theoretical_qty - inventory_line.product_qty
@@ -2884,26 +2920,11 @@ class stock_inventory_line(osv.osv):
vals['product_uom_qty'] = diff vals['product_uom_qty'] = diff
return stock_move_obj.create(cr, uid, vals, context=context) return stock_move_obj.create(cr, uid, vals, context=context)
# Should be left out in next version
def restrict_change(self, cr, uid, ids, theoretical_qty, context=None): def restrict_change(self, cr, uid, ids, theoretical_qty, context=None):
if ids and theoretical_qty:
#if the user try to modify a line prepared by openerp, reject the change and display an error message explaining how he should do
old_value = self.browse(cr, uid, ids[0], context=context)
return {
'value': {
'product_id': old_value.product_id.id,
'product_uom_id': old_value.product_uom_id.id,
'location_id': old_value.location_id.id,
'prod_lot_id': old_value.prod_lot_id.id,
'package_id': old_value.package_id.id,
'partner_id': old_value.partner_id.id,
},
'warning': {
'title': _('Error'),
'message': _('You can only change the checked quantity of an existing inventory line. If you want modify a data, please set the checked quantity to 0 and create a new inventory line.')
}
}
return {} return {}
# Should be left out in next version
def on_change_product_id(self, cr, uid, ids, product, uom, theoretical_qty, context=None): def on_change_product_id(self, cr, uid, ids, product, uom, theoretical_qty, context=None):
""" Changes UoM """ Changes UoM
@param location_id: Location id @param location_id: Location id
@@ -2911,8 +2932,6 @@ class stock_inventory_line(osv.osv):
@param uom: UoM product @param uom: UoM product
@return: Dictionary of changed values @return: Dictionary of changed values
""" """
if ids and theoretical_qty:
return self.restrict_change(cr, uid, ids, theoretical_qty, context=context)
if not product: if not product:
return {'value': {'product_uom_id': False}} return {'value': {'product_uom_id': False}}
obj_product = self.pool.get('product.product').browse(cr, uid, product, context=context) obj_product = self.pool.get('product.product').browse(cr, uid, product, context=context)
+11 -11
View File
@@ -58,7 +58,7 @@
</field> </field>
</record> </record>
<record id="view_inventory_filter" model="ir.ui.view"> <record id="view_inventory_filter" model="ir.ui.view">
<field name="name">stock.inventory.filter</field> <field name="name">stock.inventory.filter</field>
<field name="model">stock.inventory</field> <field name="model">stock.inventory</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
@@ -112,10 +112,10 @@
<group> <group>
<field name="date"/> <field name="date"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
<field name="product_id" domain="[('type','=','product')]" attrs="{'invisible': [('filter', 'not in', ('product', 'product_owner'))]}"/> <field name="product_id" domain="[('type','=','product')]" attrs="{'invisible': [('filter', 'not in', ('product', 'product_owner'))], 'required': [('filter', 'in', ('product', 'product_owner'))]}"/>
<field name="lot_id" attrs="{'invisible': [('filter', '!=', 'lot')]}" groups="stock.group_production_lot" /> <field name="lot_id" attrs="{'invisible': [('filter', '!=', 'lot')], 'required': [('filter', '=', 'lot')]}" groups="stock.group_production_lot" />
<field name="partner_id" attrs="{'invisible': [('filter', 'not in', ('owner', 'product_owner'))]}" groups="stock.group_tracking_owner"/> <field name="partner_id" attrs="{'invisible': [('filter', 'not in', ('owner', 'product_owner'))], 'required': [('filter', 'in', ('owner', 'product_owner'))]}" groups="stock.group_tracking_owner"/>
<field name="package_id" attrs="{'invisible': [('filter', '!=', 'pack')]}" groups="stock.group_tracking_lot"/> <field name="package_id" attrs="{'invisible': [('filter', '!=', 'pack')], 'required': [('filter', '=', 'pack')]}" groups="stock.group_tracking_lot"/>
</group> </group>
</group> </group>
<notebook attrs="{'invisible':[('state','=','draft')]}"> <notebook attrs="{'invisible':[('state','=','draft')]}">
@@ -123,12 +123,12 @@
<button name="reset_real_qty" states="confirm" string="⇒ Set quantities to 0" type="object" class="oe_link oe_right" groups="stock.group_stock_user"/> <button name="reset_real_qty" states="confirm" string="⇒ Set quantities to 0" type="object" class="oe_link oe_right" groups="stock.group_stock_user"/>
<field name="line_ids" string="Inventory Details" context="{'default_location_id': location_id, 'default_product_id': product_id, 'default_prod_lot_id': lot_id, 'default_package_id': package_id, 'default_partner_id': partner_id}"> <field name="line_ids" string="Inventory Details" context="{'default_location_id': location_id, 'default_product_id': product_id, 'default_prod_lot_id': lot_id, 'default_package_id': package_id, 'default_partner_id': partner_id}">
<tree string="Inventory Details" editable="bottom" colors="blue: product_qty != theoretical_qty; red: theoretical_qty &lt; 0"> <tree string="Inventory Details" editable="bottom" colors="blue: product_qty != theoretical_qty; red: theoretical_qty &lt; 0">
<field context="{'location':location_id, 'uom':product_uom_id, 'to_date':parent.date}" name="product_id" on_change="on_change_product_id(product_id,product_uom_id,theoretical_qty,context)" domain="[('type','=','product')]"/> <field name="product_id" domain="[('type','=','product')]" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)"/>
<field name="product_uom_id" groups="product.group_uom" on_change="restrict_change(theoretical_qty)"/> <field name="product_uom_id" groups="product.group_uom" string="UoM" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)"/>
<field domain="[('usage','=','internal')]" name="location_id" groups="stock.group_locations" on_change="restrict_change(theoretical_qty)"/> <field name="location_id" domain="[('id', 'child_of', parent.location_id)]" groups="stock.group_locations" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)"/>
<field name="prod_lot_id" on_change="restrict_change(theoretical_qty)" domain="[('product_id', '=', product_id)]" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/> <field name="prod_lot_id" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)" domain="[('product_id', '=', product_id)]" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/>
<field name="package_id" on_change="restrict_change(theoretical_qty)" groups="stock.group_tracking_lot"/> <field name="package_id" domain="['|', ('location_id','=', False), ('location_id', '=', location_id)]" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)" groups="stock.group_tracking_lot"/>
<field name="partner_id" on_change="restrict_change(theoretical_qty)" groups="stock.group_tracking_owner"/> <field name="partner_id" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)" groups="stock.group_tracking_owner"/>
<field name="theoretical_qty" readonly="1"/> <field name="theoretical_qty" readonly="1"/>
<field name="product_qty" string="Real Quantity"/> <field name="product_qty" string="Real Quantity"/>
<field name="state" invisible="True"/> <field name="state" invisible="True"/>
+1 -4
View File
@@ -172,10 +172,7 @@ class stock_picking(osv.osv):
if partner.picking_warn == 'block': if partner.picking_warn == 'block':
return {'value': {'partner_id': False}, 'warning': warning} return {'value': {'partner_id': False}, 'warning': warning}
result = {} result = {'value': {}}
if result.get('warning',False):
warning['title'] = title and title +' & '+ result['warning']['title'] or result['warning']['title']
warning['message'] = message and message + ' ' + result['warning']['message'] or result['warning']['message']
if warning: if warning:
result['warning'] = warning result['warning'] = warning
+7 -5
View File
@@ -59,15 +59,17 @@
</notebook> </notebook>
</field> </field>
</record> </record>
<record id="stock_picking_form_view_inherit" model="ir.ui.view">
<field name="name">stock.picking.form.inherit</field> <record id="view_picking_form" model="ir.ui.view">
<field name="name">stock.picking.form.warning</field>
<field name="model">stock.picking</field> <field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/> <field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//sheet/group/group/field[@name='partner_id']" position="replace"> <field name="partner_id" position="attributes">
<field name="partner_id" on_change="onchange_partner_id(partner_id)" /> <attribute name="on_change">onchange_partner_id(partner_id)</attribute>
</xpath> </field>
</field> </field>
</record> </record>
</data> </data>
</openerp> </openerp>
+3 -3
View File
@@ -61,7 +61,7 @@
<li class="list-group-item">Loops</li> <li class="list-group-item">Loops</li>
<li class="list-group-item">Arrays</li> <li class="list-group-item">Arrays</li>
</ul><div class="panel-footer text-center"> </ul><div class="panel-footer text-center">
<p class="text-muted"><i>You will be able to develop simple dynamic compenents in HTML pages.</i></p> <p class="text-muted"><i>You will be able to develop simple dynamic components in HTML pages.</i></p>
</div> </div>
</div> </div>
</div> </div>
@@ -227,7 +227,7 @@
<li class="list-group-item">Loops</li> <li class="list-group-item">Loops</li>
<li class="list-group-item">Arrays</li> <li class="list-group-item">Arrays</li>
</ul><div class="panel-footer text-center"> </ul><div class="panel-footer text-center">
<p class="text-muted"><i>You will be able to develop simple dynamic compenents in HTML pages.</i></p> <p class="text-muted"><i>You will be able to develop simple dynamic components in HTML pages.</i></p>
</div> </div>
</div> </div>
</div> </div>
@@ -405,7 +405,7 @@
<li class="list-group-item">Loops</li> <li class="list-group-item">Loops</li>
<li class="list-group-item">Arrays</li> <li class="list-group-item">Arrays</li>
</ul><div class="panel-footer text-center"> </ul><div class="panel-footer text-center">
<p class="text-muted"><i>You will be able to develop simple dynamic compenents in HTML pages.</i></p> <p class="text-muted"><i>You will be able to develop simple dynamic components in HTML pages.</i></p>
</div> </div>
</div> </div>
</div> </div>
+2 -1
View File
@@ -153,7 +153,6 @@ class website_sale(http.Controller):
('description_sale', 'ilike', srch), ('product_variant_ids.default_code', 'ilike', srch)] ('description_sale', 'ilike', srch), ('product_variant_ids.default_code', 'ilike', srch)]
if category: if category:
domain += [('public_categ_ids', 'child_of', int(category))] domain += [('public_categ_ids', 'child_of', int(category))]
attrib_list = request.httprequest.args.getlist('attrib') attrib_list = request.httprequest.args.getlist('attrib')
attrib_values = [map(int,v.split("-")) for v in attrib_list if v] attrib_values = [map(int,v.split("-")) for v in attrib_list if v]
attrib_set = set([v[1] for v in attrib_values]) attrib_set = set([v[1] for v in attrib_values])
@@ -188,6 +187,8 @@ class website_sale(http.Controller):
if category: if category:
category = pool['product.public.category'].browse(cr, uid, int(category), context=context) category = pool['product.public.category'].browse(cr, uid, int(category), context=context)
url = "/shop/category/%s" % slug(category) url = "/shop/category/%s" % slug(category)
if attrib_list:
post['attrib'] = attrib_list
style_obj = pool['product.style'] style_obj = pool['product.style']
style_ids = style_obj.search(cr, uid, [], context=context) style_ids = style_obj.search(cr, uid, [], context=context)
+22
View File
@@ -0,0 +1,22 @@
Belgium, 2015-03-02
EEZEE-IT agrees to the terms of the Odoo Corporate Contributor License
Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this
declaration.
Signed,
Antony Brugger antony.brugger@eezee-it.com https://github.com/antonybrugger
List of contributors:
Julien Laloux julien.laloux@eezee-it.com https://github.com/jlaloux
Sylvain Van Hoof sylvain.vanhoof@eezee-it.com https://github.com/sylvainvanhoof
Aristóbulo Meneses aristobulo.meneses@eezee-it.com https://github.com/aristobulo-eezee
Janik De Goÿ janik.de.goy@eezee-it.com https://github.com/jdegoy
François Lawarrée francois.lawarre@eezee-it.com https://github.com/francoislawarree
José Moreno jose.moreno@eezee-it.com https://github.com/jose-eezee
Javier Carrasco javier.carrasco@eezee-it.com https://github.com/jose-eezee
David Cajot david.cajot@eezee-it.com https://github.com/dcajot
+14
View File
@@ -0,0 +1,14 @@
Lithuania, 2015-02-26
Versada agrees to the terms of the Odoo Corporate Contributor License Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this declaration.
Signed,
Andrius Preimantas andrius@versada.lt https://github.com/andrius-preimantas
List of contributors:
Andrius Preimantas andrius@versada.lt https://github.com/andrius-preimantas
+11
View File
@@ -0,0 +1,11 @@
Ecuador, 2nd of March 2015
I hereby agree to the terms of the Odoo Individual Contributor License
Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this
declaration.
Signed,
Nicolas Schmitt sathors@free.fr https://github.com/Sathors
+9
View File
@@ -278,6 +278,14 @@ customize the amout of logging output
In case of conflict between :option:`--log-level` and In case of conflict between :option:`--log-level` and
:option:`--log-handler`, the latter is used :option:`--log-handler`, the latter is used
Advanced options
----------------
.. option:: --auto-reload
enable auto-reloading of python files and xml files without having to
restart the server. Requires pyinotify_.
.. _reference/cmdline/scaffold: .. _reference/cmdline/scaffold:
Scaffolding Scaffolding
@@ -347,3 +355,4 @@ to that file.
http://www.postgresql.org/docs/9.2/static/libpq-connect.html#AEN38208 http://www.postgresql.org/docs/9.2/static/libpq-connect.html#AEN38208
.. _Werkzeug's proxy support: .. _Werkzeug's proxy support:
http://werkzeug.pocoo.org/docs/0.9/contrib/fixers/#werkzeug.contrib.fixers.ProxyFix http://werkzeug.pocoo.org/docs/0.9/contrib/fixers/#werkzeug.contrib.fixers.ProxyFix
.. _pyinotify: https://github.com/seb-m/pyinotify/wiki
+4 -2
View File
@@ -124,8 +124,10 @@ daemon and automatically start it.
.. danger:: to print PDF reports, you must install wkhtmltopdf_ yourself: .. danger:: to print PDF reports, you must install wkhtmltopdf_ yourself:
the version of wkhtmltopdf_ available in debian repositories does the version of wkhtmltopdf_ available in debian repositories does
not support headers and footers so it can not be installed not support headers and footers so it can not be installed
automatically. Use the version available on automatically. The recommended version is 0.12.1 and is available on
`the wkhtmltopdf download page`_. `the wkhtmltopdf download page`_, in the archive section. As there
is no official release for Debian Jessie, you can find ours on
http://nightly.odoo.com/extra/.
Configuration Configuration
''''''''''''' '''''''''''''
+2 -2
View File
@@ -152,8 +152,8 @@ class res_partner_bank(osv.osv):
'name': '/' 'name': '/'
} }
def fields_get(self, cr, uid, allfields=None, context=None): def fields_get(self, cr, uid, allfields=None, context=None, write_access=True, attributes=None):
res = super(res_partner_bank, self).fields_get(cr, uid, allfields=allfields, context=context) res = super(res_partner_bank, self).fields_get(cr, uid, allfields=allfields, context=context, write_access=write_access, attributes=attributes)
bank_type_obj = self.pool.get('res.partner.bank.type') bank_type_obj = self.pool.get('res.partner.bank.type')
type_ids = bank_type_obj.search(cr, uid, []) type_ids = bank_type_obj.search(cr, uid, [])
types = bank_type_obj.browse(cr, uid, type_ids) types = bank_type_obj.browse(cr, uid, type_ids)
+2 -2
View File
@@ -363,13 +363,13 @@ class res_config_installer(osv.osv_memory, res_config_module_installation_mixin)
self.already_installed(cr, uid, context=context), self.already_installed(cr, uid, context=context),
True)) True))
def fields_get(self, cr, uid, fields=None, context=None, write_access=True): def fields_get(self, cr, uid, fields=None, context=None, write_access=True, attributes=None):
""" If an addon is already installed, set it to readonly as """ If an addon is already installed, set it to readonly as
res.config.installer doesn't handle uninstallations of already res.config.installer doesn't handle uninstallations of already
installed addons installed addons
""" """
fields = super(res_config_installer, self).fields_get( fields = super(res_config_installer, self).fields_get(
cr, uid, fields, context, write_access) cr, uid, fields, context, write_access, attributes)
for name in self.already_installed(cr, uid, context=context): for name in self.already_installed(cr, uid, context=context):
if name not in fields: if name not in fields:
+2 -2
View File
@@ -893,8 +893,8 @@ class users_view(osv.osv):
selected = [gid for gid in get_selection_groups(f) if gid in gids] selected = [gid for gid in get_selection_groups(f) if gid in gids]
values[f] = selected and selected[-1] or False values[f] = selected and selected[-1] or False
def fields_get(self, cr, uid, allfields=None, context=None, write_access=True): def fields_get(self, cr, uid, allfields=None, context=None, write_access=True, attributes=None):
res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access) res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access, attributes)
# add reified groups fields # add reified groups fields
for app, kind, gs in self.pool['res.groups'].get_groups_by_application(cr, uid, context): for app, kind, gs in self.pool['res.groups'].get_groups_by_application(cr, uid, context):
if kind == 'selection': if kind == 'selection':
+5 -3
View File
@@ -112,16 +112,18 @@ class template(object):
""" """
# overwrite with local # overwrite with local
for path, content in self.files(): for path, content in self.files():
_, ext = os.path.splitext(path)
local = os.path.relpath(path, self.path) local = os.path.relpath(path, self.path)
# strip .template extension
root, ext = os.path.splitext(local)
if ext == '.template':
local = root
dest = os.path.join(directory, modname, local) dest = os.path.join(directory, modname, local)
destdir = os.path.dirname(dest) destdir = os.path.dirname(dest)
if not os.path.exists(destdir): if not os.path.exists(destdir):
os.makedirs(destdir) os.makedirs(destdir)
with open(dest, 'wb') as f: with open(dest, 'wb') as f:
if ext not in ('.py', '.xml', '.csv', '.js', '.rst', '.html'): if ext not in ('.py', '.xml', '.csv', '.js', '.rst', '.html', '.template'):
f.write(content) f.write(content)
else: else:
env.from_string(content)\ env.from_string(content)\
@@ -7,13 +7,17 @@
'version': '1.0', 'version': '1.0',
'depends': ['website'], 'depends': ['website'],
# templates, pages, and snippets # templates
'data': [ 'data': [
'views/pages.xml',
'views/options.xml', 'views/options.xml',
'views/snippets.xml', 'views/snippets.xml',
], ],
# demo pages
'demo': [
'demo/pages.xml',
],
# Your information # Your information
'author': "Your Company", 'author': "Your Company",
'website': "", 'website': "",
+2 -2
View File
@@ -561,7 +561,7 @@ class JsonRequest(WebRequest):
start_time = time.time() start_time = time.time()
_, start_vms = 0, 0 _, start_vms = 0, 0
if psutil: if psutil:
_, start_vms = psutil.Process().get_memory_info() _, start_vms = psutil.Process(os.getpid()).get_memory_info()
if rpc_request and rpc_response_flag: if rpc_request and rpc_response_flag:
rpc_request.debug('%s: %s %s, %s', rpc_request.debug('%s: %s %s, %s',
endpoint, model, method, pprint.pformat(args)) endpoint, model, method, pprint.pformat(args))
@@ -572,7 +572,7 @@ class JsonRequest(WebRequest):
end_time = time.time() end_time = time.time()
_, end_vms = 0, 0 _, end_vms = 0, 0
if psutil: if psutil:
_, end_vms = psutil.Process().get_memory_info() _, end_vms = psutil.Process(os.getpid()).get_memory_info()
logline = '%s: %s %s: time:%.3fs mem: %sk -> %sk (diff: %sk)' % ( logline = '%s: %s %s: time:%.3fs mem: %sk -> %sk (diff: %sk)' % (
endpoint, model, method, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024) endpoint, model, method, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024)
if rpc_response_flag: if rpc_response_flag: