From 920463356f18f90672d760218db44f0e34ad1b17 Mon Sep 17 00:00:00 2001 From: trevor Date: Tue, 29 Oct 2024 20:56:48 +0900 Subject: [PATCH] registration functions. service request resolved --- .../assets/css/service_request_modal.css | 27 ++ smartsoltech/static/assets/js/modal-init.js | 95 ++++ smartsoltech/static/qr_codes/request_334.png | Bin 0 -> 1129 bytes smartsoltech/static/qr_codes/request_335.png | Bin 0 -> 1161 bytes smartsoltech/static/qr_codes/request_336.png | Bin 0 -> 1119 bytes smartsoltech/static/qr_codes/request_337.png | Bin 0 -> 1097 bytes smartsoltech/static/qr_codes/request_338.png | Bin 0 -> 1150 bytes smartsoltech/static/qr_codes/request_339.png | Bin 0 -> 1183 bytes smartsoltech/static/qr_codes/request_340.png | Bin 0 -> 1116 bytes smartsoltech/static/qr_codes/request_341.png | Bin 0 -> 1100 bytes smartsoltech/static/qr_codes/request_342.png | Bin 0 -> 1174 bytes smartsoltech/static/qr_codes/request_343.png | Bin 0 -> 1135 bytes smartsoltech/static/qr_codes/request_344.png | Bin 0 -> 1134 bytes smartsoltech/static/qr_codes/request_345.png | Bin 0 -> 1152 bytes smartsoltech/static/qr_codes/request_346.png | Bin 0 -> 1174 bytes .../web/templates/web/modal_order_form.html | 157 +------ .../web/templates/web/service_detail.html | 179 +++++++- smartsoltech/web/urls.py | 1 + smartsoltech/web/views.py | 404 +++++++++++------- 19 files changed, 546 insertions(+), 317 deletions(-) create mode 100644 smartsoltech/static/assets/css/service_request_modal.css create mode 100644 smartsoltech/static/qr_codes/request_334.png create mode 100644 smartsoltech/static/qr_codes/request_335.png create mode 100644 smartsoltech/static/qr_codes/request_336.png create mode 100644 smartsoltech/static/qr_codes/request_337.png create mode 100644 smartsoltech/static/qr_codes/request_338.png create mode 100644 smartsoltech/static/qr_codes/request_339.png create mode 100644 smartsoltech/static/qr_codes/request_340.png create mode 100644 smartsoltech/static/qr_codes/request_341.png create mode 100644 smartsoltech/static/qr_codes/request_342.png create mode 100644 smartsoltech/static/qr_codes/request_343.png create mode 100644 smartsoltech/static/qr_codes/request_344.png create mode 100644 smartsoltech/static/qr_codes/request_345.png create mode 100644 smartsoltech/static/qr_codes/request_346.png diff --git a/smartsoltech/static/assets/css/service_request_modal.css b/smartsoltech/static/assets/css/service_request_modal.css new file mode 100644 index 0000000..ed8b3dc --- /dev/null +++ b/smartsoltech/static/assets/css/service_request_modal.css @@ -0,0 +1,27 @@ + /* Добавляем стили для анимации появления модального окна */ + #serviceModal { + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.4); + } + + .modal-content { + position: relative; + background-color: #fefefe; + margin: auto; + padding: 20px; + border: 1px solid #888; + width: 80%; + max-width: 600px; + transform: scale(0); + transition: transform 0.5s ease; + } + + .modal.show .modal-content { + transform: scale(1); + } \ No newline at end of file diff --git a/smartsoltech/static/assets/js/modal-init.js b/smartsoltech/static/assets/js/modal-init.js index cc06919..9da3b06 100644 --- a/smartsoltech/static/assets/js/modal-init.js +++ b/smartsoltech/static/assets/js/modal-init.js @@ -13,3 +13,98 @@ document.addEventListener("DOMContentLoaded", function () { }); } }); + +document.addEventListener('DOMContentLoaded', function () { + const generateQrButton = document.getElementById('generateQrButton'); + + if (generateQrButton) { + generateQrButton.addEventListener('click', function () { + const clientEmail = document.getElementById('clientEmail').value; + const clientPhone = document.getElementById('clientPhone').value; + const clientName = document.getElementById('clientName').value; + const description = document.getElementById('description').value; + const serviceId = generateQrButton.getAttribute('data-service-id'); + + // Проверка заполненности полей + if (!clientEmail || !clientPhone || !clientName || !description || !serviceId) { + alert('Все поля должны быть заполнены.'); + return; + } + + // Получение CSRF токена из cookies + function getCookie(name) { + let cookieValue = null; + if (document.cookie && document.cookie !== '') { + const cookies = document.cookie.split(';'); + for (let i = 0; i < cookies.length; i++) { + const cookie = cookies[i].trim(); + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + const csrftoken = getCookie('csrftoken'); + + // Отправка POST запроса на создание заявки + fetch('/service/create_request/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRFToken': csrftoken + }, + body: JSON.stringify({ + client_email: clientEmail, + client_phone: clientPhone, + client_name: clientName, + service_id: serviceId, + description: description + }) + }) + .then(response => { + if (!response.ok) { + throw new Error('Ошибка при создании заявки'); + } + return response.json(); + }) + .then(data => { + if (data.status === 'success') { + alert(data.message); + } else if (data.status === 'existing_request') { + alert(data.message); + } else { + alert('Неизвестная ошибка. Пожалуйста, попробуйте снова.'); + } + }) + .catch(error => { + console.error('Ошибка при создании заявки:', error); + }); + }); + } +}); + +function checkVerificationStatus(serviceRequestId, interval) { + fetch(`/service/request_status/${serviceRequestId}/`) + .then(response => { + if (!response.ok) { + throw new Error('Ошибка при проверке статуса заявки'); + } + return response.json(); + }) + .then(data => { + if (data.is_verified) { + // Закрываем форму и показываем окно подтверждения + document.getElementById('serviceModal').style.display = 'none'; + document.getElementById('confirmationModal').style.display = 'block'; + + // Останавливаем интервал проверки статуса + clearInterval(interval); + } + }) + .catch(error => { + console.error('Ошибка при проверке статуса заявки:', error); + }); +} \ No newline at end of file diff --git a/smartsoltech/static/qr_codes/request_334.png b/smartsoltech/static/qr_codes/request_334.png new file mode 100644 index 0000000000000000000000000000000000000000..80962bea575425b49226a01069ef5d20d512397a GIT binary patch literal 1129 zcmV-v1eW`WP) z-HGc+5QR^z1b%G61mIAl3^t@?Lb@49p*Vm6>Cqr@_MxkP>}9zid9KI!)Pu04{%8w| zs;-}I8*xCUzmCv=aN)v*3l}b2xbVl~=F$RK%z&kZS+`jnG<93N2P|pm@VME9zZ(vc zBzltM+%SGcSb=_SJk;oCfMd8B(v#%)((f+(+4z#o*VG}Y88&m}3ZxBi)8{tvk+Tbb zbG*N_0MO8^1Nhl((e;v-6K(kB*@eF=z8OEe&B(c-ujazlYzXV0m|gfA;K^480$2b8 z0P8O;4B=|*=a1Dqkm%yjIlb%*hIlXktbL{S3tPNxYz;8@#YaB8oC6!gqZwbtGA|Q(7l{mqZV1{R|Mx2MySaSUO-D08W3;0KyCdwwA!wA`W@P z?84t3w;^1OpT2yf{WAkzAOip_rxa%7qQ%eo@xosT_jO(TG-rp4hCnEve1#W>#M+oV ztnj0FSb^!h0+Y2!byxrhR|A$4y*3fZs(kiCe!TD(!;`H`rTuubpBw+$r>9kezz9Im zgzy7Ww9fU4D>#OHseCQGEkHdd!jIuehi2qXlP0I*QsFhGRMI6rkk$#`FLgs*R2QVen1co$M4Ij;3) zbvg+@B+1s5OHRfi``X;lIiktUc+xuId!=|zc&N}+3YWYtt9-Gt#KI5ad5_pvi+=QO zO+%OgECwKa!Q$32U+}dk{l%~S?!upiSG9a!+_5;))X*O7T8w5@hZX)HTNh2&bY8*9 z8d^`cdc*?6zV&|IS~qdahiskjBT`kw`c$Au(L}jd_o387Ui#gIKMT(lF`#O)%l&oL zkdi*}b|-0_@V!#iCcMa>GIwNMk*)inpxT7+L&950XVu-c+p((or~Xc9o$$T#pL|`_ zx1N(gFQ1fa&NaSWJ~H zo%xRcumV%ulC8b}!XJs-u$aYTVy6zUA*`?=8@v$>?RfAJvp z9P8Tf9kUC65B&bDPQ*II#lW6`pAZ|*)H%@*zFGonD-SFDfZWBf)mCiY8~||NP^=hM v_---&e$4-i{=H7PaN)v*3l}c@r{Mnr>)$I=1?;Xl00000NkvXXu0mjfKN&oW literal 0 HcmV?d00001 diff --git a/smartsoltech/static/qr_codes/request_335.png b/smartsoltech/static/qr_codes/request_335.png new file mode 100644 index 0000000000000000000000000000000000000000..41f785bd377467b1dff9e6b7d46295fe309ef3e9 GIT binary patch literal 1161 zcmV;41a|w0P) zOOE3>42FM>3}h(-eSjQAzCjz8nBlE6#TuQUa7)tVi!^wlM7c8=YwK^ zAjOARLhO+E&mI~u+;GDUH{5W;4LAH)T(S(1X&V4+BKgL67euL_ZRM-eajP4CQaq3( zSAhRs6J+uUs%v3&1bl)_aFhv-B*{m7=jw)^3?K5}Z3Mz^K;QvHag?zB0OR;)AaEZT zuQwq!KmeDHS>15M0f6&1fMfz^Ky97;S_S}W>%Me#!_SKQn~016;#fY4qx+Av-go=) zhQ9?~Jgg^x4Un*0C;%YvYxbsL1|%#)A~v8`z_)&O!(WU?k!;}r0AU%*Wd(pOE2m7j zYY2Pj>V}^TS9NOUi`ec0puZ4E0DMBWiHEIj_&ITC9we+TXHMpK2QfcUG4%x4+jv7sTxWLmqtl>MP+Pb?iP5`lu$Puc~#fTC^ z@S!Ym#Oj8h6R*((YBAOkfk|(0MotjxtFY!*`R-dkyWy|Gi`Hpu3II)|eCl;ASILSe zHVkNNhYFFol0Pcg7 zj2wV%1mpN8e?ryxG0 zN>-pxsrcFgU>?@+BXCU+F9Y&HohwTsWgFC`cB%(&9@g+((#5c|Z~0Yx!?yrmEN(qYqVI~CI2*BS2@p=<| z1vpChJtU$X?|JKIH~dw2@vyANbE=!2eQh#cffmwQ3~Trycs>fNy-at}NlpNeJDq^s z-=tFjwo92k@g07=;cti6Xrk}i><>zmuHu$CDOS&Ho#DH1kt-?Fc3~+z6b~CmN160I zwqu)pqV?Ku@#77DJG|T1m5OYOS6f$S3136m|Cy~bd@tT+b+&jl4^b2mop_=HDD+VF z@QCkR-SD&FeQiP`SJbItzK)_`e~hddL9=y+KPSCPJ+!fF(zrW?*g8$@WTN5w3}sf00000NkvXXu0mjfh>S7% literal 0 HcmV?d00001 diff --git a/smartsoltech/static/qr_codes/request_336.png b/smartsoltech/static/qr_codes/request_336.png new file mode 100644 index 0000000000000000000000000000000000000000..7720724a9849ed6d597eea5be775dfbabbccf06e GIT binary patch literal 1119 zcmV-l1fctgP) zO|I)U3`P%Y0~yM|Tfke2vV$(^qD$%y;-zE(1?1rcY_J1SKgnw+wt+MaISAs|2f79b zO8iLaigLi_-;U7WxZ{pH?zrQQJMQ?oxR{N|bs2$WM6Q6yv*8zYYH)>;1?6c*oxZFR?Bt zuzX74niU4VnX94sHpuuie6Gv98I-?sbmu$K~rjqPOrZ z5Wee@Zcw=b#QT^Zk?V3PQSZFb9se}EW)li5qvaJbZ76(;vOvipOk5$Rtq3k}{qByx z7SC$Pm#)Zlx#S2ZR|W+JHPKi``wqnvt_v@an(g z=XqTg<7#V3Ni#HIIc!YUhmund_d3V-TOYZw^!3TPsz7Wvnz`3GzRRBa=JLE+m1C%j zJBxL=a^m=zdYuV$)uo`6C0cDFVe!ws&hh=$$F;Uz3$>v*nAi0)ad5A5{E%gD$_|&> zYHr1}k)UO*S3J?GWbSp2?>6%~EUvZcYne@puK~YK!f*ZVj=u^o*+f-ITDwVG>(vr$ z6Ia~p96w+!)>%VI$s9`3P}X|g=CQDrB;>8%-SJo9U8j?YCPgo?K9pb%R}$HwCb#Z& zj_qs+}f?{w8pxs=2@wB#p|$+pSP~F{a|HDSCZC8mDo?5aQrx4m6P7NdJToTgQ7m- z>pI7e;Z-@QMgBIWrlH8kJZ2MK{dfGBmEhKna~itKheWo1^BLChV`i}~)Jo@3&{KlbE)Vn0~Cxk}I+T%Y@FqgAkGmA)Pe34ph-pAEvSjYF9_ zO^)L@422(C25PAQeSkWOa)Ulnp^h{+u#b`h6d*4H*x)QgN^)veb{eTn9v4R9i97IF_tOCqZ4#m#*yE^d~#gnS4 zWL6A*38glIl!L130wm8SbcB7X zqhmTg^}Q2+6mDKu)GRJQ(xsl$;(F#`08}%)xJR!ezS~UeGJqmvaVff1#4XiNlh=k- z>2<`9nfXr!y5(DQvy_{{EhzdoMvuw#I^w&`*L4d}7i~aXV8J!R{ZCs*Y~i|&_z`R2 z()`L-b0wu15vmf_?yEOr>2<{SS<4)N>S5amYhl*24)a8M9r0th>SchAaRH`NQ2l&Y z^^O>zBLF#L6&(>&&OQh5Gk!err^8*tN|g?w}Va~R9HU~<^09<`46Zu4rLm4&@PY*Dwh zB{l(<9WmmEtn;w0`8Mdq42n(DzE zli39Edq&tz4Aoo9HR`haPyCp<)>UuHUZop7;MzCqeESG+T}S+gnbzeNKD{xl2O;&pXov%NL1i*=coH~L4dBfj5U>uz4vQi-0ODS6UWRpX%azgwrc-yN}HLrr{Wa)$LeKHTQrJwJ3a?h(1 ze>MDe#|h6ILRG#0cof?^7t}i9`>f>HKA$NBFi61iIzt<5bPMkP#;>3ynFYtc>z@c7Vs|mp- P00000NkvXXu0mjf1p*XT literal 0 HcmV?d00001 diff --git a/smartsoltech/static/qr_codes/request_338.png b/smartsoltech/static/qr_codes/request_338.png new file mode 100644 index 0000000000000000000000000000000000000000..835ac93bdf4615d151c8073b2f3ab1fd18e1fbf3 GIT binary patch literal 1150 zcmV-^1cCdBP) z!HwfO3_u^h1mq|KTR=*&JNq?l2X-kbU;z6VKnC|9(N;32jkCxEArD3}@q=uDAVrGg zh;l%t|Ble$xZ{pH?zrQQJMQ>%aj6oKVG&`HdJ&OWZj=GauSJIEt?u}z;i#%Ay{f9t zL4lw;CRO@5D81%#i|QQgvJvB3zq{kF!cFUDpr3>4n5vq={;AxT*%i~Z&hh8r^8XwZ zmPpaWsiW%J)CHB{->&ZXXW;SfyTTgjf3L#SeF00%z$%c|`qrN2bzFA*6CDg$c?VV}CX;~$0> zllJXcEM=HFq#Cycn9do!zxA!(-SJo9O$@6e7OIX=LRv^$N+snc%=H-7@dIMXI4})^ zav9T>G?};CP4!&s96um!Zf>U7uwwdD^(KACmd&$Nv1^^4}8SK-Y$>>fF&nl&p26zqQW z=FrS-o#T&*?lQ6msJZd5`wq{}YjF?j_z}5_VQapGcEeXq-yC$$rnuHQen6UN0`8J_ zmaiMru77HoJJ&kLAC@L9qBk+@H@lWBkuu_$6UPrp<6)~0ZENYQpzbE>=sjQO_%Si3 zS@Uq_YlC@R+v^pF+i$MdJ*?x8i+R|Z2QJ&UU9YrciGu|kdwsiWo#PLSdCrXG;p~vV zD4azOeCk3esFPtiDWt0~$*C=C>My6-G69$;{t*xF_`BgZ-8y^b4$P#@ z&;+tunCrIA@dI+Rufxv4cD=%Kcw=g{&SO}|AD68GCuD1$=;~#Xkb#h;)CRCdASlxi z%=NzYyF31BJY{M>L@8bmN;5+s)tiQh0%h!k){tVAn~p^Hu#O+cOU}0#H-M>I z#rnZkp;uLrj&f)r!xE9J(2d;hiR+p*F*w{?y`=^S?Rp+%)^#Kc~Gx8K)x z@VxcAJN{~XsiTJXxI%RXkq%TZHi&pCbGw|=@H=#zUu$HNbl=)%HD)i$TwblVVVRgqp6Tjcr*(9gXL>LxQWJ;yow&C-A zo#T(meGI!Pm(6e5O6z85hmE<`IsT~Jo^<`K_ zL5{0B5JgXYkQf@N7m%fx9sDJ=-jd!9U@2KZOE8QCx_@9BNZzc;Q<|TuK@be{g2W(h2LPa%uOx(H(y`97z&U zk~CH#jv$Sd@`vVhiF&r*3elf>?vB42pK|!puZv`Mxf#P{2B>6aX2daHYG(D5M|b?a zar+z>BVKEW<6;bL4t)%l8SDP;=#IY!UOyZQD!~K{|9$~eJwvz|U{4?2@%O}w*9DP$ z4VIeN&$SW22qQ)q1yhTdU|&~0_1qnQF+P}?Sqs)pjbLg-yf(_u+G~w^<#77H^BEtZ4Z1PqrMJzje1xjX(Uyi`s`P+tz!1H`csgi=x=%;`7vVa6*b zjvuh(b;&|@IB5j+A)k=Oa&=U8J@-1t57<@$1}g1+O-gaCIA*2ff2ok{Ug!9?ExFJ3 z3BcK2SF{VGSj zus@L!361$7>|W>iQ9OIo)W|y4Y<661TMPi)TqdD~IJJ(6b50pMsa%6oA1R*=ISl zF4a{?%RQxQQ~dOY+`QxG!tb&Pa`ksxCM7_uL(SEv{eIh{4R#b9J~#sWUNm!4@}5X+~0HpEkPV?}q0mEG(w{Tm=nXJwp%% z6=G^r%MMV<2+tbb@%O}c*~C`;ecXT|X|p5b@^SEbo#RI=zt^Q~B8(+z04()h2SL0V zBFr`Mx1s!o_k__Me^2~=cO59TImqhQy5?lnYc~zeW1ZvQv!aNVrm$5O+jWbr>znSH zC*12C|E}erl@785n@;qb7`qc_@g6b9pM=L%>5t=LMXI=2QC|UAEae)z-JO2K%{zWJ z{Ezi@>0@ipDKB^F#3sgitaJP*zGV}6?}an8U8lwQaHU xpu_q;CypP)&Hug5amO8Z+;PVpcl>{W{|8Pk;+EzHv{3*6002ovPDHLkV1kW8OLG7K literal 0 HcmV?d00001 diff --git a/smartsoltech/static/qr_codes/request_340.png b/smartsoltech/static/qr_codes/request_340.png new file mode 100644 index 0000000000000000000000000000000000000000..9471168b5d5f7093503a62902683f0248a8d4053 GIT binary patch literal 1116 zcmV-i1f% zTZ-dI5Jhi{1pbtu7vQC&chE~JW=XvRX(?VnLF%(0#qE!L%GCpdrKZa0#)t9ikQM|t zG9D=#vBTzn_RxTE;lhOr7cN}5@MCdH*28W~4>RjgKL8dp%;OrLMY|ohy6}_YjwI;; zP5?L!AJGZnNMgQ{_IAI}Zs;_V~DCp zGJy0QW36R+>1!AMwK)I1ewf{cfLIZB_X{~Ksb~x=7h=AKl3}chu)_CPEc()?ES1xc zUpfzP8d7lOGz2sSVriZ5=Pf$jRC*3Eka_?v2GSHa8-mA{=7Y838_k4K6u#c z0V&K%>xA#H>|EQOo9~M2m1Ygs)%HgXEKMmgWVL1WFJy*5? zH??3(M^@Q{@O{=~6J@HY_QBdN1zUGix4gNIh!aR=08Q#m}b;5V(sgM@547!ozc3c=hY0f*K=d4 z*9kuYPx(T0vwR+QTFiifv>O2O-h;fG*;}4I`5r%B_{-s~)}?b3S>e*j*qlwo2n#gF zD5Q15pEGVP4{ri_sxF`9X@)#C=_GugWvv5Hj_l;_Lwj0mQ$tn`EBpYw)Q013ZoUR! z9+BN_DYv;B@kyt;nT(HSO@C-~r`((mLUX;Zf$S2N|d8I@+6G&CD*% z;R(C_mDPox0)MHgK zv_%s|Sm94w(z-bcSQl>zO8_w7LZmyduRSmjhUG`Fc*EG~fYpVc6aSBUtN%~azt;&D iE?l^9;lhP~7yLJJUSggmsYDt80000 zO>X2k422(C2C|fa9H5S3-(Zdu^pWNU_EB3v)Cr+F=apKqFVln`$hya@i)^Qh^0bm^gU>g8z{?Ylm-HAUN z4pmjfq^hbZ*wccbstEvMhAuJNlct~@u{`v5C;nZyYh3~`rJ%Y1z@!NwM20W#!~_9?3IOOjehdHt6xat$|6aN~apC|VZ)q>*I@PpGd2^~yzj=4!&w;zG ziwa-^bQM4W1rYNf)B6Cdw>%WnhpjAKv^(*q##a#$83B1qL1o?s$h^Jy8Sec>F{Pj~ zV=p1>rMnYhK8Sv7sV5%fT!9sTHGiJuVHx|$J5EnkN&bJF@yx(I_>NBoeq$iY2lww1|^pfx$E z1-Crc5x)f21%Sxymy{09DFwwk?&2*_fQWd34BG&iuiKsYv*CS~c=76&<$+W1vV^Bk zS`L{WmiP(jJ!}hPV+LB5xK$*oucg)zKaa=UU765jdnu8F%-F5duBh2IKxA}-_lNxP z#2*arY+WD2x~*&Bt7r3ClRIr4@uOnrI<)#~zVo%H8R6K6wA4D{C&VM?Ud{DioNtydA<>bb%D)MRIQJ=!|rC&Z)F+&4K*^{iLhP2ASO^TpIU;wSM^ z+TUIj>n%fnjxg1;J`}+2{>KcvRdM0&#GefBY@HWldvDr{uhP~LzdDAs?h`LdbV?Yl zK+B#J;#X-M(6>9)K7bNeB%syCI-%APKaR_rW?*{n=TFF7euu6iX7d0x&U7MvN}7kY zi(;+je;2;`=RJ`}4@>;Gw6t7#xpa=yEB&?S(}ewX#4o_DQCL;wt+?4;%EXB>FtJJr zE|@tXeoD$o&c~L7tk~>X*IPyzapJ2g*j_WHW%mQ%Lw|ST-;9?$T!Kx5wQ)MTh>Uv~ zyMt9MON=%T;LrHui9Z_tc~+;rm+-$AB??ljv^>`lzXbPQ&Y&V=P?_N`=S`#)EoA;3 zyAyv7{PToZLCk}$BSf(cS=XCFunpNJDPkXhn0c-venP&^>ih?gDZS=W=`WE+{15;k z3*tvnKD}gj;?Ifq=e5>a*T$ac*E*~Xfa1B1_)!u5_d4Rli4!MIoH+5n0{;(N+&+M& Sj7c8=0000 zO^%~F5P-jWAY}(6dcc1ZkZ4-Jkx?zrQQJMOsSjvtFlkro+}2(bql0FizcNG(JWfm9zIj??b=*>F@< zm7uDsQ)8EUudy3;p<5nVi1Dr8-SMBsQ*mE1beU>lKu7pKS(aQ2+^3Z+9hp9;)5(bK>8v4!Q|qj{r@!uVUY1pviKucE`_&SF7t3NFd=Z zsF~i!gg}!CBS@I8C<(T8<+px!$A1`)A|lcQ(5U>nx5%%13tq}}mz;^yntc+EbIU5VzbK@sXhI@0Jy z+}An&lGLthO&>%p<)#}!uZDV@hBRstO@A#23Cu_Z=mP$%B zrB0+&H&@nQw>rmPm96Juo4%S6hFY5|HtBJlrE_PujCpBYIpo(xK)XT zZbC`dS|#beT8({^g|1QJ?I9XJ9-^ckN)7n{?T()lU%LOWab%W5Ow`3y>&%Ib0C@M` z@m*4!mie``40PTeqVbknNIk@lFBE3Vq*Ki+e)`8d{-*d-3!;0f7l);35jIUT>KuUk zI>%p@Vm`}2iLJG)<0i%6{#ZG7t8@G%vA7PZnU%6|ehTiUrKD23WbW%6-yz#p!?Z5A z@RUB(i?uJjO6>R%cxrmScaVH*(Xco&U0AD55YzHMz@VG%9&2U zEavNC55)Rhx%*%E@s7V8UiZVME4F2Vbj|fU0Xudg^(dec?gC-m6Z_Wh?)XpP&wIqS zbDLHm*(|fQ!m`~)@z(F|_)pJ{zT=$xZH}AtbzDtUStIgQ8LAD;9xL!81?C$Fve_b}~>bm#86jHPdw2w of3I`gamO8Z+;PVp|6kz$0@aZUGo|h`&j0`b07*qoM6N<$g0!hiNB{r; literal 0 HcmV?d00001 diff --git a/smartsoltech/static/qr_codes/request_343.png b/smartsoltech/static/qr_codes/request_343.png new file mode 100644 index 0000000000000000000000000000000000000000..7143133eca9a71d37c53eb04b0468ad563a8d78b GIT binary patch literal 1135 zcmV-#1d#iQP) zL5}M<3`C0~16e9S4$wz&Zt#!P_(z%>*hk3$2C$a_6x1w8*-CmB`%iZ!#YNh&{h$~i zD6vSZjo4u0Ut4HExNzaZg$oxhT=>4Yg>`;}@fer=E9MRu{ixo0-fwi_Z;JOM$qC?) z3#yxSe!n~j)W}wxTU;5dFe=|Osnb|Q;+UKS74`1+M4(GHpZWej%j-v~IGu+*24PV53 zv%9045hwt1LBzz}Mi>5`_>#k>JLM!ij3f)tvv|}aSvQ7Ru{{ zKW)|5s_PAaFXZYP4p9vA;I>9Wd7bd5ZH;y9;*K?%(Mwj+DAozz1HT!0IS`mT znAw4Lp3N|REDOGTwa75YsF(eeA20m1@EYsbCa7#|LZh4jNWQMq3@dyGJdwkEAjV^& z_t%Zbo7ow)$pm+4Msx}MkRLDnweT-F>?+2Q1qg>*gcLw3vG6@rVy{gA_p;oBUWY|e zk=F@-)|wnPJS+lUq_24?hBcC&loR1wY^nZV4VX`~egF))bOyi>dP(Up{<<15pNb*h zYJ=2EKfCbn#iPk77x4EHZ84&sq6Njya|b))X03+z6Mnq#m&2FZL|wEkQgJi6MhR?b zM$vl{!navXU1LdCwYl)C_*!p?Dy{0U!nfJ#bxnf0iosu+?9_82d^hD}oivf|0^Wqj zhR#~5mDdS>)*3NnX{~G4a3PvtQSR^p}Hsn4OV)0|5J+01o-8 zw{?VX#=UQDn7d_T2>{4f!}xJEKUzAS>e6qw(S^So-t?EOIc${n^V;c|?yf3_6}|%= zD)C(RZ}Ju11aCY6a5MB5GyXm%0`o!rb;7sU+G(<8vky|q+QA+vEmemVzR6nUWI}YX zuT!cgvRvvFz#x4gRytjI~6-e5KPOc3q@;c$0@O7`wXm#+YW_5QlAhuKd zDEIir(S^SozPvX zO^(|<42EBRGLWSV^Z+@Ee1jfoFh}YQ?4#rW1?1%bGWab-{kYx5Zf8=zTm*KU2TA~f z;-45%9FXO|BQ!vqIC0{{i4!MI{9Ig22FSFE$b?Po!MF*qiU6>yEYo?b6Tc`PR8=(s z`aS|!WPpeaK!{EOIK?vBm8z=l@q?=qzbL+%`H~4vb@r;NaT9$XH^FjG0M-HdBO=4e zs}sLAuCq@-h?@X#iV&U3+oSHVe|B}^7sf^8rdY;uzueWf*}t(m@qZpKd!<(ZDatM3s z>clUGXLV}kOR<{!R<1TtAOY|RW)n|ao%l6zEBNLv+%5SS(_|;1pqkJImfUlNjq-_Pc;J6I^qY!lrF-o*l-FrTnG@k`^&2*~7B`)C5C1dCM!ORj@$`6_R-U*pRYe>Hp`!@4eL%^|JU zK%#{inV?@s`~+O&o?wP-9ROsj_aUZmzI2)_#L{HPo)hBdXx?keU6Ms3pk0xs4iS4j0Xw|f@oH3dp zen^To0bPB+x^L)CP}FQPV_4$H@UAwIrMA(vntwYyVc9(Tb;OU!uREs|9@4JTAKRfs zSoagPj`;J^houp}$E&{8%SyXbs3|^b9r5S!X68zhi7FNm$zvz#oH29m%1p7Z@#TrX z9NzWP!SZma_HCy6k-GIpx3hmQ{o9Fu7T))q}36xBs_-1IVZ%Q7vaCx5hqTZIC0{{iT@M${{`h0l&Bf%-~a#s07*qoM6N<$f=>o6 A8UO$Q literal 0 HcmV?d00001 diff --git a/smartsoltech/static/qr_codes/request_345.png b/smartsoltech/static/qr_codes/request_345.png new file mode 100644 index 0000000000000000000000000000000000000000..3fb78f3ceeac26754345efa0f90270856e84bded GIT binary patch literal 1152 zcmV-`1b_R9P)Nkl zO^&NL5P-iLkg^2n9Uw{Xvr2eMGgK{T68Pj;Dpk3D z>=xw(nf`i(2FD$D+;PVpcieHukHsZPiwsMPNRQnyNei$^x-9wC;keNqzZ#CJsuEOH zH8ys!k0Xtmj9t1R#6~M(JoVfie>c7)^Cg3QY$3!=nEFis%>Jc2vwsJU?)bHF9qsRy zd}xS`%Ev5{ANb&x)=kEBM@kvCgmD|UBQ^MRrh+xY+02$aUggtb0$1jGPI_>65SyK3r z?>13bfo>()#KT5+{F*p*MkIocU8P~Fsw)It&FZP@N}XIe_1qnQ7f#B=Y0)*4#`1OM zVMA=xo(9u8aIJIv1^La^)p_7pn?4=8HN6aO>l}Ycc3Y=or)JWUUo}UXoNJ0J@++=& zjz2F|zD}UcE_Ufr_!4F5fld*-EbXeW<@n>&b9el`xC{VvU!pqSROGHI(l^S~HwueL z)dw(nMa=PI@J3DH1~#jH>9~lPH=XV)q{fr9q?6&$(H*}ezKDpJa;3s+TGz!*_H~^V zV@pTCPx2NbdN9|x}Vge3C9n><-^hZ}tuFzbE)dx2_?unFB&)xBN z;Z+++-kAvYas1CFyR!6it#kZoNx?*f++SCE>EhmBw>NZ>dQ)8M9DiP_PN$+$Rc(SC zxu&Ny-e2eVQR}*0k#fE`+q!Zo3%+s`fNP!Oui&OlwiPUUSh_D^x_^n?v75PAdZT{C zk9YiRc=51lsb*g$t5=5^)xHUjVI6-BFEK0tO|5?=ny9=k-J?4`_1qnQ7oPXSTFW{J z-9If;A4z_-QzXnc6}q)0{4EgnMDeNT?)ba#Z0owmO<}nNn{y}+HZc^Z?6%JFr$iqm zw{dEnw1eVi)psU3eq8lGoz?X1o*7sGOEQ%cqC zJN~`X$?=1_SE*|LS<2C|r=Gjx@4~;Gng}3(Xoy=2G^>QUMd%upFm6Uj z7!MfTamOL`ty}d$q(xP~(!pXQo9JhsI|Ba5=#F0l|9%F$7Du`_p6pII7cJbwI{v&Q z4?CGbYmiiK1xY)2zJzpOtRgJGRta;vx`%cAc@h8bb&fmkxZ{pH?zrRs3;bXHa@2Sx S%{os20000 zO^%~H5Qd-nu#}~d<^VYgxj`SP)i;BqaDbLz8OiAV7Pf)R>>5VhnN%$hNqA(CN>$XK zW8#1e{~e*hamO8Z+;PVpcii!FaVrw?8O(w02bj$m>RFcCd8<4AqIf4snm|2`>=y4? z3F#!6T_t;;8Uc+YNssu!)g6CPd@kn8ZZQG#B`YCA3+iVxeO&M560>mf>W;q_9)9~Q z=8%BJR1RR>)c&2-9d{gnp2noPg~vb*Tl(rkZx*f<|In1hDlO_PAOYGNeO9clyfcpQ$M@oKL9toChUDQ z%bAmY4%lrDzY3*NNNl#si!9Gq?#7)>aRK0=vl*Dk0u=dvg~5mta`Cl z`a31^8By!U(t_ui6UProF(R5&enBPv-7aok>uCRwRNe42*#6C;3W6mtTvM=a4C$QJ9e+)nngrSE`};nCoi|mrdiy?r zr+#+FzYDKgH}O#9XKOdn8fMgJwg-Q&bNq!%*9wmQSEL>5p-#hJaTj%%*xZMB-3nh^FXd!n$cE;bc3bE87iBm5FGyG(c8!gICD4r*l~Nf?$UB}e|4P>NC#>%HYvTLr z|JK2|wsERw8&rgCg3;gW96yYAwJf$fe6)31tYqod%}#vw-|=Izg{r&vIz7azTQRJN zXNes@8IP#)0VyT(G<;v}a}=8(Vpc{lI)Q{whM0o`~}DOKohbtth8Wv^{1Kkeon ze-eB@nW%MmqQn*3W+$r?t_>>gVIBXvlwRT?hX)O|+kQCjA9goNF-$dSG6v6_IDSCP o|Gmy}#~pXvamO8Z{GY)82YMXgx3bDtQ~&?~07*qoM6N<$g8sBoF#rGn literal 0 HcmV?d00001 diff --git a/smartsoltech/web/templates/web/modal_order_form.html b/smartsoltech/web/templates/web/modal_order_form.html index 69fe28d..01c47ee 100644 --- a/smartsoltech/web/templates/web/modal_order_form.html +++ b/smartsoltech/web/templates/web/modal_order_form.html @@ -1,3 +1,4 @@ +{% load static %} @@ -57,26 +58,29 @@ @@ -88,140 +92,7 @@ - - + diff --git a/smartsoltech/web/templates/web/service_detail.html b/smartsoltech/web/templates/web/service_detail.html index a4477ae..c0874f0 100644 --- a/smartsoltech/web/templates/web/service_detail.html +++ b/smartsoltech/web/templates/web/service_detail.html @@ -1,4 +1,3 @@ - {% extends 'web/base.html' %} {% load static %} {% block title %}Услуга - {{ service.name }}{% endblock %} @@ -14,16 +13,15 @@

{{ service.name }}

{{ service.description }}

- + - -
{% include "web/modal_order_form.html" %} +
@@ -80,17 +78,174 @@
+ + + -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/smartsoltech/web/urls.py b/smartsoltech/web/urls.py index d8e3740..2ad5386 100644 --- a/smartsoltech/web/urls.py +++ b/smartsoltech/web/urls.py @@ -22,6 +22,7 @@ urlpatterns = [ path('client/orders/', views.client_orders, name='client_orders'), path('order//', views.order_detail, name='order_detail'), path('service/send_telegram_notification/', views.send_telegram_notification, name='send_telegram_notification'), + path('service/create_request/', views.create_service_request_basic, name='create_service_request_basic'), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/smartsoltech/web/views.py b/smartsoltech/web/views.py index e62e37a..4ef5690 100644 --- a/smartsoltech/web/views.py +++ b/smartsoltech/web/views.py @@ -20,7 +20,9 @@ import hmac import hashlib import json from django.views.decorators.csrf import csrf_exempt +import logging +logger = logging.getLogger(__name__) # sens try: bot = TelegramBot() @@ -64,215 +66,290 @@ def services_view(request): def about_view(request): return render(request, 'web/about.html') -# def create_service_request(request, service_id): -# service = get_object_or_404(Service, pk=service_id) -# if request.method == 'POST': -# client_name = request.POST.get('client_name') -# client_email = request.POST.get('client_email') -# client_phone = request.POST.get('client_phone') -# description = request.POST.get('description') -# chat_id = request.POST.get('chat_id') -# token = uuid.uuid4().hex - -# # Создаем заявку -# service_request = ServiceRequest.objects.create( -# service=service, -# client_name=client_name, -# client_email=client_email, -# client_phone=client_phone, -# chat_id=chat_id, -# token=token -# ) - -# # Генерация уникальных данных для пользователя -# username = f"{client_email.split('@')[0]}_{get_random_string(5)}" -# password = get_random_string(8) - -# # Создание пользователя -# user = User.objects.create_user(username=username, password=password) -# user.first_name = client_name.split()[0] if client_name else "" -# user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else "" -# user.email = client_email -# user.save() - -# # Создание клиента и привязка к пользователю -# client, created = Client.objects.get_or_create( -# email=client_email, -# defaults={ -# 'user': user, -# 'first_name': user.first_name, -# 'last_name': user.last_name, -# 'phone_number': client_phone, -# 'chat_id': chat_id, -# } -# ) - -# # Создание заказа на основе заявки -# order = Order.objects.create( -# service_request=service_request, -# client=client, -# service=service, -# message=description, -# status="pending" -# ) - -# # Отправка сообщения в Telegram -# if chat_id: -# bot.send_telegram_message(client.id, service_request.id, "Ваши данные для входа на сайт.", order.id) - -# return redirect(reverse('order_detail', args=[order.pk])) - -# return render(request, 'web/create_service_request.html', {'service': service}) - def create_service_request(request, service_id): - service = get_object_or_404(Service, pk=service_id) if request.method == 'POST': - # Извлечение данных формы - client_email = request.POST.get('client_email') - client_phone = request.POST.get('client_phone') - description = request.POST.get('description') - chat_id = request.POST.get('client_chat_id') - client_name = request.POST.get('client_name') + try: + # Извлечение данных из запроса + data = json.loads(request.body) + client_email = data.get('client_email') + client_phone = data.get('client_phone') + client_name = data.get('client_name') - # Проверка на наличие существующей заявки - service_request = get_object_or_404(ServiceRequest, chat_id=chat_id) + # Проверка на наличие всех необходимых данных + if not all([client_email, client_phone, client_name]): + return JsonResponse({'status': 'error', 'message': 'Все поля должны быть заполнены'}, status=400) - # Обновление данных заявки - service_request.client_email = client_email - service_request.client_phone = client_phone - service_request.message = description - service_request.save() + # Получение услуги + service = get_object_or_404(Service, pk=service_id) - # Создание клиента и пользователя, если необходимо - user, _ = User.objects.get_or_create( - username=f"{client_email.split('@')[0]}_{get_random_string(5)}", - defaults={"email": client_email} - ) - user.first_name = client_name.split()[0] if client_name else "" - user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else "" - user.save() + # Создаем или получаем клиента + client, created = Client.objects.get_or_create( + email=client_email, + defaults={ + 'first_name': client_name.split()[0] if client_name else "", + 'last_name': client_name.split()[-1] if len(client_name.split()) > 1 else "", + 'phone_number': client_phone, + } + ) - client, _ = Client.objects.get_or_create( - email=client_email, - defaults={ - 'user': user, - 'first_name': user.first_name, - 'last_name': user.last_name, - 'phone_number': client_phone, - 'chat_id': chat_id, - } - ) + # Обновляем данные клиента, если он уже существовал + if not created: + client.first_name = client_name.split()[0] + client.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else "" + client.phone_number = client_phone + client.save() - # Создание заказа, связанного с заявкой - order = Order.objects.create( - service_request=service_request, - client=client, - service=service_request.service, - message=description, - status="pending" - ) + # Проверяем, есть ли у клиента уже активная заявка + existing_requests = ServiceRequest.objects.filter(client=client, service=service, chat_id__isnull=True) + if existing_requests.exists(): + return JsonResponse({ + 'status': 'existing_request', + 'message': 'У вас уже есть активная заявка на данную услугу. Пожалуйста, проверьте ваш Telegram для завершения процесса.' + }) - # Отправка уведомления в Telegram - bot.send_telegram_message( - client.id, - service_request.id, - f"Ваш заказ на услугу '{service_request.service.name}' был успешно создан.", - order.id - ) + # Создание новой заявки на услугу + token = uuid.uuid4().hex + service_request = ServiceRequest.objects.create( + service=service, + client=client, + token=token + ) - return redirect(reverse('order_detail', args=[order.pk])) + return JsonResponse({ + 'status': 'success', + 'message': 'Заявка успешно создана. Пожалуйста, проверьте ваш Telegram для подтверждения.', + 'service_request_id': service_request.id, + }) - return render(request, 'web/create_service_request.html', {'service': service}) + except json.JSONDecodeError: + return JsonResponse({'status': 'error', 'message': 'Неверный формат данных'}, status=400) + return JsonResponse({'status': 'error', 'message': 'Метод запроса должен быть POST'}, status=405) +def create_service_request_basic(request): + if request.method == 'POST': + try: + # Извлечение данных из тела запроса + data = json.loads(request.body) + client_email = data.get('client_email') + client_phone = data.get('client_phone') + client_name = data.get('client_name') + service_id = data.get('service_id') + description = data.get('description') + + # Проверка на наличие всех необходимых данных + if not all([client_email, client_phone, client_name, service_id, description]): + return JsonResponse({'status': 'error', 'message': 'Все поля должны быть заполнены'}, status=400) + + # Получаем услугу по ID + service = get_object_or_404(Service, pk=service_id) + + # Проверка на существование активной заявки для клиента на данную услугу + existing_requests = ServiceRequest.objects.filter(client__email=client_email, service=service, chat_id__isnull=True) + if existing_requests.exists(): + return JsonResponse({ + 'status': 'existing_request', + 'message': 'У вас уже есть активная заявка на данную услугу. Пожалуйста, проверьте ваш Telegram для завершения процесса.' + }) + + # Создаем или получаем клиента + user, created = User.objects.get_or_create( + username=f"{client_email.split('@')[0]}_{get_random_string(5)}", + defaults={"email": client_email} + ) + + # Обновляем данные пользователя, если он уже существовал + user.first_name = client_name.split()[0] if client_name else "" + user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else "" + user.save() + + # Создаем или получаем объект клиента + client, _ = Client.objects.get_or_create( + email=client_email, + defaults={ + 'user': user, + 'first_name': user.first_name, + 'last_name': user.last_name, + 'phone_number': client_phone, + } + ) + + # Создаем заявку на услугу + token = uuid.uuid4().hex + service_request = ServiceRequest.objects.create( + service=service, + client=client, + token=token + ) + + # Создаем заказ на основе заявки + order = Order.objects.create( + service_request=service_request, + client=client, + service=service, + message=description, + status="pending" + ) + + # Отправляем уведомление в Telegram, если chat_id у клиента заполнен + if client.chat_id: + # Предполагается, что bot.send_telegram_message() уже настроен + bot.send_telegram_message( + client.chat_id, + f"Ваш заказ на услугу '{service.name}' был успешно создан. Пожалуйста, завершите процесс регистрации в Telegram." + ) + + return JsonResponse({ + 'status': 'success', + 'message': 'Заявка успешно создана. Пожалуйста, проверьте ваш Telegram для подтверждения.', + 'service_request_id': service_request.id, + }) + + except json.JSONDecodeError: + return JsonResponse({'status': 'error', 'message': 'Неверный формат данных'}, status=400) + except Exception as e: + return JsonResponse({'status': 'error', 'message': str(e)}, status=500) + + return JsonResponse({'status': 'error', 'message': 'Метод запроса должен быть POST'}, status=405) def generate_qr_code(request, service_id): if request.method == 'POST': - client_email = request.POST.get('client_email') - client_phone = request.POST.get('client_phone') - client_name = request.POST.get('client_name') + try: + data = json.loads(request.body) + client_email = data.get('client_email') + client_phone = data.get('client_phone') + client_name = data.get('client_name') + + # Проверка на наличие всех необходимых данных + if not all([client_email, client_phone, client_name]): + logger.error("Не все поля заполнены.") + return JsonResponse({'error': 'Все поля должны быть заполнены'}, status=400) + + except json.JSONDecodeError as e: + logger.error(f"Ошибка JSONDecodeError: {str(e)}") + return JsonResponse({'error': 'Неверный формат данных'}, status=400) # Создание или получение клиента - user, _ = User.objects.get_or_create( - username=f"{client_email.split('@')[0]}_{get_random_string(5)}", - defaults={"email": client_email} - ) - user.first_name = client_name.split()[0] if client_name else "" - user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else "" - user.save() + try: + user, created = User.objects.get_or_create( + username=f"{client_email.split('@')[0]}_{get_random_string(5)}", + defaults={"email": client_email} + ) + user.first_name = client_name.split()[0] if client_name else "" + user.last_name = client_name.split()[-1] if len(client_name.split()) > 1 else "" + user.save() - client, _ = Client.objects.get_or_create( - email=client_email, - defaults={ - 'user': user, - 'first_name': user.first_name, - 'last_name': user.last_name, - 'phone_number': client_phone - } - ) + client, _ = Client.objects.get_or_create( + email=client_email, + defaults={ + 'user': user, + 'first_name': user.first_name, + 'last_name': user.last_name, + 'phone_number': client_phone + } + ) + except Exception as e: + logger.error(f"Ошибка при создании или получении клиента: {str(e)}") + return JsonResponse({'error': f'Ошибка при создании клиента: {str(e)}'}, status=500) # Создание новой заявки на услугу - service = get_object_or_404(Service, pk=service_id) - token = uuid.uuid4().hex + try: + service = get_object_or_404(Service, pk=service_id) + token = uuid.uuid4().hex - service_request = ServiceRequest.objects.create( - service=service, - client=client, - token=token - ) + service_request = ServiceRequest.objects.create( + service=service, + client=client, + token=token + ) + except Exception as e: + logger.error(f"Ошибка при создании заявки: {str(e)}") + return JsonResponse({'error': f'Ошибка при создании заявки: {str(e)}'}, status=500) # Генерация ссылки для регистрации в Telegram - telegram_settings = get_object_or_404(TelegramSettings, pk=1) - registration_link = f'https://t.me/{telegram_settings.bot_name}?start=request_{service_request.id}_token_{urlsafe_base64_encode(force_bytes(token))}' + try: + telegram_settings = get_object_or_404(TelegramSettings, pk=1) + registration_link = f'https://t.me/{telegram_settings.bot_name}?start=request_{service_request.id}_token_{urlsafe_base64_encode(force_bytes(token))}' + except TelegramSettings.DoesNotExist: + logger.error("Не удалось получить настройки Telegram.") + return JsonResponse({'error': 'Не удалось получить настройки Telegram'}, status=500) # Генерация QR-кода - qr = qrcode.make(registration_link) - qr_code_dir = os.path.join(settings.STATICFILES_DIRS[0], 'qr_codes') - qr_code_path = os.path.join(qr_code_dir, f"request_{service_request.id}.png") - external_qr_link = f'static/qr_codes/request_{service_request.id}.png' + try: + qr = qrcode.make(registration_link) + qr_code_dir = os.path.join(settings.STATICFILES_DIRS[0], 'qr_codes') + qr_code_path = os.path.join(qr_code_dir, f"request_{service_request.id}.png") + external_qr_link = f'static/qr_codes/request_{service_request.id}.png' - if not os.path.exists(qr_code_dir): - os.makedirs(qr_code_dir) + if not os.path.exists(qr_code_dir): + os.makedirs(qr_code_dir) - qr.save(qr_code_path) + qr.save(qr_code_path) + except Exception as e: + logger.error(f"Ошибка при генерации QR-кода: {str(e)}") + return JsonResponse({'error': f'Ошибка при генерации QR-кода: {str(e)}'}, status=500) + # Возвращаем ответ, включающий все необходимые данные return JsonResponse({ 'registration_link': registration_link, 'qr_code_url': f"/{external_qr_link}", - 'service_request_id': service_request.id + 'service_request_id': service_request.id, + 'client_email': client_email, + 'client_phone': client_phone, + 'client_name': client_name }) else: + logger.error("Неправильный метод запроса") return JsonResponse({'error': 'Метод запроса должен быть POST'}, status=405) + def complete_registration(request, request_id): # Завершение регистрации по идентификатору заявки service_request = get_object_or_404(ServiceRequest, pk=request_id) if request.method == 'POST': - client_name = request.POST.get('client_name', service_request.client_name) - client_email = request.POST.get('client_email', service_request.client_email) - client_phone = request.POST.get('client_phone', service_request.client_phone) + client_email = request.POST.get('client_email', service_request.client.email) + client_phone = request.POST.get('client_phone', service_request.client.phone_number) chat_id = request.POST.get('chat_id', service_request.chat_id) - # Обновляем данные заявки - service_request.client_name = client_name - service_request.client_email = client_email - service_request.client_phone = client_phone + # Проверка корректности данных + if not all([client_email, client_phone, chat_id]): + return JsonResponse({'status': 'error', 'message': 'Все поля должны быть заполнены.'}, status=400) + + # Обновляем данные клиента + client = service_request.client + client.email = client_email + client.phone_number = client_phone + client.save() + + # Обновляем заявку service_request.chat_id = chat_id service_request.save() - return redirect('home') + return JsonResponse({'status': 'success', 'message': 'Регистрация успешно завершена.'}) + + return render(request, 'web/complete_registration.html', {'service_request': service_request}) + return render(request, 'web/complete_registration.html', {'service_request': service_request}) def request_status(request, service_id): - # Проверяем статус заявки на услугу - service_request = get_object_or_404(ServiceRequest, pk=service_id) - is_verified = service_request.client_name != '' and service_request.chat_id != '' + try: + # Получаем заявку на услугу по ID + service_request = get_object_or_404(ServiceRequest, pk=service_id) + + # Получаем объект клиента через связанное поле client + client = service_request.client - return JsonResponse({ - 'is_verified': is_verified, - 'client_name': service_request.client_name, - 'client_chat_id' : service_request.chat_id, -}) + # Проверка, что клиент существует и его Telegram chat_id заполнен + is_verified = bool(client and client.chat_id) + + # Возвращаем данные клиента и статус верификации + return JsonResponse({ + 'is_verified': is_verified, + 'client_name': client.first_name if client else "Неизвестно", + 'client_chat_id': client.chat_id if client else None, + }) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) def complete_registration_basic(request): # Базовая регистрация без идентификатора заявки @@ -355,8 +432,9 @@ def send_telegram_notification(request): if not chat_id: return JsonResponse({'error': 'Нет chat_id для отправки сообщения'}, status=400) + # Составление и отправка сообщения message = ( - f"Здравствуйте, {service_request.client_name}!\n" + f"Здравствуйте, {service_request.client.first_name}!\n" f"Ваша заявка на услугу '{service_request.service.name}' успешно зарегистрирована." ) @@ -364,6 +442,8 @@ def send_telegram_notification(request): return JsonResponse({'status': 'Уведомление успешно отправлено в Telegram'}) + except json.JSONDecodeError: + return JsonResponse({'error': 'Неверный формат данных'}, status=400) except Exception as e: return JsonResponse({'error': str(e)}, status=500)