From a5f35ca3133e795021b0a28f72637f182a48e460 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 27 Jan 2026 19:35:13 +0000 Subject: [PATCH] Ver.02 --- core/__pycache__/models.cpython-311.pyc | Bin 11276 -> 14091 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1032 -> 2914 bytes core/__pycache__/views.cpython-311.pyc | Bin 6549 -> 19611 bytes ...akdown_photo_fleetunit_qr_code_and_more.py | 61 ++++ core/migrations/0003_setup_groups.py | 32 ++ ...fleetunit_qr_code_and_more.cpython-311.pyc | Bin 0 -> 3024 bytes .../0003_setup_groups.cpython-311.pyc | Bin 0 -> 2134 bytes core/models.py | 41 ++- core/templates/base.html | 30 +- core/templates/core/breakdown_form.html | 47 +++ core/templates/core/fleet_detail.html | 331 +++++++++--------- core/templates/core/index.html | 248 ++++++------- core/templates/core/maintenance_detail.html | 133 +++++++ core/templates/core/maintenance_form.html | 46 +++ core/templates/core/maintenance_list.html | 57 +++ core/templates/core/part_request_form.html | 42 +++ core/templates/core/part_request_list.html | 69 ++++ core/urls.py | 19 + core/views.py | 223 +++++++++++- requirements.txt | 3 + 20 files changed, 1069 insertions(+), 313 deletions(-) create mode 100644 core/migrations/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.py create mode 100644 core/migrations/0003_setup_groups.py create mode 100644 core/migrations/__pycache__/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0003_setup_groups.cpython-311.pyc create mode 100644 core/templates/core/breakdown_form.html create mode 100644 core/templates/core/maintenance_detail.html create mode 100644 core/templates/core/maintenance_form.html create mode 100644 core/templates/core/maintenance_list.html create mode 100644 core/templates/core/part_request_form.html create mode 100644 core/templates/core/part_request_list.html diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index ad86ac6869c06923e10ac260bf512620018aeb7e..91a030d8d532f83c7d455c4982d8b9e9f873ff12 100644 GIT binary patch delta 6632 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 Qq<6OZ=znYto6tc27f7$|q5uE@ delta 4033 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 delta 116 zcmaDP*1@5%oR^o20SNLKDl@k*GB7*_abSQG%J|&HxKX2pkt>}wiYtXbm_buu@;R0n z%zm2OlV#b9CpUBWa7zG{0<|*~KVz7Di^HG!1`EezJ|V25t~65(7#D02etI A5C8xG diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index a7e7f8582cceb3168a02ed0b2ad02f58425edc4f..b0cfab87259b1edb27a58e36579acfdc5b3f67ea 100644 GIT binary patch literal 19611 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 Z7R%0|Y#vf}Wr(AP7^FCCfff?U{J&=&2X+7e delta 2385 zcma)7>u(fQ6rY*hnSFI%eeG`PvMXCC6Kty`5S6A6UX}tYrW$pcuxxj3%eFJS%bi)E zwPg8#k!T{-8$*nV(ZolHUyS$%fL{zTFkJGgGKtNMv&7ch5b) zGxu@Mxo1B8g#UPV=$l~B&%twxTPS`N_%IZ&rFo9K%Bh^nYn;w2Jdd)V3A#&h>2AfX zi;AdAilloKkIlI>ukKTPw(QpYdO!)-vZ%G_K_v*XqwoS4-w?@Gl3}#QhQrwH&&B$KA#!kd zg^s4!R%us95JXGV%PP?YsHr}qkj)#$@CQn#Fljs!#;528z1xr4H!13uv*&$9d8WkzSob#RGiUxYiE z6l)dM#hzH_L-BB|Gjf4n;vwNYS&Ctxd)Z>_m`kE#>{e|1o8^ z$M6lbw$CAgl!oV`bCxN#GoF%UP#Qn8)MM*OGL zkEwdGd?U3oR#_dZti&pH&Y7$4v@v3DBYPE_RA=&*@+kSA@&sjd1L8 z*!F_#Z;A!QtftaV#8=p^#1451#S;jx0{k}ulc+?}Gg?J?I*#0qwGB0sJgxtrk6B zgaj?+O9f(B{*7F=f|WcqbCiIm4RbxUJ#-8vbn-|lPtTEpNoPX4d)<54FWp;emp#iZE8b)y)BEMV)y&XunbBV}qbr&HtC{^kg;%`k zM!55G$Z@OhiEeegiYuQ&z_p(2*#a^MyWur(*MGB1$#JI^6xe6m66}wpt~3=CJ9Has zU@fuySn8acM180T7}Wy!(8yJ()?9t&!GI!+uE0|B zgsl93?!u$c5<(TBsc4=-9l{}2OOMuYN_&`*X5!4-AUM(~|6; zgW=q%5Y84xh#*AKz;_(~9)}@BPUW|28r~>7_;x7llQf<9AMX&%T-C@hy#U5o6pibE zYc8JWYYi?_-`pD9RQ>5%gX^hpZVfJ8-`pD9w)*DQ;EvTFwbUc&Ny3_&jUI`!XOFbM s7U7{{KMu<+cTsz9gX#(K@ip#oSRTKN+It&Rn#CvHVHYL>qJ0hj1>Rjgpa1{> diff --git a/core/migrations/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.py b/core/migrations/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.py new file mode 100644 index 0000000..3ef5eab --- /dev/null +++ b/core/migrations/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.py @@ -0,0 +1,61 @@ +# Generated by Django 5.2.7 on 2026-01-27 18:32 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='breakdown', + name='notes', + field=models.TextField(blank=True, null=True, verbose_name='Примечания'), + ), + migrations.AddField( + model_name='breakdown', + name='photo', + field=models.ImageField(blank=True, null=True, upload_to='breakdown_photos/', verbose_name='Фото'), + ), + migrations.AddField( + model_name='fleetunit', + name='qr_code', + field=models.ImageField(blank=True, null=True, upload_to='qrcodes/', verbose_name='QR-код'), + ), + migrations.AddField( + model_name='maintenance', + name='checklist', + field=models.JSONField(blank=True, default=list, verbose_name='Чек-лист'), + ), + migrations.AddField( + model_name='maintenance', + name='mechanic', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_maintenances', to=settings.AUTH_USER_MODEL, verbose_name='Исполнитель'), + ), + migrations.AddField( + model_name='maintenance', + name='parts_used', + field=models.TextField(blank=True, null=True, verbose_name='Использованные запчасти'), + ), + migrations.AddField( + model_name='maintenance', + name='photo', + field=models.ImageField(blank=True, null=True, upload_to='maintenance_photos/', verbose_name='Фото'), + ), + migrations.AddField( + model_name='partrequest', + name='breakdown', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='part_requests', to='core.breakdown', verbose_name='Поломка'), + ), + migrations.AlterField( + model_name='maintenance', + name='m_type', + field=models.CharField(choices=[('TO-250', 'ТО-250'), ('TO-500', 'ТО-500'), ('seasonal', 'Сезонное'), ('special', 'Спец')], max_length=50, verbose_name='Тип ТО'), + ), + ] diff --git a/core/migrations/0003_setup_groups.py b/core/migrations/0003_setup_groups.py new file mode 100644 index 0000000..8f6815e --- /dev/null +++ b/core/migrations/0003_setup_groups.py @@ -0,0 +1,32 @@ +from django.db import migrations + +def create_groups(apps, schema_editor): + Group = apps.get_model('auth', 'Group') + Permission = apps.get_model('auth', 'Permission') + ContentType = apps.get_model('contenttypes', 'ContentType') + + # Define roles + roles = { + 'Главный механик': ['view_fleetunit', 'add_maintenance', 'change_maintenance', 'view_maintenance', 'add_breakdown', 'change_breakdown', 'view_breakdown', 'add_partrequest', 'change_partrequest', 'view_partrequest'], + 'Механик': ['view_fleetunit', 'change_maintenance', 'view_maintenance', 'add_breakdown', 'view_breakdown', 'add_partrequest', 'view_partrequest'], + 'Снабжение': ['view_fleetunit', 'view_partrequest', 'change_partrequest', 'add_partrequest'], + } + + for role_name, perms in roles.items(): + group, created = Group.objects.get_or_create(name=role_name) + for perm_code in perms: + try: + perm = Permission.objects.get(codename=perm_code) + group.permissions.add(perm) + except Permission.DoesNotExist: + pass + +class Migration(migrations.Migration): + dependencies = [ + ('core', '0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more'), + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.RunPython(create_groups), + ] \ No newline at end of file diff --git a/core/migrations/__pycache__/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_breakdown_notes_breakdown_photo_fleetunit_qr_code_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be3e12f52887e4454b1985e6af1d7384e5e7a7c GIT binary patch literal 3024 zcmbtW%Wo4$7~fsLcAbPIoA8Db*7FDFd&_W0;N%}A}tBq&kth3&A_CZLv z1XQ(^id1g&1R`n!6*)vzqarAQL;rwT$p>q$J#jOFL&d4zti6uYM4_m=-kJGk=KFo` z8Q*DYigWPHhiA0EC64=x5y2Cw4xWDkgBu*;5U+D-9(q9+@}YEyXLBJvoR6d<`Di-I za{_mgL*cJE6v2^PEC5;vaoj!lDo;9w_#rM4eagte1W!d9JC0^#?Sw$%c`a+Hj%FG* zjpj{+bvsk#^Sibx@%#Yb-QcjVPg+2{z~N9X9Bc*Y(O|s5gLL>RPgY3B{Jml@g9H?U z87b#`g3Y2ZyphG|TD=!zYw2|;qL0#0!(}KEiZ3=SfL`}%y1fFY5jAaqvjsK3CQb`# z^>G?k^}$U@UTj-y#VfRFLG3=umQ@rK#?85wfX+eIRGwUGZ6pUHw6#7GXxrlU1&GVN zT5Mh^eTOf7ZDe-7W@K8>Mv>X|+L76fg#YD>J!mg_<3D*I$Z`&~pf`P)?SV(L9O{_o z(LU6NB8Zk@< z+ruuCNN#y^EPLOQCGv>e_kKu(Xk<)RjY%3dTwSM)7qK;F+E_8vJch-%U$s63 zJ7A7R#x<-X8YxVejyc;}6Q%eQcG6{~NPZ$K-c_=a2wN;;ttM!wVK|$8CmP zuvfKd^OXM+&2UDHgpKYsCDsU-nV2~D`aCR2A8>(-12Q$ zfmlBvOK|im&P)L(!ULo?T zM%J0|qcfP;Mn%QEBnVwWM6hVdoGr)m7-yqd+8v2<$a z>|kXWW;sUVC&0syF{kkijiQ`tWKAldF)I3b0GAsThf>4J;K;xLjrZvewyHq=6KZuB zHw(CW5&ptG2jSdHD>-52anc=g4aZI5OE}{~1|_FWYtk;L8JuKsO|D*`NhtBdN-fTc zU)XiDUw%rhq?Bq!DXIa9&Qhc>W3fBjZ&;1mKMNc;S9{A*PTE%z4}KRfiU;qC#Y4wD zv9Bohl_R0{=-fcLk(2hYwcVxdou$?tCAstZfuh`bw|(h2Ir$ZlM?HD8D36w7VJZHM zgXRTm%JF}*?PqNJ?{+N>lhhX^J4Iy6ldYm`ZO*x?B(HKlNt02H$T?5W73JI}j9sPH zJ$0HoZ-fYP6WjmN{;k9~7V)63z=RSU1V2S>ap= zy0)RvGrxru7;i3RZ=G`B#*0Lr_T=fJJiR#^cz@LyB$XzbO=QQDouce)&I#UF<$SWv ztP{+T(_j{KIboJ{ZI=aR&t+yQv>U*`!O~)HX*)Q3XJ8L7zWq64uWyks&Zb=9L*G&T zzN7j>47h)tqlWk%IXZWWz1I6d-X=u4vr>UQXsoC5kFqByL+f4GMjNW@8PgcAoC;En z!#_a$;;)p#dkohHKMJFl;?c^v^MQ2?NcJbwcAzPTc%Fyy;P(-(qw*^SgSweRgxla( ZjvnEoWo~_QJzi|-dd3!BY_RHU^$#33Ns9mg literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0003_setup_groups.cpython-311.pyc b/core/migrations/__pycache__/0003_setup_groups.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ca8cf18a05a7c8961d1b35c3a9bc6e683d4e367 GIT binary patch literal 2134 zcmaJ?&2Jk;6rcUFcO5%8NrM|fq83^eCu$r@LaBsWRZUcAXjD-yji^?e-Kp)=-gRep zNg~;j53LlS5>Yv%ph%b=(xUVbkc!GjFZ3T+SC(qc35gT8Md1+j#G7@!aT;K}{_VUs z?_>78H*fAH5-|j0Qd-L2kP!NV5$yqVFt$#@YZV#D;0mb7&2k(v`0Hqv=h0bY2-lGz zVs2h|E{)baZf+1Z*>BygKInB{nF`p%xlebJ;=i4gqj=-NOZQbLTvofjyv3D4p z!LNhfMyOli|3_AML00%rS<#SQkQKAYh}_`-qXEiyI73+zDpFah!5;UHbzp6T>`8Rl z{1|pwiBzIxem>l9EeuU43X^i=erz4AZiJQtUAdx^qhRU1N=!jzp~H&UsokEJWB0pu zTd8!F<@t6ZQH@1;&nUm3!=aleUT5B-ZP7!B2pqbEZcZ(rMd1=!;BHz5g0#kGsHnM4 zj!I{V<(6pd0w%@0Z9{r#T(?XIn~t+o!Zz(X)1p2CDjlQUpXBj^dZmD|1{8i1$PkU-k07l-lq41_o)84_tOFI zSMNdn1~49Z551pVX3bmM#bO4$Z()7Y``-J}dk{!IfCD6&S`our)-3~K1#_7yS?s7q zpbJ#WJGf}ms5Li_b;qU&wqy}ihafqa3P94XQkW&13J^jXpR}+&V>wfcdD}_HA*rPj z=-PS?7c~_ddB-Az6%S!GK@ z4|I%YlbM`V#2I(aH61sD7qRYw!_0z3uG%F{#~IxsIJ46^GGk+7Z>cuaPDu@%*`uW; znrJzE&LMAr7k1X{BXFjws2NXwG4t8X?YC>k>+z9Be55+n?CD<}x;0db+>6(HCK^2x z)pO0>msdw`jn;-X2kX738oj5g)4q&`i-M0jkVmg*Ja9s64i&xN@uOlQ;v<0SlpjZf zuYEK9_4HTg*UtMWD)k3Ym-jC#D-+Fup|!!M1LIEy#vi7=f${plWMg3R)9z(yc>&gZ zBq<;du>8Kyi;4bb>R=<4ewsS^Bz1Ii$x9urr%pFgr&q*gvcHi$_%wO=N%C;bs3%7n z$q_Gjwwrx}jlN+YaS1ThhGuf#is%bKZf|e<3Ued1_hz%Q`>ku@3@1M3VrROej}siA z4%~3G``6Yxz*PS;ScL0v;xshSDR0}P~j!g?J&JT~^`F;y!#n5eD|a3xP{ zCn!>AD2r+Vn^`9}11CpTTU?dKRCa<~sAZMLRrQ*y6
- + FleetManager -