|
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 |
2 | 6 |
|
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' |
12 | 11 |
|
13 | 12 |
|
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 |
20 | 22 |
|
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 |
30 | 46 |
|
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( |
34 | 54 | 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 | + } |
40 | 62 | ) |
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 |
0 commit comments