[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>
Akash Balar <aba@tinyerp.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 - http://www.NaN-tic.com <>
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 de Lattre <>
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@aline-laptop>
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> atp (OpenERP) <>
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 <>
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(OpenERP) <>
Bharat Devnani <bde@tinyerp.com> bde@tinyerp.com <>
Bhatt Chintal <bch@tinyerp.com> bch <>
Bhavik Bagdiya <bba@tinyerp.com>
Bhavik Bagdiya <bba@tinyerp.com> <bba@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> 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> <dizzy.zala@gmail.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 <>
Guillermo Bisheimer <gbisheimer@bys-control.com.ar>
Gulamfarid Ghanchi <ggh@tinyerp.com>
Géry Debongnie <ged@odoo.com>
Géry Debongnie <ged@odoo.com> <gde@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 R. Shamnani <hsa@tinyerp.com>
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> HMO (Open ERP) <>
Harshad Modi <hmo@tinyerp.com> HMO(OpenERP) <>
@@ -345,6 +356,7 @@ Herbert Petersen <office@conexus.at> Conexus.at <>
Hiral Patel <hip@tinyerp.com>
Hitesh Trivedi <htr@tinyerp.com> <htr@openerp.com>
Hugo Santos <hugo.santos@factorlibre.com> hugo <>
Hugo Santos <hugo.santos@factorlibre.com> hugosdsantos <hugosdsantos@gmail.com>
Humberto Arocha <hbto@vauxoo.com> hbto(humbertoarocha) <>
Husen Daudi <hda@tinyerp.com>
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> <husen@husen-laptop>
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@tinyerp.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-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> <jke@openerp.com>
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) <>
Jigar Amin <jam@tinyerp.com> JAM(OpenERP) <>
Jigar Amin <jam@tinyerp.com> amami <>
Jigar Amin <jam@tinyerp.com> jam <>
Jignesh Rathod <jir@tinyerp.com>
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> kjo <>
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>
Launchpad <codehost@crowberry>
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> Matvaya Gajjar(Openerp) <>
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 <marcelo@hakuna>
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 Bessi(C2C) <>
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 Vanhoren <niv@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(Rrd15) <>
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>
Oliver Laurent <olivier.laurent@acsone.eu>
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> Odowan Kenobi <>
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> odo@tinyerp.com <>
Olivier Dossmann <od@tempo-consulting.fr> Olivier DOSSMANN <olivier@tempo-laptop>
Olivier Laurent <olt@odoo.com>
Olivier Laurent <olt@odoo.com> <olt@openerp.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@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 (Pexego) <>
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> omar7r <>
Ostap Yakovenko <OstapYakovenko@users.noreply.github.com>
Pankaj Joshi <pji@tinyerp.com>
Pankaj Joshi <pji@tinyerp.com> Pankaj Joshi <pji@openerp.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> <p_chr...@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>
Parthiv Patel <parthiv@techreceptives.com>
Parthiv Patel <parthiv@techreceptives.com> <parthivgls@gmail.com>
Patrick Monnerat <pm@datasphere.ch> Patrik <>
Patrick Thieuleux <patrick.thieuleux@groupes.be> Patrick Thieuleux <>
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 <paulius@hacbee.com>
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 <>
Phong Nguyen <phong.nguyen_thanh@yahoo.com> <phongnt@phongnt-laptop>
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> <pna@openerp.com>
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> Ravi Gohil (OpenERP) <>
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> <rmu@openerp.com>
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 (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 <>
Roberto López López <rlo@openerp.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(Open ERP) <>
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>
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> <bwrsandman@gmail.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@sus-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> <openerp-sle@openerp-sle.home>
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 <>
Vaibhav Darji <vda@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 - www.akretion.com.br <>
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(OpenERP) <>
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 <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@Camptocamp <>
Yogesh Parekh <ypa@tinyerp.com>
Yogesh Parekh <ypa@tinyerp.com> <yogeshparekh1988@gmail.com>
Yogesh Parekh <ypa@tinyerp.com> <ypa@openerp.com>
Yogesh Sakhreliya <ysa@tinyerp.com>
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>
_FIXME ajm <ajm@tinyerp.com>
_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 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> SME(OpenERP) <>
_FIXME sme <sme@tinyerp.com> SME(Tiny/Axelor) <>
_FIXME sme <sme@tinyerp.com> SME(tiny/Axelor) <>
_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 tiny <tiny@tinyerp.com>
__FIXME tiny <tiny@tinyerp.com> <tiny@tiny-desktop>
@@ -1032,25 +1054,22 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# TODO INTERNAL
# 2 AVP(Axelor) <>
# 1 DRA(Axelor) <>
# 1 avp <openerp@openerp-laptop>
# 2 Priyanka Jani(OpenERP Trainee) <>
# 2 Hardik Sanchawat (OpenERP) <>
# 2 Jenil(OpenERP) <>
# 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 Sejal Bhut (OpenERP Trainee) <sejalpatel125@gmail.com>
# 1 Amit (Open ERP) <>
# 1 phu <>
# 1 vba <>
# TODO INTERNAL Conflict
# 1 Amit (Open ERP) <>
# 1 Ajay Patel <apa@openerp.com>
# 1 Yogesh(Open ERP) <>
# 1 Yogesh(OpenERP) <>
# 1 Chirag <chirag@chirag-desktop>
# TODO INTERNAL Couples
# 1 ACH,Jay <>
# 2 JMA,VRA <>
# 2 Vir,Amp <>
@@ -1088,6 +1107,8 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 Olivier Dony, Jay Vora <>
# 1 Christophe Simonis, Olivier Dony <>
# TODO INTERNAL Team Leaders
# 2 Framework Team <>
# 2 OpenERP R&D Framework Team <>
# 2 Quality Team <>
@@ -1095,6 +1116,8 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 Mod2 Team(OpenERP) <>
# 1 OnDemand Open Object User <odoo@saas>
# TODO INTERNAL Leading Space
# 1 Amit Dodiya (OpenERP) <>
# 1 Amit Dodiya(OpenERP) <>
# 1 Jean-Christophe VASSORT <>
@@ -1108,7 +1131,6 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 2 jkei <jerome.keirse@gmail.com>
# 2 richierichrawr <richierichrawr@users.noreply.github.com>
# 2 watermelonjuice <watermelonjuice@users.noreply.github.com>
# 1 vrenaville <vincent.renaville@camptocamp.com>
# 2 youring <youring@gmail.com>
# 2 Дмитро Катюха <Dmytro.Katyukha@jbm.com.ua>
# 1 jbeficent <jordi.ballester@eficent.com>
@@ -1117,9 +1139,7 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 jmustonen <jmusto@gmail.com>
# 1 celm1990 <celm1990@hotmail.com>
# 1 cysnake4713 <cysnake4713@gmail.com>
# 1 dharmesh rathod <dharmesh247@gmail.com>
# 1 driou <a.bourroux@gmail.com>
# 1 dsabrinarg <sabrina@vauxoo.com>
# 1 eneldoserrata <eneldoserrata@gmail.com>
# 1 fdesmottes <fdesmottes@nuxly.com>
# 1 g.shipilov <g.shipilov@it1>
@@ -1127,38 +1147,25 @@ __FIXME tiny <tiny@tinyerp.com> tiny <>
# 1 senthilnathang <bornspy@gmail.com>
# 1 the-digital-engineer <the-digital-engineer@users.noreply.github.com>
# 1 yingliu4203 <yingliu4203@gmail.com>
# 1 hugosdsantos <hugosdsantos@gmail.com>
# 1 krnkris <krnkris@users.noreply.github.com>
# 1 buke <wangbuke@gmail.com>
# 1 OstapYakovenko <OstapYakovenko@users.noreply.github.com>
# 1 DEEP SILVER ACCESSORY <fordeep@hotmail.com>
# 1 neps1192 <neps1192@gmail.com>
# 1 ALIANE Abdelouahab <abdelouahab_al@yahoo.fr>
# 1 Invitu <contact@invitu.com>
# 1 Jorge <jcamacho@trey.es>
# 1 Maria G <mariagr@europeanstonetile.com>
# 1 Mack <mackz@sina.com>
# TODO MISSING INFO
# 1 Olivier Macchioni <mac@Olivier-Macchionis-MacBook-Pro-2.local>
# Email not found
# TODO MISSING INFO EMAIL
# 2 Denis Seleznyov <>
# Email not found
# 1 openerp user <openerp@openerp6desktop>
# Name: Milan Tribuson
# email not found
# 1 Manu, Jigar Amin - OpenERP <>
# 1 Ferchu <>
# 1 Patrik <>
# 1 R.Messier <>
# 1 Manu <>
# 1 Zyph0s <>
# 1 amami <>
# 1 vitridex <>
# 1 vivisci <>
# 1 ashish <ashish@ashish-laptop>
# Name: Raphael Messier
# 1 Ferchu <>
# Launchpad: https://launchpad.net/~fgb
+1 -1
View File
@@ -17,6 +17,7 @@ recursive-include openerp *.rng
recursive-include openerp *.rst
recursive-include openerp *.sass
recursive-include openerp *.sql
recursive-include openerp *.template
recursive-include openerp *.txt
recursive-include openerp *.ttf
recursive-include openerp *.woff
@@ -25,4 +26,3 @@ recursive-include openerp *.xml
recursive-include openerp *.yml
recursive-exclude * *.py[co]
recursive-exclude * *.hg*
graft openerp/cli/templates
+2 -2
View File
@@ -397,8 +397,8 @@ class payment_line(osv.osv):
break
return {'value': data}
def fields_get(self, cr, uid, fields=None, context=None):
res = super(payment_line, self).fields_get(cr, uid, fields, context)
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, write_access, attributes)
if 'communication2' in res:
res['communication2'].setdefault('states', {})
res['communication2']['states']['structured'] = [('readonly', True)]
+2 -2
View File
@@ -105,7 +105,7 @@ class CompanyLDAP(osv.osv):
if results and len(results) == 1:
dn = results[0][0]
conn = self.connect(conf)
conn.simple_bind_s(dn, password)
conn.simple_bind_s(dn, password.encode('utf-8'))
conn.unbind()
entry = results[0]
except ldap.INVALID_CREDENTIALS:
@@ -141,7 +141,7 @@ class CompanyLDAP(osv.osv):
try:
conn = self.connect(conf)
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,
filter, retrieve_attributes, timeout=60)
conn.unbind()
@@ -281,7 +281,8 @@ class account_analytic_line(osv.osv):
details.append("%s" % (line['unit_amount'], ))
if data.get('name', False):
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:
curr_line['name'] += "\n" + ("\n".join(map(lambda x: unicode(x) or '',note)))
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"
def create(self, cr, uid, vals, context=None):
context = context or {}
procurement_id = super(procurement_order, self).create(cr, uid, vals, context=context)
self.run(cr, uid, [procurement_id], context=context)
self.check(cr, uid, [procurement_id], context=context)
if not context.get('procurement_autorun_defer'):
self.run(cr, uid, [procurement_id], context=context)
self.check(cr, uid, [procurement_id], context=context)
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="uom_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="default_code">B3423</field>
</record>
+12 -5
View File
@@ -197,6 +197,13 @@ class purchase_order(osv.osv):
('done', 'Done'),
('cancel', 'Cancelled')
]
READONLY_STATES = {
'confirmed': [('readonly', True)],
'approved': [('readonly', True)],
'done': [('readonly', True)]
}
_track = {
'state': {
'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),
'date_approve':fields.date('Date Approved', readonly=1, select=True, copy=False,
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'),
'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. " \
"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)]} ),
'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."),
'currency_id': fields.many2one('res.currency','Currency', readonly=True, required=True,states={'draft': [('readonly', False)],'sent': [('readonly', False)]}),
'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=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', required=True, states=READONLY_STATES),
'state': fields.selection(STATE_SELECTION, 'Status', readonly=True,
help="The status of the purchase order or the quotation request. "
"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,
'product_id': product.id,
'account_analytic_id': requisition_line.account_analytic_id.id,
'taxes_id': [(6, 0, vals.get('taxes_ids', []))],
})
return vals
+4 -2
View File
@@ -690,7 +690,7 @@ class sale_order(osv.osv):
:return: True
"""
context = dict(context)
context = context or {}
context['lang'] = self.pool['res.users'].browse(cr, uid, uid).lang
procurement_obj = self.pool.get('procurement.order')
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:
continue
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)
#Confirm procurement order such that rules will be applied on it
#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">
<field name="name">Sales Order Confirmed</field>
<field name="res_model">sale.order</field>
<field name="default" eval="True"/>
<field name="default" eval="False"/>
<field name="description">Quotation confirmed</field>
</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'
domain = context.get('force_company', False) and ['&', ('company_id', '=', context['force_company'])] or []
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)]
)
locations = location_obj.browse(cr, uid, location_ids, context=context)
if operator == "child_of" and locations and locations[0].parent_left != 0:
loc_domain = []
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):
from_date = context.get('from_date', False)
@@ -115,7 +133,8 @@ class product_product(osv.osv):
field_names = field_names or []
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_out += self._get_domain_dates(cr, uid, ids, context=context) + [('state', 'not in', ('done', 'cancel', 'draft'))] + domain_products
domain_quant += domain_products
@@ -129,9 +148,12 @@ class product_product(osv.osv):
moves_in = []
moves_out = []
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_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 = dict(map(lambda x: (x['product_id'][0], x['qty']), quants))
@@ -163,17 +185,33 @@ class product_product(osv.osv):
if operator == '=':
operator = '=='
product_ids = self.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 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))
if name == 'qty_available':
res.append(('id', 'in', self._search_qty_available(cr, uid, operator, value, context)))
else:
product_ids = self.search(cr, uid, [], context=context)
if product_ids:
#TODO: Still optimization possible when searching virtual quantities
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
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):
res = {}
for product in self.browse(cr, uid, ids, context=context):
@@ -294,41 +332,35 @@ class product_template(osv.osv):
_inherit = 'product.template'
def _product_available(self, cr, uid, ids, name, arg, context=None):
res = dict.fromkeys(ids, 0)
for product in self.browse(cr, uid, ids, context=context):
res[product.id] = {
# "reception_count": sum([p.reception_count for p in product.product_variant_ids]),
# "delivery_count": sum([p.delivery_count for p in product.product_variant_ids]),
"qty_available": sum([p.qty_available for p in product.product_variant_ids]),
"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]),
"outgoing_qty": sum([p.outgoing_qty for p in product.product_variant_ids]),
prod_available = {}
product_ids = self.browse(cr, uid, ids, context=context)
var_ids = []
for product in product_ids:
var_ids += [p.id for p in product.product_variant_ids]
variant_available= self.pool['product.product']._product_available(cr, uid, var_ids, context=context)
for product in product_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):
prod = self.pool.get("product.product")
res = []
for field, operator, value in domain:
#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
product_variant_ids = prod.search(cr, uid, domain, context=context)
return [('product_variant_ids', 'in', product_variant_ids)]
def _product_available_text(self, cr, uid, ids, field_names=None, arg=False, context=None):
res = {}
@@ -372,13 +404,13 @@ class product_template(osv.osv):
# fnct_search=_search_product_quantity, type='float', string='Quantity On Hand'),
# 'delivery_count': fields.function(_product_available, multi='qty_available',
# 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'),
'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'),
'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'),
'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'),
'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 = {
'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),
'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),
'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),
@@ -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."),
'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_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."),
'location_id': fields.many2one('stock.location', 'Source Location', required=True, select=True, auto_join=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_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"),
@@ -2587,7 +2589,7 @@ class stock_inventory(osv.osv):
:rtype: list of tuple
"""
#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')
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
@@ -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."),
'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'),
'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"),
}
@@ -2742,25 +2747,11 @@ class stock_inventory(osv.osv):
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
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
vals = self._get_inventory_lines(cr, uid, inventory, context=context)
for product_line in vals:
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)})
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):
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 = {
'inventory_id': fields.many2one('stock.inventory', 'Inventory', ondelete='cascade', 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),
'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),
'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'),
'product_name': fields.related('product_id', 'name', type='char', string='Product Name', store={
'product.product': (_get_product_name_change, ['name', 'default_code'], 20),
@@ -2843,7 +2848,7 @@ class stock_inventory_line(osv.osv):
}
_defaults = {
'product_qty': 1,
'product_qty': 0,
}
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
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):
stock_move_obj = self.pool.get('stock.move')
diff = inventory_line.theoretical_qty - inventory_line.product_qty
@@ -2884,26 +2920,11 @@ class stock_inventory_line(osv.osv):
vals['product_uom_qty'] = diff
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):
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 {}
# Should be left out in next version
def on_change_product_id(self, cr, uid, ids, product, uom, theoretical_qty, context=None):
""" Changes UoM
@param location_id: Location id
@@ -2911,8 +2932,6 @@ class stock_inventory_line(osv.osv):
@param uom: UoM product
@return: Dictionary of changed values
"""
if ids and theoretical_qty:
return self.restrict_change(cr, uid, ids, theoretical_qty, context=context)
if not product:
return {'value': {'product_uom_id': False}}
obj_product = self.pool.get('product.product').browse(cr, uid, product, context=context)
+11 -11
View File
@@ -58,7 +58,7 @@
</field>
</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="model">stock.inventory</field>
<field name="arch" type="xml">
@@ -112,10 +112,10 @@
<group>
<field name="date"/>
<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="lot_id" attrs="{'invisible': [('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="package_id" attrs="{'invisible': [('filter', '!=', 'pack')]}" groups="stock.group_tracking_lot"/>
<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')], 'required': [('filter', '=', 'lot')]}" groups="stock.group_production_lot" />
<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')], 'required': [('filter', '=', 'pack')]}" groups="stock.group_tracking_lot"/>
</group>
</group>
<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"/>
<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">
<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_uom_id" groups="product.group_uom" on_change="restrict_change(theoretical_qty)"/>
<field domain="[('usage','=','internal')]" name="location_id" groups="stock.group_locations" on_change="restrict_change(theoretical_qty)"/>
<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="package_id" on_change="restrict_change(theoretical_qty)" groups="stock.group_tracking_lot"/>
<field name="partner_id" on_change="restrict_change(theoretical_qty)" groups="stock.group_tracking_owner"/>
<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" string="UoM" on_change="onchange_createline(location_id, product_id, product_uom_id, package_id, prod_lot_id, partner_id)"/>
<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="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" 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="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="product_qty" string="Real Quantity"/>
<field name="state" invisible="True"/>
+1 -4
View File
@@ -172,10 +172,7 @@ class stock_picking(osv.osv):
if partner.picking_warn == 'block':
return {'value': {'partner_id': False}, 'warning': warning}
result = {}
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']
result = {'value': {}}
if warning:
result['warning'] = warning
+7 -5
View File
@@ -59,15 +59,17 @@
</notebook>
</field>
</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="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//sheet/group/group/field[@name='partner_id']" position="replace">
<field name="partner_id" on_change="onchange_partner_id(partner_id)" />
</xpath>
<field name="partner_id" position="attributes">
<attribute name="on_change">onchange_partner_id(partner_id)</attribute>
</field>
</field>
</record>
</data>
</openerp>
+3 -3
View File
@@ -61,7 +61,7 @@
<li class="list-group-item">Loops</li>
<li class="list-group-item">Arrays</li>
</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>
@@ -227,7 +227,7 @@
<li class="list-group-item">Loops</li>
<li class="list-group-item">Arrays</li>
</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>
@@ -405,7 +405,7 @@
<li class="list-group-item">Loops</li>
<li class="list-group-item">Arrays</li>
</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>
+2 -1
View File
@@ -153,7 +153,6 @@ class website_sale(http.Controller):
('description_sale', 'ilike', srch), ('product_variant_ids.default_code', 'ilike', srch)]
if category:
domain += [('public_categ_ids', 'child_of', int(category))]
attrib_list = request.httprequest.args.getlist('attrib')
attrib_values = [map(int,v.split("-")) for v in attrib_list if v]
attrib_set = set([v[1] for v in attrib_values])
@@ -188,6 +187,8 @@ class website_sale(http.Controller):
if category:
category = pool['product.public.category'].browse(cr, uid, int(category), context=context)
url = "/shop/category/%s" % slug(category)
if attrib_list:
post['attrib'] = attrib_list
style_obj = pool['product.style']
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
: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:
Scaffolding
@@ -347,3 +355,4 @@ to that file.
http://www.postgresql.org/docs/9.2/static/libpq-connect.html#AEN38208
.. _Werkzeug's proxy support:
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:
the version of wkhtmltopdf_ available in debian repositories does
not support headers and footers so it can not be installed
automatically. Use the version available on
`the wkhtmltopdf download page`_.
automatically. The recommended version is 0.12.1 and is available on
`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
'''''''''''''
+2 -2
View File
@@ -152,8 +152,8 @@ class res_partner_bank(osv.osv):
'name': '/'
}
def fields_get(self, cr, uid, allfields=None, context=None):
res = super(res_partner_bank, self).fields_get(cr, uid, allfields=allfields, context=context)
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, write_access=write_access, attributes=attributes)
bank_type_obj = self.pool.get('res.partner.bank.type')
type_ids = bank_type_obj.search(cr, uid, [])
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),
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
res.config.installer doesn't handle uninstallations of already
installed addons
"""
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):
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]
values[f] = selected and selected[-1] or False
def fields_get(self, cr, uid, allfields=None, context=None, write_access=True):
res = super(users_view, self).fields_get(cr, uid, allfields, context, write_access)
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, attributes)
# add reified groups fields
for app, kind, gs in self.pool['res.groups'].get_groups_by_application(cr, uid, context):
if kind == 'selection':
+5 -3
View File
@@ -112,16 +112,18 @@ class template(object):
"""
# overwrite with local
for path, content in self.files():
_, ext = os.path.splitext(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)
destdir = os.path.dirname(dest)
if not os.path.exists(destdir):
os.makedirs(destdir)
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)
else:
env.from_string(content)\
@@ -7,13 +7,17 @@
'version': '1.0',
'depends': ['website'],
# templates, pages, and snippets
# templates
'data': [
'views/pages.xml',
'views/options.xml',
'views/snippets.xml',
],
# demo pages
'demo': [
'demo/pages.xml',
],
# Your information
'author': "Your Company",
'website': "",
+2 -2
View File
@@ -561,7 +561,7 @@ class JsonRequest(WebRequest):
start_time = time.time()
_, start_vms = 0, 0
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:
rpc_request.debug('%s: %s %s, %s',
endpoint, model, method, pprint.pformat(args))
@@ -572,7 +572,7 @@ class JsonRequest(WebRequest):
end_time = time.time()
_, end_vms = 0, 0
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)' % (
endpoint, model, method, end_time - start_time, start_vms / 1024, end_vms / 1024, (end_vms - start_vms)/1024)
if rpc_response_flag: