Files
test/retraining/main/models.py

493 lines
22 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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})