projects: модуль проектов с шагами по отделам и Task.

Шаблоны/ручное создание, access_projects, сид «Открытие аптеки». Плюс SILO/S3 для Django media.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-23 16:26:45 +03:00
parent 69ae14f65e
commit 030bbc98fd
28 changed files with 2129 additions and 3 deletions
+46
View File
@@ -105,6 +105,7 @@ INSTALLED_APPS = [
'apps.reports',
'apps.feed',
'apps.tasks',
'apps.projects',
'apps.hiring',
'apps.utilities',
'apps.power_assets',
@@ -189,6 +190,41 @@ STATICFILES_DIRS = [BASE_DIR / 'static']
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
# SILO / S3-compatible object storage for Django media (photos, uploads).
# Enabled only when endpoint + keys are set; otherwise local MEDIA_ROOT (dev).
# Documents stay on Nextcloud WebDAV — see docs/silo.md.
S3_ENDPOINT = env('S3_ENDPOINT', default='').rstrip('/')
S3_ACCESS_KEY = env('S3_ACCESS_KEY', default='')
S3_SECRET_KEY = env('S3_SECRET_KEY', default='')
S3_MEDIA_BUCKET = env('S3_MEDIA_BUCKET', default='acore-media')
S3_REGION = env('S3_REGION', default='us-east-1')
S3_QUERYSTRING_EXPIRE = env.int('S3_QUERYSTRING_EXPIRE', default=3600)
USE_S3_MEDIA = bool(S3_ENDPOINT and S3_ACCESS_KEY and S3_SECRET_KEY)
if USE_S3_MEDIA:
STORAGES = {
'default': {
'BACKEND': 'storages.backends.s3.S3Storage',
'OPTIONS': {
'access_key': S3_ACCESS_KEY,
'secret_key': S3_SECRET_KEY,
'bucket_name': S3_MEDIA_BUCKET,
'endpoint_url': S3_ENDPOINT,
'region_name': S3_REGION,
'addressing_style': 'path',
'signature_version': 's3v4',
'default_acl': None,
'querystring_auth': True,
'querystring_expire': S3_QUERYSTRING_EXPIRE,
'file_overwrite': False,
'object_parameters': {'CacheControl': 'max-age=86400'},
},
},
'staticfiles': {
'BACKEND': 'django.contrib.staticfiles.storage.StaticFilesStorage',
},
}
LOGIN_URL = '/accounts/login/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
@@ -550,6 +586,16 @@ UNFOLD = {
"icon": "task_alt",
"link": reverse_lazy("admin:tasks_task_changelist"),
},
{
"title": "Проекты",
"icon": "account_tree",
"link": reverse_lazy("admin:projects_project_changelist"),
},
{
"title": "Шаблоны проектов",
"icon": "schema",
"link": reverse_lazy("admin:projects_projecttemplate_changelist"),
},
],
},
{