Skip to content

Commit a396fc3

Browse files
committed
chore: site init added
1 parent c113a60 commit a396fc3

File tree

4 files changed

+131
-56
lines changed

4 files changed

+131
-56
lines changed

django_backend/django_backend/settings.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,5 +131,3 @@
131131
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
132132

133133
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
134-
135-
SITE_ID = 1

django_backend/home/apps.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,31 @@
11
import sys
2-
32
from django.apps import AppConfig
3+
from django.core.signals import request_started
44

55

66
class HomeConfig(AppConfig):
77
default_auto_field = 'django.db.models.BigAutoField'
88
name = 'home'
99

1010
def ready(self):
11+
# Skip database initialization for management commands
12+
if self.should_skip_initialization():
13+
return
14+
15+
# Connect to the request_started signal instead of running directly
16+
request_started.connect(self.initialize_site_data, dispatch_uid="initialize_site_data")
17+
18+
def should_skip_initialization(self):
19+
management_commands = {
20+
'makemigrations', 'migrate', 'collectstatic',
21+
'createsuperuser', 'dbshell', 'test'
22+
}
23+
return any(cmd in sys.argv for cmd in management_commands)
24+
25+
def initialize_site_data(self, sender, **kwargs):
26+
# Disconnect the signal after first run to prevent multiple executions
27+
request_started.disconnect(self.initialize_site_data, dispatch_uid="initialize_site_data")
28+
29+
# Import and run the initialization
1130
from home.startup import site_data_db_startup
12-
if ('makemigrations' not in sys.argv and 'migrate' not in sys.argv
13-
and 'collectstatic' not in sys.argv
14-
and 'createsuperuser' not in sys.argv
15-
and 'dbshell' not in sys.argv):
16-
site_data_db_startup()
31+
site_data_db_startup()

django_backend/home/startup.py

Lines changed: 109 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,116 @@
1-
import logging
1+
from typing import Dict, Any
2+
from django.db import transaction
3+
from django.contrib.sites.models import Site
4+
from dataclasses import dataclass
5+
from utils.c_logging import logger
26

3-
SITE_DEFAULT_DATA = {
4-
'title': 'Djapy - Django and Python Supremacy',
5-
'subtitle': 'We love django and python, so should you',
6-
'description': 'freelancing, coding, indie dev, app dev',
7-
'domain': 'djapy.io',
8-
'name': 'Djapy',
9-
'keywords': 'django, python, djapy, coding, indie dev, app dev',
10-
'ads_on': False,
11-
}
7+
try:
8+
from config.env import DOMAIN
9+
except ImportError:
10+
DOMAIN = 'localhost:5173'
1211

1312

14-
def site_data_db_startup():
15-
"""
16-
This function is called to store default site data in the database.
17-
"""
18-
from django.contrib.sites.models import Site
19-
from home.models import SiteData
13+
@dataclass
14+
class SiteDefaults:
15+
title: str = 'Djapy - Django and Python Supremacy'
16+
subtitle: str = 'We love django and python, so should you'
17+
description: str = 'freelancing, coding, indie dev, app dev'
18+
domain: str = DOMAIN
19+
name: str = 'Djapy'
20+
keywords: str = 'django, python, djapy, coding, indie dev, app dev'
21+
ads_on: bool = False
2022

21-
site = Site.objects.first()
22-
if not site:
23-
print("Creating site")
24-
Site.objects.create(
25-
domain=SITE_DEFAULT_DATA['domain'],
26-
name=SITE_DEFAULT_DATA['name']
27-
)
28-
else:
29-
print(f"Site already exists: {site.domain}")
23+
def to_dict(self) -> Dict[str, Any]:
24+
return {
25+
field.name: getattr(self, field.name)
26+
for field in self.__dataclass_fields__.values()
27+
}
28+
29+
30+
def get_or_create_site(defaults: SiteDefaults) -> Site:
31+
"""Create or retrieve the default site."""
32+
try:
33+
site = Site.objects.first()
34+
if not site:
35+
logger.info("Creating new site")
36+
site = Site.objects.create(
37+
domain=defaults.domain,
38+
name=defaults.name
39+
)
40+
else:
41+
logger.info(f"Using existing site: {site.domain}")
42+
return site
43+
except Exception as e:
44+
logger.error(f"Error creating/retrieving site: {str(e)}")
45+
raise
3046

31-
if not SiteData.objects.filter(site=site).exists():
32-
print("Creating site data")
33-
SiteData.objects.create(
47+
48+
def create_or_update_site_data(site: Site, defaults: SiteDefaults):
49+
"""Create or update site data."""
50+
from home.models import SiteData
51+
52+
try:
53+
site_data, created = SiteData.objects.get_or_create(
3454
site=site,
35-
title=SITE_DEFAULT_DATA['title'],
36-
subtitle=SITE_DEFAULT_DATA['subtitle'],
37-
description=SITE_DEFAULT_DATA['description'],
38-
keywords=SITE_DEFAULT_DATA['keywords'],
39-
ads_on=SITE_DEFAULT_DATA['ads_on']
55+
defaults={
56+
'title': defaults.title,
57+
'subtitle': defaults.subtitle,
58+
'description': defaults.description,
59+
'keywords': defaults.keywords,
60+
'ads_on': defaults.ads_on
61+
}
4062
)
41-
else:
42-
print("Site data already exists")
43-
44-
site_data = SiteData.objects.get(site=site)
45-
print(
46-
f"Site data:\nSite name: {site_data.site.name}"
47-
f"\nSite title: {site_data.title}"
48-
f"\nSite subtitle: {site_data.subtitle}"
49-
f"\nSite description: {site_data.description}"
50-
f"\nSite keywords: {site_data.keywords}"
51-
f"\nSite ads on: {site_data.ads_on}"
52-
f"\nSite domain: {site_data.site.domain}"
53-
f"\nSite id: {site_data.site.id}"
54-
)
63+
64+
if created:
65+
logger.info("Created new site data")
66+
else:
67+
logger.info("Using existing site data")
68+
69+
return site_data
70+
except Exception as e:
71+
logger.error(f"Error creating/updating site data: {str(e)}")
72+
raise
73+
74+
75+
def log_site_data(site_data) -> None:
76+
"""Log site data in a structured format."""
77+
try:
78+
info = {
79+
'Site name': site_data.site.name,
80+
'Site title': site_data.title,
81+
'Site subtitle': site_data.subtitle,
82+
'Site description': site_data.description,
83+
'Site keywords': site_data.keywords,
84+
'Site ads on': site_data.ads_on,
85+
'Site domain': site_data.site.domain,
86+
'Site id': site_data.site.id
87+
}
88+
89+
logger.info("Site data configuration:")
90+
for key, value in info.items():
91+
logger.info(f"{key}: {value}")
92+
except Exception as e:
93+
logger.error(f"Error logging site data: {str(e)}")
94+
95+
96+
@transaction.atomic
97+
def site_data_db_startup() -> None:
98+
"""
99+
Initialize or update site data in the database.
100+
Uses atomic transaction to ensure data consistency.
101+
"""
102+
try:
103+
defaults = SiteDefaults()
104+
105+
# Get or create site
106+
site = get_or_create_site(defaults)
107+
108+
# Create or update site data
109+
site_data = create_or_update_site_data(site, defaults)
110+
111+
# Log the configuration
112+
log_site_data(site_data)
113+
114+
except Exception as e:
115+
logger.error(f"Failed to initialize site data: {str(e)}")
116+
raise

django_backend/home/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
@ensure_csrf_cookie
99
@djapify
1010
def get_init_data(request) -> {200: InitDataSchema}:
11-
site = Site.objects.get_current(request)
11+
site = Site.objects.first()
1212
return {
1313
"site_data": site.sitedata,
1414
"current_user": request.user if request.user.is_authenticated else None

0 commit comments

Comments
 (0)