diff --git a/.env b/.env index e9312c9..81eadf2 100644 --- a/.env +++ b/.env @@ -4,8 +4,6 @@ DB_USER=prodman_user DB_PASS=prodman_password_zwE45t! # Настройки Django -# ENV_TYPE=dev -# ENV_TYPE=server DB_HOST=db SECRET_KEY='django-insecure-9p*t_(vtwo144=u)ie8qzb31a8%i(&1w4$0vq#udautexj^vms' # todo потом установить домен для продакшена diff --git a/core/settings.py b/core/settings.py index 2320a87..3eb273a 100644 --- a/core/settings.py +++ b/core/settings.py @@ -63,6 +63,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'shiftflow', # Вот это допиши обязательно! + 'warehouse', ] MIDDLEWARE = [ diff --git a/core/urls.py b/core/urls.py index 401dc10..64b7860 100644 --- a/core/urls.py +++ b/core/urls.py @@ -16,10 +16,13 @@ Including another URLconf """ from django.contrib import admin from django.urls import path, include +from django.views.generic import RedirectView +from django.templatetags.static import static as static_url from django.conf.urls.static import static # <--- Добавьте эту строку from core import settings urlpatterns = [ + path('favicon.ico', RedirectView.as_view(url=static_url('favicon.svg'), permanent=True)), path('admin/', admin.site.urls), # Добавь эту строку, она подключит login, logout и прочие стандартные пути path('accounts/', include('django.contrib.auth.urls')), diff --git a/shiftflow/admin.py b/shiftflow/admin.py index 2862820..d78645a 100644 --- a/shiftflow/admin.py +++ b/shiftflow/admin.py @@ -1,6 +1,6 @@ import os from django.contrib import admin -from .models import Company, EmployeeProfile, Machine, Deal, Material, ProductionTask, Item +from .models import Company, EmployeeProfile, Machine, Deal, ProductionTask, Item # --- Настройка отображения Компаний --- @admin.register(Company) @@ -15,11 +15,6 @@ class DealAdmin(admin.ModelAdmin): search_fields = ('number', 'company__name') list_filter = ('company',) -# --- Настройка отображения Материалов --- -@admin.register(Material) -class MaterialAdmin(admin.ModelAdmin): - search_fields = ('name',) - # --- Задания на производство (База) --- @admin.register(ProductionTask) class ProductionTaskAdmin(admin.ModelAdmin): @@ -50,10 +45,12 @@ class ItemAdmin(admin.ModelAdmin): }), ) - def get_deal(self, obj): return obj.task.deal + def get_deal(self, obj): + return obj.task.deal if obj.task else "-" get_deal.short_description = 'Сделка' - def get_drawing(self, obj): return obj.task.drawing_name + def get_drawing(self, obj): + return obj.task.drawing_name if obj.task else "-" get_drawing.short_description = 'Деталь' # Регистрация станков просто списком diff --git a/shiftflow/migrations/0005_alter_productiontask_material_delete_material.py b/shiftflow/migrations/0005_alter_productiontask_material_delete_material.py new file mode 100644 index 0000000..a65a92f --- /dev/null +++ b/shiftflow/migrations/0005_alter_productiontask_material_delete_material.py @@ -0,0 +1,23 @@ +# Generated by Django 6.0.3 on 2026-03-29 14:16 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shiftflow', '0004_alter_item_options_remove_item_deal_and_more'), + ('warehouse', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='productiontask', + name='material', + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='warehouse.material', verbose_name='Материал'), + ), + migrations.DeleteModel( + name='Material', + ), + ] diff --git a/shiftflow/migrations/0006_alter_item_options_alter_item_status.py b/shiftflow/migrations/0006_alter_item_options_alter_item_status.py new file mode 100644 index 0000000..5071f8c --- /dev/null +++ b/shiftflow/migrations/0006_alter_item_options_alter_item_status.py @@ -0,0 +1,22 @@ +# Generated by Django 6.0.3 on 2026-03-29 16:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('shiftflow', '0005_alter_productiontask_material_delete_material'), + ] + + operations = [ + migrations.AlterModelOptions( + name='item', + options={'ordering': ['-date', 'task__deal'], 'verbose_name': 'Пункт сменки', 'verbose_name_plural': 'Реестр сменных заданий'}, + ), + migrations.AlterField( + model_name='item', + name='status', + field=models.CharField(choices=[('work', 'В работе'), ('done', 'Выполнено'), ('partial', 'Частично'), ('leftover', 'Недодел'), ('imported', 'Импортировано')], default='work', max_length=10, verbose_name='Статус'), + ), + ] diff --git a/shiftflow/models.py b/shiftflow/models.py index efa52b5..9971bb4 100644 --- a/shiftflow/models.py +++ b/shiftflow/models.py @@ -1,6 +1,7 @@ from django.db import models from django.utils import timezone from django.contrib.auth.models import User +from warehouse.models import Material as WarehouseMaterial class Company(models.Model): """ @@ -38,17 +39,6 @@ class Deal(models.Model): class Meta: verbose_name = "Сделка"; verbose_name_plural = "Сделки" -class Material(models.Model): - """ - Справочник ТМЦ (Трубы, листы, профили). - Необходим для точного списания остатков и синхронизации с 1С. - """ - name = models.CharField("Наименование", max_length=255, unique=True) - - def __str__(self): return self.name - class Meta: - verbose_name = "Материал"; verbose_name_plural = "Материалы" - class ProductionTask(models.Model): """ Основание для производства. Определяет ЧТО делать. @@ -62,7 +52,7 @@ class ProductionTask(models.Model): drawing_file = models.FileField("Исходник (DXF/IGES)", upload_to="drawings/%Y/%m/", blank=True, null=True) extra_drawing = models.FileField("Доп. чертеж (PDF)", upload_to="extra_drawings/%Y/%m/", blank=True, null=True) - material = models.ForeignKey(Material, on_delete=models.PROTECT, verbose_name="Материал") + material = models.ForeignKey(WarehouseMaterial, on_delete=models.PROTECT, verbose_name="Материал") quantity_ordered = models.PositiveIntegerField("Заказано всего, шт") is_bend = models.BooleanField("Гибка", default=False) @@ -84,6 +74,7 @@ class Item(models.Model): ('done', 'Выполнено'), ('partial', 'Частично'), ('leftover', 'Недодел'), + ('imported', 'Импортировано'), ] # --- Ссылка на основу (временно null=True для миграции старых данных) --- @@ -106,11 +97,13 @@ class Item(models.Model): is_synced_1c = models.BooleanField("Учтено в 1С", default=False) class Meta: - verbose_name = "Позиция сменки"; verbose_name_plural = "Реестр сменных заданий" + verbose_name = "Пункт сменки"; verbose_name_plural = "Реестр сменных заданий" ordering = ['-date', 'task__deal'] def __str__(self): - return f"{self.task.drawing_name} - {self.date}" + if self.task: + return f"{self.task.drawing_name} - {self.date}" + return f"Без задания - {self.date}" class EmployeeProfile(models.Model): diff --git a/shiftflow/templates/shiftflow/item_detail.html b/shiftflow/templates/shiftflow/item_detail.html index f115074..6927229 100644 --- a/shiftflow/templates/shiftflow/item_detail.html +++ b/shiftflow/templates/shiftflow/item_detail.html @@ -52,6 +52,21 @@ + +