23/11/2023 - 21h30
parent
fc4e13ff8d
commit
e04568b072
|
@ -1,12 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="22/11/2023 - 23h00">
|
||||
<list default="true" id="c6d0259a-16e1-410d-91a1-830590ee2a08" name="Changes" comment="23/11/23 - 13:30">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Emargement/test_emargement.pdf" beforeDir="false" afterPath="$PROJECT_DIR$/Emargement/test_emargement.pdf" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Log/log_file.log" beforeDir="false" afterPath="$PROJECT_DIR$/Log/log_file.log" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/Session_Formation_Sequence.py" beforeDir="false" afterPath="$PROJECT_DIR$/Session_Formation_Sequence.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/base_config_modele_journee.py" beforeDir="false" afterPath="$PROJECT_DIR$/base_config_modele_journee.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/email_mgt.py" beforeDir="false" afterPath="$PROJECT_DIR$/email_mgt.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/emargement.py" beforeDir="false" afterPath="$PROJECT_DIR$/emargement.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/prj_common.py" beforeDir="false" afterPath="$PROJECT_DIR$/prj_common.py" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
|
@ -76,13 +78,6 @@
|
|||
<option name="presentableId" value="Default" />
|
||||
<updated>1680804787304</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00107" summary="15/09/2023 - 18h">
|
||||
<created>1694793521821</created>
|
||||
<option name="number" value="00107" />
|
||||
<option name="presentableId" value="LOCAL-00107" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1694793521822</updated>
|
||||
</task>
|
||||
<task id="LOCAL-00108" summary="22/09/2023 - 12h53">
|
||||
<created>1695380023775</created>
|
||||
<option name="number" value="00108" />
|
||||
|
@ -419,7 +414,14 @@
|
|||
<option name="project" value="LOCAL" />
|
||||
<updated>1700691598344</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="156" />
|
||||
<task id="LOCAL-00156" summary="23/11/23 - 13:30">
|
||||
<created>1700742130513</created>
|
||||
<option name="number" value="00156" />
|
||||
<option name="presentableId" value="LOCAL-00156" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1700742130514</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="157" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
|
@ -434,7 +436,6 @@
|
|||
</option>
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="17/10/2023 - 22h40" />
|
||||
<MESSAGE value="17/10/2023 - 22h45" />
|
||||
<MESSAGE value="zzz" />
|
||||
<MESSAGE value="22/10/2023 - 12h" />
|
||||
|
@ -459,6 +460,7 @@
|
|||
<MESSAGE value="18/11/2023 - 17h00" />
|
||||
<MESSAGE value="20/11/2023 - 21h00" />
|
||||
<MESSAGE value="22/11/2023 - 23h00" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="22/11/2023 - 23h00" />
|
||||
<MESSAGE value="23/11/23 - 13:30" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="23/11/23 - 13:30" />
|
||||
</component>
|
||||
</project>
|
|
@ -37,7 +37,7 @@ endobj
|
|||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Author () /CreationDate (D:20230822120813-01'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20230822120813-01'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
|
||||
/Author () /CreationDate (D:20231123213045-01'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20231123213045-01'00') /Producer (xhtml2pdf <https://github.com/xhtml2pdf/xhtml2pdf/>)
|
||||
/Subject () /Title () /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
|
@ -48,10 +48,10 @@ endobj
|
|||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3651
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1859
|
||||
>>
|
||||
stream
|
||||
Gb!;h?'F'P&U_?#_7/'r3f!dNrMJ4F,*ct;niiqnV2EQuF(J.h=YB[OOPD,d`:0N,@Kh@ZZd+KsSfVWn%XZ6McLUtD*rl,@F-cdlPWa;p1MsGHDj`4XR@RYqcV?G!]m8(VkUYAoW[R2=cC1n8Fkmfrf3-\XXhHunnuAeG2Z%mN.r/?_CSa+0WpFiQN6,'sR(@eBoKLa3C7At:qW,1)E!,=59UR62H6$R3e!*l4GM@UFAWIq=DdM9"n`_ZQs-L@h]>kG+kIZLFhe&eDH[\9Ym.AorG$_0:lHRu3S!Di6UIn7oII9=+hW,pJmGDh'`_Xl_<OAc@:"0-g^U%9J`VS"W="IUTr:5s7b0K4RY<nl+/m2>UWlW42VCSdK-82N'XA[ccA@^.cfBi=Ra7Ho=pE(K_n$:P`T:TA:s5M^-=o[[J=3mLfJ,9!5O(WC'^4,Tg]TU1OCH>JZc?,DAhu)uH^Z=;Fs)q3/p5-mc0`oCR>i_o%47FF1rP*PTjR)%Q>V>I)LR[OBR#b$1A"SDf?hJ7MX]@mjp[!bI$b(hY*aZCCg8MY7/se?OiXO..rN7uU:#/$ZqASm/rq,`nA(">)Ksn*.RXG)/c_Ahu]2jiel('Ze5us!1lFa13+@&0bl$9L/qRPNV%qVG7X_W>]&*!pLq?qUoqObg?5I)C"hqq?W1Y&m&g.IW)=WZ$_eNX:sH5[VdNVmhsiSiUj59F_lDs*iFI>h+#c;h@/K,MCHD"c5*F_T&RT"J]c!W!iAkH3>6+*a<o[/9^iY#">d7d'0B"[$!u3em%MHo]9N.93;CdC/PG7a5T<20C7S4'p?P_%)cA>8V!FdA_478j'HJ4DFhK#>.+r\6GCLLU`=(9i>iDcB:R7(ak1.?X2//nglNb/;\("Cj-N@EPV#'+M0Ak8\-M+M3;Z_K1FBJ.kfVj`fUn_D:nh5VW319b!C1q:6]i^Qj-0g*K9TcW@rt"%[=X[TeoSTg'uc27!1'<UE!i(k!VeM"ZoVFD./q`<ANS[P1.4[8L1bgqiWVA)KUKUl.uo2']"gkUF9*B@t27hKSN&k]4$&KR#V:B+pZe\3D%Y9_2a^i>8V"12CeR4@.B?ld;@g5,bj=\IE=3e@nr8!40Sf5eIDeE]$m[<rXIKe*@OeP#459^3gT53Nj9UDU*SO21fDb=@@Sc@Y$u<Hn;.e(CtK4DU>^V3at[dD:6SWrYd5V�'54Ft/RPEi4Y)8PHa)]9AVB"*Q$sfo8!fdVZfqP[mu8B8UD&oH+Y),:0)=_#6hm`uuCdA*h4*.*6X?#>2!:N:S<u<?6L\2"3beBfBjh'%:j9*p"NV0dfT)/_H2KC^Ym9To6)RQ,lXUC,]sq'%M$<2WZ@%&Z87</PK(hh%g3UFfC8^\"g=o:l4EpBV,pdY^Dp\OP>T_,i&s-EKY,CK?(8okmWc3B#F<i&If!3:6'<5EL%m)^beY]D;]G1gK/@X8Vc3PQIqTQ0b"BC,^YL)W->VFg&^$WQ=pMU8(Dtjh`?=d8PHU%4-Q%l"1BN]fo7sedd:G2-cpL=ZBr8Nhs#O5_<g@TPg(s:00fAX%bn@O%;0QR7rd\j_p6r*HX-"V:Uoh7"Q!1%_B:mu[c"'um]*FF='5ShQ:)QXLXA4Aa-N]N6nu??$Ee1k#V&Y^CerRN3fL+%+'qMB)mBqX'rWmr-gGq.LGMrriC-\L!@pH4JLY/VU9<+V</hc%*sEUf&e7m6lE`WN+P$SrJrhXaY%A]*eG3YqT,kR_MD0hrkJ?1ddgpF(KBR9G2#2aGUd.b-.]5q'0/,Wu";RkU\hs3a"/J1YJL[RUPE-Y*"U?MRATVYW"U5)Q?W,_$3WpqD9@2i06l=PMpbTEf!3Fa!_RR>#T>BXB#-/>aKRmkoQ9<>u;50+*:i448B,<*koFV;-bub!L`JP<,!X$tXQ9:XE;)!Zpg2[rfQ?71n=82NJo8D)o*hRLsA%Gj9YdD-bk8Z=@?o;C+$rl7d1m)0C@M0)Kj&@jt?r:AG$rl7d30@<?@QH2>ND\(kJjmKe/u`\u&HS<&<qR0Lq4]/I#16j96%Com=;#$R*Cc6*=&@RB&6,=Ff^^R$$s3gf$<.mISo'#Z.m[!_.Ur]o*B.@P*2l-QB?RV70H^YsK'I+%&P,i+hSFV`n@g?g+?H"tO+U.k`$#P`_g0\k$S%>A5m=9Y/ks'q!%AIYTZZNIj9lBX!^R!iS1[Q#DL`E@W'HWqV9'Mj&;5F&FX-2`W%->?S)LI]B7^+55"RF:[_*/aJcI8a8Y14?/1F7`>gqlYo8Zm"KaETOqHS<sn`lo(+`U5K)j#-N3[n/VY3Brf)98f<@HO#ZRGJ)]`UjhEI(i&YJcI9j#)7TM$S_ngW,S1Vhfr;`',&pXCg"LBlGP%qY0#A&I,ib6:In`SZ\A40WtXAVigPfXb;W`J&+btH7]%>jenY'?Xg^hHMa;G%9b@:u5=Ddo7#01N=Vk$a#n%KH1:B=6!Ws]VT`S66Q=jN3J0Z[FTZYmf\]5/@"@33k5$OV,JH8'X(KB"m^(8UsIX0iGfti$4*"8RZH13fGoOBlk#1;BlC%;FmXb$WiW,fI+q#UY!_1;qm3F/)$JH;h05R"0X/l"TJ^acijJL[EfP:nU4#l0YKHIafIh5O&s]d9CX&c3If75,!*Hk>Csf[oU@nuT_d8`0r/'g8EVj)A]F\,p)-O"&C5>abeu5ZlED#%SW(9`bt><h(u-=b]SeTk0*sg"fd`gWTK9cPGgc+iM)!B0jr%n3M:clt^R+,fO^s@M9;RjCCi>iR5Xk+KWZ+Oqbg1M+p6;Ocr3_7S=EL!Q'_Q/4hR$)@l.ti^S)7OD0pgn9g?h(5(g)RNUg`IY_MhL^p3%ZRr+L&f)rnAScY3"U7N763XBJ/^M#D!(g:k5aASV163@s$%`L`IC;98!X"%90;u$d*J!5$jh9hi#Oe-+%&1Xbn2T(m6QErc3h.Ql^7[51&6,=Fl-eW#%$1NV"fe(F9tnCC.1fIOb3@pHis&&jJI5?o?(-.l!C=en<&_+CJ-Nu.eE9Jj1*Q?K4GmMXD"t6!$*g\m;<1l8CKc8q#V13pH,egk<aZ!GMB5]fD7HqfR"2E8`sg$G>1s<c+KRP8b-MMCL-s,u=0fHE>SjE/DFSVI/=Z^P$B,)+HJO4-'4=mmE?sd;$X,=E:d%:5,T!Ruab3%S(fc`&[&t\g%b5&g;.@AQQL*O+4eF2q.p<_ukCVQ*7KH%om(k+A,s&6Gpi"GaeaPS<PW*tlL.1HEp`+!giL4imMXaJIfMhFAde(DQl0K)DT<ti#kYn;aL.g!`-cSAZ@8G:KMGoJ"VR'$VJ$QqoU.:Iq)(lARQ7K+LG8FXD*H3c<Edh9<hSQt+_+7tD2ge^/+ndc18X<krVK3+N4',idO`=qmL.aV;I^&DYp(SBGQ=IG3F3=eMB44SuEJ6DB909V/Yk&WR'n*59a)G`PZjVblf``LbPNq:k>&_3rFHCI+QYTcD^;k>WdY&f5/2[ZT*.g#,81dKZ5ok_'9cd3U;KG[T+c'&$e?[RDeKKN$;+N8a4>S!26Z;mD='J[hFZI+TZr([?[I[<RF`sghO/T]@laC(Y5uW!FG>3i[=6oDU[HYb+4l!ujI:D?iM6PQ6e#KRqs3K!S/C/`o\LJVLTDO\9FLLAT0H7s9S,WKmNEDn~>endstream
|
||||
Gb!;g?#SIU'Rf_Zi7lrd@JD#2UMj;)Camdj8c;a"#SndY0ftrd+b,!;**l14ADZVh;q34t/"LbL\V/7fCrVVEqcD@0Ik;Q8D9e0f,a4,1n!M=D`o\*(F?]S7G%JGM$X/g#B6ffLU<7_PQeHIaV^4Ef01WN+=^IE\H"N<f'U+^'8h.a@9;[s3>-$F"T&2;ko<L'QlLC9_3![$)>SY+X*NjE_AB+UQg*_WWn(F1gLSrCKh>X]^hQ6/^bJe5fQHd0K^@lq4s-4UI/(q).lE78oH7K`VV!m^(IXdlE)Ku)VCfN]&18@K[8laODr6;qcMV6EHV0`tMC_-%cX-B]%(&tAAA=;RLMgE@<Ok^X;^T<g]ZFse#bOh6o4g(,1Rto$!HcIbB:Zgj/cVHb]qt9(1m,\-CbP[FMl]]N`ds<=riY<3[Z;T5]k*ll?G0/VrV2qH8<^Q$h=>-rq]IYSo,25##<Jkh/#i!=(hp7b7:t1i*Jr?klF5)FK7GVZj7GWeFm2gm[m9Y7!Mb7oSEf\1\br>S21al@A0-4>-4I;Z^QO/kufEu2XO(e*)rCn6A8m9b6@@\+_JZL>-je=N6#gargSeYN&?,;(51+dc(F*XE"l4K]M.sa2NZ!KPt:CjoF^6+H@:a;gq=cm9NBuJY>;!6*=fW1.<&,3,oc+e$bj\]*$TT=DVLn*X>dFX$1.a`nIku&ogSq="M,CR2o.6?KF3DRT$]3.75KL??9Z)t;RJ$)^kg<Z#d\Q'NNU`F/4=#8Dho05l0@`bl1h%jCk9XY,fd</=>580G2UY=PL&ui+aA5onE:NuIJG*j8lm"iPi_C[U^A@a?PO*P>EE:r'lrJ\'n9XhC`P-LR@mRdt"G/QBrh%#l.1>*/-a%R#V5l2FSaG=H-[j*,$V;@.N`p/@)A?lY$'4e*P30-]&8rrZ=LnRS*1#:8q6cO:A\d^Z]fb%l<F?=/jaCIAO*dKL")^FDm18\:@NQ@JnWHTNkniGbIR;N8S(n"V6MLDiq^\a"7BD/mmI[=3V938+#$P1;5ApgpT0>bW/:&>V`f\]3ND>(tm<VI>h:.4F<@iouf]8\"d+&;qH7OOpaC>P73P&'GCL%_\9,lgP6NS'r'pZfb`&8k-SDZa;ITENf$*K#0HRJUQRh!P(,D88dEPb8r"6d_4O1?4(/Rll$:n.Hd7:^u*OBKF]I",)d1W"*G\!>/pjX13!)6W5%Yd></4ENmoQkBID)-g"9i:T3Up4HuKWe#CG:)"7kR8l1N3eDq8OGQeU(W5`q"o'lps646C^NTemQ'+>F=hP[q0lPP^^I#31D'Mo]9=sK[O#/Lck5\UdDNIX@A3k?XD1dJEW^nbT_>oEha+BgL-d^+oc%0?tMXV`bda>C=^#QPF<fO`L;N%U)"D59.Qh8JP_F-FAO8njmu\-F8o+q?*R_]AgG!D/!$6V/r>+HS_rWu"V^ai2g7ZH$DH+t=nHfXa?A336FS,pa=0(W\0J<\L7HdYb/b%;1aY?q(`i9_%7F7J@KM!0Ph<3Tqm[n,Wq_UbtIK27_q>^]tuc0r.^rM_5Hd!2:2q.Q,'+d_H)1=tuh9;iE:;Hk/Uq##o?#dA>6aN>75SRfk.MIG]A8_1<Jb88CU=A@QjY!.m_:2'NYba68sWpHZ)p`22Q4>oMoJLfTJEZlGi6"5O(,M@l2B@r,kP[t&/2OA!bO\hlIT4c4mF76n:C9\lKB)bb\(T)GKrPl#4t=JV<9,W29_,!Zl6SJHdF7SGD,$D^FT5YW;s(/P04VaV`+$rID2!it>fe3m_[@D^L@l1ka2s/1j9i_l072'5n<ImC^?!V7<nh7J,q".X)MPnsD+1VX0eoV_%r\,>2L%*rPc!Hn5_ao~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 10
|
||||
|
@ -68,7 +68,7 @@ xref
|
|||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<44c9cae7153c77931f6c043a6c6a4568><44c9cae7153c77931f6c043a6c6a4568>]
|
||||
[<435940486b7b055693a3310f4a22df67><435940486b7b055693a3310f4a22df67>]
|
||||
% ReportLab generated PDF document -- digest (http://www.reportlab.com)
|
||||
|
||||
/Info 7 0 R
|
||||
|
@ -76,5 +76,5 @@ trailer
|
|||
/Size 10
|
||||
>>
|
||||
startxref
|
||||
4772
|
||||
2980
|
||||
%%EOF
|
||||
|
|
1944
Log/log_file.log
1944
Log/log_file.log
File diff suppressed because one or more lines are too long
14
email_mgt.py
14
email_mgt.py
|
@ -1817,10 +1817,8 @@ def SendEmargementMail( diction):
|
|||
# Recuperation des infos de l'emargement
|
||||
print("my_emarge_id = " + str(my_emarge_id))
|
||||
|
||||
val_emarge = MYSY_GV.dbname['emargement'].find_one({'_id':ObjectId(my_emarge_id)})
|
||||
print("val_emarge = "+str(val_emarge))
|
||||
print("ID = " + str(val_emarge['_id']))
|
||||
print("email = " + str(val_emarge['email']))
|
||||
val_emarge = MYSY_GV.dbname['emargement'].find_one({'_id':ObjectId(my_emarge_id), 'partner_owner_recid':str(partner_recid)})
|
||||
|
||||
|
||||
# recuperation du titre de la formation
|
||||
local_class_title = MYSY_GV.dbname['myclass'].find_one({'internal_url':str(val_emarge['class_internal_url']),
|
||||
|
@ -1852,7 +1850,7 @@ def SendEmargementMail( diction):
|
|||
# JINJA2
|
||||
templateLoader = jinja2.FileSystemLoader(searchpath="./")
|
||||
templateEnv = jinja2.Environment(loader=templateLoader)
|
||||
TEMPLATE_FILE = "Template/ MySy_Emargement.html"
|
||||
TEMPLATE_FILE = "Template/MySy_Emargement.html"
|
||||
template = templateEnv.get_template(TEMPLATE_FILE)
|
||||
# This data can come from database query
|
||||
# envoie de l'emargement du matin
|
||||
|
@ -1872,7 +1870,7 @@ def SendEmargementMail( diction):
|
|||
"email": str(val_emarge['email']),
|
||||
"class_title": str(local_class_title['title']),
|
||||
"date": str(val_emarge['date']),
|
||||
"session": "Matinée",
|
||||
"session": str(val_emarge['sequence_start'])+" - "+str(val_emarge['sequence_end']),
|
||||
"code_session":str(local_session_data['code_session']),
|
||||
"mysyurl": str(myurl),
|
||||
|
||||
|
@ -1884,7 +1882,7 @@ def SendEmargementMail( diction):
|
|||
msg.set_content(sourceHtml, subtype='html')
|
||||
msg['From'] = MYSY_GV.O365_SMTP_COUNT_From_User
|
||||
msg['Bcc'] = 'contact@mysy-training.com'
|
||||
msg['Subject'] = "[MySy Training Technology] : Emargement Matinée du "+str(val_emarge['date'])
|
||||
msg['Subject'] = "[MySy Training Technology] : Emargement "+str(val_emarge['sequence_start'])+" - "+str(val_emarge['sequence_end'])
|
||||
msg['To'] = str(val_emarge['email'])
|
||||
|
||||
smtpserver.ehlo()
|
||||
|
@ -1894,6 +1892,7 @@ def SendEmargementMail( diction):
|
|||
#smtpserver.close()
|
||||
print(" Email matinée envoyé " + str(my_emarge_id))
|
||||
|
||||
"""
|
||||
# envoie de l'emargement de l'apres midi
|
||||
myurl = "http://127.0.0.1:5001/myclass/api/UserEmargementValidation/" + str(val_emarge['_id']) + "/2"
|
||||
|
||||
|
@ -1935,6 +1934,7 @@ def SendEmargementMail( diction):
|
|||
smtpserver.close()
|
||||
|
||||
print(" Email Apres midi envoyé " + str(my_emarge_id))
|
||||
"""
|
||||
|
||||
return True, "Email envoyé "
|
||||
|
||||
|
|
241
emargement.py
241
emargement.py
|
@ -209,6 +209,177 @@ def CreateTableauEmargement(diction):
|
|||
return False, "Impossible de créer le tableau d'emargement"
|
||||
|
||||
|
||||
|
||||
"""
|
||||
23/11/2023 : Evolution en prenant les sequences.
|
||||
Evolution de la fonction de création du tableau d'emargement.
|
||||
Dans cette evolution, on plutot recuperer les sequence déjà créesq
|
||||
|
||||
"""
|
||||
def CreateTableauEmargement_From_Sequence(diction):
|
||||
try:
|
||||
'''
|
||||
# Verification que les champs reçus dans l'API sont bien dans la liste des champs autorisés
|
||||
# Cela evite le cas ou une entité tierce ajouter les valeurs inconnu dans l'API
|
||||
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
|
||||
# field_list.
|
||||
'''
|
||||
field_list = ['class_internal_url', 'session_id', 'token']
|
||||
incom_keys = diction.keys()
|
||||
for val in incom_keys:
|
||||
if val not in field_list and val.startswith('my_') is False:
|
||||
mycommon.myprint(str(inspect.stack()[0][
|
||||
3]) + " - Le champ '" + val + "' n'est pas autorisé, Creation partenaire annulée")
|
||||
return False, "Impossible de créer la liste d'emargement. Toutes les informations fournies ne sont pas valables"
|
||||
|
||||
"""
|
||||
Verification de la liste des champs obligatoires
|
||||
"""
|
||||
field_list_obligatoire = ['class_internal_url', 'session_id', 'token']
|
||||
|
||||
for val in field_list_obligatoire:
|
||||
if val not in diction:
|
||||
mycommon.myprint(
|
||||
str(inspect.stack()[0][3]) + " - : La valeur '" + val + "' n'est pas presente dans liste ")
|
||||
return False, "Impossible de créer la liste d'emargement, Toutes les informations necessaires n'ont pas été fournies"
|
||||
|
||||
mydata = {}
|
||||
|
||||
my_token = ""
|
||||
if ("token" in diction.keys()):
|
||||
if diction['token']:
|
||||
my_token = diction['token']
|
||||
# Verifier la validité du token
|
||||
retval = mycommon.check_partner_token_validity("", my_token)
|
||||
if retval is False:
|
||||
return "Err_Connexion", " La session de connexion n'est pas valide"
|
||||
|
||||
|
||||
class_internal_url = ""
|
||||
if ("class_internal_url" in diction.keys()):
|
||||
if diction['class_internal_url']:
|
||||
class_internal_url = diction['class_internal_url']
|
||||
|
||||
partner_recid = mycommon.get_parnter_recid_from_token(my_token)
|
||||
if (partner_recid is False):
|
||||
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de créer la liste d'emargement ")
|
||||
return False, "Impossible de créer la liste d'emargement "
|
||||
|
||||
session_id = ""
|
||||
if ("session_id" in diction.keys()):
|
||||
if diction['session_id']:
|
||||
mydata['session_id'] = diction['session_id']
|
||||
session_id = diction['session_id']
|
||||
|
||||
|
||||
"""
|
||||
Recuperation des info de la session de formation
|
||||
"""
|
||||
date_du = ""
|
||||
date_au = ""
|
||||
ville = ""
|
||||
code_postal = ""
|
||||
adresse = ""
|
||||
qry = {"_id":ObjectId(str(session_id)), "valide": "1", 'partner_owner_recid':str(partner_recid)}
|
||||
|
||||
session_formation_count = MYSY_GV.dbname['session_formation'].count_documents(qry)
|
||||
if( session_formation_count <= 0 ):
|
||||
mycommon.myprint(
|
||||
str(inspect.stack()[0][3]) + " - Aucune session de formation valide ")
|
||||
return False, "Aucune session de formation valide "
|
||||
|
||||
|
||||
session_data = MYSY_GV.dbname['session_formation'].find_one({"_id":ObjectId(str(session_id)), "valide": "1"})
|
||||
|
||||
# Recuperation de la liste des sequences associées à la session
|
||||
|
||||
|
||||
i = 0 # compteur de securité
|
||||
|
||||
|
||||
# On vide la collection emargement pour la session = str(session_id)
|
||||
local_myquery = {"session_id": str(session_id), 'partner_owner_recid':str(partner_recid)}
|
||||
x = MYSY_GV.dbname['emargement'].delete_many(local_myquery)
|
||||
|
||||
mycommon.myprint(
|
||||
str(inspect.stack()[0][
|
||||
3]) + " - INFO : "+str(x.deleted_count)+" Documents supprimés de la collection : emargement : session = "+str(session_id) )
|
||||
|
||||
# Verification qu'il y a bien des séquences de formation pour cette session
|
||||
session_sequence_count = MYSY_GV.dbname['session_formation_sequence'].count_documents({'session_id': str(session_id),
|
||||
'locked': '0',
|
||||
'valide': '1',
|
||||
'partner_owner_recid': str(
|
||||
partner_recid)})
|
||||
|
||||
if( session_sequence_count <= 0 ):
|
||||
mycommon.myprint(
|
||||
str(inspect.stack()[0][3]) + " - Cette session de formation n'a aucune séquence valide ")
|
||||
return False, " Cette session de formation n'a aucune séquence valide "
|
||||
|
||||
|
||||
#print("#### Liste Date = "+str(liste_date))
|
||||
coll_emargement = MYSY_GV.dbname['emargement']
|
||||
|
||||
#Recuperation de la liste des participants dont l'inscription est validée
|
||||
for tmp_val in MYSY_GV.dbname['inscription'].find({'session_id':str(session_id),
|
||||
'class_internal_url':str(class_internal_url),
|
||||
'status':'1',
|
||||
'partner_owner_recid':str(partner_recid)} ):
|
||||
my_local_data = {}
|
||||
my_local_data['email'] = tmp_val['email']
|
||||
my_local_data['nom'] = tmp_val['nom']
|
||||
my_local_data['prenom'] = tmp_val['prenom']
|
||||
my_local_data['session_id'] = tmp_val['session_id']
|
||||
my_local_data['class_internal_url'] = tmp_val['class_internal_url']
|
||||
my_local_data['date_update'] = str(datetime.now())
|
||||
|
||||
# Recuperation de liste des sequences
|
||||
for session_sequence in MYSY_GV.dbname['session_formation_sequence'].find({'session_id':str(session_id),
|
||||
'locked':'0',
|
||||
'valide':'1',
|
||||
'partner_owner_recid':str(partner_recid)} ):
|
||||
query_key = {}
|
||||
query_key['email'] = tmp_val['email']
|
||||
query_key['session_id'] = tmp_val['session_id']
|
||||
query_key['class_internal_url'] = tmp_val['class_internal_url']
|
||||
|
||||
query_key['date'] = str(session_sequence['sequence_start'])[0:10]
|
||||
query_key['sequence_start'] = str(session_sequence['sequence_start'])
|
||||
query_key['sequence_end'] = str(session_sequence['sequence_end'])
|
||||
|
||||
new_my_local_data = {}
|
||||
new_my_local_data['email'] = tmp_val['email']
|
||||
new_my_local_data['nom'] = tmp_val['nom']
|
||||
new_my_local_data['prenom'] = tmp_val['prenom']
|
||||
new_my_local_data['session_id'] = tmp_val['session_id']
|
||||
new_my_local_data['class_internal_url'] = tmp_val['class_internal_url']
|
||||
new_my_local_data['date_update'] = str(datetime.now())
|
||||
query_key['date'] = str(session_sequence['sequence_start'])[0:10]
|
||||
new_my_local_data['is_present'] = False
|
||||
new_my_local_data['matin'] = False
|
||||
new_my_local_data['apresmidi'] = False
|
||||
|
||||
new_my_local_data['partner_owner_recid'] = str(str(partner_recid))
|
||||
|
||||
#print("### emargement insertion de : "+str(new_my_local_data))
|
||||
|
||||
local_ret_val = coll_emargement.find_one_and_update(
|
||||
query_key,
|
||||
{"$set": new_my_local_data},
|
||||
upsert=True,
|
||||
return_document=ReturnDocument.AFTER
|
||||
)
|
||||
|
||||
|
||||
|
||||
return True, "ok"
|
||||
except Exception as e:
|
||||
exc_type, exc_obj, exc_tb = sys.exc_info()
|
||||
mycommon.myprint(str(inspect.stack()[0][3]) + " -" + str(e) + " - ERRORRRR AT Line : " + str(exc_tb.tb_lineno))
|
||||
return False, "Impossible de créer le tableau d'emargement"
|
||||
|
||||
|
||||
"""
|
||||
Cette fonction récupérer la liste d'emargement
|
||||
"""
|
||||
|
@ -271,7 +442,7 @@ def GetTableauEmargement(diction):
|
|||
val_tmp = 1
|
||||
RetObject = []
|
||||
for retval in MYSY_GV.dbname['emargement'].find({'session_id':str(session_id),
|
||||
'class_internal_url':str(class_internal_url)}).sort([("date",pymongo.ASCENDING),]):
|
||||
'class_internal_url':str(class_internal_url)}).sort([("date",pymongo.ASCENDING), ("sequence_start",pymongo.ASCENDING), ("sequence_end",pymongo.ASCENDING),]):
|
||||
user = retval
|
||||
user['id'] = str(val_tmp)
|
||||
RetObject.append(mycommon.JSONEncoder().encode(user))
|
||||
|
@ -294,7 +465,7 @@ def UpdateUserEmargementDate(diction):
|
|||
# Ici on doit mettre tous les champs possible (obligatoire ou non) de la BDD dans la liste
|
||||
# field_list.
|
||||
'''
|
||||
field_list = [ 'session_id', 'token', 'email', 'date', 'matin', 'apresmidi', 'class_internal_url']
|
||||
field_list = [ 'session_id', 'token', 'email', 'date', 'matin', 'apresmidi', 'class_internal_url', 'is_present', '_id']
|
||||
incom_keys = diction.keys()
|
||||
for val in incom_keys:
|
||||
if val not in field_list and val.startswith('my_') is False:
|
||||
|
@ -305,7 +476,7 @@ def UpdateUserEmargementDate(diction):
|
|||
"""
|
||||
Verification de la liste des champs obligatoires
|
||||
"""
|
||||
field_list_obligatoire = [ 'session_id', 'token', 'email', 'date']
|
||||
field_list_obligatoire = [ 'session_id', 'token', 'email', 'date', '_id']
|
||||
|
||||
for val in field_list_obligatoire:
|
||||
if val not in diction:
|
||||
|
@ -313,8 +484,6 @@ def UpdateUserEmargementDate(diction):
|
|||
str(inspect.stack()[0][3]) + " - : La valeur '" + val + "' n'est pas presente dans liste ")
|
||||
return False, "Impossible de créer la liste d'emargement, Toutes les informations necessaires n'ont pas été fournies"
|
||||
|
||||
mydata = {}
|
||||
|
||||
my_token = ""
|
||||
if ("token" in diction.keys()):
|
||||
if diction['token']:
|
||||
|
@ -327,48 +496,30 @@ def UpdateUserEmargementDate(diction):
|
|||
|
||||
|
||||
|
||||
my_email = ""
|
||||
if ("email" in diction.keys()):
|
||||
if diction['email']:
|
||||
my_email = diction['email']
|
||||
mydata['email'] = diction['email']
|
||||
is_present = ""
|
||||
if ("is_present" in diction.keys()):
|
||||
if diction['is_present']:
|
||||
is_present = diction['is_present']
|
||||
|
||||
my_date = ""
|
||||
if ("date" in diction.keys()):
|
||||
if diction['date']:
|
||||
my_date = diction['date']
|
||||
mydata['date'] = diction['date']
|
||||
|
||||
my_matin = ""
|
||||
if ("matin" in diction.keys()):
|
||||
if diction['matin']:
|
||||
my_matin = diction['matin']
|
||||
|
||||
my_apresmidi = ""
|
||||
if ("apresmidi" in diction.keys()):
|
||||
if diction['apresmidi']:
|
||||
my_apresmidi = diction['apresmidi']
|
||||
|
||||
class_internal_url = ""
|
||||
if ("class_internal_url" in diction.keys()):
|
||||
if diction['class_internal_url']:
|
||||
class_internal_url = diction['class_internal_url']
|
||||
mydata['class_internal_url'] = class_internal_url
|
||||
|
||||
partner_recid = mycommon.get_parnter_recid_from_token(my_token)
|
||||
if (partner_recid is False):
|
||||
mycommon.myprint(str(inspect.stack()[0][3]) + " - Impossible de valider l'emargement ")
|
||||
return False, "Impossible de valider l'emargement "
|
||||
|
||||
session_id = ""
|
||||
if ("session_id" in diction.keys()):
|
||||
if diction['session_id']:
|
||||
mydata['session_id'] = diction['session_id']
|
||||
session_id = diction['session_id']
|
||||
mydata = {}
|
||||
|
||||
mydata['date_update'] = str(datetime.now())
|
||||
|
||||
if( my_matin == "1"):
|
||||
if (is_present == "1"):
|
||||
mydata['is_present'] = True
|
||||
elif (is_present == "0"):
|
||||
mydata['is_present'] = False
|
||||
|
||||
|
||||
"""if( my_matin == "1"):
|
||||
mydata['matin'] = True
|
||||
elif (my_matin == "0"):
|
||||
mydata['matin'] = False
|
||||
|
@ -377,13 +528,16 @@ def UpdateUserEmargementDate(diction):
|
|||
mydata['apresmidi'] = True
|
||||
elif (my_apresmidi == "0"):
|
||||
mydata['apresmidi'] = False
|
||||
"""
|
||||
|
||||
|
||||
query_key = {}
|
||||
query_key['email'] = mydata['email']
|
||||
query_key['session_id'] = mydata['session_id']
|
||||
query_key['date'] = str(my_date)
|
||||
query_key['class_internal_url'] = str(class_internal_url)
|
||||
query_key['_id'] = ObjectId(str(diction['_id']))
|
||||
query_key['partner_owner_recid'] = str(partner_recid)
|
||||
|
||||
|
||||
print(" #### query_key = ", query_key)
|
||||
print(" #### mydata = ", mydata)
|
||||
|
||||
coll_emargement = MYSY_GV.dbname['emargement']
|
||||
local_ret_val = coll_emargement.find_one_and_update(
|
||||
|
@ -393,7 +547,7 @@ def UpdateUserEmargementDate(diction):
|
|||
return_document=ReturnDocument.AFTER
|
||||
)
|
||||
|
||||
mycommon.myprint(str(inspect.stack()[0][3]) + " OK, la liste d'emargement de la session "+str( mydata['session_id'])+" a été mise à jour")
|
||||
|
||||
return True, "OK"
|
||||
except Exception as e:
|
||||
exc_type, exc_obj, exc_tb = sys.exc_info()
|
||||
|
@ -468,7 +622,7 @@ def GerneratePDFEmargementList(diction):
|
|||
print("### query_get_data = " + str(query_get_data))
|
||||
|
||||
tab_users = []
|
||||
for val_tmp in coll_emargement.find(query_get_data).sort([("date", pymongo.ASCENDING)]):
|
||||
for val_tmp in coll_emargement.find(query_get_data).sort([("date", pymongo.ASCENDING), ("sequence_start", pymongo.ASCENDING), ("sequence_end", pymongo.ASCENDING)]):
|
||||
local_tmp = {}
|
||||
local_tmp['email'] = val_tmp['email']
|
||||
local_tmp['nom'] = val_tmp['nom']
|
||||
|
@ -477,6 +631,11 @@ def GerneratePDFEmargementList(diction):
|
|||
local_tmp['apresmidi'] = val_tmp['apresmidi']
|
||||
local_tmp['date'] = val_tmp['date']
|
||||
|
||||
local_tmp['sequence_start'] = val_tmp['sequence_start']
|
||||
local_tmp['sequence_end'] = val_tmp['sequence_end']
|
||||
local_tmp['is_present'] = val_tmp['is_present']
|
||||
|
||||
|
||||
tab_users.append(local_tmp)
|
||||
|
||||
#print(' ### tab_users = ' + str(tab_users))
|
||||
|
|
20
main.py
20
main.py
|
@ -1905,6 +1905,26 @@ def CreateTableauEmargement():
|
|||
localStatus, message= emargement.CreateTableauEmargement(payload)
|
||||
return jsonify(status=localStatus, message=message )
|
||||
|
||||
|
||||
|
||||
|
||||
"""
|
||||
Cette API Crée la liste d'emargement en partant des sequences déjà crée
|
||||
23/11/2023 : Evolution en prenant les sequences.
|
||||
Evolution de la fonction de création du tableau d'emargement.
|
||||
Dans cette evolution, on plutot recuperer les sequence déjà créesq
|
||||
"""
|
||||
@app.route('/myclass/api/CreateTableauEmargement_From_Sequence/', methods=['POST','GET'])
|
||||
@crossdomain(origin='*')
|
||||
def CreateTableauEmargement_From_Sequence():
|
||||
# On recupere le corps (payload) de la requete
|
||||
payload = mycommon.strip_dictionary (request.form.to_dict())
|
||||
print(" ### CreateTableauEmargement_From_Sequence : payload = ",str(payload))
|
||||
localStatus, message= emargement.CreateTableauEmargement_From_Sequence(payload)
|
||||
return jsonify(status=localStatus, message=message )
|
||||
|
||||
|
||||
|
||||
"""
|
||||
API de recuperation du tableau d'emargement d'un session de formation
|
||||
"""
|
||||
|
|
|
@ -2778,10 +2778,7 @@ def UserEmargementValidation(diction):
|
|||
str(inspect.stack()[0][3]) + " - La valeur '" + val + "' n'est pas presente dans liste ")
|
||||
return False, " Impossible de valider l'emargement"
|
||||
|
||||
"""
|
||||
Si session == 1 => alors c'est l'emargement de la session du matin
|
||||
Si session == 2 => alors c'est l'emargement de la session du apres midi
|
||||
|
||||
"""
|
||||
value = la valeur du "_id" de la ligne concernée
|
||||
|
||||
"""
|
||||
|
@ -2792,7 +2789,7 @@ def UserEmargementValidation(diction):
|
|||
ret_val = coll_emargement.find_one_and_update({'_id': ObjectId(str( diction['value']))},
|
||||
{"$set":
|
||||
{"date_update": str(now),
|
||||
'matin': True,
|
||||
'is_present': True,
|
||||
}
|
||||
},
|
||||
return_document=ReturnDocument.AFTER
|
||||
|
@ -2800,17 +2797,20 @@ def UserEmargementValidation(diction):
|
|||
print(ret_val)
|
||||
|
||||
|
||||
elif (diction['session'] == "2"):
|
||||
"""elif (diction['session'] == "2"):
|
||||
print(" ### emargement l'apres midi")
|
||||
ret_val = coll_emargement.find_one_and_update({'_id': ObjectId(str(diction['value']))},
|
||||
{"$set":
|
||||
{"date_update": str(now),
|
||||
'apresmidi': True,
|
||||
'is_present': True,
|
||||
}
|
||||
},
|
||||
return_document=ReturnDocument.AFTER
|
||||
)
|
||||
|
||||
|
||||
print(ret_val)
|
||||
"""
|
||||
|
||||
return True, " Emargement ok "
|
||||
|
||||
|
|
Loading…
Reference in New Issue