Files
test/retraining/main/views.py

502 lines
17 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.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