BoofHill 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- boofhill-0.1.0/BoofHill.egg-info/PKG-INFO +10 -0
- boofhill-0.1.0/BoofHill.egg-info/SOURCES.txt +8 -0
- boofhill-0.1.0/BoofHill.egg-info/dependency_links.txt +1 -0
- boofhill-0.1.0/BoofHill.egg-info/requires.txt +1 -0
- boofhill-0.1.0/BoofHill.egg-info/top_level.txt +1 -0
- boofhill-0.1.0/BoofHill.py +414 -0
- boofhill-0.1.0/PKG-INFO +10 -0
- boofhill-0.1.0/README.md +1 -0
- boofhill-0.1.0/pyproject.toml +17 -0
- boofhill-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Django>=3.2
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
BoofHill
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
from django.shortcuts import render, redirect, get_object_or_404
|
|
2
|
+
from django.contrib import messages
|
|
3
|
+
from .models import MaterialType, PartnerProduct, Partners, Product, ProductType
|
|
4
|
+
|
|
5
|
+
# ---------------------- Product ----------------------
|
|
6
|
+
def product_list(request):
|
|
7
|
+
products = Product.objects.select_related('product_type').all()
|
|
8
|
+
return render(request, 'product_list.html', {'products': products})
|
|
9
|
+
|
|
10
|
+
def product_create(request):
|
|
11
|
+
if request.method == 'POST':
|
|
12
|
+
name = request.POST.get('name')
|
|
13
|
+
art = request.POST.get('art')
|
|
14
|
+
min_price = request.POST.get('min_price')
|
|
15
|
+
product_type_id = request.POST.get('product_type')
|
|
16
|
+
product_type_obj = get_object_or_404(ProductType, id=product_type_id)
|
|
17
|
+
Product.objects.create(
|
|
18
|
+
product_type=product_type_obj,
|
|
19
|
+
product_name=name,
|
|
20
|
+
min_price=min_price,
|
|
21
|
+
art=art,
|
|
22
|
+
)
|
|
23
|
+
messages.success(request, 'Продукт успешно создан.')
|
|
24
|
+
return redirect('product_list')
|
|
25
|
+
types = ProductType.objects.all()
|
|
26
|
+
return render(request, 'product_form.html', {'title': 'Создание продукта', 'types': types, 'is_edit': False})
|
|
27
|
+
|
|
28
|
+
def product_edit(request, pk):
|
|
29
|
+
product = get_object_or_404(Product, id=pk)
|
|
30
|
+
if request.method == 'POST':
|
|
31
|
+
product.product_name = request.POST.get('name')
|
|
32
|
+
product.art = request.POST.get('art')
|
|
33
|
+
product.min_price = request.POST.get('min_price')
|
|
34
|
+
product_type_id = request.POST.get('product_type')
|
|
35
|
+
product.product_type = get_object_or_404(ProductType, id=product_type_id)
|
|
36
|
+
product.save()
|
|
37
|
+
messages.success(request, 'Продукт успешно обновлён.')
|
|
38
|
+
return redirect('product_list')
|
|
39
|
+
types = ProductType.objects.all()
|
|
40
|
+
return render(request, 'product_form.html', {'title': 'Редактирование продукта', 'product': product, 'types': types, 'is_edit': True})
|
|
41
|
+
|
|
42
|
+
def product_delete(request, pk):
|
|
43
|
+
product = get_object_or_404(Product, id=pk)
|
|
44
|
+
if request.method == 'POST':
|
|
45
|
+
product.delete()
|
|
46
|
+
messages.success(request, 'Продукт удалён.')
|
|
47
|
+
return redirect('product_list')
|
|
48
|
+
return render(request, 'confirm_delete.html', {'object': product, 'type_name': 'Продукт'})
|
|
49
|
+
|
|
50
|
+
# ---------------------- ProductType ----------------------
|
|
51
|
+
def producttype_list(request):
|
|
52
|
+
types = ProductType.objects.all()
|
|
53
|
+
return render(request, 'producttype_list.html', {'types': types})
|
|
54
|
+
|
|
55
|
+
def producttype_create(request):
|
|
56
|
+
if request.method == 'POST':
|
|
57
|
+
name = request.POST.get('name')
|
|
58
|
+
kef = request.POST.get('kef')
|
|
59
|
+
ProductType.objects.create(product_type_name=name, kef=kef)
|
|
60
|
+
messages.success(request, 'Тип продукта создан.')
|
|
61
|
+
return redirect('producttype_list')
|
|
62
|
+
return render(request, 'producttype_form.html', {'title': 'Создание типа продукта', 'is_edit': False})
|
|
63
|
+
|
|
64
|
+
def producttype_edit(request, pk):
|
|
65
|
+
obj = get_object_or_404(ProductType, id=pk)
|
|
66
|
+
if request.method == 'POST':
|
|
67
|
+
obj.product_type_name = request.POST.get('name')
|
|
68
|
+
obj.kef = request.POST.get('kef')
|
|
69
|
+
obj.save()
|
|
70
|
+
messages.success(request, 'Тип продукта обновлён.')
|
|
71
|
+
return redirect('producttype_list')
|
|
72
|
+
return render(request, 'producttype_form.html', {'title': 'Редактирование типа продукта', 'type': obj, 'is_edit': True})
|
|
73
|
+
|
|
74
|
+
def producttype_delete(request, pk):
|
|
75
|
+
obj = get_object_or_404(ProductType, id=pk)
|
|
76
|
+
if request.method == 'POST':
|
|
77
|
+
obj.delete()
|
|
78
|
+
messages.success(request, 'Тип продукта удалён.')
|
|
79
|
+
return redirect('producttype_list')
|
|
80
|
+
return render(request, 'confirm_delete.html', {'object': obj, 'type_name': 'Тип продукта'})
|
|
81
|
+
|
|
82
|
+
# ---------------------- Partners ----------------------
|
|
83
|
+
def partners_list(request):
|
|
84
|
+
partners = Partners.objects.all()
|
|
85
|
+
return render(request, 'partners_list.html', {'partners': partners})
|
|
86
|
+
|
|
87
|
+
def partners_create(request):
|
|
88
|
+
if request.method == 'POST':
|
|
89
|
+
Partners.objects.create(
|
|
90
|
+
parner_type=request.POST.get('parner_type'),
|
|
91
|
+
parner_name=request.POST.get('parner_name'),
|
|
92
|
+
director=request.POST.get('director'),
|
|
93
|
+
email=request.POST.get('email'),
|
|
94
|
+
phone=request.POST.get('phone'),
|
|
95
|
+
adres=request.POST.get('adres'),
|
|
96
|
+
inn=request.POST.get('inn'),
|
|
97
|
+
reiting=request.POST.get('reiting')
|
|
98
|
+
)
|
|
99
|
+
messages.success(request, 'Партнёр создан.')
|
|
100
|
+
return redirect('partners_list')
|
|
101
|
+
return render(request, 'partners_form.html', {'title': 'Создание партнёра', 'is_edit': False})
|
|
102
|
+
|
|
103
|
+
def partners_edit(request, pk):
|
|
104
|
+
obj = get_object_or_404(Partners, id=pk)
|
|
105
|
+
if request.method == 'POST':
|
|
106
|
+
obj.parner_type = request.POST.get('parner_type')
|
|
107
|
+
obj.parner_name = request.POST.get('parner_name')
|
|
108
|
+
obj.director = request.POST.get('director')
|
|
109
|
+
obj.email = request.POST.get('email')
|
|
110
|
+
obj.phone = request.POST.get('phone')
|
|
111
|
+
obj.adres = request.POST.get('adres')
|
|
112
|
+
obj.inn = request.POST.get('inn')
|
|
113
|
+
obj.reiting = request.POST.get('reiting')
|
|
114
|
+
obj.save()
|
|
115
|
+
messages.success(request, 'Партнёр обновлён.')
|
|
116
|
+
return redirect('partners_list')
|
|
117
|
+
return render(request, 'partners_form.html', {'title': 'Редактирование партнёра', 'partner': obj, 'is_edit': True})
|
|
118
|
+
|
|
119
|
+
def partners_delete(request, pk):
|
|
120
|
+
obj = get_object_or_404(Partners, id=pk)
|
|
121
|
+
if request.method == 'POST':
|
|
122
|
+
obj.delete()
|
|
123
|
+
messages.success(request, 'Партнёр удалён.')
|
|
124
|
+
return redirect('partners_list')
|
|
125
|
+
return render(request, 'confirm_delete.html', {'object': obj, 'type_name': 'Партнёра'})
|
|
126
|
+
|
|
127
|
+
# ---------------------- MaterialType ----------------------
|
|
128
|
+
def materialtype_list(request):
|
|
129
|
+
materials = MaterialType.objects.all()
|
|
130
|
+
return render(request, 'materialtype_list.html', {'materials': materials})
|
|
131
|
+
|
|
132
|
+
def materialtype_create(request):
|
|
133
|
+
if request.method == 'POST':
|
|
134
|
+
MaterialType.objects.create(
|
|
135
|
+
material_type=request.POST.get('material_type'),
|
|
136
|
+
brak=request.POST.get('brak')
|
|
137
|
+
)
|
|
138
|
+
messages.success(request, 'Тип материала создан.')
|
|
139
|
+
return redirect('materialtype_list')
|
|
140
|
+
return render(request, 'materialtype_form.html', {'title': 'Создание типа материала', 'is_edit': False})
|
|
141
|
+
|
|
142
|
+
def materialtype_edit(request, pk):
|
|
143
|
+
obj = get_object_or_404(MaterialType, id=pk)
|
|
144
|
+
if request.method == 'POST':
|
|
145
|
+
obj.material_type = request.POST.get('material_type')
|
|
146
|
+
obj.brak = request.POST.get('brak')
|
|
147
|
+
obj.save()
|
|
148
|
+
messages.success(request, 'Тип материала обновлён.')
|
|
149
|
+
return redirect('materialtype_list')
|
|
150
|
+
return render(request, 'materialtype_form.html', {'title': 'Редактирование типа материала', 'material': obj, 'is_edit': True})
|
|
151
|
+
|
|
152
|
+
def materialtype_delete(request, pk):
|
|
153
|
+
obj = get_object_or_404(MaterialType, id=pk)
|
|
154
|
+
if request.method == 'POST':
|
|
155
|
+
obj.delete()
|
|
156
|
+
messages.success(request, 'Тип материала удалён.')
|
|
157
|
+
return redirect('materialtype_list')
|
|
158
|
+
return render(request, 'confirm_delete.html', {'object': obj, 'type_name': 'Тип материала'})
|
|
159
|
+
|
|
160
|
+
# ---------------------- PartnerProduct (связь продукт-партнёр) ----------------------
|
|
161
|
+
def partnerproduct_list(request):
|
|
162
|
+
items = PartnerProduct.objects.select_related('product', 'partner_name').all()
|
|
163
|
+
return render(request, 'partnerproduct_list.html', {'items': items})
|
|
164
|
+
|
|
165
|
+
def partnerproduct_create(request):
|
|
166
|
+
if request.method == 'POST':
|
|
167
|
+
product_id = request.POST.get('product')
|
|
168
|
+
partner_id = request.POST.get('partner_name')
|
|
169
|
+
kol_vo = request.POST.get('kol_vo')
|
|
170
|
+
product = get_object_or_404(Product, id=product_id)
|
|
171
|
+
partner = get_object_or_404(Partners, id=partner_id) # поле partner_name ссылается на Partners, но имя поля сбивает
|
|
172
|
+
PartnerProduct.objects.create(
|
|
173
|
+
product=product,
|
|
174
|
+
partner_name=partner,
|
|
175
|
+
kol_vo=kol_vo
|
|
176
|
+
)
|
|
177
|
+
messages.success(request, 'Связь продукт-партнёр создана.')
|
|
178
|
+
return redirect('partnerproduct_list')
|
|
179
|
+
products = Product.objects.all()
|
|
180
|
+
partners = Partners.objects.all()
|
|
181
|
+
return render(request, 'partnerproduct_form.html', {
|
|
182
|
+
'title': 'Создание связи',
|
|
183
|
+
'products': products,
|
|
184
|
+
'partners': partners,
|
|
185
|
+
'is_edit': False
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
def partnerproduct_edit(request, pk):
|
|
189
|
+
obj = get_object_or_404(PartnerProduct, id=pk)
|
|
190
|
+
if request.method == 'POST':
|
|
191
|
+
obj.product = get_object_or_404(Product, id=request.POST.get('product'))
|
|
192
|
+
obj.partner_name = get_object_or_404(Partners, id=request.POST.get('partner_name'))
|
|
193
|
+
obj.kol_vo = request.POST.get('kol_vo')
|
|
194
|
+
obj.save()
|
|
195
|
+
messages.success(request, 'Связь обновлена.')
|
|
196
|
+
return redirect('partnerproduct_list')
|
|
197
|
+
products = Product.objects.all()
|
|
198
|
+
partners = Partners.objects.all()
|
|
199
|
+
return render(request, 'partnerproduct_form.html', {
|
|
200
|
+
'title': 'Редактирование связи',
|
|
201
|
+
'item': obj,
|
|
202
|
+
'products': products,
|
|
203
|
+
'partners': partners,
|
|
204
|
+
'is_edit': True
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
def partnerproduct_delete(request, pk):
|
|
208
|
+
obj = get_object_or_404(PartnerProduct, id=pk)
|
|
209
|
+
if request.method == 'POST':
|
|
210
|
+
obj.delete()
|
|
211
|
+
messages.success(request, 'Связь удалена.')
|
|
212
|
+
return redirect('partnerproduct_list')
|
|
213
|
+
return render(request, 'confirm_delete.html', {'object': obj, 'type_name': 'связь продукт-партнёр'})
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
# URLS------------------------------------------------------------
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
from django.urls import path
|
|
224
|
+
from . import views
|
|
225
|
+
from django.views.generic import TemplateView
|
|
226
|
+
app_name = 'your_app_name' # замените на реальное имя приложения
|
|
227
|
+
|
|
228
|
+
urlpatterns = [
|
|
229
|
+
# Product
|
|
230
|
+
path('', TemplateView.as_view(template_name='home.html'), name='home'),
|
|
231
|
+
path('products/', views.product_list, name='product_list'),
|
|
232
|
+
path('products/create/', views.product_create, name='product_create'),
|
|
233
|
+
path('products/edit/<int:pk>/', views.product_edit, name='product_edit'),
|
|
234
|
+
path('products/delete/<int:pk>/', views.product_delete, name='product_delete'),
|
|
235
|
+
|
|
236
|
+
# ProductType
|
|
237
|
+
path('product-types/', views.producttype_list, name='producttype_list'),
|
|
238
|
+
path('product-types/create/', views.producttype_create, name='producttype_create'),
|
|
239
|
+
path('product-types/edit/<int:pk>/', views.producttype_edit, name='producttype_edit'),
|
|
240
|
+
path('product-types/delete/<int:pk>/', views.producttype_delete, name='producttype_delete'),
|
|
241
|
+
|
|
242
|
+
# Partners
|
|
243
|
+
path('partners/', views.partners_list, name='partners_list'),
|
|
244
|
+
path('partners/create/', views.partners_create, name='partners_create'),
|
|
245
|
+
path('partners/edit/<int:pk>/', views.partners_edit, name='partners_edit'),
|
|
246
|
+
path('partners/delete/<int:pk>/', views.partners_delete, name='partners_delete'),
|
|
247
|
+
|
|
248
|
+
# MaterialType
|
|
249
|
+
path('material-types/', views.materialtype_list, name='materialtype_list'),
|
|
250
|
+
path('material-types/create/', views.materialtype_create, name='materialtype_create'),
|
|
251
|
+
path('material-types/edit/<int:pk>/', views.materialtype_edit, name='materialtype_edit'),
|
|
252
|
+
path('material-types/delete/<int:pk>/', views.materialtype_delete, name='materialtype_delete'),
|
|
253
|
+
|
|
254
|
+
# PartnerProduct (связующая таблица)
|
|
255
|
+
path('partner-products/', views.partnerproduct_list, name='partnerproduct_list'),
|
|
256
|
+
path('partner-products/create/', views.partnerproduct_create, name='partnerproduct_create'),
|
|
257
|
+
path('partner-products/edit/<int:pk>/', views.partnerproduct_edit, name='partnerproduct_edit'),
|
|
258
|
+
path('partner-products/delete/<int:pk>/', views.partnerproduct_delete, name='partnerproduct_delete'),
|
|
259
|
+
]
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
#HTML----------------------------------------------------
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
<!DOCTYPE html>
|
|
272
|
+
<html lang="ru">
|
|
273
|
+
<head>
|
|
274
|
+
<meta charset="UTF-8">
|
|
275
|
+
<title>{% block title %}Управление{% endblock %}</title>
|
|
276
|
+
<style>
|
|
277
|
+
body { font-family: Arial, sans-serif; margin: 20px; }
|
|
278
|
+
nav a { margin-right: 15px; text-decoration: none; color: #2c3e50; }
|
|
279
|
+
nav a:hover { text-decoration: underline; }
|
|
280
|
+
hr { margin: 20px 0; }
|
|
281
|
+
.messages { border: 1px solid #ccc; padding: 10px; margin-bottom: 20px; background: #f9f9f9; }
|
|
282
|
+
table { border-collapse: collapse; width: 100%; }
|
|
283
|
+
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
|
|
284
|
+
th { background-color: #f2f2f2; }
|
|
285
|
+
.btn { display: inline-block; margin: 5px 0; padding: 5px 10px; text-decoration: none; background: #eee; color: #000; border: 1px solid #ccc; }
|
|
286
|
+
.btn-danger { background: #ffdddd; }
|
|
287
|
+
.form-group { margin-bottom: 15px; }
|
|
288
|
+
label { display: inline-block; width: 150px; }
|
|
289
|
+
input, select { padding: 5px; width: 250px; }
|
|
290
|
+
button { padding: 6px 12px; background: #2c3e50; color: white; border: none; cursor: pointer; }
|
|
291
|
+
button:hover { background: #1a252f; }
|
|
292
|
+
</style>
|
|
293
|
+
</head>
|
|
294
|
+
<body>
|
|
295
|
+
<nav>
|
|
296
|
+
<a href="{% url 'home' %}">Главная</a>
|
|
297
|
+
<a href="{% url 'product_list' %}">Продукты</a>
|
|
298
|
+
<a href="{% url 'producttype_list' %}">Типы продуктов</a>
|
|
299
|
+
<a href="{% url 'partners_list' %}">Партнёры</a>
|
|
300
|
+
<a href="{% url 'materialtype_list' %}">Типы материалов</a>
|
|
301
|
+
<a href="{% url 'partnerproduct_list' %}">Связи продукт-партнёр</a>
|
|
302
|
+
</nav>
|
|
303
|
+
<hr>
|
|
304
|
+
{% if messages %}
|
|
305
|
+
<div class="messages">
|
|
306
|
+
{% for message in messages %}
|
|
307
|
+
<div>{{ message }}</div>
|
|
308
|
+
{% endfor %}
|
|
309
|
+
</div>
|
|
310
|
+
{% endif %}
|
|
311
|
+
{% block content %}{% endblock %}
|
|
312
|
+
</body>
|
|
313
|
+
</html>
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
#base.html
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
{% extends 'base.html' %}
|
|
322
|
+
{% block title %}Главная{% endblock %}
|
|
323
|
+
{% block content %}
|
|
324
|
+
<h1>Добро пожаловать</h1>
|
|
325
|
+
<p>Система управления продуктами, партнёрами и материалами.</p>
|
|
326
|
+
<p>Выберите раздел в меню.</p>
|
|
327
|
+
{% endblock %}
|
|
328
|
+
|
|
329
|
+
#product_list
|
|
330
|
+
{% extends 'base.html' %}
|
|
331
|
+
{% block title %}Продукты{% endblock %}
|
|
332
|
+
{% block content %}
|
|
333
|
+
<h2>Продукты</h2>
|
|
334
|
+
<p><a href="{% url 'product_create' %}" class="btn">➕ Добавить продукт</a></p>
|
|
335
|
+
<table>
|
|
336
|
+
<thead>
|
|
337
|
+
<tr><th>ID</th><th>Название</th><th>Артикул</th><th>Мин. цена</th><th>Тип</th><th></th></tr>
|
|
338
|
+
</thead>
|
|
339
|
+
<tbody>
|
|
340
|
+
{% for p in products %}
|
|
341
|
+
<tr>
|
|
342
|
+
<td>{{ p.id }}</td><td>{{ p.product_name }}</td><td>{{ p.art }}</td>
|
|
343
|
+
<td>{{ p.min_price }}</td><td>{{ p.product_type.product_type_name|default:"—" }}</td>
|
|
344
|
+
<td><a href="{% url 'product_edit' p.id %}">✏️</a> | <a href="{% url 'product_delete' p.id %}">🗑️</a></td>
|
|
345
|
+
</tr>
|
|
346
|
+
{% empty %}
|
|
347
|
+
<td><td colspan="6">Нет данных</td></tr>
|
|
348
|
+
{% endfor %}
|
|
349
|
+
</tbody>
|
|
350
|
+
</table>
|
|
351
|
+
{% endblock %}
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
#product_form.html
|
|
358
|
+
{% extends 'base.html' %}
|
|
359
|
+
{% block title %}{{ title }}{% endblock %}
|
|
360
|
+
{% block content %}
|
|
361
|
+
<h2>{{ title }}</h2>
|
|
362
|
+
<form method="post">
|
|
363
|
+
{% csrf_token %}
|
|
364
|
+
<div class="form-group"><label>Название:</label> <input type="text" name="name" value="{{ product.product_name|default:'' }}" required></div>
|
|
365
|
+
<div class="form-group"><label>Артикул:</label> <input type="text" name="art" value="{{ product.art|default:'' }}" required></div>
|
|
366
|
+
<div class="form-group"><label>Мин. цена:</label> <input type="number" step="0.01" name="min_price" value="{{ product.min_price|default:'' }}" required></div>
|
|
367
|
+
<div class="form-group"><label>Тип продукта:</label>
|
|
368
|
+
<select name="product_type" required>
|
|
369
|
+
<option value="">-- Выберите --</option>
|
|
370
|
+
{% for t in types %}
|
|
371
|
+
<option value="{{ t.id }}" {% if product.product_type.id == t.id %}selected{% endif %}>{{ t.product_type_name }}</option>
|
|
372
|
+
{% endfor %}
|
|
373
|
+
</select>
|
|
374
|
+
</div>
|
|
375
|
+
<button type="submit">Сохранить</button>
|
|
376
|
+
<a href="{% url 'product_list' %}" class="btn">Отмена</a>
|
|
377
|
+
</form>
|
|
378
|
+
{% endblock %}
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
#producttype_list.html
|
|
382
|
+
|
|
383
|
+
{% extends 'base.html' %}
|
|
384
|
+
{% block title %}Типы продуктов{% endblock %}
|
|
385
|
+
{% block content %}
|
|
386
|
+
<h2>Типы продуктов</h2>
|
|
387
|
+
<p><a href="{% url 'producttype_create' %}" class="btn">➕ Добавить тип</a></p>
|
|
388
|
+
<table>
|
|
389
|
+
<thead><tr><th>ID</th><th>Название</th><th>Коэффициент</th><th></th></tr></thead>
|
|
390
|
+
<tbody>
|
|
391
|
+
{% for t in types %}
|
|
392
|
+
<tr>
|
|
393
|
+
<td>{{ t.id }}</td><td>{{ t.product_type_name }}</td><td>{{ t.kef }}</td>
|
|
394
|
+
<td><a href="{% url 'producttype_edit' t.id %}">✏️</a> | <a href="{% url 'producttype_delete' t.id %}">🗑️</a></td>
|
|
395
|
+
</tr>
|
|
396
|
+
{% empty %}<tr><td colspan="4">Нет данных</td></tr>{% endfor %}
|
|
397
|
+
</tbody>
|
|
398
|
+
</table>
|
|
399
|
+
{% endblock %}
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
#producttype_form.html
|
|
403
|
+
{% extends 'base.html' %}
|
|
404
|
+
{% block title %}{{ title }}{% endblock %}
|
|
405
|
+
{% block content %}
|
|
406
|
+
<h2>{{ title }}</h2>
|
|
407
|
+
<form method="post">
|
|
408
|
+
{% csrf_token %}
|
|
409
|
+
<div class="form-group"><label>Название:</label> <input type="text" name="name" value="{{ type.product_type_name|default:'' }}" required></div>
|
|
410
|
+
<div class="form-group"><label>Коэффициент:</label> <input type="number" step="0.01" name="kef" value="{{ type.kef|default:'' }}" required></div>
|
|
411
|
+
<button type="submit">Сохранить</button>
|
|
412
|
+
<a href="{% url 'producttype_list' %}" class="btn">Отмена</a>
|
|
413
|
+
</form>
|
|
414
|
+
{% endblock %}
|
boofhill-0.1.0/PKG-INFO
ADDED
boofhill-0.1.0/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
че по кайфу)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "BoofHill" # Уникальное имя вашего пакета
|
|
7
|
+
version = "0.1.0" # Версия
|
|
8
|
+
authors = [{ name = "Ваше Имя", email = "your@email.com" }]
|
|
9
|
+
description = "Описание вашего Django-приложения"
|
|
10
|
+
readme = "README.md"
|
|
11
|
+
requires-python = ">=3.8"
|
|
12
|
+
dependencies = [
|
|
13
|
+
"Django>=3.2",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
[tool.setuptools]
|
|
17
|
+
py-modules = ["BoofHill"] # 👈 Это ключевая строка для одного файла
|
boofhill-0.1.0/setup.cfg
ADDED