Первоначальный залив проекта
This commit is contained in:
BIN
retraining/db — копия.sqlite3
Normal file
BIN
retraining/db — копия.sqlite3
Normal file
Binary file not shown.
BIN
retraining/db_old.sqlite3
Normal file
BIN
retraining/db_old.sqlite3
Normal file
Binary file not shown.
0
retraining/main/__init__.py
Normal file
0
retraining/main/__init__.py
Normal file
139
retraining/main/admin.py
Normal file
139
retraining/main/admin.py
Normal file
@@ -0,0 +1,139 @@
|
||||
from django.contrib import admin
|
||||
from django.utils.safestring import mark_safe
|
||||
from .models import *
|
||||
|
||||
|
||||
@admin.register(Students)
|
||||
class StudentsAdmin(admin.ModelAdmin):
|
||||
list_display = (
|
||||
'stud_photo',
|
||||
'stud_fio',
|
||||
# 'group',
|
||||
'surname',
|
||||
'name',
|
||||
'patronymic',
|
||||
'gender',
|
||||
# 'photo',
|
||||
)
|
||||
list_display_links = ('stud_fio', )
|
||||
search_fields = ('surname',)
|
||||
list_editable = ('gender', )
|
||||
list_filter = ('gender',)
|
||||
autocomplete_fields = ('name_cases', 'patronymic_cases',)
|
||||
readonly_fields = ('stud_photo',)
|
||||
fields = [
|
||||
('surname', 'surname_cases'),
|
||||
('name', 'name_cases'),
|
||||
('patronymic', 'patronymic_cases'),
|
||||
# ('surname', 'name', 'patronymic'),
|
||||
# ('surname_cases', 'name_cases', 'patronymic_cases'),
|
||||
('gender', 'birthdate'),
|
||||
('phone', 'e_mail'),
|
||||
('stud_photo', 'photo'),
|
||||
('passport', 'snils', 'diploma')
|
||||
]
|
||||
@admin.display(description="фото")
|
||||
def stud_photo(self, student: Students):
|
||||
if student.photo:
|
||||
return mark_safe(f'<img src="{student.photo.url}" width=50')
|
||||
return 'Без фото'
|
||||
|
||||
@admin.display(description='ФИО', ordering='surname')
|
||||
def stud_fio(self, student: Students):
|
||||
return f'{student.surname} {student.name} {student.patronymic}'
|
||||
|
||||
@admin.register(Emploees)
|
||||
class EmploeesAdmin(admin.ModelAdmin):
|
||||
list_display = (
|
||||
# 'group',
|
||||
'surname',
|
||||
'name',
|
||||
'patronymic',
|
||||
'gender',
|
||||
'photo'
|
||||
)
|
||||
list_display_links = ('surname',)
|
||||
search_fields = ('surname',)
|
||||
|
||||
@admin.register(Groups)
|
||||
class GroupsAdmin(admin.ModelAdmin):
|
||||
list_display = (
|
||||
'title',
|
||||
'graduation_at'
|
||||
)
|
||||
|
||||
@admin.register(Contracts)
|
||||
class ContractsAdmin(admin.ModelAdmin):
|
||||
list_filter = (
|
||||
'group',
|
||||
)
|
||||
fields = [
|
||||
('number', 'agreement_date'), ('start_date', 'end_date'),
|
||||
('payment_date1', 'payment_date2', 'payment_date3'), ('client', 'customer'),
|
||||
'structure', 'scan', 'group', 'degree_work'
|
||||
]
|
||||
search_fields = (
|
||||
'number',
|
||||
)
|
||||
|
||||
@admin.register(NameCases)
|
||||
class NameCasesAdmin(admin.ModelAdmin):
|
||||
# list_display = ('')
|
||||
search_fields = ('genitive', 'dative',)
|
||||
|
||||
|
||||
@admin.register(Patronymic_cases)
|
||||
class PatronymicCasesAdmin(admin.ModelAdmin):
|
||||
search_fields = ('genitive', 'dative',)
|
||||
|
||||
|
||||
|
||||
|
||||
@admin.register(PassportDepartment)
|
||||
class PassportDepartamentAdmin(admin.ModelAdmin):
|
||||
search_fields = ('code',)
|
||||
|
||||
@admin.register(Passports)
|
||||
class PassportAdmin(admin.ModelAdmin):
|
||||
fields = [
|
||||
('series', 'number',),
|
||||
('issued_date', 'issued_department',),
|
||||
'passport_department', 'address_registration'
|
||||
]
|
||||
autocomplete_fields = ('passport_department',)
|
||||
|
||||
@admin.register(Orders)
|
||||
class OrdersAdmin(admin.ModelAdmin):
|
||||
filter_horizontal = ['contracts', 'emploees']
|
||||
fields = [
|
||||
('number', 'registered', 'event_date', ),
|
||||
('type_order', 'template', ),
|
||||
('structure', ),
|
||||
( 'extract', 'scan', ),
|
||||
'contracts', 'emploees',
|
||||
]
|
||||
# filter_vertical = ['emploees', ]
|
||||
|
||||
@admin.register(Protocols)
|
||||
class ProtocolsAdmin(admin.ModelAdmin):
|
||||
filter_horizontal = ['questions',]
|
||||
|
||||
# Register your models here.
|
||||
admin.site.register(Post)
|
||||
admin.site.register(Grade)
|
||||
admin.site.register(Degree)
|
||||
admin.site.register(Structures)
|
||||
admin.site.register(Diplomas)
|
||||
admin.site.register(Order_types)
|
||||
admin.site.register(Extracts)
|
||||
admin.site.register(Sertificates)
|
||||
admin.site.register(SurnameCases)
|
||||
admin.site.register(Customers)
|
||||
admin.site.register(Questions)
|
||||
# admin.site.register(Protocols)
|
||||
admin.site.register(Degree_works)
|
||||
admin.site.register(Template_files)
|
||||
admin.site.register(Access_lists)
|
||||
|
||||
|
||||
|
||||
8
retraining/main/apps.py
Normal file
8
retraining/main/apps.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MainConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'main'
|
||||
verbose_name = "Второе образование"
|
||||
|
||||
5
retraining/main/forms.py
Normal file
5
retraining/main/forms.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django import forms
|
||||
|
||||
class Pump(forms.Form):
|
||||
flow = forms.NumberInput()
|
||||
|
||||
484
retraining/main/gen_doc.py
Normal file
484
retraining/main/gen_doc.py
Normal file
@@ -0,0 +1,484 @@
|
||||
import os
|
||||
from django.conf import settings
|
||||
|
||||
from typing import Dict
|
||||
|
||||
from openpyxl import Workbook
|
||||
|
||||
from docxtpl import DocxTemplate
|
||||
import jinja2
|
||||
|
||||
from docxcompose.composer import Composer
|
||||
|
||||
from docx import Document
|
||||
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
|
||||
# from docx.enum.style import WD_STYLE_TYPE
|
||||
from docx.shared import Mm, Pt
|
||||
# from django.http import FileResponse
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
import io
|
||||
|
||||
from .models import * # Для доступа к моделялям импортируем и их.
|
||||
|
||||
|
||||
FONT_SIZE = 12
|
||||
|
||||
def short_date(date, offset=0):
|
||||
return f'{date+timedelta(days=offset):%d.%m.%Y}'
|
||||
|
||||
def gender_text(gender):
|
||||
return 'защитивший' if gender == 'муж.' else 'защитившая'
|
||||
|
||||
def rus_month(date):
|
||||
MONTH=[
|
||||
'',
|
||||
'января',
|
||||
'февраля',
|
||||
'марта',
|
||||
'апреля',
|
||||
'мая',
|
||||
'июня',
|
||||
'июля',
|
||||
'августа',
|
||||
'сентября',
|
||||
'октября',
|
||||
'ноября',
|
||||
'декабря',
|
||||
]
|
||||
return f'{date:%d} {MONTH[date.month]} {date:%Y}\xa0'
|
||||
|
||||
jinja_env = jinja2.Environment()
|
||||
jinja_env.filters['tmpl_date'] = rus_month
|
||||
jinja_env.filters['tmpl_short_date'] = short_date
|
||||
jinja_env.filters['tmpl_gender'] = gender_text
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def order_start(document, number, date, type):
|
||||
|
||||
document.core_properties.title = f'№ {number} от {rus_month(date)}'
|
||||
document.core_properties.subject = type
|
||||
|
||||
section = document.sections[0]
|
||||
section.left_margin = Mm(30)
|
||||
section.right_margin = Mm(14)
|
||||
section.top_margin = Mm(10)
|
||||
section.bottom_margin = Mm(10)
|
||||
|
||||
# Меняем стиль абзаца по умолчанию:
|
||||
# получаем объект стиля `Normal`
|
||||
style = document.styles['Normal']
|
||||
# # изменяем настройки шрифта
|
||||
style.font.name = 'Times New Roman'
|
||||
style.font.size = Pt(FONT_SIZE)
|
||||
# # настраиваем красную строку абзаца
|
||||
style.paragraph_format.first_line_indent = Mm(0)
|
||||
style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
|
||||
style.paragraph_format.line_spacing = 1.0
|
||||
style.paragraph_format.space_after = 0
|
||||
|
||||
|
||||
def order_footer(document, list_proposers:Dict, list_approvers:Dict, rector:str):
|
||||
|
||||
p = document.add_paragraph(f'Ректор___________________________________________________{rector}')
|
||||
p.paragraph_format.space_before = Pt(30)
|
||||
p.paragraph_format.space_after = Pt(20)
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
|
||||
lines_number = max(len(list_approvers), len(list_proposers))
|
||||
table = document.add_table(rows=lines_number * 2 + 1, cols=2)
|
||||
|
||||
table.cell(0, 0).text = 'Проект вносят:'
|
||||
table.cell(0, 0).width = Mm(120)
|
||||
table.cell(0, 0).paragraphs[0].paragraph_format.space_after = Pt(8)
|
||||
table.cell(0, 1).text = 'Согласовано:'
|
||||
|
||||
number = 1
|
||||
for key, value in list_approvers.items():
|
||||
table.cell(number * 2 - 1, 1).text = key
|
||||
table.cell(number * 2 - 1, 1).paragraphs[0].paragraph_format.space_after = Pt(2)
|
||||
table.cell(number * 2, 1).text = f'_____________ {value}'
|
||||
table.cell(number * 2, 1).paragraphs[0].paragraph_format.space_after = Pt(4)
|
||||
number += 1
|
||||
|
||||
number = 1
|
||||
for key, value in list_proposers.items():
|
||||
table.cell(number * 2 - 1, 0).text = key
|
||||
table.cell(number * 2 - 1, 0).paragraphs[0].paragraph_format.space_after = Pt(2)
|
||||
table.cell(number * 2, 0).text = f'_____________ {value}'
|
||||
table.cell(number * 2, 0).paragraphs[0].paragraph_format.space_after = Pt(4)
|
||||
number += 1
|
||||
|
||||
# return document
|
||||
|
||||
|
||||
def order_by_id(order_id):
|
||||
'''Подготовка документа приказа по шаблону'''
|
||||
order = Orders.objects.get(pk=order_id)
|
||||
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('client')
|
||||
buf = io.BytesIO()
|
||||
text = '' if contracts.count()==1 else 'ы'
|
||||
|
||||
# document.add_paragraph(f'Основание: договор{text} на обучение')
|
||||
|
||||
|
||||
filename = order.template.file
|
||||
tpl = DocxTemplate(filename)
|
||||
|
||||
context = {
|
||||
'order': order,
|
||||
'contracts': contracts,
|
||||
'plural': text,
|
||||
|
||||
}
|
||||
tpl.render(context, jinja_env)
|
||||
tpl.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
|
||||
|
||||
def order_on_enrollment(object, contracts):
|
||||
buf = io.BytesIO()
|
||||
document = Document()
|
||||
|
||||
order_start(document, object.number, object.registered, object.type_order)
|
||||
|
||||
p = document.add_paragraph()
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
p.paragraph_format.space_before = Mm(90)
|
||||
run = p.add_run('О движении контингента слушателей ИДО')
|
||||
run.font.bold = True
|
||||
|
||||
document.add_paragraph()
|
||||
|
||||
p = document.add_paragraph()
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
run = p.add_run('ПРИКАЗЫВАЮ:')
|
||||
run.font.bold = True
|
||||
|
||||
p = document.add_paragraph(
|
||||
f'Зачислить с {rus_month(object.event_date)} в число слушателей ИДО ЮРГПУ(НПИ) по дополнительной профессиональной '
|
||||
'программе профессиональной переподготовки «Машины и оборудование нефтяных и газовых промыслов». Срок '
|
||||
'обучения – 521 час. Форма обучения заочная с применением электронного обучения и дистанционных '
|
||||
'образовательных технологий.'
|
||||
)
|
||||
p.paragraph_format.first_line_indent = Mm(12.5)
|
||||
p.paragraph_format.space_after = Pt(12)
|
||||
|
||||
table = document.add_table(rows=1, cols=2)
|
||||
for number, item in enumerate(contracts):
|
||||
cell = table.cell(number, 0)
|
||||
cell.text = f'{number+1}. {item.client.surname} {item.client.name} {item.client.patronymic}'
|
||||
p = cell.paragraphs[0]
|
||||
p.paragraph_format.first_line_indent = Mm(10)
|
||||
|
||||
cell = table.cell(number, 1)
|
||||
cell.text = f'{item.number}'
|
||||
|
||||
table.add_row()
|
||||
|
||||
text = '' if contracts.count()==1 else 'ы'
|
||||
|
||||
document.add_paragraph(f'Основание: договор{text} на обучение')
|
||||
|
||||
list_proposers = {
|
||||
'Директор ИДО': 'И. А. Ревин',
|
||||
}
|
||||
|
||||
list_approvers = {
|
||||
'Проректор по ОД': 'Е. М. Дьяконов',
|
||||
'Начальник ЮУ': 'Т. А. Кузьменко',
|
||||
'Директор ДЭиФ': 'А. П. Игнатьева',
|
||||
'Директор АД': 'Р. Г. Зайцев',
|
||||
}
|
||||
|
||||
order_footer(document, list_proposers, list_approvers, object.structure.rector)
|
||||
|
||||
document.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
|
||||
def order_on_theme(order, contracts):
|
||||
buf = io.BytesIO()
|
||||
document = Document()
|
||||
|
||||
order_start(document, order.number, order.registered, order.type_order)
|
||||
|
||||
p = document.add_paragraph()
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
p.paragraph_format.space_before = Mm(90)
|
||||
run = p.add_run('Об утверждении тем выпускных работ для слушателей ИДО')
|
||||
run.font.bold = True
|
||||
|
||||
document.add_paragraph()
|
||||
p = document.add_paragraph('В соответствии с дополнительной профессиональной программой профессиональной'
|
||||
' переподготовки «Машины и оборудование нефтяных и газовых промыслов»')
|
||||
p.paragraph_format.first_line_indent = Mm(12.5)
|
||||
|
||||
p = document.add_paragraph()
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
run = p.add_run('ПРИКАЗЫВАЮ:')
|
||||
run.font.bold = True
|
||||
|
||||
document.add_paragraph('1. Утвердить темы выпускных квалификационных работ слушателям по дополнительной '
|
||||
'профессиональной образовательной программе профессиональной переподготовки «Машины и оборудование '
|
||||
'нефтяных и газовых промыслов»:')
|
||||
|
||||
for number, item in enumerate(contracts):
|
||||
p = document.add_paragraph(f'1.{number+1}. {item.client.surname} {item.client.name} {item.client.patronymic}')
|
||||
p.paragraph_format.space_before = Pt(8)
|
||||
p.paragraph_format.first_line_indent = Mm(12.5)
|
||||
p.paragraph_format.keep_with_next = True
|
||||
|
||||
p = document.add_paragraph(f'{item.degree_work.title}. Руководитель: {item.degree_work.adviser.surname} {item.degree_work.adviser.name} {item.degree_work.adviser.patronymic} - ')
|
||||
if item.degree_work.adviser.degree:
|
||||
p.add_run(f'{str(item.degree_work.adviser.degree).lower()}, ')
|
||||
p.add_run(f'{str(item.degree_work.adviser.post).lower()} кафедры «{order.extract.department}».')
|
||||
p.add_run(f' Тема предложена кафедрой «{order.extract.department}».')
|
||||
|
||||
text = f'Основание: протокол заседания кафедры «{order.extract.department}» №{order.extract.number} от {rus_month(order.extract.date)}'
|
||||
|
||||
list_proposers = {
|
||||
'Директор ИДО': 'И. А. Ревин',
|
||||
}
|
||||
|
||||
list_approvers = {
|
||||
'Проректор по ОД': 'Е. М. Дьяконов',
|
||||
'Директор АД': 'Р. Г. Зайцев',
|
||||
}
|
||||
|
||||
order_footer(document, list_proposers, list_approvers, order.structure.rector)
|
||||
|
||||
document.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
def extract_department_meeting (object, contracts):
|
||||
|
||||
buf = io.BytesIO()
|
||||
document = Document()
|
||||
|
||||
section = document.sections[0]
|
||||
section.left_margin = Mm(20)
|
||||
section.right_margin = Mm(10)
|
||||
section.top_margin = Mm(10)
|
||||
section.bottom_margin = Mm(10)
|
||||
# Меняем стиль абзаца по умолчанию:
|
||||
# получаем объект стиля `Normal`
|
||||
style = document.styles['Normal']
|
||||
# # изменяем настройки шрифта
|
||||
style.font.name = 'Times New Roman'
|
||||
style.font.size = Pt(13)
|
||||
# # настраиваем красную строку абзаца
|
||||
# style.paragraph_format.first_line_indent = Mm(12.5)
|
||||
style.paragraph_format.first_line_indent = Mm(12.5)
|
||||
style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY
|
||||
style.paragraph_format.line_spacing = 1.2
|
||||
style.paragraph_format.space_after = 0
|
||||
|
||||
text = f'Выписка из протокола №{object.extract.number} заседания кафедры\n «{object.extract.department}» от {rus_month(object.extract.date)}'
|
||||
p = document.add_paragraph(text)
|
||||
p.paragraph_format.first_line_indent = Mm(0)
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
|
||||
|
||||
document.add_paragraph('СЛУШАЛИ:')
|
||||
document.add_paragraph(
|
||||
'Доцента кафедры ТМТМО, кандидата технических наук Мирного Сергея Георгиевича о рассмотрении'
|
||||
' тем выпускных квалификационных работ слушателям по дополнительному профессиональному '
|
||||
'образованию по направлению профессиональной переподготовки «Машины и оборудование нефтяных и '
|
||||
'газовых промыслов»')
|
||||
document.add_paragraph('ПОСТАНОВИЛИ:')
|
||||
document.add_paragraph('Ходатайствовать об утверждении тем выпускных квалификационных работ слушателям '
|
||||
'по дополнительному профессиональному образованию по направлению '
|
||||
'профессиональной переподготовки «Машины и оборудование нефтяных и '
|
||||
'газовых промыслов»:')
|
||||
for number, item in enumerate(contracts):
|
||||
p = document.add_paragraph(f'{number+1}. {item.client.surname} {item.client.name} {item.client.patronymic}')
|
||||
p.paragraph_format.keep_with_next = True
|
||||
p = document.add_paragraph(f'{item.degree_work.title}. Руководитель: {item.degree_work.adviser.surname} {item.degree_work.adviser.name} {item.degree_work.adviser.patronymic} - ')
|
||||
if item.degree_work.adviser.degree:
|
||||
p.add_run(f'{str(item.degree_work.adviser.degree).lower()}, ')
|
||||
p.add_run(f'{str(item.degree_work.adviser.post).lower()} кафедры «{object.extract.department}».')
|
||||
|
||||
document.add_paragraph()
|
||||
p = document.add_paragraph(f'Доцент кафедры «ТМТМО», \nкандидат технических наук, доцент \t\t\t\t'
|
||||
f'________________ {object.extract.speaker.name[:1]}. {object.extract.speaker.patronymic[:1]}. {object.extract.speaker.surname}')
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
|
||||
p.paragraph_format.first_line_indent = Mm(0)
|
||||
|
||||
p = document.add_paragraph(f'Секретарь \t\t\t\t\t\t\t\t'
|
||||
f'________________ {object.extract.secretary.name[:1]}. {object.extract.secretary.patronymic[:1]}. {object.extract.secretary.surname}')
|
||||
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
|
||||
p.paragraph_format.first_line_indent = Mm(0)
|
||||
p.paragraph_format.space_before = Pt(10)
|
||||
|
||||
document.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
|
||||
def protocol_by_order(order_id):
|
||||
'''Генерация протоколов защиты по айди приказа
|
||||
'''
|
||||
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('degree_work__protocol__number')
|
||||
buf = io.BytesIO()
|
||||
|
||||
last = len(contracts) - 1
|
||||
for n, item in enumerate(contracts):
|
||||
doc2 = Document(protocol_by_id(item.id))
|
||||
if n != last:
|
||||
doc2.add_page_break()
|
||||
if n == 0:
|
||||
composer = Composer(doc2)
|
||||
else:
|
||||
composer.append(doc2)
|
||||
|
||||
composer.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
|
||||
def memo_by_order(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', )
|
||||
|
||||
buf = io.BytesIO()
|
||||
|
||||
filename = acces.template.file
|
||||
tpl = DocxTemplate(filename)
|
||||
|
||||
date = acces.registration_date
|
||||
number = acces.number
|
||||
context = {
|
||||
'contracts': contracts,
|
||||
'date': date,
|
||||
'number': number,
|
||||
}
|
||||
tpl.render(context, jinja_env)
|
||||
tpl.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
|
||||
def protocol_by_id(contract_id):
|
||||
'''Генерация протокола защиты ВКР по айди договора
|
||||
'''
|
||||
contract = Contracts.objects.get(pk=contract_id)
|
||||
questions = Protocols.objects.get(pk=contract.degree_work.protocol.pk).questions.all()
|
||||
|
||||
buf = io.BytesIO()
|
||||
|
||||
filename = contract.degree_work.protocol.template.file
|
||||
tpl = DocxTemplate(filename)
|
||||
|
||||
dt = contract.degree_work.protocol.date_time
|
||||
dte = dt + timedelta(minutes=25)
|
||||
date_time = f'{rus_month(dt)}г. c {dt:%H} час. {dt:%M} мин. до {dte:%H} час. {dte:%M} мин.'
|
||||
|
||||
context = {
|
||||
'contract': contract,
|
||||
'title': contract.degree_work.title,
|
||||
'date_time': date_time,
|
||||
'questions': questions,
|
||||
'fio_genitive': f'{contract.client.surname_cases.genitive} {contract.client.name_cases.genitive} {contract.client.patronymic_cases.genitive}',
|
||||
'fio_dative': f'{contract.client.surname_cases.dative} {contract.client.name_cases.dative[:1]}. {contract.client.patronymic_cases.dative[:1]}.'
|
||||
}
|
||||
tpl.render(context)
|
||||
tpl.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
def filefor_registry(order_id):
|
||||
'''генерация файла с данными для внесения в базу по дипломам'''
|
||||
order = Orders.objects.get(pk=order_id)
|
||||
contracts = Orders.objects.get(pk=order_id).contracts.all().order_by('client')
|
||||
|
||||
filename = os.path.join(settings.MEDIA_ROOT, 'templates\for_registry1.xlsx' )
|
||||
wb = Workbook()
|
||||
buf = io.BytesIO()
|
||||
|
||||
ws = wb.active
|
||||
# ws.append(['Фамилия', 'Имя', 'Отчество', 'Дата рождения', 'СНИЛС', 'Диплом серия/номер', 'Начало обучения', 'Конец обучения'])
|
||||
string_stub = ''
|
||||
for item in contracts:
|
||||
print(item.client.diploma)
|
||||
ws.append([
|
||||
'Диплом о профессиональной переподготовке',
|
||||
'Оригинал',
|
||||
'Нет',
|
||||
'Нет',
|
||||
'Нет',
|
||||
'Нет',
|
||||
'',
|
||||
f'{item.end_date:%d.%m.%Y}',
|
||||
# '05/07/2024',
|
||||
'',
|
||||
'Профессиональная переподготовка',
|
||||
'Машины и оборудование нефтяных и газовых промыслов',
|
||||
'Добыча, переработка, транспортировка нефти и газа',
|
||||
'Бурение скважин, добыча нефти и газа',
|
||||
'Образование',
|
||||
'Высшее образование',
|
||||
item.client.surname,
|
||||
f'{item.client.diploma.series if item.client.diploma else string_stub}',
|
||||
f'{item.client.diploma.number if item.client.diploma else string_stub}',
|
||||
f'{item.start_date:%Y}',
|
||||
f'{item.end_date:%Y}',
|
||||
'521',
|
||||
item.client.surname,
|
||||
item.client.name,
|
||||
item.client.patronymic,
|
||||
f'{item.client.birthdate:%d.%m.%Y}',
|
||||
f'{"Муж" if item.client.gender=="муж." else "Жен"}',
|
||||
item.client.snils,
|
||||
'Заочная',
|
||||
'Платное обучение',
|
||||
'в образовательной организации',
|
||||
'643',
|
||||
# f'{item.start_date:%d.%m.%Y}',
|
||||
# f'{item.end_date:%d.%m.%Y}',
|
||||
])
|
||||
|
||||
wb.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
|
||||
def gen_diploma(contract, form:bool):
|
||||
|
||||
buf = io.BytesIO()
|
||||
document_name = 'templates\diploma_form.docx' if form else 'templates\diploma_supplement.docx'
|
||||
filename = os.path.join(settings.MEDIA_ROOT, document_name)
|
||||
tpl = DocxTemplate(filename)
|
||||
|
||||
context = {
|
||||
'surname': contract.client.surname,
|
||||
'name': contract.client.name,
|
||||
'patronymic': contract.client.patronymic,
|
||||
'diploma_number': contract.degree_work.diploma_number,
|
||||
'registration_number': contract.degree_work.registration_number,
|
||||
'start_date': rus_month(contract.start_date),
|
||||
'end_date': rus_month(contract.end_date),
|
||||
'protocol_date': f'{contract.degree_work.protocol.date_time:%d.%m.%Y}',
|
||||
'protocol_number': contract.degree_work.protocol.number,
|
||||
}
|
||||
|
||||
tpl.render(context)
|
||||
tpl.save(buf)
|
||||
buf.seek(0)
|
||||
|
||||
return buf
|
||||
90
retraining/main/migrations/0001_initial.py
Normal file
90
retraining/main/migrations/0001_initial.py
Normal file
@@ -0,0 +1,90 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-20 08:42
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Groups',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='Обозначение')),
|
||||
('graduation_at', models.CharField(max_length=4, verbose_name='Год выпуска')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Группа',
|
||||
'verbose_name_plural': 'Группы',
|
||||
'ordering': ['-graduation_at', 'title'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Worker',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('surname', models.CharField(max_length=30, verbose_name='Фамилия')),
|
||||
('name', models.CharField(max_length=20, verbose_name='Имя')),
|
||||
('patronymic', models.CharField(blank=True, max_length=25, verbose_name='Отчество')),
|
||||
('birthdate', models.DateField(blank=True, verbose_name='День рождения')),
|
||||
('gender', models.CharField(choices=[('муж.', 'Мужчина'), ('жен.', 'Женщина')], default='муж.', max_length=4, verbose_name='Пол')),
|
||||
('phone', models.CharField(blank=True, max_length=20, verbose_name='Номер телефона')),
|
||||
('e_mail', models.CharField(blank=True, max_length=70, verbose_name='Электронная почта')),
|
||||
('added_at', models.DateTimeField(auto_now_add=True, verbose_name='Добавлен')),
|
||||
('slug', models.SlugField(allow_unicode=True, unique=True)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Students',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('surname', models.CharField(max_length=30, verbose_name='Фамилия')),
|
||||
('name', models.CharField(max_length=20, verbose_name='Имя')),
|
||||
('patronymic', models.CharField(blank=True, max_length=25, verbose_name='Отчество')),
|
||||
('birthdate', models.DateField(blank=True, verbose_name='День рождения')),
|
||||
('gender', models.CharField(choices=[('муж.', 'Мужчина'), ('жен.', 'Женщина')], default='муж.', max_length=4, verbose_name='Пол')),
|
||||
('phone', models.CharField(blank=True, max_length=20, verbose_name='Номер телефона')),
|
||||
('e_mail', models.CharField(blank=True, max_length=70, verbose_name='Электронная почта')),
|
||||
('added_at', models.DateTimeField(auto_now_add=True, verbose_name='Добавлен')),
|
||||
('slug', models.SlugField(allow_unicode=True, unique=True)),
|
||||
('photo', models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото')),
|
||||
('group', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.groups', verbose_name='Группа')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Студента',
|
||||
'verbose_name_plural': 'Студенты',
|
||||
'ordering': ['group', 'surname', 'name'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Emploees',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('surname', models.CharField(max_length=30, verbose_name='Фамилия')),
|
||||
('name', models.CharField(max_length=20, verbose_name='Имя')),
|
||||
('patronymic', models.CharField(blank=True, max_length=25, verbose_name='Отчество')),
|
||||
('birthdate', models.DateField(blank=True, verbose_name='День рождения')),
|
||||
('gender', models.CharField(choices=[('муж.', 'Мужчина'), ('жен.', 'Женщина')], default='муж.', max_length=4, verbose_name='Пол')),
|
||||
('phone', models.CharField(blank=True, max_length=20, verbose_name='Номер телефона')),
|
||||
('e_mail', models.CharField(blank=True, max_length=70, verbose_name='Электронная почта')),
|
||||
('added_at', models.DateTimeField(auto_now_add=True, verbose_name='Добавлен')),
|
||||
('slug', models.SlugField(allow_unicode=True, unique=True)),
|
||||
('photo', models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото')),
|
||||
('group', models.ManyToManyField(to='main.groups', verbose_name='Группы')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Сотрудника',
|
||||
'verbose_name_plural': 'Сотрудники',
|
||||
'ordering': ['surname', 'name'],
|
||||
},
|
||||
),
|
||||
]
|
||||
27
retraining/main/migrations/0002_contracts.py
Normal file
27
retraining/main/migrations/0002_contracts.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-20 14:16
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Contracts',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.CharField(max_length=20, unique=True, verbose_name='Номер договора')),
|
||||
('start_date', models.DateField(verbose_name='Начало обучения')),
|
||||
('end_date', models.DateField(verbose_name='Окончание обучения')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Договор',
|
||||
'verbose_name_plural': 'Договоры',
|
||||
'ordering': ['-number'],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,55 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-20 15:20
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0002_contracts'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='client',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to='main.students', verbose_name='Клиент'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='name_genitive',
|
||||
field=models.CharField(blank=True, max_length=50, verbose_name='Имя в родительном'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='patronymic_genitive',
|
||||
field=models.CharField(blank=True, max_length=50, verbose_name='Отчество в родительном'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='surname_genitive',
|
||||
field=models.CharField(blank=True, max_length=50, verbose_name='Фамилия в родительном'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='group',
|
||||
field=models.ManyToManyField(blank=True, to='main.groups', verbose_name='Группы'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='photo',
|
||||
field=models.ImageField(blank=True, upload_to='photos/%Y/%m/%d/', verbose_name='Фото'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Structures',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('warrant', models.CharField(max_length=50, verbose_name='Довереность (№, от)')),
|
||||
('responsible_ido', models.CharField(max_length=50, verbose_name='Ответственный от ИДО')),
|
||||
('responsible_def', models.CharField(max_length=50, verbose_name='Ответственный от ДЭиФ')),
|
||||
('director_ido', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.emploees', verbose_name='Директор ИДО')),
|
||||
],
|
||||
),
|
||||
]
|
||||
17
retraining/main/migrations/0004_alter_structures_options.py
Normal file
17
retraining/main/migrations/0004_alter_structures_options.py
Normal file
@@ -0,0 +1,17 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-20 15:32
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0003_contracts_client_emploees_name_genitive_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='structures',
|
||||
options={'ordering': [], 'verbose_name': 'Структуру', 'verbose_name_plural': 'Структуры'},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-20 17:57
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0004_alter_structures_options'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='structures',
|
||||
name='warrant',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='structures',
|
||||
name='warrant_date',
|
||||
field=models.DateField(default='2022-05-05', verbose_name='Довереность от'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='structures',
|
||||
name='warrant_number',
|
||||
field=models.CharField(default=1, max_length=15, verbose_name='Довереность №'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
20
retraining/main/migrations/0006_contracts_structure.py
Normal file
20
retraining/main/migrations/0006_contracts_structure.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-20 18:01
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0005_remove_structures_warrant_structures_warrant_date_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='structure',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to='main.structures', verbose_name='Текущая структура'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.1.1 on 2022-09-23 18:03
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0006_contracts_structure'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='structures',
|
||||
options={'ordering': ['-warrant_date'], 'verbose_name': 'Структуру', 'verbose_name_plural': 'Структуры'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='photo',
|
||||
field=models.ImageField(blank=True, upload_to='photos/%Y/%m/%d/', verbose_name='Фото'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,59 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-10 09:16
|
||||
|
||||
import autoslug.fields
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0007_alter_structures_options_alter_students_photo'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Diplomas',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('series', models.CharField(max_length=4, verbose_name='Серия')),
|
||||
('number', models.CharField(max_length=20, verbose_name='Номер')),
|
||||
('issued_date', models.DateField(verbose_name='Дата выдачи')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Passports',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('series', models.CharField(max_length=4, verbose_name='Серия')),
|
||||
('number', models.CharField(max_length=20, verbose_name='Номер')),
|
||||
('issued_date', models.DateField(verbose_name='Дата выдачи')),
|
||||
('issued_department', models.CharField(max_length=50, verbose_name='Наименование подразделения')),
|
||||
('address_registration', models.TextField(verbose_name='Адрес проживания')),
|
||||
],
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='students',
|
||||
options={'ordering': ['surname', 'name'], 'verbose_name': 'Студента', 'verbose_name_plural': 'Студенты'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='students',
|
||||
name='snils',
|
||||
field=models.CharField(blank=True, max_length=50, verbose_name='Номер СНИЛС'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='slug',
|
||||
field=autoslug.fields.AutoSlugField(editable=True, populate_from='title'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='students',
|
||||
name='diploma',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.diplomas', verbose_name='Диплом'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='students',
|
||||
name='passport',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.passports', verbose_name='Паспорт'),
|
||||
),
|
||||
]
|
||||
18
retraining/main/migrations/0009_contracts_agreement_date.py
Normal file
18
retraining/main/migrations/0009_contracts_agreement_date.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-10 21:57
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0008_diplomas_passports_alter_students_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='agreement_date',
|
||||
field=models.DateField(default='2022-05-05', verbose_name='Дата заключения'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,65 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-11 09:25
|
||||
|
||||
import autoslug.fields
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0009_contracts_agreement_date'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Order_types',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=150, verbose_name='Наименование')),
|
||||
('body', models.TextField(verbose_name='Текст до таблицы')),
|
||||
('footer', models.TextField(verbose_name='Заключение')),
|
||||
],
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='diplomas',
|
||||
options={'verbose_name': 'Диплом', 'verbose_name_plural': 'Дипломы'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='passports',
|
||||
options={'verbose_name': 'Паспорт', 'verbose_name_plural': 'Паспорта'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='structures',
|
||||
name='rector',
|
||||
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Ректор'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='diplomas',
|
||||
name='series',
|
||||
field=models.CharField(max_length=8, verbose_name='Серия'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='passports',
|
||||
name='series',
|
||||
field=models.CharField(max_length=5, verbose_name='Серия'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='slug',
|
||||
field=autoslug.fields.AutoSlugField(editable=True, populate_from='title', unique=True),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Orders',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.CharField(blank=True, max_length=50, verbose_name='Номер')),
|
||||
('registered', models.DateField(blank=True, verbose_name='от')),
|
||||
('event_date', models.DateField(verbose_name='дата вступления в силу')),
|
||||
('emploees', models.ManyToManyField(blank=True, to='main.emploees', verbose_name='Сотрудники')),
|
||||
('structure', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.structures', verbose_name='Текущая структура')),
|
||||
('students', models.ManyToManyField(blank=True, to='main.students', verbose_name='Студенты')),
|
||||
('type_order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.order_types', verbose_name='Тип приказа')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-11 12:06
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0010_order_types_alter_diplomas_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='orders',
|
||||
name='students',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='orders',
|
||||
name='conracts',
|
||||
field=models.ManyToManyField(blank=True, to='main.contracts', verbose_name='Студенты'),
|
||||
),
|
||||
]
|
||||
19
retraining/main/migrations/0012_alter_students_slug.py
Normal file
19
retraining/main/migrations/0012_alter_students_slug.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-12 14:56
|
||||
|
||||
import autoslug.fields
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0011_remove_orders_students_orders_conracts'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='slug',
|
||||
field=autoslug.fields.AutoSlugField(editable=False, populate_from='title', unique=True),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-12 15:43
|
||||
|
||||
import autoslug.fields
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0012_alter_students_slug'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='students',
|
||||
options={'ordering': ['group', 'surname', 'name'], 'verbose_name': 'Студента', 'verbose_name_plural': 'Студенты'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='passports',
|
||||
name='issued_department',
|
||||
field=models.CharField(max_length=150, verbose_name='Наименование подразделения'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='slug',
|
||||
field=autoslug.fields.AutoSlugField(editable=False, populate_from='surname', unique=True),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,32 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-20 10:34
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0013_alter_students_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='orders',
|
||||
options={'ordering': ['-registered'], 'verbose_name': 'Приказ', 'verbose_name_plural': 'Приказы'},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Sertificates',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.CharField(blank=True, max_length=50, verbose_name='Исходящий номер')),
|
||||
('registered', models.DateField(blank=True, verbose_name='Зарегистрированна')),
|
||||
('order', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.orders', verbose_name='Приказ')),
|
||||
('student', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.students', verbose_name='Студент')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Справку',
|
||||
'verbose_name_plural': 'Справки',
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-29 12:51
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0014_alter_orders_options_sertificates'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='sertificates',
|
||||
name='student',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='sertificates',
|
||||
name='contract',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to='main.contracts', verbose_name='Договор'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,65 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-29 13:25
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0015_remove_sertificates_student_sertificates_contract'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Name_cases',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('genitive', models.CharField(max_length=50, verbose_name='Родительный')),
|
||||
('dative', models.CharField(max_length=50, verbose_name='Дательный')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Падеж имени',
|
||||
'verbose_name_plural': 'Падежи имени',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Patronymic_cases',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('genitive', models.CharField(max_length=50, verbose_name='Родительный')),
|
||||
('dative', models.CharField(max_length=50, verbose_name='Дательный')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Падеж отчества',
|
||||
'verbose_name_plural': 'Падежи отчества',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Surname_cases',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('genitive', models.CharField(max_length=50, verbose_name='Родительный')),
|
||||
('dative', models.CharField(max_length=50, verbose_name='Дательный')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Падеж фамилии',
|
||||
'verbose_name_plural': 'Падежи фамилии',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='students',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='worker',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,32 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-29 13:27
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0016_name_cases_patronymic_cases_surname_cases_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, default=1, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, default=1, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='worker',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, default=1, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,29 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-29 13:31
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0017_alter_emploees_surname_cases_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='worker',
|
||||
name='surname_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,44 @@
|
||||
# Generated by Django 4.1.1 on 2022-10-29 13:33
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0018_alter_emploees_surname_cases_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='name_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.name_cases', verbose_name='падежи имени'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='patronymic_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.patronymic_cases', verbose_name='падежи отчества'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='students',
|
||||
name='name_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.name_cases', verbose_name='падежи имени'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='students',
|
||||
name='patronymic_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.patronymic_cases', verbose_name='падежи отчества'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='worker',
|
||||
name='name_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.name_cases', verbose_name='падежи имени'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='worker',
|
||||
name='patronymic_cases',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.patronymic_cases', verbose_name='падежи отчества'),
|
||||
),
|
||||
]
|
||||
18
retraining/main/migrations/0020_orders_scan.py
Normal file
18
retraining/main/migrations/0020_orders_scan.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-01 07:07
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0019_emploees_name_cases_emploees_patronymic_cases_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='orders',
|
||||
name='scan',
|
||||
field=models.FileField(blank=True, upload_to='pdf/%Y/%m/%d/', verbose_name='Скан документа'),
|
||||
),
|
||||
]
|
||||
18
retraining/main/migrations/0021_alter_orders_scan.py
Normal file
18
retraining/main/migrations/0021_alter_orders_scan.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-01 09:10
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0020_orders_scan'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='orders',
|
||||
name='scan',
|
||||
field=models.FileField(blank=True, upload_to='pdf/%Y/%m/', verbose_name='Скан документа'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-01 09:11
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0021_alter_orders_scan'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='scan',
|
||||
field=models.FileField(blank=True, upload_to='pdf/contracts/%Y/%m/', verbose_name='Скан документа'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='orders',
|
||||
name='scan',
|
||||
field=models.FileField(blank=True, upload_to='pdf/orders/%Y/%m/', verbose_name='Скан документа'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-01 14:59
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0022_contracts_scan_alter_orders_scan'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='paymenе_date1',
|
||||
field=models.DateField(default='2021-09-30', verbose_name='Дата оплаты 1 семестра'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='paymenе_date2',
|
||||
field=models.DateField(default='2022-02-01', verbose_name='Дата оплаты 2 семестра'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='paymenе_date3',
|
||||
field=models.DateField(default='2022-09-01', verbose_name='Дата оплаты 3 семестра'),
|
||||
),
|
||||
]
|
||||
18
retraining/main/migrations/0024_sertificates_scan.py
Normal file
18
retraining/main/migrations/0024_sertificates_scan.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-02 06:32
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0023_contracts_paymenе_date1_contracts_paymenе_date2_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='sertificates',
|
||||
name='scan',
|
||||
field=models.FileField(blank=True, upload_to='pdf/sertificates/%Y/%m/', verbose_name='Скан документа'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-04 08:06
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0024_sertificates_scan'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='groups',
|
||||
options={'ordering': ['-graduation_at', '-title'], 'verbose_name': 'Группа', 'verbose_name_plural': 'Группы'},
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='orders',
|
||||
old_name='conracts',
|
||||
new_name='contracts',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,59 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-06 10:19
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0025_alter_groups_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='group',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to='main.groups', verbose_name='Группа'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='contracts',
|
||||
name='client',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.students', verbose_name='Обучающийся'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='slug',
|
||||
field=models.SlugField(allow_unicode=True, unique=True),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Customers',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('surname', models.CharField(max_length=30, verbose_name='Фамилия')),
|
||||
('name', models.CharField(max_length=20, verbose_name='Имя')),
|
||||
('patronymic', models.CharField(blank=True, max_length=25, verbose_name='Отчество')),
|
||||
('birthdate', models.DateField(blank=True, verbose_name='День рождения')),
|
||||
('gender', models.CharField(choices=[('муж.', 'Мужчина'), ('жен.', 'Женщина')], default='муж.', max_length=4, verbose_name='Пол')),
|
||||
('phone', models.CharField(blank=True, max_length=20, verbose_name='Номер телефона')),
|
||||
('e_mail', models.CharField(blank=True, max_length=70, verbose_name='Электронная почта')),
|
||||
('added_at', models.DateTimeField(auto_now_add=True, verbose_name='Добавлен')),
|
||||
('slug', models.SlugField(allow_unicode=True, unique=True)),
|
||||
('name_cases', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.name_cases', verbose_name='падежи имени')),
|
||||
('passport', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.passports', verbose_name='Паспорт')),
|
||||
('patronymic_cases', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.patronymic_cases', verbose_name='падежи отчества')),
|
||||
('surname_cases', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.surname_cases', verbose_name='падежи фамилии')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Заказчика',
|
||||
'verbose_name_plural': 'Заказчики',
|
||||
'ordering': ['surname', 'name'],
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='сustomer',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.customers', verbose_name='Заказчик'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-06 17:36
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0026_contracts_group_alter_contracts_client_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='contracts',
|
||||
options={'ordering': ['-agreement_date', '-number'], 'verbose_name': 'Договор', 'verbose_name_plural': 'Договоры'},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='customers',
|
||||
name='slug',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='emploees',
|
||||
name='slug',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='students',
|
||||
name='slug',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='worker',
|
||||
name='slug',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 4.1.1 on 2022-11-06 22:23
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0027_alter_contracts_options_remove_customers_slug_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='contracts',
|
||||
old_name='сustomer',
|
||||
new_name='customer',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='contracts',
|
||||
old_name='paymenе_date1',
|
||||
new_name='payment_date1',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='contracts',
|
||||
old_name='paymenе_date2',
|
||||
new_name='payment_date2',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='contracts',
|
||||
old_name='paymenе_date3',
|
||||
new_name='payment_date3',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,98 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-06 12:34
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0028_rename_сustomer_contracts_customer_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Grade',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=50, verbose_name='Звание')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Post',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=50, verbose_name='Должность')),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='structures',
|
||||
name='res_def',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, related_name='res_def', to='main.emploees', verbose_name='Ответственный от ДЭиФ'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='structures',
|
||||
name='res_ido',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, related_name='res_ido', to='main.emploees', verbose_name='Ответственный от ИДО'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='structures',
|
||||
name='director_ido',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='dir_ido', to='main.emploees', verbose_name='Директор ИДО'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Questions',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('body', models.TextField(verbose_name='Вопрос')),
|
||||
('member', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.emploees', verbose_name='Член комиссии')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Вопрос',
|
||||
'verbose_name_plural': 'Вопросы',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Protocols',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.IntegerField(verbose_name='Номер протокола')),
|
||||
('date_time', models.DateTimeField(verbose_name='Дата и время протокола')),
|
||||
('questions', models.ManyToManyField(related_name='Вопросы', to='main.questions')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Протокол',
|
||||
'verbose_name_plural': 'Протоколы',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Diploms',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=200, verbose_name='Тема работы')),
|
||||
('adviser', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='main.emploees', verbose_name='Руководитель работы')),
|
||||
('protocol', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.protocols', verbose_name='Протокол защиты')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Диплом',
|
||||
'verbose_name_plural': 'Дипломы',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='contracts',
|
||||
name='diplom',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.diploms', verbose_name='ВКР'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='grade',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='main.grade', verbose_name='Звание'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='post',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='main.post', verbose_name='Должность'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,52 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-07 09:01
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0029_grade_post_structures_res_def_structures_res_ido_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='protocols',
|
||||
options={'ordering': ['-date_time'], 'verbose_name': 'Протокол', 'verbose_name_plural': 'Протоколы'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='students',
|
||||
options={'ordering': ['surname', 'name'], 'verbose_name': 'Студента', 'verbose_name_plural': 'Студенты'},
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='emploees',
|
||||
name='group',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='emploees',
|
||||
name='name_genitive',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='emploees',
|
||||
name='patronymic_genitive',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='emploees',
|
||||
name='surname_genitive',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='students',
|
||||
name='group',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='grade',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.grade', verbose_name='Звание'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='post',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.post', verbose_name='Должность'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,38 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-09 12:38
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0030_alter_protocols_options_alter_students_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Degree',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=50, verbose_name='Степень')),
|
||||
],
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='name_cases',
|
||||
options={'ordering': ['genitive'], 'verbose_name': 'Падеж имени', 'verbose_name_plural': 'Падежи имени'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='patronymic_cases',
|
||||
options={'ordering': ['genitive'], 'verbose_name': 'Падеж отчества', 'verbose_name_plural': 'Падежи отчества'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='surname_cases',
|
||||
options={'ordering': ['genitive'], 'verbose_name': 'Падеж фамилии', 'verbose_name_plural': 'Падежи фамилии'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='degree',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.degree', verbose_name='Ученая степень'),
|
||||
),
|
||||
]
|
||||
19
retraining/main/migrations/0032_emploees_department.py
Normal file
19
retraining/main/migrations/0032_emploees_department.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-09 12:44
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0031_degree_alter_name_cases_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='emploees',
|
||||
name='department',
|
||||
field=models.CharField(default=1, max_length=255, verbose_name='Подразделение'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,34 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-10 17:33
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0032_emploees_department'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Passport_department',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('code', models.CharField(max_length=7, verbose_name='Код подразделения')),
|
||||
('title', models.CharField(max_length=255, verbose_name='Наименование подразделения')),
|
||||
],
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='diplomas',
|
||||
options={'verbose_name': 'Полученный Диплом', 'verbose_name_plural': 'Полученные Дипломы'},
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Worker',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='passports',
|
||||
name='passport_department',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='main.passport_department', verbose_name='Код подразделения'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,35 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-13 08:56
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0033_passport_department_alter_diplomas_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameModel(
|
||||
old_name='Diploms',
|
||||
new_name='Degree_works',
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='degree_works',
|
||||
options={'verbose_name': 'ВКР', 'verbose_name_plural': 'ВКР'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='passport_department',
|
||||
options={'verbose_name': 'Паспортное подразделение', 'verbose_name_plural': 'Паспортные подразделения'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='order_types',
|
||||
name='body',
|
||||
field=models.TextField(blank=True, verbose_name='Текст вводной'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='order_types',
|
||||
name='footer',
|
||||
field=models.TextField(verbose_name='Основание'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-13 09:45
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0034_rename_diploms_degree_works_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='contracts',
|
||||
old_name='diplom',
|
||||
new_name='degree_work',
|
||||
),
|
||||
]
|
||||
33
retraining/main/migrations/0036_extracts_orders_extract.py
Normal file
33
retraining/main/migrations/0036_extracts_orders_extract.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-14 06:42
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0035_rename_diplom_contracts_degree_work'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Extracts',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.CharField(max_length=5, verbose_name='Номер')),
|
||||
('date', models.DateField(verbose_name='Дата')),
|
||||
('secretary', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='secretary', to='main.emploees', verbose_name='Секретарь')),
|
||||
('speaker', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='speaker', to='main.emploees', verbose_name='Докладчик')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Выписку',
|
||||
'verbose_name_plural': 'Выписки',
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='orders',
|
||||
name='extract',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.extracts', verbose_name='Выписка'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-14 07:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0036_extracts_orders_extract'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='extracts',
|
||||
name='department',
|
||||
field=models.CharField(default=2012, max_length=255, verbose_name='Подразделение'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='extracts',
|
||||
name='number',
|
||||
field=models.CharField(max_length=5, verbose_name='Номер протокола'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-16 13:25
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0037_extracts_department_alter_extracts_number'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='groups',
|
||||
options={'ordering': ['-graduation_date', '-graduation_at', '-title'], 'verbose_name': 'Группа', 'verbose_name_plural': 'Группы'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='groups',
|
||||
name='graduation_date',
|
||||
field=models.DateField(null=True, verbose_name='Дата выпуска'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,37 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-20 12:27
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0038_alter_groups_options_groups_graduation_date'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Template_files',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('date', models.DateField(auto_now_add=True, verbose_name='Дата шаблона')),
|
||||
('title', models.CharField(max_length=50, verbose_name='Название')),
|
||||
('file', models.FileField(blank=True, upload_to='templates/%Y/%m', verbose_name='Файл шаблона')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Шаблон',
|
||||
'verbose_name_plural': 'Шаблоны',
|
||||
},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='groups',
|
||||
options={'ordering': ['-graduation_date', '-title'], 'verbose_name': 'Группа', 'verbose_name_plural': 'Группы'},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='protocols',
|
||||
name='template',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to='main.template_files', verbose_name='Шаблон'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-27 09:41
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0039_template_files_alter_groups_options_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='degree_works',
|
||||
name='score',
|
||||
field=models.CharField(choices=[('3', 'удовлетворительно'), ('4', 'хорошо'), ('5', 'отлично')], default='4', max_length=4, verbose_name='Оценка'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='protocols',
|
||||
name='questions',
|
||||
field=models.ManyToManyField(to='main.questions', verbose_name='Вопросы'),
|
||||
),
|
||||
]
|
||||
18
retraining/main/migrations/0041_alter_degree_works_score.py
Normal file
18
retraining/main/migrations/0041_alter_degree_works_score.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-27 09:47
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0040_degree_works_score_alter_protocols_questions'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='degree_works',
|
||||
name='score',
|
||||
field=models.CharField(choices=[('удовлетворительно', 'удовлетворительно'), ('хорошо', 'хорошо'), ('отлично', 'отлично')], default='хорошо', max_length=40, verbose_name='Оценка'),
|
||||
),
|
||||
]
|
||||
19
retraining/main/migrations/0042_orders_template.py
Normal file
19
retraining/main/migrations/0042_orders_template.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 4.1.1 on 2022-12-28 06:08
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0041_alter_degree_works_score'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='orders',
|
||||
name='template',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.template_files', verbose_name='Шаблон'),
|
||||
),
|
||||
]
|
||||
25
retraining/main/migrations/0043_access_lists.py
Normal file
25
retraining/main/migrations/0043_access_lists.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 4.1.1 on 2023-04-14 14:13
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0042_orders_template'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Access_lists',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('registration_date', models.DateField(verbose_name='от')),
|
||||
('students', models.ManyToManyField(blank=True, to='main.contracts', verbose_name='Студенты')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Пропуск',
|
||||
'verbose_name_plural': 'Пропуски',
|
||||
},
|
||||
),
|
||||
]
|
||||
19
retraining/main/migrations/0044_access_lists_template.py
Normal file
19
retraining/main/migrations/0044_access_lists_template.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 4.1.1 on 2023-04-21 14:21
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0043_access_lists'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='access_lists',
|
||||
name='template',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='main.template_files', verbose_name='Шаблон'),
|
||||
),
|
||||
]
|
||||
18
retraining/main/migrations/0045_access_lists_number.py
Normal file
18
retraining/main/migrations/0045_access_lists_number.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2023-04-21 15:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0044_access_lists_template'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='access_lists',
|
||||
name='number',
|
||||
field=models.CharField(blank=True, max_length=10, verbose_name='Номер'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
# Generated by Django 4.1.1 on 2023-09-30 21:52
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0045_access_lists_number'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameModel(
|
||||
old_name='Surname_cases',
|
||||
new_name='SurnameCases',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,51 @@
|
||||
# Generated by Django 4.1.1 on 2023-10-01 20:08
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0046_rename_surname_cases_surnamecases'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameModel(
|
||||
old_name='Name_cases',
|
||||
new_name='NameCases',
|
||||
),
|
||||
migrations.RenameModel(
|
||||
old_name='Passport_department',
|
||||
new_name='PassportDepartment',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='customers',
|
||||
name='birthdate',
|
||||
field=models.DateField(blank=True, null=True, verbose_name='День рождения'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='emploees',
|
||||
name='birthdate',
|
||||
field=models.DateField(blank=True, null=True, verbose_name='День рождения'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='sertificates',
|
||||
name='registered',
|
||||
field=models.DateField(blank=True, verbose_name='Зарегистрирована'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='structures',
|
||||
name='warrant_date',
|
||||
field=models.DateField(default='2022-05-05', verbose_name='Доверенность от'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='structures',
|
||||
name='warrant_number',
|
||||
field=models.CharField(max_length=15, verbose_name='Доверенность №'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='students',
|
||||
name='birthdate',
|
||||
field=models.DateField(blank=True, null=True, verbose_name='День рождения'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2024-02-01 11:38
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0047_rename_name_cases_namecases_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='degree_works',
|
||||
name='registration_number',
|
||||
field=models.IntegerField(blank=True, null=True, verbose_name='Регистрационный номер'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.1.1 on 2024-02-01 12:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('main', '0048_degree_works_registration_number'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='degree_works',
|
||||
name='diploma_number',
|
||||
field=models.CharField(blank=True, max_length=45, null=True, verbose_name='Номер диплома'),
|
||||
),
|
||||
]
|
||||
0
retraining/main/migrations/__init__.py
Normal file
0
retraining/main/migrations/__init__.py
Normal file
492
retraining/main/models.py
Normal file
492
retraining/main/models.py
Normal file
@@ -0,0 +1,492 @@
|
||||
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})
|
||||
43
retraining/main/templates/main/access.html
Normal file
43
retraining/main/templates/main/access.html
Normal file
@@ -0,0 +1,43 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Дата заключения</th>
|
||||
<th scope="col">Срок обучения</th>
|
||||
<th scope="col">Группа</th>
|
||||
<th scope="col">Скан</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr>
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td><a href=" {{item.get_absolute_url}}">{{item.registration_date|date:"SHORT_DATE_FORMAT"}}</a></td>
|
||||
<td>с {{item.start_date|date:"SHORT_DATE_FORMAT"}} по {{item.end_date|date:"SHORT_DATE_FORMAT"}}</td>
|
||||
<td><a href=" {{item.group.get_absolute_url}}">{{ item.group }}</a></td>
|
||||
{% if item.scan %}
|
||||
<td><a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a></td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
12
retraining/main/templates/main/blank.html
Normal file
12
retraining/main/templates/main/blank.html
Normal file
@@ -0,0 +1,12 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
{# ----- Вставь свой код сюда ----- #}
|
||||
{% endblock content %}
|
||||
|
||||
53
retraining/main/templates/main/contracts.html
Normal file
53
retraining/main/templates/main/contracts.html
Normal file
@@ -0,0 +1,53 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Номер договора</th>
|
||||
<th scope="col">Обучающийся</th>
|
||||
<th scope="col">Дата заключения</th>
|
||||
<th scope="col">Срок обучения</th>
|
||||
<th scope="col">Группа</th>
|
||||
<th scope="col">Скан</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr>
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td><a href=" {{item.get_absolute_url}}">{{ item.number}}</a></td>
|
||||
<td>
|
||||
<a href="{{item.client.get_absolute_url}}">{{item.client}}</a>
|
||||
{% if item.customer %}
|
||||
<br> Заказчик:
|
||||
<a href="{{item.customer.get_absolute_url}}">{{item.customer}}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{item.agreement_date|date:"SHORT_DATE_FORMAT"}}</td>
|
||||
<td>с {{item.start_date|date:"SHORT_DATE_FORMAT"}} по {{item.end_date|date:"SHORT_DATE_FORMAT"}}</td>
|
||||
<td><a href=" {{item.group.get_absolute_url}}">{{ item.group }}</a></td>
|
||||
{% if item.scan %}
|
||||
<td><a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a></td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
69
retraining/main/templates/main/for_registry.html
Normal file
69
retraining/main/templates/main/for_registry.html
Normal file
@@ -0,0 +1,69 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row text-center mt-1">
|
||||
<p class="fs-5">
|
||||
{{ object.type_order }} № <strong> {{ object.number }}</strong> от {{object.registered}}<br>
|
||||
вступает в силу с {{ object.event_date}}
|
||||
</p>
|
||||
</div>
|
||||
<div class="row fs-6">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Фамилия</th>
|
||||
<th scope="col">Имя</th>
|
||||
<th scope="col">Отчество</th>
|
||||
<th scope="col">Дата рождения</th>
|
||||
<th scope="col">СНИЛС</th>
|
||||
<th scope="col">Диплом серия/номер</th>
|
||||
<th scope="col">Начало обучения</th>
|
||||
<th scope="col">Конец обучения</th>
|
||||
<th scope="col">Сгенерировать</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in contracts %}
|
||||
<tr class="align-middle">
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td>{{ item.client.surname }}</td>
|
||||
<td>{{ item.client.name }}</td>
|
||||
<td>{{ item.client.patronymic }}</td>
|
||||
<td>{{ item.client.birthdate|date:"SHORT_DATE_FORMAT" }}</td>
|
||||
<td>{{ item.client.snils }}</td>
|
||||
<td>{{ item.client.diploma.series }} - {{ item.client.diploma.number }}</td>
|
||||
<td>{{ item.start_date|date:"SHORT_DATE_FORMAT" }}</td>
|
||||
<td>{{ item.end_date|date:"SHORT_DATE_FORMAT" }}</td>
|
||||
<td><a href="{{ item.get_gen_diploma_url }}">Дипом</a> <br> <a href="{{ item.get_gen_supplement_url }}">Приложение</a></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="row text-center fs-5">
|
||||
<p>
|
||||
Ректор - {{ object.structure.rector }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="row border">
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'gen_for_registry' object.pk %}" class="btn btn-outline-primary btn-block" >Подготовить файл</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
63
retraining/main/templates/main/get_acces.html
Normal file
63
retraining/main/templates/main/get_acces.html
Normal file
@@ -0,0 +1,63 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Номер договора</th>
|
||||
<th scope="col">Обучающийся</th>
|
||||
<th scope="col">Дата заключения</th>
|
||||
<th scope="col">Срок обучения</th>
|
||||
<th scope="col">Группа</th>
|
||||
<th scope="col">Скан</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr>
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td><a href=" {{item.get_absolute_url}}">{{ item.number}}</a></td>
|
||||
<td>
|
||||
<a href="{{item.client.get_absolute_url}}">{{item.client}}</a>
|
||||
{% if item.customer %}
|
||||
<br> Заказчик:
|
||||
<a href="{{item.customer.get_absolute_url}}">{{item.customer}}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{item.agreement_date|date:"SHORT_DATE_FORMAT"}}</td>
|
||||
<td>с {{item.start_date|date:"SHORT_DATE_FORMAT"}} по {{item.end_date|date:"SHORT_DATE_FORMAT"}}</td>
|
||||
<td><a href=" {{item.group.get_absolute_url}}">{{ item.group }}</a></td>
|
||||
{% if item.scan %}
|
||||
<td><a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a></td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="row ">
|
||||
<div class="col text-center p-1">
|
||||
{% comment %} <a href="{% url 'order' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Распечатать</a> {% endcomment %}
|
||||
</div>
|
||||
<div class="col text-center p-1">
|
||||
<a href="{{ object.gen_absolute_url }}" class="btn btn-outline-primary btn-block">Сохранить</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
116
retraining/main/templates/main/get_contract.html
Normal file
116
retraining/main/templates/main/get_contract.html
Normal file
@@ -0,0 +1,116 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row text-center mt-1">
|
||||
<p class="border fs-5">
|
||||
Договор № <strong> {{ object.number }}</strong> от {{object.agreement_date}}<br>
|
||||
{{ object.structure }}
|
||||
</p>
|
||||
<p class="fs-5">
|
||||
Срок обучения с {{ object.start_date }} по {{ object.end_date }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="row p-1 border">
|
||||
<div class="col-md-6 border">
|
||||
<div class="row">
|
||||
<div class="col-md-4 col-lg-2 ">
|
||||
<img src="
|
||||
{% if object.client.photo %}
|
||||
{{ object.client.photo.url }}
|
||||
{% else %}
|
||||
{% static 'img/blank.png' %}
|
||||
{% endif %}
|
||||
" class="rounded-4 border border-dark img-fluid" />
|
||||
</div>
|
||||
<div class="col-md-8 col-lg-10 border">
|
||||
<p class="fs-6">
|
||||
Обучающийся:
|
||||
<a href="{{ object.client.get_absolute_url }}">
|
||||
{{ object.client.surname }} {{ object.client.name }} {{ object.client.patronymic }}</a>
|
||||
{{ object.client.birthdate|timesince }}
|
||||
|
||||
{% if object.customer %}
|
||||
<p class="fs-6">
|
||||
Заказчик: <a href="{{ object.customer.get_absolute_url }}">{{ object.customer }}</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 border">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 col-lg-2 d-md-block p-1 border">
|
||||
|
||||
</div>
|
||||
{% if object.scan %}
|
||||
<a href="{{ object.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a>
|
||||
<!-- <iframe src="http://docs.google.com/gview?url={{ object.scan.url }}&embedded=true"/>-->
|
||||
<embed src="{{ object.scan.url }}"
|
||||
type="application/pdf"
|
||||
>
|
||||
|
||||
<object data="{{ object.scan.url }}"
|
||||
type="application/pdf"
|
||||
width="80%" height="720">не удалось показать документ
|
||||
</object>
|
||||
{% else %}
|
||||
<p>Не найден скан договора</p>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div class="col-md-9 col-lg-10 ms-sm-auto px-md-4 bg-light mb-2">
|
||||
<p>
|
||||
номер диплома - {{ object.degree_work.diploma_number }} <br>регистрационный номер - {{ object.degree_work.registration_number }}
|
||||
</p>
|
||||
Оплата:
|
||||
<p>
|
||||
<ul>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date1|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date2|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date3|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Паспорт: Серия {{object.client.passport.series}} № {{object.client.passport.number}} {{object.client.passport.issued_department}}
|
||||
дата выдачи {{object.client.passport.issued_date|date:'d.m.Y'}}
|
||||
</p>
|
||||
<p>
|
||||
Адрес: {{object.client.passport.address_registration}}
|
||||
</p>
|
||||
<p>
|
||||
Телефон: {{object.client.phone}}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row border">
|
||||
<div class="col-4 text-center p-1">
|
||||
<a href="{% url 'print_contract' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Распечатать</a>
|
||||
</div>
|
||||
|
||||
<div class="col-4 text-center p-1">
|
||||
<a href="{% url 'gen_protocol' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Сгенерировать протокол</a>
|
||||
</div>
|
||||
|
||||
<div class="col-2 text-center p-1">
|
||||
<a href="{% url 'gen_diploma_form' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Сгенерировать титулку</a>
|
||||
</div>
|
||||
|
||||
<div class="col-2 text-center p-1">
|
||||
<a href="{% url 'gen_diploma_supplement' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Сгенерировать приложение</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row m-1 p-1 border">
|
||||
<div class="col-md-3 col-lg-2 d-md-block p-1">
|
||||
|
||||
</div>
|
||||
<div class="col-md-9 col-lg-10 ms-sm-auto px-md-4 bg-light">
|
||||
<div class=" m-3 h-auto border border-dark p-2">
|
||||
Договор № <strong> {{ object.number }}</strong> от {{object.agreement_date}}<br>
|
||||
{{ object.structure }} <br>
|
||||
Обучающийся:
|
||||
<a href="{{ object.client.get_absolute_url }}">
|
||||
{{ object.client }} <br>
|
||||
</a>
|
||||
<p>
|
||||
Заказчик: <a href="{{ object.customer.get_absolute_url }}">{{ object.customer }}</a>
|
||||
</p>
|
||||
Срок обучения с {{ object.start_date }} по {{ object.end_date }}
|
||||
<br>
|
||||
Оплата:
|
||||
<p>
|
||||
<ul>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date1|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date2|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date3|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title">Паспорт: Серия</td>
|
||||
<td class="vpisat">{{object.client.passport.series}}</td>
|
||||
<td class="title">№</td>
|
||||
<td class="vpisat">{{object.client.passport.number}}</td>
|
||||
<td class="title"> </td>
|
||||
<td class="vpisat">{{object.client.passport.issued_department}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">дата выдачи</td>
|
||||
<td class="vpisat">{{object.client.passport.issued_date|date:'d.m.Y'}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td>Адрес:</td>
|
||||
<td class="vpisat">{{object.client.passport.address_registration}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">Телефон:</td>
|
||||
<td class="vpisat">{{object.client.phone}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<a href="/print_contract/{{ object.pk }}" class="button" target="_blank">Распечатать</a>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
102
retraining/main/templates/main/get_extract.html
Normal file
102
retraining/main/templates/main/get_extract.html
Normal file
@@ -0,0 +1,102 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row p-2">
|
||||
|
||||
<p class="text-center">
|
||||
Выписка из протокола №{{object.extract.number}} заседания кафедры <br>
|
||||
«{{object.extract.department}}» от {{object.extract.date}}
|
||||
</p>
|
||||
<p class="lh-sm m-0 p-1">
|
||||
СЛУШАЛИ:
|
||||
</p>
|
||||
<p class="lh-sm m-0 p-1">
|
||||
Доцента кафедры ГД ФГГНГД, кандидата технических наук Мирного Сергея Георгиевича
|
||||
о рассмотрении тем выпускных квалификационных работ слушателям по дополнительному
|
||||
профессиональному образованию по направлению профессиональной переподготовки
|
||||
«Машины и оборудование нефтяных и газовых промыслов»
|
||||
</p>
|
||||
|
||||
<p class="lh-sm m-0 p-1">ПОСТАНОВИЛИ:</p>
|
||||
<p class="lh-sm m-0 p-1">
|
||||
Ходатайствовать об утверждении тем выпускных квалификационных работ слушателям
|
||||
по дополнительному профессиональному образованию по направлению
|
||||
профессиональной переподготовки «Машины и оборудование нефтяных и
|
||||
газовых промыслов»:
|
||||
</p>
|
||||
|
||||
{% for item in contracts %}
|
||||
<p class="lh-sm m-0 p-1">
|
||||
{{ forloop.counter }}.
|
||||
<strong>
|
||||
{{ item.client.surname }} {{ item.client.name}} {{ item.client.patronymic}}
|
||||
</strong>
|
||||
</p>
|
||||
<p class="lh-sm m-0 p-1">
|
||||
<ins>
|
||||
{{item.degree_work.title}}.
|
||||
</ins>
|
||||
Руководитель: {{item.degree_work.adviser.surname}}
|
||||
{{item.degree_work.adviser.name}} {{item.degree_work.adviser.patronymic}} - {% if item.degree_work.adviser.degree %}
|
||||
{{item.degree_work.adviser.degree|lower}},
|
||||
{% endif %}
|
||||
{{item.degree_work.adviser.post|lower}} кафедры «{{object.extract.department}}».
|
||||
</p>
|
||||
{% endfor %}
|
||||
|
||||
<div class="row container-fluid pt-4">
|
||||
<div class="col-6 ">
|
||||
Доцент кафедры «Горное дело»,
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
<div class="col-2"> </div>
|
||||
<div class="col-3 align-bottom"> </div>
|
||||
</div>
|
||||
|
||||
<div class="row container-fluid pt-0">
|
||||
<div class="col-6 ">
|
||||
кандидат технических наук, доцент
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
<div class="col-2 border-bottom border-dark"></div>
|
||||
<div class="col-3 align-bottom">
|
||||
{{object.extract.speaker.name|first}}.
|
||||
{{object.extract.speaker.patronymic|first}}.
|
||||
{{object.extract.speaker.surname}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row container-fluid pt-4">
|
||||
<div class="col-6">
|
||||
Секретарь
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
<div class="col-2 border-bottom border-dark"></div>
|
||||
<div class="col-3 text-bottom">
|
||||
{{object.extract.secretary.name|first}}.
|
||||
{{object.extract.secretary.patronymic|first}}.
|
||||
{{object.extract.secretary.surname}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row container-fluid pt-2 pb-4">
|
||||
<div class="col-1"></div>
|
||||
<div class="col-4 mx-auto d-grid">
|
||||
<a href="{% url 'gen_extract' extract_id=object.extract.pk %}" class="btn btn-primary"> Сгенерировать </a>
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-4 mx-auto d-grid">
|
||||
<a href="{% url 'print_extract' extract_id=object.extract.pk %}" class="btn btn-primary" target="_blank">Распечатать</a>
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
70
retraining/main/templates/main/get_order.html
Normal file
70
retraining/main/templates/main/get_order.html
Normal file
@@ -0,0 +1,70 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row text-center mt-1">
|
||||
<p class="fs-5">
|
||||
{{ object.type_order }} № <strong> {{ object.number }}</strong> от {{object.registered}}<br>
|
||||
вступает в силу с {{ object.event_date}}
|
||||
</p>
|
||||
</div>
|
||||
<div class="row fs-6">
|
||||
{% for item in contracts %}
|
||||
<p>
|
||||
{{ forloop.counter }}. <ins> {{ item.client.surname }} {{ item.client.name }} {{ item.client.patronymic }}</ins>
|
||||
|
||||
{% if object.type_order.title == "о зачислении" %}
|
||||
<br> {{ item.number }}
|
||||
{% endif %}
|
||||
|
||||
{% if object.type_order.title == "на темы" %}
|
||||
- {{item.degree_work.title}}. Руководитель: {{item.degree_work.adviser.surname}}
|
||||
{{item.degree_work.adviser.name}} {{item.degree_work.adviser.patronymic}} - {% if item.degree_work.adviser.degree %}
|
||||
{{item.degree_work.adviser.degree|lower}},
|
||||
{% endif %}
|
||||
{{item.degree_work.adviser.post|lower}} кафедры «{{object.extract.department}}».
|
||||
Тема предложена кафедрой «{{item.degree_work.adviser.department}}».
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="row text-center fs-5">
|
||||
<p>
|
||||
Ректор - {{ object.structure.rector }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="row border">
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'admin:main_orders_change' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Редактировать</a>
|
||||
</div>
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'order' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Распечатать</a>
|
||||
</div>
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'gen_order' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Сохранить приказ</a>
|
||||
</div>
|
||||
{% if object.type_order.title == "на темы" %}
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'gen_extract' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Сохранить выписку</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if object.type_order.title == "об успешном отчислении" %}
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'gen_protocols' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Сохранить протоколы</a>
|
||||
</div>
|
||||
<div class="col text-center p-1">
|
||||
<a href="{% url 'for_registry' object.pk %}" class="btn btn-outline-primary btn-block" target="_blank">Подготовка файлов выпуска</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
22
retraining/main/templates/main/get_protocol.html
Normal file
22
retraining/main/templates/main/get_protocol.html
Normal file
@@ -0,0 +1,22 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
Приветы.
|
||||
<br>
|
||||
{{ object.questions }}
|
||||
<br>
|
||||
{{ object }}
|
||||
{% for item in object %}
|
||||
<p> {{item.questions}} </p>
|
||||
|
||||
{% endfor %}
|
||||
{# ----- Вставь свой код сюда ----- #}
|
||||
{% endblock content %}
|
||||
|
||||
82
retraining/main/templates/main/get_sertificate.html
Normal file
82
retraining/main/templates/main/get_sertificate.html
Normal file
@@ -0,0 +1,82 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row m-1 p-1">
|
||||
<div class="col-7"></div>
|
||||
<div class="col-5 m-0 p-0">
|
||||
<p class="m-0">
|
||||
Приложение № 1 к приказу № {{object.order.number}}
|
||||
</p>
|
||||
от {{object.order.registered}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row m-1 p-1">
|
||||
<div class="col-8">
|
||||
<strong>
|
||||
<p class="m-0">
|
||||
Министерство образования и науки <br>
|
||||
Российской Федерации <br>
|
||||
ФГБОУ ВО «Южно-Российский государственный <br>
|
||||
политехнический университет (НПИ) имени М.И. Платова» <br>
|
||||
346428, Ростовская область, <br>
|
||||
г. Новочеркасск, <br>
|
||||
ул. Просвещения, д. 132 <br>
|
||||
тел: 8(8635)2- 55-3-82 <br>
|
||||
факс: 8(8635) 2-55-9-75 <br>
|
||||
исх. № {{object.number}} <br>
|
||||
{{ object.registered }}
|
||||
</p>
|
||||
|
||||
</strong>
|
||||
</div>
|
||||
<div class="col-4"></div>
|
||||
</div>
|
||||
|
||||
<div class="row m-1 p-1">
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8 text-center">
|
||||
<strong>СПРАВКА</strong>
|
||||
<p class="m-0">
|
||||
{% if is_now %}
|
||||
(<ins>Об обучении</ins>/о периоде обучения)
|
||||
{% else %}
|
||||
(Об обучении/<ins>о периоде обучения</ins>)
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
</div>
|
||||
<div class="row m-1 p-1 border">
|
||||
<div class="col-2"></div>
|
||||
<div class="col-8 text-justify border">
|
||||
<p class="m-0">
|
||||
Настоящая справка выдана
|
||||
<strong>
|
||||
{{ object.contract.client.surname_cases.dative }} {{ object.contract.client.name_cases.dative }} {{ object.contract.client.patronymic_cases.dative }}
|
||||
</strong>
|
||||
в том, что он с {{ object.contract.start_date|date:'d.m.Y г.' }} по {{ object.contract.end_date|date:'d.m.Y г.'}}
|
||||
{% if is_now %}
|
||||
обучается
|
||||
{% else %}
|
||||
обучался
|
||||
{% endif %}
|
||||
в Институте дополнительного образования ЮРГПУ(НПИ)
|
||||
по дополнительной профессиональной программе (повышения квалификации/<ins>профессиональной переподготовки</ins>)
|
||||
«Машины и оборудование нефтяных и газовых промыслов» по заочной форме обучения в объеме 521 часа.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
</div>
|
||||
|
||||
<a href="/print_sertificate/{{ object.pk }}" class="button" target="_blank">Распечатать</a>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
79
retraining/main/templates/main/get_student.html
Normal file
79
retraining/main/templates/main/get_student.html
Normal file
@@ -0,0 +1,79 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }}{{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="row m-1 p-1 border">
|
||||
<div class="col-md-3 col-lg-2 d-md-block p-1">
|
||||
<img src="
|
||||
{% if object.photo %}
|
||||
{{ object.photo.url }}
|
||||
{% else %}
|
||||
{% static 'img/blank.png' %}
|
||||
{% endif %}
|
||||
" class="rounded-4 border border-dark" width="95%" />
|
||||
</div>
|
||||
<div class="col-md-9 col-lg-10 ms-sm-auto md-4 bg-light">
|
||||
<div class="p-3 h-auto border border-dark">
|
||||
{{ object.surname }} {{ object.name}} {{object.patronymic}}<br>
|
||||
{{ object.phone }}<br>
|
||||
<div class="row">
|
||||
<div class="col-5">
|
||||
{% if orders %}
|
||||
<p class="p-0 m-0">Приказы:</p>
|
||||
{% for item in orders %}
|
||||
<a href="{{item.get_absolute_url}}">
|
||||
{{ item }}
|
||||
</a>
|
||||
{% if item.scan %}
|
||||
<a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a>
|
||||
{% endif %}
|
||||
<br>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-3 border">
|
||||
{% if contracts %}
|
||||
<p class="m-0">Договоры:</p>
|
||||
{% for item in contracts %}
|
||||
<a href="{{item.get_absolute_url}}">
|
||||
{{ item.number }}
|
||||
</a>
|
||||
{% if item.scan %}
|
||||
<a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a>
|
||||
{% endif %}
|
||||
<br>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-4 border">
|
||||
{% if sertificates %}
|
||||
<p class="m-0">Справки:</p>
|
||||
{% for item in sertificates %}
|
||||
<a href="{{item.get_absolute_url}}">
|
||||
№ {{ item.number }} от {{ item.registered }}
|
||||
</a>
|
||||
{% if item.scan %}
|
||||
<a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a>
|
||||
{% endif %}
|
||||
<br>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
38
retraining/main/templates/main/groups.html
Normal file
38
retraining/main/templates/main/groups.html
Normal file
@@ -0,0 +1,38 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Наименование</th>
|
||||
<th scope="col">Дата выпуска</th>
|
||||
<th scope="col">Обучающиеся</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr class="align-middle">
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td><a href=" {{item.get_absolute_url}} ">{{ item.title}}</td>
|
||||
<td>{{item.graduation_date}}</td>
|
||||
<td>{% show_students_by_group item.id %} </td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
68
retraining/main/templates/main/index.html
Normal file
68
retraining/main/templates/main/index.html
Normal file
@@ -0,0 +1,68 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h2 class="text-center">Ближайшие события.</h2>
|
||||
{{ request.user.last_login }}
|
||||
{{ request.user.is_superuser }}
|
||||
{{ request.user }}
|
||||
|
||||
|
||||
{% comment %} <canvas class="my-4 w-100" id="myChart" width="900" height="380"></canvas> {% endcomment %}
|
||||
|
||||
{% for item in objects %}
|
||||
<div class="row shadow p-2 rounded bg-body mt-2 border border-dark">
|
||||
<div class="text-center container">
|
||||
<h4 >
|
||||
<a href="{{ item.get_absolute_url }}" class="nav-link text-primary">Группа {{ item.title }}</a>
|
||||
<p>
|
||||
Осталось до выпуска - {{ item.graduation_date|timeuntil }}
|
||||
</p>
|
||||
</h4>
|
||||
{% get_cbg item.pk as contracts %}
|
||||
<div class="row">
|
||||
{% for item in contracts %}
|
||||
<div class="col-xxl-4 col-xl-6 col-lg-6 px-1 py-1">
|
||||
<div class="shadow-sm border py-1">
|
||||
<div class="row border-danger mx-auto container-fluid p-0">
|
||||
|
||||
<div class="col-md-3 border-info">
|
||||
<img src="
|
||||
{% if item.client.photo %}
|
||||
{{ item.client.photo.url }}
|
||||
{% else %}
|
||||
{% static 'img/blank.png' %}
|
||||
{% endif %}
|
||||
" class="img-fluid mx-auto d-block rounded shadow border" />
|
||||
</div>
|
||||
<div class="col-md-9 p-0 m-0">
|
||||
<a href=" {{ item.client.get_absolute_url }} " class=" fs-6 nav-link">{{ item.client.surname }} {{ item.client.name }} {{item.client.patronymic}} </a>
|
||||
<p>
|
||||
<a href=" {{ item.get_absolute_url }} " class=" fs-6 nav-link">Договор №{{ item.number }} </a>
|
||||
</p>
|
||||
<p>
|
||||
{% if item.degree_work.title %}
|
||||
"{{ item.degree_work.title }}" <br>
|
||||
Руководитель - {{ item.degree_work.adviser }} <br>
|
||||
{% comment %} Протокол - {{ item.degree_work.protocol }} {% endcomment %}
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
|
||||
{% endblock content %}
|
||||
64
retraining/main/templates/main/list_for_sdo.html
Normal file
64
retraining/main/templates/main/list_for_sdo.html
Normal file
@@ -0,0 +1,64 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %} Студенты
|
||||
|
||||
{% block content %}
|
||||
{% comment %} <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
||||
<h1 class="h2">Dashboard</h1>
|
||||
<div class="btn-toolbar mb-2 mb-md-0">
|
||||
<div class="btn-group me-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary">Share</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary">Export</button>
|
||||
</div>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle">
|
||||
<span data-feather="calendar" class="align-text-bottom"></span>
|
||||
This week
|
||||
</button>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}:</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
{% comment %} <th scope="col" class="text-end">№</th> {% endcomment %}
|
||||
<th scope="col">Фамилия</th>
|
||||
<th scope="col">Имя</th>
|
||||
<th scope="col">Отчество</th>
|
||||
<th scope="col">E-mail</th>
|
||||
<th scope="col">Группа</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr class="align-middle">
|
||||
{% comment %} <td class="text-end align-item-bottom">{{ forloop.counter }}.</td> {% endcomment %}
|
||||
<td>{{ item.client.surname }}</td>
|
||||
<td>{{ item.client.name }}</td>
|
||||
<td>{{item.client.patronymic}}</td>
|
||||
<td>{{item.client.e_mail}}</td>
|
||||
<td>{{item.group.title}}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="row container-fluid pt-2 pb-4">
|
||||
<div class="col-1"></div>
|
||||
<div class="col-4 mx-auto d-grid">
|
||||
{% comment %} <a href="{% url 'gen_list_students' group_id=group_id %}" class="btn btn-primary"> Список </a> {% endcomment %}
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-4 mx-auto d-grid">
|
||||
{% comment %} <a href="# " class="btn btn-primary" target="_blank">Список для SDO</a> {% endcomment %}
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
38
retraining/main/templates/main/list_graduation_works.html
Normal file
38
retraining/main/templates/main/list_graduation_works.html
Normal file
@@ -0,0 +1,38 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %} Студенты
|
||||
|
||||
{% block content %}
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Тема</th>
|
||||
<th scope="col">Контракт</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr class="align-middle">
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td>{{item.degree_work.title}}</td>
|
||||
<td>{{ item.number }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
41
retraining/main/templates/main/list_groups.html
Normal file
41
retraining/main/templates/main/list_groups.html
Normal file
@@ -0,0 +1,41 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Наименование</th>
|
||||
<th scope="col">Дата выпуска</th>
|
||||
<th scope="col">Обучающиеся</th>
|
||||
<th scope="col">файл</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr class="align-middle">
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td><a href=" {{item.get_absolute_url}} ">{{ item.title}}</td>
|
||||
<td>{{item.graduation_date}}</td>
|
||||
<td>{% show_students_by_group item.id %} </td>
|
||||
<td class="align-middle"><a href="{% url "gen_group_list" group_id=item.pk %}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a></td>
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
56
retraining/main/templates/main/list_orders.html
Normal file
56
retraining/main/templates/main/list_orders.html
Normal file
@@ -0,0 +1,56 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %} Студенты
|
||||
|
||||
{% block content %}
|
||||
<h2 class="text-center">{{t_title}}</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Дата приказа</th>
|
||||
<th scope="col">Тип приказа</th>
|
||||
<th scope="col">Номер приказа</th>
|
||||
<th scope="col">Документ</th>
|
||||
<th scope="col">Студенты</th>
|
||||
<th scope="col">Скан</th>
|
||||
<th scope="col"><a href="{% url 'admin:main_orders_add' %}" >Создать</a></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr class="align-middle">
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td>{{item.event_date}}</td>
|
||||
<td><a href="{{ item.get_absolute_url }}" target="_blank">{{ item.type_order }}</a></td>
|
||||
<td class="">{{ item.number }}</td>
|
||||
<td><a href="{% url 'gen_order' order_id=item.pk %}" >Сохранить</a></td>
|
||||
<td>{% show_students_by_order item.id %} </td>
|
||||
{% if item.scan %}
|
||||
<td class="align-middle"><a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a></td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
<td>
|
||||
<a href="{% url 'admin:main_orders_change' item.pk %}" >Редактировать</a> |
|
||||
<a href="{% url 'admin:main_orders_delete' item.pk %}" >Удалить</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
77
retraining/main/templates/main/list_students.html
Normal file
77
retraining/main/templates/main/list_students.html
Normal file
@@ -0,0 +1,77 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %} Студенты
|
||||
|
||||
{% block content %}
|
||||
{% comment %} <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
||||
<h1 class="h2">Dashboard</h1>
|
||||
<div class="btn-toolbar mb-2 mb-md-0">
|
||||
<div class="btn-group me-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary">Share</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary">Export</button>
|
||||
</div>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle">
|
||||
<span data-feather="calendar" class="align-text-bottom"></span>
|
||||
This week
|
||||
</button>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}:</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Фото</th>
|
||||
<th scope="col">ФИО</th>
|
||||
<th scope="col">Пол</th>
|
||||
<th scope="col">Телефон</th>
|
||||
<th scope="col">Обучается</th>
|
||||
<th scope="col">Возраст</th>
|
||||
<th scope="col">Тема ВКР</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr class="align-middle">
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td>
|
||||
{% if item.client.photo %}
|
||||
<img src="{{ item.client.photo.url }}" height="75" />
|
||||
{% else %}
|
||||
<img src="{% static 'img/blank.png' %}" height="75" />
|
||||
{% endif %}
|
||||
</td>
|
||||
<td><a href=" {{ item.client.get_absolute_url }} ">{{ item.client.surname }} {{ item.client.name }} {{item.client.patronymic}}</a></td>
|
||||
<td>{{item.client.gender}}</td>
|
||||
<td>{{item.client.phone}}</td>
|
||||
<td>
|
||||
<a href=" {{ item.get_absolute_url }} ">{{ item.number }} </a> <br>
|
||||
с {{item.start_date|date:"SHORT_DATE_FORMAT"}} по {{item.end_date|date:"SHORT_DATE_FORMAT"}}
|
||||
</td>
|
||||
<td>{{ item.client.birthdate|timesince }}</td>
|
||||
<td>{{ item.degree_work.title }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="row container-fluid pt-2 pb-4">
|
||||
<div class="col-1"></div>
|
||||
<div class="col-4 mx-auto d-grid">
|
||||
<a href="{% url 'gen_list_students' group_id=group_id %}" class="btn btn-primary"> Список #доделать#</a>
|
||||
</div>
|
||||
<div class="col-2"></div>
|
||||
<div class="col-4 mx-auto d-grid">
|
||||
<a href="{% url 'gen_list_sdo' group_id=group_id %}" class="btn btn-primary">Список для SDO</a>
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
424
retraining/main/templates/main/print_contract.html
Normal file
424
retraining/main/templates/main/print_contract.html
Normal file
@@ -0,0 +1,424 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="{% static 'css/print.css' %}">
|
||||
<title> {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<table class="num-table">
|
||||
<tr>
|
||||
<td>Договор №</td>
|
||||
<td class="num-cell"></td>
|
||||
{% for item in object.number %}
|
||||
<td class="num-cell {% if not item in '.-' %} inner {% endif %}">{{ item }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
<table class="footer">
|
||||
<tr>
|
||||
<td>г. Новочеркасск</td>
|
||||
<!-- <td ></td> -->
|
||||
<!-- <td class="vpisat">"{{object.agreement_date|date:"d"}}"</td> -->
|
||||
<td class="vpisat">{{object.agreement_date|date:'"d" E Y'}} г.</td>
|
||||
<!-- <td></td> -->
|
||||
<!-- <td class="vpisat we60">{{object.agreement_date|date:"E"}} </td> -->
|
||||
<!-- <td>{{object.agreement_date|date:"Y"}}</td> -->
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
Федеральное государственное бюджетное образовательное учреждение высшего образования «Южно-Российский государственный политехнический
|
||||
университет (НПИ) имени М.И. Платова», (ЮРГПУ(НПИ)), осуществляющее образовательную деятельность на основании Устава и
|
||||
лицензии от 06.09.2016 г № 2372, выданной Федеральной службой по надзору в сфере образования и науки (срок действия - бессрочно),
|
||||
именуемое в дальнейшем «Исполнитель», в лице директора Института дополнительного образования {{object.structure.director_ido.surname_genitive}}
|
||||
{{object.structure.director_ido.name_genitive}} {{object.structure.director_ido.patronymic_genitive}}, действующего на основании
|
||||
доверенности № {{object.structure.warrant_number}} от {{object.structure.warrant_date|date:'d.m.Y'}} г. с одной стороны, и Гражданин(ка)
|
||||
</p>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="vpisat tb tc">{{ object.client.surname }} {{ object.client.name }} {{ object.client.patronymic }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="poyasnenie tc">(фамилия, имя, отчество лица, зачисляемого на обучение)</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p class="tb tc" id="one">1. Предмет договора</p>
|
||||
<p>
|
||||
1.1. Исполнитель обязуется предоставить образовательную услугу, а Обучающийся обязуется оплатить образовательную услугу по предоставлению услуги по дополнительной профессиональной программе профессиональной переподготовки «Машины и оборудование нефтяных и газовых промыслов» по заочной форме обучения с применением электронного обучения и дистанционных образовательных технологий, в соответствии с учебными планами, в том числе индивидуальными, и образовательными программами Исполнителя.
|
||||
</p>
|
||||
<p>
|
||||
1.2. Срок освоения образовательной программы на момент подписания Договора составляет 521 часов,
|
||||
</p>
|
||||
<p class="tc">c {{object.start_date}} по {{object.end_date}}</p>
|
||||
<p>
|
||||
1.3. После освоения Обучающимся образовательной программы и успешного прохождения итоговой аттестации и исполнения п.4.2. настоящего договора, ему выдается диплом установленного образца о профессиональной переподготовке.
|
||||
</p>
|
||||
<p class="tb tc">2. Права Исполнителя и Обучающегося</p>
|
||||
<p>
|
||||
2.1. Исполнитель вправе:
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.1.1. Самостоятельно осуществлять образовательный процесс, устанавливать системы оценок, формы, порядок и периодичность проведения промежуточной аттестации Обучающегося.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.1.2. Применять к Обучающемуся меры поощрения и меры дисциплинарного взыскания в соответствии с законодательством Российской Федерации, уставом Исполнителя, настоящим договором и локальными нормативными актами Исполнителя.
|
||||
</p>
|
||||
<p>
|
||||
2.2. Обучающийся вправе получать информацию от Исполнителя по вопросам организации и обеспечения надлежащего предоставления услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего Договора.
|
||||
</p>
|
||||
<p>
|
||||
2.3. Обучающемуся предоставляются академические права в соответствии с частью 1 статьи 34 Федерального закона от 29 декабря 2012 г. № 273-ФЗ «Об образовании в Российской Федерации».
|
||||
</p>
|
||||
<p> Обучающийся также вправе:</p>
|
||||
<p class="sp">
|
||||
2.3.1. Получать информацию от Исполнителя по вопросам организации и обеспечения надлежащего предоставления услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего Договора;
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.2. Обращаться к Исполнителю по вопросам, касающимся образовательного процесса.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.3. Пользоваться в порядке, установленном локальными нормативными актами, имуществом Исполнителя, необходимым для освоения образовательной программы.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.4. Принимать в порядке, установленном локальными нормативными актами, участие в социально-культурных, оздоровительных и иных мероприятиях, организованных Исполнителем.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.5. Получать полную и достоверную информацию об оценке своих знаний, умений, навыков и компетенций, а также о критериях этой оценки.
|
||||
</p>
|
||||
<p class="tb tc">3. Обязанности Исполнителя и Обучающегося</p>
|
||||
<p>
|
||||
3.1. <strong> Исполнитель обязан:</strong>
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.1. Зачислить Обучающегося, выполнившего установленные законодательством Российской Федерации, учредительными документами, локальными нормативными актами Исполнителя условия приема, в качестве слушателя дополнительной профессиональной программы профессиональной переподготовки.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.2. Довести до Обучающегося информацию, содержащую сведения о предоставлении платных образовательных услуг в порядке и объеме, которые предусмотрены Законом Российской Федерации «О защите прав потребителей» и Федеральным законом «Об образовании в Российской Федерации».
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.3. Организовать и обеспечить надлежащее предоставление образовательных услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего Договора. Образовательные услуги оказываются в соответствии с учебным планом, в том числе индивидуальным, и расписанием занятий Исполнителя;
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.4. Обеспечить Обучающемуся предусмотренные выбранной образовательной программой условия ее освоения;
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.5. Сохранить место за Обучающимся в случае пропуска занятий по уважительным причинам (с учетом оплаты услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего договора).
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.6. Принимать от Обучающегося плату за образовательные услуги.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.7. Обеспечить Обучающемуся уважение человеческого достоинства, защиту от всех форм физического и психического насилия, оскорбления личности, охрану жизни и здоровья.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.8. При освоении дополнительной профессиональной программы параллельно с получением среднего профессионального и (или) высшего образования документ о профессиональной переподготовке/ повышении квалификации выдать одновременно с получением соответствующего документа об образовании и о квалификации.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.9. Обучающемуся, не прошедшему итоговой аттестации или получившему на итоговой аттестации неудовлетворительные результаты, а также Обучающемуся, освоившему часть образовательной программы и (или) отчисленному из ЮРГПУ(НПИ), выдается справка об обучении или о периоде обучения по образцу, устанавливаемому Исполнителем.
|
||||
</p>
|
||||
<p>
|
||||
3.2 <strong>Обучающийся обязан</strong> своевременно вносить плату за предоставляемые ему образовательные услуги, указанные в <a href="#one"> разделе 1</a> настоящего Договора, в размере и порядке, определенных настоящим Договором а также предоставлять платежные документы, подтверждающие такую оплату.
|
||||
</p>
|
||||
<p>
|
||||
3.3. <strong>Обучающийся обязан</strong> соблюдать требования, установленные в статье 43 Федерального закона от 29.12.2012 г. №273-ФЗ «Об образовании в Российской Федерации», в том числе:
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.1. Выполнять задания для подготовки к занятиям, учебным планом, в том числе индивидуальным.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.2. Извещать Исполнителя о причинах отсутствия на занятиях.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.3. Обучаться в образовательной организации по образовательной программе с соблюдением учебного плана, в том числе индивидуального.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.4. Соблюдать требования Устава ЮРГПУ(НПИ), правил внутреннего распорядка и иные локальные нормативные акты Исполнителя.
|
||||
</p>
|
||||
<p class="tb tc">4. Стоимость услуг, сроки и порядок их оплаты</p>
|
||||
<p>
|
||||
4.1. Полная стоимость платных образовательных услуг за весь период обучения Обучающегося составляет: <strong>42000</strong> (Сорок две тысячи) руб. (без НДС). Увеличение стоимости платных образовательных услуг после заключения договора не допускается, за исключением увеличения стоимости указанных услуг с учетом уровня инфляции, предусмотренного основными характеристиками федерального бюджета на очередной финансовый год и плановый период. Увеличение стоимости обучения производится Исполнителем в одностороннем порядке приказом ректора ЮРГПУ(НПИ), размещаемом на официальном сайте ЮРГПУ(НПИ).
|
||||
</p>
|
||||
<p>
|
||||
4.2. Оплата производится равными долями по семестрам:
|
||||
</p>
|
||||
<p>
|
||||
<ul>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date1|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date2|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date3|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
</ul>
|
||||
на счет, указанный в <a href="#nine">разделе 9</a> Настоящего Договора.
|
||||
</p>
|
||||
<p>
|
||||
4.3. Услуга считается оказанной (без обязательного оформления акта оказанных услуг) по мере ее готовности (пропорционально периоду, прошедшему до даты фиксации суммы оказанных услуг, или даты отчисления Обучающегося, или даты прекращения договора). Денежные средства, оплаченные Обучающимся за обучение, возвращаются в случае расторжения или досрочного прекращения действия договора, за вычетом фактически понесенных расходов.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="page">
|
||||
<p class="tb tc">
|
||||
5. Порядок изменения и расторжения Договора
|
||||
</p>
|
||||
<p>
|
||||
5.1. Условия, на которых заключен настоящий Договор, могут быть изменены по соглашению Сторон или в соответствии с законодательством Российской Федерации.
|
||||
</p>
|
||||
<p>
|
||||
5.2. Настоящий Договор может быть расторгнут по соглашению Сторон.
|
||||
</p>
|
||||
<p>
|
||||
5.3. Настоящий Договор может быть расторгнут по инициативе Исполнителя в одностороннем порядке в случаях:
|
||||
<ul>
|
||||
<li>
|
||||
установления нарушения порядка приема в ЮРГПУ(НПИ), повлекшего по вине обучающегося его незаконное зачисление в ЮРГПУ(НПИ);
|
||||
</li>
|
||||
<li>
|
||||
просрочки оплаты стоимости платных образовательных услуг;
|
||||
</li>
|
||||
<li>
|
||||
невозможности надлежащего исполнения обязательств по оказанию платных образовательных услуг вследствие действий (бездействия) Обучающегося;
|
||||
</li>
|
||||
<li>
|
||||
в иных случаях, предусмотренных законодательством Российской Федерации.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
5.4. Настоящий Договор расторгается досрочно:
|
||||
<ul>
|
||||
<li>
|
||||
по инициативе Обучающегося, в том числе в случае перевода Обучающегося для продолжения освоения образовательной программы в другую организацию, осуществляющую образовательную деятельность;
|
||||
</li>
|
||||
<li>
|
||||
по инициативе Исполнителя в случае применения к Обучающемуся, достигшему возраста пятнадцати лет, отчисления как меры дисциплинарного взыскания, в случае невыполнения Обучающимся по профессиональной образовательной программе обязанностей по добросовестному освоению такой образовательной программы и выполнению учебного плана, а также в случае установления нарушения порядка приема в образовательную организацию, повлекшего по вине Обучающегося его незаконное зачисление в образовательную организацию;
|
||||
</li>
|
||||
<li>
|
||||
по обстоятельствам, не зависящим от воли Обучающегося и Исполнителя, в том числе в случае ликвидации Исполнителя.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
5.5. Исполнитель вправе отказаться от исполнения обязательств по Договору при условии полного возмещения Обучающемуся убытков.
|
||||
</p>
|
||||
<p>
|
||||
5.6. Обучающийся вправе отказаться от исполнения настоящего Договора при условии оплаты Исполнителю фактически понесенных им расходов, связанных с исполнением обязательств по договору.
|
||||
</p>
|
||||
<p class="tb tc">6. Ответственность Исполнителя и Обучающегося</p>
|
||||
<p>
|
||||
6.1. За неисполнение или ненадлежащее исполнение своих обязательств по Договору Стороны несут ответственность, предусмотренную законодательством Российской Федерации и Договором.
|
||||
</p>
|
||||
<p>
|
||||
6.2. При обнаружении недостатка образовательной услуги, в том числе оказания её не в полном объеме, предусмотренном образовательными программами (частью образовательной программы), Обучающийся вправе по своему выбору потребовать:
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.2.1. Безвозмездного оказания образовательной услуги;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.2.2. Соразмерного уменьшения стоимости оказанной образовательной услуги.
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.2.3. Возмещения понесенных им расходов по устранению недостатков оказанной образовательной услуги своими силами или третьими лицами.
|
||||
</p>
|
||||
<p>
|
||||
6.3. Обучающийся вправе отказаться от исполнения Договора и потребовать полного возмещения убытков, если в шестимесячный срок недостатки
|
||||
образовательной услуги не устранены Исполнителем. Обучающийся также вправе отказаться от исполнения Договора, если им обнаружен существенный
|
||||
недостаток оказанной образовательной услуги или иные существенные отступления от условий Договора.
|
||||
</p>
|
||||
<p>
|
||||
6.4. Если Исполнитель нарушил сроки оказания образовательной услуги (сроки начала и (или) окончания оказания образовательной услуги и
|
||||
(или) промежуточные сроки оказания образовательной услуги) либо если во время оказания образовательной услуги стало очевидным, что она
|
||||
не будет осуществлена в срок, Обучающийся вправе по своему выбору:
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.1. Назначить Исполнителю новый срок, в течение которого Исполнитель должен приступить к оказанию образовательной услуги и (или)
|
||||
закончить оказание образовательной услуги;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.2. Поручить оказать образовательную услугу третьим лицам за разумную цену и потребовать от Исполнителя возмещения понесенных расходов;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.3. Потребовать уменьшения стоимости образовательной услуги;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.4. Расторгнуть Договор.
|
||||
</p>
|
||||
<p>
|
||||
6.5. Обучающийся вправе потребовать полного возмещения убытков, причиненных ему в связи с нарушением сроков начала и (или) окончания
|
||||
образовательной услуги, а также в связи с недостатками образовательной услуги.
|
||||
</p>
|
||||
<p>
|
||||
6.6. Место исполнения договора: г. Новочеркасск Ростовской области.
|
||||
</p>
|
||||
<p>
|
||||
6.7. Иски, вытекающие из настоящего договора, предъявляются в суд г. Новочеркасска Ростовской области.
|
||||
</p>
|
||||
<p class="tb tc">7. Срок действия Договора</p>
|
||||
<p>
|
||||
7.1. Настоящий Договор вступает в силу со дня его заключения Сторонами и действует до полного исполнения Сторонами обязательств.
|
||||
</p>
|
||||
<p class="tb tc">8. Заключительные положения</p>
|
||||
<p>
|
||||
8.1. Сведения, указанные в настоящем Договоре, соответствуют информации, размещенной на официальном сайте Исполнителя в сети
|
||||
"Интернет" на дату заключения настоящего Договора.
|
||||
</p>
|
||||
<p>
|
||||
8.2. Под периодом предоставления образовательной услуги (периодом обучения/сроком оказания услуг) понимается промежуток времени
|
||||
с даты издания приказа о зачислении Обучающегося в ЮРГПУ(НПИ) до даты издания приказа об окончании обучения или отчислении
|
||||
Обучающегося из ЮРГПУ(НПИ).
|
||||
</p>
|
||||
<p>
|
||||
8.3. Настоящий Договор составлен в 4-х экземплярах (один экземпляр Обучающемуся, два – ЮРГПУ(НПИ)). Все экземпляры имеют одинаковую
|
||||
юридическую силу. Изменения и дополнения настоящего Договора могут производиться только в письменной форме и подписываться
|
||||
уполномоченными представителями Сторон.
|
||||
</p>
|
||||
<p>
|
||||
8.4. Изменения Договора оформляются дополнительными соглашениями к Договору.
|
||||
</p>
|
||||
<p class="tb tc" id="nine">9.Адреса и реквизиты сторон</p>
|
||||
<p>
|
||||
<strong>Исполнитель:</strong> федеральное государственное бюджетное образовательное учреждение высшего образования «Южно-Российский
|
||||
государственный политехнический университет (НПИ) имени М.И. Платова»
|
||||
</p>
|
||||
<p>
|
||||
Адрес: 346428, Ростовская область, г. Новочеркасск, ул. Просвещения, д. 132 Тел./Факс 8(86352) 55382
|
||||
</p>
|
||||
<p>
|
||||
ИНН 6150010834 / КПП 615001001/ БИК 046015001 ОКТМО 60727000 КБК 00000000000000000130
|
||||
</p>
|
||||
<p>
|
||||
УФК по Ростовской области (5800, ФГБОУ ВО «ЮРГПУ(НПИ) имени М.И. Платова», л/с20586У30610)
|
||||
</p>
|
||||
<p>
|
||||
Наименование банка: ОТДЕЛЕНИЕ РОСТОВ-НА-ДОНУ БАНКА РОССИИ//УФК по Ростовской области г. Ростов-на-Дону
|
||||
</p>
|
||||
<p>
|
||||
Казначейский счет № 03214643000000015800
|
||||
</p>
|
||||
<p>
|
||||
Единый казначейский счет (ЕКС) № 40102810845370000050
|
||||
</p>
|
||||
<p>
|
||||
ОГРН 1026102216030
|
||||
</p>
|
||||
<p>
|
||||
КБК 00000000000000000130
|
||||
</p>
|
||||
<p></p>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title tb">Обучающийся:</td>
|
||||
<td class="vpisat">{{ object.client.surname }} {{ object.client.name }} {{ object.client.patronymic }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title">Паспорт: Серия</td>
|
||||
<td class="vpisat">{{object.client.passport.series}}</td>
|
||||
<td class="title">№</td>
|
||||
<td class="vpisat">{{object.client.passport.number}}</td>
|
||||
<td class="title"> </td>
|
||||
<td class="vpisat">{{object.client.passport.issued_department}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">дата выдачи</td>
|
||||
<td class="vpisat">{{object.client.passport.issued_date|date:'d.m.Y'}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td>Адрес:</td>
|
||||
<td class="vpisat">{{object.client.passport.address_registration}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">Телефон:</td>
|
||||
<td class="vpisat">{{object.client.phone}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<th colspan="2">Исполнитель</th>
|
||||
<th></th>
|
||||
<th colspan="2">Обучающийся</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Директор ИДО</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>/И.А. Ревин/</td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>/{{ object.client.name|slice:1 }}.{{ object.client.patronymic|slice:1 }}. {{ object.client.surname }}/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tc" height="40px">М.П.</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="" colspan="2">Договор внесен в базу данных</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">Ответственный от ДЭиФ</td>
|
||||
<td></td>
|
||||
<td colspan="2">Ответственный от ИДО</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>/И.В. Свечкарева/</td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>/А.С. Кожевников/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
510
retraining/main/templates/main/print_contract_with_customer.html
Normal file
510
retraining/main/templates/main/print_contract_with_customer.html
Normal file
@@ -0,0 +1,510 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="{% static 'css/print.css' %}">
|
||||
<title> {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<table class="num-table">
|
||||
<tr>
|
||||
<td>Договор №</td>
|
||||
<td class="num-cell"></td>
|
||||
{% for item in object.number %}
|
||||
<td class="num-cell {% if not item in '.-' %} inner {% endif %}">{{ item }}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
<table class="footer">
|
||||
<tr>
|
||||
<td>г. Новочеркасск</td>
|
||||
<!-- <td ></td> -->
|
||||
<!-- <td class="vpisat">"{{object.agreement_date|date:"d"}}"</td> -->
|
||||
<td class="vpisat">{{object.agreement_date|date:'"d" E Y'}} г.</td>
|
||||
<!-- <td></td> -->
|
||||
<!-- <td class="vpisat we60">{{object.agreement_date|date:"E"}} </td> -->
|
||||
<!-- <td>{{object.agreement_date|date:"Y"}}</td> -->
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
Федеральное государственное бюджетное образовательное учреждение высшего образования «Южно-Российский государственный политехнический
|
||||
университет (НПИ) имени М.И. Платова», (ЮРГПУ(НПИ)), осуществляющее образовательную деятельность на основании Устава и
|
||||
лицензии от 06.09.2016 г № 2372, выданной Федеральной службой по надзору в сфере образования и науки (срок действия - бессрочно),
|
||||
именуемое в дальнейшем «Исполнитель», в лице директора Института дополнительного образования {{object.structure.director_ido.surname_genitive}}
|
||||
{{object.structure.director_ido.name_genitive}} {{object.structure.director_ido.patronymic_genitive}}, действующего на основании
|
||||
доверенности № {{object.structure.warrant_number}} от {{object.structure.warrant_date|date:'d.m.Y'}} г.
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td>и </td>
|
||||
<td class="vpisat tb tc" width="70%">{{ object.customer.surname }} {{ object.customer.name }} {{ object.customer.patronymic }}</td>
|
||||
<td>, именуемый(ая) в дальнейшем «Заказчик», и</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">(фамилия, имя, отчество заказчика)</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td></td>
|
||||
<td class="vpisat tb tc" width="69%">{{ object.client.surname }} {{ object.client.name }} {{ object.client.patronymic }}</td>
|
||||
<td>, именуемый(ая) в дальнейшем Обучающийся,</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">(фамилия, имя, отчество обучающегося)</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
совместно именуемые «Стороны», заключили настоящий Договор о нижеследующем:
|
||||
</p>
|
||||
<p class="tb tc" id="one">1. Предмет договора</p>
|
||||
<p>
|
||||
1.1. Исполнитель обязуется предоставить образовательную услугу, а Заказчик обязуется оплатить образовательную услугу по предоставлению услуги по дополнительной профессиональной программе
|
||||
профессиональной переподготовки «Машины и оборудование нефтяных и газовых промыслов» по заочной форме обучения с применением электронного обучения и дистанционных образовательных технологий,
|
||||
в соответствии с учебными планами, в том числе индивидуальными, и образовательными программами Исполнителя.
|
||||
</p>
|
||||
<p>
|
||||
1.2. Срок освоения образовательной программы на момент подписания Договора составляет 521 часов,
|
||||
</p>
|
||||
<p class="tc">c {{object.start_date}} по {{object.end_date}}</p>
|
||||
<p>
|
||||
1.3. После освоения Обучающимся образовательной программы и успешного прохождения итоговой аттестации и исполнения п.4.2. настоящего договора, ему выдается диплом установленного образца о
|
||||
профессиональной переподготовке.
|
||||
</p>
|
||||
<p class="tb tc">2. Права Исполнителя, Заказчика и Обучающегося</p>
|
||||
<p>
|
||||
2.1. Исполнитель вправе:
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.1.1. Самостоятельно осуществлять образовательный процесс, устанавливать системы оценок, формы, порядок и периодичность проведения промежуточной аттестации Обучающегося.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.1.2. Применять к Обучающемуся меры поощрения и меры дисциплинарного взыскания в соответствии с законодательством Российской Федерации, уставом Исполнителя, настоящим договором и
|
||||
локальными нормативными актами Исполнителя.
|
||||
</p>
|
||||
<p>
|
||||
2.2. Заказчик вправе получать информацию от Исполнителя по вопросам организации и обеспечения надлежащего предоставления услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего Договора.
|
||||
</p>
|
||||
<p>
|
||||
2.3. Обучающемуся предоставляются академические права в соответствии с частью 1 статьи 34 Федерального закона от 29 декабря 2012 г. № 273-ФЗ «Об образовании в Российской Федерации».
|
||||
</p>
|
||||
<p> Обучающийся также вправе:</p>
|
||||
<p class="sp">
|
||||
2.3.1. Получать информацию от Исполнителя по вопросам организации и обеспечения надлежащего предоставления услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего Договора;
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.2. Обращаться к Исполнителю по вопросам, касающимся образовательного процесса.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.3. Пользоваться в порядке, установленном локальными нормативными актами, имуществом Исполнителя, необходимым для освоения образовательной программы.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.4. Принимать в порядке, установленном локальными нормативными актами, участие в социально-культурных, оздоровительных и иных мероприятиях, организованных Исполнителем.
|
||||
</p>
|
||||
<p class="sp">
|
||||
2.3.5. Получать полную и достоверную информацию об оценке своих знаний, умений, навыков и компетенций, а также о критериях этой оценки.
|
||||
</p>
|
||||
<p class="tb tc">3. Обязанности Исполнителя, Заказчика и Обучающегося</p>
|
||||
<p>
|
||||
3.1. <strong> Исполнитель обязан:</strong>
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.1. Зачислить Обучающегося, выполнившего установленные законодательством Российской Федерации, учредительными документами, локальными нормативными актами Исполнителя условия
|
||||
приема, в качестве слушателя дополнительной профессиональной программы профессиональной переподготовки.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.2. Довести до Заказчика информацию, содержащую сведения о предоставлении платных образовательных услуг в порядке и объеме, которые предусмотрены Законом Российской Федерации
|
||||
«О защите прав потребителей» и Федеральным законом «Об образовании в Российской Федерации».
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.3. Организовать и обеспечить надлежащее предоставление образовательных услуг, предусмотренных <a href="#one"> разделом 1</a> настоящего Договора. Образовательные услуги
|
||||
оказываются в соответствии с учебным планом, в том числе индивидуальным, и расписанием занятий Исполнителя;
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.4. Обеспечить Обучающемуся предусмотренные выбранной образовательной программой условия ее освоения;
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.5. Сохранить место за Обучающимся в случае пропуска занятий по уважительным причинам (с учетом оплаты услуг, предусмотренных <a href="#one"> разделом 1</a>
|
||||
настоящего договора).
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.6. Принимать от Заказчика плату за образовательные услуги.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.7. Обеспечить Обучающемуся уважение человеческого достоинства, защиту от всех форм физического и психического насилия, оскорбления личности, охрану жизни и здоровья.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.8. При освоении дополнительной профессиональной программы параллельно с получением среднего профессионального и (или) высшего образования документ о профессиональной
|
||||
переподготовке/ повышении квалификации выдать одновременно с получением соответствующего документа об образовании и о квалификации.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.1.9. Обучающемуся, не прошедшему итоговой аттестации или получившему на итоговой аттестации неудовлетворительные результаты, а также Обучающемуся, освоившему часть
|
||||
образовательной программы и (или) отчисленному из ЮРГПУ(НПИ), выдается справка об обучении или о периоде обучения по образцу, устанавливаемому Исполнителем.
|
||||
</p>
|
||||
<p>
|
||||
3.2 <strong>Заказчик обязан</strong> своевременно вносить плату за предоставляемые ему образовательные услуги, указанные в <a href="#one"> разделе 1</a> настоящего
|
||||
Договора, в размере и порядке, определенных настоящим Договором а также предоставлять платежные документы, подтверждающие такую оплату.
|
||||
</p>
|
||||
<p>
|
||||
3.3. <strong>Обучающийся обязан</strong> соблюдать требования, установленные в статье 43 Федерального закона от 29.12.2012 г. №273-ФЗ «Об образовании в Российской
|
||||
Федерации», в том числе:
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.1. Выполнять задания для подготовки к занятиям, учебным планом, в том числе индивидуальным.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.2. Извещать Исполнителя о причинах отсутствия на занятиях.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.3. Обучаться в образовательной организации по образовательной программе с соблюдением учебного плана, в том числе индивидуального.
|
||||
</p>
|
||||
<p class="sp">
|
||||
3.3.4. Соблюдать требования Устава ЮРГПУ(НПИ), правил внутреннего распорядка и иные локальные нормативные акты Исполнителя.
|
||||
</p>
|
||||
<p class="tb tc">4. Стоимость услуг, сроки и порядок их оплаты</p>
|
||||
<p>
|
||||
4.1. Полная стоимость платных образовательных услуг за весь период обучения Обучающегося составляет: <strong>42000</strong> (Сорок две тысячи) руб. (без НДС). Увеличение
|
||||
стоимости платных образовательных услуг после заключения договора не допускается, за исключением увеличения стоимости указанных услуг с учетом уровня инфляции,
|
||||
предусмотренного основными характеристиками федерального бюджета на очередной финансовый год и плановый период. Увеличение стоимости обучения производится Исполнителем
|
||||
в одностороннем порядке приказом ректора ЮРГПУ(НПИ), размещаемом на официальном сайте ЮРГПУ(НПИ).
|
||||
</p>
|
||||
<p>
|
||||
4.2. Оплата производится равными долями по семестрам:
|
||||
</p>
|
||||
<p>
|
||||
<ul>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date1|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date2|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
<li>14 000 (четырнадцать тысяч) рублей в срок до {{ object.payment_date3|date:"SHORT_DATE_FORMAT" }} г.</li>
|
||||
</ul>
|
||||
на счет, указанный в <a href="#nine">разделе 9</a> Настоящего Договора.
|
||||
</p>
|
||||
<p>
|
||||
4.3. Услуга считается оказанной (без обязательного оформления акта оказанных услуг) по мере ее готовности (пропорционально периоду, прошедшему до даты фиксации
|
||||
суммы оказанных услуг, или даты отчисления Обучающегося, или даты прекращения договора). Денежные средства, оплаченные Обучающимся за обучение, возвращаются в
|
||||
случае расторжения или досрочного прекращения действия договора, за вычетом фактически понесенных расходов.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="page">
|
||||
<p class="tb tc">
|
||||
5. Порядок изменения и расторжения Договора
|
||||
</p>
|
||||
<p>
|
||||
5.1. Условия, на которых заключен настоящий Договор, могут быть изменены по соглашению Сторон или в соответствии с законодательством Российской Федерации.
|
||||
</p>
|
||||
<p>
|
||||
5.2. Настоящий Договор может быть расторгнут по соглашению Сторон.
|
||||
</p>
|
||||
<p>
|
||||
5.3. Настоящий Договор может быть расторгнут по инициативе Исполнителя в одностороннем порядке в случаях:
|
||||
<ul>
|
||||
<li>
|
||||
установления нарушения порядка приема в ЮРГПУ(НПИ), повлекшего по вине обучающегося его незаконное зачисление в ЮРГПУ(НПИ);
|
||||
</li>
|
||||
<li>
|
||||
просрочки оплаты стоимости платных образовательных услуг;
|
||||
</li>
|
||||
<li>
|
||||
невозможности надлежащего исполнения обязательств по оказанию платных образовательных услуг вследствие действий (бездействия) Обучающегося;
|
||||
</li>
|
||||
<li>
|
||||
в иных случаях, предусмотренных законодательством Российской Федерации.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
5.4. Настоящий Договор расторгается досрочно:
|
||||
<ul>
|
||||
<li>
|
||||
по инициативе Обучающегося, в том числе в случае перевода Обучающегося для продолжения освоения образовательной программы в другую организацию,
|
||||
осуществляющую образовательную деятельность;
|
||||
</li>
|
||||
<li>
|
||||
по инициативе Исполнителя в случае применения к Обучающемуся, достигшему возраста пятнадцати лет, отчисления как меры дисциплинарного взыскания,
|
||||
в случае невыполнения Обучающимся по профессиональной образовательной программе обязанностей по добросовестному освоению такой образовательной
|
||||
программы и выполнению учебного плана, а также в случае установления нарушения порядка приема в образовательную организацию, повлекшего по вине
|
||||
Обучающегося его незаконное зачисление в образовательную организацию;
|
||||
</li>
|
||||
<li>
|
||||
по обстоятельствам, не зависящим от воли Обучающегося и Исполнителя, в том числе в случае ликвидации Исполнителя.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
5.5. Исполнитель вправе отказаться от исполнения обязательств по Договору при условии полного возмещения Заказчику убытков.
|
||||
</p>
|
||||
<p>
|
||||
5.6. Заказчик вправе отказаться от исполнения настоящего Договора при условии оплаты Исполнителю фактически понесенных им расходов, связанных с исполнением обязательств по договору.
|
||||
</p>
|
||||
<p class="tb tc">6. Ответственность Исполнителя, Заказчика и Обучающегося</p>
|
||||
<p>
|
||||
6.1. За неисполнение или ненадлежащее исполнение своих обязательств по Договору Стороны несут ответственность, предусмотренную законодательством Российской Федерации и Договором.
|
||||
</p>
|
||||
<p>
|
||||
6.2. При обнаружении недостатка образовательной услуги, в том числе оказания её не в полном объеме, предусмотренном образовательными программами
|
||||
(частью образовательной программы), Заказчик вправе по своему выбору потребовать:
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.2.1. Безвозмездного оказания образовательной услуги;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.2.2. Соразмерного уменьшения стоимости оказанной образовательной услуги.
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.2.3. Возмещения понесенных им расходов по устранению недостатков оказанной образовательной услуги своими силами или третьими лицами.
|
||||
</p>
|
||||
<p>
|
||||
6.3. Заказчик вправе отказаться от исполнения Договора и потребовать полного возмещения убытков, если в шестимесячный срок недостатки образовательной
|
||||
услуги не устранены Исполнителем. Обучающийся также вправе отказаться от исполнения Договора, если им обнаружен существенный недостаток оказанной
|
||||
образовательной услуги или иные существенные отступления от условий Договора.
|
||||
</p>
|
||||
<p>
|
||||
6.4. Если Исполнитель нарушил сроки оказания образовательной услуги (сроки начала и (или) окончания оказания образовательной услуги и (или)
|
||||
промежуточные сроки оказания образовательной услуги) либо если во время оказания образовательной услуги стало очевидным, что она не будет
|
||||
осуществлена в срок, Заказчик вправе по своему выбору:
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.1. Назначить Исполнителю новый срок, в течение которого Исполнитель должен приступить к оказанию образовательной услуги и (или) закончить
|
||||
оказание образовательной услуги;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.2. Поручить оказать образовательную услугу третьим лицам за разумную цену и потребовать от Исполнителя возмещения понесенных расходов;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.3. Потребовать уменьшения стоимости образовательной услуги;
|
||||
</p>
|
||||
<p class="sp">
|
||||
6.4.4. Расторгнуть Договор.
|
||||
</p>
|
||||
<p>
|
||||
6.5. Заказчик вправе потребовать полного возмещения убытков, причиненных ему в связи с нарушением сроков начала и (или) окончания образовательной
|
||||
услуги, а также в связи с недостатками образовательной услуги.
|
||||
</p>
|
||||
<p>
|
||||
6.6. Место исполнения договора: г. Новочеркасск Ростовской области.
|
||||
</p>
|
||||
<p>
|
||||
6.7. Иски, вытекающие из настоящего договора, предъявляются в суд г. Новочеркасска Ростовской области.
|
||||
</p>
|
||||
<p class="tb tc">7. Срок действия Договора</p>
|
||||
<p>
|
||||
7.1. Настоящий Договор вступает в силу со дня его заключения Сторонами и действует до полного исполнения Сторонами обязательств.
|
||||
</p>
|
||||
<p class="tb tc">8. Заключительные положения</p>
|
||||
<p>
|
||||
8.1. Сведения, указанные в настоящем Договоре, соответствуют информации, размещенной на официальном сайте Исполнителя в сети "Интернет" на дату
|
||||
заключения настоящего Договора.
|
||||
</p>
|
||||
<p>
|
||||
8.2. Под периодом предоставления образовательной услуги (периодом обучения/сроком оказания услуг) понимается промежуток времени с даты издания
|
||||
приказа о зачислении Обучающегося в ЮРГПУ(НПИ) до даты издания приказа об окончании обучения или отчислении Обучающегося из ЮРГПУ(НПИ).
|
||||
</p>
|
||||
<p>
|
||||
8.3. Настоящий Договор составлен в 4-х экземплярах (один экземпляр Обучающемуся, один - Заказчику, два – ЮРГПУ(НПИ)). Все экземпляры имеют
|
||||
одинаковую юридическую силу. Изменения и дополнения настоящего Договора могут производиться только в письменной форме и подписываться
|
||||
уполномоченными представителями Сторон.
|
||||
</p>
|
||||
<p>
|
||||
8.4. Изменения Договора оформляются дополнительными соглашениями к Договору.
|
||||
</p>
|
||||
<p class="tb tc" id="nine">9.Адреса и реквизиты сторон</p>
|
||||
<p>
|
||||
<strong>Исполнитель:</strong> федеральное государственное бюджетное образовательное учреждение высшего образования «Южно-Российский
|
||||
государственный политехнический университет (НПИ) имени М.И. Платова»
|
||||
</p>
|
||||
<p>
|
||||
Адрес: 346428, Ростовская область, г. Новочеркасск, ул. Просвещения, д. 132 Тел./Факс 8(86352) 55382
|
||||
</p>
|
||||
<p>
|
||||
ИНН 6150010834 / КПП 615001001/ БИК 046015001 ОКТМО 60727000 КБК 00000000000000000130
|
||||
</p>
|
||||
<p>
|
||||
УФК по Ростовской области (5800, ФГБОУ ВО «ЮРГПУ(НПИ) имени М.И. Платова», л/с20586У30610)
|
||||
</p>
|
||||
<p>
|
||||
Наименование банка: ОТДЕЛЕНИЕ РОСТОВ-НА-ДОНУ БАНКА РОССИИ//УФК по Ростовской области г. Ростов-на-Дону
|
||||
</p>
|
||||
<p>
|
||||
Казначейский счет № 03214643000000015800
|
||||
</p>
|
||||
<p>
|
||||
Единый казначейский счет (ЕКС) № 40102810845370000050
|
||||
</p>
|
||||
<p>
|
||||
ОГРН 1026102216030
|
||||
</p>
|
||||
<p>
|
||||
КБК 00000000000000000130
|
||||
</p>
|
||||
<p></p>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title tb">Заказчик:</td>
|
||||
<td class="vpisat">{{ object.customer.surname }} {{ object.customer.name }} {{ object.customer.patronymic }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title">Паспорт: Серия</td>
|
||||
<td class="vpisat">{{object.customer.passport.series}}</td>
|
||||
<td class="title">№</td>
|
||||
<td class="vpisat">{{object.customer.passport.number}}</td>
|
||||
<td class="title"> </td>
|
||||
<td class="vpisat">{{object.customer.passport.issued_department}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">дата выдачи</td>
|
||||
<td class="vpisat">{{object.customer.passport.issued_date|date:'d.m.Y'}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td>Адрес:</td>
|
||||
<td class="vpisat">{{object.customer.passport.address_registration}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">Телефон:</td>
|
||||
<td class="vpisat">{{object.customer.phone}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title tb">Обучающийся:</td>
|
||||
<td class="vpisat">{{ object.client.surname }} {{ object.client.name }} {{ object.client.patronymic }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td class="title">Паспорт: Серия</td>
|
||||
<td class="vpisat">{{object.client.passport.series}}</td>
|
||||
<td class="title">№</td>
|
||||
<td class="vpisat">{{object.client.passport.number}}</td>
|
||||
<td class="title"> </td>
|
||||
<td class="vpisat">{{object.client.passport.issued_department}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">дата выдачи</td>
|
||||
<td class="vpisat">{{object.client.passport.issued_date|date:'d.m.Y'}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table class="full-str">
|
||||
<tr>
|
||||
<td>Адрес:</td>
|
||||
<td class="vpisat">{{object.client.passport.address_registration}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td class="title">Телефон:</td>
|
||||
<td class="vpisat">{{object.client.phone}}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="100%">
|
||||
<tr>
|
||||
<th colspan="2">Исполнитель</th>
|
||||
<th colspan="2">Заказчик</th>
|
||||
<th colspan="2">Обучающийся</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Директор ИДО</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>/И.А. Ревин/</td>
|
||||
<td class="podpis"></td>
|
||||
<td>/{{ object.customer.name|slice:1 }}.{{ object.customer.patronymic|slice:1 }}. {{ object.customer.surname }}/</td>
|
||||
<td class="podpis"></td>
|
||||
<td>/{{ object.client.name|slice:1 }}.{{ object.client.patronymic|slice:1 }}. {{ object.client.surname }}/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tc" height="40px">М.П.</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="" colspan="2">Договор внесен в базу данных</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2">Ответственный от ДЭиФ</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td colspan="2">Ответственный от ИДО</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>/И.В. Свечкарева/</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>/А.С. Кожевников/</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
101
retraining/main/templates/main/print_extract.html
Normal file
101
retraining/main/templates/main/print_extract.html
Normal file
@@ -0,0 +1,101 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<!-- CSS only -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="{% static 'css/print_order.css' %}">
|
||||
<style>
|
||||
body {
|
||||
font: 13pt "Times New Roman";
|
||||
line-height: 1.3;
|
||||
}
|
||||
</style>
|
||||
<title> {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<p class="tc">
|
||||
Выписка из протокола №{{object.extract.number}} заседания кафедры <br>
|
||||
«{{object.extract.department}}» от {{object.extract.date}}
|
||||
</p>
|
||||
<p>
|
||||
СЛУШАЛИ:
|
||||
</p>
|
||||
<p>
|
||||
Доцента кафедры ГД ФГГНГД, кандидата технических наук Мирного Сергея Георгиевича
|
||||
о рассмотрении тем выпускных квалификационных работ слушателям по дополнительному
|
||||
профессиональному образованию по направлению профессиональной переподготовки
|
||||
«Машины и оборудование нефтяных и газовых промыслов»
|
||||
</p>
|
||||
|
||||
<p>ПОСТАНОВИЛИ:</p>
|
||||
<p>
|
||||
Ходатайствовать об утверждении тем выпускных квалификационных работ слушателям
|
||||
по дополнительному профессиональному образованию по направлению
|
||||
профессиональной переподготовки «Машины и оборудование нефтяных и
|
||||
газовых промыслов»:
|
||||
</p>
|
||||
|
||||
{% for item in contracts %}
|
||||
<p>{{ forloop.counter }}. {{ item.client.surname }} {{ item.client.name}} {{ item.client.patronymic}}</p>
|
||||
<p>
|
||||
{{item.degree_work.title}}. Руководитель: {{item.degree_work.adviser.surname}}
|
||||
{{item.degree_work.adviser.name}} {{item.degree_work.adviser.patronymic}} - {% if item.degree_work.adviser.degree %}
|
||||
{{item.degree_work.adviser.degree|lower}},
|
||||
{% endif %}
|
||||
{{item.degree_work.adviser.post|lower}} кафедры «{{object.extract.department}}».
|
||||
</p>
|
||||
{% endfor %}
|
||||
|
||||
<div class="row container-fluid pt-4">
|
||||
<div class="col-6 ">
|
||||
Доцент кафедры «Горное дело»,
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
<div class="col-2"> </div>
|
||||
<div class="col-3 align-bottom"> </div>
|
||||
</div>
|
||||
|
||||
<div class="row container-fluid pt-0">
|
||||
<div class="col-6 ">
|
||||
кандидат технических наук, доцент
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
<div class="col-2 border-bottom border-dark"></div>
|
||||
<div class="col-3 align-bottom">
|
||||
{{object.extract.speaker.name|first}}.
|
||||
{{object.extract.speaker.patronymic|first}}.
|
||||
{{object.extract.speaker.surname}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row container-fluid pt-4">
|
||||
<div class="col-6">
|
||||
Секретарь
|
||||
</div>
|
||||
<div class="col-1"></div>
|
||||
<div class="col-2 border-bottom border-dark"></div>
|
||||
<div class="col-3 text-bottom">
|
||||
{{object.extract.secretary.name|first}}.
|
||||
{{object.extract.secretary.patronymic|first}}.
|
||||
{{object.extract.secretary.surname}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
134
retraining/main/templates/main/print_order.html
Normal file
134
retraining/main/templates/main/print_order.html
Normal file
@@ -0,0 +1,134 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="{% static 'css/print_order.css' %}">
|
||||
<title> {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<p class="tc startorder"><strong>О движении контингента слушателей ИДО</strong></p>
|
||||
<br>
|
||||
<p class="tc"><strong>ПРИКАЗЫВАЮ:</strong></p>
|
||||
<br>
|
||||
<p>
|
||||
Зачислить с {{object.event_date|date:"d E Y"}}г. в число слушателей ИДО по дополнительной профессиональной
|
||||
программе профессиональной переподготовки «Машины и оборудование нефтяных и газовых промыслов». Срок
|
||||
обучения – 521 час. Форма обучения заочная с применением электронного обучения и дистанционных
|
||||
образовательных технологий.
|
||||
</p>
|
||||
|
||||
<table class="t-main">
|
||||
{% for item in contracts %}
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}.</td>
|
||||
<td > {{ item.client.surname }} {{ item.client.name}} {{ item.client.patronymic}}</td>
|
||||
<td > {{ item.number}}</td>
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<p>
|
||||
Основание:
|
||||
{% if is_single %}
|
||||
договор
|
||||
{% else %}
|
||||
договоры
|
||||
{% endif %}
|
||||
на обучение
|
||||
</p>
|
||||
|
||||
<table class="rector">
|
||||
<tr>
|
||||
<td class="tr">Ректор</td>
|
||||
<td class="vpisat"></td>
|
||||
<td>{{ object.structure.rector }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="95%">
|
||||
<tr>
|
||||
<td colspan="2">Проект вносят:</td>
|
||||
<td width="150px"></td>
|
||||
<td colspan="2">Согласовано:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Директор ИДО</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Проректор по ОД</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>И. А. Ревин</td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Е. М. Дьяконов</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Начальник ЮУ</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Т. А. Кузьменко</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Директор ДЭиФ</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>А. П. Игнатьева</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Директор АД</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Р. Г. Зайцев</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
{% comment %} {% for item in other %}
|
||||
{{item}}
|
||||
{% endfor %}
|
||||
</br>
|
||||
{{other}} {% endcomment %}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
134
retraining/main/templates/main/print_order_on_enrollment.html
Normal file
134
retraining/main/templates/main/print_order_on_enrollment.html
Normal file
@@ -0,0 +1,134 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="{% static 'css/print_order.css' %}">
|
||||
<title> {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<p class="tc startorder"><strong>О движении контингента слушателей ИДО</strong></p>
|
||||
<br>
|
||||
<p class="tc"><strong>ПРИКАЗЫВАЮ:</strong></p>
|
||||
<br>
|
||||
<p>
|
||||
Зачислить с {{object.event_date|date:"d E Y"}}г. в число слушателей ИДО по дополнительной профессиональной
|
||||
программе профессиональной переподготовки «Машины и оборудование нефтяных и газовых промыслов». Срок
|
||||
обучения – 521 час. Форма обучения заочная с применением электронного обучения и дистанционных
|
||||
образовательных технологий.
|
||||
</p>
|
||||
|
||||
<table class="t-main">
|
||||
{% for item in contracts %}
|
||||
<tr>
|
||||
<td>{{ forloop.counter }}.</td>
|
||||
<td > {{ item.client.surname }} {{ item.client.name}} {{ item.client.patronymic}}</td>
|
||||
<td > {{ item.number }}</td>
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
<p>
|
||||
Основание:
|
||||
{% if is_single %}
|
||||
договор
|
||||
{% else %}
|
||||
договоры
|
||||
{% endif %}
|
||||
на обучение
|
||||
</p>
|
||||
|
||||
<table class="rector">
|
||||
<tr>
|
||||
<td class="tr">Ректор</td>
|
||||
<td class="vpisat"></td>
|
||||
<td>{{ object.structure.rector }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="95%">
|
||||
<tr>
|
||||
<td colspan="2">Проект вносят:</td>
|
||||
<td width="150px"></td>
|
||||
<td colspan="2">Согласовано:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Директор ИДО</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Проректор по ОД</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>И. А. Ревин</td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Е. М. Дьяконов</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Начальник ЮУ</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Т. А. Кузьменко</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Директор ДЭиФ</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>А. П. Игнатьева</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Директор АД</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Р. Г. Зайцев</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
{% comment %} {% for item in other %}
|
||||
{{item}}
|
||||
{% endfor %}
|
||||
</br>
|
||||
{{other}} {% endcomment %}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
137
retraining/main/templates/main/print_order_on_theme.html
Normal file
137
retraining/main/templates/main/print_order_on_theme.html
Normal file
@@ -0,0 +1,137 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="{% static 'css/print_order.css' %}">
|
||||
<style>
|
||||
body {
|
||||
font: 13pt "Times New Roman";
|
||||
line-height: 1.3;
|
||||
}
|
||||
</style>
|
||||
<title> {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<p class="tc startorder"><strong>Об утверждении тем выпускных работ для слушателей ИДО</strong></p>
|
||||
<br>
|
||||
<p>
|
||||
В соответствии с дополнительной профессиональной программой профессиональной переподготовки
|
||||
«Машины и оборудование нефтяных и газовых промыслов»
|
||||
</p>
|
||||
<p class="tc"><strong>ПРИКАЗЫВАЮ:</strong></p>
|
||||
<p>
|
||||
1. Утвердить темы выпускных квалификационных работ слушателям по дополнительной профессиональной
|
||||
образовательной программе профессиональной переподготовки «Машины и оборудование нефтяных
|
||||
и газовых промыслов»:
|
||||
</p>
|
||||
|
||||
{% for item in contracts %}
|
||||
<p>1.{{ forloop.counter }}. {{ item.client.surname }} {{ item.client.name }} {{ item.client.patronymic }}</p>
|
||||
<p>
|
||||
{{item.degree_work.title}}. Руководитель: {{item.degree_work.adviser.surname}}
|
||||
{{item.degree_work.adviser.name}} {{item.degree_work.adviser.patronymic}} - {% if item.degree_work.adviser.degree %}
|
||||
{{item.degree_work.adviser.degree|lower}},
|
||||
{% endif %}
|
||||
{{item.degree_work.adviser.post|lower}} кафедры «{{object.extract.department}}». Тема предложена кафедрой «{{item.degree_work.adviser.department}}».
|
||||
|
||||
</p>
|
||||
{% endfor %}
|
||||
<p>
|
||||
Основание: протокол заседания кафедры «{{object.extract.department}}» №{{object.extract.number}} от {{object.extract.date}}
|
||||
</p>
|
||||
|
||||
<table class="rector">
|
||||
<tr>
|
||||
<td class="tr">Ректор</td>
|
||||
<td class="vpisat"></td>
|
||||
<td >{{ object.structure.rector }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table width="95%">
|
||||
<tr>
|
||||
<td colspan="2">Проект вносят:</td>
|
||||
<td width="150px"></td>
|
||||
<td colspan="2">Согласовано:</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Директор ИДО</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Проректор по ОД</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="podpis"></td>
|
||||
<td>И. А. Ревин</td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Е. М. Дьяконов</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Начальник ЮУ</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Т. А. Кузьменко</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Директор ДЭиФ</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>А. П. Игнатьева</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>Директор АД</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="podpis"></td>
|
||||
<td>Р. Г. Зайцев</td>
|
||||
</tr>
|
||||
|
||||
|
||||
</table>
|
||||
{% comment %} {% for item in other %}
|
||||
{{item}}
|
||||
{% endfor %}
|
||||
</br>
|
||||
{{other}} {% endcomment %}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
99
retraining/main/templates/main/print_sertificate.html
Normal file
99
retraining/main/templates/main/print_sertificate.html
Normal file
@@ -0,0 +1,99 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="{% static 'css/print_order.css' %}">
|
||||
<title> Справка {{title}} </title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="page">
|
||||
<p class="tr">
|
||||
Приложение № 1 к приказу № {{object.order.number}}
|
||||
</p>
|
||||
<p class="tr">
|
||||
от {{object.order.registered}}
|
||||
</p>
|
||||
<p class="tb underline">
|
||||
<br>
|
||||
Министерство образования и науки <br>
|
||||
Российской Федерации <br>
|
||||
ФГБОУ ВО «Южно-Российский государственный <br>
|
||||
политехнический университет (НПИ) имени М.И. Платова» <br>
|
||||
346428, Ростовская область, <br>
|
||||
г. Новочеркасск, <br>
|
||||
ул. Просвещения, д. 132 <br>
|
||||
тел: 8 (8635) 2-55-3-82 <br>
|
||||
факс: 8 (8635) 2-55-9-75 <br>
|
||||
исх. №<span> {{object.number}} </span><br>
|
||||
{{ object.registered }}
|
||||
</p>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<p class="tc tb">СПРАВКА</p>
|
||||
|
||||
<p class="tc underline">
|
||||
{% if is_now %}
|
||||
(<span>Об обучении</span>/о периоде обучения)
|
||||
{% else %}
|
||||
(Об обучении/<span>о периоде обучения</span>)
|
||||
{% endif %}
|
||||
|
||||
</p>
|
||||
|
||||
<p class="underline">
|
||||
Настоящая справка выдана
|
||||
<strong>{{ object.contract.client.surname_cases.dative }} {{ object.contract.client.name_cases.dative }} {{ object.contract.client.patronymic_cases.dative }}</strong>
|
||||
в том, что он с {{ object.contract.start_date|date:'d.m.Y г.' }} по {{ object.contract.end_date|date:'d.m.Y г.'}}
|
||||
{% if is_now %}
|
||||
обучается
|
||||
{% else %}
|
||||
обучался
|
||||
{% endif %}
|
||||
в Институте дополнительного образования ЮРГПУ(НПИ)
|
||||
по дополнительной профессиональной программе (повышения квалификации/<span>профессиональной переподготовки</span>)
|
||||
<strong>«Машины и оборудование нефтяных и газовых промыслов»</strong> по заочной форме обучения в объеме 521 часа.
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
|
||||
<table width="95%">
|
||||
<tr>
|
||||
<td class="tc">Директор ИДО</td>
|
||||
<td width="25%"></td>
|
||||
<td width="25%"></td>
|
||||
<td class="podpis tc">И.А. Ревин</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tc">М.П.</td>
|
||||
<td></td>
|
||||
<td class="poyasnenie tc">подпись</td>
|
||||
<td class="poyasnenie tc">(инициалы, фамилия)</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<br>
|
||||
<p style="color:Gray;">Исп.: Кожевников А.С.</p>
|
||||
<p style="color:Gray;">8(8635)255-317</p>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</htm
|
||||
46
retraining/main/templates/main/sertificates.html
Normal file
46
retraining/main/templates/main/sertificates.html
Normal file
@@ -0,0 +1,46 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %} Студенты
|
||||
|
||||
{% block content %}
|
||||
<h2 class="text-center">{{t_title}}:</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Номер и дата регистрации</th>
|
||||
<th scope="col">Студент</th>
|
||||
<th scope="col">Приказ</th>
|
||||
<th scope="col">Скан</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr>
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td><a href="{{ item.get_absolute_url }}">Справка № {{ item.number }} от {{ item.registered }}</a></td>
|
||||
<td><a href="{{ item.contract.client.get_absolute_url }}">{{item.contract.client.surname_cases.dative}} {{item.contract.client.name_cases.dative}} {{item.contract.client.patronymic_cases.dative}}</a></td>
|
||||
<td><a href="{{ item.order.get_absolute_url }}" target="_blank">{{item.order}}</a></td>
|
||||
{% if item.scan %}
|
||||
<td><a href="{{ item.scan.url }}" target="_blank"><span data-feather="file-text" class="align-text-bottom"></span></a></td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
75
retraining/main/templates/main/students_old.html
Normal file
75
retraining/main/templates/main/students_old.html
Normal file
@@ -0,0 +1,75 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% load static %}
|
||||
{% load stud_tags %}
|
||||
|
||||
{% block title %}
|
||||
{{ block.super }} {{title}}
|
||||
{% endblock title %} Студенты
|
||||
|
||||
{% block content %}
|
||||
{% comment %} <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
||||
<h1 class="h2">Dashboard</h1>
|
||||
<div class="btn-toolbar mb-2 mb-md-0">
|
||||
<div class="btn-group me-2">
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary">Share</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary">Export</button>
|
||||
</div>
|
||||
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle">
|
||||
<span data-feather="calendar" class="align-text-bottom"></span>
|
||||
This week
|
||||
</button>
|
||||
</div>
|
||||
</div> {% endcomment %}
|
||||
|
||||
<h2 class="text-center">{{t_title}}:</h2>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm table-hover table-bordered">
|
||||
<thead class="text-center table-secondary">
|
||||
<tr>
|
||||
<th scope="col" class="text-end">№</th>
|
||||
<th scope="col">Фото</th>
|
||||
<th scope="col">ФИО</th>
|
||||
<th scope="col">Пол</th>
|
||||
<th scope="col">Телефон</th>
|
||||
<th scope="col" class="text-end">Группа</th>
|
||||
<th scope="col">Добавлен</th>
|
||||
<th scope="col">Обучается</th>
|
||||
<th scope="col">Возраст</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-center">
|
||||
{% for item in objects %}
|
||||
<tr>
|
||||
<td class="text-end align-item-bottom">{{ forloop.counter }}.</td>
|
||||
<td>
|
||||
{% if item.photo %}
|
||||
<img src="{{ item.photo.url }}" height="75" />
|
||||
{% else %}
|
||||
<img src="{% static 'img/blank.png' %}" height="75" />
|
||||
{% endif %}
|
||||
</td>
|
||||
{% comment %} <td><a href=" {% url 'student' item.pk %} ">{{ item.surname }} {{ item.name }} {{item.patronymic}}</td> {% endcomment %}
|
||||
<td><a href=" {{ item.get_absolute_url }} ">{{ item.surname }} {{ item.name }} {{item.patronymic}}</td>
|
||||
<td>{{item.gender}}</td>
|
||||
<td>{{item.phone}}</td>
|
||||
<td class="text-end"><a href=" {{item.group.get_absolute_url}} "> {{item.group}}</a></td>
|
||||
<td>{{ item.added_at|date:"d-m-Y" }}</td>
|
||||
<td>
|
||||
{% get_cbs item.id as contracts %}
|
||||
{% for item in contracts%}
|
||||
{% if forloop.counter > 1 %}
|
||||
<br>
|
||||
{% endif %}
|
||||
<a href=" {{ item.get_absolute_url }} "> Договор № {{ item.number }} </a> <br>
|
||||
с {{item.start_date|date:"SHORT_DATE_FORMAT"}} по {{item.end_date|date:"SHORT_DATE_FORMAT"}}
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>{{ item.birthdate|timesince }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
13
retraining/main/templates/main/teg_list_stud.html
Normal file
13
retraining/main/templates/main/teg_list_stud.html
Normal file
@@ -0,0 +1,13 @@
|
||||
<button class="btn btn-sm btn-secondary dropdown-toggle" type="button" data-bs-toggle="collapse" data-bs-target="#StudCollapse{{id}}" aria-expanded="false" aria-controls="StudCollapse{{id}}">Состав - {{ objects.count }} чел.</button>
|
||||
<div class="col">
|
||||
<div class="collapse multi-collapse" id="StudCollapse{{id}}">
|
||||
<div class="list-group">
|
||||
{% for item in objects %}
|
||||
<a href="{{item.get_absolute_url}}" class="list-group-item list-group-item-action">{{ item }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% comment %} <a href="{{contract.client.get_absolute_url}}"> {{ forloop.counter }}. {{ contract.client }} </a> <br> {% endcomment %}
|
||||
0
retraining/main/templatetags/__init__.py
Normal file
0
retraining/main/templatetags/__init__.py
Normal file
35
retraining/main/templatetags/stud_tags.py
Normal file
35
retraining/main/templatetags/stud_tags.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from django import template
|
||||
|
||||
from main.models import *
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
# @register.simple_tag(name="get_sbg")
|
||||
# @register.simple_tag
|
||||
# def get_stud_by_group(id):
|
||||
# return Students.objects.filter(group__pk=id)
|
||||
|
||||
# @register.simple_tag
|
||||
# def get_stud_by_order(id):
|
||||
# return Contracts.objects.filter(orders__pk=id)
|
||||
|
||||
@register.simple_tag(name="get_cbs")
|
||||
def get_contr_by_stud(id):
|
||||
return Contracts.objects.filter(client__pk=id).order_by("agreement_date")#[:1]
|
||||
|
||||
@register.simple_tag(name="get_cbg")
|
||||
def get_contracts_by_group(id):
|
||||
return Contracts.objects.filter(group__pk=id).order_by('client__surname')
|
||||
# return Students.objects.filter(contracts__group__pk=id)
|
||||
|
||||
@register.inclusion_tag("main/teg_list_stud.html")
|
||||
def show_students_by_order(id):
|
||||
students = Students.objects.filter(contracts__orders__pk=id)
|
||||
return {"objects": students, "id":id}
|
||||
|
||||
|
||||
@register.inclusion_tag("main/teg_list_stud.html")
|
||||
def show_students_by_group(id):
|
||||
students = Students.objects.filter(contracts__group__pk=id)
|
||||
return {"objects": students, "id":id}
|
||||
3
retraining/main/tests.py
Normal file
3
retraining/main/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
77
retraining/main/urls.py
Normal file
77
retraining/main/urls.py
Normal file
@@ -0,0 +1,77 @@
|
||||
from django.urls import path, include
|
||||
|
||||
from .views import *
|
||||
|
||||
urlpatterns = [
|
||||
# главная
|
||||
path('', index, name='mainpage'),
|
||||
|
||||
path('accounts/', include('django.contrib.auth.urls')), # добавил для отработки функций авторизаций
|
||||
|
||||
# сотрудники
|
||||
# path('employee/', employee, name='employee'),
|
||||
|
||||
# договоры
|
||||
path('contracts/', contracts_page, name='contracts'),
|
||||
path('contract/<int:contract_id>', get_contract, name='contract'),
|
||||
|
||||
# студенты
|
||||
path('students/', students_page, name='students'),
|
||||
path('student/<int:student_id>', get_student, name='student'),
|
||||
|
||||
# заказчики
|
||||
path('customer/<int:customer_id>', get_customer, name='customer'),
|
||||
|
||||
# приказы
|
||||
path('orders/', orders_page, name='orders'),
|
||||
path('get_order/<int:order_id>', get_order, name='get_order'),
|
||||
|
||||
# Пропуска
|
||||
path('access/', access_page, name='access'),
|
||||
path('get_acces/<int:acces_id>', get_acces, name = 'get_acces'),
|
||||
path('gen_access/<int:acces_id>', gen_acces, name = 'gen_acces'),
|
||||
|
||||
|
||||
# Анне
|
||||
path('for_registry/<int:order_id>', for_registry, name='for_registry'),
|
||||
path('gen_for_registry/<int:order_id>', gen_for_registry, name='gen_for_registry'),
|
||||
|
||||
|
||||
# протоколы
|
||||
path('get_protocol/<int:protocol_pk>', get_protocol, name='get_protocol'),
|
||||
|
||||
|
||||
# Выписка
|
||||
path('extract/<int:extract_id>', get_extract, name='extract'),
|
||||
|
||||
# группы
|
||||
path('groups/', groups_page, name='groups'),
|
||||
path('group/<int:group_id>', get_group, name='group'),
|
||||
path('gen_list_students/<int:group_id>', gen_list_students, name='gen_list_students'),
|
||||
path('gen_list_sdo/<int:group_id>', gen_list_sdo, name='gen_list_sdo'),
|
||||
|
||||
|
||||
# справки
|
||||
path('sertificates/', sertificates_page, name='sertificates'),
|
||||
path('sertificate/<int:sertificate_id>', get_sertificates, name='sertificate'),
|
||||
|
||||
# темы ВКР
|
||||
path('graduation_works/', graduation_works, name='graduation_works'),
|
||||
|
||||
|
||||
# страницы печати документов
|
||||
path('print_extract/<int:extract_id>', print_extract, name='print_extract'),
|
||||
path('print_contract/<int:contract_id>', print_contract, name='print_contract'),
|
||||
path('print_order/<int:order_id>', print_order, name='order'),
|
||||
path('print_sertificate/<int:sertificate_id>', print_sertificate, name='print_sertificate'),
|
||||
|
||||
path('gen_extract/<int:extract_id>', gen_extract, name='gen_extract'),
|
||||
path('gen_order/<int:order_id>', gen_order, name='gen_order'),
|
||||
path('gen_protocol/<int:contract_id>', gen_protocol, name='gen_protocol'),
|
||||
path('gen_protocols/<int:order_id>', gen_protocols, name='gen_protocols'),
|
||||
path('gen_group_list/<int:group_id>', gen_group_list, name='gen_group_list'),
|
||||
path('gen_diploma_supplement/<int:contract_id>', gen_diploma_supplement, name='gen_diploma_supplement'),
|
||||
path('gen_diploma_form/<int:contract_id>', gen_diplma_form, name='gen_diploma_form'),
|
||||
|
||||
]
|
||||
|
||||
501
retraining/main/views.py
Normal file
501
retraining/main/views.py
Normal 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
|
||||
|
||||
22
retraining/manage.py
Normal file
22
retraining/manage.py
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
"""Django's command-line utility for administrative tasks."""
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
"""Run administrative tasks."""
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'retraining.settings')
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError as exc:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
) from exc
|
||||
execute_from_command_line(sys.argv)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
BIN
retraining/retraing.zip
Normal file
BIN
retraining/retraing.zip
Normal file
Binary file not shown.
0
retraining/retraining/__init__.py
Normal file
0
retraining/retraining/__init__.py
Normal file
16
retraining/retraining/asgi.py
Normal file
16
retraining/retraining/asgi.py
Normal file
@@ -0,0 +1,16 @@
|
||||
"""
|
||||
ASGI config for retraining project.
|
||||
|
||||
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.asgi import get_asgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'retraining.settings')
|
||||
|
||||
application = get_asgi_application()
|
||||
167
retraining/retraining/settings.py
Normal file
167
retraining/retraining/settings.py
Normal file
@@ -0,0 +1,167 @@
|
||||
"""
|
||||
Django settings for retraining project.
|
||||
|
||||
Generated by 'django-admin startproject' using Django 4.1.1.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.1/topics/settings/
|
||||
|
||||
For the full list of settings and their values, see
|
||||
https://docs.djangoproject.com/en/4.1/ref/settings/
|
||||
"""
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
# Список полов для моделей
|
||||
GENDER = [
|
||||
('муж.', 'Мужчина'),
|
||||
('жен.', 'Женщина')
|
||||
]
|
||||
# список оценок для моделей
|
||||
SCORE = [
|
||||
('удовлетворительно', 'удовлетворительно'),
|
||||
('хорошо', 'хорошо'),
|
||||
('отлично', 'отлично'),
|
||||
]
|
||||
|
||||
# Redirect to home URL after login (Default redirects to /accounts/profile/)
|
||||
LOGIN_REDIRECT_URL = '/'
|
||||
LOGOUT_REDIRECT_URL = '/'
|
||||
|
||||
|
||||
# Quick-start development settings - unsuitable for production
|
||||
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
|
||||
|
||||
# SECURITY WARNING: keep the secret key used in production secret!
|
||||
SECRET_KEY = 'django-insecure-#$-l0ojcqp*6g8+gams(ud2+i1&c$6+dbcj98uk(8y!4#7jj)r'
|
||||
|
||||
# SECURITY WARNING: don't run with debug turned on in production!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = ['0.0.0.0','*',]
|
||||
|
||||
|
||||
# Application definition
|
||||
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'main.apps.MainConfig',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'retraining.urls'
|
||||
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [os.path.join(BASE_DIR, 'templates')],
|
||||
'APP_DIRS': True,
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = 'retraining.wsgi.application'
|
||||
|
||||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': BASE_DIR / 'db.sqlite3',
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Password validation
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators
|
||||
|
||||
AUTH_PASSWORD_VALIDATORS = [
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||
},
|
||||
{
|
||||
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
# Internationalization
|
||||
# https://docs.djangoproject.com/en/4.1/topics/i18n/
|
||||
|
||||
LANGUAGE_CODE = 'ru-RU'
|
||||
# LANGUAGE_CODE = 'RU'
|
||||
|
||||
TIME_ZONE = 'Europe/Moscow'
|
||||
|
||||
USE_I18N = True
|
||||
|
||||
USE_L10N = True
|
||||
|
||||
USE_TZ = False
|
||||
|
||||
|
||||
# Static files (CSS, JavaScript, Images)
|
||||
# https://docs.djangoproject.com/en/4.1/howto/static-files/
|
||||
|
||||
STATIC_URL = '/static/'
|
||||
|
||||
# В одном уроке не объявляли статикрут и все работало. В дргуом объявили, но СтатикРут и СтатикДир должны быть разные.
|
||||
# Пока закоментим эту константу
|
||||
# св
|
||||
|
||||
# STATIC_ROOT = os.path.join(BASE_DIR, "static")
|
||||
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]
|
||||
|
||||
|
||||
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||
# указываем путь для построения урл для загрузки файлов
|
||||
MEDIA_URL = '/media/'
|
||||
# Маршрут для показа загруженных файлов для контроллера джанго, необходим для отладочного режима
|
||||
# смотри файл урлс
|
||||
|
||||
# -----------------------------------------------------------------------------------------
|
||||
# Для хостинга на Джино необходимо добавить следующие переменные и запустить колект статик
|
||||
# -----------------------------------------------------------------------------------------
|
||||
# И изменить алловед хостс
|
||||
|
||||
# STATIC_ROOT = os.path.join(BASE_DIR, 'public_html/static')
|
||||
# MEDIA_ROOT = os.path.join(BASE_DIR, 'public_html/media')
|
||||
# -----------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
# Default primary key field type
|
||||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field
|
||||
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
29
retraining/retraining/urls.py
Normal file
29
retraining/retraining/urls.py
Normal file
@@ -0,0 +1,29 @@
|
||||
"""retraining URL Configuration
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/4.1/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.conf import settings
|
||||
from django.conf.urls.static import static
|
||||
from django.contrib import admin
|
||||
from django.urls import path, include
|
||||
|
||||
# from main.views import index, employee
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls, name='admin'),
|
||||
path('', include('main.urls')),
|
||||
]
|
||||
|
||||
if settings.DEBUG:
|
||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
16
retraining/retraining/wsgi.py
Normal file
16
retraining/retraining/wsgi.py
Normal file
@@ -0,0 +1,16 @@
|
||||
"""
|
||||
WSGI config for retraining project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'retraining.settings')
|
||||
|
||||
application = get_wsgi_application()
|
||||
275
retraining/static/admin/css/autocomplete.css
Normal file
275
retraining/static/admin/css/autocomplete.css
Normal file
@@ -0,0 +1,275 @@
|
||||
select.admin-autocomplete {
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container {
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single,
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple {
|
||||
min-height: 30px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--focus .select2-selection,
|
||||
.select2-container--admin-autocomplete.select2-container--open .select2-selection {
|
||||
border-color: var(--body-quiet-color);
|
||||
min-height: 30px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--single,
|
||||
.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--single {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--focus .select2-selection.select2-selection--multiple,
|
||||
.select2-container--admin-autocomplete.select2-container--open .select2-selection.select2-selection--multiple {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single {
|
||||
background-color: var(--body-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__rendered {
|
||||
color: var(--body-fg);
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__clear {
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__placeholder {
|
||||
color: var(--body-quiet-color);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow {
|
||||
height: 26px;
|
||||
position: absolute;
|
||||
top: 1px;
|
||||
right: 1px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--single .select2-selection__arrow b {
|
||||
border-color: #888 transparent transparent transparent;
|
||||
border-style: solid;
|
||||
border-width: 5px 4px 0 4px;
|
||||
height: 0;
|
||||
left: 50%;
|
||||
margin-left: -4px;
|
||||
margin-top: -2px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__clear {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--single .select2-selection__arrow {
|
||||
left: 1px;
|
||||
right: auto;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single {
|
||||
background-color: var(--darkened-bg);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--single .select2-selection__clear {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--open .select2-selection--single .select2-selection__arrow b {
|
||||
border-color: transparent transparent #888 transparent;
|
||||
border-width: 0 4px 5px 4px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple {
|
||||
background-color: var(--body-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
cursor: text;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered {
|
||||
box-sizing: border-box;
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0 10px 5px 5px;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__rendered li {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__placeholder {
|
||||
color: var(--body-quiet-color);
|
||||
margin-top: 5px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__clear {
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
font-weight: bold;
|
||||
margin: 5px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice {
|
||||
background-color: var(--darkened-bg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
cursor: default;
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
margin-top: 5px;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove {
|
||||
color: var(--body-quiet-color);
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
font-weight: bold;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-selection--multiple .select2-selection__choice__remove:hover {
|
||||
color: var(--body-fg);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-search--inline {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
|
||||
margin-left: 5px;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
|
||||
margin-left: 2px;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--focus .select2-selection--multiple {
|
||||
border: solid var(--body-quiet-color) 1px;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection--multiple {
|
||||
background-color: var(--darkened-bg);
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--disabled .select2-selection__choice__remove {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--above .select2-selection--multiple {
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--single, .select2-container--admin-autocomplete.select2-container--open.select2-container--below .select2-selection--multiple {
|
||||
border-bottom-left-radius: 0;
|
||||
border-bottom-right-radius: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-search--dropdown {
|
||||
background: var(--darkened-bg);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-search--dropdown .select2-search__field {
|
||||
background: var(--body-bg);
|
||||
color: var(--body-fg);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-search--inline .select2-search__field {
|
||||
background: transparent;
|
||||
color: var(--body-fg);
|
||||
border: none;
|
||||
outline: 0;
|
||||
box-shadow: none;
|
||||
-webkit-appearance: textfield;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results > .select2-results__options {
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
color: var(--body-fg);
|
||||
background: var(--body-bg);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option[role=group] {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option[aria-disabled=true] {
|
||||
color: var(--body-quiet-color);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option[aria-selected=true] {
|
||||
background-color: var(--selected-bg);
|
||||
color: var(--body-fg);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__group {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option {
|
||||
margin-left: -1em;
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||
margin-left: -2em;
|
||||
padding-left: 3em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||
margin-left: -3em;
|
||||
padding-left: 4em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||
margin-left: -4em;
|
||||
padding-left: 5em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
|
||||
margin-left: -5em;
|
||||
padding-left: 6em;
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__option--highlighted[aria-selected] {
|
||||
background-color: var(--primary);
|
||||
color: var(--primary-fg);
|
||||
}
|
||||
|
||||
.select2-container--admin-autocomplete .select2-results__group {
|
||||
cursor: default;
|
||||
display: block;
|
||||
padding: 6px;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user