Первоначальный залив проекта
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