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

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

501
retraining/main/views.py Normal file
View File

@@ -0,0 +1,501 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.http import HttpResponse
from django.conf import settings
from .models import *
# paсkages for generating docx files
from django.http import FileResponse
from .gen_doc import *
# from docxtpl import DocxTemplate
from datetime import datetime, timedelta
menu = [{'title': 'Главная', 'url_name': '', 'data_feather': 'home'},
{'title': 'Студенты', 'url_name': 'students', 'data_feather': 'user'},
{'title': 'Группы', 'url_name': 'groups', 'data_feather': 'users'},
{'title': 'Договоры', 'url_name': 'contracts', 'data_feather': 'file-text'},
{'title': 'Приказы', 'url_name': 'orders', 'data_feather': 'file-text'},
{'title': 'Справки', 'url_name': 'sertificates', 'data_feather': 'file-text'},
{'title': 'Пропуска', 'url_name': 'access', 'data_feather': 'file-text'},
{'title': 'Темы ВКР', 'url_name': 'graduation_works', 'data_feather': 'file-text'},
]
# Create your views here.
def index(request):
groups = Groups.objects.filter(graduation_date__gte=datetime.now()).order_by('graduation_date')
# objects = Contracts.objects.order_by('group')
context = {
'title': 'Главная страница',
'objects': groups,
'data': datetime.now(),
'menu': menu,
'active': 1,
}
return render(request, 'main/index.html', context=context)
# Вьюха вывода списка студентов
@login_required
def students_page(request):
students = Students.objects.order_by('surname', 'name', 'patronymic')
context = {
'objects': students,
'title': ' - Студенты',
't_title': 'Список студентов',
'menu': menu,
'active': 2,
}
return render(request, 'main/students_old.html', context=context)
# Вьюха вывода отдельного студента
@login_required
def get_student(request, student_id):
student = Students.objects.get(id=student_id)
contracts = Contracts.objects.filter(client=student_id)
orders = Orders.objects.filter(contracts__client=student_id)
sertificates = Sertificates.objects.filter(contract__client=student_id)
context = {
'object': student,
'contracts': contracts,
'orders': orders,
'sertificates': sertificates,
'title': f' - {student.surname_cases.genitive} {student.name[:1]}. {student.patronymic[:1]}',
't_title': '',
'menu': menu,
'active': 0,
}
return render(request, 'main/get_student.html', context=context)
@login_required
def get_customer(request, customer_id):
pass
# ----------------- Контроллеры для групп ------------------
# Контроллер вывода списка групп
@login_required
def groups_page(request):
groups = Groups.objects.order_by('-graduation_date', '-title')
context = {
'objects': groups,
'title': ' - Группы',
't_title': 'Список групп',
'menu': menu,
'active': 3,
}
return render(request, 'main/list_groups.html', context=context)
@login_required
def get_group(request, group_id):
"""Контроллер вывода отдельной группы"""
contracts = Contracts.objects.filter(group=group_id)
group = Groups.objects.get(pk=group_id)
context = {
'group_id': group_id,
'objects': contracts,
'title': f' - {group.title}',
't_title': f'Список студентов группы {group.title}',
'menu': menu,
'active': 0,
}
return render(request, 'main/list_students.html', context=context)
@login_required
def gen_list_sdo(request, group_id):
"""Контроллер для вывода списка под внсение в систему SDO"""
contracts = Contracts.objects.filter(group=group_id)
group = Groups.objects.get(pk=group_id)
context = {
'group_id': group_id,
'title': f' - список для SDO',
'objects': contracts,
'menu': menu,
't_title': f'Список группы {group.title} для платформы SDO',
'active': 0,
}
return render(request, template_name='main/list_for_sdo.html', context=context)
# ----------------- Контроллеры для договоров ------------------
@login_required
def contracts_page(request):
"""Вывод списка договоров"""
contracts = Contracts.objects.all()
context = {
'objects': contracts,
'title': ' - Договоры',
't_title': f'Договоры',
'menu': menu,
'active': 4,
}
return render(request, template_name='main/contracts.html', context=context)
@login_required
def get_contract(request, contract_id):
"""Вывод отдельного договора"""
contract = Contracts.objects.get(pk=contract_id)
context = {
'object': contract,
'title': f' - {contract.number}',
't_title': f'Договоры',
'menu': menu,
'active': 0,
}
return render(request, 'main/get_contract.html', context=context)
# ----------------- Контроллеры для пропусков ------------------
@login_required
def access_page(request):
"""Вывод списка служебок под пропуска"""
access_list = Access_lists.objects.all()
context = {
'objects': access_list,
'title': ' - Пропуски',
't_title': f'Пропуски',
'menu': menu,
'active': 7,
}
return render(request, 'main/access.html', context=context)
@login_required
def get_acces(request, acces_id):
"""вывод списка служебных записок под пропуска"""
acces = Access_lists.objects.get(pk=acces_id)
contracts = Contracts.objects.filter(access_lists__pk=acces_id).order_by('client__surname', 'client__name',
'group__graduation_date', )
# print(contracts)
context = {
'objects': contracts,
'object': acces,
# 'title' : f' - {contract.number}',
't_title': f'Пропуска',
'menu': menu,
'active': 0,
}
return render(request, 'main/get_acces.html', context=context)
@login_required
def gen_acces(required, acces_id):
"""генерация служебки на пропуска"""
acces = Access_lists.objects.get(pk=acces_id)
filename = f'{acces.registration_date:%y%m%d} служебка на пропуска.docx'
return FileResponse(memo_by_order(acces_id=acces_id), as_attachment=True, filename=filename)
@login_required
def get_extract(request, extract_id):
"""Отображение выписки из протокола кафедры"""
# extract = Extracts.objects.get(pk=extract_id)
order = Orders.objects.get(extract__pk=extract_id)
contracts = Orders.objects.get(pk=order.pk).contracts.all().order_by('client')
context = {
'object': order,
# 'extract': extract,
'contracts': contracts,
'menu': menu,
'title': f'{order.extract}',
}
return render(request, 'main/get_extract.html', context=context)
# TODO добавить в текст выбор докладчика из базы.
@login_required
def gen_extract(request, extract_id):
"""Генерация файла выписки"""
object = Orders.objects.get(extract__pk=extract_id)
contracts = Orders.objects.get(pk=object.pk).contracts.all().order_by('client')
filename = f'{object.extract.date:%y%m%d} Выписка.docx'
return FileResponse(extract_department_meeting(object, contracts), as_attachment=True, filename=filename)
@login_required
def print_extract(request, extract_id):
# extract = Extracts.objects.get(pk=extract_id)
order = Orders.objects.get(extract__pk=extract_id)
contracts = Orders.objects.get(pk=order.pk).contracts.all().order_by('client')
context = {
'object': order,
# 'extract': extract,
'contracts': contracts,
'title': f'{order.extract}',
}
return render(request, 'main/print_extract.html', context=context)
# Вывод на печать договора
@login_required
def print_contract(request, contract_id):
contract = Contracts.objects.get(pk=contract_id)
context = {
'object': contract,
'title': f'договор № {contract.number}',
}
if contract.customer:
return render(request, 'main/print_contract_with_customer.html', context=context)
else:
return render(request, 'main/print_contract.html', context=context)
# ----------------- Контроллеры для приказов ------------------
@login_required
def orders_page(request):
"""Вывод списка приказов"""
orders = Orders.objects.order_by('-registered')
context = {
'objects': orders,
'title': ' - Приказы',
't_title': 'Список приказов',
'menu': menu,
'active': 5,
}
return render(request, 'main/list_orders.html', context=context)
@login_required
def get_order(request, order_id):
"""Вывод списка приказов"""
order = Orders.objects.get(pk=order_id)
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('client')
is_single = True if contracts.count() == 1 else False
context = {
'object': order,
'contracts': contracts,
'menu': menu,
'is_single': is_single,
'title': f'{order.type_order}',
}
return render(request, 'main/get_order.html', context=context)
@login_required
def for_registry(request, order_id):
order = Orders.objects.get(pk=order_id)
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('client')
context = {
'object': order,
'contracts': contracts,
'menu': menu,
# 'is_single':is_single,
'title': f'Реестр в отдел кадров',
}
return render(request, 'main/for_registry.html', context=context)
@login_required
def gen_for_registry(request, order_id):
filename = f'для реестра {datetime.now():%y%m}.xlsx'
return FileResponse(filefor_registry(order_id=order_id), as_attachment=True, filename=filename)
@login_required
def print_order(request, order_id):
order = Orders.objects.get(pk=order_id)
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('client')
# https://ru.stackoverflow.com/questions/842937/django-Получить-связанные-объекты
# https://django.fun/ru/articles/tutorials/select_related-i-prefetch_related-v-django/
is_single = True if contracts.count() == 1 else False
context = {
'object': order,
'contracts': contracts,
'is_single': is_single,
'title': f'{order.type_order}',
}
if order.type_order.title == 'о зачислении':
return render(request, 'main/print_order_on_enrollment.html', context=context)
elif order.type_order.title == 'на темы':
return render(request, 'main/print_order_on_theme.html', context=context)
else:
return render(request, 'main/index.html', context=context)
@login_required
def sertificates_page(request):
"""Вывод списка справок"""
sertificates = Sertificates.objects.all()
context = {
'objects': sertificates,
'title': ' - Справки',
't_title': 'Список справок',
'menu': menu,
'active': 6,
}
return render(request, 'main/sertificates.html', context=context)
@login_required
def get_sertificates(request, sertificate_id):
"""Вывод справки"""
sertificate = Sertificates.objects.get(pk=sertificate_id)
is_now = sertificate.contract.start_date < sertificate.registered < sertificate.contract.end_date
context = {
'is_now': is_now,
'object': sertificate,
'title': f' - {sertificate.contract.client}',
'menu': menu,
'active': 0,
}
return render(request, 'main/get_sertificate.html', context=context)
@login_required
def print_sertificate(request, sertificate_id):
sertificate = Sertificates.objects.get(pk=sertificate_id)
is_now = sertificate.contract.start_date < sertificate.registered < sertificate.contract.end_date
context = {
'is_now': is_now,
'object': sertificate,
'title': f' - {sertificate.contract.client}',
'menu': menu,
'active': 0,
}
return render(request, 'main/print_sertificate.html', context=context)
# Протоколы
@login_required
def get_protocol(request, protocol_pk):
"""Вывод списка протоколов"""
# protocol = Protocols.objects.prefetch_related('questions').get(pk=protocol_pk)
protocol = Protocols.objects.prefetch_related('questions')
context = {
'object': protocol,
# 'title' : f' - № {protocol.number}',
'menu': menu,
'active': 0,
}
return render(request, 'main/get_protocol.html', context=context)
@login_required
def gen_order(request, order_id):
"""Возвращает файл приказа по его айди"""
order = Orders.objects.get(pk=order_id)
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('client')
# https://ru.stackoverflow.com/questions/842937/django-Получить-связанные-объекты
# https://django.fun/ru/articles/tutorials/select_related-i-prefetch_related-v-django/
filename = f'{order.event_date:%y%m%d} {order.type_order}.docx'
if order.type_order.title == 'о зачислении--==':
return FileResponse(order_on_enrollment(order, contracts), as_attachment=True, filename=filename)
elif order.type_order.title == 'на темы':
return FileResponse(order_on_theme(order, contracts), as_attachment=True, filename=filename)
else:
return FileResponse(order_by_id(order.pk), as_attachment=True, filename=filename)
@login_required
def gen_list_students(request, group_id):
contracts = Contracts.objects.filter(group=group_id).order_by('client__surname', 'client__name')
response = HttpResponse(content_type='text/plain')
response['Content_Disposition'] = 'attachment; filename = list_group.txt'
lines = []
for item in contracts:
lines.append(f'{item.client.surname} {item.client.name[0]}. {item.client.patronymic[0]}. \n')
response.writelines(lines)
return response
@login_required
def gen_protocol(request, contract_id):
"""генератор протокола защиты"""
contract = Contracts.objects.get(pk=contract_id)
filename = f'{contract.degree_work.protocol.date_time:%y%m%d} {contract.degree_work.protocol.number}.docx'
return FileResponse(protocol_by_id(contract_id=contract_id), as_attachment=True, filename=filename)
@login_required
def gen_protocols(request, order_id):
""" генератор протоколов защит по приказу"""
order = Orders.objects.get(pk=order_id)
filename = f'{order.event_date:%y%m%d} протоколы защит.docx'
return FileResponse(protocol_by_order(order_id=order_id), as_attachment=True, filename=filename)
# TODO: Подправить вывод ибо выдает в непонятных символах
@login_required
def gen_group_list(request, group_id):
""" генератор списка студентов группы для запроса данных о оплате у Свечкарёвой """
contracts = Contracts.objects.filter(group=group_id).order_by('client__surname', 'client__name')
response = HttpResponse(content_type='text/plain')
response['Content_Disposition'] = 'attachment; filename = list_group.txt'
lines = []
for item in contracts:
lines.append(f'{item.number} - {item.client.surname} {item.client.name} {item.client.patronymic} \n')
response.writelines(lines)
return response
@login_required
def gen_diplma_form(request, contract_id):
""" генерация бланка диплома для печати """
contract = Contracts.objects.get(pk=contract_id)
form = True
# return HttpResponse(gen_diploma_supplement(contract_id))
return FileResponse(gen_diploma(contract, form), as_attachment=True, filename=f'{contract.client.surname} - диплом.docx')
@login_required
def gen_diploma_supplement(request, contract_id):
""" Генерация приложения диплома для печати """
contract = Contracts.objects.get(pk=contract_id)
form = False
return FileResponse(gen_diploma(contract, form), as_attachment=True, filename=f'{contract.client.surname} - приложение.docx')
@login_required
def graduation_works(request):
""" Вывод списка тем """
# works = Degree_works.objects.exclude(title='')
contracts = Contracts.objects.exclude(degree_work=None)
# contracts = Contracts.objects.all()
works = Degree_works.objects.all()
# print(works)
context = {
'objects': contracts,
'title': f' - ВКР',
't_title': 'Список тем ВКР',
'menu': menu,
'active': 8,
}
return render(request, template_name='main/list_graduation_works.html', context=context)
pass