From f16ea7c748bb6506ae538b5228897757c634c059 Mon Sep 17 00:00:00 2001 From: Kiril Hadjiev Date: Tue, 5 Aug 2025 21:38:16 +0300 Subject: [PATCH] some fields validation and model cleaning --- .idea/DepoT.iml | 2 +- .idea/dataSources.local.xml | 2 +- .idea/misc.xml | 1 + .idea/workspace.xml | 54 +++++++++--------- DepoT/__pycache__/__init__.cpython-313.pyc | Bin 150 -> 157 bytes DepoT/__pycache__/urls.cpython-313.pyc | Bin 1581 -> 1588 bytes DepoT/__pycache__/wsgi.cpython-313.pyc | Bin 634 -> 641 bytes .../LineFiltweFormMixin.cpython-313.pyc | Bin 1636 -> 1643 bytes accounts/__pycache__/__init__.cpython-313.pyc | Bin 153 -> 160 bytes accounts/__pycache__/admin.cpython-313.pyc | Bin 1105 -> 1112 bytes accounts/__pycache__/apps.cpython-313.pyc | Bin 518 -> 525 bytes accounts/__pycache__/forms.cpython-313.pyc | Bin 6124 -> 6131 bytes accounts/__pycache__/models.cpython-313.pyc | Bin 6053 -> 6060 bytes accounts/__pycache__/urls.cpython-313.pyc | Bin 1354 -> 1361 bytes accounts/__pycache__/views.cpython-313.pyc | Bin 13083 -> 13090 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 4792 -> 4799 bytes ...name_clientpermission_name.cpython-313.pyc | Bin 944 -> 951 bytes ..._is_company_admin_and_more.cpython-313.pyc | Bin 1128 -> 1135 bytes ...tuser_employee_permissions.cpython-313.pyc | Bin 1547 -> 1554 bytes ..._alter_depotuser_user_type.cpython-313.pyc | Bin 1081 -> 1088 bytes ...r_clientpermission_options.cpython-313.pyc | Bin 1100 -> 1107 bytes .../0007_auto_20250725_1920.cpython-313.pyc | Bin 591 -> 598 bytes .../0008_populate_permissions.cpython-313.pyc | Bin 2395 -> 2402 bytes .../0009_create_superuser.cpython-313.pyc | Bin 1932 -> 1939 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 164 -> 171 bytes booking/__pycache__/__init__.cpython-313.pyc | Bin 152 -> 159 bytes booking/__pycache__/admin.cpython-313.pyc | Bin 196 -> 203 bytes booking/__pycache__/apps.cpython-313.pyc | Bin 518 -> 525 bytes booking/__pycache__/forms.cpython-313.pyc | Bin 1965 -> 1972 bytes booking/__pycache__/models.cpython-313.pyc | Bin 2533 -> 2540 bytes booking/__pycache__/urls.cpython-313.pyc | Bin 1014 -> 1021 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 2397 -> 2404 bytes ...ename_bookingmodel_booking.cpython-313.pyc | Bin 804 -> 811 bytes ..._container_expedited_count.cpython-313.pyc | Bin 825 -> 832 bytes .../0004_booking_status.cpython-313.pyc | Bin 901 -> 908 bytes ...lter_booking_vehicles_left.cpython-313.pyc | Bin 797 -> 804 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 163 -> 170 bytes booking/models.py | 24 +++++--- .../__pycache__/__init__.cpython-313.pyc | Bin 165 -> 172 bytes .../custom_filters.cpython-313.pyc | Bin 662 -> 669 bytes booking/tests.py | 31 +++++----- .../__pycache__/__init__.cpython-313.pyc | Bin 158 -> 165 bytes .../__pycache__/client_views.cpython-313.pyc | Bin 4500 -> 4507 bytes .../employee_views.cpython-313.pyc | Bin 1690 -> 1697 bytes booking/views/client_views.py | 2 +- common/__pycache__/__init__.cpython-313.pyc | Bin 151 -> 158 bytes common/__pycache__/admin.cpython-313.pyc | Bin 195 -> 202 bytes common/__pycache__/apps.cpython-313.pyc | Bin 515 -> 522 bytes common/__pycache__/models.cpython-313.pyc | Bin 3534 -> 3541 bytes common/__pycache__/urls.cpython-313.pyc | Bin 3259 -> 3266 bytes common/fields.py | 29 ++++++++++ .../forms/__pycache__/company.cpython-313.pyc | Bin 1091 -> 1098 bytes common/forms/__pycache__/line.cpython-313.pyc | Bin 1074 -> 1081 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 3217 -> 3224 bytes ...ymodel_short_name_and_more.cpython-313.pyc | Bin 1192 -> 1199 bytes .../0003_auto_20250725_1920.cpython-313.pyc | Bin 596 -> 603 bytes ...0004_populate_initial_data.cpython-313.pyc | Bin 3485 -> 3492 bytes ...rkindmodel_active_and_more.cpython-313.pyc | Bin 1166 -> 1173 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 162 -> 169 bytes common/models.py | 38 +++++++++--- .../__pycache__/__init__.cpython-313.pyc | Bin 164 -> 171 bytes .../__pycache__/filters.cpython-313.pyc | Bin 907 -> 914 bytes .../__pycache__/minio_utils.cpython-313.pyc | Bin 3036 -> 3043 bytes .../__pycache__/owncloud_utls.cpython-313.pyc | Bin 5084 -> 5091 bytes .../utils/__pycache__/utils.cpython-313.pyc | Bin 3670 -> 3677 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 157 -> 164 bytes .../__pycache__/barrier_views.cpython-313.pyc | Bin 1807 -> 1814 bytes .../__pycache__/client_views.cpython-313.pyc | Bin 10152 -> 10159 bytes .../employee_views.cpython-313.pyc | Bin 7687 -> 7694 bytes .../__pycache__/shared_views.cpython-313.pyc | Bin 4560 -> 4567 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 155 -> 162 bytes common_api/__pycache__/urls.cpython-313.pyc | Bin 350 -> 357 bytes common_api/__pycache__/views.cpython-313.pyc | Bin 501 -> 508 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 155 -> 162 bytes containers/__pycache__/admin.cpython-313.pyc | Bin 199 -> 206 bytes containers/__pycache__/apps.cpython-313.pyc | Bin 527 -> 534 bytes containers/__pycache__/forms.cpython-313.pyc | Bin 3594 -> 3601 bytes containers/__pycache__/models.cpython-313.pyc | Bin 3786 -> 3793 bytes .../__pycache__/services.cpython-313.pyc | Bin 904 -> 911 bytes containers/__pycache__/urls.cpython-313.pyc | Bin 1644 -> 1651 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 3878 -> 3885 bytes ..._container_receive_vehicle.cpython-313.pyc | Bin 760 -> 767 bytes ...03_alter_container_booking.cpython-313.pyc | Bin 1127 -> 1134 bytes ...ame_line_id_container_line.cpython-313.pyc | Bin 736 -> 743 bytes ...iner_expedited_by_and_more.cpython-313.pyc | Bin 2124 -> 2131 bytes .../0006_containerphotos.cpython-313.pyc | Bin 1806 -> 1813 bytes .../0007_container_preinfo.cpython-313.pyc | Bin 1120 -> 1127 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 166 -> 173 bytes containers/models.py | 13 ++++- .../__pycache__/__init__.cpython-313.pyc | Bin 161 -> 168 bytes .../__pycache__/barrier_views.cpython-313.pyc | Bin 12464 -> 12471 bytes .../__pycache__/client_views.cpython-313.pyc | Bin 5483 -> 5490 bytes .../views/__pycache__/common.cpython-313.pyc | Bin 3429 -> 3436 bytes .../employee_views.cpython-313.pyc | Bin 4897 -> 4904 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 156 -> 163 bytes damages_api/__pycache__/admin.cpython-313.pyc | Bin 200 -> 207 bytes damages_api/__pycache__/apps.cpython-313.pyc | Bin 529 -> 536 bytes .../__pycache__/models.cpython-313.pyc | Bin 197 -> 204 bytes damages_api/__pycache__/urls.cpython-313.pyc | Bin 455 -> 462 bytes damages_api/__pycache__/views.cpython-313.pyc | Bin 4263 -> 4270 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 167 -> 174 bytes payments/__pycache__/__init__.cpython-313.pyc | Bin 153 -> 160 bytes payments/__pycache__/admin.cpython-313.pyc | Bin 197 -> 204 bytes payments/__pycache__/apps.cpython-313.pyc | Bin 521 -> 528 bytes payments/__pycache__/forms.cpython-313.pyc | Bin 905 -> 912 bytes payments/__pycache__/models.cpython-313.pyc | Bin 3784 -> 3791 bytes payments/__pycache__/services.cpython-313.pyc | Bin 5374 -> 5381 bytes payments/__pycache__/urls.cpython-313.pyc | Bin 586 -> 593 bytes payments/__pycache__/utils.cpython-313.pyc | Bin 1779 -> 1786 bytes payments/__pycache__/views.cpython-313.pyc | Bin 13439 -> 13446 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 2977 -> 2984 bytes ...fees_containertariffperiod.cpython-313.pyc | Bin 1927 -> 1934 bytes .../0003_auto_20250725_1920.cpython-313.pyc | Bin 598 -> 605 bytes .../0004_populate_tariffs.cpython-313.pyc | Bin 2437 -> 2444 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 164 -> 171 bytes payments/models.py | 7 ++- preinfo/__pycache__/__init__.cpython-313.pyc | Bin 152 -> 159 bytes preinfo/__pycache__/admin.cpython-313.pyc | Bin 196 -> 203 bytes preinfo/__pycache__/apps.cpython-313.pyc | Bin 518 -> 525 bytes preinfo/__pycache__/forms.cpython-313.pyc | Bin 1953 -> 1960 bytes preinfo/__pycache__/models.cpython-313.pyc | Bin 1575 -> 1582 bytes preinfo/__pycache__/urls.cpython-313.pyc | Bin 1206 -> 1213 bytes .../__pycache__/0001_initial.cpython-313.pyc | Bin 2571 -> 2578 bytes ...omodel_deleted_by_and_more.cpython-313.pyc | Bin 1413 -> 1420 bytes ...ename_preinfomodel_preinfo.cpython-313.pyc | Bin 947 -> 954 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 163 -> 170 bytes preinfo/models.py | 10 +++- .../__pycache__/__init__.cpython-313.pyc | Bin 158 -> 165 bytes .../__pycache__/client_views.cpython-313.pyc | Bin 7732 -> 7739 bytes .../employee_views.cpython-313.pyc | Bin 1953 -> 1960 bytes 130 files changed, 146 insertions(+), 67 deletions(-) create mode 100644 common/fields.py diff --git a/.idea/DepoT.iml b/.idea/DepoT.iml index 1cae4c6..776d648 100644 --- a/.idea/DepoT.iml +++ b/.idea/DepoT.iml @@ -16,7 +16,7 @@ - + diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml index 24a9a0b..7ef0a74 100644 --- a/.idea/dataSources.local.xml +++ b/.idea/dataSources.local.xml @@ -1,6 +1,6 @@ - + " diff --git a/.idea/misc.xml b/.idea/misc.xml index 35c55fd..0120671 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,4 +3,5 @@ + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 49b3ae0..d928493 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,14 +5,18 @@ + + + + - - + - - + - + + + - + + + - \ No newline at end of file diff --git a/DepoT/__pycache__/__init__.cpython-313.pyc b/DepoT/__pycache__/__init__.cpython-313.pyc index 0b302412ed0cc3ae0583c4c4d621f9f5e8838d37..f6bd0e2d8b0ad5337ec873d8b9c2358d340e8c68 100644 GIT binary patch delta 47 xcmbQnIG2(8GcPX}0}u$5*H7d&X0(}TFD{&tm6(^FACr<=kY5rH;Y>_20RSfu4oCn1 delta 40 ucmbQsIE|6}GcPX}0}wFYj+)4A%xF5%UYy4zD={xUKgK1sAU|YcrU?Md3JX5~ diff --git a/DepoT/__pycache__/urls.cpython-313.pyc b/DepoT/__pycache__/urls.cpython-313.pyc index abc21409388b488819026c6870b313ddb20a4fdb..84db4757b8670c1ba8b6f3981ab7494b247998c7 100644 GIT binary patch delta 70 zcmZ3>vxSHEGcPX}0}u#_P0Codkyn#d+rrr@CMC5jzMv>SD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+IXV!aFi0Qnel delta 63 zcmdnOvzCYVGcPX}0}x0_*JT{t$g9b!V(4rYlag8%Ur>~vm6}{q98*wPl98Vmob}+^1fr#ws5wJNl7h>FDS~-N=+^)jwz@t$;i)(Ny$pg SOV0;N737!1LpYP=nW6zQcNnn% delta 63 zcmZo<{l&ujnU|M~0SK6GM`cXj$oq~_#n9O*CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; RFFilTCAA~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2Elve+{L0Ax}b8~^|S delta 64 zcmaFO^Mr@@GcPX}0}!nJotKfjk@pL;io3H_OiF55d_hruR%&udaZEvFNk)ENj7wHx SUV46vOKL%W$YvcDdnN$s1s4GT diff --git a/accounts/__pycache__/__init__.cpython-313.pyc b/accounts/__pycache__/__init__.cpython-313.pyc index 24076070fe040ed9e712724aa4a355b09e20526f..ff85c13b6a6094d46213737d438e5d083ff70fc6 100644 GIT binary patch delta 47 xcmbQqxPX!SGcPX}0}u$5*H7d&X0)GZFD{&tm6(^FACr<=kY5rH;Y>_22LLE|4paaD delta 40 ucmZ3$IFph4GcPX}0}!O9$4%rmX0(`SFV5qVm6(^FALEi*kRLKJ(;NWITMIt` diff --git a/accounts/__pycache__/admin.cpython-313.pyc b/accounts/__pycache__/admin.cpython-313.pyc index 459858a90cb26b6f84dd2bdfade2b6bc266f5b3d..2f7b998e4823360929b5823b30982ab6230461c9 100644 GIT binary patch delta 71 zcmcb}af5^RGcPX}0}u#_P0Fa-$a|AX+s4@{CMC5jzMv>SD>b>KIHsVoBqKjBCM7E| UFFhY9Rghm258-U)Vs>W)07L*7egFUf delta 64 zcmcb?agl@fGcPX}0}#ws?aP?6k@qH(im9_zOiF55d_hruR%&udaZEvFNk)ENj7wHx SUV46vOKL%W$Yw!icSZoW2^IGM diff --git a/accounts/__pycache__/apps.cpython-313.pyc b/accounts/__pycache__/apps.cpython-313.pyc index 35d7e006f26386786436f831ec4db9af6c1dfd59..25d1e8b90d8041d36285d291a237826ae53706a0 100644 GIT binary patch delta 52 zcmZo;>1E;l%*)Hg00aW%^%)a4@;WdwT2J<46c~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2EpVR8@!07c^%{r~^~ delta 64 zcmeyY|3;tpGcPX}0}!wpc4c&KF?F_zNl7h>FDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*}R#_K@SD>b>KIHsVoBqKjBCM7E| UFFhY9Rghm258-V7#k^V=05{4Rm;e9( delta 64 zcmZ3Zzf_<1GcPX}0}zCo^=0ha$a|7m#mw0%CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAAQ*=)!n$p`>- CYYzJW delta 45 zcmcb}b&8AkGcPX}0}#ws?aP?Gke7wgWHKL%IFCzKVqSWFj7w@ke#mAE7D+|`9gYlW diff --git a/accounts/__pycache__/views.cpython-313.pyc b/accounts/__pycache__/views.cpython-313.pyc index f661bc30b82c24375d4a2cdf8a76b246602291c0..f06778d6034962a3e024c0091e581890b8080c23 100644 GIT binary patch delta 72 zcmbQ8wkVD7GcPX}0}u#_P0A>e-^eG}+{-pKcWm(hLldtPxKm#oCR^!yl?)Pnqw&60e}SO8Y_ B4#EHc diff --git a/accounts/migrations/__pycache__/0002_clientpermission_codename_clientpermission_name.cpython-313.pyc b/accounts/migrations/__pycache__/0002_clientpermission_codename_clientpermission_name.cpython-313.pyc index 2d06789a48d7ea2707dbab04de2aecd055020203..45ec870f55f20db16922f6aeedfdc25b3aa369a5 100644 GIT binary patch delta 53 zcmdnMzMY--GcPX}0}u#_P0Fy|$Q!`KST;G1NnAK3D={xUKPDx$AipFY!r9!&q|XQd DfcOu- delta 46 zcmdnazJZLXOiF55d_hruR%&udaZEvFNk)ENOiET_ UUV1)Isvy549>UqI!)(I{0A~UjGXMYp delta 64 zcmaFQ@q&Z*GcPX}0}uo%q-N~e$orc~CCk|=CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAASD>b>KIHsVoBqKjBCM7E| UFFhY9Rghm258-U)X4Yc_05-cAJpcdz delta 64 zcmX@Wv6F-MGcPX}0}%Y3kd~3Yk@pspN|CcwOiF55d_hruR%&udaZEvFNk)ENj7wHx SUV46vOKL%W$YvpCJw^b`1r}WZ diff --git a/accounts/migrations/__pycache__/0006_alter_clientpermission_options.cpython-313.pyc b/accounts/migrations/__pycache__/0006_alter_clientpermission_options.cpython-313.pyc index ed6dc68c359c7b6e8370486146f3e886090b0ce6..f7581e64b28440038bc86528c22ae0497d0c17dc 100644 GIT binary patch delta 70 zcmX@ZahZenGcPX}0}u#_P0BdEkyndZJJs1LCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+IXX8s5OA7~jC delta 63 zcmcc2afXBUGcPX}0}#AV&C7VPkyndZCC=F@CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; RFFilTCAASD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+JiV>}1|Ea4eg delta 63 zcmcb{a-N0vGcPX}0}wo4*PQWnBX2CDN|3WvOiF55d_hruR%&udaZEvFNk)ENj7wHx RUV46vOKL%W$mFSv2LZ-C7l{A> diff --git a/accounts/migrations/__pycache__/0008_populate_permissions.cpython-313.pyc b/accounts/migrations/__pycache__/0008_populate_permissions.cpython-313.pyc index c235ba1ce559115d0b615e266b653f076f8383fa..c24aa9a9b2ba4ebee154921922306d7314196d60 100644 GIT binary patch delta 72 zcmcaD^hk*BGcPX}0}u#_P0IMjwvlfti*~fLRZL21S$siJepYI7NpVa;Wl2VUUQ9|> VVqSVaP^uumBp$-qe4J$p3jk|E8W8{h delta 65 zcmaDPbX$n;GcPX}0}!Ox^kpcsZ{(ZGq7ve46_b)$7GF@5pOur@|I` diff --git a/accounts/migrations/__pycache__/0009_create_superuser.cpython-313.pyc b/accounts/migrations/__pycache__/0009_create_superuser.cpython-313.pyc index c98986cad76e970794b06f9797917d26298ef147..0682ee9c2203c7d94081ef5d0ed93831873835a9 100644 GIT binary patch delta 71 zcmeC-pUltunU|M~0SJV|CS_dO$ScaM9qw!ulag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2E#F}tw<021jJ>;M1& delta 64 zcmbQt-^0)QnU|M~0SFHDwPd{8$ScaM65wnVlag8%Ur>~vm6}{q98*wPl98Vm diff --git a/accounts/migrations/__pycache__/__init__.cpython-313.pyc b/accounts/migrations/__pycache__/__init__.cpython-313.pyc index ca357de57f575b4188eea4f4fa31fcf178ef5e19..b8cfc8b8086c268f5eb6a25f21f7496f1e0f923e 100644 GIT binary patch delta 47 xcmZ3&xSEmsGcPX}0}u$5*H7d&X7rk9FD{&tm6(^FACr<=kY5rH;Y>_&0st+b4uAjv delta 40 ucmZ3@xP+1WGcPX}0}u!@#!lomW^|rtFV5qVm6(^FALEi*kRLKJ(+L2*OA4?6 diff --git a/booking/__pycache__/__init__.cpython-313.pyc b/booking/__pycache__/__init__.cpython-313.pyc index b565210e6e4c864db68a2a3e492afa1b119b64c9..ec355b061236e8d2743d5cbbcb188b472f0995b4 100644 GIT binary patch delta 47 xcmbQiIG>UGGcPX}0}u$5*H7d&X0)4VFD{&tm6(^FACr<=kY5rH;Y>_20{|!h4p0C9 delta 40 ucmbQwID?VpDX1*T$j^&O$x6&i Q&j(5srSSl4l diff --git a/booking/__pycache__/apps.cpython-313.pyc b/booking/__pycache__/apps.cpython-313.pyc index f0fc6ccb6ca84626f85e0f5ce1fa1176082298c3..c034f57334270411b51d6a64930b0e6442429680 100644 GIT binary patch delta 52 zcmZo;>1E;l%*)Hg00aW%^%;{k@;WjyT21z66czlERoGcPX}0}u#_P0BFZ$g9buZS8Colag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2DWF$J>%00Ji$rT_o{ delta 64 zcmdnOzm}i(GcPX}0}z<&*Jgxn$tvNl7h>FDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*__A}%nAT$V-&dn diff --git a/booking/__pycache__/models.cpython-313.pyc b/booking/__pycache__/models.cpython-313.pyc index 9ad9cc09576c2c24ad2028d5bbaa44a22e4a7afd..6fc7a811bac4b8e4d51935ba590ba45358e39ef5 100644 GIT binary patch delta 71 zcmaDV{6?7fGcPX}0}u#_P0CQ%$ScXJZR2belag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2D~vCd`z038t+IsgCw delta 64 zcmaDO{8X6tGcPX}0}z-uOvv!t$ScXJV(M%alag8%Ur>~vm6}{q98*wPl98VmSD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+JqV!8zY1rZpB delta 63 zcmZ3@wuFuMGcPX}0}wc@Ov-q)kynyQCCb?SD>b>KIHsVoBqKjB#w9B; RFFilTCAASD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+JKWcmUC9_kqn delta 63 zcmZ3&HkXa}GcPX}0}!yRPR>}ck@p9qN|duzOiF55d_hruR%&udaZEvFNk)ENj7wHx RUV46vOKL%W$YcYiF93%b7C-<1 diff --git a/booking/migrations/__pycache__/__init__.cpython-313.pyc b/booking/migrations/__pycache__/__init__.cpython-313.pyc index c5906689a2043a10f5861a64d76c28196ddc241c..be5f6fe5a567d0c4e1874ce17d74fba19a79af06 100644 GIT binary patch delta 47 xcmZ3?xQdbcGcPX}0}u$5*H7d&X7rqBFD{&tm6(^FACr<=kY5rH;Y>_&1OP244txLr delta 40 ucmZ3*xR{aqGcPX}0}z+Y71y diff --git a/booking/models.py b/booking/models.py index 0f55f47..8d6fe63 100644 --- a/booking/models.py +++ b/booking/models.py @@ -1,4 +1,8 @@ +from django.core.exceptions import ValidationError from django.db import models + +from accounts.models import DepotUser +from common.fields import ContainerNumberField, UpperCaseCharField from common.models import ContainerTypeModel, LinesModel, OperationModel # Create your models here. @@ -10,15 +14,15 @@ class Booking(models.Model): ('canceled', 'Canceled'), ] - number = models.CharField(max_length=50, unique=True) - vehicles = models.CharField(blank=True, null=True) + number = UpperCaseCharField(max_length=50) + vehicles = UpperCaseCharField(blank=True, null=True) container_type = models.ForeignKey( ContainerTypeModel, on_delete=models.CASCADE, related_name='booking_container_types', ) - container_count = models.IntegerField() - container_expedited_count = models.IntegerField(default=0) + container_count = models.PositiveIntegerField() + container_expedited_count = models.PositiveIntegerField(default=0) carrier = models.CharField(max_length=100, blank=True, null=True) line = models.ForeignKey( LinesModel, @@ -27,12 +31,12 @@ class Booking(models.Model): ) visible = models.BooleanField(default=True) is_new = models.BooleanField(default=True) - container_number = models.CharField(max_length=11, blank=True, null=True) + container_number = ContainerNumberField(max_length=11, blank=True, null=True) vehicles_left = models.CharField(blank=True, null=True) created_on = models.DateTimeField(auto_now_add=True) - created_by = models.IntegerField() + created_by = models.ForeignKey(DepotUser, related_name='booking_user', on_delete=models.CASCADE) updated_on = models.DateTimeField(auto_now=True) - updated_by = models.IntegerField() + updated_by = models.ForeignKey(DepotUser, related_name='booking_user', on_delete=models.CASCADE) status = models.CharField( max_length=10, choices=STATUS_CHOICES, @@ -44,4 +48,8 @@ class Booking(models.Model): return self.container_count - (self.container_expedited_count or 0) class Meta: - app_label = 'booking' \ No newline at end of file + app_label = 'booking' + + def clean(self): + if Booking.objects.filter(number=self.number, status='active').exclude(id=self.id).exists(): + raise ValidationError(f'Booking with number {self.number} already exists and is active.') diff --git a/booking/templatetags/__pycache__/__init__.cpython-313.pyc b/booking/templatetags/__pycache__/__init__.cpython-313.pyc index f8c4aa73e926fadafa702c3dde69eed9df724f42..84ec1daa05c68166791a5808e11c0cd179d1018d 100644 GIT binary patch delta 47 xcmZ3=xQ3DYGcPX}0}u#_O`6DU%;-JQUR*dOD={xUKPDx$AipFY!kL)l3;-lM4mbb+ delta 40 ucmZ3(xRjCmGcPX}0}ynsZl1_(%;+-FUYy4zD={xUKgK1sAU|YcrZWKFPz(G3 diff --git a/booking/templatetags/__pycache__/custom_filters.cpython-313.pyc b/booking/templatetags/__pycache__/custom_filters.cpython-313.pyc index 7573f4369011426ac63599f902f5e3829a0092fe..c7f38881ba9255fa31cf6a846e0fcd480e69508d 100644 GIT binary patch delta 70 zcmbQnI+vCAGcPX}0}u#_P0Dz_kvEl5JJ8uGCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258*7H#>fZ&4fPm4 delta 63 zcmbQsI*pb0GcPX}0}vQaYRUMtkvEl5#mm_$CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; RFFilTCAA`j0RSq{4rl-X delta 40 ucmZ3=IFFJ0GcPX}0}xpI=T77{X0)AXFV5qVm6(^FALEi*kRLKJ(*^*@;|m}F diff --git a/booking/views/__pycache__/client_views.cpython-313.pyc b/booking/views/__pycache__/client_views.cpython-313.pyc index d96d78c53d8b3dff53e1e03a3b51734de2223be9..70fec42a25a23dfa76dbc285fa1ac197868d2486 100644 GIT binary patch delta 71 zcmbQDJX@LfGcPX}0}u#_P0CQ&$ZNx_?cr<{lag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2FMGOP0e00O!fpa1{> delta 64 zcmbQOJVlxJGcPX}0}yO4?axTu$ZNx_;^=G@lag8%Ur>~vm6}{q98*wPl98Vm_21pp_A4om<5 delta 40 ucmbQoIGvIEGcPX}0}y1U$4%rmW;B~pDX1*T$j^&O$x6&i Q&j(5s>0;si%*)Hg00aW%^%)a3^4c>pT2A(56cneN~$KGcPX}0}$w`Puj@M&#Z0jY!#D|S{7eWl%JKFTv8lUP+5|ZpBIyom6(^F S50om%FNue6Hrp{z-~s^lI~Sb* delta 62 zcmcaAeNLMDGcPX}0}yC_p0JUdpIODk*(xR_wJg4%C_gJTxuiIzpt2+*KQG25D={xU QKgK1sAU|ZYEAs>{0CgG_DF6Tf diff --git a/common/__pycache__/urls.cpython-313.pyc b/common/__pycache__/urls.cpython-313.pyc index 074737e0dad78aa5ec8221ce09ad00e77a87bc9a..01a38550467891df522167a80909d4a87539b292 100644 GIT binary patch delta 53 zcmdljc}SA?GcPX}0}u#_P0H}z$a|2J(Q@*6PI2Lsti-(Z{Fs!~g8Y(r2xs#r&XY_4 Dr%n;h delta 46 zcmX>kxm%L=GcPX}0}#ws?aL_H$a|2J(P;8{PH`TWti-(Z{1}(ig8Y!pKRHh_0RTxZ B4^jXC diff --git a/common/fields.py b/common/fields.py new file mode 100644 index 0000000..6a3bdaa --- /dev/null +++ b/common/fields.py @@ -0,0 +1,29 @@ +from django.core.exceptions import ValidationError +from django.db import models + + +class UpperCaseCharField(models.CharField): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def get_prep_value(self, value): + value = super().get_prep_value(value) + if value is not None: + return value.upper() + return value + + +class ContainerNumberField(UpperCaseCharField): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def get_prep_value(self, value): + value = super().get_prep_value(value) + if value is not None: + return value.upper() + return value + + def validate(self, value, model_instance): + super().validate(value, model_instance) + if value and len(value) != 11: + raise ValidationError('Container number must be exactly 11 characters long.') diff --git a/common/forms/__pycache__/company.cpython-313.pyc b/common/forms/__pycache__/company.cpython-313.pyc index 8b2c7d8ab9936cde90ab637f17ff4bdfb0cc353f..1902e1486b21c45c3661a6321ac08ce523ccc5b3 100644 GIT binary patch delta 71 zcmX@iaf*ZYGcPX}0}u$5*JsFW~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2E3WAtSL06D%HFaQ7m delta 64 zcmX@bahQYmGcPX}0}%WPEX>f`$a|Dg#oE~_CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAA~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2E(V{~Bx04f$3-v9sr delta 64 zcmdnVv5ABCGcPX}0}wE&6=g_o~vm6}{q98*wPl98VmUo?iQ_*r E0FZhR_5c6? delta 47 zcmbOsIZ=}DGcPX}0}$jF#AOHxZRAVfV04|F&mqp^l9ia3o*(0qT96;Ic_znyW&k2{ B4aEQe diff --git a/common/migrations/__pycache__/0002_alter_companymodel_short_name_and_more.cpython-313.pyc b/common/migrations/__pycache__/0002_alter_companymodel_short_name_and_more.cpython-313.pyc index 0aa2f635a4228b657613b5898d094924db1b6cd9..4cef09bdf7990436224b3de8c4d3de20632a63a0 100644 GIT binary patch delta 53 zcmZ3%xt^2vGcPX}0}u#_P0BdFk@r6nWAx;{gDd C?-4ry delta 45 zcmcc3a)pKWGcPX}0}wo4*PQWtBX2SzW5DD>MsXgOti-(Z{1}(ig8Y!lvl$Nn08#o6 AYybcN diff --git a/common/migrations/__pycache__/0004_populate_initial_data.cpython-313.pyc b/common/migrations/__pycache__/0004_populate_initial_data.cpython-313.pyc index 2cde5817e6b23fe40c27c1f589c6f21239888fea..9ba80d75750d5d54db81d05578485436b836fba8 100644 GIT binary patch delta 72 zcmbO$y+oStGcPX}0}$w`Ps;epy^-%Yn|745RZL21S$siJepYI7NpVa;Wl2VUUQ9|> VVqSVaP^uumBp$-q{F7}78vtYp8c_fM delta 64 zcmZ1?Jy)9VGcPX}0}w?0osi+nvytyOn@X^=RZL21S$siJepYI7NpVa;Wl2VUUW`jt SVqSWFj7w@ke#j>FC2Rnyy%uo* diff --git a/common/migrations/__pycache__/0005_companymodel_active_containerkindmodel_active_and_more.cpython-313.pyc b/common/migrations/__pycache__/0005_companymodel_active_containerkindmodel_active_and_more.cpython-313.pyc index bb5f2ea5ffc2318636d832d6f525186395f0f76c..21973e6e00c1a99a6a65eab755c7d3991351dbd0 100644 GIT binary patch delta 71 zcmeC~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2EFF;_4G04o+4aR2}S delta 64 zcmbQr*~iKInU|M~0SLS`yE6JV@;+r!DRH)nNl7h>FDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*(}Rk!3Y45#uc3a diff --git a/common/migrations/__pycache__/__init__.cpython-313.pyc b/common/migrations/__pycache__/__init__.cpython-313.pyc index 7951a7114e20c50939295fbc71d4e4d50f5af296..e6b3295e9a82bc69fa25c39d4fa2f1c017c743c3 100644 GIT binary patch delta 47 xcmZ3)xRR0kGcPX}0}u$5*H7d&X7re7FD{&tm6(^FACr<=kY5rH;Y>_&001no4tM|n delta 40 ucmZ3 5: + raise ValidationError('Short name cannot exceed 5 characters.') + if self.description and len(self.description) > 255: + raise ValidationError('Description cannot exceed 255 characters.') + class CompanyModel(NomenclatureBaseModel): - class Meta: - app_label = 'common' + def clean(self): + super().clean() + if CompanyModel.objects.filter(name=self.name, active=True).exclude(id=self.id).exists(): + raise ValidationError(f'Company with name {self.name} already exists and is active.') + if CompanyModel.objects.filter(short_name=self.short_name, active=True).exclude(id=self.id).exists(): + raise ValidationError(f'Company with short name {self.short_name} already exists and is active.') class LinesModel(NomenclatureBaseModel): @@ -26,8 +43,13 @@ class LinesModel(NomenclatureBaseModel): related_name='line_company' ) - class Meta: - app_label = 'common' + def clean(self): + super().clean() + if LinesModel.objects.filter(name=self.name, active=True).exclude(id=self.id).exists(): + raise ValidationError(f'Line with name {self.name} already exists and is active.') + if LinesModel.objects.filter(short_name=self.short_name, active=True).exclude(id=self.id).exists(): + raise ValidationError(f'Line with short name {self.short_name} already exists and is active.') + class OperationModel(NomenclatureBaseModel): ... @@ -50,4 +72,4 @@ class ContainerTypeModel(models.Model): app_label = 'common' def __str__(self): - return self.name \ No newline at end of file + return self.name diff --git a/common/templatetags/__pycache__/__init__.cpython-313.pyc b/common/templatetags/__pycache__/__init__.cpython-313.pyc index d5024c3aa106dd70caa375deb3345257e77477e3..5429b4500fa8aec914d07c5d78301a2508d5aadc 100644 GIT binary patch delta 47 xcmZ3&xSEmsGcPX}0}u$5*H7d&X7rk9FD{&tm6(^FACr<=kY5rH;Y>_&0st+b4uAjv delta 40 ucmZ3@xP+1WGcPX}0}%XCtewbh%;-GPUYy4zD={xUKgK1sAU|YcrV{|%bPL-6 diff --git a/common/templatetags/__pycache__/filters.cpython-313.pyc b/common/templatetags/__pycache__/filters.cpython-313.pyc index de0fbb39dee088ff9934c23acc8629d3dd5d1392..43996d76b9bbd09ba807ed8d163e84902ed3fd3b 100644 GIT binary patch delta 71 zcmeBXpTy4lnU|M~0SJV|CS{!2$Q#C}?dfb4lag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2ExGqNxN02eSA00000 delta 64 zcmbQl-p$VYnU|M~0SN3Y`!gPFFDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^+1$s-!UO<*_7x`p diff --git a/common/utils/__pycache__/minio_utils.cpython-313.pyc b/common/utils/__pycache__/minio_utils.cpython-313.pyc index ecd3702ebb356965eaf76ce4c511fdbd1d1ca20e..91b40678ee465789bc53f69c8263839d18eafaf2 100644 GIT binary patch delta 71 zcmca3{#cy%GcPX}0}u#_P0EUqI#=4CS0AINofdBvi delta 64 zcmaDXen*`5GcPX}0}!N$v}N4h$orK=#opN}CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAAVO5)a{Qp2Outi-(Z{1}(ig8Y!pKbcdw09#8B AZU6uP diff --git a/common/views/__pycache__/__init__.cpython-313.pyc b/common/views/__pycache__/__init__.cpython-313.pyc index fe54f398df5215571f10498ecd14454335d476be..a3c3f12726f330183ca8227071cbd907f3fad17f 100644 GIT binary patch delta 47 xcmbQsxP+1WGcPX}0}u$5*H7d&W^|rtFD{&tm6(^FACr<=kY5rH;Y>`j1^_Bp4rBlT delta 40 ucmZ3&IG2(8GcPX}0}${9~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2E_FnwkL03SLSt^fc4 delta 64 zcmbQn*U!iMnU|M~0SNp}`!ixU^1fzNadftdNl7h>FDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*{sa;nFRodiWTAj diff --git a/common/views/__pycache__/client_views.cpython-313.pyc b/common/views/__pycache__/client_views.cpython-313.pyc index 1ba8af3fd7607dc73ccd67a8af3364b3154035aa..d51d0fea051b31619aa388f53d81415a62120c66 100644 GIT binary patch delta 72 zcmZ4CzuuqkGcPX}0}u#_P0H9LwUMurMcdukDkdehEWV&9KPxr4q&TLavLquvFD4}` VF)uwIC{>VO5)a{Q-p%q>2>@Vh8bAO5 delta 65 zcmZ4QzrvsIGcPX}0}xD%?a#=N-pJR9gVc%*)Hg00cr}lQQ~+HuBZ6FnUhzWf2!n$x6&i&yPt-Eyyp4hj2D;U VVqSVaP^uumBp$-q{EX=p9{_I=8kYb7 delta 65 zcmcbvd_kG-GcPX}0}#ws?aQ#>-pIFwNyWk0DkdehEWV&9KPxr4q&TLavLquvFUBP+ TF)uwo#wE2NKV`j1OO>$4qN~L delta 40 ucmZ3)IGd6CGcPX}0}ur1)K26!X0)1UFV5qVm6(^FALEi*kRLKJ(-Hv4DGL|? diff --git a/common_api/__pycache__/urls.cpython-313.pyc b/common_api/__pycache__/urls.cpython-313.pyc index 552af24948190afe086c90dd8c9a17296de3c432..484f76a0f1e848061a3d731e7eb36f200b30f4ba 100644 GIT binary patch delta 69 zcmcb|^puJBGcPX}0}u#_P0Bbkk@uFit+Q23N@`hrK~a8IYH~?&OhIKyMt)vQN>*ZC SdOlF9AipFY!kNs?7z_Y1G8m)) delta 62 zcmaFLbdQPmGcPX}0}x0_*JWIq$a_o0%-Jd?CABQRpeR2pHMyiXrl7JUBR?<3B`Yy6 QJwL`JwIDxavJhi10E4p?Y5)KL diff --git a/common_api/__pycache__/views.cpython-313.pyc b/common_api/__pycache__/views.cpython-313.pyc index 71ddd825d867852783345b4303b06bbc8a606614..573f818eedb62969c601ee12b98861d54eb82a16 100644 GIT binary patch delta 52 zcmey${D+zMGcPX}0}u$5*Jpg($jivcXg8UkQCv7BD={xUKPDx$AipFY!kKKuco+bc C!VrxB delta 45 zcmeyv{FRyaGcPX}0}z<&*Jga%$jivcXg-;rQJlvmD={xUKgK1sAU|ZXCF5ZLA=nKz diff --git a/containers/__pycache__/__init__.cpython-313.pyc b/containers/__pycache__/__init__.cpython-313.pyc index 80ca21613d89b89b958cb4c7887930764f5c137a..6d172a23b8d3336b0c3627c176fd01db0752e19a 100644 GIT binary patch delta 47 xcmbQuxQLPaGcPX}0}u$5*H7d&W^|lrFD{&tm6(^FACr<=kY5rH;Y>`j1OO>$4qN~L delta 40 ucmZ3)IGd6CGcPX}0}#A<7B!LEn9*vYy*Q6cR$^XyevC_ML4L@@OiKXg;0#Fs diff --git a/containers/__pycache__/admin.cpython-313.pyc b/containers/__pycache__/admin.cpython-313.pyc index 52c00b49a9499404320e9752d17df20823849829..290999e4289db333a92328a36725460a28c10b65 100644 GIT binary patch delta 68 zcmX@kc#e_xGcPX}0}u$5*Js#IpDX1*T$j^&O$x6&i Q&j(5sU diff --git a/containers/__pycache__/apps.cpython-313.pyc b/containers/__pycache__/apps.cpython-313.pyc index b2d0509e4b4c6423271e8e8aabc0983c1405b78c..4625c2d0bfd6f269f7482e6991144ccc2dcef9d8 100644 GIT binary patch delta 70 zcmeBYna0BVnU|M~0SE-j>oaC-FDS~-N=+^)jwz@t$;i)(Ny$pg TOV0;N737!1LpYNw7^edO0C5;$ delta 63 zcmbQn($B*CnU|M~0SMkci^`a{k=LD3#mw0%CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; RFFilTCAAFDS~-N=+^)jwz@t$;i)(Ny$pg UOV0;N737!1LpYmPG9_{Y00wLrDF6Tf delta 64 zcmbOz(~vm6}{q98*wPl98Vmldr_A6GcPX}0}u#_P0DcC$h(qV+uqqKCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| UFFhY9Rghm258-US#r}Z}06Pa6wg3PC delta 64 zcmca8drFq~GcPX}0}y=qSedbKBkxLf6$@vpn3UAA_=2MRtkmR^;+TTUl8pSk7?-TX Ty!8ASm(+s%kj)R-Kd=D+@$ndf diff --git a/containers/__pycache__/services.cpython-313.pyc b/containers/__pycache__/services.cpython-313.pyc index 1809b7ea7ee4456766858b01e40e7fedb6e35c4a..cd7b79945b5f4aef7de36c3423dd8ecc58d9c1b5 100644 GIT binary patch delta 71 zcmeBR?`P-z%*)Hg00cr}lQL8`@~SXtJ33p%q@SD>b>KIHsVoBqKjBCM7E| UFFhY9Rghm258-UqW3^)h07pO=m;e9( delta 64 zcmey&^M;4_GcPX}0}#ws?aR>K$orQ?#mw0%CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAAG?4!sRj8Z@es~t5pE$C E0K=XUBme*a delta 47 zcmZ20w@i-jGcPX}0}$jF#ASpCZsdE!#ppTtBbPXjOIBiDdVY*cYC(R;W@&CA763>r B4c`C& diff --git a/containers/migrations/__pycache__/0002_rename_receive_vehicles_container_receive_vehicle.cpython-313.pyc b/containers/migrations/__pycache__/0002_rename_receive_vehicles_container_receive_vehicle.cpython-313.pyc index 079bb578bf21b34f340af3e735ada944bdc9a2f0..c2834fb5b3af98e7e2c1dba5c73c252f5811b0a2 100644 GIT binary patch delta 70 zcmeyt`k$5eGcPX}0}u#_P0Fa;$a{uSyUN)rCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+Jy%lI1rNtYUR delta 63 zcmey*`h%7CGcPX}0}xESD>b>KIHsVoBqKjB#w9B; RFFilTCAAUqI!)(n60Bj%`NdN!< delta 64 zcmaFI@tlMAGcPX}0}#wx8J}@`Bkyk}l}Kl+n3UAA_=2MRtkmR^;+TTUl8pSk7?-TX Sy!8ASm(+s%kj=)-){Fq^+!q!A diff --git a/containers/migrations/__pycache__/0004_rename_line_id_container_line.cpython-313.pyc b/containers/migrations/__pycache__/0004_rename_line_id_container_line.cpython-313.pyc index 33979ef4adfac55523e82cce71536a02c6583e8f..3132dd4d83555c4407c20dcd038fa81de337e3ec 100644 GIT binary patch delta 70 zcmaFB`ka;bGcPX}0}u#_P0A?U$a{iOJI&cDCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+Jy$@m-qH$NH? delta 62 zcmaFP`hb=9GcPX}0}$-G7oX9-k@p0nO1!gGOiF55d_hruR%&udaZEvFNk)ENj7wHx QUV46vOKL%W$Rwuc0I>ZRCjbBd diff --git a/containers/migrations/__pycache__/0005_alter_container_expedited_by_and_more.cpython-313.pyc b/containers/migrations/__pycache__/0005_alter_container_expedited_by_and_more.cpython-313.pyc index bcdd77b2a9188ff2ebaf338f6a34245441ab158d..8d3174199e5b923e46a75db5edbc095021899bad 100644 GIT binary patch delta 71 zcmX>ja9M!&GcPX}0}u#_P0CQ*$h(hKJI~oFCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| UFFhY9Rghm258-Tn&l<}F06J0`KL7v# delta 64 zcmcaCa7KXlGcPX}0}v!Vh|h@L$h(hKCEeL7CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAA~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2Elvc6;l02FDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*{s9*k`Vxlz7_NU diff --git a/containers/migrations/__pycache__/0007_container_preinfo.cpython-313.pyc b/containers/migrations/__pycache__/0007_container_preinfo.cpython-313.pyc index 1195971ba139ebb58966b1fb162ad0a1399d6150..5ce31c4af1a02f1b633c0d779f0426654f4628f8 100644 GIT binary patch delta 71 zcmaFB@tlMAGcPX}0}u#_P0HB3k@p9ac9gSKOiF55d_hruR%&udaZEvFNk)ENOiET_ UUV1)Isvy549>UqI$!yLD0Aq_89RL6T delta 64 zcmaFP@qmN(GcPX}0}v>Ds?0dMk@p9aO0ct4OiF55d_hruR%&udaZEvFNk)ENj7wHx SUV46vOKL%W$Yuj(b4CE&Y!=S| diff --git a/containers/migrations/__pycache__/__init__.cpython-313.pyc b/containers/migrations/__pycache__/__init__.cpython-313.pyc index 8c8aed659091120e739a054afde04bd6dbee2e50..21f27821479c75bb81c9ee0a967f730caefa7711 100644 GIT binary patch delta 47 xcmZ3+xR#OoGcPX}0}u$5*H7d&X7rh8FD{&tm6(^FACr<=kY5rH;Y>_&0RS$L4u}8% delta 40 ucmZ3>xQvneGcPX}0}#A<7B!LEn9+5jy*Q6cR$^XyevC_ML4L@@Ocwy`Aq;f@ diff --git a/containers/models.py b/containers/models.py index d9ec771..756750c 100644 --- a/containers/models.py +++ b/containers/models.py @@ -1,11 +1,13 @@ - +from django.core.exceptions import ValidationError from django.db import models + +from common.fields import ContainerNumberField from common.models import LinesModel, ContainerTypeModel # from payments.models import ContainerTariffPeriod, AdditionalFees # Create your models here. class Container(models.Model): - number = models.CharField(max_length=11) + number = ContainerNumberField(max_length=11) line = models.ForeignKey( LinesModel, on_delete=models.CASCADE, @@ -25,7 +27,7 @@ class Container(models.Model): receive_vehicle = models.CharField(max_length=100, blank=True, null=True) damages = models.TextField(blank=True, null=True) heavy_damaged = models.BooleanField(default=False) - position = models.CharField(max_length=100, blank=True, null=True) + position = models.CharField(max_length=7, blank=True, null=True) swept = models.BooleanField(default=False) swept_on = models.DateTimeField(blank=True, null=True) swept_by = models.ForeignKey( @@ -67,6 +69,11 @@ class Container(models.Model): ) expedition_vehicle = models.CharField(max_length=100, blank=True, null=True) + def clean(self): + if Container.objects.filter(number=self.number, expedited=False).exclude(id=self.id).exists(): + raise ValidationError(f'Container with number {self.number} already exists in the depot.!') + if self.heavy_damaged and not self.damages.strip(): + raise ValidationError('Heavy damaged containers must have damages specified.') class ContainerHistory(Container): diff --git a/containers/views/__pycache__/__init__.cpython-313.pyc b/containers/views/__pycache__/__init__.cpython-313.pyc index 81c3ad78d97d0a7ec6a981108fbe044c7ff6feb8..b0d9888c42413e2701dd0838c5847662d47cf256 100644 GIT binary patch delta 47 xcmZ3;xPp=UGcPX}0}u$5*H7d&W^|uuFD{&tm6(^FACr<=kY5rH;Y>`j2LLQM4s-wj delta 40 ucmZ3%xR8VO5)a{Qe#LxD2LM~Y8ZQ6< delta 65 zcmdm VVqSVaP^uumBp$-q%*LE51OSIc8LR*R delta 65 zcmeyQ^;(PXGcPX}0}#xU@6Yh&-N<)^NyWw4DkdehEWV&9KPxr4q&TLavLquvFUBP+ TF)uwo#wE2NKV&m6bE*&k&h{2y diff --git a/containers/views/__pycache__/common.cpython-313.pyc b/containers/views/__pycache__/common.cpython-313.pyc index 3ffc94cd0985d9cc61a66a6be362f4a17187205c..d8aa6e2c68fdc0c7517d61c19f794cd52a2f8c13 100644 GIT binary patch delta 72 zcmaDV^+t;CGcPX}0}u#_P0H9UypeAfv$m_VRZL21S$siJepYI7NpVa;Wl2VUUQ9|> VVqSVaP^uumBp$-qe1>@@Cje*+8Up|T delta 65 zcmaDO^;C-QGcPX}0}xo*_Geg&Y~-88tYYVE6_b)$7GF@5pOuVO5)a{QUc+3<4**Rp8EXIl delta 65 zcmZ3Xwor}lGcPX}0}vD|_Gh^9Y~-tAR&jH-ib+W=i!Uh3&q_@$DUKGcPX}0}u$5*Js#IpDX1*T$j^&O$x6&i Q&j(5spDX1*T$j^&$$x6&i P&yR6QEyxd~vm6}{q98*wPl98VmlaiH~ Tm!1!lD#$O1hj1oWGR^=10v{M^ delta 63 zcmbQiGLeP%GcPX}0}xbmlx57{$m_wVV(x4elag8%Ur>~vm6}{q98*wPl98VmpDX1*T$j^&O$x6&i Q&j(5spDX1*T$j^&$$x6&i P&yR6QEyxdSD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+JCW{d#<7q%E~ delta 63 zcmX@de4Ls0GcPX}0}%M$ZOyp1k=Ke*#oXB{CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; RFFilTCAA3;>=b7BK(- diff --git a/damages_api/__pycache__/views.cpython-313.pyc b/damages_api/__pycache__/views.cpython-313.pyc index 0e58dcaffc9da89fc819e1a698e0dcc6f2c991af..4b95b87fe51d9a5468fa3b9142c8f9b185870103 100644 GIT binary patch delta 71 zcmZ3kxK5GxGcPX}0}u#_P0Fy`$jid6ZSQOqlag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2EVvKMgz00bo$tN;K2 delta 64 zcmZ3dxLlFFDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*=)mJ#0db3kQHJ8 diff --git a/damages_api/migrations/__pycache__/__init__.cpython-313.pyc b/damages_api/migrations/__pycache__/__init__.cpython-313.pyc index 3e2edabb18701e093aa6d957ab29a36831724536..a6a61353cd5f6bdb45da47a014049a50822a6242 100644 GIT binary patch delta 47 xcmZ3^xQ>zgGcPX}0}u$5*H7d&X7rtCFD{&tm6(^FACr<=kY5rH;Y>_&1pqGy4vYW* delta 40 ucmZ3-xSWyuGcPX}0}xbkluhI|W^|iqFV5qVm6(^FALEi*kRLKJ(-i>Bt_wu~ diff --git a/payments/__pycache__/__init__.cpython-313.pyc b/payments/__pycache__/__init__.cpython-313.pyc index 4af532da530b3aedd7dcac64d1e57fe3722897ef..4cb73b7165852b695935a5519f26b9da6ee77568 100644 GIT binary patch delta 47 xcmbQqxPX!SGcPX}0}u$5*H7d&X0)GZFD{&tm6(^FACr<=kY5rH;Y>_22LLE|4paaD delta 40 ucmZ3$IFph4GcPX}0}v#67f$3hX0(`SFV5qVm6(^FALEi*kRLKJ(;NWH4GS{> diff --git a/payments/__pycache__/admin.cpython-313.pyc b/payments/__pycache__/admin.cpython-313.pyc index d13991b87a35da6aa998b59b96dbbe597d7d6d0f..28cff1a6c71ff04582531d67345e079f232be78a 100644 GIT binary patch delta 68 zcmX@gc!rVpGcPX}0}u$5*Js#IpDX1*T$j^&O$x6&i Q&j(5spDX1*T$j^&$$x6&i P&yR6QEyxdocZoFDS~-N=+^)jwz@t$;i)(Ny$pg TOV0;N737!1LpYngnd}$=^UD`i delta 64 zcmbQh-pS7UnU|M~0SKl{FUzRg$ScL9V(M%alag8%Ur>~vm6}{q98*wPl98VmhdtR3JGcPX}0}u$5*Jl)NvdqS4?GcPX}0}xc&lw~a1$a{!|(QNVs7I7Yzti-(Z{1}(ig8Y!pzgVtv0sv2{ B4~hT) diff --git a/payments/__pycache__/services.cpython-313.pyc b/payments/__pycache__/services.cpython-313.pyc index 6dcf0d63c553056a1956754d7969631f58885eed..fa3deb8fe7d0bc5ae25a402f9c8ac5e927d3d8bb 100644 GIT binary patch delta 72 zcmeyT*{a3&nU|M~0SH9JCS|PU*~r(!tZnaX6_b)$7GF@5pOu7iGcPX}0}zOcP0H}z$UBQs+uGSGCMC5jzMv>SD>b>KIHsVoBqKjBCM7E| TFFhY9Rghm258+Hc%~%fr5dj#@ delta 63 zcmcb}a*BobGcPX}0}%A<_hp1^~vm6}{q98*wPl98Vm VVqSVaP^uumBp$-q%)|Pe5deHM8TJ4G delta 65 zcmeyx`){hqb diff --git a/payments/__pycache__/views.cpython-313.pyc b/payments/__pycache__/views.cpython-313.pyc index 807352be59502e0d733339821b9035c491dd7c74..516959d890fdfcdffdfb2234c3bc0d7ff7c142a5 100644 GIT binary patch delta 72 zcmeyL(U!^gnU|M~0SH9JCS`0>*~s^YMcc;NDkdehEWV&9KPxr4q&TLavLquvFD4}` VF)uwIC{>VO5)a{Q)?*FS2LO=88UFwP delta 65 zcmZq6{GY-1nU|M~0SIdS`!n{dZshyJqGIZ76_b)$7GF@5pOu~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2D`a!4=(02oXd4FCWD delta 64 zcmZ1>zEGU^GcPX}0}xExR+6z}BX0zUio3H_OiF55d_hruR%&udaZEvFNk)ENj7wHx SUV46vOKL%W$mR(g63hUxkrpuk diff --git a/payments/migrations/__pycache__/0002_additionalfees_containertariffperiod.cpython-313.pyc b/payments/migrations/__pycache__/0002_additionalfees_containertariffperiod.cpython-313.pyc index e67c39dca6b2af22f21950101c43ad3bcbd10cf7..56a2e832051fb92b1c3d830f84068996ebe802e1 100644 GIT binary patch delta 71 zcmZqY@8jqF%*)Hg00g39lQLK~@@lebXFFTPq@FDS~-N=+^)jwz@t$;i)(amh-| SOV5vSNiE0^*__C#%LD+7))iv_ diff --git a/payments/migrations/__pycache__/0003_auto_20250725_1920.cpython-313.pyc b/payments/migrations/__pycache__/0003_auto_20250725_1920.cpython-313.pyc index 81f83b5911f73a23eead8d859bdc14179ac03d06..40d8e76322a171ad97df5f2aad8685ec6d9d9c28 100644 GIT binary patch delta 52 zcmcb{a+ihoGcPX}0}zOcP0Dz`kvEx-PtqquNNR$^XyeoRVgL4HX*gfn>x;~@Z< CY!OBP delta 45 zcmcc1a*c)eGcPX}0}wo4*PQWtBX2SzW6jm^2)NP1UOs8q@UGGcPX}0}u$5*H7d&X0)4VFD{&tm6(^FACr<=kY5rH;Y>_20{|!h4p0C9 delta 40 ucmbQwID?VpDX1*T$j^&O$x6&i Q&j(5srOCuEd diff --git a/preinfo/__pycache__/apps.cpython-313.pyc b/preinfo/__pycache__/apps.cpython-313.pyc index 760bc7b16b09e2156bb70a7f805bdf32ffe9c2da..2ff418c4423980583370de90a948c9794ba6f7f7 100644 GIT binary patch delta 52 zcmZo;>1E;l%*)Hg00aW%^%;{k@;WjyT21z66c4!KVO5)a{Qp2ft@3II6x7?1z} delta 65 zcmZ3%zmT8rGcPX}0}z<&*JenuY~;&eQZaG1ib+W=i!Uh3&q_@$DUK~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2EpXQ^NW06$e3J^%m! delta 64 zcmZ3-vz&+bGcPX}0}#x1Ps(__k++UT#njmSD>b>KIHsVoBqKjB#w9B; SFFilTCAA~vm6}{q98*wPl98VmlaiH~ Tm!1!lD#$O1hj1qEWc~{P5Y-t$ delta 63 zcmdnXxs8+eGcPX}0}yyW?Z}w4k+*|c#n{;@CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; RFFilTCAAUpN#6FV= E0E?**Qvd(} delta 47 zcmbOv(k;UGnU|M~0SNL7;xfd!Hu5>JGrCRoXBX#j$x6&i&yR6QEyxeqT**F@2>=%H B4C4R* diff --git a/preinfo/migrations/__pycache__/0002_alter_preinfomodel_deleted_by_and_more.cpython-313.pyc b/preinfo/migrations/__pycache__/0002_alter_preinfomodel_deleted_by_and_more.cpython-313.pyc index 2d2d951f69a465eebade5aa744ad9aa90bbfe447..b248d72f4c79d5e52d49d1c6156603dcd60204a5 100644 GIT binary patch delta 71 zcmZqW?&0SB%*)Hg00g39lQOn$~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2E(WS+wa052OEY5)KL delta 64 zcmeC-Zsq3v%*)Hg00dJy;xn#o~vm6}{q98*wPl98Vm8lag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2D8XX0T501)CA^Z)<= delta 64 zcmdnRzL}l(GcPX}0}$NzNXk&y$Xmvw66I_alag8%Ur>~vm6}{q98*wPl98Vm_&1OP244txLr delta 40 ucmZ3*xR{aqGcPX}0}#y6kDbVE%;+@HUYy4zD={xUKgK1sAU|YcrXv8)(F`j0RSq{4rl-X delta 40 ucmZ3=IFFJ0GcPX}0}zB-=T77{X0)AXFV5qVm6(^FALEi*kRLKJ(*^*^nF}TW diff --git a/preinfo/views/__pycache__/client_views.cpython-313.pyc b/preinfo/views/__pycache__/client_views.cpython-313.pyc index bcf3a863b1948d38db1853a345612c7741af3e53..b3ce8805edf8f8271e4919e0e9282e0e05512251 100644 GIT binary patch delta 71 zcmdmDv)hLEGcPX}0}zOcP09$_$eYHZ?cr<{lag8%Ur>~vm6}{q98*wPl98VmlaiH~ Um!1!lD#$O1hj2DeXPGMr05-H48~^|S delta 64 zcmdmOv&Dw@GcPX}0}%XG?9aHckvEM+#nIU+CMC5jzMv>SD>b>KIHsVoBqKjB#w9B; SFFilTCAAUrDifKCw07HNo(EtDd delta 64 zcmZ3%zmT8zGcPX}0}vds>d*MSk#{GPinFs-OiF55d_hruR%&udaZEvFNk)ENj7wHx SUV46vOKL%W$mWks+gSj?(iejO