init proj
This commit is contained in:
165
.gitignore
vendored
Normal file
165
.gitignore
vendored
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### JetBrains template
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
### Python template
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
db.sqlite3
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery beat schedule file
|
||||||
|
celerybeat-schedule
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
0
abiturient/__init__.py
Normal file
0
abiturient/__init__.py
Normal file
83
abiturient/admin.py
Normal file
83
abiturient/admin.py
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
from django.contrib.admin.options import InlineModelAdmin
|
||||||
|
|
||||||
|
from abiturient.models import Head, Title, Degree, Department, \
|
||||||
|
Faculty, Exam, Formofstudy, Generalinfo, Contactinfo, \
|
||||||
|
Score, Requiredexams, Yearexam, Speciality
|
||||||
|
|
||||||
|
|
||||||
|
# class GeneralInfoAdmin(InlineModelAdmin):
|
||||||
|
# model = Generalinfo
|
||||||
|
#
|
||||||
|
# def get_queryset(self, request):
|
||||||
|
# return Department.general_info.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Head)
|
||||||
|
class HeadAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Title)
|
||||||
|
class TitleAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Degree)
|
||||||
|
class DegreeAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Department)
|
||||||
|
class DepartmentAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Faculty)
|
||||||
|
class FacultyAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Exam)
|
||||||
|
class ExamAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Formofstudy)
|
||||||
|
class FormofstudyAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Contactinfo)
|
||||||
|
class ContactInfoAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Score)
|
||||||
|
class ScoreAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Requiredexams)
|
||||||
|
class RequiredExamsAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Yearexam)
|
||||||
|
class YearExamAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Speciality)
|
||||||
|
class SpecialityAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# admin.register(Head, Title, Degree, Department, Faculty, Exam, Formofstudy,
|
||||||
|
# Generalinfo, Contactinfo, Score, Requiredexams, Yearexam,
|
||||||
|
# Speciality)
|
||||||
5
abiturient/apps.py
Normal file
5
abiturient/apps.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class AbiturientConfig(AppConfig):
|
||||||
|
name = 'abiturient'
|
||||||
191
abiturient/forms.py
Normal file
191
abiturient/forms.py
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
from django import forms
|
||||||
|
|
||||||
|
from crispy_forms.helper import FormHelper
|
||||||
|
from crispy_forms.layout import Layout, Div, Submit, HTML, Button, Row, Field
|
||||||
|
from crispy_forms.bootstrap import AppendedText, PrependedText, FormActions
|
||||||
|
from django.urls import reverse
|
||||||
|
|
||||||
|
from abiturient.models import Head, Title, Degree, Faculty, Department, Exam, \
|
||||||
|
Formofstudy, Yearexam
|
||||||
|
|
||||||
|
|
||||||
|
class FacultyForm(forms.Form):
|
||||||
|
code = forms.CharField()
|
||||||
|
name = forms.CharField()
|
||||||
|
short_name = forms.CharField()
|
||||||
|
|
||||||
|
city = forms.CharField()
|
||||||
|
street = forms.CharField()
|
||||||
|
building = forms.CharField()
|
||||||
|
floor = forms.CharField()
|
||||||
|
room = forms.CharField()
|
||||||
|
web_site = forms.CharField()
|
||||||
|
phone = forms.CharField()
|
||||||
|
|
||||||
|
# Uni-form
|
||||||
|
helper = FormHelper()
|
||||||
|
helper.layout = Layout(
|
||||||
|
Field('code'),
|
||||||
|
Field('name'),
|
||||||
|
Field('short_name'),
|
||||||
|
Field('city'),
|
||||||
|
Field('street'),
|
||||||
|
Field('building'),
|
||||||
|
Field('floor'),
|
||||||
|
Field('room'),
|
||||||
|
Field('web_site'),
|
||||||
|
Field('phone'),
|
||||||
|
FormActions(
|
||||||
|
Submit('save_changes', 'Save changes', css_class="btn-primary")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class HeadForm(forms.Form):
|
||||||
|
first_name = forms.CharField()
|
||||||
|
second_name = forms.CharField(required=False)
|
||||||
|
last_name = forms.CharField()
|
||||||
|
date_of_start = forms.DateField()
|
||||||
|
date_of_end = forms.DateField(required=False)
|
||||||
|
|
||||||
|
helper = FormHelper()
|
||||||
|
helper.layout = Layout(
|
||||||
|
Field('first_name'),
|
||||||
|
Field('second_name'),
|
||||||
|
Field('last_name'),
|
||||||
|
Field('date_of_start'),
|
||||||
|
Field('date_of_end'),
|
||||||
|
Field('title'),
|
||||||
|
Field('degree'),
|
||||||
|
Field('leads'),
|
||||||
|
FormActions(
|
||||||
|
Submit('save_changes', 'Save changes', css_class="btn-primary")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(HeadForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['title'] = forms.ChoiceField(
|
||||||
|
choices=((o.id, o.name) for o in Title.objects.all()),
|
||||||
|
required=True)
|
||||||
|
self.fields['degree'] = forms.ChoiceField(
|
||||||
|
choices=((o.id, o.name) for o in Degree.objects.all()),
|
||||||
|
required=True)
|
||||||
|
self.fields['leads'] = forms.ChoiceField(
|
||||||
|
choices=[(f"F{o.id}", f"Факультет {o.general_info.name}") for o in Faculty.objects.all()]+[(f"D{o.id}", f"Кафедра {o.general_info.name}") for o in Department.objects.all()],
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
|
||||||
|
class DepartmentForm(forms.Form):
|
||||||
|
code = forms.CharField()
|
||||||
|
name = forms.CharField()
|
||||||
|
short_name = forms.CharField()
|
||||||
|
|
||||||
|
city = forms.CharField()
|
||||||
|
street = forms.CharField()
|
||||||
|
building = forms.CharField()
|
||||||
|
floor = forms.CharField()
|
||||||
|
room = forms.CharField()
|
||||||
|
web_site = forms.CharField()
|
||||||
|
phone = forms.CharField()
|
||||||
|
|
||||||
|
# Uni-form
|
||||||
|
helper = FormHelper()
|
||||||
|
helper.layout = Layout(
|
||||||
|
Field('code'),
|
||||||
|
Field('name'),
|
||||||
|
Field('short_name'),
|
||||||
|
Field('city'),
|
||||||
|
Field('street'),
|
||||||
|
Field('building'),
|
||||||
|
Field('floor'),
|
||||||
|
Field('room'),
|
||||||
|
Field('web_site'),
|
||||||
|
Field('phone'),
|
||||||
|
Field('faculty'),
|
||||||
|
FormActions(
|
||||||
|
Submit('save_changes', 'Save changes', css_class="btn-primary")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(DepartmentForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['faculty'] = forms.ChoiceField(
|
||||||
|
choices=((o.id, f"{o.general_info.name}")
|
||||||
|
for o in Faculty.objects.all()),
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
|
||||||
|
class SpecialityForm(forms.Form):
|
||||||
|
code = forms.CharField()
|
||||||
|
name = forms.CharField()
|
||||||
|
short_name = forms.CharField()
|
||||||
|
|
||||||
|
helper = FormHelper()
|
||||||
|
helper.layout = Layout(
|
||||||
|
Field('code'),
|
||||||
|
Field('name'),
|
||||||
|
Field('short_name'),
|
||||||
|
Field('department'),
|
||||||
|
Field('required_exams'),
|
||||||
|
Field('form_of_study'),
|
||||||
|
FormActions(
|
||||||
|
Submit('save_changes', 'Save changes', css_class="btn-primary")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(SpecialityForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['department'] = forms.ChoiceField(
|
||||||
|
choices=((o.id, f"{o.general_info.name}")
|
||||||
|
for o in Department.objects.all()),
|
||||||
|
required=True)
|
||||||
|
self.fields['required_exams'] = forms.MultipleChoiceField(
|
||||||
|
choices=((o.id, f"{o.name}")
|
||||||
|
for o in Exam.objects.all()),
|
||||||
|
required=True)
|
||||||
|
self.fields['form_of_study'] = forms.ChoiceField(
|
||||||
|
choices=((o.id, f"{o.name}")
|
||||||
|
for o in Formofstudy.objects.all()),
|
||||||
|
required=True)
|
||||||
|
|
||||||
|
|
||||||
|
class ExamForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Exam
|
||||||
|
fields = ['name']
|
||||||
|
|
||||||
|
helper = FormHelper()
|
||||||
|
helper.layout = Layout(
|
||||||
|
Field('name'),
|
||||||
|
FormActions(
|
||||||
|
Submit('save_changes', 'Save changes', css_class="btn-primary")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class YearExamForm(forms.ModelForm):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(YearExamForm, self).__init__(*args, **kwargs)
|
||||||
|
self.helper.form_action = reverse('add-yearexam')
|
||||||
|
class Meta:
|
||||||
|
model = Yearexam
|
||||||
|
fields = ['year', 'plan', 'speciality']
|
||||||
|
|
||||||
|
helper = FormHelper()
|
||||||
|
helper.layout = Layout(
|
||||||
|
Field('year'),
|
||||||
|
Field('plan'),
|
||||||
|
Field('speciality'),
|
||||||
|
FormActions(
|
||||||
|
Submit('save_changes', 'Save changes', css_class="btn-primary")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class YearExamsFormSetHelper(FormHelper):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(YearExamsFormSetHelper, self).__init__(*args, **kwargs)
|
||||||
|
self.form_method = 'post'
|
||||||
|
self.add_input(Submit('submit', 'Save'))
|
||||||
|
self.render_required_fields = True
|
||||||
0
abiturient/migrations/__init__.py
Normal file
0
abiturient/migrations/__init__.py
Normal file
145
abiturient/models.py
Normal file
145
abiturient/models.py
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
# This is an auto-generated Django model module.
|
||||||
|
# You'll have to do the following manually to clean this up:
|
||||||
|
# * Rearrange models' order
|
||||||
|
# * Make sure each model has one field with primary_key=True
|
||||||
|
# * Make sure each ForeignKey has `on_delete` set to the desired behavior.
|
||||||
|
# * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
|
||||||
|
# Feel free to rename the models, but don't rename db_table values or field names.
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
|
||||||
|
class Contactinfo(models.Model):
|
||||||
|
city = models.TextField()
|
||||||
|
street = models.TextField()
|
||||||
|
building = models.TextField()
|
||||||
|
floor = models.TextField()
|
||||||
|
room = models.TextField()
|
||||||
|
web_site = models.TextField()
|
||||||
|
phone = models.TextField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'contactinfo'
|
||||||
|
|
||||||
|
|
||||||
|
class Degree(models.Model):
|
||||||
|
name = models.TextField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'degree'
|
||||||
|
|
||||||
|
|
||||||
|
class Department(models.Model):
|
||||||
|
faculty = models.ForeignKey('Faculty', models.DO_NOTHING, db_column='faculty')
|
||||||
|
contact_info = models.ForeignKey(Contactinfo, models.DO_NOTHING, db_column='contact_info')
|
||||||
|
general_info = models.ForeignKey('Generalinfo', models.DO_NOTHING, db_column='general_info')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'department'
|
||||||
|
|
||||||
|
|
||||||
|
class Exam(models.Model):
|
||||||
|
name = models.TextField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'exam'
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return str(self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class Faculty(models.Model):
|
||||||
|
contact_info = models.ForeignKey(Contactinfo, models.DO_NOTHING, db_column='contact_info')
|
||||||
|
general_info = models.ForeignKey('Generalinfo', models.DO_NOTHING, db_column='general_info')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'faculty'
|
||||||
|
|
||||||
|
|
||||||
|
class Formofstudy(models.Model):
|
||||||
|
name = models.TextField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'formofstudy'
|
||||||
|
|
||||||
|
|
||||||
|
class Generalinfo(models.Model):
|
||||||
|
code = models.TextField()
|
||||||
|
name = models.TextField()
|
||||||
|
short_name = models.TextField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'generalinfo'
|
||||||
|
|
||||||
|
|
||||||
|
class Head(models.Model):
|
||||||
|
first_name = models.TextField()
|
||||||
|
last_name = models.TextField()
|
||||||
|
second_name = models.TextField()
|
||||||
|
date_of_start = models.DateField()
|
||||||
|
date_of_end = models.DateField(blank=True, null=True)
|
||||||
|
faculty = models.ForeignKey(Faculty, models.DO_NOTHING, db_column='faculty', blank=True, null=True)
|
||||||
|
department = models.ForeignKey(Department, models.DO_NOTHING, db_column='department', blank=True, null=True)
|
||||||
|
degree = models.ForeignKey(Degree, models.DO_NOTHING, db_column='degree')
|
||||||
|
title = models.ForeignKey('Title', models.DO_NOTHING, db_column='title')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'head'
|
||||||
|
|
||||||
|
|
||||||
|
class Requiredexams(models.Model):
|
||||||
|
specialities = models.ForeignKey('Speciality', models.DO_NOTHING, db_column='specialities', primary_key=True)
|
||||||
|
exams = models.ForeignKey(Exam, models.DO_NOTHING, db_column='exams')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'requiredexams'
|
||||||
|
unique_together = (('specialities', 'exams'),)
|
||||||
|
|
||||||
|
|
||||||
|
class Score(models.Model):
|
||||||
|
mark = models.IntegerField(blank=True, null=True)
|
||||||
|
year_exam = models.ForeignKey('Yearexam', models.DO_NOTHING, db_column='year_exam')
|
||||||
|
exam = models.ForeignKey(Exam, models.DO_NOTHING, db_column='exam')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'score'
|
||||||
|
|
||||||
|
|
||||||
|
class Speciality(models.Model):
|
||||||
|
department = models.ForeignKey(Department, models.DO_NOTHING, db_column='department')
|
||||||
|
form_of_study = models.ForeignKey(Formofstudy, models.DO_NOTHING, db_column='form_of_study')
|
||||||
|
general_info = models.ForeignKey(Generalinfo, models.DO_NOTHING, db_column='general_info')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'speciality'
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'Специальность «{self.general_info.name}»'
|
||||||
|
|
||||||
|
|
||||||
|
class Title(models.Model):
|
||||||
|
name = models.TextField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'title'
|
||||||
|
|
||||||
|
|
||||||
|
class Yearexam(models.Model):
|
||||||
|
year = models.IntegerField()
|
||||||
|
speciality = models.ForeignKey(Speciality, models.DO_NOTHING, db_column='speciality')
|
||||||
|
plan = models.IntegerField()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
managed = False
|
||||||
|
db_table = 'yearexam'
|
||||||
37
abiturient/queries.py
Normal file
37
abiturient/queries.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
from django.db import connection
|
||||||
|
|
||||||
|
|
||||||
|
def specialities_by_year_and_form(spec_id, year):
|
||||||
|
with connection.cursor() as cur:
|
||||||
|
cur.execute("SELECT name, plan FROM speciality INNER JOIN "
|
||||||
|
"generalinfo g on speciality.general_info = g.id"
|
||||||
|
" LEFT JOIN yearexam y on speciality.id = y.speciality "
|
||||||
|
"WHERE form_of_study = %s and year = %s", (spec_id, year))
|
||||||
|
return cur.fetchall()
|
||||||
|
|
||||||
|
|
||||||
|
def spec_highest_math(year):
|
||||||
|
with connection.cursor() as cur:
|
||||||
|
cur.execute("SELECT g.name, max(mark) FROM speciality INNER JOIN "
|
||||||
|
"generalinfo g on speciality.general_info = g.id "
|
||||||
|
"INNER JOIN yearexam y on speciality.id = y.speciality "
|
||||||
|
"INNER JOIN score s on y.id = s.year_exam inner join "
|
||||||
|
"exam e on s.exam = e.id WHERE form_of_study = 2 "
|
||||||
|
"and year = %s and e.name = 'Математика' "
|
||||||
|
"GROUP BY g.name", (year,))
|
||||||
|
res = cur.fetchone()
|
||||||
|
if res is not None:
|
||||||
|
res = res[0]
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
def head_with_titles(year):
|
||||||
|
with connection.cursor() as cur:
|
||||||
|
cur.execute("SELECT first_name, second_name, last_name as year_start "
|
||||||
|
"FROM head INNER JOIN degree d on head.degree = d.id "
|
||||||
|
"INNER JOIN title t on head.title = t.id WHERE d.name = "
|
||||||
|
"'Доктор наук' and t.name = 'Профессор' and "
|
||||||
|
"(date_part('year', date_of_end) <= %s or date_of_end "
|
||||||
|
"is null) and date_part('year', date_of_start) >= %s",
|
||||||
|
(year, year))
|
||||||
|
return cur.fetchall()
|
||||||
3
abiturient/tests.py
Normal file
3
abiturient/tests.py
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
||||||
19
abiturient/urls.py
Normal file
19
abiturient/urls.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
from django.urls import path
|
||||||
|
|
||||||
|
from abiturient.views import IndexView, FacultyAddView, HeadAddView, \
|
||||||
|
DepartmentAddView, SpecialityAddView, ExamAddView, YearExamAddView, \
|
||||||
|
YearExamsAddView, QuerySpecialitiesView, QueryMathView, QueryHeadView
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', IndexView.as_view(), name='index'),
|
||||||
|
path('faculty/add', FacultyAddView.as_view(), name='add-faculty'),
|
||||||
|
path('heads/add', HeadAddView.as_view(), name='add-head'),
|
||||||
|
path('departments/add', DepartmentAddView.as_view(), name='add-department'),
|
||||||
|
path('specialities/add', SpecialityAddView.as_view(), name='add-speciality'),
|
||||||
|
path('exams/add', ExamAddView.as_view(), name='add-exam'),
|
||||||
|
path('yearexams/add', YearExamAddView.as_view(), name='add-yearexam'),
|
||||||
|
path('yearexams/<int:yex_id>', YearExamsAddView.as_view(), name='manage-yearexams'),
|
||||||
|
path('queries/year-plans', QuerySpecialitiesView.as_view(), name='query-year-plans'),
|
||||||
|
path('queries/math', QueryMathView.as_view(), name='query-math'),
|
||||||
|
path('queries/head', QueryHeadView.as_view(), name='query-head'),
|
||||||
|
]
|
||||||
224
abiturient/views.py
Normal file
224
abiturient/views.py
Normal file
@ -0,0 +1,224 @@
|
|||||||
|
from django.db.transaction import atomic
|
||||||
|
from django.forms import modelformset_factory, inlineformset_factory
|
||||||
|
from django.shortcuts import render, redirect
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
|
from django.views import View
|
||||||
|
|
||||||
|
from abiturient.forms import FacultyForm, HeadForm, DepartmentForm, \
|
||||||
|
SpecialityForm, ExamForm, YearExamForm, YearExamsFormSetHelper
|
||||||
|
from abiturient.models import Generalinfo, Contactinfo, Faculty, Head, \
|
||||||
|
Department, Speciality, Requiredexams, Yearexam, Score, Formofstudy
|
||||||
|
from abiturient.queries import specialities_by_year_and_form, \
|
||||||
|
spec_highest_math, head_with_titles
|
||||||
|
|
||||||
|
|
||||||
|
class IndexView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/index.html')
|
||||||
|
|
||||||
|
|
||||||
|
class FacultyAddView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/faculty_form.html',
|
||||||
|
context={'form': FacultyForm()})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
form = FacultyForm(data=request.POST)
|
||||||
|
form.is_valid()
|
||||||
|
with atomic():
|
||||||
|
gen_info = Generalinfo.objects.create(
|
||||||
|
code=form.cleaned_data['code'],
|
||||||
|
name=form.cleaned_data['name'],
|
||||||
|
short_name=form.cleaned_data['short_name']
|
||||||
|
)
|
||||||
|
cont_info = Contactinfo.objects.create(
|
||||||
|
city=form.cleaned_data['city'],
|
||||||
|
street=form.cleaned_data['street'],
|
||||||
|
building=form.cleaned_data['building'],
|
||||||
|
floor=form.cleaned_data['floor'],
|
||||||
|
room=form.cleaned_data['room'],
|
||||||
|
web_site=form.cleaned_data['web_site'],
|
||||||
|
phone=form.cleaned_data['phone']
|
||||||
|
)
|
||||||
|
Faculty.objects.create(
|
||||||
|
general_info=gen_info,
|
||||||
|
contact_info=cont_info
|
||||||
|
)
|
||||||
|
return redirect('add-faculty')
|
||||||
|
|
||||||
|
|
||||||
|
class HeadAddView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/head_form.html',
|
||||||
|
context={'form': HeadForm()})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
form = HeadForm(data=request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
with atomic():
|
||||||
|
lead_type = form.cleaned_data['leads'][0]
|
||||||
|
lead_id = int(form.cleaned_data['leads'][1:])
|
||||||
|
first_name = form.cleaned_data['first_name']
|
||||||
|
second_name = form.cleaned_data['second_name']
|
||||||
|
last_name = form.cleaned_data['last_name']
|
||||||
|
date_of_start = form.cleaned_data['date_of_start']
|
||||||
|
date_of_end = form.cleaned_data['date_of_end']
|
||||||
|
title = form.cleaned_data['title']
|
||||||
|
degree = form.cleaned_data['degree']
|
||||||
|
to_data = {'faculty_id' if lead_type == 'F' else
|
||||||
|
'department_id': lead_id}
|
||||||
|
Head.objects.create(
|
||||||
|
first_name=first_name,
|
||||||
|
second_name=second_name,
|
||||||
|
last_name=last_name,
|
||||||
|
date_of_start=date_of_start,
|
||||||
|
date_of_end=date_of_end,
|
||||||
|
title_id=title,
|
||||||
|
degree_id=degree,
|
||||||
|
**to_data
|
||||||
|
)
|
||||||
|
return redirect('add-head')
|
||||||
|
return render(request, 'abiturient/head_form.html',
|
||||||
|
context={'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
class DepartmentAddView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/department_form.html',
|
||||||
|
context={'form': DepartmentForm()})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
form = DepartmentForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
with atomic():
|
||||||
|
gen_info = Generalinfo.objects.create(
|
||||||
|
code=form.cleaned_data['code'],
|
||||||
|
name=form.cleaned_data['name'],
|
||||||
|
short_name=form.cleaned_data['short_name']
|
||||||
|
)
|
||||||
|
cont_info = Contactinfo.objects.create(
|
||||||
|
city=form.cleaned_data['city'],
|
||||||
|
street=form.cleaned_data['street'],
|
||||||
|
building=form.cleaned_data['building'],
|
||||||
|
floor=form.cleaned_data['floor'],
|
||||||
|
room=form.cleaned_data['room'],
|
||||||
|
web_site=form.cleaned_data['web_site'],
|
||||||
|
phone=form.cleaned_data['phone']
|
||||||
|
)
|
||||||
|
Department.objects.create(
|
||||||
|
contact_info=cont_info,
|
||||||
|
general_info=gen_info,
|
||||||
|
faculty_id=int(form.cleaned_data['faculty'])
|
||||||
|
)
|
||||||
|
return redirect('add-department')
|
||||||
|
return render(request, 'abiturient/department_form.html',
|
||||||
|
context={'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
class SpecialityAddView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/speciality_form.html',
|
||||||
|
context={'form': SpecialityForm()})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
form = SpecialityForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
with atomic():
|
||||||
|
gen_info = Generalinfo.objects.create(
|
||||||
|
code=form.cleaned_data['code'],
|
||||||
|
name=form.cleaned_data['name'],
|
||||||
|
short_name=form.cleaned_data['short_name']
|
||||||
|
)
|
||||||
|
spec = Speciality.objects.create(
|
||||||
|
general_info=gen_info,
|
||||||
|
form_of_study_id=int(form.cleaned_data['form_of_study']),
|
||||||
|
department_id=int(form.cleaned_data['department'])
|
||||||
|
)
|
||||||
|
for item in form.cleaned_data['required_exams']:
|
||||||
|
Requiredexams.objects.create(specialities=spec,
|
||||||
|
exams_id=int(item))
|
||||||
|
return redirect('add-speciality')
|
||||||
|
return render(request, 'abiturient/speciality_form.html',
|
||||||
|
context={'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
class ExamAddView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/exam_form.html',
|
||||||
|
context={'form': ExamForm()})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
form = ExamForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
form.save()
|
||||||
|
return redirect('add-exam')
|
||||||
|
return render(request, 'abiturient/exam_form.html',
|
||||||
|
context={'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
class YearExamAddView(View):
|
||||||
|
def get(self, request):
|
||||||
|
return render(request, 'abiturient/yearexam_form.html',
|
||||||
|
context={'form': YearExamForm()})
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
form = YearExamForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
y = form.save()
|
||||||
|
return redirect('manage-yearexams', y.id)
|
||||||
|
return render(request, 'abiturient/yearexam_form.html',
|
||||||
|
context={'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
class YearExamsAddView(View):
|
||||||
|
def get(self, request, yex_id):
|
||||||
|
y = Yearexam.objects.get(pk=yex_id)
|
||||||
|
formset = inlineformset_factory(Yearexam, Score, fields=(
|
||||||
|
'mark', 'year_exam', 'exam'), can_delete=False)
|
||||||
|
return render(request, 'abiturient/yearexam_form.html',
|
||||||
|
context={'formset': formset(instance=y), 'form': YearExamForm(instance=y), 'helper': YearExamsFormSetHelper()})
|
||||||
|
|
||||||
|
def post(self, request, yex_id):
|
||||||
|
y = Yearexam.objects.get(pk=yex_id)
|
||||||
|
formset = inlineformset_factory(Yearexam, Score,
|
||||||
|
fields=(
|
||||||
|
'mark', 'year_exam', 'exam'))
|
||||||
|
newform = formset(request.POST, instance=y)
|
||||||
|
form = YearExamForm(instance=y)
|
||||||
|
if newform.is_valid():
|
||||||
|
newform.save()
|
||||||
|
return redirect('manage-yearexams', yex_id=yex_id)
|
||||||
|
return render(request, 'abiturient/yearexam_form.html',
|
||||||
|
context={'formset': newform, 'form': form, 'helper': YearExamsFormSetHelper()})
|
||||||
|
|
||||||
|
|
||||||
|
class QuerySpecialitiesView(View):
|
||||||
|
def get(self, request):
|
||||||
|
year = request.GET.get('year')
|
||||||
|
speciality = request.GET.get('spec_id')
|
||||||
|
specs = []
|
||||||
|
if year and speciality:
|
||||||
|
specs = specialities_by_year_and_form(speciality, year)
|
||||||
|
|
||||||
|
return render(request, 'abiturient/queries.html', context={'forms': Formofstudy.objects.all(), 'specs': specs})
|
||||||
|
|
||||||
|
|
||||||
|
class QueryMathView(View):
|
||||||
|
def get(self, request):
|
||||||
|
year = request.GET.get('year')
|
||||||
|
res = None
|
||||||
|
if year:
|
||||||
|
res = spec_highest_math(year)
|
||||||
|
|
||||||
|
return render(request, 'abiturient/query_math.html', context={'res': res})
|
||||||
|
|
||||||
|
|
||||||
|
class QueryHeadView(View):
|
||||||
|
def get(self, request):
|
||||||
|
year = request.GET.get('year')
|
||||||
|
res = None
|
||||||
|
if year:
|
||||||
|
res = head_with_titles(year)
|
||||||
|
|
||||||
|
return render(request, 'abiturient/query_head.html', context={'res': res})
|
||||||
15
manage.py
Normal file
15
manage.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'victor_db.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)
|
||||||
8
templates/abiturient/department_form.html
Normal file
8
templates/abiturient/department_form.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}Добавить Кафедру{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
{% crispy form %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
8
templates/abiturient/exam_form.html
Normal file
8
templates/abiturient/exam_form.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}Добавить экзамен{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
{% crispy form %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
8
templates/abiturient/faculty_form.html
Normal file
8
templates/abiturient/faculty_form.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}Добавить факультет{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
{% crispy form %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
8
templates/abiturient/head_form.html
Normal file
8
templates/abiturient/head_form.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}Добавить руководителя{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
{% crispy form %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
3
templates/abiturient/index.html
Normal file
3
templates/abiturient/index.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
40
templates/abiturient/queries.html
Normal file
40
templates/abiturient/queries.html
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="year">Год</label>
|
||||||
|
<input class="form-control" required type="number" id="year" name="year">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="spec_id">Форма обучения</label>
|
||||||
|
<select class="form-control" required id="spec_id" name="spec_id">
|
||||||
|
{% for form in forms %}
|
||||||
|
<option value="{{ form.id }}">{{ form.name }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary" type="submit">Отправить</button>
|
||||||
|
</form>
|
||||||
|
{% if specs %}
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Имя</th>
|
||||||
|
<th>План</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
{% for spec in specs %}
|
||||||
|
<tr>
|
||||||
|
{% for item in spec %}
|
||||||
|
<td>{{ item }}</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
33
templates/abiturient/query_head.html
Normal file
33
templates/abiturient/query_head.html
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="year">Год</label>
|
||||||
|
<input class="form-control" required type="number" id="year" name="year">
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary" type="submit">Отправить</button>
|
||||||
|
</form>
|
||||||
|
{% if specs %}
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Имя</th>
|
||||||
|
<th>Отчество</th>
|
||||||
|
<th>Фамилия</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
|
||||||
|
{% for spec in specs %}
|
||||||
|
<tr>
|
||||||
|
{% for item in spec %}
|
||||||
|
<td>{{ item }}</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
15
templates/abiturient/query_math.html
Normal file
15
templates/abiturient/query_math.html
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<form>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="year">Год</label>
|
||||||
|
<input class="form-control" required type="number" id="year" name="year">
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary" type="submit">Отправить</button>
|
||||||
|
</form>
|
||||||
|
{% if res %}
|
||||||
|
<div>Результат: {{ res }}</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
8
templates/abiturient/speciality_form.html
Normal file
8
templates/abiturient/speciality_form.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}Добавить руководителя{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
{% crispy form %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
11
templates/abiturient/yearexam_form.html
Normal file
11
templates/abiturient/yearexam_form.html
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
{% block title %}Добавить факультет{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
{% crispy form %}
|
||||||
|
{% if formset %}
|
||||||
|
{% crispy formset helper %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
58
templates/base.html
Normal file
58
templates/base.html
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ru">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}Абитуриент{% endblock %}</title>
|
||||||
|
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
|
||||||
|
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
|
||||||
|
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<nav class="navbar navbar-expand-lg navbar-light bg-light">
|
||||||
|
<a class="navbar-brand" href="{% url 'index' %}">Абитуриент</a>
|
||||||
|
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||||
|
<span class="navbar-toggler-icon"></span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||||
|
<ul class="navbar-nav mr-auto">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'index' %}">Абитуриент</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'add-head' %}">Добавить руководителя</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'add-department' %}">Добавить Кафедру</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'add-speciality' %}">Добавить Специальность</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'add-exam' %}">Добавить Экзамен</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'add-yearexam' %}">Добавить План</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="{% url 'add-faculty' %}">Добавить Факультет</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item dropdown">
|
||||||
|
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
Запросы
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
|
||||||
|
<a class="dropdown-item" href="{% url 'query-year-plans' %}">Специальности</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'query-math' %}">С наивысшим баллом</a>
|
||||||
|
<a class="dropdown-item" href="{% url 'query-head' %}">Руководители</a>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
0
victor_db/__init__.py
Normal file
0
victor_db/__init__.py
Normal file
127
victor_db/settings.py
Normal file
127
victor_db/settings.py
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
"""
|
||||||
|
Django settings for victor_db project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 2.1.5.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/2.1/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/2.1/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production
|
||||||
|
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = 'cx7xm2c25sup0o4jioy!6d^5@-58p-cy^f#j(y)y3r84mv1vn1'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = []
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'abiturient',
|
||||||
|
'crispy_forms'
|
||||||
|
]
|
||||||
|
|
||||||
|
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 = 'victor_db.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 = 'victor_db.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
|
'NAME': 'victor_db',
|
||||||
|
'USER': 'victor_db',
|
||||||
|
'PASSWORD': 'victor_db'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/2.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/2.1/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_L10N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
CRISPY_TEMPLATE_PACK = 'bootstrap4'
|
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/2.1/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = '/static/'
|
||||||
22
victor_db/urls.py
Normal file
22
victor_db/urls.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
"""victor_db URL Configuration
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/2.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.contrib import admin
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('admin/', admin.site.urls),
|
||||||
|
path('', include('abiturient.urls'))
|
||||||
|
]
|
||||||
16
victor_db/wsgi.py
Normal file
16
victor_db/wsgi.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for victor_db 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/2.1/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'victor_db.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
Reference in New Issue
Block a user