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.
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.4
2
+ Name: BoofHill
3
+ Version: 0.1.0
4
+ Summary: Описание вашего Django-приложения
5
+ Author-email: Ваше Имя <your@email.com>
6
+ Requires-Python: >=3.8
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: Django>=3.2
9
+
10
+ че по кайфу)
@@ -0,0 +1,8 @@
1
+ BoofHill.py
2
+ README.md
3
+ pyproject.toml
4
+ BoofHill.egg-info/PKG-INFO
5
+ BoofHill.egg-info/SOURCES.txt
6
+ BoofHill.egg-info/dependency_links.txt
7
+ BoofHill.egg-info/requires.txt
8
+ BoofHill.egg-info/top_level.txt
@@ -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 %}
@@ -0,0 +1,10 @@
1
+ Metadata-Version: 2.4
2
+ Name: BoofHill
3
+ Version: 0.1.0
4
+ Summary: Описание вашего Django-приложения
5
+ Author-email: Ваше Имя <your@email.com>
6
+ Requires-Python: >=3.8
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: Django>=3.2
9
+
10
+ че по кайфу)
@@ -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"] # 👈 Это ключевая строка для одного файла
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+