Первоначальный залив проекта

This commit is contained in:
tertelius
2025-10-19 22:34:08 +03:00
commit 094d716330
313 changed files with 38846 additions and 0 deletions

View 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

View 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

View 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
View 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
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

View 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
View 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
View 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
View 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
View 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
View 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
View 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
}
]
}

View 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
View 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

View 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=
)

Binary file not shown.

View 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

Binary file not shown.

View 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')())

Binary file not shown.

BIN
homeenv/Scripts/ipython.exe Normal file

Binary file not shown.

Binary file not shown.

BIN
homeenv/Scripts/pip.exe Normal file

Binary file not shown.

BIN
homeenv/Scripts/pip3.10.exe Normal file

Binary file not shown.

BIN
homeenv/Scripts/pip3.9.exe Normal file

Binary file not shown.

BIN
homeenv/Scripts/pip3.exe Normal file

Binary file not shown.

BIN
homeenv/Scripts/pybabel.exe Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
homeenv/Scripts/python.exe Normal file

Binary file not shown.

BIN
homeenv/Scripts/pythonw.exe Normal file

Binary file not shown.

Binary file not shown.

3
homeenv/pyvenv.cfg Normal file
View File

@@ -0,0 +1,3 @@
home = C:\Users\ackng\AppData\Local\Programs\Python\Python39
include-system-site-packages = false
version = 3.9.7

View 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
View 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

Binary file not shown.

Binary file not shown.

BIN
retraining/db_old.sqlite3 Normal file

Binary file not shown.

View File

139
retraining/main/admin.py Normal file
View 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
View 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
View File

@@ -0,0 +1,5 @@
from django import forms
class Pump(forms.Form):
flow = forms.NumberInput()

484
retraining/main/gen_doc.py Normal file
View 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

View 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'],
},
),
]

View 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'],
},
),
]

View File

@@ -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='Директор ИДО')),
],
),
]

View 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': 'Структуры'},
),
]

View File

@@ -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,
),
]

View 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,
),
]

View File

@@ -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='Фото'),
),
]

View File

@@ -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='Паспорт'),
),
]

View 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='Дата заключения'),
),
]

View File

@@ -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='Тип приказа')),
],
),
]

View File

@@ -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='Студенты'),
),
]

View 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),
),
]

View File

@@ -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),
),
]

View File

@@ -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': 'Справки',
},
),
]

View File

@@ -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,
),
]

View File

@@ -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='падежи фамилии'),
),
]

View File

@@ -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,
),
]

View File

@@ -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='падежи фамилии'),
),
]

View File

@@ -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='падежи отчества'),
),
]

View 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='Скан документа'),
),
]

View 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='Скан документа'),
),
]

View File

@@ -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='Скан документа'),
),
]

View File

@@ -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 семестра'),
),
]

View 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='Скан документа'),
),
]

View File

@@ -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',
),
]

View File

@@ -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='Заказчик'),
),
]

View File

@@ -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',
),
]

View File

@@ -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',
),
]

View File

@@ -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='Должность'),
),
]

View File

@@ -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='Должность'),
),
]

View File

@@ -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='Ученая степень'),
),
]

View 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,
),
]

View File

@@ -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='Код подразделения'),
),
]

View File

@@ -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='Основание'),
),
]

View File

@@ -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',
),
]

View 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='Выписка'),
),
]

View File

@@ -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='Номер протокола'),
),
]

View File

@@ -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='Дата выпуска'),
),
]

View File

@@ -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,
),
]

View File

@@ -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='Вопросы'),
),
]

View 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='Оценка'),
),
]

View 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='Шаблон'),
),
]

View 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': 'Пропуски',
},
),
]

View 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='Шаблон'),
),
]

View 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='Номер'),
),
]

View File

@@ -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',
),
]

View File

@@ -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='День рождения'),
),
]

View File

@@ -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='Регистрационный номер'),
),
]

View File

@@ -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='Номер диплома'),
),
]

View File

492
retraining/main/models.py Normal file
View 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})

View 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 %}

View File

@@ -0,0 +1,12 @@
{% extends 'base.html' %}
{% load static %}
{% block title %}
{{ block.super }} {{title}}
{% endblock title %}
{% block content %}
{# ----- Вставь свой код сюда ----- #}
{% endblock content %}

View 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 %}

View 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 %}

View 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 %}

View 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