From 2374237bf1617973e75fffe765cebafa6c1d9274 Mon Sep 17 00:00:00 2001 From: Kevin Khao Date: Tue, 11 Feb 2020 11:31:35 +0100 Subject: [PATCH] [MIG][12.0] product_profile_example: Migration to 12.0 --- product_profile_example/README.rst | 3 +- product_profile_example/__manifest__.py | 10 +- .../demo/product.profile.csv | 20 -- .../demo/product_product.xml | 12 + .../demo/product_product_demo.xml | 22 -- .../demo/product_profile.xml | 57 +++++ product_profile_example/models/__init__.py | 2 +- .../models/{profile.py => product_profile.py} | 2 +- .../static/description/icon.png | Bin 3655 -> 9455 bytes .../description/product_profile_icon.png | Bin 0 -> 3655 bytes product_profile_example/tests/test_profile.py | 220 ++++++++++++++---- 11 files changed, 251 insertions(+), 97 deletions(-) delete mode 100644 product_profile_example/demo/product.profile.csv create mode 100644 product_profile_example/demo/product_product.xml delete mode 100644 product_profile_example/demo/product_product_demo.xml create mode 100644 product_profile_example/demo/product_profile.xml rename product_profile_example/models/{profile.py => product_profile.py} (93%) create mode 100644 product_profile_example/static/description/product_profile_icon.png diff --git a/product_profile_example/README.rst b/product_profile_example/README.rst index 2c862f3ce24..9d8803627ef 100644 --- a/product_profile_example/README.rst +++ b/product_profile_example/README.rst @@ -14,7 +14,7 @@ See its description. Configuration ============= -Optionnaly: +Optionally: * Settings > Configuration > General Settings: check 'Display fields in Profile' and apply (only if you want display hidden fields set by profile git ) @@ -39,6 +39,7 @@ Contributors ------------ * David BEAL +* Kevin KHAO Maintainer ---------- diff --git a/product_profile_example/__manifest__.py b/product_profile_example/__manifest__.py index 576ce054781..c6a5eb6a6e1 100644 --- a/product_profile_example/__manifest__.py +++ b/product_profile_example/__manifest__.py @@ -2,14 +2,14 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { + "license": "AGPL-3", "name": "Product Profile Example", "summary": "Product Profile Use Case", - "version": "10.0.1.0.1", + "version": "12.0.1.0.0", "author": "Akretion, Odoo Community Association (OCA)", "category": "product", - "depends": ["product_profile", "purchase", "point_of_sale", "mrp",], - "website": "http://www.akretion.com/", - "demo": ["demo/product.profile.csv", "demo/product_product_demo.xml",], + "depends": ["product_profile", "purchase_stock", "point_of_sale", "mrp"], + "website": "https://github.com/oca/product-attribute", + "demo": ["demo/product_profile.xml", "demo/product_product.xml"], "installable": True, - "license": "AGPL-3", } diff --git a/product_profile_example/demo/product.profile.csv b/product_profile_example/demo/product.profile.csv deleted file mode 100644 index 0a7c0330c08..00000000000 --- a/product_profile_example/demo/product.profile.csv +++ /dev/null @@ -1,20 +0,0 @@ -id,name,type,sale_ok,purchase_ok,profile_default_categ_id/id,available_in_pos,profile_default_route_ids/id,explanation -own,My Own Type Saleable,product,1,0,product.product_category_all,1,purchase.route_warehouse0_buy,"- My own type -- Saleable product -- Not purchasable" -consu_prof,Consumable,consu,1,0,product.product_category_all,0,purchase.route_warehouse0_buy,"- Consumable" -pos_pu_prof,POS & purchase,product,1,1,product.product_category_all,1,purchase.route_warehouse0_buy,"- Product in POS -- Product purchasable" -manuf_prof,Manufacturing TO,product,1,0,product.product_category_5,1,"mrp.route_warehouse0_manufacture,stock.route_warehouse0_mto","- Manufacturing Product -- Make to order product -- Not purchaseable -- Display on POS" -any_prof,Weird profile,product,0,1,product.product_category_all,1,,"- Purchasable -- Display on POS -- Not Saleable" -complete_prof,Complete profile,product,1,1,product.product_category_all,1,"mrp.route_warehouse0_manufacture,stock.route_warehouse0_mto,purchase.route_warehouse0_buy","- Stockable product -- Saleable -- Purchasable -- Available in POS -- MTO -- Manufacturable" diff --git a/product_profile_example/demo/product_product.xml b/product_profile_example/demo/product_product.xml new file mode 100644 index 00000000000..ee5f9098183 --- /dev/null +++ b/product_profile_example/demo/product_product.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/product_profile_example/demo/product_product_demo.xml b/product_profile_example/demo/product_product_demo.xml deleted file mode 100644 index 5fe546c52ce..00000000000 --- a/product_profile_example/demo/product_product_demo.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/product_profile_example/demo/product_profile.xml b/product_profile_example/demo/product_profile.xml new file mode 100644 index 00000000000..8921582698f --- /dev/null +++ b/product_profile_example/demo/product_profile.xml @@ -0,0 +1,57 @@ + + + + + My Own Type Saleable + product + True + False + + True + + - My own type +- Saleable product +- Not purchasable + + + + Complete Profile + product + True + True + + True + + - Stockable product +- Saleable +- Purchasable +- Available in POS +- MTO +- Manufacturable + + + + Manufacturing TO + product + True + False + + True + + - Manufacturing Product +- Make to order product +- Display on POS + + + + Consumable + consu + True + False + + False + Consumable + + + + diff --git a/product_profile_example/models/__init__.py b/product_profile_example/models/__init__.py index 37f3cd0267b..e923f538423 100644 --- a/product_profile_example/models/__init__.py +++ b/product_profile_example/models/__init__.py @@ -1,4 +1,4 @@ # © 2015 David BEAL @ Akretion # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from . import profile +from . import product_profile diff --git a/product_profile_example/models/profile.py b/product_profile_example/models/product_profile.py similarity index 93% rename from product_profile_example/models/profile.py rename to product_profile_example/models/product_profile.py index e735e59b369..c303565dd35 100644 --- a/product_profile_example/models/profile.py +++ b/product_profile_example/models/product_profile.py @@ -24,5 +24,5 @@ class ProductProfile(models.Model): "whether it will be bought, manufactured, MTO/MTS,...", ) profile_default_categ_id = fields.Many2one( - "product.category", string="Default category" + "product.category", string="Default category", required=True ) diff --git a/product_profile_example/static/description/icon.png b/product_profile_example/static/description/icon.png index 7c8b3dc5563dcf86a77af97366b723c902e070b5..3a0328b516c4980e8e44cdb63fd945757ddd132d 100644 GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 3655 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 QB_ENtx{g}8igozE0D`>^ga7~l diff --git a/product_profile_example/static/description/product_profile_icon.png b/product_profile_example/static/description/product_profile_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8b3dc5563dcf86a77af97366b723c902e070b5 GIT binary patch literal 3655 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 QB_ENtx{g}8igozE0D`>^ga7~l literal 0 HcmV?d00001 diff --git a/product_profile_example/tests/test_profile.py b/product_profile_example/tests/test_profile.py index 6983a568930..d4f28fe9bfd 100644 --- a/product_profile_example/tests/test_profile.py +++ b/product_profile_example/tests/test_profile.py @@ -7,23 +7,57 @@ class TestProductProfile(TransactionCase): def setUp(self): super(TestProductProfile, self).setUp() + self._setup_obj_data() + self._setup_profile_data() + + def _setup_obj_data(self): + self.tmpl_m = self.env["product.template"] self.prd_m = self.env["product.product"] - # product 'HDD SH-2' in demo data - self.hard_disc_prd = self.env.ref("product.product_product_17") - self.my_own_profile = self.env.ref("product_profile_example.own") - self.manufacturing_prof = self.env.ref( - "product_profile_example.manuf_prof" - ) + # misc + self.desk_combination_prd = self.env.ref("product.product_product_3") self.analysis_tmpl = self.env.ref( - "point_of_sale.partner_product_7_product_template" + "product.expense_hotel_product_template" ) - self.analysis_prd = self.env.ref("point_of_sale.partner_product_7") + self.analysis_prd = self.env.ref("product.expense_hotel") self.theoritical_categ_id = self.env.ref("product.product_category_5") self.categ = self.env.ref("product.product_category_3") - def test_check_hard_disc_product(self): + def _setup_profile_data(self): + self.profile_own = self.env.ref("product_profile_example.profile_own") + self.profile_own_nondefaults = { + "type": "product", + "sale_ok": True, + "purchase_ok": False, + "available_in_pos": True, + } + self.profile_own_defaults = { + "categ_id": self.env.ref("product.product_category_all"), + "route_ids": self.env.ref("purchase_stock.route_warehouse0_buy"), + } + self.profile_complete = self.env.ref( + "product_profile_example.profile_complete" + ) + self.profile_complete_nondefaults = { + "type": "product", + "sale_ok": True, + "purchase_ok": True, + "available_in_pos": True, + } + self.profile_complete_defaults = { + "categ_id": self.env.ref("product.product_category_all"), + "route_ids": [ + self.env.ref("mrp.route_warehouse0_manufacture") + + self.env.ref("stock.route_warehouse0_mto") + + self.env.ref("purchase_stock.route_warehouse0_buy") + ], + } + self.profile_manuf = self.env.ref( + "product_profile_example.profile_manuf" + ) + + def test_check_desk_combination_product(self): # check route_ids - real_routes = [x.id for x in self.hard_disc_prd.route_ids] + real_routes = [x.id for x in self.desk_combination_prd.route_ids] theoritical_routes = [ self.env.ref("mrp.route_warehouse0_manufacture").id, self.env.ref("stock.route_warehouse0_mto").id, @@ -34,56 +68,148 @@ def test_check_hard_disc_product(self): # check categ_id theoritical_categ_id = self.theoritical_categ_id self.assertEqual( - self.hard_disc_prd.categ_id.id, theoritical_categ_id.id + self.desk_combination_prd.categ_id.id, theoritical_categ_id.id ) - def test_create_product(self): - name = "only name is specified" - vals = {"profile_id": self.my_own_profile.id, "name": name} - new_product = self.prd_m.create(vals) - new_product._onchange_from_profile() - count_prd = self.prd_m.search([("name", "=", name)]) + def test_on_create_template_with_profile(self): + """Creating a product with a profile applies all the profile's values""" + name = "template with 'own' profile" + vals = {"profile_id": self.profile_own.id, "name": name} + new_tmpl = self.tmpl_m.create(vals) + count_tmpl = self.tmpl_m.search([("name", "=", name)]).ids + self.assertEqual(len(count_tmpl), 1) + # test all values from profile are applied + for key in self.profile_own_nondefaults: + self.assertEqual( + self.profile_own_nondefaults[key], getattr(new_tmpl, key) + ) + for key in self.profile_own_defaults: + self.assertEqual( + self.profile_own_defaults[key], getattr(new_tmpl, key) + ) + + def test_on_create_product_with_profile(self): + """Creating a product with a profile applies all the profile's values""" + name = "product with 'own' profile" + vals = {"profile_id": self.profile_own.id, "name": name} + new_prd = self.prd_m.create(vals) + count_prd = self.prd_m.search([("name", "=", name)]).ids self.assertEqual(len(count_prd), 1) + # test all values from profile are applied + for key in self.profile_own_nondefaults: + self.assertEqual( + self.profile_own_nondefaults[key], getattr(new_prd, key) + ) + for key in self.profile_own_defaults: + self.assertEqual( + self.profile_own_defaults[key], getattr(new_prd, key) + ) + + def test_on_set_tmpl_profile(self): + """Test that setting a profile impacts: + - nondefaults in every case + - defaults only if there was no profile previously""" + + # set profile to "own" + vals = {"profile_id": self.profile_own.id} + self.analysis_tmpl.write(vals) + self.assertEqual(self.analysis_tmpl.profile_id, self.profile_own) + for key in self.profile_own_nondefaults: + self.assertEqual( + self.profile_own_nondefaults[key], + getattr(self.analysis_tmpl, key), + ) + for key in self.profile_own_defaults: + self.assertEqual( + self.profile_own_defaults[key], + getattr(self.analysis_tmpl, key), + ) + + # get vals on the template + defaults_keys = self.profile_own_defaults.keys() + defaults_tmpl_vals = { + key: self.analysis_tmpl[key] for key in defaults_keys + } - def test_write_template(self): - vals = {"profile_id": self.my_own_profile.id} + # set profile to "complete_prof" + vals = {"profile_id": self.profile_complete.id} self.analysis_tmpl.write(vals) - self.assertEqual(self.analysis_tmpl.profile_id, self.my_own_profile) + self.assertEqual(self.analysis_tmpl.profile_id, self.profile_complete) + for key in self.profile_complete_nondefaults: + self.assertEqual( + self.profile_complete_nondefaults[key], + getattr(self.analysis_tmpl, key), + ) + for key in self.profile_own_defaults: + self.assertEqual( + defaults_tmpl_vals[key], getattr(self.analysis_tmpl, key) + ) - def test_write_product(self): - vals = {"profile_id": self.my_own_profile.id} + def test_on_set_prd_profile(self): + """Test that setting a profile impacts: + - nondefaults in every case + - defaults only if there was no profile previously""" + + # set profile to "own" + vals = {"profile_id": self.profile_own.id} + self.analysis_prd.write(vals) + self.assertEqual(self.analysis_prd.profile_id, self.profile_own) + for key in self.profile_own_nondefaults: + self.assertEqual( + self.profile_own_nondefaults[key], + getattr(self.analysis_prd, key), + ) + for key in self.profile_own_defaults: + self.assertEqual( + self.profile_own_defaults[key], getattr(self.analysis_prd, key) + ) + + # get vals on the products + defaults_keys = self.profile_own_defaults.keys() + defaults_prd_vals = { + key: self.analysis_tmpl[key] for key in defaults_keys + } + + # set profile to "complete_prof" + vals = {"profile_id": self.profile_own.id} self.analysis_prd.write(vals) - self.assertEqual(self.analysis_prd.profile_id, self.my_own_profile) + self.assertEqual(self.analysis_prd.profile_id, self.profile_own) + for key in self.profile_complete_nondefaults: + self.assertEqual( + self.profile_own_nondefaults[key], + getattr(self.analysis_prd, key), + ) + for key in self.profile_complete_defaults: + self.assertEqual( + defaults_prd_vals[key], getattr(self.analysis_prd, key) + ) + + def test_on_write_profile_nondefaults(self): + """Writing on non-default profile fields should propagate + changes on products""" + product = self.env["product.product"].search( + [("profile_id", "=", self.profile_manuf.id)] + )[0] + self.profile_manuf.write({"purchase_ok": False}) + self.assertEqual(product.purchase_ok, False) + + def test_on_write_profile_defaults(self): + """Writing on default profile fields should not propagate + changes on products""" + product = self.env["product.product"].search( + [("profile_id", "=", self.profile_manuf.id)] + )[0] + self.profile_manuf.write({"profile_default_categ_id": self.categ.id}) + self.assertNotEqual(product.categ_id, self.categ) def test_product_tmpl_fields_view_get(self): + # test search filters loaded view_id = self.env.ref("product.product_template_search_view").id - res = self.hard_disc_prd.fields_view_get( + res = self.desk_combination_prd.fields_view_get( view_id=view_id, view_type="search" ) self.assertTrue( - 'string="My Own Type Saleable"' in res["arch"], + b'string="My Own Type Saleable"' in res["arch"], 'string="My Own Type Saleable" must be in ' "fields_view_get() output", ) - - def test_impact_write_profile_model(self): - """If profile is updated, products must be written too - on profile depends fields""" - self.manufacturing_prof.write({"type": "consu"}) - product = self.env["product.product"].search( - [("profile_id", "=", self.manufacturing_prof.id)] - )[0] - self.assertEqual(product.type, "consu") - - def test_default_behavior(self): - """Check if field prefixed with default_profile - have a default behavior on field values""" - categ = self.categ - consu_profile = self.env.ref("product_profile_example.consu_prof") - vals = { - "profile_id": consu_profile.id, - "categ_id": categ.id, - "name": "Product with modified category", - } - new_product = self.prd_m.create(vals) - self.assertEqual(new_product.categ_id, categ)