From cb5e35ad0595e4f3b8cd087d554cb4180fbd309e Mon Sep 17 00:00:00 2001 From: Nicolas Mac Rouillon Date: Tue, 7 Apr 2015 13:48:42 -0300 Subject: [PATCH] IMP report by price_template and category Public --- .../product_catalog.py | 31 ++++++----- .../product_catalog.xml | 1 + .../report/.~lock.product_catalog_simple.odt# | 1 + .../report/product_catalog_parser.py | 42 +++++++++------ .../report/product_catalog_simple.odt | Bin 20535 -> 23839 bytes report_category_public/__init__.py | 3 ++ report_category_public/__openerp__.py | 30 +++++++++++ report_category_public/product_catalog.py | 49 ++++++++++++++++++ report_category_public/product_catalog.xml | 19 +++++++ 9 files changed, 147 insertions(+), 29 deletions(-) create mode 100644 product_catalog_aeroo_report/report/.~lock.product_catalog_simple.odt# create mode 100755 report_category_public/__init__.py create mode 100755 report_category_public/__openerp__.py create mode 100755 report_category_public/product_catalog.py create mode 100755 report_category_public/product_catalog.xml diff --git a/product_catalog_aeroo_report/product_catalog.py b/product_catalog_aeroo_report/product_catalog.py index 7dc379e8..e0273fc0 100755 --- a/product_catalog_aeroo_report/product_catalog.py +++ b/product_catalog_aeroo_report/product_catalog.py @@ -9,28 +9,35 @@ class product_catalog_report(models.Model): name = fields.Char( 'Name', required=True - ) + ) products_order = fields.Char( 'Products Order Sintax', help='for eg. name desc', required=False - ) + ) categories_order = fields.Char( 'Categories Order Sintax', help='for eg. name desc', - ) + ) include_sub_categories = fields.Boolean( 'Include Subcategories?', - ) + ) only_with_stock = fields.Boolean( 'Only With Stock Products?', - ) + ) + product_type = fields.Selection( + [('product.template', 'Product Template'), + ('product.product', 'Product')], 'Product Type', + required=True + ) report_xml_id = fields.Many2one( 'ir.actions.report.xml', 'Report XML', - domain=[('report_type','=','aeroo'),('model','=','product.product')], - context={'default_report_type': 'aeroo', 'default_model': 'product.product'}, + domain=[('report_type', '=', 'aeroo'), + ('model', '=', 'product.product')], + context={'default_report_type': 'aeroo', + 'default_model': 'product.product'}, required=True - ) + ) category_ids = fields.Many2many( 'product.category', 'product_catalog_report_categories', @@ -38,14 +45,14 @@ class product_catalog_report(models.Model): 'category_id', 'Product Categories', required=True - ) + ) pricelist_ids = fields.Many2many( 'product.pricelist', 'product_catalog_report_pricelists', 'product_catalog_report_id', 'pricelist_id', 'Pricelist', - ) + ) @api.multi def generate_report(self): @@ -54,13 +61,13 @@ def generate_report(self): self.ensure_one() context = self._context.copy() - category_ids = self.category_ids.ids if self.include_sub_categories: category_ids = self.env['product.category'].search( - [('id', 'child_of', category_ids)]).ids + [('id', 'child_of', category_ids)]).ids context['category_ids'] = category_ids + context['product_type'] = self.product_type context['pricelist_ids'] = self.pricelist_ids.ids context['products_order'] = self.products_order context['categories_order'] = self.categories_order diff --git a/product_catalog_aeroo_report/product_catalog.xml b/product_catalog_aeroo_report/product_catalog.xml index 8f3127f2..59106279 100755 --- a/product_catalog_aeroo_report/product_catalog.xml +++ b/product_catalog_aeroo_report/product_catalog.xml @@ -36,6 +36,7 @@ + diff --git a/product_catalog_aeroo_report/report/.~lock.product_catalog_simple.odt# b/product_catalog_aeroo_report/report/.~lock.product_catalog_simple.odt# new file mode 100644 index 00000000..029dea0a --- /dev/null +++ b/product_catalog_aeroo_report/report/.~lock.product_catalog_simple.odt# @@ -0,0 +1 @@ +,nico,nico,07.04.2015 13:08,file:///home/nico/.config/libreoffice/4; \ No newline at end of file diff --git a/product_catalog_aeroo_report/report/product_catalog_parser.py b/product_catalog_aeroo_report/report/product_catalog_parser.py index 69538a6b..9c392237 100755 --- a/product_catalog_aeroo_report/report/product_catalog_parser.py +++ b/product_catalog_aeroo_report/report/product_catalog_parser.py @@ -8,20 +8,24 @@ class Parser(report_sxw.rml_parse): - def __init__(self, cr, uid, name, context): super(Parser, self).__init__(cr, uid, name, context) lang = context.get('lang', 'es_ES') + self.product_type = context.get('product_type', 'product.product') pricelist_ids = context.get('pricelist_ids', []) pricelists = self.pool['product.pricelist'].browse( - cr, uid, pricelist_ids, context=context) + cr, uid, pricelist_ids, context=context) categories_order = context.get('categories_order', '') # Get categories ordered - categories = self.pool['product.category'] + category_type = context.get('category_type', False) + if category_type == 'public_category': + categories = self.pool['product.public.category'] + else: + categories = self.pool['product.category'] category_ids = context.get('category_ids', []) category_ids = categories.search( cr, uid, [('id', 'in', category_ids)], @@ -30,14 +34,13 @@ def __init__(self, cr, uid, name, context): cr, uid, category_ids, context=context) products = self.get_products(category_ids, context=context) - company_id = self.pool['res.users'].browse( cr, uid, [uid])[0].company_id - self.localcontext.update({ 'lang': lang, 'categories': categories, 'products': products, + 'product_type': self.product_type, 'company_logo': company_id.logo, 'pricelists': pricelists, 'today': time.localtime(), @@ -48,11 +51,13 @@ def __init__(self, cr, uid, name, context): }) def field_value_get(self, product, field, context=None): - # TODO hacer funcioal esto en el reporte ods. El problema es que deberiamos usar export_data en vez de read para poder elegir que ver del padre, por ejemplo "categ_id/name" + # TODO hacer funcioal esto en el reporte ods. El problema es que + # deberiamos usar export_data en vez de read para poder elegir que ver + # del padre, por ejemplo "categ_id/name" if not context: context = {} - product_obj = self.pool.get('product.product') + product_obj = self.pool.get(self.product_type) field_value = product_obj.read( self.cr, self.uid, [product.id], [field], context=context) return field_value[0].get(field, '') @@ -61,11 +66,10 @@ def get_price(self, product, pricelist, context=None): if not context: context = {} context['pricelist'] = pricelist.id - - product_obj = self.pool.get('product.product') - price = product_obj._product_price( - self.cr, self.uid, [product.id], False, False, context=context) - return price.get(product.id, 0.0) + product_obj = self.pool[self.product_type] + price = product_obj.browse( + self.cr, self.uid, [product.id], context=context).price + return price def get_products(self, category_ids, context=None): if not isinstance(category_ids, list): @@ -75,13 +79,17 @@ def get_products(self, category_ids, context=None): context = {} order = context.get('products_order', '') only_with_stock = context.get('only_with_stock', False) - - domain = [('categ_id', 'in', category_ids)] + category_type = context.get('category_type', False) + if category_type == 'public_category': + domain = [('public_categ_ids', 'in', category_ids)] + else: + domain = [('categ_id', 'in', category_ids)] if only_with_stock: - domain.append(('qty_available','>',0)) + domain.append(('qty_available', '>', 0)) - product_ids = self.pool.get('product.product').search(self.cr, self.uid, domain, order=order, context=context) + product_ids = self.pool[self.product_type].search( + self.cr, self.uid, domain, order=order, context=context) - products = self.pool.get('product.product').browse( + products = self.pool[self.product_type].browse( self.cr, self.uid, product_ids, context=context) return products diff --git a/product_catalog_aeroo_report/report/product_catalog_simple.odt b/product_catalog_aeroo_report/report/product_catalog_simple.odt index 044f1d6dda9e6743d7bce65a88c0c1323fa5a37d..92a1d02d3b69c03ccaefcda3de42d48760b4ff56 100755 GIT binary patch delta 19020 zcmcG#Wo({37`7K?rlw(LW@b*q%*@Q3yJ2X<4Kp{~Ff%m_Po6MC!_2&Q+pkH3@0&LN zuw}`*E=#uL(>{H)7C`2AK%%NDLc`!dKp;Rs;Dkgap(>#L*U0?BTpTFnfq*FGNwN|L zcpT-W#5H|$&T|oSh;)JuPeopT_XJpX9L`VLqD>t&P;I5LI{xfmHti#-#}?TcZ$Rwi zC(E|vMI?VU<0Z#1g?`3>q9Q_!g0$#+j6h#$pmHdgv!$Ba-~@que6*H~UMnj*xdj~K z+|1;!dOm!)Kt@KRRVMFSpT3veW_ox4RERIUTaOCF%_-b3oFR*X5;78KYS?RhI{N5Q zF?n$zI0d9#c2#wZgplM=UzGogAtw?e4NN%Fm_886?*_N2$Y1FykTWCm`b4+O?eOI! zwH^W-hG0KN*igJS`94Dh%S)6+=pMdy9-e*x^DholEf>R`=?6WVw$M1kstb;2kI;3d z(`hw4V!0;O|GtX_(9%Adx-@vt^s=`xN1b%QvE)+4Ec(iKy0PKd;j?y{tuwQRU;jEx z)RYvOu7N`j4JgNaOdqib$>|!)sN!sLOPxw5CeFEu?W`I>Q}c9EY&ZAH=SK+~x8s=r zKFSLRw&=7V*TRdQo;GRYt96%51oUfT=j4`Wz2Xmb(l~Jri`fj5?SHc3B*0`(`R1)1 z5+&QOz=1g2n>%96qpj@AD!#(`CY9oc44g#9=+ea%PjJ^WW9U|Bzg4r!6;NwIPVG>R z<>*q%(~Qqc*E8tbMpGfhraio(vDml*IcW1G31xbr1+Ip3%{fJL(d>DQRPT_II$kiR zIHAE;;YG_XS$X=q1%W*WU(i3VI!AF8A7ob%+I89GHLI0b>+T*=7jH`C816THHXxl* zLw64!eijxTQvBzif0 zs$2i*=8aVN^!H`xhu;l`ll>EJ63wv_G@%zumRF^fPIX^9WdR8l;OZ>W&)Ilza`6$O zRA{PIdu~*N6#dp`=)B zu{aM>CFt>EXzK$xNBP<=0&N@l_Sc0v`^}=Eg!l>4SI8PT6 zVz}%T-uVkjrVTE)C1GKe;DHXRQi>s0Sy?3-`jcvBK`3Ii(9sGs)Zj!B!zbot!NtWeOd4pAc(sNoWBReU1go%@obnG{!rt&OKPq! zreHU&x zg1<0<*St>Px8+S#MP2gxGj#8bQm$8EP-bE^PynEDU>yKN8 zYGuN-4VJ|Ii{?$?@k%QSx+pvM9C$HIt{vNpN}4iZk~vi5eUw$CvoL@$5r-{?%04gv z2;3bhRI;ZI_)~eV5MEZrkw7QPFA}h~eH6127KOa~G;p_h;3$NDa@(jf#cB)^U69Y* z%H$)sLu^HL-p9Cqm5slb9ViMxLtejK*}dP$ZJ^i?bSp96aarYC?%(}%JNjFz=|8jX zDb6{_^drMx4Lq9cG!b!jtuQ6qXaxBIl+Or7!-I70A4L5fZ&V8#N`;3hWOS&E@qXYE z=g!nIEr3sX9CeM2o<8>3OFJgvv3yYPJLmm{JA1wK=uMU6)4XQvo$a?~NcldNA8lye zwf#*?G`~ph)MCRwzCFo`zFoX0c#nP+T9D>|iJ~Wc|9d$c5c z8T`Tf?X;wu{wo*om!JKt#yQAXt2)5dtX%o$%;!>9LmN;jrCL}*Nx#?E6Vx;-(nNlL z9Ch*OR(4mxyS`ut7P&dwL*Xhq(|@;BHKGjsI;aLFlcXa7#dr z+(g86AD!jv>u%l`;Iv^vm&isglvcb=aeZC%kIxC)l1KwJNzhu5Xy9#pu8IG@>(a`P z2tjAS%=;vw+K}$B7TDq%NuC7fo};tWy$yl|MV|jcr(dpkTpIZ_gECecMtl7i(}i2V zDJ5}(#cbE)Yft}PuHW|80q2aO0Y@>OU6e$MqSsHw=iP(}q@teNzpu;l-hFA7v%l$`K0xs_>K0l5>pHdQn zk3@U#?_YtJtIo|A85HoxdzHz>@`p89MTl*6Bh#gk;hl6)R;fz*xOA~XN)InOiioh= zk*$$%mXTo^kmOS;IC8kwbF&W0J@0;gd;0;K1Ukj0wv!Do01RF&ccf(0HWWXn`_nrp zccRcq+iE)Bjlu|f>Rnvq=VX$vvw1y(-}*;6!K;f(->7nkqDR$(l?&cmQBXwK{VdCv zE{O0uzV(Utm|hs{RUMmd4^Peu`mg2%I^X0KqLNtxYTuA`n+0VfNiw=VCjuTHWd;(I zls5grX`6q?A6lsRZmraa;v&nCBd#SftpfWd87o6=3HYdEsYvn!7!aIhGhai$Q3=z*gPA8%Bb?&o>bT;jR*cD-;@ zNeN59QS!tj_-@~|+*DttLm2lCdFx|->p-XR^Wb9cW2@s_(xcJ?-JMKxC=AlyXDV?}=Xi7Y526-^D)zHPEbc*L}RHY9IUl z3GZeMc6iZmE~ORmYBLNNyUsj89%HZ509&|am$iwN_r(B~&SxVS`4FN7 z7bS~~t^CMCQss*z#B;15n}O^ow<0nJ3K z(;DomTbbrZUoA0NXyD-y9bfm<7*%A7PzYfD*lZ8P~J7u|W*hrb>W-*{Q%!6`PY zGT)?e)0ol~OnM0e%>AWa>fXEb{vAijKMIvkMjzQA3e_^C8wm+N;Ir>f^EoYzknvx-F7G8Qp^HH5+EN zQE}|b7!tKZ`?`^ONxPu(W&qy_;teQ1_(54t=FelO26YFHsG148@Y8J;zLl&I!l?-l zhO7%|9%MgfzpqZ~(nB%cxmbBlm>AQvf4Xv)`?GdhUu&^NESyQov`{_c7x`)fpvp%# zrZX{WEci!(KUH!{!tJy!D~m{8d#BtkdNmZiuXa~uDP`_hXcw~U@RL1(peaHxLEXiI>BSM%Wwt&B2o5_V65IqNGtdUn~iZZ9|&d;h}`3`1uHg|E+ zHU!ohgWndus4Vs*aq>9q%jMqitTKuBtm`#T#vNEE&qgvWI!5MooPs`e8xOhHS~+~< zXH9^a<8RZ4z7_wvN3S%p&x#7D4FflFC-j;xo}atA%1mgdnJXe6x3`7#X#)^nAz}S} zQxAZe#X@5oawA@cH8uew>sWwxdRyEank z+`Rh(*KRIatxYx^TadXPs%VLsb@t%gnW#SHa?Wi-_By|R@ik$-^QKYtN=;7V_0nlx zC(EC`@a0Y~qkNEmmDl`g;VB|{yv~9v))_#8;nL&Br+tSZg7>&x_19DDfYOJ2CDsQk zLxekUM%=wFeP;p9!57ij1QW4{+O5~wS9YU+@4+=$pPLD!9rsR`cOcX{@7%|=iZH;u z{kdWWcy^F5SPIyB?Lkn9DT>zMnoyk){rE1|dfDTNyKC-#?IdV0@|6;ssn|d}(OR?SV_`is z|9+THMx8rkkIAUUfG#47d*cLM_5_Iig?TC-n^CvWQa&#f5;7{HL2pIv)@%&_;&=-i zNF|_CN&WVw&`fXx8!6FG+3qOKZQnqI7~VPxHN$KL3Q=X~>paw}UE)^UYHeC4`57k# zJH*Ing-;`Hy7ji2zS?U18NXri`2l8~WJ-^W;$a~QI-d1BS8@StZodX_69c57mS3## zZn&j|?=nAcdxzc8nrxUdkvNWeglCx3=-d4RtgQ<*jZtYkA4J`NOpK1b0bJhh^T-LF z?8unCFI6?}sDD*x(XqKq8aNFY5T;_A!S7WERj+V35~AAGd9%Y29rc{4%5MLF_=M3= zC^P$D6I&08m%(BXX8g1~62N9kF5>DW@O*V`7h3X;)2KNG4ne)7jSfI<|J~k@V^jsSCwl2Zf86k#ccF4xrgp_zV;Dg zRJ`r{Z@m4I)TFI}@?-LCAXU@U@;v%V$C8*h|CSRgE}k?yFup>#7XSi%Esx3{KmP!G zrip3B%RWaPMwA!2yEC!it1C>hihq2+eqhZu9+kCM)KJpK;*cC6!l5y-lJhkd=US;v zh$R{}6CpoE>6%v<0*RW=1_AI#B=jgYbOfG4YpWV+aQO^r>^LBl_fp3^>g!N-(LW72 z`zsKoU@ppOx9KZoM=tQ-?J#Wp!;aC$=xr5Oe+jf>p}wVWZ1L}E%>Z*VE3(acs>Q+T z{Qjo=seKpH6-!l=U7-iQVWX8K!%A>VYk9z%w|WPzX3tF=AktdGwtg|>0$jo;eLg9V zA$<(fejJS*q6h8#AYHy48obet$8Cr41%HeV^x%C*Ci>S# zH|n7Lah!Dl7;nQDv~ZeMop)ysMsr4+@GemmpRMB;eYLI=OXf?ugV(YtXfe|Z7c3ih zOZdk5Z_@RTp(xI8SH%XWs=Zt%B`V7e7PjxLT%gqr&|ybqU%IS-$`rbq3X=rtKP`HWhdXP zr?$84*xV3B(I?;V&VIe<42bIMG-!49CTR5e(Rkf=rOSx!$1Zr(l1E1bczdt*9XmP6 z8{y{bPr}(MaDOY{9Gvybn*O04eOSblUV}3sfJK#I3>mb*MW^}sA#J| zF*!{wJr3NgAHjFY%6N8~i_?x{)-;=VfPLZt`XT4Bs_&OW9TZA@oEJ&)eM5hV#rzXb zPIu?8jc#|=aA#m@0bma@VZPQA-aOm56;s?L`XQ1ag)B*iWK8K}#Yz>_5XXgyB}V8F ziCGVC#laWDQmWw471ypl2CfbJlJ0>gc_b37t&I2-QwSwqO1<=pTm6V_-3fURvM zvp_#^`4zB~^CX=+A)>M@NtM%dFu@(vcoz?m{??S%3_so3Tj&gaI`eN>-}xFBXOy`b zAvfyAS3LW{p*lSZ#29pLCLt79sC#u+|0NURMkS`D*I3exMV!~H>ialJK;uU)2UjgM zJJ$q-Bblg~SY(`$-;9to zd^YsmIs-})*Q#c4M(K;9lQ_8;R#9cOf|u4(U^PHR5Zbd;$9veKK3(m!-=`jVE1keR zqokc$)!C`keABmZG9uLk7*^fWf`pk~HYjOBnNq7_s0J^7j^<^VM04IHBq*ONjEvky z5C*(jyMKjl#wJ|+8b(Lft6WXH+X(E?ok)pf?>}S48ZhCy{%jM)o_VTkr4eOD~Z~1qL?TBwQ#M|;iFlLm}If51FK)bJ=?88$enJr1IRuuCNM$#gJ{wOFqmPi2h}D=^=|sm*IPrG+ zB^d!hDlO~-+ z@f)p|b@GNip1o!Z7)m`02IWZ(bme+ec%2Q<~m?tk`A6E71Mer@NhO6S2E|o36QTW zuB^N*RWM;f8|e5g?6_oDohBGDYgoaRY|E%HFDJyWp*!~m^g~3XV=~DV-X5q^;Gd&* z4t`g40R<%@Cwd)}e*Y7>i#V8+ESX@|BSN~&PhOhV>Eb3LZXwrgAkaEc??Dd$V5v@{+l`;QQ)=vmA) zS~qfy!nPAb%o8E4W-xgvl=kir@wUnup!+B~I^6H~EN2ZwRM!RQ0W0{h*MM{quIcx0 zQl=|eOy*S7jIjwjd_=8Gl#KGq9;U*D+ve?3i6}8geFn6yLSjkVo^m)#=gqfl7|;Ss z*1t{x1tm~_h;Ho2HzO`)B03oAfuBZkEDO?LDY3*1G^DIreL7{c=-(B5%Aqnf^hkXC zt~5mAhD_2VP5jgHi_Jw$oK!WxIb;&c3O%?c%;m~xU~RF6gr)1P%`Jageb2N(PzU{b zXRN}^7nRZ|Duey14YHgQ(ulK5pgY3uiWPWfi+s z=!k%9E`x&9O6m9Jisv*9`{xd6nqOHslg=2N=5TwxIhm+uz>`<~7m{eDHJMutitm_x zI=wCxBS*aEz#BL^Ix)9lI_Dhb2d6Fg@*p#*Ype55N+6_hANUP-ab@b#9m4+i-teFc z^yvG#deh@>qg$r^@IGe4ISBks&N^ZJv)?TglrTqG9>#9jdds5B3hr&>U;Is zkxmM)N7v2r)MCr!)l|shs;wxAmn#5BHVC5 z!_V%qD?1kGHUG|(XBQfit21S^Dv8Ifp{Xt?|1?xSMo9efn1mRV)kHq316a>y6pP|b z5#!P4b2N2OG?v&X#MH>sCbT9*MK~%7sZB@ zZ`vfKMeVB2%Y{{MPqTU|1bo{L0Ywxzv-*Y}MIz?uqYm2*&9Wg&}O`r|NvM?Xvi_=O8Xd)~IuVHLu^7^;}fFOu}%!IsHF!F`k z@@n)%hZ5n=g1QfxU{nt(l0nSVSmkLw?v>w!f31#{!Ftx2lodR^q<4k|lpwJ^NJ*7> zLdqulER=X^e!MnRrjW2v3o3%evxsW;p&k~_WCa~=;=7WJ(y$NO>A8yvdpsVDxXMU& z49TErj+E0gi0PGUfZTaSSFJRnBiK%s(050UM-ijR+E$E_T1)X}sIq$4mjesO_ol=E z^i;|({?x=1?`o)&!1nuCzlX&G2Qe?aU-zfP zH!z}NNHuEr$I-fZ=wUyykp!7W#gmuNy-dp74HVhta zy#zxE?^F!edYx46dAYbs&-MJl+_tYZW%y@_lYP;W>H(2OM z8dk7n9#y&}AUyKQ;FVN{e}(OvCNFwaIn-7C9mHZMlTqe5Vff#5j&hD?)5f6o-_lui z3?$*6$hxElzI%~ADFS?%yI*Wc7*_*Dtd|zzRY?CI2>&&U(#m`qD`;J%9@VO3DrN@? z-|di!HJl$vIBsOw(9U|b`l)hQ8S}pzUDq8_H5nac0nFl}uiFWRrEQuz^iojDca68V z8%fI{lR|??I_ghLXewP+mQ2HQVmMQ5gE3lJOJ}ht;kJD7b!i@=LiKz^4?&+tlb085 zILmr!IztU-nbDB?*yB3{0V{$X28&|hLH>vQO6B^wW{8f?XDt+n zgUXD}8;-Wtx!VpQ_IXgoy`i-g8PT}>y<@2^_iQZ${F~=Cv!&NrT(^T#@r%R6gVa56TpJHD{9I7cE`)ZI3#;h0-g;SEqwU$;6(!~mV2 z$vwN3(8)tV58yd7;4Mm}NiKk)^z8Pf``Wv1-9is!kPXjvWY-%`Agqc6=y?drf zMPdc=81;xy1H-y>CE1J0qTSGd3^PUzdK)WLE_$;{WNyT!M$Niu-KOr^pk{(EXFcc{ z=V9$ut{$@3IMH7PcgNz)60HBWiIb`{b~pLCQdbo`Ss86efnXt_;FZVzmE@xK8!L51 znEA@89^r)7^!YXP>O&kOMu?q0N}K-{)|%COp5_Xvhur}Bj8i~8yu{+bs{smI06F21 z7#mb`xqTREWJ)N#BG_Wsodf@*VM8AIPN~u?#Ay@z=Q3#XnCz$}gb?mU!L@HH=C`^2 zc?bj>8D)K243G9N!k;5&E3J``IhIq(X1W)=z+Gf?f;E z-%DrKA#3LS;Q)%eol-7ga^smN4 z2cfM#LiQAxqLq5B58D8IKG56u?0j@CO;BaDtS5zJuyk&uQ;7{UDMvTk44Z6#*8cj} z$@ABu)-AHq=k*Ej~~j*RH!8T=C!?G;Lp*7WVM!{h-CFf zp6sWMFfkE+44rcuK%+2@V@a^3x6pD}t=UC;mT$PEmnu-8MD z6_|l^vZ-39SPiU$Q->LyjO5wzSEgUFAT7kUeH3w=VS@ksFIj@NCj5y=-LmRTGEE^{ z6aC%?pYxGJ{McHpdDcQ&F*PR9=0wO%A7ypVymIFA z_HQl1IL)+sct}*kBBCDV@}r_{PPbCl!OFh^BtjzG&xwnR1Io&g2-I~-aOFwtPF1T~ z2E~gyeoF(^NW)_i{B?xc(2lh%KeCVr=BD3|?qOFPZLX>j{FAW;B4sH1arK}trmxNA zWn+fj=^4SitSu-W|=tK zQ-3-l;52iCN%r_jWUZtHo3btuWxr4K8e-S2&(;C4?eOI`fWs}qoM*v|x}Lzj%BdqO zMY%SbF?og$XcIZL!F(6CzJ)^GKt1=soP;{4^u<2up4iBUz)l))bYduLUH7f|i&d#0&Xks-G-_|X3$!YetL=P$ zUo4>8+11)h2S&4LbdumAZm4Tu#esCr>4WdoYe6Ei!g=zxioJbK6}alFau?o3Hrzq4 zNP`qeXA}_Bg1-BWfUsdthuw;kb`Q_2RA$jptBg~1E^^`OO?`yi^7>TC6y|H+u8sU0 zUPRS`oYbI8tn7)y_-vs|H$DH#iOfA^Y72NvW}tE6L|;jwP*#k~8TkKg>ZOnAcSV!U z&&*CiZRDlGv1(_fl4}{HGN-#A5gFC`v)Hs>6$mxsc$mJFVt~~wM#RkaO+GDzT(?py zMFPfGGdD@9N1Mb!F|~9aC8p%9CyeoHmicIrnU4?t>bEX#bl26Dp2f50I;3rqIZq%F zs@o&8=t${5mHJ`Mq@@OSH`<(Afu-Qy)-(@gOPX-QA-0k;?QU$2wKUD`H`PQO{ zD~XtenZ|~R-3zPFc)b^E;U)gT{{Sqrq+sKBXx3mfz)_r#$>UGI*7o-k|1jgPGmVBc z3;+-Khm$$In*DQSg6pc489EdCSEu8&CZZdaz*^xSZWZ#mKpOYm#*2&y4qYW6Aa=CA zqjq9@WuBW9;TIj0=MkTOl$q6qxc#juI@X_%tD@#=4Pwil@#PUJFM;xG9_qan1Qot+ndOTzd9!Cr-xxW z-j74RXQjjKeqaKW8{m3(F# z(LYw8*2ha`z5OZZcS>@><5&PY{?9s`du#(ed5&|M&KPITUm9H#u0;kk&~%5HR8?qv z&)J)4UH0Pi0CY`nQxl(762ii{!R(aNdHbq@%)CZ$CV5OuYAG3OV%mw#dzE@jeU zw=62JrLrkV^W4((MvqNx9B(H0iKKn=c8pu(Xf?pxIkgyHEr}oM6bBfHEMq!Bh}k8x z-$QidNQd`_+E7R|<5FU=`+Jd>SFwH~*{Du|0n3ew~`@BQ!lffBEN*%{L9@ z6HAr3)aAeAm-5TLFgpbiqi88tg1qftt*fsE6H*srUJ*P6JI0`5*3H$V#CK#zYxVP~_+i#MyPV$1SjEvv_o3!_?&wn3reLn#WD#)|1*0Q?Z3KI3R zPELqZY~~^xDxfkm&C{X;bmK$p@rFP<8`{v_|BhDHu%T;h`af2mDz}s-@&7rsUR8FT zj4zMUd)wdT=U=Apb;-v{ z)D)L8sD%6_*5C%fB<1Gz4f5zCyAk@_v{hf*(Q40PJ@tKha?qaE|MLiu;7}#=7__m3 zOf;H5bbpF7W4vId(d#ca6TV>BRP1F{v-~=RuIFQO0X>7e>^sH zBv4ew=2U3MA{`+IlHow86V6y$h>(V1t2rADMVGfujZMap2FK;l zt$2w+L9^gQvq3#P))j2*=;qYC?=Q#H+7g9#+mREQ8H0S}^5Ny%_a?-E$3SbaY-nH4 zB1wE}%Hnm_>dv0O#K7JtZMtV57fCUug&r1ddOAwZ>^Y={wFwmoc@pmI7lPH8N{);_ zjiJ~RKac@#w;pw32Nha9b>3?1VXa?Rs3X|huA;dDiFTb*p3l@z>=N16J@X9}Jd3gI()fo*JVx$R+9ReX`6-n-%Xd*8$O z@MDUjd6J9>X1)}oKzB$(HTzTUz$XxQS9kI%G;RY)!P`$~N|eQ7>i?r zqn!h^*T;di1z)pwAw{piH_treSrV#7OD}t4#{E%m4Q?OL2bSWIeF->>YXbA!dQ24s zxenc-q(j4mgXDt)SR!b532Kql=5Dhq>|FAg`~NICl-H=6m)v&_#nms4y%8Rkx6iJA*W+$i(0 zLKsAzjoqIj-V^qMYjYOQ;CE^(nLs23bs4aay61Emh|15{8Pz6;-}bbxF`>m50u=GBA(~e*($w zX0DFL)vGIx$SGP8o+EML{3bv5CN-91{3E)~(;gNUxr<9w*5>_Mlm0vi);TJ)@TOe~ zu1%{j{xmFULgIjxA7Q^!t^W)9Y5lz*9CiMiY{B*LKh`Cvy7!xz>=Fg@gRzxojM3KT zw(iW*iGWwU*s2t(Yi7cZ>atQhH*G+4g?Pz~+alm}fjRp!PhG^FNA&A-&SL0h%bDMh zQ+TRfqWrPdOMn|kGaP$hJ+xlE*U&j@Ec$r;`@G$N<>Zo;-w6OSqwte>} z#I_z(tohMLpc61G^rSkVKncc4nR?~^HGs*B=ic3~^j>lCk5J%IoUnclaK z`nryi2aX(G`DeOV$}zNl5^ty+!bgWDeeHix`66B+d;c)S64^0)oEr7CxkQyLXtN)6 zbiW9=Bp2n1i^kUvpXZmesH5KBDT2mlTNYhlwduz(7f-E%W)5|PDC%lx(D@l1Mk$-K z9`EnaW@NE;3@0cIf09f_3<7%DON^p+!Z|jKu+R6<|Cg{yhL`+F(@J1D+PIAV#8ZDD z7L4Afj?ij~MDDeeGqv-SKwunwv9E=j)bFY-&&AHSs?HI0BaL%h#GE;b$Zj;!GCjPw zJzo#{o~50iEHnX_D z*BTAa_?2Q_h>IdMOm}HIAWV;$g~WZbUYM;Wn!vIJp#4u0IsXID&i^(9_`e5x{zt?7 zzm5X@Pf$kxe@q7We~Uc*e>553{~50O|0vV{c_QHdr+tNy@chZ%huY8`n2QVXUy+wq zma3I74gKGVI0OWQ|CNZ7fq+OEWF!C#PZQR7us(x>AdTY^fVp`dwgVt4eaQ+fd*v6<9-|+M?(Nbjt5mm zP81!Pd+k+@EY)PmKk1A1OvXaFW~;biR1Y=%q&RzqYCpw>qn78%$acDO#3twe`u)G9 z-ST;HH|4BfiK*j{v;-mmJR6S1T@yYOVUTXVtx^ys0(n{@SC zrv7;}Rd?>s_?5s|eE>H?(Y%!t;p=9anS3We*&JFWJj+YA;n;OY`>i3lUx&o)Dr z*1MtW=m^Q0E3d~E-eJQ2?SV#(n4$}g4YOJ;8JKJrd@~V!)bc#?B*9Sfp#*L3&OS#p zORyLBY7fl?vC&Y1BIEIxgYCn9u77R&mOMfRX?z5}-S#a-CUQds@d96`GfQ=pX?&~lEetBYgUdTfrgYN>ZqXW` zazc5St)t%bs3B{31c}p8J-3I+VbVK;@ zy_=DnY(+{+RX98YGaE?f!YR(X#$y0=R}~a$&eEId4gXE|R7E}XCL{k&rsm7VDwqBU zkLj3I0UGNU?yam>r~C5@+KY~)7I3@IsA-j5hM3PpauV7b=`d1UN74JE}5DI|BnjdjAya=6kAsv%Qd_I~$)V|IOe+UDz+_FNdDa6t!b;^Po4w8+F52CklkB#hk& zHzH;;j!>X>nZM-qa3cB1DUWapp~zl&!J?`@IAP7sqEsUo)&8m#~VMKy1RH z)3<{D?`tpoWJIo9P$b@p@Q>1>kHs|8Z>pVe$SeXP z<_)SdaaWr_tkOG^(*Ronxxx!AM!<&Lx$Wr!3%RFKYMfr<+H83-8#V(9jr)pgZc~rA zm8Ax2K4%F*)@$i!(_8XZF%FqzF;dE)lC}%iEzOtx&i=+rj;*+EvpT^JvaR#fz49|b zuAwmGn~kFtpUg{|FmadlZnCYo{Gjw#=jCqVB;*@lW542sw4 z85quZSQ7A-57w5h>P7aOayNfpEq8h`3K(JY;GW+j# zb#z$BO_agO0>Q`|g}41EX>)JMHjtutlILGTvKL5(@NJbJv;qR%y7+5bKyvB z(@dmfpjzqsmQ1(dZS-bOHi&M_{T%{W7Hm3$9H+ZQ%#QWfbKJkgoH8h7=cD}V)%mQVVf7K1m^7ZV1Q@7HB!MAy)-@^>k@a^tIF>_K0x_oK<>4H<5Xwx zx^dh1CobU0^h_q1QC%QPHBgDA?v%CO?%%)QuuQ}hdS!pTn~+hpl=MC3YwCDWVXDbr z%d27a?rH6I4Zr(k#p!YuzUHaW_2P;*u=}go?lP4X7BKwp@EX5` zWDT?zXi-HRRDy9PI`fWdJyu{f$JxH^J0#1l!J84V<#)|^esgJ1c}WqC99 zic>}z2j9zA!7a{VP$eQouFvlB3vqg<6I^j7=V>1sRo|ne$m@*^e`GAsj7YC;|7h;L zXC%^g`RM&Ayn3$Sbbj63u{j!BL(A`VTiYU6v6RtkMfVnzV!diaO{>D#Sas4%(Dp*A zstAveNM-o#6&?bjN(=(x{~#Aq;y6fwEss?`jNsm0ioM5Q;U!dNSOQ`S6RB`;a-2)N zW~>F0i~dyneE`7t)fTC(6mCOc$nDb%^GBnOYF2R|0?U>Wj18IO&$b*P zn3=)FXQ!*ehb7_oQK4}Aa5I81u0w*Kh14%UMbbO6x`PqasjL2SEoqIJ&uU=<+U$_+ zAJs43USRr(JSLd*#wb(!Z|cmc|8Ac*2tv)R2WHh;7)9lp>bhRyi~0`{q2G1Wuo&DknpPxxi{ep=<39qf8=g&}6uX z?wj9avIh&Lu2_>p^*iLhp27vyiNSB1@hvTtal4DlJZZ=TYvWUK-Q)MbxszMHU#7c< zS_MvO<+EJhvBz+Xu%ESH#rrx=J)*D2uQND;FgNE9BRuR6Vs?_`-{+>;MI5p_YEjJW z+)6lhOsyU-n)8IwjVaXkwMP0(T)!VK-)}0nFV_4apd_Hx6z9UA47P5snA`Tdjd#Ew zu$qMEb!97In(UIz&nn}9eFDa0)AFv}<2IuwBQaeG3pGJGknov+%u3rEWBCn-BsK|q z>pvp)k1LN_#<){~Xet)GjCM+^2HgT;L_^e_#|=CVCe+7>+681h_=;V5ay}*IM4m#f z#Th%_b^K>(&L$0Zbl2ST~7tj=#ib{$SyKwq`9yMx&Tm&$&|UHl1iz(@7T%}k(= zLKI;hN2tQVegp@YBUSbKs?HyABt54N#!{3u2$ZVV$`M=GE0j-Wsw< z{9e^LzuOCMMQo{--xaRTBpmIcLe(C@VX|bkfbngbYgl&lVeVUah3o#`bktX|>Y0Bk z8~9fDSY3KU52crvnuH?8tDxgA&cCz9f5k+?>X?X0(V*G@J(aVKaEfqZsAguy(WF$H z%ik};;v#fTeAgBr_g{|?%COtb1>|()M)7xN@r3@Db#IUhxO4K|<3HR7%9!hwj+eMT zVQTOY2?!Rd`ntdO#niihcI?l4!=U=vX62m^fp@3LuB%nai51{26jOP2FU5$Z@Rz}f zKTjrm1P27qWL2H{!?%8|Ze7?Go0<-YMT;TUpdn-fP--{^tshU5DKi+?=Ge$jj604(Bwp9C2MS_1(f}+X{XMK6~?A;L3FmhAF1A z_HrtnPIcZj$MD+}|7FizJ_juMc7WA+_TEF=-}J4}p3StCU+MaiKMOD07}cK&S+=mV z@Jv~oS^N3*+m77a&+HQ#QKNLtw|B4o%YdYgdW#N^-#s_fys`@G0;aE9a$)I?zxQ?a zr^meAwYur^zN>G8{TD7|S>o}F$+~9ll<;-ZF-BW$jwo(pzq9@D?A@-M90)PX-&-o3|MqFF*ZhVo&7SXSM>Ie5 z-bsA5^5AooB(?2jvW^D1rXN-wxcSn!f5n~KRS#N2>lB6JuFp9cr{z5PmsC#5lMcR% zi_gi|FVoO?UAyvUO7w>KEz^$58X0&emHYqTNS?-}|2KBZ-I%iD$-H&Tl=UKVAMq;s zwM;+o_tcp!j;3d))rGIFyShonx2u2Ghb3Vt(`KstU$^-|z|GwAd>l4+8zbxfc|PdK z-Q`q0L&0-$Z5=x<=S6x?yy$X4i_hh5&G2I&{W*F4YvGWEVC=#VM({>3FfZP{ zpl4mo<(FAYBv|)6a(3covS;A7HmS*8*?2cB$ZM@5v)xp=#{w;aGxmw^y3!N6-7Mjz zz>T&e0`DU~{5x0r>}@`u%+8}lyPSKKft<-zTh1jGq#oEc_vG#Dc4E&+O&vcg_ji!*k>?!yVZsfx{y17uqv-cqfabTSjcq z>^8pbFir0DmmOgrzfP#_y7=7SkJ<7)O6%BP=0|vY|+WDJC3>+Uix#o zB0%BO#QDEo{0ltsuISH1wc{#9W(PK2e5Jme&4uIIhky08>RQhhT0Z|jDfq~*Wzosi z+uQ=uukc!i-dVhA^09l9tveT~J=HoC8M0jQ&C**rClaojXqsl8TRrit-+GhiBN{VZ ztG3yg#;o@fJ3np9_3QInALcr*I9ute*2&!^6Jx7e@Y-DOA0sFod{&;h@+l(&0}Bgs zGGGRdCTu=v<-!AIaJbtrf*6w>JQXKG2{h${6Fv`I6NnLG&%jWeT2hjkmtKrbCoHT| zL4gH4ga`>Vx-u~2rj{gP(>7`U#4vuKO|lLQ3|vTh7#QZb11&76%t^&&-DFu`X{N`) zldXKEzyVa}C(Wc3I@!!iZt??vHh5TqgrhlP_?kgnhUg!C2Vq!ho%lJ$e_jm$CVI30>K2bqQfSa_$sMjQz(z3 zaAMfxpPtHED9*!U?zu3akJJ<(gIWlKP%UQ(pDgJqgXWF5KrdT`PtNla7Yp!aWdrFI N1i}Jfl+BC)@c`gD9tHpa delta 15618 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�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 diff --git a/report_category_public/__init__.py b/report_category_public/__init__.py new file mode 100755 index 00000000..82657b06 --- /dev/null +++ b/report_category_public/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +import product_catalog \ No newline at end of file diff --git a/report_category_public/__openerp__.py b/report_category_public/__openerp__.py new file mode 100755 index 00000000..1a53cc30 --- /dev/null +++ b/report_category_public/__openerp__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Report Category Public', + 'version': '1.0', + 'category': 'Aeroo Reporting', + 'sequence': 14, + 'summary': '', + 'description': """ +Report Category Public +============================ + """, + 'author': 'ADHOC', + 'website': 'www.adhoc.com.ar', + 'images': [ + ], + 'depends': [ + 'website_sale', + 'product_catalog_aeroo_report', + ], + 'data': ['product_catalog.xml' + ], + 'demo': [ + ], + 'test': [ + ], + 'installable': True, + 'auto_install': True, + 'application': False, +} +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/report_category_public/product_catalog.py b/report_category_public/product_catalog.py new file mode 100755 index 00000000..5d8f79c9 --- /dev/null +++ b/report_category_public/product_catalog.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +from openerp import fields, models, api + + +class product_catalog_report(models.Model): + _inherit = 'product.product_catalog_report' + + category_type = fields.Selection( + [('public_category', 'Public Category'), + ('accounting_category', 'Accounting Category')], 'Category Type', + required=True + ) + public_category_ids = fields.Many2many( + 'product.public.category', + 'product_catalog_report_categories_public', + 'product_catalog_report_id', + 'category_id', + 'Product Categories Public', + required=True + ) + + @api.multi + def generate_report(self): + """ Print the catalog + """ + self.ensure_one() + + context = self._context.copy() + if self.category_type == 'public_category': + category_ids = self.public_category_ids.ids + if self.include_sub_categories: + category_ids = self.env['product.public.category'].search( + [('id', 'child_of', category_ids)]).ids + else: + category_ids = self.category_ids.ids + if self.include_sub_categories: + category_ids = self.env['product.category'].search( + [('id', 'child_of', category_ids)]).ids + + context['category_ids'] = category_ids + context['category_type'] = self.category_type + context['product_type'] = self.product_type + context['pricelist_ids'] = self.pricelist_ids.ids + context['products_order'] = self.products_order + context['categories_order'] = self.categories_order + context['only_with_stock'] = self.only_with_stock + + return self.env['report'].with_context(context).get_action( + self, self.report_xml_id.report_name) diff --git a/report_category_public/product_catalog.xml b/report_category_public/product_catalog.xml new file mode 100755 index 00000000..c7d4f348 --- /dev/null +++ b/report_category_public/product_catalog.xml @@ -0,0 +1,19 @@ + + + + + Product Catalog Public Reports + product.product_catalog_report + + + + + + + + + + + + +