class Ispdn(models.Model): objects = MyManager() nomer = models.CharField(max_length=32, verbose_name='Номер') name = models.CharField(max_length=256, verbose_name='Название') start_date = models.DateField(null=True, blank=True) end_date = models.DateField(null=True, blank=True) prikaz = models.ManyToManyField('Prikaz', related_name='ispdns', blank=True) instruct = models.ManyToManyField('Instruct', related_name='ispdns', blank=True) rukovodstvo = models.ManyToManyField('Rukovodstvo', related_name='ispdns', blank=True) polozhenie = models.ManyToManyField('Polozhenie', related_name='ispdns', blank=True) po = models.ManyToManyField('ProgOb', related_name='ispdns', blank=True) raznoe = models.ManyToManyField('Raznoe', related_name='ispdns', blank=True) def __str__(self): return self.name class Meta: verbose_name = 'ИСПДн' verbose_name_plural = 'ИСПДн'
class Potok(models.Model): objects = MyManager() name = models.CharField(max_length=256, unique=True) def __str__(self): return self.name class Meta: verbose_name = 'Поток' verbose_name_plural = 'Потоки'
class DisciplineForm(models.Model): objects = MyManager() name = models.CharField(max_length=256, unique=True) def __str__(self): return self.name class Meta: verbose_name = 'Форма дисциплины' verbose_name_plural = 'Формы дисциплины'
class Specialnost(models.Model): objects = MyManager() name = models.CharField(max_length=256, unique=True) def __str__(self): return self.name class Meta: verbose_name = 'Специальность' verbose_name_plural = 'Специальности'
class Archive(models.Model): objects = MyManager() discipline = models.ForeignKey(Discipline, on_delete=models.CASCADE) dt = models.DateTimeField(auto_now_add=True, verbose_name='Дата') class Meta: verbose_name = 'Архив' verbose_name_plural = 'Архивы' ordering = ['-dt']
class Podrazdelenie(models.Model): objects = MyManager() name = models.CharField(unique=True, max_length=32, verbose_name='Название') def __str__(self): return self.name class Meta: verbose_name = 'Подразделение' verbose_name_plural = 'Подразделения'
class SkziName(models.Model): objects = MyManager() type = models.CharField(max_length=128, verbose_name='Тип') firma = models.CharField(max_length=256, verbose_name='Фирма') version = models.CharField(max_length=32, verbose_name='Версия') def __str__(self): return self.type class Meta: verbose_name = 'Наименование СКЗИ' verbose_name_plural = 'Наименования СКЗИ'
class Fakultet(models.Model): objects = MyManager() name = models.CharField(unique=True, max_length=32, verbose_name='Название') def __str__(self): return self.name class Meta: verbose_name = 'Факультет' verbose_name_plural = 'Факультеты'
class Zametka(models.Model): objects = MyManager() name = models.CharField(max_length=32) date = models.DateField(auto_now_add=True) content = models.CharField(max_length=1024) def __str__(self): return self.name class Meta: verbose_name = 'Заметка' verbose_name_plural = 'Заметки' ordering = ['-id']
class Raznoe(models.Model): def content_file_name(instance, filename): return ispdn_filename('raznoe', Raznoe, filename) objects = MyManager() name = models.CharField(max_length=256, verbose_name='Название') file = models.FileField(null=True, upload_to=content_file_name) def __str__(self): return self.name class Meta: verbose_name = 'Разное' verbose_name_plural = "Разное" ordering = ['-id']
class Skzi(models.Model): objects = MyManager() archive = models.BooleanField(default=False) name = models.ForeignKey('SkziName', on_delete=models.CASCADE) serial_n = models.CharField(max_length=32) ekz_n = models.CharField(max_length=32, blank=True) #Отметка о получении from_organ = models.ForeignKey('OrganCrypto', on_delete=models.CASCADE, related_name='skzis_from') date_poluch = models.DateField(null=True, blank=True) nomer_poluch = models.CharField(max_length=64, blank=True) #Отметка о рас. to_person = models.ForeignKey('FioRassilki', on_delete=models.CASCADE, related_name='skzis_to') date_sopr = models.DateField(null=True, blank=True) nomer_sopr = models.CharField(max_length=32, blank=True) date_podtv = models.DateField(null=True, blank=True) nomer_podtv = models.CharField(max_length=32, blank=True) podtv = models.BooleanField(default=False) #Отметка о возврате vozvr_date_sopr = models.DateField(null=True, blank=True) vozvr_nomer_sopr = models.CharField(max_length=32, null=True, blank=True) vozvr_date_podtv = models.DateField(null=True, blank=True) vozvr_nomer_podtv = models.CharField(max_length=32, null=True, blank=True) date_vvod = models.DateField(null=True, blank=True) date_vivod = models.DateField(null=True, blank=True) #Отметка о уничтожении date_unichtozh = models.DateField(null=True, blank=True) nomer_acta = models.CharField(max_length=32, null=True, blank=True) act_podtv = models.BooleanField(default=False) primechanie = models.CharField(max_length=1024, null=True, blank=True) def __str__(self): return self.name.type class Meta: verbose_name = 'Запись СКЗИ' verbose_name_plural = 'Записи СКЗИ'
class Rukovodstvo(models.Model): def content_file_name(instance, filename): return ispdn_filename('rukovodstva', Rukovodstvo, filename) objects = MyManager() nomer = models.CharField(max_length=32, verbose_name='Номер') name = models.CharField(max_length=256, verbose_name='Название') file = models.FileField(null=True, upload_to=content_file_name) def __str__(self): return f'{self.nomer} {self.name}' class Meta: verbose_name = 'Руководство' verbose_name_plural = "Руководства" ordering = ['-id']
class ProgOb(models.Model): def content_file_name(instance, filename): return ispdn_filename('progob', ProgOb, filename) objects = MyManager() nomer = models.CharField(max_length=32, verbose_name='Номер') name = models.CharField(max_length=256, verbose_name='Название') file = models.FileField(null=True, upload_to=content_file_name) def __str__(self): return f'{self.nomer} {self.name}' class Meta: verbose_name = 'ПО' verbose_name_plural = "ПО" ordering = ['-id']
class FioRassilki(models.Model): objects = MyManager() last_name = models.CharField(max_length=128, verbose_name='Фамилия') first_name = models.CharField(max_length=128, verbose_name='Имя') surname = models.CharField(max_length=128, verbose_name='Отчество') dolzhnost = models.CharField(max_length=128, verbose_name='Должность') def get_fio(self): return f'{self.last_name} {self.first_name[0]}.{self.surname[0]}.' def __str__(self): return self.get_fio() class Meta: verbose_name = 'ФИО Рассылки' verbose_name_plural = 'ФИО Рассылки'
class Fakultet(models.Model): objects = MyManager() name = models.CharField(max_length=256, unique=True) def __str__(self): return self.name def check_errors(self): disciplines = Discipline.objects.filter(fakultet=self) dis_errors = len(Discipline.objects.filter(errors=True).all()) > 0 dis_errors = dis_errors or disciplines.annotate( num_nagruzki=Count('nagruzki', filter=Q(nagruzki__archive=None))).filter( num_nagruzki__lte=0).count() > 0 return dis_errors class Meta: verbose_name = 'Факультет' verbose_name_plural = 'Факультеты'
class Instruct(models.Model): def content_file_name(instance, filename): return ispdn_filename('istructs', Instruct, filename) objects = MyManager() nomer = models.CharField(max_length=32, verbose_name='Номер') name = models.CharField(max_length=256, verbose_name='Название') ovetstv = models.ForeignKey('Pdn.Person', on_delete=models.SET_NULL, null=True, verbose_name='Ответственный') file = models.FileField(null=True, upload_to=content_file_name) def __str__(self): return f'{self.nomer} {self.name}' class Meta: verbose_name = 'Инструкция' verbose_name_plural = "Инструкции" ordering = ['-id']
class Kafedra(models.Model): objects = MyManager() name = models.CharField(max_length=256, unique=True) fakultet = models.ForeignKey('Fakultet', on_delete=models.CASCADE, null=True, blank=True) def __str__(self): return self.name def save(self, **kwargs): if not self.fakultet: discipline = Discipline.objects.filter(kafedra__id=self.id).first() if discipline: self.fakultet = discipline.fakultet super(Kafedra, self).save() class Meta: verbose_name = 'Кафедра' verbose_name_plural = 'Кафедры'
class Prikaz(models.Model): def content_file_name(instance, filename): return ispdn_filename('prikazi', Prikaz, filename) objects = MyManager() nomer = models.CharField(max_length=32, verbose_name='Номер') name = models.CharField(max_length=256, verbose_name='Название') date = models.DateField(verbose_name='Дата') ovetstv = models.ForeignKey('Pdn.Person', on_delete=models.SET_NULL, null=True, verbose_name='Ответственный') file = models.FileField(null=True, upload_to=content_file_name) def __str__(self): return f'{self.nomer} {self.name}' def get_filename(self): return self.file.name.split('/')[-1] class Meta: verbose_name = 'Приказ' verbose_name_plural = "Приказы" ordering = ['-id']
class Person(models.Model): objects = MyManager() last_name = models.CharField(max_length=128, verbose_name='Фамилия') first_name = models.CharField(max_length=128, verbose_name='Имя') surname = models.CharField(max_length=128, verbose_name='Отчество') birth_date = models.DateField(verbose_name='Дата рождения') fakultet = models.ForeignKey('Fakultet', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Факультет', related_name='persons') podrazd = models.ForeignKey('Podrazdelenie', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Подразделение', related_name='persons') soglasie = models.BooleanField( default=False, verbose_name='Согласие на обработку персональных данных') sogl_raspr = models.BooleanField( default=False, verbose_name='Согласие на распространение персональных данных') def get_fio(self): return f'{self.last_name} {self.first_name[0]}.{self.surname[0]}.' def __str__(self): return self.get_fio() class Meta: verbose_name = 'Сотрудник/Студент' verbose_name_plural = 'Сотрудники/Студенты' ordering = ['-id']
class Prepod(models.Model): objects = MyManager() DOLZHNOST = [('Зав. кафедрой', 'Зав. кафедрой'), ('Декан', 'Декан'), ('Профессор', 'Профессор'), ('Доцент', 'Доцент'), ('Ст. преподаватель', 'Ст. преподаватель'), ('Ассистент', 'Ассистент')] PRAVA = [('raspred', 'Распределение и просмотр'), ('prosmotr', 'Только просмотр по кафедре'), ('None', 'Просмотр своих дисциплин')] PKGD = [('pps', 'ППС')] UCH_ZVANIE = [ ('docent', 'доцент'), ('prof', 'профессор'), ] user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='prepod', blank=True) email = models.EmailField(verbose_name='Email', null=True, blank=True) last_name = models.CharField(max_length=64, verbose_name="Фамилия") first_name = models.CharField(max_length=64, verbose_name="Имя") surname = models.CharField(max_length=64, verbose_name="Отчество") fio = models.CharField(max_length=256, verbose_name='ФИО', blank=True, default='') dolzhnost = models.CharField(choices=DOLZHNOST, max_length=64, default='Зав. кафедрой') kafedra = models.ForeignKey('Disciplines.Kafedra', on_delete=models.SET_NULL, null=True, default=None, blank=True) kv_uroven = models.IntegerField(verbose_name="Кв. уровень") chasov_stavki = models.IntegerField(verbose_name="Часов ставки") pkgd = models.CharField(max_length=32, choices=PKGD, default='pps') srok_izbr = models.DateField(null=True) uch_stepen = models.CharField(max_length=32, null=True, blank=True) uch_zvanie = models.CharField(max_length=32, choices=UCH_ZVANIE, null=True, blank=True) dogovor = models.BooleanField(default=False) prava = models.CharField(max_length=128, choices=PRAVA, default='None', verbose_name='Права') def save(self, **kwargs): self.fio = self.get_fio() if self.user and not self.user.is_superuser: self.user.is_staff = False self.user.save() self.user = User.objects.get_or_none(email=self.email) if self.dolzhnost == 'Зав. кафедрой': self.prava = 'raspred' if self.user and not self.user.is_superuser: self.user.is_staff = True self.user.save() elif self.user and not self.user.is_superuser: self.user.is_staff = False self.user.save() super().save(**kwargs) class Meta: verbose_name = 'Преподаватель' verbose_name_plural = 'Преподаватели' ordering = ['last_name'] def dolzhnost_name(self): return self.dolzhnost def get_fio(self): return f'{self.last_name} {self.first_name[0]}.{self.surname[0]}.' def __str__(self): return self.get_fio() @classmethod def get_display_value(cls, choices_name, field_val): choices = eval(f'cls.{choices_name}') for key, val in choices: if key == field_val: return val
class Nagruzka(models.Model): objects = MyManager() discipline = models.ForeignKey(Discipline, on_delete=models.CASCADE, null=True, verbose_name="Дисциплина", related_name='nagruzki') archive = models.ForeignKey(Archive, on_delete=models.CASCADE, null=True, default=None, related_name='nagruzki') prepod = models.ForeignKey(Prepod, on_delete=models.CASCADE, null=True, verbose_name="Преподаватель", related_name='nagruzki') n_stavka = models.DecimalField(max_digits=6, decimal_places=2, default=0) pochasovka = models.BooleanField(default=False) student = models.IntegerField(verbose_name='Студентов') lk = models.IntegerField(verbose_name='Лекции', default=0) pr = models.IntegerField(verbose_name='Практические работы', default=0) lr = models.IntegerField(verbose_name='Лабараторные работы', default=0) k_tek = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Тек.кон.', default=0) k_ekz = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Кон.экз', default=0) zachet = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Зачет', default=0) ekzamen = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Экзамен', default=0) kontr_raboti = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Контр. раб.', default=0) kr_kp = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='КР/КП', default=0) vkr = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='ВКР', default=0) pr_ped = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Практ.пед.', default=0) pr_dr = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Практ.другая', default=0) gak = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='ГАК', default=0) aspirantura = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Асп./Магистартура', default=0) rukovodstvo = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Руководство', default=0) dop_chasi = models.DecimalField(max_digits=6, decimal_places=2, verbose_name='Доп. часы', default=0) summary = models.DecimalField(max_digits=10, decimal_places=2, default=0) def __str__(self): if self.discipline: return f'{self.discipline.name} {self.discipline.form}' return 'None' def save(self, **kwargs): self.summary = self.get_summary() super().save(**kwargs) class Meta: verbose_name = 'Нагрузка' verbose_name_plural = 'Нагрузки' def get_summary(self): fields = ['k_tek', 'k_ekz', 'lk', 'lr', 'pr', 'zachet', 'ekzamen', 'kontr_raboti', 'kr_kp', 'vkr', 'pr_ped', 'pr_dr', 'gak', 'aspirantura', 'rukovodstvo', 'dop_chasi'] sum = 0 for field in fields: sum += float(getattr(self, field)) return sum
class Discipline(models.Model): objects = MyManager() errors = models.BooleanField(default=True, verbose_name='Ошибки') code = models.IntegerField(verbose_name='Код', default=0) form = models.ForeignKey(DisciplineForm, on_delete=models.SET_NULL, null=True, verbose_name='Форма') shifr = models.CharField(max_length=10, default='НЕТ', verbose_name='Шифр') name = models.CharField(max_length=1024, verbose_name='Дисциплина') fakultet = models.ForeignKey(Fakultet, on_delete=models.SET_NULL, null=True, verbose_name='Факультет') specialnost = models.ForeignKey(Specialnost, on_delete=models.SET_NULL, null=True, verbose_name='Специальность') kurs = models.IntegerField(verbose_name='Курс') semestr = models.IntegerField(verbose_name='Семестр') PERIOD_CHOICES = [ ('осенний', 'осенний'), ('весенний', 'весенний'), ] period = models.CharField(max_length=16, choices=PERIOD_CHOICES, default='осенний', verbose_name='Период') nedeli = models.IntegerField(verbose_name='Недели') trudoemkost = models.IntegerField(verbose_name='Трудоемкость') chas_v_nedelu = models.IntegerField(verbose_name='Часы в неделю') srs = models.IntegerField(verbose_name='Часов СРС') chas_po_planu = models.IntegerField(verbose_name='Часов по плану') student = models.IntegerField(verbose_name='Студенты') group = models.IntegerField(verbose_name='Группы') podgroup = models.IntegerField(verbose_name='Подгруппы') lk = models.IntegerField(verbose_name='Лекции') pr = models.IntegerField(verbose_name='Практические работы') lr = models.IntegerField(verbose_name='Лабараторные работы') k_tek = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Тек.кон.') k_ekz = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Кон.экз') zachet = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Зачет') ekzamen = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Экзамен') kontr_raboti = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Контр. раб.') kr_kp = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='КР/КП') vkr = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='ВКР') pr_ped = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Практ.пед.') pr_dr = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Практ.другая') gak = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='ГАК') aspirantura = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Асп./Магистартура') rukovodstvo = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Руководство') dop_chasi = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Доп. часы') kafedra = models.ForeignKey(Kafedra, on_delete=models.SET_NULL, null=True, verbose_name='Кафедра', related_name='disciplines') potok = models.ForeignKey(Potok, on_delete=models.SET_NULL, null=True, verbose_name='Поток') summary = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='ИТОГО') def check_nagruzka_sum(self): CONTROL_CELLS = ['lk', 'pr', 'lr', 'k_tek', 'k_ekz', 'zachet', 'ekzamen', 'kontr_raboti', 'kr_kp', 'vkr', 'pr_ped', 'pr_dr', 'gak', 'aspirantura', 'rukovodstvo', 'dop_chasi', 'summary'] errors = [] nagruzki = self.nagruzki.filter(archive=None).all() self.errors = False if len(nagruzki) > 0: for cell in CONTROL_CELLS: sum = 0 for nagruzka in nagruzki: sum += getattr(nagruzka, cell) self.errors = self.errors or float(sum) != float(getattr(self, cell)) if float(sum) != float(getattr(self, cell)): errors.append(cell) return errors def nagruzka_count(self): return len(self.nagruzki.filter(archive=None).all()) def spec_and_form(self): return f'{self.specialnost.name} ({self.form.name})' def group_podgroup(self): return f'{self.group}/{self.podgroup}' def audit_chasov(self): return self.lk + self.pr + self.lr def __str__(self): return self.name class Meta: verbose_name = 'Дисциплина' verbose_name_plural = 'Дисциплины' ordering = ['code']