From 91ab4c4999295b6f661fad2011ce0eede1ebc7b2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Thu, 27 Nov 2025 08:45:23 +0000 Subject: [PATCH] Auto commit: 2025-11-27T08:45:23.463Z --- config/__pycache__/settings.cpython-311.pyc | Bin 4220 -> 4358 bytes config/settings.py | 5 +++ core/__pycache__/admin.cpython-311.pyc | Bin 1617 -> 2983 bytes core/__pycache__/apps.cpython-311.pyc | Bin 524 -> 704 bytes core/__pycache__/models.cpython-311.pyc | Bin 4291 -> 5366 bytes core/__pycache__/signals.cpython-311.pyc | Bin 0 -> 815 bytes core/__pycache__/urls.cpython-311.pyc | Bin 378 -> 442 bytes core/__pycache__/views.cpython-311.pyc | Bin 2233 -> 3791 bytes core/admin.py | 26 +++++++++++- core/apps.py | 3 ++ core/migrations/0004_technicianprofile.py | 29 +++++++++++++ .../0004_technicianprofile.cpython-311.pyc | Bin 0 -> 1734 bytes core/models.py | 14 ++++++- core/signals.py | 9 ++++ core/templates/core/technician_login.html | 39 ++++++++++++++++++ core/urls.py | 5 +-- core/views.py | 29 +++++++++++-- 17 files changed, 151 insertions(+), 8 deletions(-) create mode 100644 core/__pycache__/signals.cpython-311.pyc create mode 100644 core/migrations/0004_technicianprofile.py create mode 100644 core/migrations/__pycache__/0004_technicianprofile.cpython-311.pyc create mode 100644 core/signals.py create mode 100644 core/templates/core/technician_login.html diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 210aa8971a392a05f79dc2921b70bd10b768ff95..03da944b175c7b59797fd18b896880c7d8caf5f4 100644 GIT binary patch delta 420 zcmZ9G%S!@L6vpqF5hF*(&>6?qr1^gIu75ym0*REIBDxz1j>v2bYA1xd_Tko*i&}(> z7-${UvV}|WA86aERY6Bg$vMlra4iSn<32lt9hA6_ z@S~qAgxX@L41fp7RdNjjJct@i5(Y^_1F!(YeMbv;2qQdm0Gn?uGRJ`M#D79M|ET3E1UJ*f0_1wwX|=Tl|y5q{8|1@?MJr&u4DQT kh>Iut)l-6qi-q(NQ^#s(#C+p$e8jY|Mv3w++p@O}-;Zc)JOBUy delta 295 zcmX9&y-LGS6u#%)QZZ>#Fln3qrbcZN>tA(sQG5d3&L*51(!rrFB8Z#21ffHx4k{D} zx!@D{625>>;owO;@ckVQALlXn?c1-GWeA=t8Ktx8lkLIJNB9nBi6CbIxW?+TI#ffK z>YPk!FnbF~ftvGD0$8IK)~QV$DaLA2wB?P|&2GWZLU{_6Y$E-K;6)0tWc&|p&?a|m z%~w*u1`R0WG@z*9xZv#+k`j6}#3t=vi%e`YI<$-3@ha`znL=QX-G1&^4{}W;`ZU5m z9pXBv3lSe(4nYV*M{23`cllG5d;GyP*3ZU0K#)0=FFmpVjB{S|rMP+1$My+;t7p|~ F_yYwTK_mbG diff --git a/config/settings.py b/config/settings.py index 6ec8df1..5432d61 100644 --- a/config/settings.py +++ b/config/settings.py @@ -41,6 +41,11 @@ CSRF_TRUSTED_ORIGINS = [ for host in CSRF_TRUSTED_ORIGINS ] +SESSION_COOKIE_SECURE = True +CSRF_COOKIE_SECURE = True +SESSION_COOKIE_SAMESITE = "None" +CSRF_COOKIE_SAMESITE = "None" + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/ diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index 34a752845b8edf7f6d118c95d047aa499b06cc1f..05c4b0fb54013590d0a2cf75afd1a27fed856b33 100644 GIT binary patch literal 2983 zcma)8OK;mo5Z)yzT9PGMwrt0-YsX3C)I?$lMT4S;Hhmy%kfs(4IKJpY(BwL1%!j(9 z(&nZ^et>WBu_qTnen$U*90;hervN?WCL=!O)EUxxt4R3xw7WC=?d;6#P=95!X#&@h zx@q523HcX0-3$8B_5Le~ke9?F7IlbAtCV6}awJ!-Dp6Z@60TZRp{-a6XUa`hlWwY- za?{ncJ6)ZoL?RD}rM@866r)cw-33l%LSDlgU)5}+l?1I6Q$}Pm%*%B(|D5Tz27j4) zN`VjF_@ZQJPQE)n_{&r#pTh25!y8{{E6nR@v*}^h$i_6-I1O5}-C4udp2G0!u836U zMi`S57&E|_{ba_%2xDpjV-6T+KACZTgfTsVF%OKhpUk*m&FvDc@DBZ;QIRk#*Y=>1 z+6x%};j*J(=N*PjQ$%LlFb{2yZTl8;L~6HYaJFOcP!x6J^k zb1-#>ao}FJ*!ttYUzxC;U(u#SQrA7hWx6iXy6*Z`-NAN7*MF-UPAuVgutWlcu$i=J zcsev#$VA~8H0zJ@k3`cb^{xHN#|O z)90)lxw2Gy&haEgkc39C4$$b`?aXT9r}pe(x zB(8v{q9u418SpG}JciNoV#7-xtNZ6kTj62A{#J+n}_;=%^YjYJy*d9j)2Yz zRss6%d0V*C__aM(Y&>euZ#SYl_7dt(_7eKHAH2v*7(NL+B#YU>)75iMwCTh?H#}=X zY_9WRsuc7y^1=EIQxeCQFU&_S{C} z5#DihP=E4H*FZ87on8(@F-ky`RIxOn)W!Q&#FQJ?N0IJlvQUH22rkjw2lhs22n7eBALEh!&>$~ zX?+{D5zraI2Ebr;+{d*38q@kNcyIa3k=lgwD%zsRSx*h`iC;2(FXZ+K58op=ex%p36kK*`JmnQXc7!GiP+QMOQnLL~nJ-IGiL} zOPl8?xIjRfwVr;m%aS^y%PqQ$HUY~x9PhOjHqabk0YH|Oo__k0rJ28ZMvE<4>_`f| Y+acp{Qg2-=pQGRc0ckeI^`olt9}eH8_y7O^ delta 683 zcmZvazi$&U6vyrJ{Z4X86GD=bG9@V|)JTXS6+)<;SRg|?RLW99eJNM@lFAo`ZW%gs zKx&Z(x+Bqn9q~6X!B%dH#MFO*sqbBtNR9G*{`&l$KYs6gzN-AmdRMueOTaGalh9+I zz3NV#67q#`!l@t;?NLg&#+lF})?<<0(<7s2P@<859+^m@1?(G8-=W``MqU%HpAv4s zDobtA=7zmM=t~F_2y0F_3xu(Ruz_%9MBU}?F7Y!rScFd#qtByoc!O2>OnuVY>Zh@% zI;^plWJMT{_jwo}i~dQHi-W#A_^>|+1Hof;#yZa&fFz0zJ+6XG=51PPOx|2SXinZ@ zlf`tYI@e#QuV#_D>WA6d#Y2@3L3}DJFm!!WX3>{J@lf(81&}0@Rx=32IFND$-RYhs zd@IkyQR`OAOao;|R#UYd%* zOcUX>>t_;=AN7ZaqxQjQIF{ji$-tkO(TE2kmIi`&6{H2Cww=oJ^z_oo(_Qap`ftAk h@}me|$rb?kd*T9B7tYiCZ?ZLirZlg9xqo#mJ delta 211 zcmX@W+QY)ToR^o20SLkwH8Oi9@|Mbo0XfqdQW>HcQy8L{QW&F{Q<$PyQka7oG+8Dt zF=Y1BWSu;f(T;s3!)K7b$(oFMdPS^27MNfGGKwXEL<1b&khHkKB6fpYu)zfci+Cri yGbu~)fOPPJ2tFY3i^C>2KczG$)vicjatf2GITNGM2L?=Hg5*b#=oc(fV8Z|f9xIRl diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index e5de757c43904d338bed9b4a697b0c1e00e581d8..c6dd706f5b29be02ec612628989aeff0f847e0d3 100644 GIT binary patch delta 1343 zcmZuxL2DCR6uy(BlVm27p*9qo7Meawn`p73RXBrXO7-?KsAB}D4Y?3MqwdPyVJ`r^^b5~=S@kaY5PAYuUlV>00!?6dkA1jhRb29b25d(YbT#e_IfMN;uo~Q_k==1h zFiyD`AvbeedWPvGvjc5M&9324a}R zayz9;e6V$zSbG928S0w90kP9yw2MOr2R@g)`!R6%;-}^X+ZqLUh<-;?@UE}Ndv&`c zS_1D$V>cu3&6sM;U>wmC{5TU{$5*llb(CAg)+S4Zf>zY0i4))?_h{4YgRHrZ=0ngl z%ch!k4#HLppp0s2+aI%U)V|kh-?|#Fs_}}NTu!ZCstzP8fh6r<%pVhuGXd&X z)g8(>3@)}M*5eP zXLco$T92fvkyLqX)8}a!+C=++{q1Z2<@_cRTJ}SIz`V0eBFOHm$>Z+7h5Pe!n?4Ak tx+n_XcHr!^iAx2Nqy^aWSz902w)%W{KoX#KGc1aaLZ3MQ`6ofQ@HZ~6KobA} delta 404 zcmeySd03HeIWI340}vE4X=EC3OyrYboG?+npDl$mm_d_k<0CsJ#^T9}%s<)Wfoh86 zCM&QgFe+_!WU*yp)SO(;Hl0y-vN(IRj3%R>CSws;jRH_%F(Z&rD3Su{QJUPx?k1)T zWZvQ{N=-{GO3h17jZe-`NiC9}{E9t>QE9Rxi!hryNUi$h1dbbw>YFV&pE3f?m*+MR za0H3-g9ttl;WRm(TTI##$kb#m0y+E^dvZp8W^!tAkrqf^bMgf44~!m@8+o1xDgXsg zT~fw7JI)KFj0H&C;s|yPiT4Zj@wvrSlA4^6mzkWIm{$aLDO+(#Vo7Onkr7C-F-S45 zOJYfCNM>%TTV`rbN|856jJqhcI6tQ>H6=c=q(~a16yg^P5Yu9F2cH@vJBaP4$uW7d jupPvY7L)G?%W_2kg+YN-d~hlh diff --git a/core/__pycache__/signals.cpython-311.pyc b/core/__pycache__/signals.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..790288c11c7ee6b0bd17fda5ae533a992edf99de GIT binary patch literal 815 zcmY*Vzi-n}5WZ)}_6w*$VF^s60x1?!ydaeUF|i>9q{5OVa-NUGtz$>;*)2#NGBEHT zl#wZb(m%#Uk%%lIRbuKEl&ur@oF5{myYu(%zIXoKecRc&0c5Z2M);Zm{LzQCRaRip zC2$4-1T2C9Ycr;?5g7xsZI;-KDg&!+5v~MQWDlIS!@vMEk)d^Nj}3qc#nJ-j6O0K? z)&*$ufFFQcz0wtz71d#)(vI?vkq%s$t}jmC9Fe^1#t8xv=;;psOYl;IjJEh{5g zt|=X27f#YWM3Jh(783mw-HPP8&cj%xek`zXmW`mWk4}8qQ%W!TA=$O(^^*a5SvQN* z%)<{TvNVz2Ng|Kb&==^5M53p{UhGGzIs91MTaM~z0iEG;3v!pn*%az2r4d{@x8}gC zXTSOVDX;(Hji0>ny`S^O1>c|Y{e10nlSn0VLHD5LR*PD2=*PXJ8FZV2BtZJ->fciD zw79))homkQeW@Q(JXlpl5~nikHvKH^udYi=6YS-za$Tj^A0Y2iL*Aiu&7V^{i|~c4 z(NXVQjVO^i#%9pWw|xeW@@=2NlYHA}@HpT0OI97#KD%FD=B$3f>Qh#q8wR7tQ~GOy LvA0zz%ca79ufojR literal 0 HcmV?d00001 diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index ec30d5eee2ac329dd54efe2c3e25d23ff60e6961..694d76b1c7eb6ee23f669de50bf8ef33b006e027 100644 GIT binary patch delta 322 zcmeyxw2RqoIWI340}!~dX=LsL(vLwL7+`}kK1Tr=(-~42QW$d>av7r-85vTTQkZj? za+#x;b6KKTCi=N{PfJcTMR|4P~~}vxv5obU{U=dkgNPO z*=}*CWF_XM=j)Xgav7r-8By6xDa<)c zxy(__j0{W+sf;Nssmv*?YuJ`CGcc?MVhBiQjABV)4`$HhcnK2FWW2>vkZ47fK6rT02*Xww_-gxul0wt!2!A`)Gsx^>O5R@J&q!cM3Emo0byi2m_{=n>- zAmr2>IB>`TWTfWM11ElzN>$YhJ+@r9bscRLYotiMfXXdWRVnJJZ`N^w1M2AcY3BWW z`{w6+{-yW#ccn-1cn^YcjL+(S3HPKFvv}{ocpa%>BWm^(dl;l5l{aFhSQO28F&?ZV zhGZs+3789N)R4{IVy~GjCQYTNn0>`Qu=m_X#eOvgdO#IH530;0%Ee#NPfg?)5}VQ7 z(sd0xx^2NSY}hk8op2W%4d<96L@+hSDbHw5E<|{&S*nJKfHhUeTE&Gx!PQOerfq4j z7=X-i_nzhz(mSP9W-YyIzM>o2PcP4K^(aIT*0SgEJ9H*oHOlT48=H6+U50Fj z@KBCsUB_{1h}f6s;3EzRSL~|gViAluMm;=0x*En2SmeSag0*W^&2jM_8j+$ZL&G8! z+j6xVt`mk;I^B2_9uFUesr2*9aG9y+m^J`|4}#I5^`~(jG?B{K)hmWpQZ=`%8~6h- zQbb1qbqlSM=A!Q#@Ll42Wyk%ct-i$hgRCY&HD2iPA(akZ(b!KhcI;t@$r*c1pA3|Bn zw6tI>ur+p$9#1glwh(Hec9D3)fQ zsZc{|WM{fHI^112z2IPsz*Pdg(nyE;rXf|>nR*df+&sF$UPSXuR~6AWs@U2WLa&{S zNKYInM$e_E8-0OucXtY*`&MJBSmSi2`}8Q4CJ1-_i^(a{<8Hlq!d}&_sT@l}x=QwK z+e=s5WGIz%r_?dm%NB{kx?FK}AR>LAHxuVSpGfOg#m1CncD_0Y)~RPtD!?f_ZP{rJ ze87mZYUhdEK`L9NHhn|*7{ue_6lxcMXoq)(Lr5en zP!ZFYfpc`3d<|lA8@NEd^r2yaDtgEy479W{5zpG1Ghw@*-Oz!TW7ORyYrr)U-$tvK zbTvRCTorl_{up9637by0`H079K2=%j+ymUWg<28m_P0v|E0G~DGSo^9eJ`%2vMZ_V z<2}t(!A}+L#9LDTqOmINU6J-KRhv@Amoj(Qbxw$$T2lt^pIB9fSCrug^#$*%uf18r zQ-+(0=_}@)v#o^UC-(b^(Z`jQ#1SuXWKHhBJG10A4y>|2~zI_iyl(iBhn;z>`e!;i{33xOLO z8~^Y~PI;-(W@5}wjCsP?i{!xlgR9BRN;31DqqQb8&EzFNdFj@<%|>+e>7nPlz2g^} zv1vax?Qzo%?XSNwr{yzQ^jor@>g>p;3HF)9fX=1x0eYbOK@t9vI#;%4Y)o51yDuwk zOFnpF`sIAN>dpq&Om@A+lQ(TuGo0Y55UD!=^Nk-P1GDtzgC|17O@GzZAtm@f;5YLr z@7pb&Hh(NpMad8}-{A6}prFqNE&5;K1msl>?Ib=2L9|;suNr%Wd_Ci#E@`1LuUlGZ o*z1-SI^?}gT4cs(9m zY;3=`B9S!HR?teFz)9Odo3p5K$^tjC5xt1NV}A3FKJNP5IEPa29ZSe#m0fWoKxUBy zEZ90uB7zNy=dp zubh0Xz%xYSg`necBKIPx!#IIHl53=Sig3bioX+`1xw!Sq8T@tzWqklIkoTX!I$l6R zBce%|9V)01vrv3=yC2AwX+QA&sg9Ezs?|lRB8ds@@URW-31qVxe8sBvm9xM0YgA7Y q`37EMoh;`?aqISn>m_>>*KDpB1Jnh!i-y>d>XN`|l9A{n>&cE>mjxh#&jCt&4^R>( z+o@R5kp#do`=V7(Az>R-NloQe|cNh0|q zb;L9t547%!NC`QI2C^zjp9~#|jEjBIVqBS!D-%}ZXaZsM>A(CUUYftrb6hjSKoaHD1F4P7(0h_$a9n2I{uxkJUZl}dtUG}p0U zgJ8|Uhz@m$-qFYbe1s3EYGa~nhW;(4na7yySvH2I*1=Tj>gG$HY$|Q7ZHCRDJ%t7~ zn@)@HG|;SWLuX*uMZn3*k1Sd3E$Pwn)rxnlz|wy$1P#K`*S)!<;)aEWGA zB$^0gmG^aQAe*N8iQTM>QU!*FA*5-@l8jsfGdu&~H?C%IDF{iJo-zB0*6nJ0>>lAR zHW4-(2ZRq89j@)}+=aW_t6#v42P>=hX=cEoW19{whZWi2gGKm!)6A0Itg%|%;r>u{ zxuuZ^%`91#fi*KaWgnP$$6_El%BZcGO^b?Xk1ApI*u>J*a&3FLwz5joRu}iD_yxFN zX27epYRl^2s=Mc!j$6e~af2Bp)h8BtWOua&uJZn?zMlRn>%@<*6uV!!x$Xhs|CJE% z5w=rov=0YQAOrPwPnrE8?JKjtDt`I1Go|J$wIC^t$%prY3{c7))qW|bzTqp7YW1~a;`-WxiN4=vCB*Hce`y)#Bhg@%{{3gR* zDYv5T{FHpcj{MhZI}8MpAPB4g!Zi;}MQ<-gu29Mzc*`5e +
+
+
+
+

Acceso para Técnicos

+
+ {% csrf_token %} + {% if messages %} + {% for message in messages %} +
{{ message }}
+ {% endfor %} + {% endif %} +
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+ +{% endblock %} diff --git a/core/urls.py b/core/urls.py index 332eff0..8088515 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,9 +1,8 @@ from django.urls import path -from django.urls import path - -from .views import index +from .views import index, technician_login urlpatterns = [ path("", index, name="index"), + path("login/", technician_login, name="technician_login"), ] diff --git a/core/views.py b/core/views.py index f306c47..68046ee 100644 --- a/core/views.py +++ b/core/views.py @@ -2,10 +2,13 @@ import os import platform from django import get_version as django_version -from django.shortcuts import render +from django.contrib.auth import login +from django.contrib.auth.models import User +from django.contrib import messages +from django.shortcuts import render, redirect from django.utils import timezone -from .models import MachineModel, SparePart, ServiceIntervention +from .models import MachineModel, SparePart, ServiceIntervention, TechnicianProfile def index(request): @@ -32,4 +35,24 @@ def index(request): def article_detail(request): - return render(request, "core/article_detail.html") \ No newline at end of file + return render(request, "core/article_detail.html") + +def technician_login(request): + if request.method == 'POST': + technician_id = request.POST.get('technician') + pin = request.POST.get('pin') + + try: + user = User.objects.get(id=technician_id, technician_profile__is_technician=True, is_active=True) + if user.technician_profile.pin == pin: + login(request, user) + return redirect('index') + else: + messages.error(request, 'PIN incorrecto.') + except User.DoesNotExist: + messages.error(request, 'Técnico no encontrado.') + + return redirect('technician_login') + + technicians = User.objects.filter(technician_profile__is_technician=True, is_active=True) + return render(request, 'core/technician_login.html', {'technicians': technicians})