From 69937da0b621df716123b1c9951d5742cb908852 Mon Sep 17 00:00:00 2001 From: anhduy-tech Date: Fri, 30 Jan 2026 12:03:15 +0700 Subject: [PATCH] changes --- api/__pycache__/settings.cpython-313.pyc | Bin 3451 -> 3451 bytes api/__pycache__/urls.cpython-313.pyc | Bin 4470 -> 4575 bytes api/urls.py | 3 +- app/__pycache__/cleardata.cpython-313.pyc | Bin 3752 -> 3885 bytes app/__pycache__/payment.cpython-313.pyc | Bin 6551 -> 19321 bytes app/__pycache__/views.cpython-313.pyc | Bin 74521 -> 86787 bytes app/payment.py | 466 +++++++++++++++++++--- app/views.py | 266 +++++++++++- 8 files changed, 669 insertions(+), 66 deletions(-) diff --git a/api/__pycache__/settings.cpython-313.pyc b/api/__pycache__/settings.cpython-313.pyc index ca5a46d38fde4e3651a4923eedc68e418682b082..369ef9504d6a31744185fd1639ac11aaa2069561 100644 GIT binary patch delta 20 acmew@^;?SjGcPX}0}y!Y*KFi2-~|9fCk1=} delta 20 acmew@^;?SjGcPX}0}xD}QMr-3fENHqh6XAC diff --git a/api/__pycache__/urls.cpython-313.pyc b/api/__pycache__/urls.cpython-313.pyc index d46f478322afe5f585ef092a239a174a0c9a6010..07f6f1f5de1a7133d16292317475606495d216b4 100644 GIT binary patch delta 879 zcmZXS%TE(g6o+Tv4pI98g;t=not9zx=252YP-shHmG?p;xZn{?8qx$3f*=VS;*KRv z7fx3lSJssx8{8QG1a266rX;3{veS2h#dJLQ*^^8R4| zLL_y1VAESX?i;km3)XhaTicuKyXD$P$FnE8H9@rg7rU*3z*sXBufDw<@``KQ#6#tA>K#>k>I>%K*<>{Aj@_ zQEwc3;{+v`4tR{0`^+{PNaH}7pbX0aALra}c2PNlutu>C(-XYvOM9?ss7D3E# mF=s?+PXhNO2uiY9F6OQ~_8EKBpTmCsPUgY9vh8H7xBmy~)D;;3 delta 804 zcmZY7&uMLnQvVAl6EnwNJb9YN*t7da6HU6wB%9Co?R%M*y^7vM96#-Li(ou%{nh>t z%h0hPo}R~s(w&3+%UB|Q@m=~NnRgN^7w1;ZG%`85@rqF_8t2V3vmh|DD2mr6hlqX! z1#$UG=ux5fP3SSCjE)_iBgJXDzAH$!!M3hW8si2*DRvLgV&GR>`O-tR4%RvZZ8Iyl zjeGU-1+DMm`Yu6TW(Rk04^Pz(jrT^E0&{}8xT>G~wA{kw7C~+12ET9kU`zKLO@iYf zL2>o~bPlwA(my*K9ugE~9>96tB0iI8at$Zf2&ytK_`+>p1ouIcOLbn^P`iX3X6h1yj?AW zD=_BC$Pm1{I}y2l&5(cdD^Ej4aYQsR#^r-%iS1C;}smQ5Tvn3 z;5qI~`db<*;!u$wmF2-#xJRd5DmSs*Bxs!#z>D1L;c0%vVU#(^|J8Kx;C?DF!(R{2MvsfUKkI9!Hh)Rd9v_VNuk#lP|Vzj$3# zMg@0-=a2v7;i*g`8jkSGZW#G%_hJ=Bw;(q*v`YOs?9UODXKfLJO&)agB=u#mFGEn4 NZ9#BsJt!G}`ETGy_v`=w diff --git a/api/urls.py b/api/urls.py index a27d1693..7f505280 100644 --- a/api/urls.py +++ b/api/urls.py @@ -53,5 +53,6 @@ urlpatterns = [ re_path('generate-document/$',views.generate_document), re_path('model-fields/(?P.+)/', importdata.model_fields), re_path('read-excel/', importdata.read_excel), - re_path('find-key/$', importdata.find_key) + re_path('find-key/$', importdata.find_key), + re_path('email-preview/$', views.preview_email_template) ] \ No newline at end of file diff --git a/app/__pycache__/cleardata.cpython-313.pyc b/app/__pycache__/cleardata.cpython-313.pyc index 10b9a35c9b97acf8d39f0db87556206767dd1182..2adf5a09ccf51540a9dbfefbec19fef776ccf198 100644 GIT binary patch delta 310 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 Br?mh8 diff --git a/app/__pycache__/views.cpython-313.pyc b/app/__pycache__/views.cpython-313.pyc index 047e7394b6709bc8a8e0452fb7deafb69c03320c..bce3d40ef3ae1d2007b33d12358ffa33e4391dbf 100644 GIT binary patch delta 20569 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 E7kvj2ivR!s delta 10602 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

q1ELu`B1E- z$*g%Q)dp1Kw^|f1eB{Vau`F}vT4g^zIW(%#O2l6-J~@gSsb%I-%;XQ(WlSn^MJN)M z>9l=+9smBz!&1Z&^~~wg7-VfC`?AcoPQ&E5q0={E(Hp@xVM4m!^eV=%O{dp*dG22Nop9Jkh2le1^-)Z0QYSyUyWkaC)DmS~SsMVVsR`Kg;W zJI*Wh0Pm#lqBRkO^iIGAlE0h`r!P;yl3$}2do{QNT}WKl}=Ut zkF}Sjk_67VxCO( zM~%cVSRM3w-G)!Es!_t1}Dp4%*f3Qt_Hgp3#E4ehdcy)Xk#uvf@L+M8X zdXA%iyFibTw5jc2+m2!8u>vg)`(YRWkx+zwX)`Ipf^_h4oFK5AX~dGA za1eO13!+?4K$kQ6HK+qEayK1iMQ?nj#+klvjSyU-V12GEBcLqyxrhLT!_bB7B>#ppzS z9JIMQG5uio;zBW@1R~IrG99>dK?oQ|SQq1q!0^fL8wy34gClZx_d|tZR1sU?>zI>8 z=Y!i5i5TtSh$-v4&lHNn5;)8n)~lbJ3>W2p1aOFEOn!Vsk?0aLoc0F#bBcFYL-s@Z z0qzNi#2YaVEv^9IaFg!r zo}kZT%J~qUw^@GA5@yUJHd{gqqNội dung y nguyên đã thay thế...", + "recipient_email": "customer@example.com", + "replacements": { + "[contract.code]": "HD-001", + "[customer.name]": "Nguyễn Văn A", + ... + } + } + """ + try: + # Validate input + template_id = request.data.get('template_id') + if not template_id: + return Response( + {'error': 'template_id is required'}, + status=status.HTTP_400_BAD_REQUEST + ) + + context_pks = request.data.get('context_pks', {}) + if not isinstance(context_pks, dict): + return Response( + {'error': 'context_pks must be a dictionary'}, + status=status.HTTP_400_BAD_REQUEST + ) + + # Get template + try: + template = Email_Template.objects.get(pk=template_id) + except Email_Template.DoesNotExist: + return Response( + {'error': f'Email_Template with id={template_id} does not exist'}, + status=status.HTTP_404_NOT_FOUND + ) + + # Generate preview + previewer = EmailTemplatePreview(template, context_pks) + preview = previewer.get_preview() + + if preview: + return Response(preview, status=status.HTTP_200_OK) + else: + return Response( + {'error': 'Failed to generate preview'}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR + ) + + except Exception as e: + import traceback + traceback.print_exc() + return Response( + {'error': f'Unexpected error: {str(e)}'}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR + ) \ No newline at end of file