[MERGE] forward port of branch 8.0 up to dc41a9b
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 < 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"/>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
'''''''''''''
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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':
|
||||
|
||||
@@ -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)\
|
||||
|
||||
+6
-2
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user