Фикс деплоя на NAS: статика, медиа, автоматическое создание системного покупателя
This commit is contained in:
@@ -17,10 +17,17 @@ def ensure_public_tenant():
|
|||||||
domain_name = os.environ.get('DOMAIN_NAME', 'localhost')
|
domain_name = os.environ.get('DOMAIN_NAME', 'localhost')
|
||||||
print(f"Checking public tenant for domain: {domain_name}")
|
print(f"Checking public tenant for domain: {domain_name}")
|
||||||
|
|
||||||
|
email = os.environ.get('TENANT_ADMIN_EMAIL', 'admin@example.com')
|
||||||
|
name = os.environ.get('TENANT_ADMIN_NAME', 'System Administrator')
|
||||||
|
|
||||||
# 1. Ensure Client exists
|
# 1. Ensure Client exists
|
||||||
client, created = Client.objects.get_or_create(
|
client, created = Client.objects.get_or_create(
|
||||||
schema_name='public',
|
schema_name='public',
|
||||||
defaults={'name': 'Main Tenant'}
|
defaults={
|
||||||
|
'name': 'System Tenant',
|
||||||
|
'owner_email': email,
|
||||||
|
'owner_name': name
|
||||||
|
}
|
||||||
)
|
)
|
||||||
if created:
|
if created:
|
||||||
print("Created public tenant client.")
|
print("Created public tenant client.")
|
||||||
@@ -41,5 +48,13 @@ def ensure_public_tenant():
|
|||||||
if domain.tenant != client:
|
if domain.tenant != client:
|
||||||
print(f"WARNING: Domain {domain_name} is assigned to another tenant!")
|
print(f"WARNING: Domain {domain_name} is assigned to another tenant!")
|
||||||
|
|
||||||
|
# 3. Init system data (System Customer, etc.)
|
||||||
|
print("Initializing system data for public tenant...")
|
||||||
|
from django.core.management import call_command
|
||||||
|
try:
|
||||||
|
call_command('init_tenant_data', schema='public')
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error initializing system data: {e}")
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
ensure_public_tenant()
|
ensure_public_tenant()
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ from django.contrib import admin
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
|
from django.urls import re_path
|
||||||
|
from django.views.static import serve
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@@ -25,7 +27,15 @@ urlpatterns = [
|
|||||||
path('pos/', include('pos.urls')), # POS Terminal
|
path('pos/', include('pos.urls')), # POS Terminal
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Serve media files during development
|
||||||
# Serve media files during development
|
# Serve media files during development
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
||||||
|
else:
|
||||||
|
# Force serve media files in production (for NAS setup)
|
||||||
|
urlpatterns += [
|
||||||
|
re_path(r'^media/(?P<path>.*)$', serve, {
|
||||||
|
'document_root': settings.MEDIA_ROOT,
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ from django.contrib import admin
|
|||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
|
from django.urls import re_path
|
||||||
|
from django.views.static import serve
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
@@ -21,3 +23,10 @@ urlpatterns = [
|
|||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
|
||||||
|
else:
|
||||||
|
# Force serve media files in production (for NAS setup)
|
||||||
|
urlpatterns += [
|
||||||
|
re_path(r'^media/(?P<path>.*)$', serve, {
|
||||||
|
'document_root': settings.MEDIA_ROOT,
|
||||||
|
}),
|
||||||
|
]
|
||||||
|
|||||||
@@ -115,6 +115,12 @@ class Command(BaseCommand):
|
|||||||
f'истекает: {subscription.expires_at.strftime("%Y-%m-%d")}'
|
f'истекает: {subscription.expires_at.strftime("%Y-%m-%d")}'
|
||||||
))
|
))
|
||||||
|
|
||||||
|
# Инициализация системных данных
|
||||||
|
self.stdout.write('Инициализация системных данных...')
|
||||||
|
from django.core.management import call_command
|
||||||
|
call_command('init_tenant_data', schema=client.schema_name)
|
||||||
|
self.stdout.write(self.style.SUCCESS('✓ Системные данные созданы'))
|
||||||
|
|
||||||
# Обновляем заявку
|
# Обновляем заявку
|
||||||
registration.status = TenantRegistration.STATUS_APPROVED
|
registration.status = TenantRegistration.STATUS_APPROVED
|
||||||
registration.processed_at = timezone.now()
|
registration.processed_at = timezone.now()
|
||||||
|
|||||||
@@ -65,6 +65,12 @@ class Command(BaseCommand):
|
|||||||
)
|
)
|
||||||
self.stdout.write(self.style.SUCCESS(f'✓ Домен создан: {domain}'))
|
self.stdout.write(self.style.SUCCESS(f'✓ Домен создан: {domain}'))
|
||||||
|
|
||||||
|
# Инициализация системных данных
|
||||||
|
self.stdout.write('Инициализация системных данных...')
|
||||||
|
from django.core.management import call_command
|
||||||
|
call_command('init_tenant_data', schema=schema_name)
|
||||||
|
self.stdout.write(self.style.SUCCESS('✓ Системные данные созданы'))
|
||||||
|
|
||||||
self.stdout.write('\n' + '='*60)
|
self.stdout.write('\n' + '='*60)
|
||||||
self.stdout.write(self.style.SUCCESS('✓ Магазин успешно создан!'))
|
self.stdout.write(self.style.SUCCESS('✓ Магазин успешно создан!'))
|
||||||
self.stdout.write('='*60 + '\n')
|
self.stdout.write('='*60 + '\n')
|
||||||
|
|||||||
@@ -33,3 +33,4 @@ Unidecode==1.4.0
|
|||||||
vine==5.1.0
|
vine==5.1.0
|
||||||
wcwidth==0.2.14
|
wcwidth==0.2.14
|
||||||
gunicorn==21.2.0
|
gunicorn==21.2.0
|
||||||
|
whitenoise==6.6.0
|
||||||
|
|||||||
Reference in New Issue
Block a user