From 3c082203568bdc736ab5919efbe09f3f646a3ce9 Mon Sep 17 00:00:00 2001 From: raynald Date: Thu, 4 Nov 2021 13:56:17 +0100 Subject: [PATCH] adress qualifier operation --- models/__init__.py | 5 +- models/__pycache__/__init__.cpython-37.pyc | Bin 198 -> 291 bytes models/__pycache__/address.cpython-37.pyc | Bin 0 -> 1790 bytes models/__pycache__/models.cpython-37.pyc | Bin 3528 -> 1676 bytes models/__pycache__/operation.cpython-37.pyc | Bin 0 -> 2909 bytes models/__pycache__/partner.cpython-37.pyc | Bin 0 -> 1489 bytes models/__pycache__/qualifier.cpython-37.pyc | Bin 0 -> 2793 bytes models/address.py | 68 ++++++++++ models/operation.py | 89 +++++++++++++ models/partner.py | 56 ++++++++ models/qualifier.py | 73 +++++++++++ views/address.xml | 88 +++++++++++++ views/operation.xml | 10 ++ views/partner.xml | 24 +++- views/qualifier.xml | 138 ++++++++++++++++++++ 15 files changed, 549 insertions(+), 2 deletions(-) create mode 100644 models/__pycache__/address.cpython-37.pyc create mode 100644 models/__pycache__/operation.cpython-37.pyc create mode 100644 models/__pycache__/partner.cpython-37.pyc create mode 100644 models/__pycache__/qualifier.cpython-37.pyc create mode 100644 models/address.py create mode 100644 models/operation.py create mode 100644 models/partner.py create mode 100644 models/qualifier.py create mode 100644 views/address.xml create mode 100644 views/operation.xml create mode 100644 views/qualifier.xml diff --git a/models/__init__.py b/models/__init__.py index 5305644..7de966d 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,3 +1,6 @@ # -*- coding: utf-8 -*- -from . import models \ No newline at end of file +from . import qualifier +from . import partner +from . import address +from . import operation \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-37.pyc b/models/__pycache__/__init__.cpython-37.pyc index 75e4d6c65e75fd32acb675871e451f2f4883204b..09e4a8fd6db7ea9da928dbdfa64bec9eb364be03 100644 GIT binary patch delta 208 zcmX@cxR{C8iIkj)gu1ZFb>+00SQ zU^WYo%@V}|WU~e{XtKRz1Zve}yv12qnwXQBmYG@v TPO9O=1&Z9oY(QxqMi2x5J6SO4 delta 114 zcmZ3?bc~VLiIav7r-85vTTf*CZKUorxPH5qTQ z<>sfP<`nyBGTmY*Vgib-WGG?*Qefg&z{EY;LMi!qi6xo&dGUp%i8+~RnW;q+zbmqS I1}b6z0Hs45$p8QV diff --git a/models/__pycache__/address.cpython-37.pyc b/models/__pycache__/address.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..709d4198d2226c8b94c2a01f7d91a2a927df96a5 GIT binary patch literal 1790 zcmZ8iOK)Q}6t?dxH}CW{ox%(%n?j_LFok7>U^)z%MXQm3L9&Fd+-oPjt?#3@(>77M zVMdx&|HH6k$BG}ok6_^~EB*p2j-9j=eB~2==N!L2e|Da>+YJPzI{k_MR!8Vh3vNpQ zjW4095g3LT7AVIA=N|ELpZM7NJQ3s}3G;|V4*Q~($0W|{r0#Ga8hMj6^A>429Ex_{ zAsvjqK`dgmH;C0ZKJC8tNsqZ?ohl$4TtJW)O4t^L@kG!OVoC# zwL~32UDjqD)&)=RCLlfVtgscf3V7|tC#!(hAY&cy2Hv)WAo36xerz_&iWjUbR8mo?3oa>Rk}Ea43k?1jSfeh1t8F&fPRl~m zRL`0@&BQ>TNKV;g9SA%6{nu?;*{(S+^zKNMa7qysmvpM&a3ZB;R*X$gOPZb~7n#bA zGm+`(tPAOKx~t1eE_aWqHZ@4)TtB&O?9G}lOQorR$r&fX0rWDpgK}c~eK%_zz5MD0 zgaC3WF)XDYnAonXEW}iHz+q~PkLW~b*|jKw4P+PmdEa+YX_xOJGpioHofV4&h_Bg@ z9byr00#mp2nA(yj6PHDLLW?oC)7pKex*shj2FLj%lbo3_D;U384Cqz?y+Gq!^VEa! zZ3&^;Yv)5%$6&7Z=lB`=@$+kM4njQhsclj^qZ+^xP3=f}*0CY1?~}+_4ZzyC4%- zZcN(>fM4lEmyAwLs3sM#-m(edrOY(%hbB;5j7$Jm4sI@3`Phbi;07*UJxNkQl}eId z(BFr{iIPK+9S^IiJ}HaOhAdP1lL{n4$6O6dR+d8$D9Ckqr(1X%CW1d1F5UtUQz^_v7h*HvuTt+q&S8AG;)p$?VtS<&b)?K=WEvmuY!!7O0EbU*FiQ$nr ooAJq5HZ2Sf?f-;Z!N1#DwCtu#yuUcaFWi-~BdmiS>@HftKO?&B3IG5A literal 0 HcmV?d00001 diff --git a/models/__pycache__/models.cpython-37.pyc b/models/__pycache__/models.cpython-37.pyc index f88cce87cb90c7fed7f3a7d462e5b01c75d511ca..bd2ca038a7fdd7b2845962affe99bafac94808b7 100644 GIT binary patch delta 267 zcmX>h-NVc0#LLUY00d3D>Jr6RC-O-!W=vF1XG`G>X3*rCxZ|LCenDzpN`78(d|_!~ zPG(wWYLRndNosn2QDv1hrkq|fRC4nnMr}q$pULl-v<2YGa`RJ4b5ac_YcuOh!38nQ z-CV-#&Zv$lUnPSnrZ@RDOR5Y$hfJ~JYFbXgV KF!3-6i2(ozfLiYW literal 3528 zcmbtXTW=f372eq!mv>oq8!N5Tb<-3k5L2n!q5*P&6Wa(=FIKPIp4YH<8HTQ;cxiYBEECe zvi?Pb^`DE*Lp1dd5N>gnS~C{0nH||PCvq6^?9`okkvH=r-;ABKF$E7hJjf}ou#__I4#V?S&l$!oO<1w4xTiZG1bT zd)4EOmy8Fz`IU9aqCRgy{I-6b=b4ddJc$c2&E@jx0&?ONa&^C+J6rRHHEX@Ro?6|l zScy>KJYUE#MW>p^RC1&SQ1*J?c#$P%tKPHGr%#_fxpyy%XJRl|?HwE^Dx^Uer&7dx z8H)2n6>6y65x55frUNO?7Ks#GyR>k^DlOUg`e={P)B}(U>k3%m_JwuAjvVfA7d`vP znc6Sem+XRZ@6?sU!r}fU`#V$$g)~O8i=AJy544@|m3{XENyo2V`xdzduI?xi%gOP0 zk}tBt?3R6Oksb(a>?)BSY0u35(~^L;_4R0fq2zv=9PZDT#c`hfa-ZXk_vi8CG@c5z zpYuH5k2!R$_G^XLirz1wR(*!^rEZTW$6|6iCUxAx1&Y*QId8Clt$tn~u-5$3+L&A0 zMuQz4jLiw-v2KmWxMYzE^gH7*T}@|W9KA2`PQGgZhq$qFSMT(8|n z$FVdD(Tz_tfJ;d2<&xv$9*FZox3|ua1aaM}4^i?5U>J365qg}YIMGB?J&=I8%yoRb zhqnf{nY-pWq=|>L_zxhjdXDg}e0WDgcqakDgL_kefj8hm&1$ZNZ|OnaNte8bxA1Gf zaHAgY05Dy>TPwJ>(CV#k@;08cS+-YoOYaD|2=V?Ro)ike35-n-^KssosFa*Cep;EK_pFMmi^ zy+-6Vkv$@>6Cs1k9}^+>(aq0ADkcUSZn2yT-L2#rKabOekUyc7A*~EPi?ii}JQKRT z#^*TUTP7!mk;d*nMUR@=1u=HF19pq-4h;BA(%d!M6G$GSsUwj8ZTr&dC%!=dL+m6} ztSt_k^A7L6Xhdz^L%b~`Y9A4Ghu^3o>MrnbQ}5NbpU1MugxuKs?Ru)_ZD8?@)$d(L zhY6{w$S0?w46RV5SV$Gdi!e)`3w-!u4WRFcz^GXZGGOu^)U>)&b6|(zmQ98f0T6y0 zQltP2U$v!B!%Ax1s5%Ea$g|0DoJ|DLBgd7dH2icKpKQ4N5y_{ud};fSh0?e}m&CMKzN_DEsKv=4E9j`hQ*r zJM7?e?I1{(mzhlUF5T#X3>pPOxT?;97I(dwl?T{keD;OK$0BOX8179={K2VNPZONNR7)@|Y z^1!(B!a*Q06{P$Hj=JVdtJ}4{0O;Ds(60e$V^0mp4>34@*8uXJFWGXZurAmMyF`UE zw!g5>eAgJ*Ipd@v)7@(V=>BGC>KNU8ay}6z_YZ6X z8S{uObsMnUMoloAFA8A_2vbv*RZ;8}mL z_#Fq+&wLum3(5ZoXp zGl<1ZVl#_4%pRDe!rg-^bHHpcoK=q;;%UU2Lu!E3S#1t!Xrw-eGy!R`25Yj`z-H~) zOog;zW`QlR4qIeP;D|FvHt7Ji$d=g(J9}i2C4S~$nXR&O?~J!5S<(7yY#sL4VCVS? z`{>9eXW0dIabS^Em_5gQb_r%L!%k~3UT0U>Rd!A5Uq7ml4R!-ud{ZrDL!PoMl>u~w z_TYGi^=4Rc2b_})e|cZ3_z4v+cpjw#{~q+C7WlP zEqKW1%BAruI+9&SxiS~9RC$6Q7Lnjg)p9{o8PlAr4s^p8!OKWSyKq82QqB%d__z*_ z%KcqFh|;mA`)~tzaR-kg)hDGn093R=W^mlJKQr`WTCcBJ2 zI1AhV1dag-elnT$v-yMh#yqgV5%$iwfes9_WJuG|Y5eKhVim1f4kk*$#H?VzbK%1j z7_){N)ro@kVktHdU!1L&T8prBK^Ruubj|VAQ@n9v(YUECoj5^xTeDu4hCqe^M=~NU z!@OJ3E);DzLUceVFH0d4@tlhbFoe`pOM#I=kw%B(7RrMAHxcTNSCFedjgj~xpTCC3 zm;NPO5<(FCX9+^E1jFOR60)v+R^&WLi)5FJAlnNhP#ywj+`Qsvd;Vkun``fZYWenX z6AA>2N8`@aH$BM*7@4X$qYN;Cc+W~$!b2f#j_<|LM1=cE6(E%i`;!S)6Isude@M8)ZG=jvW zs^6qJA8%PgA~`z)_?zaTlB<=NO3*E|7l$i)Iy?dt{$3`0n)=7P{j019_;zBU+JKZJG!wvc{b7&Ino`jSRsMA9TL(VbSIo`8p?B-7$4w23lh`9ve_{^R?}L#`w!n12dMx6 literal 0 HcmV?d00001 diff --git a/models/__pycache__/partner.cpython-37.pyc b/models/__pycache__/partner.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83f4c33df89e20b68f4f8b6c05795b138a3ad510 GIT binary patch literal 1489 zcmcIk&5qPY5bm};c6(+#Gc231xuBIe4H7#EaL6G-BmqS^uo2?FC1jcD-od;6+iH)( zj5fI}SKc8}PC4Z@@(g|D#4B*3x@}Lgi#XC&m#aQkm+QBGh@w8h_1C|@C;#*ad257j zdC1(xtsWy0M9_@nl+)bdPVRD-8qCSOyvKXF&wVSqS&%c%@{osC_OgCH-~&p2BBCe! z*F^Y|9u7}k9*N)qnX-3in@nBp=cSOD(*8jzGoiGbRO!^w;UgvCENwNUoup1)BuX|Y)xBk%W@>H>cgsiSHf~iQk%Uu0xFaZcrT0fqIDb;%3hy;J zrQC1aNQDf3-L{{U1*lIOK;v$B)t%E9o zx{$CQfK+>(uyee`fG}K$Q?Y@OpHpSy58*$e(KQY&mj!Z zFFn8jv8c+FP)D6$^9LhTm^v`Vmra~aTSG3GvtMqUKXdLY{MN+lY~sEAQM_l4tgmbm zyh&cyXB$BGTO;Tz5AS!)_YjNgs~XZ`p&7^o%apBP3!PYxuk4lwyBke~V;ZzYf=ec< z9iw%r`*-)p)-@e`-{c0qFlr-ftc9f7pN=()<08pr9P57Eb_Vjp*mgksg~e&{QbJmT zxsG%oq-iB(9khnQH8}gFkk|91Si#V${an;?Aps(k;G!YhhL~RZA2DUHr7>#iDiTIL zXDejP!%i~~a~h7h=Mj5ue>&2hX>>5NYF%mk92;;?b_1jUFINKQ8q%y%t9e;1u0voj rX0cx-9IfSY0cPHH@1D5~&o_;A-gXZAu9>4-W}KC=u#Iyuafa*zjKzPk literal 0 HcmV?d00001 diff --git a/models/__pycache__/qualifier.cpython-37.pyc b/models/__pycache__/qualifier.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..718897016598fffd25384785213cdb8722e0b3f5 GIT binary patch literal 2793 zcmbtW-EQ1O6!!Rk|I@Uzq%FmzfU;7%3*`n>ib~T8711DQ3X&ycIiA^#6R*9Qu}gLp zxFEglJEWI92rn_WT=5FM;+(P9*$^m5c;(}nGc#vq&d>Ml{Z6N;!Sm|3pTki@(|*U! z;xVCd4_+|`K{ZMeZ9;r9(S3bl_y$3po|qHMwvjXC}s&2 z(g>$o3Vq-^YcspaIU^7+k%BW+6khpNOQHC_h1RPKtM!I!IF`* z)ab7oKabYG9u|TRlX!bLo#i`O`q7ZW9dAv;XfGTyG0bR|4MU1S7}g$#bSe_|;jm1r zVI7>obS7Itw8Nsk0R3?Rb`ayJ!X+j#4O{QRU0q#`ohlUc#66t+Er`Ds z3bT%FCP zDgn%VHf6F?og#P^CI#bf<4g}{x{t$jb~{U%Y}NH2)1|m#S#TBHcc6s}#VQCDT-_xX zFt`wCn{XUI6=2MSd+>@8h<^`o8QNW2g_!^zV(1rPg}~A_?YwaO7VQFtmMGZ+lw6_b zDwJG>pr4m(b%3WK&r`-vqI;trs&#`ilkS{O0fm<$&!Rn6;wE^I6;id621|M21 zvgGyIB^&j&eZtqlDf72#O%T%>u(6Fr4Up<^mH;Nud5bf#IIMK4Q*TK(OQW4I9Ww-9 z%$q3h+sd{|8fnETWd}GI0%#>Oe?=u#@GKVbcAUid3{3zXvYY`4bWhHsSinPBFmL@t zAJd!F?r_Zh{LbeKCISBdmL}BOW>7ezIAzqsEkQ6ZkAXO{)Dv(muUbEl?PaqyU0^a} z?rgxTz~SJlL+yd~!vmlOtt5^dTD$tu33(VmBNo+_-bDS_04mWBb!r2Z*tta=q>_F6 zd-%HndE##JkHI`gpi-=Wj3S#SH!IoY|J)AZumaYl0k~Ukrr75b+|dHjH~2XmC;QTd z*a1c?l^s@`JYTWEvX}0|fN()*dXs#BG;*uX>gx3M^aYF53Wyl6$$x+mX_Y{63-(cG z2k@(?iK`1-!2u)&ejUYK6bdR%gaVBr4BUiQTmw-uf=jxj4UnNP{an*FIL<|~Gm&Mv z4!siB6#w*4Iba77Q^Y2e3psL#bf;n#Wz+F(?%*19j&y%yd~eQ*F~>}j)?@t3r#MLA gl-ld>4lLbIOM3kbvrr)LULY%EMQ`h?7gsxf0zbX}tpET3 literal 0 HcmV?d00001 diff --git a/models/address.py b/models/address.py new file mode 100644 index 0000000..0c807a0 --- /dev/null +++ b/models/address.py @@ -0,0 +1,68 @@ +# -*- 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_partneraddress(models.Model): + _name = 'opendons.partneraddress' + _description = 'adresses du contact' + _inherit = ['mail.thread'] + + #Complément d’identification du destinataire ou point de remise à l’intérieur du bâtiment : N° appartement, boite aux lettres, étage, couloir + complement_ident = fields.Char(string='N° appartment,floor',track_visibility='always') + #Complément d’identification du point géographique – extérieur du bâtiment : entrée, tour, bâtiment, immeuble, résidence + complement_geo = fields.Char(string='entry,tower,bat',track_visibility='always') + #Numéro et libellé de la voie + street1 = fields.Char(string='street1', track_visibility='always') + #Lieu dit ou service particulier de distribution – Poste restante, boite postale, etc. + street2 = fields.Char(string='street2',track_visibility='always') + #Code postal + postalcode = fields.Char(string='Postal code',track_visibility='always') + #Ville + city = fields.Char(string='City', track_visibility='always') + #Pays + country = fields.Char(string='Country', track_visibility='always') + + #Compteur NPAI + npai=fields.Integer(readonly=True,string='NPAI counter',default=0,track_visibility='always') + #active + active=fields.Boolean(string='active',default=False,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): + + 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 + + vals['npai']=0 + vals['date_inactive']=date_inactive + #self.message_post(body=_('remise à zero du compteur NPAI')) + + res = super(opendons_partneraddress, self).write(vals) + + #Your code goes here + return res + + + + + diff --git a/models/operation.py b/models/operation.py new file mode 100644 index 0000000..5bae2e1 --- /dev/null +++ b/models/operation.py @@ -0,0 +1,89 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + +class opendons_operation(models.Model): + _name = 'opendons.operation' + _description = 'opération marketing : mailing, emailing evenements' + _inherit = ['mail.thread'] + + code=fields.Char(string='Code',required=True, translate=True,track_visibility='always') + name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') + begin_date=fields.Date(string='Date begin',required=True, translate=True,track_visibility='always') + end_date=fields.Date(string='Date end',required=True, translate=True,track_visibility='always') + chanel=fields.Selection([ + ('mail', 'Mailing'), + ('email', 'E-mailing'), + ('event', 'Event')], + string='Chanel',required=True, translate=True,track_visibility='always') + + user_id = fields.Many2one('res.users', string='Author', default=lambda self: self.env.uid) + cost = fields.Monetary( + string='Cost', + currency_field='currency_id') + + @api.model + def _default_currency(self): + company = self.env['res.company']._company_default_get( + 'opendons.operation') + return company.currency_id + + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + required=True, + track_visibility='onchange', + ondelete='restrict', + default=_default_currency + ) + _sql_constraints = [ + ('name_uniq', 'unique (name)', "Name already exists !"), + ('code_uniq', 'unique (code)', "Code already exists !"), + ] + + number_of_sending = fields.Integer( + compute='_compute_number_of_sending', + string="# of sending", + readonly=True + ) + segment_ids = fields.One2many( + 'opendons.segment', + 'operation_id', + string='Segments', + required=True, + track_visibility='onchange') + + +class opendons_segment(models.Model): + _name = 'opendons.segment' + _description = 'operation marketing segment : a segment is a part of contacts selected for an operation ' + _inherit = ['mail.thread'] + code=fields.Char(string='Code',required=True, translate=True,track_visibility='always') + name=fields.Char(string='Name',required=True, translate=True,track_visibility='always') + cost = fields.Monetary( + string='Cost', + currency_field='currency_id') + + @api.model + def _default_currency(self): + company = self.env['res.company']._company_default_get( + 'opendons.segment') + return company.currency_id + + currency_id = fields.Many2one( + 'res.currency', + string='Currency', + required=True, + track_visibility='onchange', + ondelete='restrict', + default=_default_currency + ) + + operation_id = fields.Many2one( + 'opendons.operation','Operation', + ondelete='cascade', + track_visibility='always') + + \ No newline at end of file diff --git a/models/partner.py b/models/partner.py new file mode 100644 index 0000000..9407dc7 --- /dev/null +++ b/models/partner.py @@ -0,0 +1,56 @@ +from odoo import models, fields, api +from odoo.exceptions import UserError, ValidationError +from psycopg2 import sql, DatabaseError + +from werkzeug import utils + + + + + + + +class partner(models.Model): + _inherit = 'res.partner' + + @api.depends('qualifier_ids.partner_id') + def _compute_qualifier_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.qualifier_count = len(partner.qualifier_ids) + except Exception: + partner.qualifier_count = 0 + + def _compute_address_count(self): + # The current user may not have access rights for donations + for partner in self: + try: + partner.address_count = len(partner.address_ids) + except Exception: + partner.address_count = 0 + + qualifier_ids = fields.One2many( + 'opendons_qualifier.partnerqualifier', + 'partner_id', + string='Qualifier', + readonly=True + ) + qualifier_count = fields.Integer( + compute='_compute_qualifier_count', + string="# of Qualifiers", + readonly=True + ) + + address_ids = fields.One2many( + 'opendons.partneraddress', + 'partner_id', + string='Address', + readonly=True + ) + address_count = fields.Integer( + compute='_compute_address_count', + string="# of Addresses", + readonly=True + ) + diff --git a/models/qualifier.py b/models/qualifier.py new file mode 100644 index 0000000..962ed4c --- /dev/null +++ b/models/qualifier.py @@ -0,0 +1,73 @@ +# -*- 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_qualifierCategory(models.Model): + _name = 'opendons_qualifier.category' + _description = 'categories pour les qualificatifs' + + sql_constraints = [ + ('category_uniq', 'UNIQUE((name))', 'This name already exists.') + ] + name = fields.Char('Name', required=True) + order= fields.Integer() + description = fields.Text() + + @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_qualifier(models.Model): + _name = 'opendons_qualifier.qualifier' + _description = 'qualificatifs de contacts' + + name = fields.Char() + 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) + + +class opendons_partnerqualifier(models.Model): + _name = 'opendons_qualifier.partnerqualifier' + _description = 'qualificatifs pour stocker les valeurs au niveau du contact' + + + value=fields.Char() + qualifier_id=fields.Many2one('opendons_qualifier.qualifier',string='qualifier') + category = fields.Char(related='qualifier_id.category_id.name') + partner_id = fields.Many2one( + 'res.partner', + string='partner', + required=True, + index=True, + readonly=True, + track_visibility='onchange', + ondelete='restrict' + ) + + 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.') + + diff --git a/views/address.xml b/views/address.xml new file mode 100644 index 0000000..42fa847 --- /dev/null +++ b/views/address.xml @@ -0,0 +1,88 @@ + + + + + + + opendons_partneraddress list + opendons.partneraddress + + + + + + + + + + + + + + + + opendons_partneraddress.search + opendons.partneraddress + + + + + + + + + opendons_partneraddress Form + opendons.partneraddress + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + + + + + + partneraddresses + opendons.partneraddress + tree,form + + +
+
\ No newline at end of file diff --git a/views/operation.xml b/views/operation.xml new file mode 100644 index 0000000..4364d62 --- /dev/null +++ b/views/operation.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/views/partner.xml b/views/partner.xml index e5cfe08..30f08cd 100644 --- a/views/partner.xml +++ b/views/partner.xml @@ -5,7 +5,14 @@ Qualifiers - donation_qualifier.donation_partnerqualifier + opendons_qualifier.partnerqualifier + tree,form,graph + {'search_default_partner_id': active_id} + + + + Addresses + opendons.partneraddress tree,form,graph {'search_default_partner_id': active_id} @@ -23,8 +30,23 @@ icon="fa-check-square"> + + + + + + + diff --git a/views/qualifier.xml b/views/qualifier.xml new file mode 100644 index 0000000..c143dbf --- /dev/null +++ b/views/qualifier.xml @@ -0,0 +1,138 @@ + + + + + + opendons_qualifier_category list + opendons_qualifier.category + + + + + + + + + + + opendons_qualifier list + opendons_qualifier.qualifier + + + + + + + + + + + + + + opendons_partnerqualifier list + opendons_qualifier.partnerqualifier + + + + + + + + + + opendons_partnerqualifier.search + opendons_qualifier.partnerqualifier + + + + + + + + + opendons_partnerqualifier Form + opendons_qualifier.partnerqualifier + +
+ + + +
+
+
+ + + + + categories + opendons_qualifier.category + tree,form + + + + qualifiers + opendons_qualifier.qualifier + tree,form + + + + partnerqualifiers + opendons_qualifier.partnerqualifier + tree,form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
\ No newline at end of file