Первоначальный залив проекта
This commit is contained in:
11
.continue/models/new-model.yaml
Normal file
11
.continue/models/new-model.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
name: New model
|
||||
version: 0.0.1
|
||||
schema: v1
|
||||
models:
|
||||
- provider: anthropic
|
||||
model: claude-3-7-sonnet-latest
|
||||
apiKey: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
name: Claude 3.7 Sonnet
|
||||
roles:
|
||||
- chat
|
||||
- edit
|
||||
8
.continue/prompts/new-prompt-1.yaml
Normal file
8
.continue/prompts/new-prompt-1.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
name: New prompt
|
||||
version: 0.0.1
|
||||
schema: v1
|
||||
prompts:
|
||||
- name: New prompt
|
||||
description: New prompt
|
||||
prompt: Please write a thorough suite of unit tests for this code, making sure
|
||||
to cover all relevant edge cases
|
||||
8
.continue/prompts/new-prompt.yaml
Normal file
8
.continue/prompts/new-prompt.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
name: New prompt
|
||||
version: 0.0.1
|
||||
schema: v1
|
||||
prompts:
|
||||
- name: New prompt
|
||||
description: New prompt
|
||||
prompt: Напиши о чем проект, что он делает и какие задачи решает.
|
||||
|
||||
139
.gitignore
vendored
Normal file
139
.gitignore
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
# Django #
|
||||
*.log
|
||||
*.pot
|
||||
*.pyc
|
||||
__pycache__
|
||||
db.sqlite3
|
||||
media
|
||||
|
||||
# Backup files #
|
||||
*.bak
|
||||
|
||||
# If you are using PyCharm #
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# AWS User-specific
|
||||
.idea/**/aws.xml
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Python #
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# Distribution / packaging
|
||||
.Python build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
.pytest_cache/
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
.hypothesis/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery
|
||||
celerybeat-schedule.*
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
.noutenv
|
||||
env/
|
||||
venv/
|
||||
/noutenv
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
|
||||
# Sublime Text #
|
||||
*.tmlanguage.cache
|
||||
*.tmPreferences.cache
|
||||
*.stTheme.cache
|
||||
*.sublime-workspace
|
||||
*.sublime-project
|
||||
|
||||
# sftp configuration file
|
||||
sftp-config.json
|
||||
|
||||
# Package control specific files Package
|
||||
Control.last-run
|
||||
Control.ca-list
|
||||
Control.ca-bundle
|
||||
Control.system-ca-bundle
|
||||
GitHub.sublime-settings
|
||||
|
||||
# Visual Studio Code #
|
||||
.vscode/*
|
||||
!.vscode/settings.json
|
||||
!.vscode/tasks.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/extensions.json
|
||||
.history
|
||||
3
.idea/.gitignore
generated
vendored
Normal file
3
.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
10
.idea/misc.xml
generated
Normal file
10
.idea/misc.xml
generated
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.12 (retraining)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.9 (retraining) (2)" project-jdk-type="Python SDK" />
|
||||
<component name="PyCharmProfessionalAdvertiser">
|
||||
<option name="shown" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
8
.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/retraining.iml" filepath="$PROJECT_DIR$/.idea/retraining.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
16
.idea/retraining.iml
generated
Normal file
16
.idea/retraining.iml
generated
Normal file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/retraining" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/homeenv" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/noutenv" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
<component name="PyDocumentationSettings">
|
||||
<option name="format" value="PLAIN" />
|
||||
<option name="myDocStringFormat" value="Plain" />
|
||||
</component>
|
||||
</module>
|
||||
6
.idea/vcs.xml
generated
Normal file
6
.idea/vcs.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
44
.idea/workspace (2).xml
generated
Normal file
44
.idea/workspace (2).xml
generated
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="9c169028-fe40-484f-ac6d-c6770a01a8d5" name="Changes" comment="" />
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo"><![CDATA[{
|
||||
"associatedIndex": 5
|
||||
}]]></component>
|
||||
<component name="ProjectId" id="2bw72bVPNYUAk0N2A97EcR1Zo5O" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"ignore.virus.scanning.warn.message": "true",
|
||||
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable"
|
||||
}
|
||||
}]]></component>
|
||||
<component name="SharedIndexes">
|
||||
<attachedChunks>
|
||||
<set>
|
||||
<option value="bundled-python-sdk-5a2391486177-d3b881c8e49f-com.jetbrains.pycharm.community.sharedIndexes.bundled-PC-233.13763.11" />
|
||||
</set>
|
||||
</attachedChunks>
|
||||
</component>
|
||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
|
||||
<component name="TaskManager">
|
||||
<task active="true" id="Default" summary="Default task">
|
||||
<changelist id="9c169028-fe40-484f-ac6d-c6770a01a8d5" name="Changes" comment="" />
|
||||
<created>1707114080884</created>
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1707114080884</updated>
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
</project>
|
||||
19
.vscode/launch.json
vendored
Normal file
19
.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Django",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}\\retraining\\manage.py",
|
||||
"args": [
|
||||
"runserver"
|
||||
],
|
||||
"django": true,
|
||||
// "justMyCode": true
|
||||
}
|
||||
]
|
||||
}
|
||||
399
homeenv/Scripts/Activate.ps1
Normal file
399
homeenv/Scripts/Activate.ps1
Normal file
@@ -0,0 +1,399 @@
|
||||
<#
|
||||
.Synopsis
|
||||
Activate a Python virtual environment for the current PowerShell session.
|
||||
|
||||
.Description
|
||||
Pushes the python executable for a virtual environment to the front of the
|
||||
$Env:PATH environment variable and sets the prompt to signify that you are
|
||||
in a Python virtual environment. Makes use of the command line switches as
|
||||
well as the `pyvenv.cfg` file values present in the virtual environment.
|
||||
|
||||
.Parameter VenvDir
|
||||
Path to the directory that contains the virtual environment to activate. The
|
||||
default value for this is the parent of the directory that the Activate.ps1
|
||||
script is located within.
|
||||
|
||||
.Parameter Prompt
|
||||
The prompt prefix to display when this virtual environment is activated. By
|
||||
default, this prompt is the name of the virtual environment folder (VenvDir)
|
||||
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
||||
|
||||
.Example
|
||||
Activate.ps1
|
||||
Activates the Python virtual environment that contains the Activate.ps1 script.
|
||||
|
||||
.Example
|
||||
Activate.ps1 -Verbose
|
||||
Activates the Python virtual environment that contains the Activate.ps1 script,
|
||||
and shows extra information about the activation as it executes.
|
||||
|
||||
.Example
|
||||
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
||||
Activates the Python virtual environment located in the specified location.
|
||||
|
||||
.Example
|
||||
Activate.ps1 -Prompt "MyPython"
|
||||
Activates the Python virtual environment that contains the Activate.ps1 script,
|
||||
and prefixes the current prompt with the specified string (surrounded in
|
||||
parentheses) while the virtual environment is active.
|
||||
|
||||
.Notes
|
||||
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
||||
execution policy for the user. You can do this by issuing the following PowerShell
|
||||
command:
|
||||
|
||||
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
|
||||
For more information on Execution Policies:
|
||||
https://go.microsoft.com/fwlink/?LinkID=135170
|
||||
|
||||
#>
|
||||
Param(
|
||||
[Parameter(Mandatory = $false)]
|
||||
[String]
|
||||
$VenvDir,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[String]
|
||||
$Prompt
|
||||
)
|
||||
|
||||
<# Function declarations --------------------------------------------------- #>
|
||||
|
||||
<#
|
||||
.Synopsis
|
||||
Remove all shell session elements added by the Activate script, including the
|
||||
addition of the virtual environment's Python executable from the beginning of
|
||||
the PATH variable.
|
||||
|
||||
.Parameter NonDestructive
|
||||
If present, do not remove this function from the global namespace for the
|
||||
session.
|
||||
|
||||
#>
|
||||
function global:deactivate ([switch]$NonDestructive) {
|
||||
# Revert to original values
|
||||
|
||||
# The prior prompt:
|
||||
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
||||
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
||||
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
||||
}
|
||||
|
||||
# The prior PYTHONHOME:
|
||||
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
||||
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
||||
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
||||
}
|
||||
|
||||
# The prior PATH:
|
||||
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
||||
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
||||
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
||||
}
|
||||
|
||||
# Just remove the VIRTUAL_ENV altogether:
|
||||
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
||||
Remove-Item -Path env:VIRTUAL_ENV
|
||||
}
|
||||
|
||||
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
||||
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
||||
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
||||
}
|
||||
|
||||
# Leave deactivate function in the global namespace if requested:
|
||||
if (-not $NonDestructive) {
|
||||
Remove-Item -Path function:deactivate
|
||||
}
|
||||
}
|
||||
|
||||
<#
|
||||
.Description
|
||||
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
||||
given folder, and returns them in a map.
|
||||
|
||||
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
||||
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
||||
then it is considered a `key = value` line. The left hand string is the key,
|
||||
the right hand is the value.
|
||||
|
||||
If the value starts with a `'` or a `"` then the first and last character is
|
||||
stripped from the value before being captured.
|
||||
|
||||
.Parameter ConfigDir
|
||||
Path to the directory that contains the `pyvenv.cfg` file.
|
||||
#>
|
||||
function Get-PyVenvConfig(
|
||||
[String]
|
||||
$ConfigDir
|
||||
) {
|
||||
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
||||
|
||||
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
||||
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
||||
|
||||
# An empty map will be returned if no config file is found.
|
||||
$pyvenvConfig = @{ }
|
||||
|
||||
if ($pyvenvConfigPath) {
|
||||
|
||||
Write-Verbose "File exists, parse `key = value` lines"
|
||||
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
||||
|
||||
$pyvenvConfigContent | ForEach-Object {
|
||||
$keyval = $PSItem -split "\s*=\s*", 2
|
||||
if ($keyval[0] -and $keyval[1]) {
|
||||
$val = $keyval[1]
|
||||
|
||||
# Remove extraneous quotations around a string value.
|
||||
if ("'""".Contains($val.Substring(0, 1))) {
|
||||
$val = $val.Substring(1, $val.Length - 2)
|
||||
}
|
||||
|
||||
$pyvenvConfig[$keyval[0]] = $val
|
||||
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
||||
}
|
||||
}
|
||||
}
|
||||
return $pyvenvConfig
|
||||
}
|
||||
|
||||
|
||||
<# Begin Activate script --------------------------------------------------- #>
|
||||
|
||||
# Determine the containing directory of this script
|
||||
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||
$VenvExecDir = Get-Item -Path $VenvExecPath
|
||||
|
||||
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
||||
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
||||
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
||||
|
||||
# Set values required in priority: CmdLine, ConfigFile, Default
|
||||
# First, get the location of the virtual environment, it might not be
|
||||
# VenvExecDir if specified on the command line.
|
||||
if ($VenvDir) {
|
||||
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
||||
}
|
||||
else {
|
||||
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
||||
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
||||
Write-Verbose "VenvDir=$VenvDir"
|
||||
}
|
||||
|
||||
# Next, read the `pyvenv.cfg` file to determine any required value such
|
||||
# as `prompt`.
|
||||
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
||||
|
||||
# Next, set the prompt from the command line, or the config file, or
|
||||
# just use the name of the virtual environment folder.
|
||||
if ($Prompt) {
|
||||
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
||||
}
|
||||
else {
|
||||
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
||||
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
||||
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
||||
$Prompt = $pyvenvCfg['prompt'];
|
||||
}
|
||||
else {
|
||||
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
|
||||
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
||||
$Prompt = Split-Path -Path $venvDir -Leaf
|
||||
}
|
||||
}
|
||||
|
||||
Write-Verbose "Prompt = '$Prompt'"
|
||||
Write-Verbose "VenvDir='$VenvDir'"
|
||||
|
||||
# Deactivate any currently active virtual environment, but leave the
|
||||
# deactivate function in place.
|
||||
deactivate -nondestructive
|
||||
|
||||
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
||||
# that there is an activated venv.
|
||||
$env:VIRTUAL_ENV = $VenvDir
|
||||
|
||||
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
||||
|
||||
Write-Verbose "Setting prompt to '$Prompt'"
|
||||
|
||||
# Set the prompt to include the env name
|
||||
# Make sure _OLD_VIRTUAL_PROMPT is global
|
||||
function global:_OLD_VIRTUAL_PROMPT { "" }
|
||||
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
||||
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
||||
|
||||
function global:prompt {
|
||||
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
||||
_OLD_VIRTUAL_PROMPT
|
||||
}
|
||||
}
|
||||
|
||||
# Clear PYTHONHOME
|
||||
if (Test-Path -Path Env:PYTHONHOME) {
|
||||
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
||||
Remove-Item -Path Env:PYTHONHOME
|
||||
}
|
||||
|
||||
# Add the venv to the PATH
|
||||
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
||||
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
||||
|
||||
# SIG # Begin signature block
|
||||
# MIIc9wYJKoZIhvcNAQcCoIIc6DCCHOQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
||||
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
||||
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAwnDYwEHaCQq0n
|
||||
# 8NAvsN7H7BO7/48rXCNwrg891FS5vaCCC38wggUwMIIEGKADAgECAhAECRgbX9W7
|
||||
# ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
||||
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
|
||||
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBa
|
||||
# Fw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
|
||||
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD
|
||||
# ZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3
|
||||
# DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/l
|
||||
# qJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fT
|
||||
# eyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqH
|
||||
# CN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+
|
||||
# bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLo
|
||||
# LFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIB
|
||||
# yTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK
|
||||
# BggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
|
||||
# Y3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGln
|
||||
# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHow
|
||||
# eDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl
|
||||
# ZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp
|
||||
# Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwA
|
||||
# AgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAK
|
||||
# BghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0j
|
||||
# BBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7s
|
||||
# DVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGS
|
||||
# dQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6
|
||||
# r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo
|
||||
# +MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qz
|
||||
# sIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHq
|
||||
# aGxEMrJmoecYpJpkUe8wggZHMIIFL6ADAgECAhADPtXtoGXRuMkd/PkqbJvYMA0G
|
||||
# CSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
|
||||
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0
|
||||
# IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwHhcNMTgxMjE4MDAwMDAw
|
||||
# WhcNMjExMjIyMTIwMDAwWjCBgzELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDU5ldyBI
|
||||
# YW1wc2hpcmUxEjAQBgNVBAcTCVdvbGZlYm9ybzEjMCEGA1UEChMaUHl0aG9uIFNv
|
||||
# ZnR3YXJlIEZvdW5kYXRpb24xIzAhBgNVBAMTGlB5dGhvbiBTb2Z0d2FyZSBGb3Vu
|
||||
# ZGF0aW9uMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAqr2kS7J1uW7o
|
||||
# JRxlsdrETAjKarfoH5TI8PWST6Yb2xPooP7vHT4iaVXyL5Lze1f53Jw67Sp+u524
|
||||
# fJXf30qHViEWxumy2RWG0nciU2d+mMqzjlaAWSZNF0u4RcvyDJokEV0RUOqI5CG5
|
||||
# zPI3W9uQ6LiUk3HCYW6kpH177A5T3pw/Po8O8KErJGn1anaqtIICq99ySxrMad/2
|
||||
# hPMBRf6Ndah7f7HPn1gkSSTAoejyuqF5h+B0qI4+JK5+VLvz659VTbAWJsYakkxZ
|
||||
# xVWYpFv4KeQSSwoo0DzMvmERsTzNvVBMWhu9OriJNg+QfFmf96zVTu93cZ+r7xMp
|
||||
# bXyfIOGKhHMaRuZ8ihuWIx3gI9WHDFX6fBKR8+HlhdkaiBEWIsXRoy+EQUyK7zUs
|
||||
# +FqOo2sRYttbs8MTF9YDKFZwyPjn9Wn+gLGd5NUEVyNvD9QVGBEtN7vx87bduJUB
|
||||
# 8F4DylEsMtZTfjw/au6AmOnmneK5UcqSJuwRyZaGNk7y3qj06utx+HTTqHgi975U
|
||||
# pxfyrwAqkovoZEWBVSpvku8PVhkBXcLmNe6MEHlFiaMoiADAeKmX5RFRkN+VrmYG
|
||||
# Tg4zajxfdHeIY8TvLf48tTfmnQJd98geJQv/01NUy/FxuwqAuTkaez5Nl1LxP0Cp
|
||||
# THhghzO4FRD4itT2wqTh4jpojw9QZnsCAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaA
|
||||
# FFrEuXsqCqOl6nEDwGD5LfZldQ5YMB0GA1UdDgQWBBT8Kr9+1L6s84KcpM97IgE7
|
||||
# uI8H8jAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0f
|
||||
# BHAwbjA1oDOgMYYvaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
|
||||
# ZC1jcy1nMS5jcmwwNaAzoDGGL2h0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEy
|
||||
# LWFzc3VyZWQtY3MtZzEuY3JsMEwGA1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYI
|
||||
# KwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQB
|
||||
# MIGEBggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
|
||||
# ZXJ0LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
|
||||
# L0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB
|
||||
# /wQCMAAwDQYJKoZIhvcNAQELBQADggEBAEt1oS21X0axiafPjyY+vlYqjWKuUu/Y
|
||||
# FuYWIEq6iRRaFabNDhj9RBFQF/aJiE5msrQEOfAD6/6gVSH91lZWBqg6NEeG9T9S
|
||||
# XbiAPvJ9CEWFsdkXUrjbWhvCnuZ7kqUuU5BAumI1QRbpYgZL3UA+iZXkmjbGh1ln
|
||||
# 8rUhWIxbBYL4Sg2nqpB44p7CUFYkPj/MbwU2gvBV2pXjj5WaskoZtsACMv5g42BN
|
||||
# oVLoRAi+ev6s07POt+JtHRIm87lTyuc8wh0swTPUwksKbLU1Zdj9CpqtzXnuVE0w
|
||||
# 50exJvRSK3Vt4g+0vigpI3qPmDdpkf9+4Mvy0XMNcqrthw20R+PkIlMxghDOMIIQ
|
||||
# ygIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
|
||||
# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEy
|
||||
# IEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADPtXtoGXRuMkd/PkqbJvYMA0G
|
||||
# CWCGSAFlAwQCAQUAoIGYMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
|
||||
# AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCwGCisGAQQBgjcCAQwxHjAcoBqAGABQ
|
||||
# AHkAdABoAG8AbgAgADMALgA5AC4ANzAvBgkqhkiG9w0BCQQxIgQgBrni4mcRv7sM
|
||||
# JHsxpROjRopOz2wuQVrJnn+lD7X7y+gwDQYJKoZIhvcNAQEBBQAEggIAlpjGHgZ7
|
||||
# CPnoJRAJIxIBpQAvUTGheJi/uP1gtaPWRvcxP8tQvtvdTd9aMrsZnNy0gdaa5WL3
|
||||
# yYMzA0Ytzwfh0fsGuQjdx1ht/J8U++D/Lfl/w+rdbZ4mXhjnbqmTAJknEDW4NEWa
|
||||
# mwyhp+5zzADBp2VkryFpB3B7K04u8CyxXpRG6no86ROHkmsOk4j2mZUP9g/Hx4tv
|
||||
# eWjakNMPkdXZ7tWtkGNWbwOYDosvSt1aCDld5TE2o2CHOJJpi06rHRI4o4X2gNRO
|
||||
# rk8+6pH0XTS0//OMfHZRcDtRgJ7ohU/v2CDRuDw/b5NH1S1kwbdLpOoVw1bTrjsx
|
||||
# jOotJbVUuPO3ES0ZzidPbEejPz1/D/z6Yl01KfbQJ9DanTzPhQw/hCezsUUsKZBR
|
||||
# iZ1WWqZmZaT3faO/VwumIeQEa4XlGMcviEuyRye09nx3E+d9Gu8eCwm3RLD8rRDb
|
||||
# J1+GIZDkBi+Qebo3hao16666J+dezjV6HO50NkXeY/1I43A/P2nXtwqsAuaO+h/X
|
||||
# +3enzdtZx4HZa7E7wQ2F3daOV69IOliB6PCUfzPB4bqoms7c85YKEb3ZDYPX+Igf
|
||||
# EPDOQd+U3pvXLvzaJj8RL+g+s2/xaPm4KrzpKXr4SO4Voje6p0Keso/6/pErSfAf
|
||||
# OFWx+zhUKELWbCZLzdDZ76IuT0V8arqtTK+hgg19MIINeQYKKwYBBAGCNwMDATGC
|
||||
# DWkwgg1lBgkqhkiG9w0BBwKggg1WMIINUgIBAzEPMA0GCWCGSAFlAwQCAQUAMHcG
|
||||
# CyqGSIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEF
|
||||
# AAQgOSCrDv+oDMEj/ophQEUCc8G75r8sYGG8KKaH7Fm+WY0CEFzwQrsuwLerUKVb
|
||||
# vYKnHYEYDzIwMjEwODMwMjAzMjQwWqCCCjcwggT+MIID5qADAgECAhANQkrgvjqI
|
||||
# /2BAIc4UAPDdMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
|
||||
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV
|
||||
# BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0EwHhcN
|
||||
# MjEwMTAxMDAwMDAwWhcNMzEwMTA2MDAwMDAwWjBIMQswCQYDVQQGEwJVUzEXMBUG
|
||||
# A1UEChMORGlnaUNlcnQsIEluYy4xIDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFt
|
||||
# cCAyMDIxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwuZhhGfFivUN
|
||||
# CKRFymNrUdc6EUK9CnV1TZS0DFC1JhD+HchvkWsMlucaXEjvROW/m2HNFZFiWrj/
|
||||
# ZwucY/02aoH6KfjdK3CF3gIY83htvH35x20JPb5qdofpir34hF0edsnkxnZ2OlPR
|
||||
# 0dNaNo/Go+EvGzq3YdZz7E5tM4p8XUUtS7FQ5kE6N1aG3JMjjfdQJehk5t3Tjy9X
|
||||
# tYcg6w6OLNUj2vRNeEbjA4MxKUpcDDGKSoyIxfcwWvkUrxVfbENJCf0mI1P2jWPo
|
||||
# GqtbsR0wwptpgrTb/FZUvB+hh6u+elsKIC9LCcmVp42y+tZji06lchzun3oBc/gZ
|
||||
# 1v4NSYS9AQIDAQABo4IBuDCCAbQwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
|
||||
# MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQQYDVR0gBDowODA2BglghkgBhv1s
|
||||
# BwEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMB8G
|
||||
# A1UdIwQYMBaAFPS24SAd/imu0uRhpbKiJbLIFzVuMB0GA1UdDgQWBBQ2RIaOpLqw
|
||||
# Zr68KC0dRDbd42p6vDBxBgNVHR8EajBoMDKgMKAuhixodHRwOi8vY3JsMy5kaWdp
|
||||
# Y2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDAyoDCgLoYsaHR0cDovL2NybDQu
|
||||
# ZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwgYUGCCsGAQUFBwEBBHkw
|
||||
# dzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME8GCCsGAQUF
|
||||
# BzAChkNodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyQXNz
|
||||
# dXJlZElEVGltZXN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUAA4IBAQBIHNy1
|
||||
# 6ZojvOca5yAOjmdG/UJyUXQKI0ejq5LSJcRwWb4UoOUngaVNFBUZB3nw0QTDhtk7
|
||||
# vf5EAmZN7WmkD/a4cM9i6PVRSnh5Nnont/PnUp+Tp+1DnnvntN1BIon7h6JGA078
|
||||
# 9P63ZHdjXyNSaYOC+hpT7ZDMjaEXcw3082U5cEvznNZ6e9oMvD0y0BvL9WH8dQgA
|
||||
# dryBDvjA4VzPxBFy5xtkSdgimnUVQvUtMjiB2vRgorq0Uvtc4GEkJU+y38kpqHND
|
||||
# Udq9Y9YfW5v3LhtPEx33Sg1xfpe39D+E68Hjo0mh+s6nv1bPull2YYlffqe0jmd4
|
||||
# +TaY4cso2luHpoovMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXaNpfCFTANBgkq
|
||||
# hkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
|
||||
# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB
|
||||
# c3N1cmVkIElEIFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEwMTA3MTIwMDAw
|
||||
# WjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
|
||||
# ExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3Vy
|
||||
# ZWQgSUQgVGltZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
||||
# CgKCAQEAvdAy7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1NaH7ntqD0jbOI
|
||||
# 5Je/YyGQmL8TvFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vjRkcGGlV+Cyd+
|
||||
# wKL1oODeIj8O/36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOoCXFr4M8iEA91
|
||||
# z3FyTgqt30A6XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe/WZuVmEnKYmE
|
||||
# UeaC50ZQ/ZQqLKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG7z3N1k3vBkL9
|
||||
# olMqT4UdxB08r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYDVR0OBBYEFPS2
|
||||
# 4SAd/imu0uRhpbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3z
|
||||
# bcgPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM
|
||||
# MAoGCCsGAQUFBwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDov
|
||||
# L29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5k
|
||||
# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8E
|
||||
# ejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
|
||||
# cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
|
||||
# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcwOAYKYIZIAYb9
|
||||
# bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
|
||||
# MAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGHVmnN793afKpj
|
||||
# erN4zwY3QITvS4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqumfgnoma/Capg
|
||||
# 33akOpMP+LLR2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuByx5jWPGTlH0gQ
|
||||
# GF+JOGFNYkYkh2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraSZ/tTYYmo9WuW
|
||||
# wPRYaQ18yAGxuSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh5Fhgm7oMLStt
|
||||
# osR+u8QlK0cCCHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2skuiSpXY9aaO
|
||||
# UjGCAoYwggKCAgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
|
||||
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lD
|
||||
# ZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0ECEA1CSuC+Ooj/YEAh
|
||||
# zhQA8N0wDQYJYIZIAWUDBAIBBQCggdEwGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ
|
||||
# EAEEMBwGCSqGSIb3DQEJBTEPFw0yMTA4MzAyMDMyNDBaMCsGCyqGSIb3DQEJEAIM
|
||||
# MRwwGjAYMBYEFOHXgqjhkb7va8oWkbWqtJSmJJvzMC8GCSqGSIb3DQEJBDEiBCBI
|
||||
# G7lS/r0RCENJotqNy8WPsrW/fmVFip107NYjeJ0Q0TA3BgsqhkiG9w0BCRACLzEo
|
||||
# MCYwJDAiBCCzEJAGvArZgweRVyngRANBXIPjKSthTyaWTI01cez1qTANBgkqhkiG
|
||||
# 9w0BAQEFAASCAQBLFNmzEWXnvby6UBfPXhcIQetEVjem6zU9lbSj5MXY7ZJDCtV/
|
||||
# cdI6SWEsz1uZyzNlHvBvctGK03lZcWcwa0PrGokLG2v3zuU1MAj2MJVuunQ5GjaI
|
||||
# UoWDeROFwEBtqKnR+hTB2GV/pOb1nEHR6xm4KvMao0WcnkQhVL3LXVVawDSJIrA8
|
||||
# 8I5XyqZx3q6jRFVAuIlM6HLrQiaLRpP9j25/1Pin8zLd0e65jaAufHQW6V7vG3GI
|
||||
# C9d89LkmDN7uftGjXS5LKiC4EYMYKK8L3/ikBW70mATlDXZfLBoEdAv1rUoIXnf2
|
||||
# 7AxXiMi4hXF2JsMk/J2h9lfvENROxXGIStD1
|
||||
# SIG # End signature block
|
||||
66
homeenv/Scripts/activate
Normal file
66
homeenv/Scripts/activate
Normal file
@@ -0,0 +1,66 @@
|
||||
# This file must be used with "source bin/activate" *from bash*
|
||||
# you cannot run it directly
|
||||
|
||||
deactivate () {
|
||||
# reset old environment variables
|
||||
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
|
||||
PATH="${_OLD_VIRTUAL_PATH:-}"
|
||||
export PATH
|
||||
unset _OLD_VIRTUAL_PATH
|
||||
fi
|
||||
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
|
||||
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
|
||||
export PYTHONHOME
|
||||
unset _OLD_VIRTUAL_PYTHONHOME
|
||||
fi
|
||||
|
||||
# This should detect bash and zsh, which have a hash command that must
|
||||
# be called to get it to forget past commands. Without forgetting
|
||||
# past commands the $PATH changes we made may not be respected
|
||||
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
||||
hash -r 2> /dev/null
|
||||
fi
|
||||
|
||||
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
|
||||
PS1="${_OLD_VIRTUAL_PS1:-}"
|
||||
export PS1
|
||||
unset _OLD_VIRTUAL_PS1
|
||||
fi
|
||||
|
||||
unset VIRTUAL_ENV
|
||||
if [ ! "${1:-}" = "nondestructive" ] ; then
|
||||
# Self destruct!
|
||||
unset -f deactivate
|
||||
fi
|
||||
}
|
||||
|
||||
# unset irrelevant variables
|
||||
deactivate nondestructive
|
||||
|
||||
VIRTUAL_ENV="C:\Users\ackng\YandexDisk\ACKWork\django\retraining\homeenv"
|
||||
export VIRTUAL_ENV
|
||||
|
||||
_OLD_VIRTUAL_PATH="$PATH"
|
||||
PATH="$VIRTUAL_ENV/Scripts:$PATH"
|
||||
export PATH
|
||||
|
||||
# unset PYTHONHOME if set
|
||||
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
|
||||
# could use `if (set -u; : $PYTHONHOME) ;` in bash
|
||||
if [ -n "${PYTHONHOME:-}" ] ; then
|
||||
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
|
||||
unset PYTHONHOME
|
||||
fi
|
||||
|
||||
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
|
||||
_OLD_VIRTUAL_PS1="${PS1:-}"
|
||||
PS1="(homeenv) ${PS1:-}"
|
||||
export PS1
|
||||
fi
|
||||
|
||||
# This should detect bash and zsh, which have a hash command that must
|
||||
# be called to get it to forget past commands. Without forgetting
|
||||
# past commands the $PATH changes we made may not be respected
|
||||
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
|
||||
hash -r 2> /dev/null
|
||||
fi
|
||||
33
homeenv/Scripts/activate.bat
Normal file
33
homeenv/Scripts/activate.bat
Normal file
@@ -0,0 +1,33 @@
|
||||
@echo off
|
||||
|
||||
rem This file is UTF-8 encoded, so we need to update the current code page while executing it
|
||||
for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
|
||||
set _OLD_CODEPAGE=%%a
|
||||
)
|
||||
if defined _OLD_CODEPAGE (
|
||||
"%SystemRoot%\System32\chcp.com" 65001 > nul
|
||||
)
|
||||
|
||||
set VIRTUAL_ENV=C:\Users\ackng\YandexDisk\ACKWork\django\retraining\homeenv
|
||||
|
||||
if not defined PROMPT set PROMPT=$P$G
|
||||
|
||||
if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
|
||||
if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
|
||||
|
||||
set _OLD_VIRTUAL_PROMPT=%PROMPT%
|
||||
set PROMPT=(homeenv) %PROMPT%
|
||||
|
||||
if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
|
||||
set PYTHONHOME=
|
||||
|
||||
if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
|
||||
if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
|
||||
|
||||
set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
|
||||
|
||||
:END
|
||||
if defined _OLD_CODEPAGE (
|
||||
"%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
|
||||
set _OLD_CODEPAGE=
|
||||
)
|
||||
BIN
homeenv/Scripts/autopep8.exe
Normal file
BIN
homeenv/Scripts/autopep8.exe
Normal file
Binary file not shown.
21
homeenv/Scripts/deactivate.bat
Normal file
21
homeenv/Scripts/deactivate.bat
Normal file
@@ -0,0 +1,21 @@
|
||||
@echo off
|
||||
|
||||
if defined _OLD_VIRTUAL_PROMPT (
|
||||
set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
|
||||
)
|
||||
set _OLD_VIRTUAL_PROMPT=
|
||||
|
||||
if defined _OLD_VIRTUAL_PYTHONHOME (
|
||||
set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
|
||||
set _OLD_VIRTUAL_PYTHONHOME=
|
||||
)
|
||||
|
||||
if defined _OLD_VIRTUAL_PATH (
|
||||
set "PATH=%_OLD_VIRTUAL_PATH%"
|
||||
)
|
||||
|
||||
set _OLD_VIRTUAL_PATH=
|
||||
|
||||
set VIRTUAL_ENV=
|
||||
|
||||
:END
|
||||
BIN
homeenv/Scripts/django-admin.exe
Normal file
BIN
homeenv/Scripts/django-admin.exe
Normal file
Binary file not shown.
33
homeenv/Scripts/docxcompose-script.py
Normal file
33
homeenv/Scripts/docxcompose-script.py
Normal file
@@ -0,0 +1,33 @@
|
||||
#!C:\Users\ackng\YandexDisk\ACKWork\django\retraining\homeenv\Scripts\python.exe
|
||||
# EASY-INSTALL-ENTRY-SCRIPT: 'docxcompose==1.4.0','console_scripts','docxcompose'
|
||||
import re
|
||||
import sys
|
||||
|
||||
# for compatibility with easy_install; see #2198
|
||||
__requires__ = 'docxcompose==1.4.0'
|
||||
|
||||
try:
|
||||
from importlib.metadata import distribution
|
||||
except ImportError:
|
||||
try:
|
||||
from importlib_metadata import distribution
|
||||
except ImportError:
|
||||
from pkg_resources import load_entry_point
|
||||
|
||||
|
||||
def importlib_load_entry_point(spec, group, name):
|
||||
dist_name, _, _ = spec.partition('==')
|
||||
matches = (
|
||||
entry_point
|
||||
for entry_point in distribution(dist_name).entry_points
|
||||
if entry_point.group == group and entry_point.name == name
|
||||
)
|
||||
return next(matches).load()
|
||||
|
||||
|
||||
globals().setdefault('load_entry_point', importlib_load_entry_point)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||
sys.exit(load_entry_point('docxcompose==1.4.0', 'console_scripts', 'docxcompose')())
|
||||
BIN
homeenv/Scripts/docxcompose.exe
Normal file
BIN
homeenv/Scripts/docxcompose.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/ipython.exe
Normal file
BIN
homeenv/Scripts/ipython.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/ipython3.exe
Normal file
BIN
homeenv/Scripts/ipython3.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pip.exe
Normal file
BIN
homeenv/Scripts/pip.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pip3.10.exe
Normal file
BIN
homeenv/Scripts/pip3.10.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pip3.9.exe
Normal file
BIN
homeenv/Scripts/pip3.9.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pip3.exe
Normal file
BIN
homeenv/Scripts/pip3.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pybabel.exe
Normal file
BIN
homeenv/Scripts/pybabel.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pycodestyle.exe
Normal file
BIN
homeenv/Scripts/pycodestyle.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pygmentize.exe
Normal file
BIN
homeenv/Scripts/pygmentize.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/python.exe
Normal file
BIN
homeenv/Scripts/python.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/pythonw.exe
Normal file
BIN
homeenv/Scripts/pythonw.exe
Normal file
Binary file not shown.
BIN
homeenv/Scripts/sqlformat.exe
Normal file
BIN
homeenv/Scripts/sqlformat.exe
Normal file
Binary file not shown.
3
homeenv/pyvenv.cfg
Normal file
3
homeenv/pyvenv.cfg
Normal file
@@ -0,0 +1,3 @@
|
||||
home = C:\Users\ackng\AppData\Local\Programs\Python\Python39
|
||||
include-system-site-packages = false
|
||||
version = 3.9.7
|
||||
60
homeenv/share/man/man1/ipython.1
Normal file
60
homeenv/share/man/man1/ipython.1
Normal file
@@ -0,0 +1,60 @@
|
||||
.\" Hey, EMACS: -*- nroff -*-
|
||||
.\" First parameter, NAME, should be all caps
|
||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||
.\" other parameters are allowed: see man(7), man(1)
|
||||
.TH IPYTHON 1 "July 15, 2011"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
.\" .nh disable hyphenation
|
||||
.\" .hy enable hyphenation
|
||||
.\" .ad l left justify
|
||||
.\" .ad b justify to both left and right margins
|
||||
.\" .nf disable filling
|
||||
.\" .fi enable filling
|
||||
.\" .br insert line break
|
||||
.\" .sp <n> insert n+1 empty lines
|
||||
.\" for manpage-specific macros, see man(7) and groff_man(7)
|
||||
.\" .SH section heading
|
||||
.\" .SS secondary section heading
|
||||
.\"
|
||||
.\"
|
||||
.\" To preview this page as plain text: nroff -man ipython.1
|
||||
.\"
|
||||
.SH NAME
|
||||
ipython \- Tools for Interactive Computing in Python.
|
||||
.SH SYNOPSIS
|
||||
.B ipython
|
||||
.RI [ options ] " files" ...
|
||||
|
||||
.B ipython subcommand
|
||||
.RI [ options ] ...
|
||||
|
||||
.SH DESCRIPTION
|
||||
An interactive Python shell with automatic history (input and output), dynamic
|
||||
object introspection, easier configuration, command completion, access to the
|
||||
system shell, integration with numerical and scientific computing tools,
|
||||
web notebook, Qt console, and more.
|
||||
|
||||
For more information on how to use IPython, see 'ipython \-\-help',
|
||||
or 'ipython \-\-help\-all' for all available command\(hyline options.
|
||||
|
||||
.SH "ENVIRONMENT VARIABLES"
|
||||
.sp
|
||||
.PP
|
||||
\fIIPYTHONDIR\fR
|
||||
.RS 4
|
||||
This is the location where IPython stores all its configuration files. The default
|
||||
is $HOME/.ipython if IPYTHONDIR is not defined.
|
||||
|
||||
You can see the computed value of IPYTHONDIR with `ipython locate`.
|
||||
|
||||
.SH FILES
|
||||
|
||||
IPython uses various configuration files stored in profiles within IPYTHONDIR.
|
||||
To generate the default configuration files and start configuring IPython,
|
||||
do 'ipython profile create', and edit '*_config.py' files located in
|
||||
IPYTHONDIR/profile_default.
|
||||
|
||||
.SH AUTHORS
|
||||
IPython is written by the IPython Development Team <https://github.com/ipython/ipython>.
|
||||
50
main.py
Normal file
50
main.py
Normal file
@@ -0,0 +1,50 @@
|
||||
from colorama import Fore, Style, init
|
||||
# Команды для запуска отладочного сервера
|
||||
|
||||
# noutenv\scripts\activate
|
||||
# cd retraining
|
||||
# python manage.py runserver
|
||||
|
||||
# Создать миграции
|
||||
# python manage.py makemigrations
|
||||
|
||||
# Применить миграции
|
||||
# python manage.py migrate
|
||||
|
||||
# запуск командной строки
|
||||
# python manage.py shell
|
||||
#
|
||||
|
||||
# Выборка: используем расширения:
|
||||
# Чувствительный к регистру тест сдерживания.
|
||||
# Stutents.objects.filter(name__contains = 'а')
|
||||
# Нечувствительное к регистру .
|
||||
# Stutents.objects.filter(name__icontains = 'а')
|
||||
|
||||
from datetime import datetime
|
||||
init(autoreset=True)
|
||||
|
||||
a = [1, 2, 3, 4, 5, 6]
|
||||
b = [2, 3, 4, 5, 6, 7]
|
||||
|
||||
q = '0 10 20 30 40'
|
||||
# q_i = list(q.split(' '))
|
||||
q_i = list(map(int, q.split()))
|
||||
|
||||
print(q_i[1] + q_i[2])
|
||||
|
||||
print(fr'{datetime.now():%d-%Y}')
|
||||
|
||||
uniq = [1,2,3,4,5]
|
||||
fifa = ['a','b','c','d','e']
|
||||
uniq_and_fifa = dict(zip(uniq, fifa))
|
||||
|
||||
print(uniq_and_fifa)
|
||||
|
||||
print('hello world')
|
||||
|
||||
# c =
|
||||
print(a[:1])
|
||||
# C:\Users\ackng\YandexDisk\ACKWork\django\retraining\noutenv\Scripts\activate.bat
|
||||
|
||||
print(f'{datetime.now():%y%m%d}')
|
||||
BIN
requirements.txt
Normal file
BIN
requirements.txt
Normal file
Binary file not shown.
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 %}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user