From 87c54a7bfef47f3455358868c786e2b043bfe008 Mon Sep 17 00:00:00 2001 From: Jairo Llopis Date: Mon, 30 May 2016 13:30:38 +0200 Subject: [PATCH] [8.0][ADD][website_snippet_mass_mailing_partner] Snippet + name Let you have the name field in the mass mailing subscription snippet. Leave most logic to base module. Make name field autofilled if user data is available. Add tour test. --- website_mass_mailing_name/README.rst | 67 +++++++++ website_mass_mailing_name/__init__.py | 5 + website_mass_mailing_name/__openerp__.py | 21 +++ .../controllers/__init__.py | 5 + website_mass_mailing_name/controllers/main.py | 22 +++ website_mass_mailing_name/i18n/es.po | 23 +++ .../static/description/icon.png | Bin 0 -> 14912 bytes .../src/css/website_mass_mailing_name.css | 9 ++ .../src/css/website_mass_mailing_name.css.map | 7 + .../src/css/website_mass_mailing_name.sass | 11 ++ .../src/js/website_mass_mailing_name.js | 61 ++++++++ .../src/js/website_mass_mailing_name.tour.js | 137 ++++++++++++++++++ website_mass_mailing_name/tests/__init__.py | 5 + website_mass_mailing_name/tests/test_ui.py | 15 ++ website_mass_mailing_name/views/assets.xml | 23 +++ website_mass_mailing_name/views/snippets.xml | 20 +++ 16 files changed, 431 insertions(+) create mode 100644 website_mass_mailing_name/README.rst create mode 100644 website_mass_mailing_name/__init__.py create mode 100644 website_mass_mailing_name/__openerp__.py create mode 100644 website_mass_mailing_name/controllers/__init__.py create mode 100644 website_mass_mailing_name/controllers/main.py create mode 100644 website_mass_mailing_name/i18n/es.po create mode 100644 website_mass_mailing_name/static/description/icon.png create mode 100644 website_mass_mailing_name/static/src/css/website_mass_mailing_name.css create mode 100644 website_mass_mailing_name/static/src/css/website_mass_mailing_name.css.map create mode 100644 website_mass_mailing_name/static/src/css/website_mass_mailing_name.sass create mode 100644 website_mass_mailing_name/static/src/js/website_mass_mailing_name.js create mode 100644 website_mass_mailing_name/static/src/js/website_mass_mailing_name.tour.js create mode 100644 website_mass_mailing_name/tests/__init__.py create mode 100644 website_mass_mailing_name/tests/test_ui.py create mode 100644 website_mass_mailing_name/views/assets.xml create mode 100644 website_mass_mailing_name/views/snippets.xml diff --git a/website_mass_mailing_name/README.rst b/website_mass_mailing_name/README.rst new file mode 100644 index 00000000..7a0a47b0 --- /dev/null +++ b/website_mass_mailing_name/README.rst @@ -0,0 +1,67 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=========================================== +Mass Mailing Subscription Snippet With Name +=========================================== + +This module extends the functionality of mass mailings to support asking for +the contact name directly in the subscription snippet. + +If you want to get partners created automatically and linked to the contacts, +you can additionally install the `mass_mailing_partner +`_ module. + +Usage +===== + +To use this module, you need to: + +#. Go to any website page. +#. Insert any structure block. +#. Insert the *Newsletter* block as you would usually, inside a structure one. +#. Choose the newsletter of your liking. +#. Press *Save*. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/186/8.0 + +Known issues / Roadmap +====================== + +* If you use Firefox, you could hit https://github.com/odoo/odoo/issues/7722. + Just use Chromium to work with this snippet until you update to Odoo 9.0. +* When migrating to v9, improve the tour test to check autofilling of inputs. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ + +* Jairo Llopis + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/website_mass_mailing_name/__init__.py b/website_mass_mailing_name/__init__.py new file mode 100644 index 00000000..6b59127e --- /dev/null +++ b/website_mass_mailing_name/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import controllers diff --git a/website_mass_mailing_name/__openerp__.py b/website_mass_mailing_name/__openerp__.py new file mode 100644 index 00000000..a547e36a --- /dev/null +++ b/website_mass_mailing_name/__openerp__.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Mass Mailing Subscription Snippet With Name", + "summary": "Ask for name when subscribing, and create and/or link partner", + "version": "8.0.1.0.0", + "category": "Website", + "website": "https://tecnativa.com/", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + "mass_mailing", + ], + "data": [ + "views/assets.xml", + "views/snippets.xml", + ], +} diff --git a/website_mass_mailing_name/controllers/__init__.py b/website_mass_mailing_name/controllers/__init__.py new file mode 100644 index 00000000..49478571 --- /dev/null +++ b/website_mass_mailing_name/controllers/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import main diff --git a/website_mass_mailing_name/controllers/main.py b/website_mass_mailing_name/controllers/main.py new file mode 100644 index 00000000..069de5d1 --- /dev/null +++ b/website_mass_mailing_name/controllers/main.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.addons.mass_mailing.controllers.main import MassMailController +from openerp.http import request, route + + +class MassMailingPartner(MassMailController): + @route() + def is_subscriber(self, *args, **kwargs): + """Get user name too.""" + result = super(MassMailingPartner, self).is_subscriber(*args, **kwargs) + email = result.get("email") or "" + if request.website.user_id != request.env.user: + name = request.env.user.name + else: + name, email = (request.env["mail.mass_mailing.contact"] + .get_name_email(email, context=request.context)) + result["name"] = name + result["email"] = email + return result diff --git a/website_mass_mailing_name/i18n/es.po b/website_mass_mailing_name/i18n/es.po new file mode 100644 index 00000000..414d9440 --- /dev/null +++ b/website_mass_mailing_name/i18n/es.po @@ -0,0 +1,23 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * website_mass_mailing_name +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-24 15:03+0000\n" +"PO-Revision-Date: 2016-05-24 17:04+0200\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: \n" +"Language: es\n" +"X-Generator: Poedit 1.8.7.1\n" + +#. module: website_mass_mailing_name +#: view:website:website.snippets +msgid "your name..." +msgstr "su nombre..." diff --git a/website_mass_mailing_name/static/description/icon.png b/website_mass_mailing_name/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b18b21a1f7fb7547bedeeb098bc451c9681d8f7a GIT binary patch literal 14912 zcmW+-1yEFN7rqNicQ4)2-3<#!NH@|TAR#RsONX=wNOz}F(hUj%f^>s)cf-HmKRb8t z%$+;)#yRgf&pFR?qczkNu+YiS0RX^KQk2tz-(mk}(2KchcOv9wKemrZv3#skNY z?#mMHcg@mv4OaXEKUAaV;di?LvZPkU86}$P>NuW_pN!p)3k!5W8bS+Iw+CP`2*HmA>s7xE7cvc^^t(9@ zw>G5SZbAVbvAR!yDioUgxodS~*j-~I*qjyig0Th#Ea)C)7Mniw^@d~A-*wz{i@XR^ zPXTLPphp~7ljO|PXTTi3E@X3T7&QO^0dnAxZ*}i};)}Pr&@L=4Cd}M40^&GpPJq$F z+zk%$f3rb_i2;vHuma2r?Q+7LfNMi`-#cqage!aJ&0C-uF!(dno1pM(=-so)7~8h> z^JjI*XnkUi`?}WWz6k&*1Nk72*Jn3vhiq)_ zJ<#VX15Ahph7wT9 zxSU)Uk9h^?gA8VdW~|H+ji2wvgJ$p=El&2$ez-B_yezKzVx4mjy1>WWXzqIA;Qa9~ zIg2PrSeNJBFs}dg_gr}y8PH6vS;9Ns`Nh5Pc#B&vU{7*}N*)-kt*!=6F@VkX%C72a zEOqf`VQfm#6tk`}*3QQ*uFW14>i#m#Ldo+q%*eiU9xLPsEb<85O1=EbN_}0aC0C5u ztNQEVD9UvoeULD{x659pv*mb>L`Tg^ZNQO3%ggh_pIWo7gajS=o@srvxJW8rR77OV z-6Q^G9%Pi8`fFyT|NJx*SR&znygpe?c&V;Fnm%pYuc$ojM#Rahsyf^yWtW2pIZ;$p zRGbcyJJWno-V&>pIs|Lwa=4_l!`J|oYpO)8jict3-kwmD3sY{ZLCnX0Oj0sFK0dWV zs-;tNZC+ga`}=i4FM$SGg)J?R!q@Tr@TF+HeYv9iHEG@-;VbkC4C<%IbZn;_UeZ9if9tkixsNSCa_JivPN3;3U{gpwBi$!MwDb5-% z(6w)MHuN22gP2Yz-s1V2j9*A-r}4JyEY5lD@ca0f-}ly5(WS@V&KnsHwF9{?=Olkm z7I%>2qfnu!9v+^S^D#uX<6?oxv8?Fa=gU%NcJ@&p=by=pw>Oziy(6E9dm7l` zt5EqZtuf9w2+;8h3e5W;(Yj13G0Dt+T>SwzA~WqpvmKCmyslyo(7Yjt`#?&bb0!S$r$ zW?MkGw(VFn%m4hRPlp1KhB$FQ_xJ~J!GqzSfZ(yn=4hcE?}z)i1PO_$x5e0*?n!&- z;&BV2nAb@}f&cA4dOY}y#cvPHHrFGm$9V25Dl1(#NKm~>NHE8+0_OVGs2 zbUTay6pIz}a35ZiA%jk#QyP;mGtWS5X-5Qd%eNU>%4UJqp6_xiD_Xm-TddJvtq8mKac!~YmQ*Ir>u+i z@a(UsCa$jaC$|o@9T7u0-U!2mC&ej=S_Q2Y)UV<)VR(HJva=o(??qr<%}#^y%Wa8* zSj;Lv@2XTY1=sT<1p0p$y*ApFhErVqV)z z=6}mHgo0)|9IMNilIa0=mpsbc>Hl~b5idBo*tr*`mTZWp>$M4U7O1#%X260y44 z;Bx!G``?*Dz3YfylLF8c=Iz#lU>rDaE$QWcd%E7T7J_jOG6!IG)L>Zh`7R51l=ig+ zjxq?>I~du@1vJ_B3E5tLp<8CLt+;dX{_&V=td{(_zY#?;POw|C_8<+fD=seX{ZE2B zv7Ib;Zg@~#txq%cMSGLR`5W)a*d>riF(TL(MtDvsQ zG#4EgGeOCYevN;CMMp8(M%JcRqmH0#zbDll73oUy`hoxI(FpVNgu7p0Jm6M z{9U8tH-(=82aYmM=f4=w(NjE_4GE6|I~H z5{mvuppuMo2OH}9p7yc?9FxYM_uh^k+9oQagguDrtB7@A(HH}flmJ}zpGuGtGE>7% z+Prp*#Vz|$RWb#CdpX|45E(Sue{sITpq=QdK)(q%F&#~Jo5Y*ObQ{yu(}|^i%58If z{%ZT+n4rRXUtXGXP8#s#%a?Qk2ffb4IDnhM+oi)1jU3T3mx!nFm7#Xbm^*U5gPwqQ ze*EsXU;cr4+^?beTalfgG8jM#Pe+c{*iV)V>j5TX0w<40X!Y~Z>{ z%+*IvNs41FNl!Zs_F% z)#HYHklTG*WmS3A$Si@;xpPk&Ez3R2XJ5tts)9>6LO1nH3jt+=n5+#m9a_L!VQF3; zUkByH72XlH>t*nN`eZiX6?9FnZ_Pbe*W5|v%we*R*xesZplM=4S*5Mfw|<(E-RAjW z_xQLI(=);ypFzj8>ID4f1;g24)u671@t0P+1}`gElLuxwMD7df=G(g9y!%U(jSS*m zGUSj1{>xY?mS0j*%zve@JeRHh`chU~>jk1ImXqO+$n3n-)k#VHQILx_k+b1lUPCZ) z<5|e@leSn+&I)2g)Wf)`tf7tPc?Q+8Jhs+fD<{e6TksNU$>YOB{A3nD}Pzsh`*M)yUnZNm&Tc&bEo$cInei(DQ8 z`t6F5P-E893>YPutSXZmZsKWhE> z-rnBrdq|QZSi3}}XJ5d?tEkG0 zju(BUk8wAJ)nRwAu~&0R$)JA2pP8A6Mu*vZ_8?VV*MWhwf|feerEk(eD^@VmOtWQx zHi9yZq8vc@`n{@wx8n!4m|pZj-7s1Pn&NKxovZ`}ss}{R=@TR?%zg+N8F{_Wg$*X9 zD4~{edP($nz_EL}i2JL-zkgvo5hiV(7V}f;&1q?AW(Ch9_PJ-Iw-LOQ%daj}dE3Wyx*rNjii;-Xky_q2%KOLT;lnH*U zot(f|IkyL&*P!Oo9|hEM1u#CpQtj=GKz13+w<9Y``47>Z-H@2ciBoy?5ug4QxYpzZ zV$4Z2Zvk9&2DkH5xOGEO9x$An9hcFk_)W_5Dp+k)b3rCk-5ePB-QPNvg(1zx+i%b? zYoa##*9TA!Fc---=h|z@iPLBhT2j2-^@Y?ZjbYGi5Y&7h?X$}@sqIFX5&@6jwPP%V zrI9u4G(P>4cv8_fInH#`ECNH{5iGcIt&S z0^xRug}Y6YQF>oCc5ap<3pVKbH(l9{Iw>mkYWk0wm$yABSYkrpDB5ZuChH6|9l(A< z2{6W!oxXv2i`d{AQpnp2EIp%*eOP^ozakfu zMh#}GZ9xza5U9D_D<;VwtrvK>N4Ws<2tBRB6E@Dg)pna28VKtR1dW#F=c8pmeBcC% z5+S_rxnn-X&=iC5EQ}n;SUB@=WvnqtvgUA}l%Z=-1U0NYLWBxvi@7r6b+f0HIS;o5 zEdCorHaT-5JtSF!(3vv`>Bj%%ftv#(mZweT<4fSG*J1HXUH{oZwdBkWLLRP9jNE6R zw+(OJya_;k~bj09k+0&?V}PCUhNh7mZ?LyC4RW^w!`V zB1%&M{fSIs>B>9AlY~S>chGLi?CefOTD*KXHiLX$ZcbsDNajBJTayCe%L4{9iIP!g zDr;$fWry8-_#Pb^|P$nx?^u!m$k&b2o%^ zwz#@*k0X>vBd(KkjkTcD=nlV?W@T|B8o&u`}jb0gP(K#^Pagz?Db`d}|a#6@NMVHdmv zO1u+~Gfmn6(G!d^8<@SgmEsy;+BjrYM6wvp#|0#READlA@;N2 z>4BD#JXC;Mx-5|T{hGAmSUxKzZJdmgiYzq>?vQq^l+<+<>pmPe590(#J(!8(_kiS-AXljZR~M2 zAiw94aYuY>)|9J+{KARwllz2ZR%g(X=jj!mUPfw-@ttKsTWPh;Ujyyv_ZFOTD)r37 z0u`1ad7tRY%T+9-{SeTU?sOWqpk z0ahD2ubnQ(@$p&u0uxx-XhxL(1ndNLlL>__ATCs(0b&84}QQ5jO?K_@uT;#kE8i_db+yBFQh=Ce#AF%fhUp1U{EGJO3A4U?vrSddW0te z=C0A#VQ8ozK^shij{*h?K^&}ZO2*eTMR zgk?Uc2E?`8Vlu=??e-A4V)HQQmd7Q_;Z28rjWwfl*P%wm)77LQ(qY!Ro-O8OrI@ry zN0yTKP`u)O@^rsd`%K%pbNw*%DF_TCkNq+?wc;d1-!lHYyo@#W0|U0PVHwtE!H~`S zftCTgp6I#%YQj`B$2zQl+L%vffky^^>%2g%v zll_7W;&N|i)xIX_ayu(&{63yB=iUy&#X$gI%MEz`G1=L5>?2>W;XWQUVENv`*(+$R z^L5*enMKnrwQ+%!tTsX{-oBCFX`rl7NdhO5J|VMhjuRIiXE%*&-c~3g zlfF0z)d*h|{ahX*0J7`6woXYS>J3KYc7Hs(8Ik+?`r<~*EghOGx$^8&(#J;Cm0D1@ z5}>6J69waOw~Aw`THtE+awD0V2H^@IVrUR*nuI1%fIF|9FftaW%)u_SJm18_%ADH5 zps0?kjRZ@0S6a$)^msZb$O>Br7T}3Lnbn)cez{M4Z?c6OjA2*Wgd9cqd-gh|u^mZg zE>Wl|%If01e_qiv?|u;v;`>@1G~7>IR99;*r=po+L2F`)o{Us)5WJ+*>^IP#v3_QS z2AtSCk1&y8pkuf%w84836U)m-7;Sp``fZj8JP`q^aqmUvFkgdd8DD>i)WFj|vc!Eo zw=fY`nktkpHjvL9(u-=0Q0r_zP)Tm&kNmIbS<~o|fHq0R@}fyJ4NXfKp4{`hm>z61 zY*x@-0dEr+2)wU~42x+e_LAxXeag7SHP~XfwTNJNiWW4lX>7=gQbe|WJOAC2$mK|} zJoKcL3o0~m!$B}hF+%~buBHuNiN8FmNZ@qa;^ig_XhThJBA}(-05hZH?r|?Z9-Bhc zW0(USE3&WitF&C0EalN$do?zJ!=TJt1R_nM&y|I9tIO-Y=CxvMPyhZfqS|2^U4Pun zJ~~n)MUaCfcCX=6TCqZLwL&1Wo541Ys~rTRh_L6U`}|*p2yoL*{7vzK-CAS{o2Dk8 zWn&RQTixnw>;%xQG91Q4vPO3py!j;+@r?}=i7<~(nu2kdSK1Zc3ua$;kXMsl`02YOBRQ6xBOkvCit-g0m#6a0h6o ziGuOFOYYSk&l-Ino&Hd@-$UlHNfqU4#K#}`42D!XF*8Q7sFi<-q_{URJg704&;VMruQve^ zZM3ueAw+;>j-2m~L0XvNwVjfanYD>YHW!_+{pEYi(*;mWNUMoho!c^*P+6R z=v5360<&Y;Y`{NE0FHKbeSTFoIW6z|4L?0x^}(AECeFbCL$bu}!KWZu*6gNiIy9XD z9e?Y$ND*J=r=?{eF0`72dM-!NTj_IB8%y?L;+5PfX)vY9@7sA`FHE)j7EQnPstBkq3fG`-|t|t1m zPe@TpQv|Ibh54p}T*a@1Mlb-Ql#%+%lj?OoTVvAZACX#fAiNpNm*)!|Lf1aspJX(6 zI!4w)I#xY*dM+jcv zh4X?E)13_p6F!>bQVY+j^D>ej)1;}=6n7YmCst#S*`ZDbS)U(CPy86Q`k{<^>s^!9hoOvU^&zH^9+7$k6LeM_~DhwbOc> ztsniM{3euroZT-8?Rt)f_Lsq9&YPmqOkV~CM@6(anumHTok^+`;2|U;IT2r1S67lv z%nB8GXdu44yytRnD!@>55Rzl|$eRQ@Zhn~oLj!+$L~ z=xuS8WXa=>;8@&0J@Q%Y8;b}~;O9%^i8z)+xCr#2Hub+ES{2YzPDxAKtYE9X4BlAl z2{mY9KS{Zzl))K#6UT8xh-HTqTb2^lYpBm&_e%nE{JqPNvqGKRYta!2hsQ0sIOE7} zwTz_9U!HMldke(!S_N-iDBRHi6d;<0?{z%I*S;1wLEV16;LvFW=YG23G^N{^E+JAa zmmh}N%eb>e--A&%;dI7$*kGW_hU z3^709m^*NZ1Q9W^7uXF{RD?xGz2l;)z(8OLU|V(gb@x~7v0&BVUI|4Y@FVUe-8*F5 z3I@6Kir4WdKobqOt(kIk{y&YBJOCi=`A-WV8@WA-0B@d}1&Y|ZTu$qoghvy+`uBH_ zXYllX(b;lLb#^mJ>IqM^ngiD7BCjhG6B6$&M9g_FR&%$F<$W2H3mfoJYt)qY5pil+ zM-G$ts!R(uh4Z)mM!!jc)SwC3_a}#XEpm;$DG!&`IxHawrxKPtrc_(5t{0EoT)9vQkrus9`hy-%ogVYAU9;RK`C}sSiKw_!W=Edz!fLU`nG! z8I(LOrA=N%ZDp0^hAA-8%)Y7%6{~4QB@5!+iRV3VhjSnhyaCABuigU7Y0ylTWMy4y*oK0nkcb6 zF0^%LPrv8twj_**gu^Mns;&BaBJ5BQFsXD`H?L%9mtSst;@lw>GXp$o)Y#twTz4C+VJLFdI5|FSy$JOl8LKW4vsgE zJ0F~4Nsp+3z_o7BBb+=RWAYS%>1WAloSX%P@_hPa$?|U4wn(W~alG~Dd2^EKo^KYt z`BrwjCAQPSzq900IMmb+5tb5OVy!#d+-N_vfDFgzz{>Rx2dH^>cQEAm>+qI!_hy1r zPTwwpx;UOxh7iuy*47>LyMl_AGQ1=bbLyf@GxIbYdl;9vp_r*2Y13XZ1)M35pHtCn zTx*nAK9sU4g!v7$Vp3cj_{|a?T2I@ipJ3s7H*{bm<_RW31LPJ?wbnv`yIT4q)xE@u~R@SiH20BJzO8=7ZdG)cp=|YchhFfDY z*64aws?E&IJUcLZ5gkI;Cq$Yx3z9f~xEue|W!8n$_+5C1 z;?H}+)y_@q$5RxkVIdSqg2c6fbEOo>oEBRf;ZwrqjHh4Uw%GbPlQ3 z^bc3azO?92J058K?i4v5!Jbh_f6ZJPK?}bHAXqBeM1VQ$j4k7={m3KRovk$+^Ovq= z4!oYXyZ8{ABgh?r8BTCREdCth30kbMK*fe3lBQw5&Nz-1s3J|7aMEA=to+#7;DYO2 z9s-};M}@Zt35AguQmuQwv7^%B&V0<`wm>*;y-;KK-zN3n`(!q1l(Dk15>NedJLGf2 z<(4cN6k&qsGG~jc3FSe+cms1RiDs9Th#gf%u;?mk2*yhU67eT}Ru4{WpI7}(mco*m zsMpG=Y+@BP71<`gpi1_atWq;#<6@#qpsd-{5<)~Q!LL*^Qk;=-RswEJ;4%lC1o3l4 zH3YP}17xSRD?MW|FV2A{5 zo8cs;yGMS`ZjR~nwDQvpbm8^PMLO_KjOq5zf6)Yfh{7w$&9H=>5%9L2>@Ak+UNs#O z&uhZy@WSx1UZNoiKuu-Mb*|0%2VyF}$&jIKc6c1Q(DtWx3wTh0Nci#}w;t4FRj=^s zn3~3a9~Z^2MQO?q!S_A?$#gbi_WVt#F9Fe;;@a~(vRF?2Ee}U!3J)s-9deNPm{o1G zW5!G<;`vGrpC;1v01N#2grUW}HDF|h!{Ve!_Wo}?A$@fGC8%C=G! zU4#5yLchRbg{}vVheMv)=bItK5Zd+Fr!|YfSHXm_EZt_JIao-DtX35T8iop9H{Ee! zHx!NMb$tkH3qRaNU@xw`_L6;0*N5}WEI)JeV}~|dc5?hqCuDK1ntonH($Rw9N)Edv z|BK%~3bSG<;8O?SA>p#~>cQwsQ@mV#1+%8Sg&LJK6n(G$_PeMdIJT2QOd3^j-I%L* z2z&SnwH*j?2;L^k|4OH+s5!H+BH=ysjCk*g2ty3v0I1GlC~3j3V=2CVH%d=yZEZd6 zI0?X6eLD8?TYi79$V`>6`5(KlDzyAJ^Uu!fFp&6z#c{Sy6xvVO{ycP+M4umL0STaV zp64RM`1~Cue329Pb*~G5B?b$`{z&HAk0F=dm{bADA`%Qm%q-gTXGkzvxX}dCTP02& zFL>-dPW7r8gPPbbC%pNR)& zJMxvGdSIZ~qxoA~26KNO9>hI7VKz5}rpLy=eYlO}eFcYgUUzV{T&^gNSh6P4f3%aW z3bO2%9O#o6g?e9ZP3hN~ z#=&D`n+zSD=%kGL9dt(Owyt3H_uE0bS1s@Bgq^>)=$0@S-EXpE^M&`-NmEFXBPMpT zTT&JI822pw(%Sok1Qw5VoS?zOE=QRx`6_wL+D(s?31yw=Jq4QHAK z9|0$z?r?MEJ@92%<_po8i*UopM*GyiUbW|8Q$5F5#5CXP5zM%UKVR0b63pAv*2#& zdidi8-J5}Uhnu}}e#25$?j%TuDZ>8{eF~mZCBSQKKqq$F!)tU}4P)cjgPJyMv-`<3 z-^}F~i*nL#allMIPi>t!kyO37$uM<#SVY~GQ#_m$do$}T;J5W~0i7hMI-AD#PVG3Y z@@Mh=$>B3KGFGfc@)14J&u?-&wW+C4A1A8ts~-42tsgyT2^Fq0?RiH)Mow0DJFR~< zR-sEx*mn}Q0JMYGx+tY`sWGy@z29nO9UxqdmZvw18t6ro9b1u|#QVL{;~dL8bUuEG zV`GDw#MHK<|1f`t=Je|4MNXw@RuGdmGG^ZrQ&GAZMf8*X!rzS0mj=K^IpyAd{k<<-1vPq8XMS^f0@Pu7 zs;|0|XWXXktO_?4m7N-e*AExVhifj6VQO)+uZ=xm@ctdT=@ytrqHYOUtHi>E_TnQf zZLDP#GJREJm>M)w(H6gTCK>gkJ%9L0ieP?&*sIVJ)mx~Y~ z>1MYxiTGi!LDM!}ufy)Gp$WU&!80x5l|P-snRe%xWpsO7fz#UX#|Ll`E?CipQ)O&G z&%)4%Q_|MgiyDaMSr$EkI%Vi(58RbBSX>(rqukuzosJ_6GdL7ABac3e14Hg_MiR-d zzZlXKVHN&vsJhC!$R64kx&hHh$CMmy5u2r{Wn$S)o$FJ)K|@R8I6l310sH+T3DK3B zbaqkdx?@D7sk6dDD6x*#Sy;+Z&OE^O{CIK#$I1nwm2G?<(mzJnISFD;;i`cm`+U^{ zg1Uz>s@~UTGf8OEe(Ru~Z$nj&3&zDy9gyd>_Q)hQb0RG`CU@r&xCdOac8|wRn2~;F zBkxpd*%kJE6W%etg|_pm8>OWLYx01k*fOU-ciIg9I2I_yfNzpo_9J?K6d zU>C00;g5Kq6K1{oDu6XiP2=`G+PIYpxhSj-j5!rzac=Y4F}mj9U@Y4cx^M6@CJ9_Z zndInR3y0lE8#t!x1@L}|YOu2zZ1rRJ|LS%7UCJ%WQS58o0bzH~Sq}@Rv8e76Bc0hS@*gk)_(*xxajEl^}skHvbD} z>aimCnV)oH5pH3G3lABz?JOXJdL_(UYSaRb0`hw;Vciecf1Ut3I+kMppog52Vyp)v zHN}$2Vtna*zQKs7d4e$(p-F-Uf=5Pcmsly#)Hk?}Lq^4p0~M~+)FI@GyJl0Ps$HE! zf%S#bWGj};3N=$KWC_M5o#ng>CPb)zKbK<-ez10SNzz1qrcoa}AW^$OrC4@Oe9>uC?ZfiS9cN@Z#7&on4;tr=Z-vpu3!4 zSB)V_P$ldmC9O$l1&5hro?M%ve#Zcj)Mg zvmphT27eNFQUEB5@Zhj7`t3puJfqnq&`$pz(K~1@VNOyUcAC|LwEAf&mS8eW*%hhw zQTgp0vJOUxJcT!HjsE~hu2TnSRpt5dp~6+N+C-=zdEFFy7VE|oEwLQ?JRG27;=sAO z;JdAADTfiZyqxytX+el07Cr0F8aHI!DcnyG#ZuKGRe}h+d?xGdl*A;sXa^}t5t2~> z)z=M!l6k;)fZHGyh6^dHTu?HJ{u|+KJX2gH=X=xX>vP_JHpEXX9Z+>WwQ?o)ciF^* z@zpzdVX|`ODErSc{CwGh>eGbQ8vF&7$^(M)p4Hu$8^?){)jz&@OOKq=hD*S09ns)+aa?A> z5Sbn!KvQ5J>Y+-B#o~Zkh8fw&DsMfVsG}H5_?l*9Lyaf_W<4KGaSRR>CaG&V!fp*O z0GCxDsA~44s2p|&vZ$FA@!>6p$Tiy;s@i=PDo0xHn#V1egev<{^{A9pna4`5 zKTCIi^!6gc`3Q}scb-$Y&9D5lC^URH-iOIqrVQNuZO?KKprOZtd}j>VaID^}B;2O6 zMhoob^&wzb5oo!hBAHVT@$@QgH5$w0X>7v*e0IxiO)abjND+!@95WB$S3f3vY z@VHqWYgi3iIGApz?lV;JoOg*66&=$Vh8gkr{R$vVr$_~bU&4AjFn-Lo@PW{pGF$+e zehL9lv&rvo-U)VR#3LI<9AmS}=Gk=fZD%>hp+{$O8*qi;zn61B*m}mW!Th-}-}`N~ zph&I?u5DQbuZeC$MqLe2IjeSbl(k;tX{`5|-V5$l?#@n)+p4F!sm42_?x?#`tkzjY z=YQOOC$VygR1?hcJ3WNk;4D<)oh9y3r>TbPx5icYTAZqx{*-AA&N?jWm(+pYI2+n% zux2x7{ZAD}k!bPS5Gz~z3{j3Ehd!Mz1MqHsaSHqAjNfBBcp}=Z5@G{>gH3%V8#NO* z`~iy1Z2eOL{~V(aDk%yaJ8248{ig?V9HdG8dcS{=7*RyVhboW#P%NI>?o6?(7E-xT z#kc&Ls^h7WZD{p40+{z@SSz=9%)vZZ12PIG=UYourv@e5p?sOG*HzTnOeq;)v`@}9S|lP*D=Mo$Z&*>Xi-oxCa>`AyPq77MKt#9$d=C4?^YtTZRvYPDYSo;5&J3N zaU(B|)R`#v{McQ~au!nUT>3XdzOMLAb)XLPn<$v>v${AS=)8=VoFSQor)DenT~}Vj za5jauq5xN9apGN@pa0LdB*03xOn~(&FI&j+&{k)z#46k5ax6`|Zm(fSPP4^d8EG3a zUuSZ|3F*;>9FZs6(-g{3iZtHODI3sk{%V^~pRS;mcnn4h0mDn4`?2fM@FA5uGr zFn*XbDbsTO)%n;|!?G!$I!*fhCg7Ve6HC#!+s(Q5Hp@SJC%-h?)m)0c--`%T4LHSo zy26!8yo*u3;nH<+OGtpYZhx?r?D^wtwtUu)$if;&yTmIR8pf8yUhe7-sRL$KMeV}| zyV(-InwsYOY<{V~<6Nuyxmi~Jh9z}v2k*~PV$B%pp8b~+JBDJhU)k+TW3fKOYM&$8 zl)hh{{OMbZ^(Z`Ky~Y5!k;(iVqS(Vb8by+Z8TRPL#ag73wze(!$wi9U z=mD`{h!yHyEDLL#0Or24p<4=#RZn_I#!hicb*>^>-N&6yIIRAo;~830!L*n0b{G{RGAT*?)60;K;0FR92IfWdS!`2cjWJOQIq^aAEdfot!E ze)`hV-A`>$cvTieb(;TUYfS|Y-8R@M?8U+l+Sn@bKm_W zVF7fBd=Zfv!SQbXe0?mlCl`r$GWW}@6|LA&OR0C&GR5#}9+lol+A=7rSwAV5hV&Cl zh3Lx0_Fk?q09j&=P87{zsiL+Tr5w%j@s9m=HaCjcklSF(5L)_Xi1PP#3>eKVMtmLY z@IBSb{L2H7NQtJNvxeK=!{F^9_Ki}G@Ko;m&TTP{NFHvl19jri@04S4`WyG3uKI{J zT=c9P(AbB5khBFmdI3VFu2%QvfDdUF-i62jY0gKw>`%NnM#&0bzcl}C)*+nnw`M*e ztSRMa9+=YS&5@r``0ozU+%_>&ghsQ@?gCzy=m&V`$&EQDjdd&ejaym-v9S~bp8iSkPlx|ZSod3Ro@reA& z8BXE`eW7(9hz`1XxIp;luF_FY@75%V4M{nk(_C+=XF=c0sNjDJst}U& + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ +.js_subscribe .form-control { + width: 50%; } +.js_subscribe[data-subscribe=on] .js_subscribe_name { + display: none; } + +/*# sourceMappingURL=website_mass_mailing_name.css.map */ diff --git a/website_mass_mailing_name/static/src/css/website_mass_mailing_name.css.map b/website_mass_mailing_name/static/src/css/website_mass_mailing_name.css.map new file mode 100644 index 00000000..6c806587 --- /dev/null +++ b/website_mass_mailing_name/static/src/css/website_mass_mailing_name.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": ";;;AAKI,2BAAa;EACT,KAAK,EAAE,GAAG;AAGV,mDAAkB;EACd,OAAO,EAAE,IAAI", +"sources": ["website_mass_mailing_name.sass"], +"names": [], +"file": "website_mass_mailing_name.css" +} \ No newline at end of file diff --git a/website_mass_mailing_name/static/src/css/website_mass_mailing_name.sass b/website_mass_mailing_name/static/src/css/website_mass_mailing_name.sass new file mode 100644 index 00000000..5271c91b --- /dev/null +++ b/website_mass_mailing_name/static/src/css/website_mass_mailing_name.sass @@ -0,0 +1,11 @@ +@charset "UTF-8" +/* © 2016 Jairo Llopis + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +.js_subscribe + .form-control + width: 50% + + &[data-subscribe=on] + .js_subscribe_name + display: none diff --git a/website_mass_mailing_name/static/src/js/website_mass_mailing_name.js b/website_mass_mailing_name/static/src/js/website_mass_mailing_name.js new file mode 100644 index 00000000..ffbe2e58 --- /dev/null +++ b/website_mass_mailing_name/static/src/js/website_mass_mailing_name.js @@ -0,0 +1,61 @@ +/* © 2016 Jairo Llopis + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ + +"use strict"; +(function ($) { + openerp.website.snippet.animationRegistry.subscribe.include({ + start: function(editable_mode) { + var self = this; + self.$email = self.$target.find(".js_subscribe_email"); + self.$name = self.$target.find(".js_subscribe_name"); + + // Thanks upstream for your @$&#?!! inheritance-ready code. + // Injecting ajax events to modify behavior of snippet. + if (self.$name) { + $(document).ajaxSend(function(event, jqXHR, ajaxOptions) { + return self.on_ajax_send(event, jqXHR, ajaxOptions); + }); + } + + return self._super(editable_mode); + }, + on_click: function() { + var self = this, + email_error = !self.$email.val().match(/.+@.+/), + name_error = self.$name.length && !self.$name.val(), + values = { + "list_id": self.$target.data('list-id'), + "email": self.$email.val(), + }; + + // Stop on error + if (email_error || name_error) { + self.$target.addClass("has-error") + return false; + } + return self._super(); + }, + on_ajax_send: function(event, jqXHR, ajaxOptions) { + var self = this; + + // Add handlers on correct requests + if (ajaxOptions.url == "/website_mass_mailing/is_subscriber") { + jqXHR.then(function(data) { + return self.on_start(data); + }); + } else if (ajaxOptions.url == "/website_mass_mailing/subscribe") { + var data = JSON.parse(ajaxOptions.data); + data.params.email = + self.$name.val() + " <" + data.params.email + ">"; + ajaxOptions.data = JSON.stringify(data); + } + }, + on_start: function(data) { + this.$name.val(data.result.name) + .attr( + "disabled", + Boolean(data.result.is_subscriber && data.result.name.length) + ); + }, + }); +})(jQuery); diff --git a/website_mass_mailing_name/static/src/js/website_mass_mailing_name.tour.js b/website_mass_mailing_name/static/src/js/website_mass_mailing_name.tour.js new file mode 100644 index 00000000..fee76b10 --- /dev/null +++ b/website_mass_mailing_name/static/src/js/website_mass_mailing_name.tour.js @@ -0,0 +1,137 @@ +/* © 2016 Jairo Llopis + * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). */ + +"use strict"; +(function ($) { + openerp.Tour.register({ + id: "mass_mailing_partner", + name: "Insert a newsletter snippet and subscribe", + path: "/", + mode: "test", + steps: [ + { + title: "Edit the homepage", + waitFor: "button[data-action=edit]", + element: "button[data-action=edit]", + }, + { + title: "Click on Insert Blocks", + waitFor: "button[data-action=snippet]", + element: "button[data-action=snippet]", + }, + { + title: "Click on Structure", + waitFor: "a[href='#snippet_structure']", + element: "a[href='#snippet_structure']", + }, + { + title: "Drag and drop a text snippet", + waitFor: ".oe_snippet:contains('Text Block'):visible", + snippet: ".oe_snippet:contains('Text Block')", + }, + { + title: "Click on Insert Blocks again", + waitFor: "#wrap h2:contains('A Great Headline'), \ + button[data-action=snippet]", + element: "button[data-action=snippet]", + }, + { + title: "Click on Content", + waitFor: "a[href='#snippet_content']", + element: "a[href='#snippet_content']", + }, + { + title: "Drag and drop a newsletter snippet", + waitFor: ".oe_snippet:contains('Newsletter'):visible", + snippet: ".oe_snippet:contains('Newsletter')", + }, + { + title: "Let the default mailing list", + waitFor: ".modal button:contains('Continue'):visible", + element: ".modal button:contains('Continue'):visible", + }, + { + title: "Save changes", + waitNot: ".modal:visible", + element: "button[data-action=save]", + }, + { + title: "Subscribe Administrator", + waitFor: "button[data-action=edit]:visible, \ + .js_subscribe_btn:visible", + element: ".js_subscribe_btn", + }, + { + title: "Open user menu", + waitFor: ".js_subscribe .alert-success:visible", + element: "#top_menu span:contains('Administrator')", + }, + { + title: "Log out", + waitFor: ".js_usermenu a:contains('Logout'):visible", + element: ".js_usermenu a:contains('Logout'):visible", + }, + { + title: "Try to subscribe without data", + waitFor: "#top_menu a[href='/web/login']:visible, \ + .js_subscribe_btn:visible", + element: ".js_subscribe_btn", + }, + { + title: "Enter a name", + waitFor: ".js_subscribe.has-error", + element: ".js_subscribe_name", + sampleText: "Visitor", + }, + { + title: "Try to subscribe without email", + element: ".js_subscribe_btn", + }, + { + title: "Remove the name", + waitFor: ".js_subscribe.has-error", + element: ".js_subscribe_name", + sampleText: "", + }, + { + title: "Enter an email", + element: ".js_subscribe_email", + sampleText: "example@example.com", + }, + { + title: "Try to subscribe without name", + element: ".js_subscribe_btn", + }, + { + title: "Enter the name again", + waitFor: ".js_subscribe.has-error", + element: ".js_subscribe_name", + sampleText: "Visitor", + }, + { + title: "Enter a wrong email", + element: ".js_subscribe_email", + sampleText: "bad email", + }, + { + title: "Try to subscribe with a bad email", + element: ".js_subscribe_btn", + }, + { + title: "Enter the good email", + waitFor: ".js_subscribe.has-error", + element: ".js_subscribe_email", + sampleText: "example@example.com", + }, + { + title: "Try to subscribe with good information", + element: ".js_subscribe_btn", + }, + { + title: "Subscription successful", + waitFor: ".js_subscribe:not(.has-error) \ + .alert-success:visible", + }, + ], + }); +})(jQuery); diff --git a/website_mass_mailing_name/tests/__init__.py b/website_mass_mailing_name/tests/__init__.py new file mode 100644 index 00000000..16a388f0 --- /dev/null +++ b/website_mass_mailing_name/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_ui diff --git a/website_mass_mailing_name/tests/test_ui.py b/website_mass_mailing_name/tests/test_ui.py new file mode 100644 index 00000000..ea8f36cc --- /dev/null +++ b/website_mass_mailing_name/tests/test_ui.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# © 2016 Jairo Llopis +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp.tests.common import HttpCase + + +class UICase(HttpCase): + def test_ui(self): + """Test snippet behavior.""" + self.phantom_js( + "/", + "openerp.Tour.run('mass_mailing_partner', 'test')", + "openerp.Tour.tours.mass_mailing_partner", + "admin") diff --git a/website_mass_mailing_name/views/assets.xml b/website_mass_mailing_name/views/assets.xml new file mode 100644 index 00000000..0f4c2806 --- /dev/null +++ b/website_mass_mailing_name/views/assets.xml @@ -0,0 +1,23 @@ + + + + + + +