From 16c3c60a6fc1a64d91462396e72c84f746d6851f Mon Sep 17 00:00:00 2001 From: Kiril Hadjiev Date: Tue, 5 Aug 2025 23:40:06 +0300 Subject: [PATCH] fixed some errors --- .idea/workspace.xml | 99 ++++++++++++------ booking/__pycache__/models.cpython-313.pyc | Bin 2540 -> 3347 bytes booking/models.py | 4 +- booking/tests.py | 9 +- .../__pycache__/client_views.cpython-313.pyc | Bin 4507 -> 4423 bytes booking/views/client_views.py | 10 +- common/__pycache__/models.cpython-313.pyc | Bin 3541 -> 5772 bytes containers/__pycache__/models.cpython-313.pyc | Bin 3793 -> 4682 bytes containers/tests.py | 49 +-------- payments/__pycache__/models.cpython-313.pyc | Bin 3791 -> 4329 bytes preinfo/__pycache__/models.cpython-313.pyc | Bin 1582 -> 2130 bytes readme.md | 7 +- 12 files changed, 86 insertions(+), 92 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d928493..425775e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,18 +5,12 @@ - - - - - - - - + + + - @@ -96,7 +92,7 @@ - + - + + + + - + - + + + - + + - @@ -253,7 +273,7 @@ - + - + + + diff --git a/booking/__pycache__/models.cpython-313.pyc b/booking/__pycache__/models.cpython-313.pyc index 6fc7a811bac4b8e4d51935ba590ba45358e39ef5..375e9deeffd4cb1bc5c1c2ffa7880890855737e1 100644 GIT binary patch literal 3347 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 diff --git a/booking/models.py b/booking/models.py index 8d6fe63..8f60b0b 100644 --- a/booking/models.py +++ b/booking/models.py @@ -34,9 +34,9 @@ class Booking(models.Model): 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.ForeignKey(DepotUser, related_name='booking_user', on_delete=models.CASCADE) + created_by = models.ForeignKey(DepotUser, related_name='booking_created_user', on_delete=models.CASCADE) updated_on = models.DateTimeField(auto_now=True) - updated_by = models.ForeignKey(DepotUser, related_name='booking_user', on_delete=models.CASCADE) + updated_by = models.ForeignKey(DepotUser, related_name='booking_updated_user', on_delete=models.CASCADE) status = models.CharField( max_length=10, choices=STATUS_CHOICES, diff --git a/booking/tests.py b/booking/tests.py index a282b7c..2256c4d 100644 --- a/booking/tests.py +++ b/booking/tests.py @@ -43,11 +43,10 @@ class BookingViewsTestCase(TestCase): container_type=self.container_type, container_count=10, line=self.line, - created_by=self.user_employee_all_rights.id, - updated_by=self.user_employee_all_rights.id, + created_by=self.user_client_all_rights, + updated_by=self.user_client_all_rights, vehicles='K1,J2,K3', vehicles_left='K1,J2,K3', - ) def test_employee_booking_list_view__anonymouse_user__expect_redirect_302(self): @@ -87,7 +86,7 @@ class BookingViewsTestCase(TestCase): self.assertEqual(response.status_code, 302) self.assertTrue(Booking.objects.filter(number='BOOK456').exists()) - def test_booking_update_view(self): + def test_booking_update_view__expect_redirect_and_booking_updated_in_db(self): self.client.login(username=self.user_client_all_rights.username, password=self.user_password) response = self.client.post(reverse('client_booking_update', args=[self.booking.id]), { 'number': 'BOOK123-updated', @@ -97,4 +96,4 @@ class BookingViewsTestCase(TestCase): }) self.assertEqual(response.status_code, 302) self.booking.refresh_from_db() - self.assertEqual(self.booking.number, 'BOOK123-updated') + self.assertEqual(self.booking.number, 'BOOK123-UPDATED') diff --git a/booking/views/__pycache__/client_views.cpython-313.pyc b/booking/views/__pycache__/client_views.cpython-313.pyc index 70fec42a25a23dfa76dbc285fa1ac197868d2486..102a0db2264c499d6fc87ba6dcb57bd794ce4790 100644 GIT binary patch delta 1043 zcmaizOH5Ni6ozN|yuFV;fZ8H`T-sVv7Jvi{kZL5zBP~{?mJq2SDn%Pxu1-scD_OWe zH>RGAi5p$1D`VKX(1i z6297}pWW%KDXsKFt)qJ&B``rHS(3G+9VwBChPI}ql+5Im!W3g~OFL68<}$QB?M``^ zr}m_6u*pv%BrBdISt(ERro5Q9_1o|hgs^7Alewqtd%}U&Qu{F)HtXUDE8M6Sri+DT zU6?FZs)iDC_vU$Z?F?Nt0Z4&0-Ta73KAh=CC{VP9-2pCj;r>#AJ*X6_%n#44aT@oOIwnLVAGbAg4p3Q05SUzb-|qdvq_|IQR(sL=#+(9M^?!UD?+aYO(+RLGo2FQ zy{Q@ASb{yrbl4jsX59^S)s!RGPeIBNkVJM69+n(4Gyq>6KAVwj41PM|oq68$XN7D> zJ6N<(r^x{9A=_ahJY@vy!jP%bVBotia;VH08Ujs1e40?hsRvk%#RyuR%j^Wx;#>j z_G1#hVkAK`3ESb_*)XrN5kwqe1R3Y5g7Z{$WiLIJ^~gx6SXczFGt!da`=gHoSDYK| zEX|!`UI1sbgWKtcWtY>E;agaj;uD8&Az|+&gcWfa@xPbBGgAiOx2xBy(H%mq8f9w3 z$RxaQ&OKvd0)RWd;NW##xv6P)i;K6r7Bp6_F#H2D{J8FH7-em~P^vJ@rZ?Tv%4Kb_ zYpGf+RrbgfY%zYqNmNFHZd58F2w{)UJICdYnNqq%GMgl}MTXbOFid!cS~Xe^_0)Su Q>*Lqz`Gs8~)BVJM0kF!@`2YX_ delta 1092 zcmaiyOK4L;6ozMRUN^aq#3X&EZD>MEv|5d+wI$SNO-Ur8F;Zqd!#t1iTqE-MB1;zAI#DF`hWq@{bIPz$caIk$<0R&*90XU;z}XXc;tv1`F6ZA+33 zvEgidKJBkaE%;rfr!VA136wC#_^6dw_1F}%MFk>6MI!2Rb4-fLMAlT1L*B*j9Zc@imdY z=UmuME1ajMkL3BfKJKhX*SRFR9Y83F`&k(neiY#18vj6<&Q0VMH6V~buhF<%mfp0E zb?EOgPL@c49A#Tn1B2H)NAw3o=(4r@)HF-|oI@MFp4Z`5;Z8myLM2cowl8m0YhAKPGpMdLZ+CRQqp%yrMtP}6mhd7NdusjL52HzcT2X@h~TGR z3?BMe7!?Fq5&~GMCUkit5ViwO0|o&@4EhOYiD$_pTCin~We(b$%^O)>ALDxWL8zP7 zvd=Ue4_NlBBInpTavpFI&<)TpGRmU;hJBKHTl-l4?}kyEymkUiaeygGHdjvHBTBBw z{Qs9FzvLshlODDQM)wSXCy+P*dWBp8{Lda(b5#djum>9ocne`u0TXXshzHzs(>_Me zIDCE3VwzO@v18C7DzU;ssI19#p-{>yd6fvX;%FWfLD$lsmUEA;@VYz1K}m?%m4rY diff --git a/booking/views/client_views.py b/booking/views/client_views.py index 22abb77..2a4623b 100644 --- a/booking/views/client_views.py +++ b/booking/views/client_views.py @@ -1,6 +1,6 @@ from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from django.urls import reverse_lazy -from django.views.generic import CreateView, ListView +from django.views.generic import CreateView, ListView, UpdateView from DepoT.mixins.LineFiltweFormMixin import LineFilterFormMixin from booking.forms import BookingCreateForm, BookingUpdateForm @@ -38,8 +38,8 @@ class CreateBookingView(LoginRequiredMixin, UserPassesTestMixin, LineFilterFormM def form_valid(self, form): # todo more validation - form.instance.created_by = self.request.user.id - form.instance.updated_by = self.request.user.id + form.instance.created_by = self.request.user + form.instance.updated_by = self.request.user form.instance.vehicles_left = form.cleaned_data.get('vehicles') return super().form_valid(form) @@ -47,7 +47,7 @@ class CreateBookingView(LoginRequiredMixin, UserPassesTestMixin, LineFilterFormM return self.request.user.has_company_perm('can_manage_booking') or self.request.user.user_type == 'CA' -class ClientBookingUpdateView(LoginRequiredMixin, UserPassesTestMixin, LineFilterFormMixin, CreateView): +class ClientBookingUpdateView(LoginRequiredMixin, UserPassesTestMixin, LineFilterFormMixin, UpdateView): template_name = 'client/booking-edit.html' model = Booking form_class = BookingUpdateForm @@ -55,7 +55,7 @@ class ClientBookingUpdateView(LoginRequiredMixin, UserPassesTestMixin, LineFilte def form_valid(self, form): # todo more validation - form.instance.updated_by = self.request.user.id + form.instance.updated_by = self.request.user return super().form_valid(form) def test_func(self): diff --git a/common/__pycache__/models.cpython-313.pyc b/common/__pycache__/models.cpython-313.pyc index e8008768ff494e869cd8a7025502229c5f5c802d..632383503d3d10f45caf76115839a32620c96d36 100644 GIT binary patch literal 5772 zcmeHLO>7&-6`m!zOG?8Zi<11KAB&b1HEdlfa4aXX9XqyUC6X)()k-l8$zH97b<<-K0$^_BEe-s^|nz>loJo7fkw+s5UD1xuRG#I=+TwZI2zDj8ReWF~!) zu?&N*;P}FV#(Gs<>zz?qe^N`uV|!a7M9MdIK84C%GD(;q6XuWw=A3kaJ{+>MM_?ka zyJQjmNj**`O}a<-m5Qgg69tQ&*j5fT2!vhlSz1F~9Yr7pbAM?tzi7=lGdSQOq z#{vm|IAAqKGxJ(HmQsyHrd@!I4C8jUJ@CFg0dao(zj?ESXMNjf$chaKDU2 zV3}DhX6Ta(OU6tlJsF=>(}@fWEo2NO--u=A=V8dUpvc0K<-*moI*@}q(2?9GTlEKi z>Dg*%`t{o%dsqu}G1O12pe?8qtfPPIGy%Cw#>puBR+bJ>d~{7<^)LWO;L^3!bsfJ9 zu~wj#8@I+_->ua(n;#AW?+za03fT(O-&y)-$@CoL>nd9kE{88E2vfXjNv{JFmN+G3 z0=apSh3@?3Gy%5aD)jID7QRzE;5&DrzdCP0mh3q78$#6bnVf}DJ`-AXMJdkoTE$FN zcnh**SCyH>!l))BNP>i==yGEeOfnQx)9H*6n$|+v{DQF*VX#87+$qmwm=QwLEO2PI zVwx5Yb%$brC18~r(<9seMCNdxrpH)v0imaY`*?R5e^}(l&rqjUt&VeW$FQ8>z!r_~ z$zkolQfeMzETySwtGT*y@WDp>BmpFE8h4hS1do{QJ)6N(ruWnq4cs|*=iKk~dnf*Q z?)T?5+umGPH{0IgEQ6cDA=5hqEIHZ?|Nr2;*O%)!k?lCK8R~xM+zg%OY{Q$usOgP9 zb&?}zOxkRF1NvSxypQ4RY(J6%NDd-FJhFEj#u}QKRWqjDGB_5qpJCg3A(O$a@h(dO z%_cw8xQ{U~FT#!?X-0xG*>j@9Ff=?)&=&Mx0J%-Rqphp;S^D#pzVGUeuHINTzCMwy zdw*qcD|j#$Y~KjBuQsgrWrIB{LtDQ3oG-ND3#~R}eUX*^7cPg`@{9oayGIZYJ(nbL zM6hSWiDK|qEP2c(J7}KQDzI{#oDgJ36PfiOW-@V{ydyBFgM?j{w>LAtpr)5>5Pu0q zP+Qz*{{;SbR=7(hiZhOZCtii|?tD*(OrQ<%GFrIC3LWq}T2s=l)}o29(xEp7O{>O*;RdZKU|t`mY~3Yv@5iWiUPZm{tLTu z!>+2#Ub!p48&7m>&0)L38?aWm036BqaxiZYp_@r##zvce91f`|rm69zkajDn8+u4h z$3sc@;f@gjDcqM(%JRXo?>U~>Qo_^{^+gDNZ1*`1%$7Sd&96jDx}Hn{eDT#-ZoswF zB3!R;A&+Fw$pMPb1JfPFff_}DC`5@OD~w>AP*G&3?1CT`EEix(sup0%ZPi|a5KOm0>L>8| za=jfXMM~kz@?xN-zz8DRn!~Eeq!oxwHAAz!OoND3i}Sm!EG+py#0me)5XbNqU?
    HBi{uGlO0iNF22kDJEp5EBg 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 diff --git a/containers/tests.py b/containers/tests.py index 60ebdf7..7ce503c 100644 --- a/containers/tests.py +++ b/containers/tests.py @@ -1,48 +1,3 @@ -from django.test import TestCase, Client -from django.urls import reverse -from django.contrib.auth import get_user_model -from containers.models import Container -from common.models import LinesModel, ContainerTypeModel -from preinfo.models import Preinfo +from django.test import TestCase -class ContainerViewsTestCase(TestCase): - def setUp(self): - self.client = Client() - DepotUser = get_user_model() - self.user = DepotUser.objects.create_user(username='testuser', password='password', user_type='E') - self.client.login(username='testuser', password='password') - self.line = LinesModel.objects.create(name='Test Line') - self.container_type = ContainerTypeModel.objects.create(name='20ft') - self.preinfo = Preinfo.objects.create(number='PRE123', line=self.line, container_type=self.container_type) - self.container = Container.objects.create( - number='TEST1234567', - line=self.line, - container_type=self.container_type, - received_by=self.user, - preinfo=self.preinfo - ) - - def test_container_list_view(self): - response = self.client.get(reverse('container-list')) - self.assertEqual(response.status_code, 200) - self.assertTemplateUsed(response, 'containers/container-list.html') - self.assertContains(response, self.container.number) - - def test_container_receive_view(self): - response = self.client.post(reverse('container-receive'), { - 'number': 'TEST7654321', - 'line': self.line.id, - 'container_type': self.container_type.id, - 'preinfo': self.preinfo.id, - }) - self.assertEqual(response.status_code, 302) - self.assertTrue(Container.objects.filter(number='TEST7654321').exists()) - - def test_container_expedition_view(self): - response = self.client.post(reverse('container-expedition', args=[self.container.id]), { - 'expedition_vehicle': 'TRUCK123', - }) - self.assertEqual(response.status_code, 302) - self.container.refresh_from_db() - self.assertTrue(self.container.expedited) - self.assertEqual(self.container.expedition_vehicle, 'TRUCK123') \ No newline at end of file +# Create your tests here. diff --git a/payments/__pycache__/models.cpython-313.pyc b/payments/__pycache__/models.cpython-313.pyc index 7d3f5e60f28b3d64607213eba7175822b190ea44..298a23261c92a07c4d14f57784237eadf4140ce9 100644 GIT binary patch delta 1323 zcmZ`&-A~g{6z|=-jjh|zsS!|Er}3krAQ}@Dlo$bHlre@FzX){g1xmWs+;$4QV0(Ze;y+-F!Duw`CQ<*;o{+R&tCl>p6RZW|#yIjw4r)z)34FnJvVZev0kJu9A6^pc866KG-oj2k;H z>m}SxhzV7B3+tm6&=cK#2lt*)F@4AHo^eBpj%CA5Fhanm#ZyvDvQBXn1U-m=i^^bc10Pn7#lI7}8!R)mqVFj5f;WufpPwbn_u zKkce?^p!jMoc5fP8*v)tx2b{?FMJ7daYaD$tO|FR%S!chHrO5V8lnOIUWjaD4m!)% zHAze$a2sR;01UzdcwW{s+8BCVd*R48J`hrn9~PzGWA$`C^c*$N`{DK(NRXA1WDA^Z z2G|O)4S)w|1Mu?hV3Hd->korOK#MA-VauAqrrip9ST33+!zTOS&;o9qU;}7ipLK-6 zC2o$6M-In4{@_t=EMG;P$a^HxJ2kVYnGQzNbw0z$B8K#8G@V|ekjwXCTP9hSubIA% zrq_Atk1^F_l$B~1rxIeBLJLIX7`Q8Qrlr~1Iegf#@fapO8rD_P53Y!94y*E%<+mGC zWlf(NCNg_&UV$a(kVB9cK&01V6Jd|dA$AKd!rQ@fl)e-$w!n`yU3)-PSzXhRb+HFy ztIBtY)+gheMwY7Okr-mRAfE+4Fq`q}&6neIO|5Th*7#50uTcn#M!}Bw_ufi>#M{^Z zx2sbS2(X;EI%_jH9oI2Hz~DfvNzjm#ap8B@x>*HC7H?bi6tdPnMtK3 zsm1Z}MKVAOK7(wTY{6)m8@bZ?Prj=9lJ`6d8gfK}HlAfe2#|VG1Ke zCzo@Euz@8^Ctu`z&nP|lAlF((waNM1@)8hx*)i;$yo_5u0gJJ>SbS4U5{q1bhN}T_ zu^5nOW4Ix$y(0R8lw}A14H1FTiZj*g@q@3J= z%vv0&$r=};D#v@KUREQIGa3K@i_4P@pfX(HH4WY1R&Hk|5v$XZMT z3{`+R6=FW^qpff%KL)Xo7I(k*LDB1k(cM1*UQC5|KSp_fnnea^{3aZv_y{&M-V4}9 zMKLP!KESpMDFVZ_ANr)A8X4noXSyW}^mnPzet<8j-8iz+qx2I0JVu6CSAZhSO)DG` zt=gHAAlfXhqnzQQ+*Wt%T;=D6yDHZu@>Zv8II`}_?kbXVXx(<>iip{sh~Lhvp{(l= zF>jbI!lWbHyfa#30TFE)4pp>0*3Atxg|Ut474kXA%sZ?tnRq+C`$ZyTO{7~S)HtPh z%~hztnWwM~4y8y%ij}2UMH((k!=LU{MkdN56F;U((r`&iRiwqTv{;dr%F@zdSFALc z_?D}TCd;GAQew6=`=m7R^kS`&N*b4rv1G|kezH~g)zkH+u-19r6D zFMekd4^c*gYl9N(oC*pP2HGR0FKLU;sXzd`&6T>BdshRg6({;m1iJOhl^n)?S3o&k3N delta 639 zcmZ`%!D`e{6n!`EB{jA)O|@-CZS73ED6!C$2vcM>(jtmQ=51UI4VjsAnwm-ACWA{C zf+#Me1b@I?H~j?h6J$1Oz^%}Y2%~%NOPqzMFXZH$ zy*R1X>N}*~Fv%p`XZHZ1&T4F(N$o0=yaR1>qp4Al~kGv6w`Epw77r vQsJe0i&%c)HvI#m&~M>3Njh?t)Cj(F0QkaIei&=edU5zVd>Q^^M2pH_&Z~KA diff --git a/readme.md b/readme.md index ff4d241..7a9738d 100644 --- a/readme.md +++ b/readme.md @@ -23,13 +23,16 @@ DepoT е софтуер за управление на контейнерно д Проектът е структуриран по модулен начин, което позволява лесно добавяне на нови функционалности и поддръжка на съществуващите. ## Инсталация -За пускане на проекта е необходимо да се вдигне контейнер, в който са инсталирани PostgreSQL и minIO. MinIO е S3 съвместим bucket storage, който се използва за съхранение на снимки и други файлове, които се прикачват към контейнерите. Той е идеален за разработка, тъй като може да се използва локално и е съвместим с AWS S3 API. +За пускане на проекта локално е необходимо да се вдигне контейнер, в който са инсталирани PostgreSQL и minIO. MinIO е S3 съвместим bucket storage, който се използва за съхранение на снимки и други файлове, които се прикачват към контейнерите. Той е идеален за разработка, тъй като може да се използва локално и е съвместим с AWS S3 API. Това става с docker-compose.dev.yml, който е в корена на проекта. след това трябва да се пуснат миграциите, за да се попълни базата данни с основни номенклатури и други данни, които са необходими за работата на проекта, както и има създаден суперпотребител: username: kikimor password: shushunka1 +В конфигурацията на проекта трябва да се добави environment vairable: DJANGO_SETTINGS_MODULE=DepoT.settings.development +Това е необходимо, за да се заредят development настройките на проекта, които са в DepoT/settings/development.py. + След стартиране на системата, се отваря landing страницата на DepoT. В нея има малко информация за депото, login бутон и бутон за таблото за шофьорите. При логване, в зависимост от типа на потребителя, се отваря различен dashboard. За служители и клиенти той изглежда почти еднакво, а за операторите е различен, тъй като те ползват таблети и интерфейса трябва да е по-опростен и удобен за работа с пръст(ръкавици). @@ -38,4 +41,4 @@ password: shushunka1 В repository (https://git.kikimor.com) има нов branch (deploy_branch). В него има docker-compose-deploy.yml,с който се стартират всички контейнери (postgres, minio, createbuckets и самото приложение). Тук в контейнера се прави collectstatic, след което се качват в bucket "static" на minio и се сервират през него. -P.S.Тъй като не остана много време, не знам дали ще успея да обединя двата branch-а, затова последните промени засега ще са само в deploy_branch, който вие няма да можете да стартирате. \ No newline at end of file +P.S.Тъй като не остана много време, не знам дали ще успея да обединя двата branch-а, затова последните промени засега ще са само в deploy_branch, който вие няма да можете да стартирате.