493 lines
22 KiB
Python
493 lines
22 KiB
Python
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})
|