From 01d52f403a161bd67d27343bec6cf47844efbc38 Mon Sep 17 00:00:00 2001 From: raynald Date: Thu, 13 Jan 2022 10:20:40 +0100 Subject: [PATCH] operation --- __manifest__.py | 10 +- models/__init__.py | 6 +- models/__pycache__/__init__.cpython-37.pyc | Bin 291 -> 420 bytes models/__pycache__/address.cpython-37.pyc | Bin 1790 -> 1824 bytes models/__pycache__/email.cpython-37.pyc | Bin 0 -> 1507 bytes models/__pycache__/mail_mail.cpython-37.pyc | Bin 0 -> 566 bytes .../mailing_mailing.cpython-37.pyc | Bin 0 -> 859 bytes models/__pycache__/operation.cpython-37.pyc | Bin 2909 -> 11860 bytes models/__pycache__/partner.cpython-37.pyc | Bin 1489 -> 2743 bytes models/__pycache__/phone.cpython-37.pyc | Bin 0 -> 1511 bytes models/__pycache__/qualifier.cpython-37.pyc | Bin 2793 -> 3156 bytes .../__pycache__/relationship.cpython-37.pyc | Bin 0 -> 3682 bytes models/address.py | 10 +- models/email.py | 56 +++ models/mailing_mailing.py | 16 + models/operation.py | 441 +++++++++++++++++- models/partner.py | 66 +++ models/phone.py | 56 +++ models/qualifier.py | 22 +- models/relationship.py | 145 ++++++ security/ir.model.access.csv | 11 +- views/address.xml | 6 +- views/email.xml | 64 +++ views/mail_mail.xml | 15 + views/operation.xml | 264 ++++++++++- views/partner.xml | 50 +- views/phone.xml | 64 +++ views/qualifier.xml | 25 +- views/relationship.xml | 113 +++++ 29 files changed, 1401 insertions(+), 39 deletions(-) create mode 100644 models/__pycache__/email.cpython-37.pyc create mode 100644 models/__pycache__/mail_mail.cpython-37.pyc create mode 100644 models/__pycache__/mailing_mailing.cpython-37.pyc create mode 100644 models/__pycache__/phone.cpython-37.pyc create mode 100644 models/__pycache__/relationship.cpython-37.pyc create mode 100644 models/email.py create mode 100644 models/mailing_mailing.py create mode 100644 models/phone.py create mode 100644 models/relationship.py create mode 100644 views/email.xml create mode 100644 views/mail_mail.xml create mode 100644 views/phone.xml create mode 100644 views/relationship.xml diff --git a/__manifest__.py b/__manifest__.py index cbf6cd1..e650093 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- { - 'name': "opendons_module1", + 'name': "opendons", 'summary': """ Short (1 phrase/line) summary of the module's purpose, used as @@ -20,16 +20,20 @@ 'version': '0.1', # any module necessary for this one to work correctly - 'depends': ['base','mail'], + 'depends': ['base','mail','mass_mailing'], # always loaded 'data': [ 'security/ir.model.access.csv', 'views/qualifier.xml', 'views/address.xml', + 'views/email.xml', + 'views/phone.xml', 'views/partner.xml', + 'views/relationship.xml', 'views/operation.xml', - 'views/templates.xml' + 'views/templates.xml', + 'views/mail_mail.xml' ], # only loaded in demonstration mode diff --git a/models/__init__.py b/models/__init__.py index 7de966d..b3d10fa 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -3,4 +3,8 @@ from . import qualifier from . import partner from . import address -from . import operation \ No newline at end of file +from . import email +from . import phone +from . import operation +from . import mailing_mailing +from . import relationship \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-37.pyc b/models/__pycache__/__init__.cpython-37.pyc index 09e4a8fd6db7ea9da928dbdfa64bec9eb364be03..1b88137354167204dadba57729854dc9452c1979 100644 GIT binary patch delta 233 zcmZ3?w1k=0iISmkMNX<`<+EC6;97=K(qV zAlb~k^mr%@6yhmL%>hdnXJi)mX>#6TC}IM-r-&Iuuz(0w5Wxl_*g*sbh~NYgD;bKo aL2MB5%TK?wxJZBE!3ZHfAeV;`83F+EhcvYS delta 95 zcmZ3&yqJmCiI3B5j%*@KG}dViHi-$?2+rsI1OIxqp9t3Z3)!zuLQYNq z-PkRjiCP$QKMOm;rLvMQ(Y@Qsus~Z$9EeC{!Y7a`jtO7@3P?LZ0qzn2z1mi|g-$lQ zOtFBR6IoX{ATubfXXp&~h(eE0^{Y7pO*)11pH42FL$s+V$h3hJftNK&LwM; delta 390 zcmX|*&q~8U5XSdk(okG0)*?cy6(qKZ;6ZxosT7YQdJqH&F`E+PV6Q4WZKC`era?z$TH(dFTUXcFTaB7Kcx zyn&RTqXC{0jb8DD{?6RROu8|d&|CK$#S|RYMY?#MF3M@n_BDDUQ%7T1WSX6!wtFmV zaOy~6pk>)8Oe~M#??IB84(qHtmMM{5TQ&|;WhqcLAZngj+}MWZ0Hjs{h?MaPUIKZ< z!yYvi=c6X;FtDZGaF~iPo1c=K=F8dgi(SiuAWB1}B9W#+Aa}u=qm89s^ewaJey;r6 Ki$Lq8)cgU)w^k)gFlCmv9 zJ|#eU$uH=|Irb-&*Pi+pdg{zda$PPsJ1-7rJ`VY;-|r9@zy0~U=%j@Fg~EQsz&wTN zW6BgGEqlDz$cgEf13sYS zTOw20dP8JO(X-)e#z!*yfsEUK!(L>}LR!{R85h!-Rz|wO#6pjw(EiCO`?a;T4a1*> z(NcI_SB(O!%w3q!e<8d$5l-#3Z6{_bSC_(s4E&YXr5e+aEWI|a!2R~4y<^-O7)3ah zgh!HcCL22#h;h9R$+A@|2R`HJU4#-`QGLYLK_jYn;C-*@f$gb>x4}N_) zki&N^K731NRF34qn~aa%l9=!VK;bYvtQV@1b>;Gfu)b1Ol|q~KoqF;=^+98GM{;>o z)Rh;7Uw6@e;!mv-GNhoPS~xr*+pVx6drJb}5Feu8LDp%@u~gZ3{n6n;@vT zSZb?eNOUFDwLRR2##PV&%Bvy*9S-PE0EiF<(_I3Q^af7nhFyQRp)bg(8p6z*FN{P6swT9dUFr&VRmu zGZb^>rnRi=sgT%0)4N`RJGC_Gi|O`mO`EQnELQd-*y>}L?gJo%#_)CMi1uK{bi^{6 zu@PH8zKe6e`6k-}4nvmbl_*u7hfbbvcLKhb=NC(1c9x`Z0i{%~uzG=)7Z&R3Q~?Y- z$ey1H8nj<QaaUXDbq|!bTrzG=Td$fl|4+jH11XhGlUZTB)(Q|`^Gz+<|is? z;1>xC9PiV=t9Fc`wdQl%Z--m&-nL-kaNet%JGIfV_27N0AiHaiHV^Wz+i5Xv{tubc zs^5khsT({o?}k%G_czN~DuPan?>gM=^tf4#0XNEzZDLs`6xmj`9`eVb!j!6Y-u|BC Y$@YYv=Q)2rE#rb>7qdF2yf`cW12g-WGynhq literal 0 HcmV?d00001 diff --git a/models/__pycache__/mailing_mailing.cpython-37.pyc b/models/__pycache__/mailing_mailing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..761d595fcb2e21c7266a069637f6803f85654011 GIT binary patch literal 859 zcmZuvv2NQi5G5r_qFo0`GZdMMt{!Tk?N%f~(GH#L4nY?!gzBShIuhxUHVPZ=lq~&= zWbC)}54d*fFLdfrwhRwFfX8=7>fZ6`-k+Rw3EFw`qx?k)`5l7R7=m}W+%-BNKr2%0 zc3MOjM^#+2g4Icp)M=5{S&>olkw6UWo&b~SoZrPo2j~syCx5U88TFZu%Z2jkM9B)A zPiq6Raz0raQ@L@t)7pXkEoLMsC=g_&MJ(Av0ujWIQIR&7L4r7w{GkKsBZUn3J-MSr z7dpt?_1UmgmD1DAX}tr3{k}Oj3#q|qH$Y&^r83%gKDBUjb~tu&T1&kwvYQ?7y~77W z!5EcmEJ7dp{(#H9K&Qxe3N&=PC37;TlXyxM-BMteWZUR6^4)!LEMz%;^Os)v6b$yL z`%#nek%E5YnUmGT$5y(Z#GZzmpYxTod8NMOi}iA5^qU-%TfSVBpI=fl06|Gz%!Kk-}$ zUDi?v-xYge#62OtuF7hE!iCZ^Y1PukSlaVpsn@TKmd(>`2Xi*)>UrCgeHwB>fFpMn z!q8lX%LN@dWwb|oQIo|nh^+J{-=w|W$klYPvN(3U4Lu7|H9SohHvC1Kp!3NvjA&Ej Xh^}D|oSt9q1icPJ(8$9nk1pbWF)-rl literal 0 HcmV?d00001 diff --git a/models/__pycache__/operation.cpython-37.pyc b/models/__pycache__/operation.cpython-37.pyc index 55cd51176b478bd7b50361ad6b547bd12279fc19..855e842ae3bbe0ef717ddd7dee6b3d4ce6a0f284 100644 GIT binary patch literal 11860 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 delta 1162 zcmZ8gOK;Oa5cWE@WAbnk=hY^(4e8UB`l1C1S_-99lmi8c9>7A1OlJwL5(n&Xpb|o& z+)yOY9y#zMIB?DM&*GY}_W> ziMVO>WgrK6D0EcU=GmPb6rt~#vd7%K%s;TB*JhNkPPTf}f5RNw@L zt5~WZ?Gg;b2#m@FV;$Ws!#H*@A(kU=hIV6@yf&}g;q`5Q*OYVagQIq}rnlX2g{|!w zCA^;B*TgGr-mEoS@UX$>#7AwA6~uRKf+a;kuOgn&cNUA7+0E6qTFv{O|ELE1uJ^Ff zuGM)vs9?xZgMP}0_7VcBybopZRWGoz_^EG|lH|1r(v)qseBce<=E0x{jMo;0yJo;W zX!(stq774;^1NQl=`Tv?#veI)ceG9ENJM z{ULs(PMa!|Nm4scd)g_i#vqPd$9V#Ef+~?*?`y+Cb?BrIZh?(llR8q6mHIGHA)1?k zA`;ps9%r800Sa8%3=)WrCT~T|+If2j?E?1CGo~Hxatw*ugaA%n-~H%n_U(f5$EC;jV3N88iGC7fGIP02NoqUY}~SF z<^kOK0xn#cXnX?W%6Sc6z;h3m5-kfSnRCya^ZWnje*LgN7o7*`w3WceQoi@Uq%WM< z-omdgzF|VS_DIxKPGg1*)*K(7ha~YEYM|JgIh(xK65xg&5*27aOSFzZG3AvS{Za>6la2brv)&NG*rqgko;>UpdZ)o?Je{!K zvV9s%{Yg`74sDuhDXNlD9A#D;_xZ$Uyz{pp`l1g{(S0XPdo7S8G` zW1+v?fQ~ecQ%^;8F877+3X3dRP(#*d#g)rSNQWHj55-mBWudZ2MfIyVokOgjh~wou zYnTP!XXTebC)1 n7xylWZ#ckUD4Lox4SFJ1uirKcs)komRSY?|f%wr~ZImdg{zda$PPsJ1-7rJ`VY;-|r9@zy19?A0&kQiNaw-z&wR% z=RgDzRFi@-S_CX8LKafg1v)BX78eOi8adRhB4ugOX6;6fbf@UDZqZ}CMvisA7_b2) z-x86C)*B*PlAaA;hioL$AIPNr7wknQp-+lRNNs&GS5gb>Ltd*%;M+f0X}&h5GJg0o z*Gh1ws%;Y84J_Ud2R3RtS$1A6_&2hiOXzv-j0Y(x= z1z~}pEEEBYM7W?VmdS1FJz=R#&e|dpF;?*|WF3&ZAf+I;LGJD4&R*_=JP=*c10VeQ zVjza^T5R~1%&8cOqc3Hro-GVDUbxR|;@Cj(trTh^XeZ|)nF}BXAa^YJ-&iP6^KXQiW=h>yQ>Qrgv z)|)PXDaX5|up-4!RjJoz2nd-YAREM6j#asH+H{SyhwOZ7pQcZ%GGFp?Au$AQo4ZNU z1VP2cN*O79tV$uT&G8{Lu7W0zPUZpVa6pd&NQ8ti?IjRFZ{UP(!t3w0^ac6#=}oka zL~tIM>6VJ%5wTN8&ggBhCGWv&ZyW4vW`Ha2*@KJ0FJv2nH9R5P0RGVlaiNR08n+z?=crfp|guDP{Y_6Par``OBxnO3K>dhMV;zMKhV z-RCu&Azw&4t3*}JxWG1=-SrdPtCf~t%y#!{)^yFZUYn0#tB+yY4}cIF!PlW9+JhO< zQJB&+9EF?5cX94F;B;5Ou}`zC|(|B-V!%1pcK;PM%8$MVWBFQ z5@6Uv_I$~WkDKIt>seK4$;$?C^BA(b2TuBum+L2RH+*NGQKm#wjPLKU%B9v>WC#YCSQXs>4&JC%IjP< zHCYp*9Xr;iwO!{`y?A0;s7ryc2aUUf+U)f1g);aA8GMs{dL_;IMy?j7i(>o|AH*hu a|4P|$Scp$gc6fi)Tn&uy0Be9MdeOh9TAhLb literal 0 HcmV?d00001 diff --git a/models/__pycache__/qualifier.cpython-37.pyc b/models/__pycache__/qualifier.cpython-37.pyc index 718897016598fffd25384785213cdb8722e0b3f5..8720a4f75e85755ac6227391941a22135465744c 100644 GIT binary patch delta 953 zcmX|9&1(}u6yMqJ&BrEb8%?y0t%j7fq*#hn#FkpBp7hd!5|FU&Owz=4H=W%SEvZFX z=*1jl(36J*#Djw9pP^?@ga3fHo;~>{{g~nXX5P$u?>D>e_c#B$V6Uaq2?@sH&+qR0 zBi{zFJF>blX0X8VDQMJTwnbEpsHP zQZ2h7ITrh%K4fpu6kFBG`<^VS!qC73g8~*k0f?m-^`rxNAotJ^?a43KdQw}#s3;B8 zp)}B%(h#jnPp|JOqjUN6T#ogg(l!ndtg=|K@==C-b-VId>dEi`_0evUl4!o;(ijEo zlRmre$UGt3fY5pi^VD|N^;?bB$a74tMcode^eViH>mDU;Ot?aV9j-=Q9CAG(F7>v! z(h6dlfgnetIT5SwxPHVHAmheq`C8#5zkWt1s5VAi4&qk5?)h#M)$4Q|3eX7w4!|5( zlmd{nta3@Qk%=ah-D21w0S<$xe*WP3lk!fEeY371Tc$kV4( z9`XG%I>G56y1@QuQ?s%OBr4L8DUZI~gUj<_!EO~Sia`$fMq58=e_yT{APN&iVSy+T zSQi3-(h7O5vFQ3oVisZhExv;$?j1zpchdg*aVoeOG_ zKteDukjV=ht%StF0{;W*KfvUXjg1*G@SISDpZvA`{PmMQ&);T$Tnx5+->u;I_4P&4 zc0LC;h_#8w!9#hE%&&JTGZ|skj>#-$kBr#i)f4Nq61%w8aP@e#>odw6=3>-FBo3Ij zTZw%6j%;s6hN9^{PY?EbM`97nVuFlIk%xXL@5@cZ>^G9}EV?hUy(?1DVcnYk}re0TGK^(GaZVYStUT)zqYu?{TCMZ1v_q>J7E)&3J)L&N=XZnDz8CODg63$?o!55<0$=|GB;Ng@TGJ-mL8EY2rV=nCx;B|P-^3PCW+21jvrC`hj=mq~Ug z8+f>G=Q18Vjh-bcd6J|_KGkl9!v+k4^x0@W+G8}e4KlYbfemiYtz&lJkdn}|51d2$ zB|Bqt#=WPm?Bx#k&)FZKR4AjeCvRcpKiT`*PWa4z^LdWtm`^+6 zG*Nli)eR+LIXH?2qe+&V)$%r$NDl;7c9lpEv}Z>DWXZd<`=|YhlKnJ!(jQOrqfz#~ zKF40~jq$wrP^kWhk4F8NlS%qZGS_agz;>Bk{sp#~^P2CF7ItaT9?1XbJ1%@DxNu9)slsz=yk2@v17KpF4`3v^&yW8o>r0{;)UkO;(-8FGVW zlRK?Cgxn+nneeK8$?#pYRph>VgMzPMSKg;R9}sy+pm z8n;K8kWG>i6y;k){v!t8#whKn+8|2|0*gKi97&_Ep^xB7pZY7v*P#z_oFX>G@xVm& zfFif~t5eLrsF=9!Bc`{O(zOdetYLPYw;{X5*Dsu~0lo?DHuw$jt&-m?`8CnLyv6ST z&v*GfgXi@xtpmol`280_cw4lOHw^!PKYS4&Pi%f^xmI`wh<~K759Xi5GKUstkFGUW zZ(I&BCMFI(7wG83hh zLEiPvmPK~)l8lQ}8jKNl)2Sp2Ya}Bic9DzOM!Cr{)luN>darhn-^K#7O7>`}k7p&% z1pcSbYK4n~c#`I3=B$qNkCb9&V#a&41wFGErQ$$zlB^gvAbriP39ygRR0kxn z&KPAo?jXyVjCaTq%5v_GHD@rMx2LPiz*``m{8{^aG(_a>+J%gg7y9I;+JUOBxT(Gs zEfRE8rfv$Yh0`J!-($1hwJ0bt()+jN14`WVQLLsXk-w^EAe^0{&N*{Ve=}zvSzqj) zxpSA>Pi@)5v+ONP^>RG)5(yp&-6_Xf#h7f-%9U~Zr1g7i?qJk`LhM2@xs#(PIJYmo zIl~^_+%t;$mF(kq-9*8L+N9J!vKg_ZvHUXSk%@GZV2p$pmEZ`8QC!BWdqmym{ymj8&(D;+^6Y{$By6C1#Ca(`|gSI*fSH78~ehsXd9 zx-?wXaDbZOYKHT6P*h`11=6LRz`uTm1HHR*8+s4+3eA{cOa+{-l}?9BLEkC+pRUxX zknbB)b?Zfx|1nm{pAh*e5n};=0H21DoCNjRa&Ngy6MhZ?CpI~0hXiDc&?75tYZvI> zM%?*;2B@Zz#w5Q$?*z@%A(qpI8C=#X{{nDrclOqe1}QGoz56vO>s>nX)rIM<=GMCM z;b@eKI5SU|=FLk;6>?(AkuUJHG16Qq2`UGxbL8uI(m`k zT6pK8)}sHbwHI-18@jO9*BTo}@q692cBzz=1: + i=1 + for req in ensemble.request_ids: + if i==1: mailing_domain=req.mailing_domain[1:-1] + if i>1 : mailing_domain=str_operator +mailing_domain+","+req.mailing_domain[1:-1] + i+=1 + mailing_domain="["+mailing_domain+"]" + if len(ensemble.request_ids)==1: + mailing_domain=req.mailing_domain + + + + + return mailing_domain + + def count_partners_segment(self,segment): + #on boucle sur toutes les requêtes de l'ensemble pour compter les contacts + result=0 + + for ensemble in segment.ensemble_ids: + result+=ensemble.partner_count + + return result + + def count_partners_operation(self,operation): + #on boucle sur toutes les requêtes de l'ensemble pour compter les contacts + result=0 + + for segment in operation.segment_ids: + result+=segment.partner_count + + return result + + def count_partner_request(self,vals): + + + + if vals['mailing_domain']: + partners=self.env['res.partner'].search(eval(vals['mailing_domain'])) + else: + partners=self.env['res.partner'] + + result=len(partners) + + return result + + def refresh_partners_count(self): + + for r in self: + r.partner_count=self.env['res.partner'].search_count(eval(r.mailing_domain)) + + return True + + + + + @api.model + def create(self,vals): + + partners=self.count_partner_request(vals) + + + res=super(opendons_request, self).create(vals) + + #mise à jour du nombre de requête pour l'ensemble,le segment et l'opération liée + ensemble=self.env['opendons.ensemble'].search([('id','=',int(res.ensemble_id))]) + + #partner_count=self.count_partners_ensemble(ensemble) + #mise à jour du domaine pour l'ensemble + ensemble_domaine=self.update_ensemble_domaine(ensemble) + + ensemble.write( + {'request_count':len(ensemble.request_ids), + 'mailing_domain':ensemble_domaine + }) + + # segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))]) + # partner_count=self.count_partners_segment(segment) + # segment.write({ + # 'partner_count':partner_count + # }) + + # operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))]) + # partner_count=self.count_partners_operation(operation) + # operation.write({ + # 'partner_count':partner_count + # }) + + + return res + + def write(self,vals): + + mailing_domain_update=False + for val in vals: + if val=='mailing_domain': + mailing_domain_update=True + partners_count=self.count_partner_request(vals) + #partner_count=len(partners) + #partner_ids=[(6, 0,partners.ids)] + + if mailing_domain_update==True : + vals['partner_count']=partners_count + + + res=super(opendons_request, self).write(vals) + + if mailing_domain_update==True: + + # #mise à jour du nombre de requête pour l'ensemble lié + ensemble=self.env['opendons.ensemble'].search([('id','=',int(self.ensemble_id))]) + ensemble_domaine=self.update_ensemble_domaine(ensemble) + # partner_count=self.count_partners_ensemble(ensemble) + ensemble.write({ + 'request_count':len(ensemble.request_ids), + 'mailing_domain':ensemble_domaine + }) + + # segment=self.env['opendons.segment'].search([('id','=',int(ensemble.segment_id))]) + + # partner_count=self.count_partners_segment(segment) + # segment.write({ + # 'partner_count':partner_count + # }) + + # operation=self.env['opendons.operation'].search([('id','=',int(segment.operation_id))]) + # partner_count=self.count_partners_operation(operation) + # operation.write({ + # 'partner_count':partner_count + # }) + + + return res + \ No newline at end of file diff --git a/models/partner.py b/models/partner.py index 9407dc7..25ad49c 100644 --- a/models/partner.py +++ b/models/partner.py @@ -29,6 +29,30 @@ class partner(models.Model): partner.address_count = len(partner.address_ids) except Exception: partner.address_count = 0 + + def _compute_email_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.email_count = len(partner.email_ids) + except Exception: + partner.email_count = 0 + + def _compute_phone_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.phone_count = len(partner.phone_ids) + except Exception: + partner.phone_count = 0 + + def _compute_relationshipPartner_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.relationshipPartner_count = len(partner.relationshipPartner_ids) + except Exception: + partner.relationshipPartner_count = 0 qualifier_ids = fields.One2many( 'opendons_qualifier.partnerqualifier', @@ -48,9 +72,51 @@ class partner(models.Model): string='Address', readonly=True ) + + # request_ids = fields.One2many( + # 'opendons.request', + # 'partner_ids', + # string='Request', + # readonly=True + # ) + request_ids = fields.Many2many('opendons.request', 'request_partner_rel', 'partner_id', 'request_id', string='requests') + address_count = fields.Integer( compute='_compute_address_count', string="# of Addresses", readonly=True ) + relationshipPartner_ids = fields.One2many( + 'opendons_relationship.partner', + 'partner_id', + string='Relationship', + readonly=True + ) + relationshipPartner_count = fields.Integer( + compute='_compute_relationshipPartner_count', + string="# of Relationship", + readonly=True + ) + email_ids = fields.One2many( + 'opendons.partneremail', + 'partner_id', + string='Email', + readonly=True + ) + email_count = fields.Integer( + compute='_compute_email_count', + string="# of email", + readonly=True + ) + phone_ids = fields.One2many( + 'opendons.partnerphone', + 'partner_id', + string='Phone', + readonly=True + ) + phone_count = fields.Integer( + compute='_compute_phone_count', + string="# of phone", + readonly=True + ) diff --git a/models/phone.py b/models/phone.py new file mode 100644 index 0000000..1de95ee --- /dev/null +++ b/models/phone.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError +from odoo.tools.safe_eval import safe_eval, datetime + +from werkzeug import utils + + + +class opendons_partnerphone(models.Model): + _name = 'opendons.partnerphone' + _description = 'telephones du contact' + _inherit = ['mail.thread'] + + phone = fields.Char() + + active=fields.Boolean(string='active',default=True,track_visibility='always') + date_active=fields.Date(readonly=True,string='Date active',track_visibility='always') + date_inactive=fields.Date(readonly=True,string='Date inactive',track_visibility='always') + + partner_id = fields.Many2one( + 'res.partner', + string='partner', + required=True, + index=True, + readonly=True, + track_visibility='onchange', + ondelete='restrict' + ) + + def write(self,vals): + date_active=False + date_inactive=False + for val in vals: + if val=='active' and not vals['active']: + date_inactive=fields.Date.context_today(self) + if val=='active' and vals['active']: + date_inactive=False + date_active=fields.Date.context_today(self) + + + vals['date_inactive']=date_inactive + vals['date_active']=date_active + + + res = super(opendons_partnerphone, self).write(vals) + + #Your code goes here + return res + + + + + diff --git a/models/qualifier.py b/models/qualifier.py index 962ed4c..0a58a62 100644 --- a/models/qualifier.py +++ b/models/qualifier.py @@ -33,19 +33,37 @@ class opendons_qualifier(models.Model): _description = 'qualificatifs de contacts' name = fields.Char() - type=fields.Selection([('checkbox','checkbox'),('text','text'),('numerical','numerical')], default='checkbox') + #type=fields.Selection([('checkbox','checkbox'),('text','text'),('numerical','numerical')], default='checkbox') default_value = fields.Char() description = fields.Text() category_id = fields.Many2one( 'opendons_qualifier.category', string='Category', tracking=True, required=True) + @api.model + def create(self,vals): + + + + res = super(opendons_qualifier, self).create(vals) + + #ajout du qualificatif nouvellement créé pour chaque contact + for partner in self.env['res.partner'].sudo().search([]): + + + create_partner_qualifier=self.env['opendons_qualifier.partnerqualifier'].sudo().create( + {'partner_id': int(partner.id), + 'qualifier_id':int(res.id)}) + + + return res + class opendons_partnerqualifier(models.Model): _name = 'opendons_qualifier.partnerqualifier' _description = 'qualificatifs pour stocker les valeurs au niveau du contact' - + actif=fields.Boolean(string='actif',default=False) value=fields.Char() qualifier_id=fields.Many2one('opendons_qualifier.qualifier',string='qualifier') category = fields.Char(related='qualifier_id.category_id.name') diff --git a/models/relationship.py b/models/relationship.py new file mode 100644 index 0000000..74bd649 --- /dev/null +++ b/models/relationship.py @@ -0,0 +1,145 @@ +# -*- coding: utf-8 -*- + +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + +class opendons_relationshipType(models.Model): + _name = 'opendons_relationship.type' + _description = 'type de la relation' + + name = fields.Char('Name', required=True) + description = fields.Text() + + nature_ids = fields.One2many( + 'opendons_relationship.nature', + 'type_id', + string='Nature', + required=True, + track_visibility='onchange') + + @api.constrains('name') + def _check_name(self): + + count=self.search_count([('name','=',self.name),('id', '!=', self.id)]) + if count>0: + raise UserError('This name already exist') + +class opendons_relationshipNature(models.Model): + _name = 'opendons_relationship.nature' + _description = 'nature de la relation' + + name = fields.Char('Name', required=True) + description = fields.Text() + type_id = fields.Many2one( + 'opendons_relationship.type', string='Type', tracking=True, + required=True) + + + @api.constrains('name') + def _check_name(self): + + count=self.search_count([('name','=',self.name),('id', '!=', self.id)]) + if count>0: + raise UserError('This name already exist') + +class opendons_relationshipPartner(models.Model): + _name = 'opendons_relationship.partner' + _description = 'relations pour un contact' + + type_id=fields.Many2one('opendons_relationship.type',string='type') + nature_id=fields.Many2one('opendons_relationship.nature',string='nature') + + #nature = fields.Char(related='type_id.nature_id.name') + partner_id = fields.Many2one( + 'res.partner', + string='partner', + required=True, + index=True, + readonly=True, + track_visibility='onchange', + ondelete='restrict' + ) + partnerRelationship_id = fields.Many2one( + 'res.partner', + string='partner relationship', + required=True, + index=True, + track_visibility='onchange', + ondelete='restrict' + ) + active=fields.Boolean(string='active',default=True,track_visibility='always') + #date_active=fields.Date(readonly=True,default=lambda self: fields.Date.today(),string='Date active',track_visibility='always') + date_active=fields.Date(readonly=True,string='Date active',track_visibility='always') + date_inactive=fields.Date(readonly=True,string='Date inactive',track_visibility='always') + + @api.onchange('type_id') + def _onchange_type_id(self): + res = {} + res['domain']={'nature_id':[('type_id', '=', self.type_id.id)]} + return res + + + # def create(self,vals): + + + # # vals['active']=fields.Date.context_today(self) + # res = super(opendons_relationshipPartner, self).create(vals) + + # return res + + def write(self,vals): + date_active=False + date_inactive=False + for val in vals: + if val=='active' and not vals['active']: + date_inactive=fields.Date.context_today(self) + if val=='active' and vals['active']: + date_inactive=False + date_active=fields.Date.context_today(self) + + + vals['date_inactive']=date_inactive + vals['date_active']=date_active + + + res = super(opendons_relationshipPartner, self).write(vals) + + + return res + + @api.model + def create(self,vals): + + vals['date_active']=fields.Date.context_today(self) + res = super(opendons_relationshipPartner, self).create(vals) + + #Attention la relation est reciproque entre les 2 contacts,donc on doit créer la relation pour l'autre contact + vals2={} + vals2['type_id']=int(res.type_id) + vals2['nature_id']=int(res.nature_id) + vals2['partner_id']=int(res.partnerRelationship_id) + vals2['partnerRelationship_id']=int(res.partner_id) + vals2['active']=True + vals2['date_active']=fields.Date.context_today(self) + + + res2=super(opendons_relationshipPartner, self).create(vals2) + + + + return res + + + # sql_constraints = [ + # ('qualifier_uniq', 'unique (qualifier_id,partner_id)', 'A qualifier could be defined only one time on same partner.') + # ] + + # @api.constrains('qualifier_id') + # def _check_qualifier_id(self): + # for q in self: + # result=self.search_count([('qualifier_id','=',int(self.qualifier_id)),('id', '!=', self.id),('partner_id','=',int(self.partner_id))]) + # if result>0: + # raise UserError('A qualifier could be defined only one time on same partner.') \ No newline at end of file diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index 2dd4f97..05db5c6 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -3,4 +3,13 @@ access_opendons_qualifier_qualifier,opendons_qualifier.qualifier,model_opendons_ access_opendons_qualifier_category,opendons_qualifier.category,model_opendons_qualifier_category,donation_main.group_donation_manager,1,1,1,1 access_opendons_qualifier_partnerqualifier,opendons_qualifier.partnerqualifier,model_opendons_qualifier_partnerqualifier,donation_main.group_donation_manager,1,1,1,1 access_opendons_partneraddress,opendons.partneraddress,model_opendons_partneraddress,donation_main.group_donation_manager,1,1,1,1 -access_opendons_operations,opendons.operations,model_opendons_operation,donation_main.group_donation_manager,1,1,1,1 \ No newline at end of file +access_opendons_operations,opendons.operations,model_opendons_operation,donation_main.group_donation_manager,1,1,1,1 +access_opendons_segments,opendons.segments,model_opendons_segment,donation_main.group_donation_manager,1,1,1,1 +access_opendons_ensembles,opendons.ensembles,model_opendons_ensemble,donation_main.group_donation_manager,1,1,1,1 +access_opendons_requests,opendons.requests,model_opendons_request,donation_main.group_donation_manager,1,1,1,1 + +access_opendons_relationship_partner,opendons_relationship.partner,model_opendons_relationship_partner,donation_main.group_donation_manager,1,1,1,1 +access_opendons_relationship_nature,opendons_relationship.nature,model_opendons_relationship_nature,donation_main.group_donation_manager,1,1,1,1 +access_opendons_relationship_type,opendons_relationship.type,model_opendons_relationship_type,donation_main.group_donation_manager,1,1,1,1 +access_opendons_partneremail,opendons_partneremail,model_opendons_partneremail,donation_main.group_donation_manager,1,1,1,1 +ccess_opendons_partnerphone,opendons_partnerphone,model_opendons_partnerphone,donation_main.group_donation_manager,1,1,1,1a \ No newline at end of file diff --git a/views/address.xml b/views/address.xml index 42fa847..6050a22 100644 --- a/views/address.xml +++ b/views/address.xml @@ -3,7 +3,7 @@ - + opendons_partneraddress list opendons.partneraddress @@ -20,7 +20,7 @@ - + opendons_partneraddress.search opendons.partneraddress @@ -30,7 +30,7 @@ - + opendons_partneraddress Form opendons.partneraddress diff --git a/views/email.xml b/views/email.xml new file mode 100644 index 0000000..b08f2a9 --- /dev/null +++ b/views/email.xml @@ -0,0 +1,64 @@ + + + + + + + opendons_partneremail list + opendons.partneremail + + + + + + + + + + + opendons_partneremail.search + opendons.partneremail + + + + + + + + + opendons_partneremail Form + opendons.partneremail + +
+ + + + + + + + + + + + +
+ + +
+
+
+
+ + + + + + + partneremails + opendons.partneremail + tree,form + + +
+
\ No newline at end of file diff --git a/views/mail_mail.xml b/views/mail_mail.xml new file mode 100644 index 0000000..91a9e70 --- /dev/null +++ b/views/mail_mail.xml @@ -0,0 +1,15 @@ + + + + operation.emailmarketing.opendons.form + mailing.mailing + + + + + + + + + + \ No newline at end of file diff --git a/views/operation.xml b/views/operation.xml index 4364d62..68740bb 100644 --- a/views/operation.xml +++ b/views/operation.xml @@ -1,10 +1,272 @@ + + Segments + opendons.segment + tree,form,graph + {'search_default_operation_id': active_id} + + + + Ensembles + opendons.ensemble + tree,form,graph + {'search_default_segment_id': active_id} + + + + Requests + opendons.request + tree,form,graph + {'search_default_ensemble_id': active_id} + + + + + opendons_operations list + opendons.operation + + + + + + + + + + + + + + + + + opendons_segment list + opendons.segment + + + + + + + + + + + + + + + opendons_segment.search + opendons.segment + + + + + + + + + opendons_ensemble list + opendons.ensemble + + + + + + + + + + + opendons_ensemble.search + opendons.ensemble + + + + + + + + + + + + opendons_request list + opendons.request + + + + + + + + + + + + opendons_request.search + opendons.request + + + + + + + + + + opendons_operation Form + opendons.operation + +
+
+
+ + + + + + + + + + + + +
+ +
+
+ + +
+
+
+
+ + + opendons_segment Form + opendons.segment + +
+ + + + + + + + + + + + +
+ +
+
+
+
+
+
+ + + opendons_ensemble Form + opendons.ensemble + +
+
+ + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+
+ + + opendons_request Form + opendons.request + +
+ + + + + + + + +
+
+
+ + + Opérations + opendons.operation + tree,form,pivot,graph + + + name="Operations"/> + + +
+ +
\ No newline at end of file diff --git a/views/partner.xml b/views/partner.xml index 30f08cd..07e1b62 100644 --- a/views/partner.xml +++ b/views/partner.xml @@ -1,6 +1,5 @@ - @@ -17,6 +16,28 @@ {'search_default_partner_id': active_id} + + Emails + opendons.partneremail + tree,form,graph + {'search_default_partner_id': active_id} + + + + phones + opendons.partnerphone + tree,form,graph + {'search_default_partner_id': active_id} + + + + + Relationships + opendons_relationship.partner + tree,form,graph + {'search_default_partner_id': active_id} + + qualifier.button.res.partner.form res.partner @@ -27,15 +48,33 @@ + + +
@@ -48,5 +87,10 @@ + + + + diff --git a/views/phone.xml b/views/phone.xml new file mode 100644 index 0000000..eb2b1b8 --- /dev/null +++ b/views/phone.xml @@ -0,0 +1,64 @@ + + + + + + + opendons_partnerphone list + opendons.partnerphone + + + + + + + + + + + opendons_partnerphone.search + opendons.partnerphone + + + + + + + + + opendons_partnerphone Form + opendons.partnerphone + +
+ + + + + + + + + + + + +
+ + +
+
+
+
+ + + + + + + partnerphones + opendons.partnerphone + tree,form + + +
+
\ No newline at end of file diff --git a/views/qualifier.xml b/views/qualifier.xml index c143dbf..e98f636 100644 --- a/views/qualifier.xml +++ b/views/qualifier.xml @@ -2,7 +2,7 @@ - + opendons_qualifier_category list opendons_qualifier.category @@ -14,14 +14,13 @@ - + opendons_qualifier list opendons_qualifier.qualifier - @@ -29,18 +28,19 @@ - + opendons_partnerqualifier list opendons_qualifier.partnerqualifier - + + - + opendons_partnerqualifier.search opendons_qualifier.partnerqualifier @@ -50,22 +50,19 @@ - + opendons_partnerqualifier Form opendons_qualifier.partnerqualifier
- -
diff --git a/views/relationship.xml b/views/relationship.xml new file mode 100644 index 0000000..f64b1d2 --- /dev/null +++ b/views/relationship.xml @@ -0,0 +1,113 @@ + + + + + + opendons_relationship_type list + opendons_relationship.type + + + + + + + + + + + opendons_relationship_nature list + opendons_relationship.nature + + + + + + + + + + + + opendons_relationship_partner list + opendons_relationship.partner + + + + + + + + + + + + opendons_relationship_partner.search + opendons_relationship.partner + + + + + + + + + opendons_relationshipPartner Form + opendons_relationship.partner + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + + relationshipTypes + opendons_relationship.type + tree,form + + + + relationshipNature + opendons_relationship.nature + tree,form + + + + relationshipPartner + opendons_relationship.partner + tree,form + + + + + + +
+
\ No newline at end of file