Первоначальный залив проекта

This commit is contained in:
tertelius
2025-10-19 22:34:08 +03:00
commit 094d716330
313 changed files with 38846 additions and 0 deletions

492
retraining/main/models.py Normal file
View File

@@ -0,0 +1,492 @@
from django.db import models
from django.conf import settings
from django.urls import reverse
# from autoslug import AutoSlugField
class Cases(models.Model):
'''Абстрактный класс для описания падежей'''
class Meta:
abstract = True
nominative = models.CharField(verbose_name='Именительный', max_length=50)
genitive = models.CharField(verbose_name="Родительный", max_length=50)
dative = models.CharField(verbose_name="Дательный", max_length=50)
def __str__(self):
return f'{self.nominative}/{self.genitive}/{self.dative}'
# Модели для хранения ФИО в разных падежах
class SurnameCases(models.Model):
'''Падежи фамилии'''
genitive = models.CharField("Родительный", max_length=50)
dative = models.CharField("Дательный", max_length=50)
class Meta:
verbose_name = "Падеж фамилии"
verbose_name_plural = "Падежи фамилии"
ordering = [
'genitive',
]
def __str__(self):
return f'{self.genitive}/{self.dative}'
def get_absolute_url(self):
return reverse(viewname="surname_cases_detail", kwargs={"pk": self.pk})
class NameCases(models.Model):
'''Падежи имени'''
genitive = models.CharField("Родительный", max_length=50)
dative = models.CharField("Дательный", max_length=50)
class Meta:
verbose_name = "Падеж имени"
verbose_name_plural = "Падежи имени"
ordering = [
'genitive',
]
def __str__(self):
return f'{self.genitive}/{self.dative}'
def get_absolute_url(self):
return reverse(viewname="name_cases_detail", kwargs={"pk": self.pk})
class Patronymic_cases(models.Model):
'''Падежи отчества'''
genitive = models.CharField(verbose_name="Родительный", max_length=50)
dative = models.CharField(verbose_name="Дательный", max_length=50)
class Meta:
verbose_name = "Падеж отчества"
verbose_name_plural = "Падежи отчества"
ordering = [
'genitive',
]
def __str__(self):
return f'{self.genitive}/{self.dative}'
def get_absolute_url(self):
return reverse(viewname="patronymic_cases_detail", kwargs={"pk": self.pk})
class Humans(models.Model):
'''
Абстрактная модель человека, чтоб не повторять одинаковые поля во всех моделях
'''
class Meta:
abstract = True
surname = models.CharField(verbose_name='Фамилия', max_length=30)
surname_cases = models.ForeignKey(SurnameCases, verbose_name="падежи фамилии", on_delete=models.PROTECT, blank=True,
null=True)
name = models.CharField(verbose_name='Имя', max_length=20)
name_cases = models.ForeignKey(NameCases, verbose_name="падежи имени", on_delete=models.PROTECT, blank=True,
null=True)
patronymic = models.CharField(verbose_name='Отчество', max_length=25, blank=True)
patronymic_cases = models.ForeignKey(Patronymic_cases, verbose_name="падежи отчества", on_delete=models.PROTECT,
blank=True, null=True)
birthdate = models.DateField(verbose_name='День рождения', blank=True, null=True)
gender = models.CharField(verbose_name="Пол", max_length=4, choices=settings.GENDER, blank=False, default='муж.')
phone = models.CharField(verbose_name='Номер телефона', max_length=20, blank=True)
e_mail = models.CharField(verbose_name='Электронная почта', max_length=70, blank=True)
added_at = models.DateTimeField(verbose_name="Добавлен", auto_now=False, auto_now_add=True)
def __str__(self) -> str:
return f'{self.surname} {str(self.name)[0]}. {str(self.patronymic)[0]}.'
def fio_genetive(self) -> str:
'''формирование фио в родительном падеже'''
return f'{self.client.surname_cases.genitive} {self.client.name_cases.genitive} {self.client.patronymic_cases.genitive}'
def fio_dative(self) -> str:
'''формирование укороченного фио в дательном падеже'''
return f'{self.client.surname_cases.dative} {self.client.name_cases.dative[:1]}. {self.client.patronymic_cases.dative[:1]}.'
class PassportDepartment(models.Model):
''' подразделения выдачи паспорта '''
code = models.CharField(verbose_name="Код подразделения", max_length=7)
title = models.CharField(verbose_name="Наименование подразделения", max_length=255)
def __str__(self) -> str:
return f'{self.code} | {self.title}'
class Meta:
verbose_name = 'Паспортное подразделение'
verbose_name_plural = 'Паспортные подразделения'
class Passports(models.Model):
''' паспорт '''
series = models.CharField(verbose_name="Серия", max_length=5)
number = models.CharField(verbose_name="Номер", max_length=20)
issued_date = models.DateField(verbose_name="Дата выдачи", auto_now=False, auto_now_add=False)
issued_department = models.CharField(verbose_name="Наименование подразделения", max_length=150)
passport_department = models.ForeignKey(PassportDepartment, verbose_name="Код подразделения",
on_delete=models.PROTECT, null=True)
address_registration = models.TextField(verbose_name="Адрес проживания")
def __str__(self) -> str:
return f'серия:{self.series} номер:{self.number} дата получения {self.issued_date}'
class Meta:
verbose_name = 'Паспорт'
verbose_name_plural = 'Паспорта'
class Diplomas(models.Model):
series = models.CharField(verbose_name="Серия", max_length=8)
number = models.CharField(verbose_name="Номер", max_length=20)
issued_date = models.DateField(verbose_name="Дата выдачи", auto_now=False, auto_now_add=False)
def __str__(self) -> str:
return f'серия:{self.series} номер:{self.number} дата получения {self.issued_date}'
class Meta:
verbose_name = 'Полученный Диплом'
verbose_name_plural = 'Полученные Дипломы'
class Customers(Humans):
''' модель заказчика, если договор заключается не на студента '''
passport = models.ForeignKey(Passports, verbose_name="Паспорт", on_delete=models.PROTECT, blank=True, null=True)
def get_absolute_url(self):
return reverse(viewname="customer", kwargs={"customer_id": self.pk})
class Meta:
verbose_name = 'Заказчика'
verbose_name_plural = 'Заказчики'
ordering = [
'surname',
'name',
]
class Students(Humans):
''' модель обучающегося/студента '''
photo = models.ImageField(verbose_name="Фото", upload_to='photos/%Y/%m/%d/', blank=True)
passport = models.ForeignKey(Passports, verbose_name="Паспорт", on_delete=models.PROTECT, blank=True, null=True)
snils = models.CharField(verbose_name="Номер СНИЛС", max_length=50, blank=True)
diploma = models.ForeignKey(Diplomas, verbose_name="Диплом", on_delete=models.PROTECT, blank=True, null=True)
def get_absolute_url(self):
return reverse(viewname="student", kwargs={"student_id": self.pk})
class Meta:
verbose_name = 'Студента'
verbose_name_plural = 'Студенты'
ordering = [
'surname',
'name',
]
# Модели сотрудников
class Post(models.Model):
title = models.CharField(verbose_name="Должность", max_length=50)
def __str__(self) -> str:
return f'{self.title}'
class Degree(models.Model):
title = models.CharField(verbose_name="Степень", max_length=50)
def __str__(self) -> str:
return f'{self.title}'
class Grade(models.Model):
title = models.CharField(verbose_name="Звание", max_length=50)
def __str__(self) -> str:
return f'{self.title}'
class Emploees(Humans):
'''Сотрудники'''
degree = models.ForeignKey(Degree, verbose_name="Ученая степень", on_delete=models.PROTECT, blank=True, null=True)
grade = models.ForeignKey(Grade, verbose_name="Звание", on_delete=models.PROTECT, blank=True, null=True)
post = models.ForeignKey(Post, verbose_name="Должность", on_delete=models.PROTECT, blank=True, null=True)
department = models.CharField(verbose_name="Подразделение", max_length=255)
photo = models.ImageField(verbose_name="Фото", upload_to='photos/%Y/%m/%d/', blank=True)
class Meta:
verbose_name = 'Сотрудника'
verbose_name_plural = 'Сотрудники'
ordering = [
'surname',
'name',
]
class Groups(models.Model):
''' Учебные группы '''
title = models.CharField(verbose_name="Обозначение", max_length=50, unique=True, db_index=True)
graduation_at = models.CharField(verbose_name='Год выпуска', max_length=4)
graduation_date = models.DateField(verbose_name="Дата выпуска", auto_now=False, auto_now_add=False, null=True)
def get_absolute_url(self):
return reverse(viewname="group", kwargs={"group_id": self.pk})
def __str__(self) -> str:
return f'{self.title}'
class Meta:
verbose_name = 'Группа'
verbose_name_plural = 'Группы'
ordering = [
'-graduation_date',
'-title',
]
class Structures(models.Model):
''' Текущие структуры университета '''
warrant_number = models.CharField(verbose_name="Доверенность №", max_length=15)
warrant_date = models.DateField(verbose_name="Доверенность от", default='2022-05-05')
director_ido = models.ForeignKey(Emploees, verbose_name="Директор ИДО", related_name='dir_ido',
on_delete=models.PROTECT)
responsible_ido = models.CharField(verbose_name="Ответственный от ИДО", max_length=50)
res_ido = models.ForeignKey(Emploees, verbose_name="Ответственный от ИДО", related_name='res_ido',
on_delete=models.PROTECT)
responsible_def = models.CharField(verbose_name="Ответственный от ДЭиФ", max_length=50)
res_def = models.ForeignKey(Emploees, verbose_name='Ответственный от ДЭиФ', related_name='res_def',
on_delete=models.PROTECT)
rector = models.CharField(verbose_name="Ректор", max_length=50, blank=True, null=True)
class Meta:
verbose_name = 'Структуру'
verbose_name_plural = 'Структуры'
ordering = [
'-warrant_date',
]
def __str__(self) -> str:
return (f"Доверенность № {self.warrant_number} от {self.warrant_date:%d.%m.%Y}"
f" на имя {self.director_ido.surname_cases.genitive}"
f" {self.director_ido.name_cases.genitive}"
f" {self.director_ido.patronymic_cases.genitive}"
)
# Модель для шаблонов файлов
class Template_files(models.Model):
''' шаблоны файлов '''
date = models.DateField(verbose_name="Дата шаблона", auto_now=False, auto_now_add=True)
title = models.CharField(verbose_name="Название", max_length=50)
file = models.FileField(verbose_name="Файл шаблона", upload_to='templates/%Y/%m', blank=True)
class Meta:
verbose_name = "Шаблон"
verbose_name_plural = "Шаблоны"
def __str__(self):
return f'{self.title} от {self.date:%d-%m-%Y}'
# def get_absolute_url(self):
# return reverse("template_files_detail", kwargs={"pk": self.pk})
# Модели необходимые для ВКР
class Questions(models.Model):
body = models.TextField("Вопрос")
member = models.ForeignKey(Emploees, verbose_name="Член комиссии", on_delete=models.PROTECT)
# protocol_id = models.ForeignKey('Protocols', verbose_name='Протокол', on_delete=models.PROTECT, null=True)
class Meta:
verbose_name = "Вопрос"
verbose_name_plural = "Вопросы"
def __str__(self):
return f'{self.member.surname} {self.member.name[:1]}. {self.member.patronymic[:1]}. - {self.body}'
def get_absolute_url(self):
return reverse(viewname="questions_detail", kwargs={"question_pk": self.pk})
class Protocols(models.Model):
number = models.IntegerField(verbose_name="Номер протокола")
date_time = models.DateTimeField(verbose_name="Дата и время протокола", auto_now=False, auto_now_add=False)
questions = models.ManyToManyField(Questions, verbose_name="Вопросы")
template = models.ForeignKey(Template_files, verbose_name="Шаблон", on_delete=models.PROTECT)
class Meta:
verbose_name = "Протокол"
verbose_name_plural = "Протоколы"
ordering = [
'-date_time',
]
def __str__(self):
return f'{self.number} от {self.date_time}'
def get_absolute_url(self):
return reverse(viewname="get_protocol", kwargs={"protocol_pk": self.pk})
class Degree_works(models.Model):
title = models.CharField(verbose_name="Тема работы", max_length=200)
adviser = models.ForeignKey(Emploees, verbose_name="Руководитель работы", on_delete=models.PROTECT)
protocol = models.ForeignKey(Protocols, verbose_name="Протокол защиты", on_delete=models.PROTECT, blank=True,
null=True)
score = models.CharField(verbose_name="Оценка", max_length=40, choices=settings.SCORE, blank=False,
default='хорошо')
registration_number = models.IntegerField(verbose_name='Регистрационный номер', blank=True, null=True)
diploma_number = models.CharField(verbose_name='Номер диплома', max_length=45, blank=True, null=True)
class Meta:
verbose_name = "ВКР"
verbose_name_plural = "ВКР"
def __str__(self):
return f'"{self.title}". рук - {self.adviser}'
def get_absolute_url(self):
return reverse(viewname="degree_work_detail", kwargs={"degree_work_pk": self.pk})
class Contracts(models.Model):
number = models.CharField(verbose_name="Номер договора", max_length=20,
unique=True) # , default=f"П08.{datetime.now:%y}")
agreement_date = models.DateField(verbose_name="Дата заключения", auto_now=False, auto_now_add=False,
default='2022-05-05')
start_date = models.DateField(verbose_name="Начало обучения")
end_date = models.DateField(verbose_name="Окончание обучения")
payment_date1 = models.DateField(verbose_name="Дата оплаты 1 семестра", default='2021-09-30')
payment_date2 = models.DateField(verbose_name="Дата оплаты 2 семестра", default='2022-02-01')
payment_date3 = models.DateField(verbose_name="Дата оплаты 3 семестра", default='2022-09-01')
client = models.ForeignKey(Students, verbose_name="Обучающийся", on_delete=models.PROTECT)
customer = models.ForeignKey(Customers, verbose_name="Заказчик", on_delete=models.PROTECT, blank=True, null=True)
structure = models.ForeignKey(Structures, verbose_name='Текущая структура', on_delete=models.PROTECT)
scan = models.FileField(verbose_name="Скан документа", upload_to='pdf/contracts/%Y/%m/', blank=True)
group = models.ForeignKey(Groups, verbose_name="Группа", on_delete=models.PROTECT)
degree_work = models.ForeignKey(Degree_works, verbose_name="ВКР", on_delete=models.PROTECT, blank=True, null=True)
def get_absolute_url(self):
return reverse(viewname="contract", kwargs={"contract_id": self.pk})
def get_gen_diploma_url(self):
return reverse(viewname="gen_diploma_form", kwargs={"contract_id":self.pk})
def get_gen_supplement_url(self):
return reverse(viewname="gen_diploma_supplement", kwargs={"contract_id":self.pk})
class Meta:
verbose_name = 'Договор'
verbose_name_plural = 'Договоры'
ordering = [
'-agreement_date',
'-number',
# 'title',
]
def __str__(self) -> str:
customer = f' заказчик - {self.customer.surname} {self.customer.name[0]}. {self.customer.patronymic[0]}.' if self.customer else ''
dip_title = f' - {self.degree_work}' if not self.degree_work == None else ''
return f'Договор № {self.number} - {self.client.surname} {self.client.name[0]}. {self.client.patronymic[0]}.' + customer + dip_title
# Приказы
# Выписки
class Extracts(models.Model):
number = models.CharField(verbose_name="Номер протокола", max_length=5)
date = models.DateField(verbose_name="Дата", auto_now=False, auto_now_add=False)
speaker = models.ForeignKey(Emploees, verbose_name="Докладчик", related_name='speaker', on_delete=models.PROTECT)
secretary = models.ForeignKey(Emploees, verbose_name="Секретарь", related_name='secretary',
on_delete=models.PROTECT)
department = models.CharField(verbose_name="Подразделение", max_length=255)
class Meta:
verbose_name = "Выписку"
verbose_name_plural = "Выписки"
def __str__(self):
return f'Выписка из протокола № {self.number} от {self.date}'
def get_absolute_url(self):
return reverse(viewname="extract", kwargs={"extract_id": self.pk})
class Orders(models.Model):
number = models.CharField(verbose_name="Номер", max_length=50, blank=True)
registered = models.DateField(verbose_name="от", auto_now=False, auto_now_add=False, blank=True)
event_date = models.DateField(verbose_name="дата вступления в силу", auto_now=False, auto_now_add=False)
type_order = models.ForeignKey("Order_types", verbose_name="Тип приказа", on_delete=models.PROTECT)
contracts = models.ManyToManyField(Contracts, verbose_name="Студенты", blank=True)
emploees = models.ManyToManyField(Emploees, verbose_name="Сотрудники", blank=True)
structure = models.ForeignKey(Structures, verbose_name='Текущая структура', on_delete=models.PROTECT)
scan = models.FileField(verbose_name="Скан документа", upload_to='pdf/orders/%Y/%m/', blank=True)
extract = models.ForeignKey(Extracts, verbose_name="Выписка", on_delete=models.PROTECT, blank=True, null=True)
template = models.ForeignKey(Template_files, verbose_name="Шаблон", on_delete=models.PROTECT, blank=True, null=True)
def get_absolute_url(self):
return reverse(viewname="get_order", kwargs={"order_id": self.pk})
class Meta:
verbose_name = 'Приказ'
verbose_name_plural = 'Приказы'
ordering = [
'-registered',
]
def __str__(self) -> str:
return f'{self.type_order}{self.number} от {self.registered}'
class Order_types(models.Model):
title = models.CharField(verbose_name="Наименование", max_length=150)
body = models.TextField(verbose_name="Текст вводной", blank=True)
footer = models.TextField(verbose_name="Основание")
def __str__(self) -> str:
return f'Приказ {self.title}'
# Справки
class Sertificates(models.Model):
number = models.CharField(verbose_name="Исходящий номер", max_length=50, blank=True)
registered = models.DateField(verbose_name="Зарегистрирована", auto_now=False, auto_now_add=False, blank=True)
order = models.ForeignKey(Orders, verbose_name="Приказ", on_delete=models.PROTECT)
contract = models.ForeignKey(Contracts, verbose_name="Договор", on_delete=models.PROTECT)
scan = models.FileField(verbose_name="Скан документа", upload_to='pdf/sertificates/%Y/%m/', blank=True)
class Meta:
verbose_name = "Справку"
verbose_name_plural = "Справки"
def __str__(self) -> str:
return f"{self.contract.client} по приказу {self.order}"
def get_absolute_url(self):
return reverse(viewname="sertificate", kwargs={"sertificate_id": self.pk})
class Access_lists(models.Model):
registration_date = models.DateField(verbose_name='от')
number = models.CharField(verbose_name="Номер", max_length=10, blank=True)
students = models.ManyToManyField(Contracts, verbose_name='Студенты', blank=True)
template = models.ForeignKey(Template_files, verbose_name="Шаблон", on_delete=models.PROTECT, blank=True, null=True)
class Meta:
verbose_name = "Пропуск"
verbose_name_plural = "Пропуски"
def __str__(self) -> str:
return f"{self.registration_date} "
def get_absolute_url(self):
return reverse(viewname="get_acces", kwargs={"acces_id": self.pk})
def gen_absolute_url(self):
return reverse(viewname="gen_acces", kwargs={"acces_id": self.pk})