Files
Hotel-Booking/Backend/seeders/banner_seeder.py
Iliyan Angelov 5a8ca3c475 updates
2025-12-06 03:27:35 +02:00

316 lines
13 KiB
Python

"""
Banner Seeder
Seeds the database with comprehensive banners for different positions
All images are from Unsplash (free stock photos)
"""
import sys
from pathlib import Path
from datetime import datetime, timezone, timedelta
# Add parent directory to path to import modules
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from sqlalchemy.orm import Session
from src.shared.config.database import SessionLocal
from src.content.models.banner import Banner
from src.shared.config.logging_config import get_logger
logger = get_logger(__name__)
def get_banner_data():
"""Generate comprehensive banner data with Unsplash images"""
now = datetime.now(timezone.utc)
future_date = now + timedelta(days=365) # Banners active for 1 year
banners = [
# Home Page Banners
{
'title': 'Welcome to Luxury',
'description': 'Experience unparalleled elegance and world-class service at our award-winning hotel. Discover sophisticated rooms, exceptional dining, and modern amenities.',
'image_url': 'https://images.unsplash.com/photo-1566073771259-6a8506099945?w=1920&h=1080&fit=crop',
'link_url': '/rooms',
'position': 'home',
'display_order': 1,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Special Summer Offer',
'description': 'Book now and save up to 30% on your summer getaway! Perfect for families, couples, and solo travelers. Limited time offer.',
'image_url': 'https://images.unsplash.com/photo-1571896349842-33c89424de2d?w=1920&h=1080&fit=crop',
'link_url': '/book',
'position': 'home',
'display_order': 2,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Fine Dining Experience',
'description': 'Savor exquisite cuisine at our Michelin-starred restaurants. Enjoy international flavors, local specialties, and expertly curated wine pairings.',
'image_url': 'https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=1920&h=1080&fit=crop',
'link_url': '/services',
'position': 'home',
'display_order': 3,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Luxury Spa & Wellness',
'description': 'Rejuvenate at our world-class spa with personalized treatments, therapeutic massages, steam rooms, saunas, and yoga classes.',
'image_url': 'https://images.unsplash.com/photo-1544161515-4ab6ce6db874?w=1920&h=1080&fit=crop',
'link_url': '/services',
'position': 'home',
'display_order': 4,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Business Events & Conferences',
'description': 'Host your corporate event in our state-of-the-art facilities. Versatile spaces for intimate meetings to large conferences with cutting-edge technology.',
'image_url': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=1920&h=1080&fit=crop',
'link_url': '/contact',
'position': 'home',
'display_order': 5,
'is_active': True,
'start_date': now,
'end_date': future_date
},
# Rooms Page Banners
{
'title': 'Luxurious Suites',
'description': 'Elegantly designed suites with spacious layouts, separate living areas, marble bathrooms, and private balconies with panoramic views. Smart room controls and premium amenities included.',
'image_url': 'https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=1920&h=1080&fit=crop',
'link_url': '/rooms',
'position': 'rooms',
'display_order': 1,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Presidential Suite',
'description': 'Ultimate luxury in our exclusive 2,000+ sq ft suite. Features grand living room, formal dining, fully equipped kitchen, private terrace, and personal butler service. Perfect for VIP guests.',
'image_url': 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?w=1920&h=1080&fit=crop',
'link_url': '/rooms',
'position': 'rooms',
'display_order': 2,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Ocean View Rooms',
'description': 'Breathtaking ocean views from private balconies. Spacious rooms with floor-to-ceiling windows, coastal decor, and premium furnishings. Perfect for romantic getaways.',
'image_url': 'https://images.unsplash.com/photo-1631049307264-da0ec9d70304?w=1920&h=1080&fit=crop',
'link_url': '/rooms',
'position': 'rooms',
'display_order': 3,
'is_active': True,
'start_date': now,
'end_date': future_date
},
# About Page Banners
{
'title': 'Our Story',
'description': 'Discover our rich heritage spanning three decades. Founded to redefine luxury hospitality, we\'ve grown into an internationally recognized destination with timeless elegance.',
'image_url': 'https://images.unsplash.com/photo-1520250497591-112f2f40a3f4?w=1920&h=1080&fit=crop',
'link_url': '/about',
'position': 'about',
'display_order': 1,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Award-Winning Service',
'description': 'Recognized globally for exceptional hospitality with prestigious awards including five-star ratings and "Best Luxury Hotel" honors. Our trained team delivers service beyond expectations.',
'image_url': 'https://images.unsplash.com/photo-1579621970563-ebec7560ff3e?w=1920&h=1080&fit=crop',
'link_url': '/about',
'position': 'about',
'display_order': 2,
'is_active': True,
'start_date': now,
'end_date': future_date
},
# Contact Page Banner
{
'title': 'Get in Touch',
'description': 'Our friendly team is available 24/7 for reservations, inquiries, and special requests. Reach us by phone, email, or visit our front desk. Concierge assistance available.',
'image_url': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1920&h=1080&fit=crop',
'link_url': '/contact',
'position': 'contact',
'display_order': 1,
'is_active': True,
'start_date': now,
'end_date': future_date
},
# Services Page Banners
{
'title': 'Premium Services',
'description': 'Enjoy personalized butler service, private airport transfers, VIP lounge access, and priority reservations. Business center, city tours, and special occasion planning available.',
'image_url': 'https://images.unsplash.com/photo-1441986300917-64674bd600d8?w=1920&h=1080&fit=crop',
'link_url': '/services',
'position': 'services',
'display_order': 1,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': '24/7 Concierge Service',
'description': 'Our dedicated concierge team is available around the clock. We assist with restaurant reservations, event tickets, transportation, exclusive experiences, and special occasions.',
'image_url': 'https://images.unsplash.com/photo-1556761175-5973dc0f32e7?w=1920&h=1080&fit=crop',
'link_url': '/services',
'position': 'services',
'display_order': 2,
'is_active': True,
'start_date': now,
'end_date': future_date
},
# Promotional Banners (can be used across pages)
{
'title': 'Early Bird Special',
'description': 'Book 30 days in advance and save 20%! Perfect for travelers who plan ahead. Applies to all room types. Terms and conditions apply.',
'image_url': 'https://images.unsplash.com/photo-1564501049412-61c2a3083791?w=1920&h=1080&fit=crop',
'link_url': '/book',
'position': 'home',
'display_order': 6,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Weekend Getaway Package',
'description': 'All-inclusive weekend package with luxurious accommodation, daily breakfast, and full spa access. Late checkout included. Available Friday through Sunday.',
'image_url': 'https://images.unsplash.com/photo-1590490360182-c33d57733427?w=1920&h=1080&fit=crop',
'link_url': '/book',
'position': 'home',
'display_order': 7,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Honeymoon Package',
'description': 'Romantic honeymoon package includes luxurious suite, breakfast in bed, candlelit dinner with champagne, couples spa treatments, and special amenities.',
'image_url': 'https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=1920&h=1080&fit=crop',
'link_url': '/book',
'position': 'home',
'display_order': 8,
'is_active': True,
'start_date': now,
'end_date': future_date
},
# Footer/General Banners
{
'title': 'Join Our Loyalty Program',
'description': 'Earn points with every stay. Redeem for free nights, upgrades, dining credits, and spa treatments. Multiple tier levels from Silver to Platinum. Join free today!',
'image_url': 'https://images.unsplash.com/photo-1519389950473-47ba0277781c?w=1920&h=1080&fit=crop',
'link_url': '/loyalty',
'position': 'home',
'display_order': 9,
'is_active': True,
'start_date': now,
'end_date': future_date
},
{
'title': 'Gift Cards Available',
'description': 'Give the gift of luxury with our hotel gift cards. Perfect for any occasion. Usable for accommodations, dining, spa, and all services. Never expire. Purchase online or at front desk.',
'image_url': 'https://images.unsplash.com/photo-1606761568499-6d2451b23c66?w=1920&h=1080&fit=crop',
'link_url': '/gift-cards',
'position': 'home',
'display_order': 10,
'is_active': True,
'start_date': now,
'end_date': future_date
}
]
return banners
def seed_banners(db: Session, clear_existing: bool = False):
"""Seed banners into the database"""
try:
if clear_existing:
logger.info('Clearing existing banners...')
db.query(Banner).delete()
db.commit()
banners_data = get_banner_data()
created_count = 0
updated_count = 0
for banner_data in banners_data:
# Check if banner with same title and position already exists
existing = db.query(Banner).filter(
Banner.title == banner_data['title'],
Banner.position == banner_data['position']
).first()
if existing:
logger.info(f'Updating existing banner: {banner_data["title"]} ({banner_data["position"]})')
# Update existing banner
for key, value in banner_data.items():
setattr(existing, key, value)
existing.updated_at = datetime.now(timezone.utc)
updated_count += 1
else:
logger.info(f'Creating new banner: {banner_data["title"]} ({banner_data["position"]})')
# Create new banner
banner = Banner(**banner_data)
db.add(banner)
created_count += 1
db.commit()
logger.info(f'Banner seeding completed! Created: {created_count}, Updated: {updated_count}')
return created_count, updated_count
except Exception as e:
logger.error(f'Error seeding banners: {str(e)}', exc_info=True)
db.rollback()
raise
def main():
"""Main function to run the seeder"""
import argparse
parser = argparse.ArgumentParser(description='Seed banners into the database')
parser.add_argument(
'--clear',
action='store_true',
help='Clear existing banners before seeding'
)
args = parser.parse_args()
logger.info('Starting banner seeder...')
db = SessionLocal()
try:
created, updated = seed_banners(db, clear_existing=args.clear)
logger.info(f'Banner seeder completed successfully! Created: {created}, Updated: {updated}')
except Exception as e:
logger.error(f'Failed to seed banners: {str(e)}', exc_info=True)
sys.exit(1)
finally:
db.close()
if __name__ == '__main__':
main()