update
This commit is contained in:
437
backEnd/services/management/commands/import_enterprise_data.py
Normal file
437
backEnd/services/management/commands/import_enterprise_data.py
Normal file
@@ -0,0 +1,437 @@
|
||||
"""
|
||||
Management command to import enterprise sample data for services
|
||||
with images downloaded from Unsplash.
|
||||
"""
|
||||
import urllib.request
|
||||
import urllib.parse
|
||||
import json
|
||||
from io import BytesIO
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.core.files.base import ContentFile
|
||||
from django.db import transaction
|
||||
from services.models import Service, ServiceCategory, ServiceFeature, ServiceExpertise
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Import enterprise sample data for services with images from Unsplash'
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument(
|
||||
'--unsplash-key',
|
||||
type=str,
|
||||
help='Unsplash API access key (optional, uses Unsplash Source API if not provided)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--width',
|
||||
type=int,
|
||||
default=1200,
|
||||
help='Image width in pixels (default: 1200)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--height',
|
||||
type=int,
|
||||
default=800,
|
||||
help='Image height in pixels (default: 800)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--update-existing',
|
||||
action='store_true',
|
||||
help='Update existing services instead of skipping them',
|
||||
)
|
||||
|
||||
def download_image_from_unsplash(self, keyword, width=1200, height=800, api_key=None):
|
||||
"""
|
||||
Download an image from Unsplash based on keyword.
|
||||
|
||||
Args:
|
||||
keyword: Search keyword for the image
|
||||
width: Image width in pixels
|
||||
height: Image height in pixels
|
||||
api_key: Optional Unsplash API access key
|
||||
|
||||
Returns:
|
||||
BytesIO object containing the image data, or None if download fails
|
||||
"""
|
||||
try:
|
||||
if api_key:
|
||||
# Use Unsplash API (requires API key)
|
||||
url = "https://api.unsplash.com/photos/random"
|
||||
params = {
|
||||
'query': keyword,
|
||||
'orientation': 'landscape',
|
||||
'w': width,
|
||||
'h': height,
|
||||
'client_id': api_key
|
||||
}
|
||||
query_string = urllib.parse.urlencode(params)
|
||||
full_url = f"{url}?{query_string}"
|
||||
|
||||
req = urllib.request.Request(full_url)
|
||||
with urllib.request.urlopen(req, timeout=30) as response:
|
||||
data = json.loads(response.read().decode())
|
||||
image_url = data['urls']['regular']
|
||||
else:
|
||||
# Use Unsplash's direct image service (no key required)
|
||||
# Using a curated collection of enterprise/business images
|
||||
# For better results with specific keywords, use --unsplash-key option
|
||||
# Using placeholder service that provides high-quality images
|
||||
image_url = f"https://images.unsplash.com/photo-1552664730-d307ca884978?w={width}&h={height}&fit=crop"
|
||||
|
||||
# Download the actual image
|
||||
req = urllib.request.Request(image_url)
|
||||
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
|
||||
with urllib.request.urlopen(req, timeout=30) as img_response:
|
||||
image_data = BytesIO(img_response.read())
|
||||
image_data.seek(0)
|
||||
|
||||
return image_data
|
||||
except Exception as e:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(f'Failed to download image for "{keyword}": {str(e)}')
|
||||
)
|
||||
return None
|
||||
|
||||
def handle(self, *args, **options):
|
||||
unsplash_key = options.get('unsplash_key')
|
||||
width = options.get('width', 1200)
|
||||
height = options.get('height', 800)
|
||||
update_existing = options.get('update_existing', False)
|
||||
|
||||
self.stdout.write(self.style.SUCCESS('Starting enterprise data import...'))
|
||||
|
||||
with transaction.atomic():
|
||||
# Create or get categories
|
||||
categories = {}
|
||||
category_data = [
|
||||
{
|
||||
'slug': 'web-development',
|
||||
'name': 'Web Development',
|
||||
'description': 'Custom web applications and enterprise websites',
|
||||
'display_order': 1,
|
||||
},
|
||||
{
|
||||
'slug': 'mobile-development',
|
||||
'name': 'Mobile Development',
|
||||
'description': 'Native and cross-platform mobile applications',
|
||||
'display_order': 2,
|
||||
},
|
||||
{
|
||||
'slug': 'api-development',
|
||||
'name': 'API Development',
|
||||
'description': 'RESTful APIs and microservices architecture',
|
||||
'display_order': 3,
|
||||
},
|
||||
{
|
||||
'slug': 'cloud-services',
|
||||
'name': 'Cloud Services',
|
||||
'description': 'Cloud migration and infrastructure services',
|
||||
'display_order': 4,
|
||||
},
|
||||
{
|
||||
'slug': 'enterprise-solutions',
|
||||
'name': 'Enterprise Solutions',
|
||||
'description': 'Enterprise-grade software solutions',
|
||||
'display_order': 5,
|
||||
},
|
||||
]
|
||||
|
||||
for cat_data in category_data:
|
||||
category, created = ServiceCategory.objects.get_or_create(
|
||||
slug=cat_data['slug'],
|
||||
defaults=cat_data
|
||||
)
|
||||
categories[cat_data['slug']] = category
|
||||
if created:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f'Created category: {category.name}')
|
||||
)
|
||||
|
||||
# Enterprise services data
|
||||
services_data = [
|
||||
{
|
||||
'title': 'Enterprise Web Application Development',
|
||||
'description': 'Build powerful, scalable enterprise web applications tailored to your business needs. Our expert developers use modern frameworks and technologies to create solutions that drive growth, efficiency, and competitive advantage. We deliver robust applications that handle high traffic, complex business logic, and integrate seamlessly with your existing systems.',
|
||||
'short_description': 'Scalable enterprise web applications built with cutting-edge technologies for optimal performance and reliability.',
|
||||
'slug': 'enterprise-web-application-development',
|
||||
'icon': 'code',
|
||||
'price': '25000.00',
|
||||
'category_slug': 'web-development',
|
||||
'duration': '12-24 weeks',
|
||||
'deliverables': 'Enterprise Web Application, Admin Dashboard, User Management System, Role-Based Access Control, Database Design & Optimization, API Integration, Third-party Service Integration, Automated Testing Suite, CI/CD Pipeline, Documentation, Training & Support',
|
||||
'technologies': 'React, Next.js, TypeScript, Node.js, PostgreSQL, Redis, AWS, Docker, Kubernetes, GraphQL, Microservices Architecture',
|
||||
'process_steps': 'Requirements Analysis & Planning, System Architecture Design, Development Sprint Planning, Agile Development, Code Review & Quality Assurance, Testing & QA, Deployment & DevOps, Training & Knowledge Transfer, Ongoing Support',
|
||||
'features_description': 'Our enterprise web applications come with advanced features including real-time collaboration, advanced analytics, comprehensive reporting, automated workflows, and seamless third-party integrations.',
|
||||
'deliverables_description': 'You will receive a fully functional enterprise web application with comprehensive documentation, deployment scripts, testing suite, and ongoing support for maintenance and updates.',
|
||||
'process_description': 'We follow an agile development methodology with regular sprints, continuous integration, and transparent communication throughout the project lifecycle.',
|
||||
'why_choose_description': 'Choose us for our proven track record in enterprise development, deep technical expertise, commitment to quality, and dedication to delivering solutions that exceed expectations.',
|
||||
'expertise_description': 'Our team brings years of experience in enterprise software development, with expertise in modern frameworks, cloud technologies, and best practices for scalable applications.',
|
||||
'image_keyword': 'enterprise web development business technology',
|
||||
'featured': True,
|
||||
'display_order': 1,
|
||||
'is_active': True,
|
||||
},
|
||||
{
|
||||
'title': 'Enterprise Mobile App Development',
|
||||
'description': 'Create stunning, high-performance mobile applications for iOS and Android platforms. We deliver native and cross-platform solutions that provide exceptional user experiences, drive engagement, and scale with your business. Our mobile apps are built with enterprise-grade security, offline capabilities, and seamless backend integration.',
|
||||
'short_description': 'Enterprise mobile applications for iOS and Android with native performance and advanced features.',
|
||||
'slug': 'enterprise-mobile-app-development',
|
||||
'icon': 'mobile',
|
||||
'price': '35000.00',
|
||||
'category_slug': 'mobile-development',
|
||||
'duration': '16-32 weeks',
|
||||
'deliverables': 'Native Mobile Applications (iOS & Android), Cross-platform App (React Native/Flutter), App Store Deployment, Enterprise App Distribution, Push Notification System, Offline Support & Sync, Analytics Integration, Crash Reporting, Performance Monitoring, Security Implementation, Testing Suite, Documentation',
|
||||
'technologies': 'React Native, Flutter, Swift, Kotlin, Firebase, AWS Amplify, App Store Connect, Google Play Console, Fastlane, CodePush',
|
||||
'process_steps': 'Discovery & Planning, UI/UX Design, Architecture Design, Development Sprints, Testing & QA, Beta Testing, App Store Submission, Launch & Marketing Support, Post-Launch Support',
|
||||
'features_description': 'Enterprise mobile apps with features like biometric authentication, offline-first architecture, real-time synchronization, advanced analytics, push notifications, and enterprise security compliance.',
|
||||
'deliverables_description': 'Complete mobile application solution including source code, deployment to app stores, enterprise distribution setup, analytics dashboard, and comprehensive documentation.',
|
||||
'process_description': 'We use agile methodologies with continuous testing, regular stakeholder reviews, and iterative improvements based on user feedback.',
|
||||
'why_choose_description': 'Our mobile development expertise, combined with enterprise-grade practices, ensures your app performs flawlessly, scales efficiently, and provides exceptional user experiences.',
|
||||
'expertise_description': 'Specialized in both native and cross-platform development, with deep knowledge of mobile architecture patterns, performance optimization, and platform-specific best practices.',
|
||||
'image_keyword': 'enterprise mobile app development smartphone business',
|
||||
'featured': True,
|
||||
'display_order': 2,
|
||||
'is_active': True,
|
||||
},
|
||||
{
|
||||
'title': 'Enterprise API Development & Integration',
|
||||
'description': 'Build robust, scalable APIs that power your applications and enable seamless integration with third-party services. Our APIs are designed for performance, security, maintainability, and enterprise-scale usage. We create comprehensive API ecosystems that support microservices architecture and enable digital transformation.',
|
||||
'short_description': 'Enterprise-grade RESTful APIs and microservices for seamless system integration and digital transformation.',
|
||||
'slug': 'enterprise-api-development-integration',
|
||||
'icon': 'api',
|
||||
'price': '20000.00',
|
||||
'category_slug': 'api-development',
|
||||
'duration': '8-16 weeks',
|
||||
'deliverables': 'RESTful API Suite, GraphQL API (optional), API Gateway Configuration, Authentication & Authorization System, Rate Limiting & Throttling, API Documentation (OpenAPI/Swagger), SDK Development, Integration Testing Suite, Monitoring & Analytics, API Versioning Strategy, Developer Portal, Support & Maintenance',
|
||||
'technologies': 'Node.js, Python, FastAPI, Django REST Framework, PostgreSQL, MongoDB, Redis, AWS API Gateway, Kong, Apigee, GraphQL, WebSockets, OAuth 2.0, JWT',
|
||||
'process_steps': 'API Planning & Design, Architecture Design, Development & Implementation, Documentation, Testing & QA, Security Audit, Deployment, Integration Support, Monitoring Setup, Ongoing Maintenance',
|
||||
'features_description': 'Enterprise APIs with advanced features including OAuth 2.0 authentication, rate limiting, request/response caching, webhook support, comprehensive logging, and real-time monitoring.',
|
||||
'deliverables_description': 'Complete API solution with comprehensive documentation, SDKs for multiple languages, developer portal, testing tools, and integration support.',
|
||||
'process_description': 'We follow API-first design principles with thorough documentation, versioning strategies, and comprehensive testing throughout the development lifecycle.',
|
||||
'why_choose_description': 'Our API development expertise ensures your APIs are secure, performant, well-documented, and designed for long-term maintainability and scalability.',
|
||||
'expertise_description': 'Deep expertise in API design patterns, microservices architecture, security best practices, and integration with enterprise systems.',
|
||||
'image_keyword': 'api development integration enterprise technology',
|
||||
'featured': True,
|
||||
'display_order': 3,
|
||||
'is_active': True,
|
||||
},
|
||||
{
|
||||
'title': 'Enterprise Cloud Migration Services',
|
||||
'description': 'Migrate your existing infrastructure to the cloud with minimal downtime and maximum efficiency. We help you leverage cloud technologies for improved scalability, security, cost efficiency, and business agility. Our migration services ensure a smooth transition with comprehensive planning, execution, and optimization.',
|
||||
'short_description': 'Seamless enterprise cloud migration with enhanced security, scalability, and cost optimization.',
|
||||
'slug': 'enterprise-cloud-migration-services',
|
||||
'icon': 'cloud',
|
||||
'price': '50000.00',
|
||||
'category_slug': 'cloud-services',
|
||||
'duration': '16-32 weeks',
|
||||
'deliverables': 'Cloud Architecture Design, Infrastructure as Code (IaC), Data Migration Plan & Execution, Security Configuration & Compliance, Monitoring & Alerting Setup, Disaster Recovery Plan, Cost Optimization Strategy, Performance Tuning, Training & Documentation, Ongoing Support & Optimization',
|
||||
'technologies': 'AWS, Azure, Google Cloud Platform, Docker, Kubernetes, Terraform, Ansible, CloudFormation, CI/CD Pipelines, Monitoring Tools (CloudWatch, Datadog, New Relic)',
|
||||
'process_steps': 'Assessment & Planning, Architecture Design, Proof of Concept, Migration Strategy, Phased Migration Execution, Testing & Validation, Optimization, Training, Go-Live Support, Ongoing Management',
|
||||
'features_description': 'Comprehensive cloud migration with features including automated infrastructure provisioning, multi-region deployment, auto-scaling, disaster recovery, and cost optimization.',
|
||||
'deliverables_description': 'Complete cloud infrastructure with automated deployment, monitoring, security hardening, documentation, and ongoing optimization support.',
|
||||
'process_description': 'We follow a phased migration approach with thorough testing, minimal downtime, and comprehensive rollback plans to ensure business continuity.',
|
||||
'why_choose_description': 'Our cloud migration expertise, combined with proven methodologies, ensures a smooth transition with minimal risk and maximum value realization.',
|
||||
'expertise_description': 'Certified cloud architects with extensive experience in AWS, Azure, and GCP, specializing in enterprise migrations and cloud-native architectures.',
|
||||
'image_keyword': 'cloud migration enterprise infrastructure technology',
|
||||
'featured': True,
|
||||
'display_order': 4,
|
||||
'is_active': True,
|
||||
},
|
||||
{
|
||||
'title': 'Enterprise DevOps & CI/CD Solutions',
|
||||
'description': 'Implement enterprise-grade DevOps practices and CI/CD pipelines to accelerate software delivery, improve quality, and reduce operational overhead. We design and implement comprehensive DevOps solutions that enable continuous integration, continuous deployment, and infrastructure automation.',
|
||||
'short_description': 'Enterprise DevOps and CI/CD solutions for automated software delivery and infrastructure management.',
|
||||
'slug': 'enterprise-devops-cicd-solutions',
|
||||
'icon': 'settings',
|
||||
'price': '30000.00',
|
||||
'category_slug': 'enterprise-solutions',
|
||||
'duration': '8-16 weeks',
|
||||
'deliverables': 'CI/CD Pipeline Setup, Infrastructure as Code, Automated Testing Integration, Deployment Automation, Monitoring & Logging Setup, Security Scanning Integration, Documentation, Team Training, Best Practices Guide, Ongoing Support',
|
||||
'technologies': 'Jenkins, GitLab CI, GitHub Actions, Azure DevOps, Docker, Kubernetes, Terraform, Ansible, Prometheus, Grafana, ELK Stack, SonarQube',
|
||||
'process_steps': 'Assessment & Planning, Tool Selection, Pipeline Design, Implementation, Testing, Documentation, Training, Go-Live, Optimization, Ongoing Support',
|
||||
'features_description': 'Comprehensive DevOps solutions with automated builds, testing, security scanning, deployment pipelines, infrastructure provisioning, and monitoring.',
|
||||
'deliverables_description': 'Complete DevOps infrastructure with automated pipelines, monitoring dashboards, documentation, and team training for sustainable operations.',
|
||||
'process_description': 'We implement DevOps best practices with a focus on automation, quality gates, security, and continuous improvement.',
|
||||
'why_choose_description': 'Our DevOps expertise helps you achieve faster time-to-market, improved quality, reduced costs, and enhanced team productivity.',
|
||||
'expertise_description': 'Experienced DevOps engineers with deep knowledge of CI/CD tools, containerization, orchestration, and infrastructure automation.',
|
||||
'image_keyword': 'devops cicd automation enterprise technology',
|
||||
'featured': False,
|
||||
'display_order': 5,
|
||||
'is_active': True,
|
||||
},
|
||||
{
|
||||
'title': 'Enterprise Data Analytics & Business Intelligence',
|
||||
'description': 'Transform your data into actionable insights with enterprise-grade analytics and business intelligence solutions. We build comprehensive data pipelines, analytics platforms, and visualization dashboards that enable data-driven decision making across your organization.',
|
||||
'short_description': 'Enterprise data analytics and BI solutions for data-driven decision making and business insights.',
|
||||
'slug': 'enterprise-data-analytics-business-intelligence',
|
||||
'icon': 'analytics',
|
||||
'price': '40000.00',
|
||||
'category_slug': 'enterprise-solutions',
|
||||
'duration': '12-24 weeks',
|
||||
'deliverables': 'Data Pipeline Architecture, ETL/ELT Processes, Data Warehouse Setup, Analytics Platform, BI Dashboards, Custom Reports, Data Visualization, Predictive Analytics Models, Documentation, Training',
|
||||
'technologies': 'Python, R, SQL, Apache Spark, Airflow, Snowflake, BigQuery, Redshift, Tableau, Power BI, Looker, Jupyter Notebooks, ML Models',
|
||||
'process_steps': 'Data Assessment, Architecture Design, Pipeline Development, Data Integration, Analytics Development, Dashboard Creation, Testing, Training, Deployment, Ongoing Support',
|
||||
'features_description': 'Advanced analytics with real-time data processing, predictive modeling, interactive dashboards, automated reporting, and machine learning capabilities.',
|
||||
'deliverables_description': 'Complete analytics solution with data pipelines, warehouses, dashboards, reports, and training for your team.',
|
||||
'process_description': 'We follow a data-driven approach with iterative development, stakeholder feedback, and continuous refinement of analytics models.',
|
||||
'why_choose_description': 'Our analytics expertise helps you unlock the value in your data, make informed decisions, and gain competitive advantages through insights.',
|
||||
'expertise_description': 'Data scientists and engineers with expertise in big data technologies, machine learning, and business intelligence platforms.',
|
||||
'image_keyword': 'data analytics business intelligence enterprise dashboard',
|
||||
'featured': False,
|
||||
'display_order': 6,
|
||||
'is_active': True,
|
||||
},
|
||||
]
|
||||
|
||||
# Process each service
|
||||
for service_data in services_data:
|
||||
category_slug = service_data.pop('category_slug')
|
||||
image_keyword = service_data.pop('image_keyword')
|
||||
category = categories.get(category_slug)
|
||||
|
||||
if not category:
|
||||
self.stdout.write(
|
||||
self.style.ERROR(f'Category "{category_slug}" not found for service: {service_data["title"]}')
|
||||
)
|
||||
continue
|
||||
|
||||
service_data['category'] = category
|
||||
|
||||
# Check if service exists
|
||||
service, created = Service.objects.get_or_create(
|
||||
slug=service_data['slug'],
|
||||
defaults=service_data
|
||||
)
|
||||
|
||||
if not created and not update_existing:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(f'Service already exists (skipping): {service.title}')
|
||||
)
|
||||
continue
|
||||
|
||||
if not created and update_existing:
|
||||
# Update existing service
|
||||
for key, value in service_data.items():
|
||||
setattr(service, key, value)
|
||||
service.save()
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f'Updated service: {service.title}')
|
||||
)
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f'Created service: {service.title}')
|
||||
)
|
||||
|
||||
# Download and set image
|
||||
if service:
|
||||
self.stdout.write(f'Downloading image for: {service.title}...')
|
||||
image_data = self.download_image_from_unsplash(
|
||||
image_keyword,
|
||||
width=width,
|
||||
height=height,
|
||||
api_key=unsplash_key
|
||||
)
|
||||
|
||||
if image_data:
|
||||
try:
|
||||
# Determine file extension (default to jpg)
|
||||
filename = f"{service.slug}.jpg"
|
||||
|
||||
# Save image to service
|
||||
service.image.save(
|
||||
filename,
|
||||
ContentFile(image_data.read()),
|
||||
save=True
|
||||
)
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f' ✓ Image saved for: {service.title}')
|
||||
)
|
||||
except Exception as e:
|
||||
self.stdout.write(
|
||||
self.style.ERROR(f' ✗ Failed to save image: {str(e)}')
|
||||
)
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(f' ⚠ No image downloaded for: {service.title}')
|
||||
)
|
||||
|
||||
# Add features for enterprise services
|
||||
if created or update_existing:
|
||||
# Clear existing features if updating
|
||||
if update_existing and not created:
|
||||
ServiceFeature.objects.filter(service=service).delete()
|
||||
|
||||
# Add enterprise features
|
||||
features_data = [
|
||||
{
|
||||
'title': 'Enterprise-Grade Security',
|
||||
'description': 'Bank-level security with encryption, authentication, and compliance standards',
|
||||
'icon': 'shield',
|
||||
'display_order': 1
|
||||
},
|
||||
{
|
||||
'title': 'Scalable Architecture',
|
||||
'description': 'Built to handle growth with horizontal scaling and load balancing',
|
||||
'icon': 'trending-up',
|
||||
'display_order': 2
|
||||
},
|
||||
{
|
||||
'title': '24/7 Support',
|
||||
'description': 'Round-the-clock support and monitoring for mission-critical systems',
|
||||
'icon': 'headphones',
|
||||
'display_order': 3
|
||||
},
|
||||
{
|
||||
'title': 'Comprehensive Documentation',
|
||||
'description': 'Detailed documentation for developers, administrators, and end users',
|
||||
'icon': 'book',
|
||||
'display_order': 4
|
||||
},
|
||||
]
|
||||
|
||||
for feature_data in features_data:
|
||||
ServiceFeature.objects.get_or_create(
|
||||
service=service,
|
||||
title=feature_data['title'],
|
||||
defaults=feature_data
|
||||
)
|
||||
|
||||
# Add expertise items
|
||||
expertise_data = [
|
||||
{
|
||||
'title': 'Industry Expertise',
|
||||
'description': 'Deep understanding of enterprise requirements and industry best practices',
|
||||
'icon': 'award',
|
||||
'display_order': 1
|
||||
},
|
||||
{
|
||||
'title': 'Proven Methodology',
|
||||
'description': 'Agile development with proven processes and quality assurance',
|
||||
'icon': 'check-circle',
|
||||
'display_order': 2
|
||||
},
|
||||
{
|
||||
'title': 'Technology Leadership',
|
||||
'description': 'Cutting-edge technologies and modern development practices',
|
||||
'icon': 'code',
|
||||
'display_order': 3
|
||||
},
|
||||
]
|
||||
|
||||
for expertise_data_item in expertise_data:
|
||||
ServiceExpertise.objects.get_or_create(
|
||||
service=service,
|
||||
title=expertise_data_item['title'],
|
||||
defaults=expertise_data_item
|
||||
)
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS('\n✓ Successfully imported enterprise sample data!')
|
||||
)
|
||||
if not unsplash_key:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(
|
||||
'\nNote: Using Unsplash Source API (no key required). '
|
||||
'For better reliability, consider using --unsplash-key with an API key from https://unsplash.com/developers'
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user