From 521dd9da5c90e6df898f3ee828224359afdeadc4 Mon Sep 17 00:00:00 2001 From: 7nimor <7nimor@gmail.com> Date: Sun, 1 Feb 2026 08:26:08 +0330 Subject: [PATCH] update --- RSI/__pycache__/__init__.cpython-39.pyc | Bin 147 -> 139 bytes RSI/__pycache__/settings.cpython-39.pyc | Bin 3138 -> 3130 bytes RSI/__pycache__/urls.cpython-39.pyc | Bin 1034 -> 1026 bytes RSI/__pycache__/wsgi.cpython-39.pyc | Bin 542 -> 534 bytes __pycache__/helpers.cpython-39.pyc | Bin 1109 -> 1101 bytes app/__pycache__/__init__.cpython-39.pyc | Bin 147 -> 139 bytes app/__pycache__/admin.cpython-39.pyc | Bin 188 -> 180 bytes app/__pycache__/apps.cpython-39.pyc | Bin 407 -> 399 bytes .../cityandprovince.cpython-39.pyc | Bin 24745 -> 24737 bytes .../excel_processing.cpython-39.pyc | Bin 52205 -> 52197 bytes app/__pycache__/filtersets.cpython-39.pyc | Bin 9325 -> 9317 bytes app/__pycache__/helper.cpython-39.pyc | Bin 5311 -> 5981 bytes app/__pycache__/helper_excel.cpython-39.pyc | Bin 9965 -> 9957 bytes app/__pycache__/models.cpython-39.pyc | Bin 21014 -> 21006 bytes app/__pycache__/scripts.cpython-39.pyc | Bin 1080 -> 1072 bytes app/__pycache__/serializers.cpython-39.pyc | Bin 21630 -> 22039 bytes app/__pycache__/urls.cpython-39.pyc | Bin 5670 -> 5662 bytes app/__pycache__/views.cpython-39.pyc | Bin 122458 -> 122470 bytes app/excel_processing.py | 8 +- app/helper.py | 20 +++++ .../__pycache__/0001_initial.cpython-39.pyc | Bin 4568 -> 4560 bytes ...oultry_allowinsert_and_more.cpython-39.pyc | Bin 635 -> 627 bytes ...oultry_allowupdate_and_more.cpython-39.pyc | Bin 773 -> 765 bytes ...poultryhatching_hatchingage.cpython-39.pyc | Bin 727 -> 719 bytes ..._basehatchingcount_and_more.cpython-39.pyc | Bin 1673 -> 1665 bytes ..._basehatchingcount_and_more.cpython-39.pyc | Bin 2028 -> 2020 bytes ...7_transportingchickendetail.cpython-39.pyc | Bin 1490 -> 1482 bytes ...ickendetail_certid_and_more.cpython-39.pyc | Bin 1655 -> 1647 bytes ...ilerflockrequestid_and_more.cpython-39.pyc | Bin 914 -> 906 bytes ...kendetail_province_and_more.cpython-39.pyc | Bin 730 -> 722 bytes ...oultryhatching_pedigreename.cpython-39.pyc | Bin 650 -> 642 bytes ...ansportingchickendetail_age.cpython-39.pyc | Bin 628 -> 620 bytes ...13_poultryhatching_leftover.cpython-39.pyc | Bin 612 -> 604 bytes ...y_locationnamecity_and_more.cpython-39.pyc | Bin 688 -> 680 bytes ...hatching_transportingdetail.cpython-39.pyc | Bin 5285 -> 5277 bytes ...rtingdetail_certid_and_more.cpython-39.pyc | Bin 1116 -> 1108 bytes .../0017_hatching_archivedate.cpython-39.pyc | Bin 617 -> 609 bytes ...ove_hatching_capacityfemale.cpython-39.pyc | Bin 547 -> 539 bytes ...019_hatching_capacityfemale.cpython-39.pyc | Bin 620 -> 612 bytes .../__pycache__/0020_killhouse.cpython-39.pyc | Bin 1424 -> 1416 bytes ...sportingdetail_out_and_more.cpython-39.pyc | Bin 1116 -> 1108 bytes ...2_alter_hatching_killingave.cpython-39.pyc | Bin 639 -> 631 bytes ...cityid_killhouse_provinceid.cpython-39.pyc | Bin 686 -> 678 bytes ...ultry_city_poultry_province.cpython-39.pyc | Bin 684 -> 676 bytes ...5_delete_transportingdetail.cpython-39.pyc | Bin 529 -> 521 bytes .../0026_transportingdetail.cpython-39.pyc | Bin 2316 -> 2308 bytes ...scharge_percentage_and_more.cpython-39.pyc | Bin 1073 -> 1065 bytes .../0028_hatching_goodsum.cpython-39.pyc | Bin 620 -> 612 bytes .../__pycache__/0029_apkinfo.cpython-39.pyc | Bin 1370 -> 1362 bytes ...0030_transportcarcassdetail.cpython-39.pyc | Bin 1877 -> 1869 bytes .../0031_auto_20250921_1447.cpython-39.pyc | Bin 1377 -> 1369 bytes ...lete_transportcarcassdetail.cpython-39.pyc | Bin 526 -> 518 bytes ...0033_transportcarcassdetail.cpython-39.pyc | Bin 2531 -> 2523 bytes .../__pycache__/0034_guilds.cpython-39.pyc | Bin 1407 -> 1399 bytes .../0035_guilds_is_steward.cpython-39.pyc | Bin 578 -> 570 bytes .../__pycache__/0036_driver.cpython-39.pyc | Bin 1666 -> 1658 bytes .../0037_driver_product.cpython-39.pyc | Bin 594 -> 586 bytes .../0038_auto_20250927_0848.cpython-39.pyc | Bin 664 -> 656 bytes ...sportcarcassdetail_tracking.cpython-39.pyc | Bin 658 -> 650 bytes ...tcarcassdetail_product_date.cpython-39.pyc | Bin 648 -> 640 bytes ...cassdetail_has_product_date.cpython-39.pyc | Bin 651 -> 643 bytes ...driver_modified_by_and_more.cpython-39.pyc | Bin 1791 -> 1783 bytes .../0043_allproductstransport.cpython-39.pyc | Bin 2454 -> 2446 bytes .../0044_evacuationdetail.cpython-39.pyc | Bin 2235 -> 2227 bytes ...ilerflockrequestid_and_more.cpython-39.pyc | Bin 3585 -> 3577 bytes .../0046_rasadyarappinfo.cpython-39.pyc | Bin 1422 -> 1414 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 158 -> 150 bytes app/serializers.py | 82 +++++++++++++----- app/views.py | 46 +++++----- .../__pycache__/__init__.cpython-39.pyc | Bin 158 -> 150 bytes .../__pycache__/admin.cpython-39.pyc | Bin 199 -> 191 bytes .../__pycache__/apps.cpython-39.pyc | Bin 451 -> 443 bytes .../__pycache__/models.cpython-39.pyc | Bin 2737 -> 2729 bytes .../__pycache__/serializers.cpython-39.pyc | Bin 1308 -> 1300 bytes .../__pycache__/urls.cpython-39.pyc | Bin 568 -> 560 bytes .../__pycache__/views.cpython-39.pyc | Bin 1176 -> 1168 bytes .../__pycache__/0001_initial.cpython-39.pyc | Bin 2115 -> 2107 bytes ...g_province_lat_province_lng.cpython-39.pyc | Bin 731 -> 723 bytes .../0003_auto_20250809_1248.cpython-39.pyc | Bin 853 -> 845 bytes .../0004_province_tel_prefix.cpython-39.pyc | Bin 629 -> 621 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 169 -> 161 bytes 81 files changed, 103 insertions(+), 53 deletions(-) diff --git a/RSI/__pycache__/__init__.cpython-39.pyc b/RSI/__pycache__/__init__.cpython-39.pyc index 34dd4b6228b57b97b11586a581c202e51fa582cc..6739eddf36ed5c394a8b0f7d25dd7d438cc4d48b 100644 GIT binary patch delta 87 zcmbQt*v-h5$ji&c00b4gCvw@k7`Rx)`1%Dn$LHn8XXcfp7UiXu!~`W4C#F;;7R3hz id&YopJWwvPBtBlRpz;=nO>TZlX-=vgBhZk~Ad>)s5E|Y9 delta 68 zcmeBXoXp6T$ji&c00ah-6S-{lEc7$-b5r&6GIJC4efku}gw4k(ZZ?0SGE~=VnF=Y~;Ja%6Mz?bJiO`@&MaIHUXeimB-|d>>8WTvo|p^ z-r5|*`G=8B3@BVAIXQ$|!@vy01QEXsT&!Yz{Q{ih^YY^}^GZ^S@={A;f)a}pQz{dS P;)8-cV?cQF7VbU(GF2yk delta 130 zcmdlbaY%wMk(ZZ?0SF8vb2AU{Z{)kd${02IIqMA|d4TO98y`@r%470Jc8$&F*_#*{ zqc#U|{$XSj1_~F6O%CDKurLNOLBuZ${fzwFRQ&4>9|=^^Xlm9R(0RVvu6@35z delta 73 zcmbQnGLMBfk(ZZ?0SF8vb2IBV@*ZT=Gttk;&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR Y(GN;2PE4sxEQ${b_S6UA$zK?i0Py4%p#T5? diff --git a/__pycache__/helpers.cpython-39.pyc b/__pycache__/helpers.cpython-39.pyc index 079d9bbd6f14357d3243fff2e953788f3252987e..c3abf023b0ddf70c9be6f7d55219f43496adb7c5 100644 GIT binary patch delta 62 zcmcc0ah8KOk(ZZ?0SGE~=Vl(+$Q#6{r0rrA>0DUlkp4_09AJs!vFvP delta 70 zcmX@hag~ENk(ZZ?0SF8vb2C?M^_%8!-R? delta 68 zcmeBXoXp6T$ji&c00ah-6S-{lEc7$-b5r&6GIJC4efSyHVrt0Tq<|gX<`UN=a=H=^V=9Q!t<)xPB Z2PGCKrc@>t#Rmm@>L(Ty=uey}4FJCu7773W diff --git a/app/__pycache__/apps.cpython-39.pyc b/app/__pycache__/apps.cpython-39.pyc index f372bdf225e8438c7d62bb9d249468b734f1898c..80a3b98468016da457fc1e80dd9891a5b14f5108 100644 GIT binary patch delta 64 zcmbQv+|SIL$ji&c00b4gb2BF_b8sMwvG$+vAI- delta 77 zcmZ2@ka6WfM!rN|UM>b8Fp$j6EZ@A5Z%de-y?#c1ZmND>W^SUsuU~+(ZeG4_W?o5Z fQC@0^eo$g@VoGIVQG8Iar+#8Vf&S(fVLLeizNH$E diff --git a/app/__pycache__/excel_processing.cpython-39.pyc b/app/__pycache__/excel_processing.cpython-39.pyc index 0d83709329f773ef222960d703c496ee158f9ee9..bda6062eb8b99fb43cd4ea0b956bca151519adc7 100644 GIT binary patch delta 69 zcmaDmo%!i>X1+vTUM>b8V7XqGsds53ACsV(g^N{;uU~+3d|rNhW?o5ZQC@0EOi*HR XVoGIVQG8IaXG~&2LCj`5!S%ZU|AZIZ delta 77 zcmaDlo%!u_X1+vTUM>b8Xb-N-G&#PJk4aF^K|douH&s6`GdEG+*Dt_XH!oi|Gp{7I fC@-}{KPa&{F{LuGC_X6IQ$MkwK!3BD;QCzvwEr3O diff --git a/app/__pycache__/filtersets.cpython-39.pyc b/app/__pycache__/filtersets.cpython-39.pyc index a1dcfe7b96bdf968931097389c21ffc161ce1947..f5da017edb3fab7dfe93a77dba85271d18201ea6 100644 GIT binary patch delta 67 zcmaFs@zjGak(ZZ?0SGE~=VngS-pE(NtY+k5731p{;2fWqAD@|5l3J9PS`rhKSe%$r VnOGDb6zmz3SWpnNc?0ua1pwv}7jXap delta 75 zcmaFr@z#Sck(ZZ?0SF8vb2DAFHu9A)>sje%ihZyIP2!+>t^Paq!#6+ dmgom17AK}uCKkm91$*iz78K}jUctOq0RT|b7+3%R diff --git a/app/__pycache__/helper.cpython-39.pyc b/app/__pycache__/helper.cpython-39.pyc index 77f615955ea7bc604bfd9ca717f6e8a68d8ed135..3bc7b67310496829cf8281c7f31759676fa9e9b4 100644 GIT binary patch delta 949 zcmZuv&1(}u6yHhGB$lLKv=^~;1Z_x_s#i~iD#e2zGzT#T!`fYNp-saik+!r=Ytlx- z9xO|}st3u(!8EQQJyj47>e0*0E+Y7s_?z997VW_N-kbOJd+#v^$zPLwYCPVn;5>HL zjh|r3o2*|e+icVuD-gie_0h0=VH zE#tv1Nm!AP2c*M!oh=wewqd3EOQddn>wis_EMwpi^sfU`(8GhXYojh+q}U) zxF&_AEw-uH#JkJwvTI)D`_P*3@g|f86xVcGGDB>iOodJ6G$7k3UGqXw?<34jQS(UQ zY4VP1iYh%l{E*jU6E#}?pWJWN=}0oasRorLQ5rmuw$Fq{F^F&F`=`?-oK}L07c}9T zkSDk?2F4Y&GEInzA0p}rdfd(N9Ae8gu?DAwg?5gHl-VeOlGrgtW43HWM##2#hw?rC z9=&2s6btG|(c#^H2BD(7#Xrfh#B<)35e)>lWiYDCJddvwz&CJOo)8sJxTgQACj%@e zy%DD8=hZnqNxa|3uEFTTb?F|>EwTl5-dNGI_?87j&1F@lJ~2k;vPFHVxQm!V44_0p zB-9fnF%k9L delta 270 zcmcbsw_lSlk(ZZ?0SMgu>oU84Fs}gA8Ew-Z6;?kUwqADP#NEJj>gNOnk5ye)JT9lhv zQq(v(n7@>KsK9T5aXoDAB1Cgrvfz;GXV((rlKj6BSkhd v&Y8?B>dreGCeFdAsku2(w3bnz2`E(54I(Cih$)jli>Wc%O_maOU}OUT00>JY diff --git a/app/__pycache__/helper_excel.cpython-39.pyc b/app/__pycache__/helper_excel.cpython-39.pyc index ccd994298389ba705a39d8eb8d2862b835b981ce..7b69508e7d8ae06cda83e730edf2bf7c1a72f3bf 100644 GIT binary patch delta 67 zcmaFs`_z{&k(ZZ?0SI0Pm1hcCZR9)7p=RP@731p{;2fWqAD@|5l3J9PS`rhKSe%$r VnOGDb6zmz3SWpnNnVIvIECA%*7W)7I delta 75 zcmaFr`_`8)k(ZZ?0SMgu>oTWVY~(x6p=YC?k)NBYpO=}NsPF3+;H;aMubY`yl3J9P dTB0A6Se%$rnOGDb6zr*=SWuw9`8UTaSpbvv8TtSK diff --git a/app/__pycache__/models.cpython-39.pyc b/app/__pycache__/models.cpython-39.pyc index 4664990f3411252aebb8afbaa977df3083ff48c0..0a3f5983407a113e288637a15c1620730b114066 100644 GIT binary patch delta 69 zcmbQXgt2c4BVQsfFBbz4RP4^pw41S!ZwjlLo{LqCuU~+3d|rNhW?o5ZQC@0EOi*HR XVoGIVQG8IaXG~&2LCoe0tZqI4_3{^t delta 77 zcmeBM!Z>XSBVQsfFBbz47)a)3=1twmH-%NtOg|$(H&s6`GdEG+*Dt_XH!oi|Gp{7I fC@-}{KPa&{F{LuGC_X6IQ$MkwK!5WIRyQ92esLJ> diff --git a/app/__pycache__/scripts.cpython-39.pyc b/app/__pycache__/scripts.cpython-39.pyc index 6c7920e6d5296937036051b1f8f19319ccc93d70..2de3648aead978d5dfe6ea89b7104db3ff64c001 100644 GIT binary patch delta 66 zcmdnNv4Mj(k(ZZ?0SGE~=Vp3u=~0-P!O~EF;gfb0GJLH?*IS* delta 74 zcmdnMv4ev*k(ZZ?0SF8vb2E)M@~&XgGuO|^&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR c(GN;2PE4sxEQ${b_S8=-DA3=0n<BFa`*+u`(5h1||$P7GlVtzV$Wi)zOZ#jxl^= z@q>KBkX(br4Oj()C2X)15)s8g{D3-flRtJvWgrR|5;72+8o+bjx~{{i#IH7azn*{h zo^$WH_ndogAA4s%GfT0Hn6W*R<7e6Mli~R8$IU(zAWUu2_DhL(f&o5OwD93i5|G{20GbP{6wQL`SK3oF+TL*E%xi zd_!c2M#pR8WXUhBFjdwyIEjJ>6G+yd6MVrxa}>v>GH31{>p9eHq$S0q@*FKIs4rYE zG-SScLWy*E)rZKa1+c!sH5A__hx8cXm99Hs1y2-Z8O5ql8_E3dXy?jR-7)M z?1mbYz-0ux1xoXYSwKLMg!SO7|Az&V-B^+IlOpB}uX;XUy@ImCBMUdt8NL$Dr#$a1 zc2&z~$_uG1hn&~Z4uuZ)ZR&eNyIyt^glXOphyBQgGx!XLl~)!`o;b1-qfMZb?)4t-)b`bM8nH z&5Au4=m^4jf};fA5@@k%dv%Q1?+LWTb`jN2FtV^8h-E)&g`sl6LF)kW>3EN0Pt$-F zHeE3H!hYjTv?$@-i|tye*iqaYxvIBNUQQ#U1>;s^+!Mjj%Qu+iHX2lt0e)C>;I^i| zz4$)+h4RELOEUQ%>B&t$p<2;33aZYdYh^N1bOE7JuQHDS8)Sk0n|0fTMuTcl_3Ic^ z`Sl)y$4GKnznQg)vOzWmgx0u#uFG2s_4i!FkxR}FJ@UX!95qEw+ZLDjc1 z)j(bXjOo-S=1GK0avV;WILc9vKPloU@h^@k>bWO^t^!ZKZ3d`Z|`?Q=48BHv8OxcEf?kLITcT3IOTO#r;OOyX^nTOwS&qn2M zyv!$;j?aFWtnqoJ6Ef&&F?OQhF0UBLh1(i zXwaSwCL7!dZY_J9E#FO+^lSin5CAoLp#BcM1k|ZPYtCnhqOJv0!GQ`TP}u>hEI?%h RHW5(0fIH~<5pFAA`6mJNf&>5n delta 1933 zcmcgte@xV680WoT95CRH>k<&5A+B!xIFOQy(*;3Ik3c=NHAbFaxeLCR+|k38xRKO9 zwzb7S&mV+hLT0O^o9>2@M&;I0Q;7mo&a7zKBAbfl)~Z#{^S$%9*qr}$+xK(NkN0`s z=XswWZ{M)^`yG)crKTn)(62PBU0&OIC~Z<(Vz;*W+dWpF+%8$`8`jkn`~1bSFW>>6 zCt!6-osxUI1TJUe8mrXNVGSkfUe8%(5n+u_YWG-FO(`AVe?j)Oc%F~~ag49k68bEE zK!|>n3QUGwbSCU(7+~0gQno47SJ0v>93kE!;1G)?2Ep(i!vTh2hW8nQp=E{n!n}{^ zw;1*_yv=YJn~NSc1eyGR;X{UxaDS0ScZA6?I&TqPDVj155&J8BojL-&NLHn3U}A-2R~F}EQfaaA6tPaWQ4ygR za4KfuFeGDdDd+~-V6S5EKv}WzG_g;`8Jvz8>?@lxo+0g~IPIC3gA>a?7hmA9v`o`D zt#SXy&GFbC|CC?Weo6YR*i`1g@`rv-|B5)i*{Fl~X?YcTSDes(P4X_Beb9oND~^jd zac*%=sMa5R_Vv1td9zPYw&&@lm^_QU_N?rMIb+Rnh7)+q?zo*j2hVSvfBTIU|A@W@yEJm;~ zy_$g!46DJv4elHRuUmK^%PulRDw8SnWSg+5YLEF6aU=6F>bW{EDQVqYQI5^kz2dTx zqQplt#Qp5R^L!cSN2Yg9zpONlMGxnA$N57qVpUCbb|lsX8fJsIyJl6!PefXh9vuY>Iv!tAzcS>oQ*_cxej|HQ3ll6E|^h8pt?94!Bcc>s%co?b)EUCc71m_t> z8KxPOD3ohD%IpOOC3Ry=DVI1O*bgidKPsKRY4x!AD)E`rkMZ?#HP#}{Yi5ksXhj3B zh<5EYMfZo z@tPRa3?;m%4rsl?tLheBT}-CwRzq#KYA~@|?bXwl!+hJ;Ay)|2_Ou-?RRJ@fy>g|9lZZ5&4=41?R#8IXNaK=%7w zcZ~)AaN2dZ$hb!d1fOesMTrY;@%Y4->NMt7P9Hyq^bRO5f!+W&L)Hzs;>jUCm0tqj x(GEPWfu}NzGw^H$Wu)@_1fER5tqa^Lz=a1~TfhYbI~llI;3l2C2#;)h`d?M64S)au diff --git a/app/__pycache__/urls.cpython-39.pyc b/app/__pycache__/urls.cpython-39.pyc index a07d22b903b773d34eb0bc0c533c03d07d33274e..8daa7bd320da0ce8923700862eb24508dc88a5ae 100644 GIT binary patch delta 84 zcmZ3cGf#&vk(ZZ?0SH)w$}=0}H}bvVVvO4So6DQizzir_1R{RvxLC#b`UN=0=jF#| j=9Q!t<)xOy1SJ+Hrc@>t#Rmm@#v~RL#B8n;S-}VZ-NPCw delta 92 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 aS8t1nv_>p@M|>N%IDp+0)B=-geGC_s++^ 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 b$G^}O)eK|gyW-opk_>;$9Aof%qTBxgvwTdp diff --git a/app/excel_processing.py b/app/excel_processing.py index bdee4ef..612ed1b 100644 --- a/app/excel_processing.py +++ b/app/excel_processing.py @@ -21,7 +21,8 @@ from app.serializers import TransportingDetailSerializer, HatchingDetailSerializ StewardForTransportCarcassSerializer, KillHouseForTransportCarcassSerializer, TransportCarcassDetailSerializer, \ GuildsForTransportCarcassSerializer, AllProductsTransportSerializer, AllProductsTransportCustomSerializer from helpers import build_query -from app.helper import get_hatching_permit_code +from app.helper import get_hatching_permit_code, normalize_persian_arabic_text + def transporting_detail_excel(request): filterset_class = TransportingDetailFilterSet @@ -2589,10 +2590,7 @@ def all_products_transport_excel(request): filters['product'] = product_type if destination_province and destination_province != 'undefined': - if destination_province == 'مرکزی': - filters['destination_province'] = 'مركزي' - else: - filters['destination_province'] = destination_province + filters['destination_province'] = normalize_persian_arabic_text(destination_province) if date1 and date2 and date1 != 'undefined' and date2 != 'undefined': try: diff --git a/app/helper.py b/app/helper.py index 66c3f5d..2e65b65 100644 --- a/app/helper.py +++ b/app/helper.py @@ -146,6 +146,26 @@ def api_get_hatching_permit_code(request): return Response({'detail': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) +def normalize_persian_arabic_text(text): + """ + نرمال‌سازی متن فارسی/عربی برای یکسان‌سازی کاراکترهای مشابه + تبدیل کاراکترهای فارسی به عربی برای سازگاری با دیتابیس + این تابع کاراکترهای 'ک' و 'ی' فارسی را به 'ك' و 'ي' عربی تبدیل می‌کند + تا با فرم استاندارد ذخیره شده در دیتابیس مطابقت داشته باشد + """ + if not text: + return text + + # تبدیل کاراکترهای فارسی به عربی + # 'ک' (U+06A9 - Persian Kaf) -> 'ك' (U+0643 - Arabic Kaf) + # 'ی' (U+06CC - Persian Yeh) -> 'ي' (U+064A - Arabic Yeh) + text = str(text) + text = text.replace('ک', 'ك') # Persian Kaf to Arabic Kaf + text = text.replace('ی', 'ي') # Persian Yeh to Arabic Yeh + + return text + + def create_guild(**info): Guilds( diff --git a/app/migrations/__pycache__/0001_initial.cpython-39.pyc b/app/migrations/__pycache__/0001_initial.cpython-39.pyc index 9c4f97216d6c761ae040617b5f3a074c8e7da3e7..59257f64efc8579c4e60d4976afa749e9a1b4926 100644 GIT binary patch delta 78 zcmcbid_kEnk(ZZ?0SGE~=VsQZZRGpQZ)opg731p{;2fWqAD@|5l3J9PS`rhKSe%$r gnOGDb6zmz3SWpm?o0(peSdy8aR~)n1MPLde0R2B3f&c&j delta 86 zcmcbhd_$Qpk(ZZ?0SF8vb2C4wZshyRZ|Sa|k)NBYpO=}NsPF3+;H;aMubY`yl3J9P oTB0A6Se%$rnOGDb6zr*=SWuv!o0(peSdy8aSFFF;Mqmmf0H%2y{r~^~ diff --git a/app/migrations/__pycache__/0002_remove_poultry_allowinsert_and_more.cpython-39.pyc b/app/migrations/__pycache__/0002_remove_poultry_allowinsert_and_more.cpython-39.pyc index b648d6513e8ffe70c45ed22859bc83f1d3c7685f..8ceafba668f81a3f8663da883c8ee7333c48c097 100644 GIT binary patch delta 76 zcmey(@|lGvIX*8xJ~OW*wJ0yOBqk`aI5DL% eu_!($*fS=vpdcnUGrcIWBr`v+IA-!S#-#wumm8k| delta 84 zcmey&@|%S>k(ZZ?0SF8vb2B?O@=jp1OxDlH&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR m(GN;2PE4sxEQ${b_S8=-DA3Q%OfO0-$;{6y)}MTiaVY>w;~a?q diff --git a/app/migrations/__pycache__/0003_poultry_allowinsert_poultry_allowupdate_and_more.cpython-39.pyc b/app/migrations/__pycache__/0003_poultry_allowinsert_poultry_allowupdate_and_more.cpython-39.pyc index 44072efa3b248756847f40285d8407ee80197768..465c0966815b5bff3ec8517649318b11a41b0b38 100644 GIT binary patch delta 75 zcmZo=`^(Ck$ji&c00b4gb2B>^@-i7_xLC#b`UN=0=jF#|=9Q!t<)xOy1SJ+Hrc@>t d#Rmm@#v~RL#N=kC7bTWt=I0g1Om<`14*-6$8WR8j delta 83 zcmey%+RDb8$ji&c00ah-xtSRYd6_H=^fU5vQ}y#Qa})J_{Q{hI^YV2w^GZ^S@={Cm lgA$7qQz{dS;)8-c^%DyU^m8-QixNvR^Ye=JC)+XY2LSdo8uqJoV)A|_2>^dW BAwvKF delta 140 zcmX@ldYzRwk(ZZ?0SF8vb2Hs0^4?&)wecAihZyIP2!+>t^Paq!#6+ omgom17AK}uCKkm91$*iz78K~`W~LV@~ diff --git a/app/migrations/__pycache__/0006_poultryhatching_basehatchingcount_and_more.cpython-39.pyc b/app/migrations/__pycache__/0006_poultryhatching_basehatchingcount_and_more.cpython-39.pyc index 3779d12e3082a7d4e0afc0aa77366deec930bc64..75b8bac337dc4bfd7fcf7c57ccf78d23f00b13a8 100644 GIT binary patch delta 136 zcmaFE|Ae0}k(ZZ?0SGE~=VqD-Z{&N<#CU7-Hzqk|Yh9pd5s3Jelff0pO+t> znOBlpl$Tl(6O>q-m{OTo6dx4q8IxF05R;pkUX)mpnV(l2vpJkCmr(<50N9iwJ)lvy WIBatBQ%ZAE?U;eQVkRIVzzhHpJ0>Ck delta 124 zcmaFD|AwD0k(ZZ?0SF8vb2FC<6B1l$*Y+{8KovOGDiwX0p*KiL4+KL zkl&oe?8#_t4Pt|cUx6-GF}{8Q&hdHq@tJugsYQ9IB{4yX#fd4EiAC{2!JaXR1qCs= zndwD|C7Jno#W9n=vCOwM1L-#a5v(wiz{Wuc8=%-N4x8Nkl+v73J7yrSm;*@gFbXho IFmf;h0GGZlwEzGB delta 170 zcmX@beTkblk(ZZ?0SF8vb2H;N@~&rOyft|*<6B07$*Y+{8KoyPGDiwX1Lce4K!iMq zP}rQs?8)eC17d@SUy=G5`MIh3d6~J1`o4Yv&boQ|x|w+;sYQ9ICHg^$#fd4EiAC{2 u!Jhhw1qJ%KndwD|C7Jno#rl)qvCNk@2bp6CB3NN2f{ld`wv*Se$^iiRc`Vuh diff --git a/app/migrations/__pycache__/0008_transportingchickendetail_certid_and_more.cpython-39.pyc b/app/migrations/__pycache__/0008_transportingchickendetail_certid_and_more.cpython-39.pyc index 566ab29d10b2d8b6d50daa9c796d1731e8962cc5..89112dce4930e8a434bb62c3cf1636b92c494179 100644 GIT binary patch delta 129 zcmey)^PYz{k(ZZ?0SGE~=Vs2^$UBRP@z&%OOcNQoH(N2!V6@i(N)>^KUx_YOF}{8Q z&hdHq@tJugsYQ9IB{4yX#fd4EiAC{2!JaXR1qCs=ndwD|C7Jno#W4m31{RaoGD&SV TW|d(SfExrhtw?urJevdnD!(QL delta 158 zcmaFQ^PPt`k(ZZ?0SF8vb2BwI^3Gyni;^=iFfgAi$SO7YI8zZL*Jdl`8H~=_Ks7}m z;#a1AMt*LpeqLs7qQ0+RfU|C1zHVk-NorAEYKeYOVsT sVo7FxUa|gWUREnc4Y)yI(~5L}M&9DE$<0qG%}KRm2J(uTfP?@u07Q~02><{9 diff --git a/app/migrations/__pycache__/0009_transportingchickendetail_broilerflockrequestid_and_more.cpython-39.pyc b/app/migrations/__pycache__/0009_transportingchickendetail_broilerflockrequestid_and_more.cpython-39.pyc index 9593d5c3a38c3073868449c8d006dc1b1637d608..d1e448f0dcc15a2f95e5d3e58cba047ad539b672 100644 GIT binary patch delta 139 zcmbQl-o?(F$ji&c00b4gb2CqDlff0 zpO+t>nOBlpl$Tl(6O>q-m{OTo6dx4q8IxF05R;pkUX)mpnV(l2Gx;FXN)5PvupvcK ZK$C89*yQG?l;)(`F#~zUOh7__82}=QCXxUE delta 156 zcmeBTpTy3a$ji&c00ah-xtWVL@&+(6-kKc8Si#6K`8wlr4=JEb5s3Izp`VeTo2s9e znVYEZ>lfgxo0qSfnOBlpl$TnfACy>}m{OTo6dx4qsh?O-pr4zWUX)mpnV(mzZ(v|x q89zCmQF8KirfvvIX*8xJ~OW*wJ0yOBqk`aI5DL% lu_!($*fS=vpdcnUGrcIWBr`v+IL5%h&|uB+%N?EsGg9diHx delta 84 zcmcb_dW)4ek(ZZ?0SF8vb2Do<^1frV%+}Ay&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR m(GN;2PE4sxEQ${b_S8=-DA3Q%OfO0-$;{6y)}O4yvFJr0(TtC>5B2l18 Xw>WHa^HWN5Qtg<5ykaIGA;1g(0G=j7 delta 145 zcmZo-?PBFk$$a{$K*2D`+Ot&N_zh;!2%*!~&{d z`UN=0=jF#|=9Q!t<)xOy1SJ+Hrc@>t#Rmm@#v~RL#N=kC7bTWt=I0g1On%0gCIHtD MHl#>watxCM0Eg-&_5c6? delta 144 zcmaFE@`Z&rk(ZZ?0SF8vb2Fz+1R{RL>SyHVrt0Tq<|gX< z`UN=a=H=^V=9Q!t<)xPB2PGCKrc@>t#Rmm@>L(Ty=;vmp7bTWt=I0gbPrk>PrU5qx dY*>*9(8OCDHo5sJr8%i~%s^f-6Oa&K1^{%6D5d}a diff --git a/app/migrations/__pycache__/0013_poultryhatching_leftover.cpython-39.pyc b/app/migrations/__pycache__/0013_poultryhatching_leftover.cpython-39.pyc index c5260045719291cbca2f7513cbdab12f591e14fe..f944a1375d1c887c1ee599789601e330f6b4efe1 100644 GIT binary patch delta 111 zcmaFDa)*UCk(ZZ?0SGE~=VmUM$oq`(*2FJMtVMt#MIho=fQwa(uU~+3d|rNhW?o5Z zQC@0EOi*HRVoGIVQG8IaXG~&2K}>FDdQoCYW`16A%;ejQi2`u_U_**TC;Ko-0093h BBCP-b delta 139 zcmcb^@`Qyqk(ZZ?0SF8vb2BGRlfgx zo0qSfnOBlpl$TnfACy>}m{OTo6dx4qsh?O-pr4zWUX)mpnV(mzKlw6aq6XX?uwg|a ZKof6q*yQG?l;)(`F#~zUOh7__831c>Ca3@a diff --git a/app/migrations/__pycache__/0014_poultry_locationnamecity_and_more.cpython-39.pyc b/app/migrations/__pycache__/0014_poultry_locationnamecity_and_more.cpython-39.pyc index 2542a5d94878b226935d2655ed7e5f935b00e2c7..b42d28233de43ae8069a090c19078d7f91c316b0 100644 GIT binary patch delta 131 zcmdnMx`LHAk(ZZ?0SGE~=Vm5PqlY;yBc RN^?@}n1Q@vCLkfe3;>ZhB`E*^ delta 119 zcmZ3%x`CB9k(ZZ?0SF8vb2EJ=^4?*Ln)vFuvlvjM2t@o!)X&JzP1VoK%uUqy^$T#; z&CA!#%qvMP%1bTL4@xXfOsPyPiVq6*)K4rZ(9g|GFG?)Q%+D*-_ I diff --git a/app/migrations/__pycache__/0015_hatching_transportingdetail.cpython-39.pyc b/app/migrations/__pycache__/0015_hatching_transportingdetail.cpython-39.pyc index 7d2aa5a5341156f43c2a0baffaa1083a054853ad..27b3a56441ecee3717ac077c17b6965dddca1df2 100644 GIT binary patch delta 78 zcmZ3gIaiY}k(ZZ?0SGE~=VqGfZRDFIWEkvX731p{;2fWqAD@|5l3J9PS`rhKSe%$r gnOGDb6zmz3SWpm?o0(peSdy8aR~)nXrqCHi0K)AXWB>pF delta 86 zcmbQMxm1%ck(ZZ?0SF8vb2De@ZseOJWEriWk)NBYpO=}NsPF3+;H;aMubY`yl3J9P oTB0A6Se%$rnOGDb6zr*=SWuv!o0(peSdy8aSFFGJqR<&e0AMN{&j0`b diff --git a/app/migrations/__pycache__/0016_remove_transportingdetail_certid_and_more.cpython-39.pyc b/app/migrations/__pycache__/0016_remove_transportingdetail_certid_and_more.cpython-39.pyc index 917e50b41bf0a7e0b756836993b969897fbe14a6..8274759317bcf4be3aac5e65ddb27083742ff0fe 100644 GIT binary patch delta 76 zcmcb^afO37k(ZZ?0SGE~=Vo5t$Sc8YnCM~^=~0-P!N-wnO>Awl9``Z95XqN`5yqSq#F(Z delta 84 zcmcb@afgF9k(ZZ?0SF8vb2BGzvIX*8xJ~OW*wJ0yOBqk`aI5DL% eu_!($*fS=vpdcnUGrcIWBr`v+IA-z_##R8r;u~-P delta 84 zcmaFJ@{)x&k(ZZ?0SF8vb2DdeAwl9``ZtUvhlff0pO+t>nOBlp zl$Tl(6O>q-m{OTo6dx4q8IxF05R;pkUX)mpnV(l2GkG>+f(Bea*pMOtph>qlY;yBc RN^?@}n1Q@vCLqDX3;+!+Bpv_& delta 139 zcmbQuvY3T8k(ZZ?0SF8vb29@c@~&aLHF4KGX91u{5s3H|r=O9Zo2s9enVYEZ>lfgx zo0qSfnOBlpl$TnfACy>}m{OTo6dx4qsh?O-pr4zWUX)mpnV(mzKY21^f(G0iuwg}l ZKof6q*yQG?l;)(`F#~zUOhAH%836o0C7J*L diff --git a/app/migrations/__pycache__/0019_hatching_capacityfemale.cpython-39.pyc b/app/migrations/__pycache__/0019_hatching_capacityfemale.cpython-39.pyc index 9a667c460348ee7e3168e0c9e541cdb45e30229e..e78fe77dec539155e4364f9a3be28cb9e3e31b6a 100644 GIT binary patch delta 137 zcmaFE@`Qyqk(ZZ?0SGE~=Vor0$a{qG*2GKa?L~niMIhprzl&9juU~+3d|rNhW?o5Z zQC@0EOi*HRVoGIVQG8IaXG~&2K}>FDdQoCYW`16AjDdln<-~gulbBpI;HH3$DiQ;l XcZ2A!{mFM269nMqfDJ1Wo$SLT0RR!-D4hTR diff --git a/app/migrations/__pycache__/0020_killhouse.cpython-39.pyc b/app/migrations/__pycache__/0020_killhouse.cpython-39.pyc index 682493bade40d7c9af40003abb5e58e0c47f22a7..cc75bbc1fb9f052d623501ce06f0ea22c81307c8 100644 GIT binary patch delta 76 zcmbQh-NDV9$ji&c00b4gb2ATZcbab(b@%0OEj?c@F&&(@HEy_zRi3v(9PE4sx eEQ${b_KZm^D2U0;OfO0-$;{6yj+uOba1}dg^E7=celCW#%U8`}zeq>*nR_X6BWo7UiXu m=m#YhC#F;;7R3hzd+H|^6zJz>rWYlaWaj4;>rdXnasdDYxf{X& diff --git a/app/migrations/__pycache__/0021_hatching_killingave_transportingdetail_out_and_more.cpython-39.pyc b/app/migrations/__pycache__/0021_hatching_killingave_transportingdetail_out_and_more.cpython-39.pyc index ff7dcb65317d98095e9574ef348f54e9e7ad5f87..6fe6e9c2aa9c0bbf7d4048b231898b10cf76ce5d 100644 GIT binary patch delta 76 zcmcb^afO37k(ZZ?0SGE~=VpH0$SccinC)T}=~0-P!N-wnO>Awl9``Z95XqY`6mFk!W%mP delta 84 zcmcb@afgF9k(ZZ?0SF8vb2Be)vIX*8xJ~OW*wJ0yOBqk`aI5DL% eu_!($*fS=vpdcnUGrcIWBr`v+IA-!!#x4NY4I9z` delta 84 zcmey)@}Gq_k(ZZ?0SF8vb2FE2Awl9``ZtUviJV;2BgvK+?% diff --git a/app/migrations/__pycache__/0023_killhouse_cityid_killhouse_provinceid.cpython-39.pyc b/app/migrations/__pycache__/0023_killhouse_cityid_killhouse_provinceid.cpython-39.pyc index 9b67d95033a03e8abacf5c37bf682b33c0f9d919..2f93d9e1a2715e69477eadf7f405345a2f4c91c7 100644 GIT binary patch delta 76 zcmZ3-x{Q@Kk(ZZ?0SGE~=Vs=~0-P!N-wnO>Awl9``Z95b1ZX#oJ7IT}0w delta 84 zcmZ3+x{j4Mk(ZZ?0SF8vb2CFX@}6L{Ox4fG&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR m(GN;2PE4sxEQ${b_S8=-DA3Q%OfO0-$;{6y)}PGAv;Y7YUmGj{ diff --git a/app/migrations/__pycache__/0024_poultry_city_poultry_province.cpython-39.pyc b/app/migrations/__pycache__/0024_poultry_city_poultry_province.cpython-39.pyc index 9c722ebb35404089786998bda29d8aebc5fa78e6..e0a61cd3e176ad1fbd48e28ed29b860936c07fae 100644 GIT binary patch delta 76 zcmZ3(x`dTCk(ZZ?0SGE~=Vlgc=~0-P!N-wnO>Awl9``Z95Y#jX$AnBs~R`} delta 84 zcmZ3&x`vfEk(ZZ?0SF8vb2B41@}6U~jMdM`&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR m(GN;2PE4sxEQ${b_S8=-DA3Q%OfO0-$;{6y)}PG7Gy?z^!5b(5 diff --git a/app/migrations/__pycache__/0025_delete_transportingdetail.cpython-39.pyc b/app/migrations/__pycache__/0025_delete_transportingdetail.cpython-39.pyc index 08f48a25a83b971e1410147b2d6f669970a0b998..1f5979cb0351e24625702333a9ba1998cfd92fdd 100644 GIT binary patch delta 76 zcmbQp(#gV`$ji&c00b4gb2Gg+@_I2E2D(_q`1%Dn$LHn8XXcfp7UiXu!~`W4C#F;; e7R3hzd&VRd6vX6arWYlaWaj4;$4s8U*a!e-Wf`{s delta 84 zcmeBVnaIMM$ji&c00ah-xtZ1*dA%4dBlR=#b5r&6GIJC4ef>Jj2gihZyIP2!+>t^Paq!#6+ omgom17AK}uCKkm91$*iz78K~`W~LVYpRQcLuM5{na4Die$1gMvNv6AKFTb2HP65=%1k^NRH++cR&Gk_VZ? Q3Ns9BB7{(#%*!GJ086AIr2qf` diff --git a/app/migrations/__pycache__/0028_hatching_goodsum.cpython-39.pyc b/app/migrations/__pycache__/0028_hatching_goodsum.cpython-39.pyc index 16e77140841dabe036390b0116902b7ba55923ff..19f755f2e2cc61fbac611480225a809e589f5c35 100644 GIT binary patch delta 76 zcmaFE@`Qyqk(ZZ?0SGE~=Vq?m$h(x$(8I+l#@8>vIX*8xJ~OW*wJ0yOBqk`aI5DL% eu_!($*fS=vpdcnUGrcIWBr`v+IA-!|#zp|eX&Zb1 delta 84 zcmaFD@`i;sk(ZZ?0SF8vb2DdeAwl9``ZtUviNV=~0-P!N-wnO>Awl9``Z95Z~)bl1487#G?41U{C$T yf&%^A%=DtflFa2KczG$)s7j+D`o-`0?Yu?6)dg* diff --git a/app/migrations/__pycache__/0031_auto_20250921_1447.cpython-39.pyc b/app/migrations/__pycache__/0031_auto_20250921_1447.cpython-39.pyc index 32b680d8ffd9e895d5ea310f4913754d29d83557..34613e084918939c37ff3c05282d34f342cb1031 100644 GIT binary patch delta 167 zcmaFJb(4!Xk(ZZ?0SGE~=Vm%@ujGDZb@tHU`P^^dtMDPNMTg=(1m72^&T$5KZ zWiWD07H0nIYz&eF5x;`;GxBp&_46`w6ZL)l0-Sa8@^v%wN>YpRQcLuM5{na4Die$1 zgMvNv6AKFTb2HP65=%1k^NRH+d$a5?Qv(_iC7P0zn3tZfS6Y&pQ><5#nVVXbpO;#s T53++5W)avn2w^hWl2ri!-%>R5 diff --git a/app/migrations/__pycache__/0032_delete_transportcarcassdetail.cpython-39.pyc b/app/migrations/__pycache__/0032_delete_transportcarcassdetail.cpython-39.pyc index de27cb58f20881587b56467ccdcee5b77f5c17b2..18ffcfd8b43b923f8afd72168473c499ad8b7a06 100644 GIT binary patch delta 131 zcmeBUX=C9{z;P2ACE%?lJM0ujGLU94h!{Q{ih^YY^}^GZ^S z@={A;f)a}pQz{dS;)8-cV-gDrVsbOnixNvR^Ye;hCU-K%YQXh_4JqOSnskf9CO1E& QG$+-L8OSSU0unsT0Nacspa1{> delta 119 zcmZo;>0{wd*P2ADv%m)-H0ujGr^)vEwQ}y#Qa})J_{Q{hI z^YV2w^GZ^S@={CmgA$7qQz{dS;)8-c^%DyU^m8-QixNvR^Ye=JCpR+23c$?)8&Awl9``ZtZ!goY&`isv-sru9Q)m2v(TMVB;Y~ J>g2tgasc`CG&KMK diff --git a/app/migrations/__pycache__/0034_guilds.cpython-39.pyc b/app/migrations/__pycache__/0034_guilds.cpython-39.pyc index 043a7efedbce545822b68743f4cf1820a3c9f761..0e566df7518453dff2aa62091b3998930d1b45d8 100644 GIT binary patch delta 76 zcmey*^_`11k(ZZ?0SGE~=Vor*$eY7rXy;-T=~0-P!N-wnO>Awl9``Z95ZzAb diff --git a/app/migrations/__pycache__/0035_guilds_is_steward.cpython-39.pyc b/app/migrations/__pycache__/0035_guilds_is_steward.cpython-39.pyc index 55d59fa544223115c5c71633865a0029c4cc0a5a..0248b53af158ff5ac86629cb4324d2fe56050505 100644 GIT binary patch delta 144 zcmX@avWtZ`k(ZZ?0SGE~=Vo?I_J- z=~0-P!N-wnO>Awl9``Z95eXk#wZQAIbg$zM1dyW;;_lhPbtkwwPObIikX0f05bs2>?;TW diff --git a/app/migrations/__pycache__/0036_driver.cpython-39.pyc b/app/migrations/__pycache__/0036_driver.cpython-39.pyc index 2b74ea9239b90382f927f87eb28dab9fd9135aa8..f5f70d069e2346e71f5f3954cb62c376457ae6ef 100644 GIT binary patch delta 184 zcmZqT{l&wV$ji&c00b4gb2IrlH}bhKG2WUS%yf`ZV6rH4DVr2fsz_$?1m++pbMp)4 z8b)gmkT8h&W#?iQ=~0-P!N-wnO>Aw zl9``Z95Z=2>pWX$kbY|r!3r}8Y#fB}1d83_u*uC&Da}c>V+QhyIe-KYqW~iZBL_18 DzxXZU delta 166 zcmeyx)5Ob{$ji&c00ah-xtUKmHuAYJF-A=eW;)2oKUtKyluZ&SRU|!m0&@_Qx%mZi z4WqL=NEk%?a?{Vq&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR(GN;2PE4sxEQ${b_S8=- pDA3Q%OfO0-$;{6y)}K6|b)LKv$Q&yW!3r}GY%GNEm>k0<2LLOrE0X{K diff --git a/app/migrations/__pycache__/0037_driver_product.cpython-39.pyc b/app/migrations/__pycache__/0037_driver_product.cpython-39.pyc index 73b2db25ecc789465d66bc64a7afc2a7ef9db4b3..f3ec73ea64b2eac5d74fbddfd69d1d7ab6815242 100644 GIT binary patch delta 131 zcmcb_a*BmFk(ZZ?0SGE~=Vs2C$a{?O*2F7&ti^#MMIhprn~PP9uU~+3d|rNhW?o5Z zQC@0EOi*HRVoGIVQG8IaXG~&2K}>FDdQoCYW`16A%;d|A;TmxLU_*)|fF|AIu*uC& RDa}c>V+QhynSg`lff0pO+t>nOBlp zl$Tl(6O>q-m{OTo6dx4q8IxF05R;pkUX)mpnV(l2GntzyRRFFZY)FyBlfgx zo0qSfnOBlpl$TnfACy>}m{OTo6dx4qsh?O-pr4zWUX)mpnV(mzKbe^+RReAg*svl= ZpozCQY;yBcN^?@}n1Q@vCLkfe3;-!LCB^^% diff --git a/app/migrations/__pycache__/0039_alter_transportcarcassdetail_tracking.cpython-39.pyc b/app/migrations/__pycache__/0039_alter_transportcarcassdetail_tracking.cpython-39.pyc index bf996d40b733517d920288b0893b54a2a43e64e7..6ea6d0ee851f0f1c90771415af084723f4d28152 100644 GIT binary patch delta 76 zcmbQl+QrJ7$ji&c00b4gb2CqD=~0-P!N-wnO>Awl9``Z95eY3<1_%D(;G1W delta 98 zcmeBToy5wU$ji&c00ah-xtZHG@@`{vN!8ED&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR z(GN;2PE4sxEQ${b_S8=-DA3Q%OfO0-$;{6y);BOPwv12A0ji9j_(5#4C{rl_!4e>A diff --git a/app/migrations/__pycache__/0040_transportcarcassdetail_product_date.cpython-39.pyc b/app/migrations/__pycache__/0040_transportcarcassdetail_product_date.cpython-39.pyc index a8d257c2b2d932642f4c2b7415c83a9a7e0647d7..88d1a272af2cb75ca12d4f1859702316d584e9e2 100644 GIT binary patch delta 145 zcmeBRZD8e1AgpZH&lE54*CF*!RkFFk7F zzs(N9K($36;#ahbRgAA+fOC9aetc#gP<38vNlZ{;abikkVo`ihuxCtSK|xGzW_nR# gNoIatag2e1i2=yO$^1-#0&sJ{h82lSE?|-X0Au$pIsgCw delta 170 zcmZo*?O^3iAw{DDz|tE4C~IXg2i{g&9| zkBnlIMH%Nfivl$ifrwwp`WgATsrq@DxrzF|egV$9dHK4Tc|fgssU`YBiN%R2m5D|1 zLBXE-i3J7vxtZxji6xo&dBysZ-!SHAz|8?0RwM>A@fL?oZhlH>PO2R@*ZNmHSvNbkodLDS_CLu1R{RLyI95e`UN=0=jF#| z=9Q!t<)xOy1SJ+Hrc@>t#Rmm@#v~RL#N=kC7bTWt=I0g1O#aMRpaItpHl#=tXwoeX Vo80`A(wtN~W+1Pa2}lSq0|3eyC@}y4 delta 150 zcmZo>?Pldo3Ncrh|;PCMPpLRNw^46oKS#vFDZMCZ!e? z-{MG2DlREXOfJ!6F5=&u!lK1!Sm=~0-P!N-wnO>Awl9``Z9JBd2s|6zfM0_hv delta 135 zcmey)`=6ILk(ZZ?0SF8vb2D2u@=j)Ayft|t(?Q0l$;r$Q6+lu&+(6O)%=~0-P!N-wnO>Awl9``Z95cC{Os?RR0{|;R BFlYb( delta 195 zcmeAZo+iwf$ji&c00ah-xtXu|H}cJ4X1q0dHS>2yfys+ml9Z%?Qbp1rLIy+#0f}2I zDTyVinoLDtIhoDstnrL&P<9X74o2q~kV+8oD?~pdKQ~oBFEck$-`6j|SvN0VH#4s! zwJ0yOL_a98I5DL%u_!($*i%2Tpg=!2GrcIWBr`v+SbuUo$0hkNkU4%Jf)!>W*jNY= JJGp>U4gl*%GPwW% diff --git a/app/migrations/__pycache__/0044_evacuationdetail.cpython-39.pyc b/app/migrations/__pycache__/0044_evacuationdetail.cpython-39.pyc index c069029d3359a2f3ffd8ac060120606fdbd426dc..3ec9475d33097dc0d04b6f5eff7d41c0c857bba1 100644 GIT binary patch delta 171 zcmdljxLJ@dk(ZZ?0SGE~=Vq$%ZRFEqX1q1omiZi`z+@g4dm%}n)Ge;u#ESTw)V%bP zj3TMcu`KzFY#?zU`x5JNM(a=z8$|r_aIuQ<^$T#0&&!X`%qvMP%1bSY2}&$ZOsPyP wiVq6*j7cmgh{?@NFG?)Q%+D*1nY@SnkbD40zbA-bg_#644nl-Yp35Nz04bF)B>(^b delta 205 zcmdlixLc4fk(ZZ?0SF8vb2H!aZsgNrW{jF_%Y2TJe=-k?y^sV@>K0dSVnuvTYF>It zMv>&^SeAT7Hjp@weTj8BqjLy|4I+L8=x5~Trt0Tq<|gX<`UN=a=H=^V=9Q!t<)xPB z2PGCKrc@>t#Rmm@>L(Ty=;vmp7bTWt=I0gbPu{|Q$krcZjt7Wfg_#I87D9vq#cpxf a=8~F}#S(fQ%ihZyIP2!+>t^Paq!#6+ omgom17AK}uCKkm91$*iz78K~`W~LV|~08I%SFDdQoCYW`16A%;Y^RQ{~M-`t?BsE6gOYaS+00asjIx03yFH7ytkO delta 178 zcmZqU?&Ic5fAV4`H6aP0)Ge;u#ESTw)V%bP zj3UX&x0%%0K*B|mn>m;Z8J(>_Y!LCwUq2&1H&s6`GdEG+*Dt_XH!oi|Gp{7IC@-}{ zKPa&{F{LuGC_X6IQ$MkwKtDG#y(qCHGe56bfASWVsq&^EbM!z2E6hZ&u@J&~at5m$ E07k?xX8-^I diff --git a/app/migrations/__pycache__/__init__.cpython-39.pyc b/app/migrations/__pycache__/__init__.cpython-39.pyc index f60a8615bd048be362cfa6602cf097f4fde68cd9..0f40f129d9b517f9c66a323c5f63abea0a647730 100644 GIT binary patch delta 71 zcmbQoIE|4jk(ZZ?0SGE~Pvo*Sw05zI@%0OEj?c@F&&(@HEy_zRi3v(9PE4sxEQ${b Z_KZm^D2U0;OfO0-$;{6yj+xjX2LSTb7wP~2 delta 79 zcmbQnIFFGlk(ZZ?0SF8vCvw?ZI_qcT=celCW#%U8`}zeq>*nR_X6BWo7UiXu=m#Yh hC#F;;7R3hzd+H|^6zJz>rWYlaWaj4;>rbqZ0{~^Q81VoA diff --git a/app/serializers.py b/app/serializers.py index 59d78e6..062e2f0 100644 --- a/app/serializers.py +++ b/app/serializers.py @@ -622,32 +622,66 @@ class AllProductsTransportCustomSerializer(serializers.ModelSerializer): def get_location_origin(self, obj): resul = {} - province_origin = Province.objects.filter(name=obj.origin_province).first() - city_origin = City.objects.filter(name=obj.origin_city).first() - if province_origin: - resul.update({ - "provinceLat": province_origin.Lat, - "provinceLng": province_origin.Lng - }) - if city_origin: - resul.update({ - "cityLat": city_origin.Lat, - "cityLng": city_origin.Lng - }) + # بهینه‌سازی: استفاده از context cache برای جلوگیری از N+1 queries + location_cache = self.context.get('location_cache', {}) + + if obj.origin_province: + cache_key = f"province_{obj.origin_province}" + if cache_key not in location_cache: + province_origin = Province.objects.filter(name=obj.origin_province).only('Lat', 'Lng').first() + if province_origin: + location_cache[cache_key] = { + "provinceLat": province_origin.Lat, + "provinceLng": province_origin.Lng + } + else: + location_cache[cache_key] = {} + resul.update(location_cache.get(cache_key, {})) + + if obj.origin_city: + cache_key = f"city_{obj.origin_city}" + if cache_key not in location_cache: + city_origin = City.objects.filter(name=obj.origin_city).only('Lat', 'Lng').first() + if city_origin: + location_cache[cache_key] = { + "cityLat": city_origin.Lat, + "cityLng": city_origin.Lng + } + else: + location_cache[cache_key] = {} + resul.update(location_cache.get(cache_key, {})) + return resul def get_location_destination(self, obj): resul = {} - province_destination = Province.objects.filter(name=obj.destination_province).first() - city_destination = City.objects.filter(name=obj.destination_city).first() - if province_destination: - resul.update({ - "provinceLat": province_destination.Lat, - "provinceLng": province_destination.Lng - }) - if city_destination: - resul.update({ - "cityLat": city_destination.Lat, - "cityLng": city_destination.Lng - }) + # بهینه‌سازی: استفاده از context cache برای جلوگیری از N+1 queries + location_cache = self.context.get('location_cache', {}) + + if obj.destination_province: + cache_key = f"province_{obj.destination_province}" + if cache_key not in location_cache: + province_destination = Province.objects.filter(name=obj.destination_province).only('Lat', 'Lng').first() + if province_destination: + location_cache[cache_key] = { + "provinceLat": province_destination.Lat, + "provinceLng": province_destination.Lng + } + else: + location_cache[cache_key] = {} + resul.update(location_cache.get(cache_key, {})) + + if obj.destination_city: + cache_key = f"city_{obj.destination_city}" + if cache_key not in location_cache: + city_destination = City.objects.filter(name=obj.destination_city).only('Lat', 'Lng').first() + if city_destination: + location_cache[cache_key] = { + "cityLat": city_destination.Lat, + "cityLng": city_destination.Lng + } + else: + location_cache[cache_key] = {} + resul.update(location_cache.get(cache_key, {})) + return resul diff --git a/app/views.py b/app/views.py index 0c5fdd2..a71e302 100644 --- a/app/views.py +++ b/app/views.py @@ -26,7 +26,7 @@ from app.filtersets import PoultryFilterSet, PoultryHatchingFilterSet, Transport PoultryInfoFilterSet, HatchingCalculationsFilterSet, HatchingsFilterSet, TransportingDetailFilterSet, \ KillHouseFilterSet, TransportingDetailCustomFilterSet, CustomHatchingsFilterSet, TransportCarcassDetailFilterSet, \ DriverFilterSet, GuildsFilterSet, AllProductsTransportFilterSet -from app.helper import SSLAdapter, get_hatching_permit_code +from app.helper import SSLAdapter, get_hatching_permit_code, normalize_persian_arabic_text from app.models import Poultry, PoultryHatching, TransportingChickenDetail, Hatching, TransportingDetail, KillHouse, \ ApkInfo, TransportCarcassDetail, Guilds, Driver, InquiryCredentials, AllProductsTransport, EvacuationDetail, \ RasadyarAppInfo @@ -4522,10 +4522,7 @@ class AllProductsTransportViewSet(viewsets.ModelViewSet): filters['product'] = product_type if destination_province and destination_province != 'undefined': - if destination_province == 'مرکزی': - filters['destination_province'] = 'مركزي' - else: - filters['destination_province'] = destination_province + filters['destination_province'] = normalize_persian_arabic_text(destination_province) if date1 and date2 and date1 != 'undefined' and date2 != 'undefined': try: @@ -4536,23 +4533,33 @@ class AllProductsTransportViewSet(viewsets.ModelViewSet): except ValueError: pass - transports = AllProductsTransport.objects.filter(**filters).order_by('-date', '-create_date') + # بهینه‌سازی: استفاده از select_related برای جلوگیری از N+1 queries + # و اعمال order_by فقط یک بار + transports = AllProductsTransport.objects.select_related('hatching').filter(**filters) if search and search != 'undefined' and search.strip(): - transports = transports.filter( - build_query(self.filterset_class.Meta.fields, search) - ) + transports = transports.filter( + build_query(self.filterset_class.Meta.fields, search) + ) + + # اعمال order_by فقط یک بار در آخر + transports = transports.order_by('-date', '-create_date') page_size = request.query_params.get('page_size', None) if page_size: self.pagination_class.page_size = int(page_size) - page = self.paginate_queryset(transports.order_by('-date', '-create_date')) + page = self.paginate_queryset(transports) + # بهینه‌سازی: ایجاد cache برای Province و City در context برای جلوگیری از N+1 queries + location_cache = {} + context = self.get_serializer_context() + context['location_cache'] = location_cache + if page is not None: - serializer = self.get_serializer(page, many=True) + serializer = self.get_serializer(page, many=True, context=context) return self.get_paginated_response(serializer.data) - serializer = self.serializer_class(transports.order_by('-date', '-create_date'), many=True) + serializer = self.serializer_class(transports, many=True, context=context) return Response(serializer.data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): @@ -4755,10 +4762,7 @@ class AllProductsTransportDashboardView(APIView): destination_province = request.GET.get('destination_province') kill_house_filterset_class = AllProductsTransportFilterSet if destination_province and destination_province != 'undefined': - if destination_province == 'مرکزی': - filters['destination_province'] = 'مركزي' - else: - filters['destination_province'] = destination_province + filters['destination_province'] = normalize_persian_arabic_text(destination_province) queryset = AllProductsTransport.objects.filter(**filters) if search and search != 'undefined' and search.strip(): @@ -4785,10 +4789,7 @@ class AllProductsTransportDashboardView(APIView): # bars = queryset.filter(jihadi_origin__in=kill_house_codes) if destination_province and destination_province != 'undefined': - if destination_province == 'مرکزی': - filters_query['destination_province'] = 'مركزي' - else: - filters_query['destination_province'] = destination_province + filters_query['destination_province'] = normalize_persian_arabic_text(destination_province) bars = queryset.filter(**filters_query) aggregation = bars.aggregate( total=Sum('quantity'), @@ -4850,10 +4851,7 @@ class AllProductsTransportDashboardView(APIView): ).order_by('-modify_date') if destination_province and destination_province != 'undefined': - if destination_province == 'مرکزی': - filters_query['destination_province'] = 'مركزي' - else: - filters_query['destination_province'] = destination_province + filters_query['destination_province'] = normalize_persian_arabic_text(destination_province) bars = bars(**filters_query) aggregation = bars.aggregate( total=Sum('quantity'), diff --git a/authentication/__pycache__/__init__.cpython-39.pyc b/authentication/__pycache__/__init__.cpython-39.pyc index ba104ec11b411b8aa59a2fdeaee597313357d279..2eb3c6be4404f26575a514129a9830ea68d394f4 100644 GIT binary patch delta 71 zcmbQoIE|4jk(ZZ?0SGE~Pvo*Sw05zI@%0OEj?c@F&&(@HEy_zRi3v(9PE4sxEQ${b Z_KZm^Ey+mDE6GewEXmBzi<#IU2LSV|7w`Z8 delta 79 zcmbQnIFFGlk(ZZ?0SF8vCvw?ZI_qcT=celCW#%U8`}zeq>*nR_X6BWo7UiXu=m#Yh hC#F;;7R3hzd+H~amSm*nm1HI-mSpDV=})YX0|03&86*Gz diff --git a/authentication/__pycache__/admin.cpython-39.pyc b/authentication/__pycache__/admin.cpython-39.pyc index 8970a7aa8a8c00b1baa51a46b7f70be45c137a88..0434e32bd813f2f42d6e1dc041bdb239e7f90e4f 100644 GIT binary patch delta 74 zcmX@kxSx?Xk(ZZ?0SGE~=Vm%ht#Rmm@>L-?#WTfVmWF{w;Waj7TC#K|P=IIqw-r}&y%}*)KNws4Hn)?}K FH~`NNA)x>O diff --git a/authentication/__pycache__/apps.cpython-39.pyc b/authentication/__pycache__/apps.cpython-39.pyc index bf50178c5065f4737fd86f2bf96224d7ab3a7fd6..b19ad11ae6448c03bd1532c66e0085705b925bb6 100644 GIT binary patch delta 76 zcmX@iyqlRfk(ZZ?0SGE~=VmV3$ScEWXzpSa=~0-T9T2PSCW~WSdy8a7c)7DF%bZW*BRsh delta 84 zcmdnZe3+Rxk(ZZ?0SF8vb2ArgA%ck(ZZ?0SGE~=Vr=qZseQDWN7JP731p{;2fWqAD@|5l3J9PS`rhKSe%$r gnOGDb6zmz3SXz>inpcvUoLG{XpBJ1xbk(ZZ?0SF8vb2D#pY~-8BWa+4%k)NBYpO=}NsPF3+;H;aMubY`yl3J9P oTB0A6Se%$rnOGDb6zr*=SXz>inpcvUoLG{XpQpe10@F=)09$Ar;{X5v diff --git a/authentication/__pycache__/serializers.cpython-39.pyc b/authentication/__pycache__/serializers.cpython-39.pyc index 8579ce2467d28816242e2a81a56ede85121873a1..7483badc37a8eb3c63bb7220914cb690ff63b054 100644 GIT binary patch delta 77 zcmbQkHHC{ek(ZZ?0SGE~=Vt!d$h(Nq(9Xpw#@8>vIX*8xJ~OW*wJ0yOBqk`aI5DL% fu_!($*fS=vv?L=nuOu@$u_QA;FJ|)#MiXWL#fBRL delta 85 zcmbQjHHV8gk(ZZ?0SF8vb2FcB878NpPQo;#@8>vIX*8xJ~OW*wJ0yOBqk`aI5DL% eu_!($*fS=vv?L=nuOu@$u_QA;FJ|&LMkfHc7aJ@9 delta 84 zcmdnMvV(;;k(ZZ?0SF8vb2A@ovIX*8xJ~OW*wJ0yOBqk`aI5DL% fu_!($*fS=vv?L=nuOu@$u_QA;FJ`kIQx+2d%!nGT delta 85 zcmbQhIfIiok(ZZ?0SF8vb2IO57bvHpPQ$U diff --git a/authentication/migrations/__pycache__/0001_initial.cpython-39.pyc b/authentication/migrations/__pycache__/0001_initial.cpython-39.pyc index 3822c8e843332e48632ece306d6270b71be170d2..ab417b37b52bcc4faee385cf83f76dd96df5ae1f 100644 GIT binary patch delta 88 zcmX>suv>sPk(ZZ?0SGE~=Vs2|$oquN#>>Sj#@8>vIX*8xJ~OW*wJ0yOBqk`aI5DL% nu_!($*fS=vv?L=nuOu@$u_QA;FD5rLy$H-Ij@fL=&c_G@;+g63DVEV&rQ|O%gjyG_w@^K*3HY;&CDxFEy_zR v(GN;2PE4sxEQ${b_S8=-Ey+mDE6GewEXmBz)6dOJF9NfQ^*8IX^DzPds7xQ= diff --git a/authentication/migrations/__pycache__/0002_city_lat_city_lng_province_lat_province_lng.cpython-39.pyc b/authentication/migrations/__pycache__/0002_city_lat_city_lng_province_lat_province_lng.cpython-39.pyc index 2c547e23da4ce100f26e80b43a01ebdf64add2b5..1ba5a038a168cf7fba30fe31190e7757b1fda8f7 100644 GIT binary patch delta 87 zcmcc3dYP3sk(ZZ?0SGE~=Vp3u=~0-T9T2PSCW~WSdy8a7n7TrUIbV diff --git a/authentication/migrations/__pycache__/0003_auto_20250809_1248.cpython-39.pyc b/authentication/migrations/__pycache__/0003_auto_20250809_1248.cpython-39.pyc index d52bd05c13592d0ca5a3a639050b99a5f8dbe489..25bf33e16051defe270309b988d94d36335e6caf 100644 GIT binary patch delta 88 zcmcc0c9xAVk(ZZ?0SGE~=VltRZRFEuvI%vuit+UeaE{N*kI&32NiE7tEr|(AEKW?R nOe~5I3igaiEG@}M%`3@FPAtjH&x^^;OfLenien}>GF<@x$}ArW delta 96 zcmX@hc9o4Uk(ZZ?0SF8vb2GoNZsgNva*5T?$j?pH&&$kB)c5rZaMsPs*Uii;NiE7t vEzu83EKW?ROe~5I3ii}bEG@}M%`3@FPAtjH&(qJ%OfLeniuET~GF<@xlMf)% diff --git a/authentication/migrations/__pycache__/0004_province_tel_prefix.cpython-39.pyc b/authentication/migrations/__pycache__/0004_province_tel_prefix.cpython-39.pyc index 9f79d0e9b926f315b9d34b164b572053a3c9325d..5f4707db88fca2a7e28b34fc14dde697e7c944c6 100644 GIT binary patch delta 87 zcmey$@|J}+k(ZZ?0SGE~=Vq?i$h&~iCd|bu#@8>vIX*8xJ~OW*wJ0yOBqk`aI5DL% mu_!($*fS=vv?L=nuOu@$u_QA;FD5rLy$H-Ij+y+Cu>}AZ;UGx> delta 95 zcmaFM@|A@*k(ZZ?0SF8vb2DdcrZ~k*a85lL?J!^ diff --git a/authentication/migrations/__pycache__/__init__.cpython-39.pyc b/authentication/migrations/__pycache__/__init__.cpython-39.pyc index f413242bb8ae82e1ed348d5498856f876092b00e..ee1aabe4974965aed2965d00e4ba56b2889b3220 100644 GIT binary patch delta 82 zcmZ3)`RQlm=celCW#%U8`}zeq>*nR_X6BWo7UiXu=m#Yh zC#F;;7R3hzd+H~amSm*nm1HI-mSpDV>E~vq7lB#D`tk9Zd6^~g@p=W7w>WHa^HWN5 NQtcRlR(uB80{~rwCC~r>