From 136f75a859c7178b94a712bdbd6a9935dbe64892 Mon Sep 17 00:00:00 2001 From: Iliyan Angelov Date: Mon, 24 Nov 2025 08:18:18 +0200 Subject: [PATCH] update --- backEnd/.env | 11 +- .../__pycache__/__init__.cpython-312.pyc | Bin 168 -> 158 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 177 -> 167 bytes .../populate_insights.cpython-312.pyc | Bin 0 -> 39086 bytes .../management/commands/populate_insights.py | 725 +++ .../__pycache__/email_service.cpython-312.pyc | Bin 5065 -> 7158 bytes backEnd/career/email_service.py | 76 +- .../__pycache__/__init__.cpython-312.pyc | Bin 170 -> 160 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 179 -> 169 bytes .../populate_european_jobs.cpython-312.pyc | Bin 0 -> 23648 bytes .../commands/populate_european_jobs.py | 676 +++ .../career/application_confirmation.html | 286 +- .../career/application_notification.html | 312 +- .../__pycache__/serializers.cpython-312.pyc | Bin 6997 -> 8335 bytes .../__pycache__/urls.cpython-312.pyc | Bin 808 -> 784 bytes .../__pycache__/views.cpython-312.pyc | Bin 8438 -> 9302 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 176 -> 166 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 185 -> 175 bytes .../populate_case_studies.cpython-312.pyc | Bin 14123 -> 41951 bytes .../commands/populate_case_studies.py | 700 ++- backEnd/case_studies/serializers.py | 40 +- backEnd/case_studies/urls.py | 2 +- backEnd/case_studies/views.py | 36 +- .../__pycache__/email_service.cpython-312.pyc | Bin 10930 -> 10287 bytes backEnd/contact/email_service.py | 47 +- .../contact_submission_confirmation.html | 406 ++ .../contact_submission_confirmation.txt | 32 + .../contact/contact_submission_email.html | 251 +- backEnd/db.sqlite3 | Bin 880640 -> 962560 bytes .../gnx/__pycache__/settings.cpython-312.pyc | Bin 8436 -> 8432 bytes backEnd/gnx/__pycache__/urls.cpython-312.pyc | Bin 3009 -> 3060 bytes backEnd/gnx/settings.py | 1 + backEnd/gnx/urls.py | 1 + backEnd/home/__init__.py | 0 .../home/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 147 bytes .../home/__pycache__/admin.cpython-312.pyc | Bin 0 -> 1130 bytes backEnd/home/__pycache__/apps.cpython-312.pyc | Bin 0 -> 478 bytes .../home/__pycache__/models.cpython-312.pyc | Bin 0 -> 2340 bytes .../__pycache__/serializers.cpython-312.pyc | Bin 0 -> 829 bytes backEnd/home/__pycache__/urls.cpython-312.pyc | Bin 0 -> 596 bytes .../home/__pycache__/views.cpython-312.pyc | Bin 0 -> 1337 bytes backEnd/home/admin.py | 28 + backEnd/home/apps.py | 8 + backEnd/home/management/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 158 bytes backEnd/home/management/commands/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 167 bytes .../populate_home_banners.cpython-312.pyc | Bin 0 -> 4552 bytes .../commands/populate_home_banners.py | 86 + backEnd/home/migrations/0001_initial.py | 37 + backEnd/home/migrations/__init__.py | 0 .../__pycache__/0001_initial.cpython-312.pyc | Bin 0 -> 2310 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 158 bytes backEnd/home/models.py | 27 + backEnd/home/serializers.py | 13 + backEnd/home/urls.py | 11 + backEnd/home/views.py | 19 + backEnd/logs/django.log | 4319 +++++++++++++++++ backEnd/media/services/images/ai.jpg | Bin 0 -> 111096 bytes .../services/images/api-integrations.jpg | Bin 0 -> 111096 bytes ...ntelligence-machine-learning-solutions.jpg | Bin 0 -> 111096 bytes ...nce-machine-learning-solutions_k2ns35k.jpg | Bin 0 -> 86774 bytes .../images/backend-engineering_jdxflin.jpg | Bin 0 -> 111096 bytes ...ing-infrastructure-automation-services.jpg | Bin 0 -> 111096 bytes ...astructure-automation-services_OYGpGto.jpg | Bin 0 -> 242554 bytes .../media/services/images/devops-services.jpg | Bin 0 -> 111096 bytes .../enterprise-api-integration-services.jpg | Bin 0 -> 111096 bytes ...prise-api-integration-services_VCRRrC6.jpg | Bin 0 -> 201658 bytes ...prise-api-integration-services_cNmdpRu.jpg | Bin 0 -> 126103 bytes ...nterprise-backend-development-services.jpg | Bin 0 -> 111096 bytes ...e-backend-development-services_VzGwXp3.jpg | Bin 0 -> 89797 bytes ...a-replication-synchronization-services.jpg | Bin 0 -> 111096 bytes ...ation-synchronization-services_5Ul87if.jpg | Bin 0 -> 146813 bytes ...terprise-frontend-development-services.jpg | Bin 0 -> 111096 bytes ...-frontend-development-services_cQqQE5R.jpg | Bin 0 -> 126103 bytes ...-frontend-development-services_gKqfkLg.jpg | Bin 0 -> 72507 bytes ...ver-management-administration-services.jpg | Bin 0 -> 111096 bytes ...gement-administration-services_CX2eP9j.jpg | Bin 0 -> 168907 bytes .../images/frontend-engineering_vbwN78Z.jpg | Bin 0 -> 111096 bytes .../images/infrastructure-support.jpg | Bin 0 -> 111096 bytes ...astructure-management-support-services.jpg | Bin 0 -> 111096 bytes ...re-management-support-services_9n65syH.jpg | Bin 0 -> 92096 bytes .../services/images/replication-of-data.jpg | Bin 0 -> 111096 bytes .../media/services/images/servers-service.jpg | Bin 0 -> 111096 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 172 -> 162 bytes .../management/commands/populate_policies.py | 16 +- .../import_enterprise_data.cpython-312.pyc | Bin 25264 -> 27246 bytes .../commands/import_enterprise_data.py | 516 +- backEnd/support/README.md | 193 - .../__pycache__/email_service.cpython-312.pyc | Bin 6278 -> 8557 bytes .../__pycache__/signals.cpython-312.pyc | Bin 8850 -> 11215 bytes backEnd/support/email_service.py | 76 +- .../__pycache__/__init__.cpython-312.pyc | Bin 171 -> 161 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 180 -> 170 bytes .../populate_support_data.cpython-312.pyc | Bin 14509 -> 36698 bytes .../commands/populate_support_data.py | 691 ++- backEnd/support/signals.py | 91 +- .../support/ticket_assigned_notification.html | 311 +- .../support/ticket_confirmation_user.html | 413 +- .../support/ticket_message_notification.html | 311 +- .../support/ticket_notification_company.html | 468 +- .../support/ticket_status_update.html | 342 +- frontEnd/app/case-study/[slug]/page.tsx | 41 + .../components/pages/about/AboutService.tsx | 820 ++-- .../components/pages/about/AboutStarter.tsx | 405 +- .../pages/career/JobApplicationForm.tsx | 162 +- .../components/pages/case-study/CaseItems.tsx | 100 +- .../pages/case-study/CaseSingle.tsx | 450 +- .../components/pages/case-study/Process.tsx | 41 +- .../pages/case-study/RelatedCase.tsx | 67 +- .../pages/contact/ContactSection.tsx | 214 +- frontEnd/components/pages/home/HomeBanner.tsx | 139 +- frontEnd/components/pages/home/Story.tsx | 386 +- .../pages/support/CreateTicketForm.tsx | 61 +- .../pages/support/KnowledgeBase.tsx | 150 +- .../pages/support/TicketStatusCheck.tsx | 34 +- .../shared/banners/ServiceDetailsBanner.tsx | 21 - .../shared/layout/CookieConsent.tsx | 10 +- .../shared/layout/footer/Footer.tsx | 128 +- .../shared/layout/header/Header.tsx | 86 +- .../shared/layout/header/OffcanvasMenu.tsx | 143 +- frontEnd/lib/api/caseStudyService.ts | 14 +- frontEnd/lib/api/homeService.ts | 71 + frontEnd/lib/hooks/useHome.ts | 43 + frontEnd/next.config.js | 7 + frontEnd/public/data/offcanvas-data.ts | 120 - frontEnd/public/styles/_responsive.scss | 53 +- frontEnd/public/styles/base/_global.scss | 7 + .../styles/components/_cookie-consent.scss | 2 +- frontEnd/public/styles/layout/_banner.scss | 35 +- frontEnd/public/styles/layout/_footer.scss | 850 ++-- frontEnd/public/styles/pages/_about.scss | 284 ++ .../public/styles/sections/_all-sections.scss | 1805 ++++++- 133 files changed, 14977 insertions(+), 3350 deletions(-) create mode 100644 backEnd/blog/management/commands/__pycache__/populate_insights.cpython-312.pyc create mode 100644 backEnd/blog/management/commands/populate_insights.py create mode 100644 backEnd/career/management/commands/__pycache__/populate_european_jobs.cpython-312.pyc create mode 100644 backEnd/career/management/commands/populate_european_jobs.py create mode 100644 backEnd/contact/templates/contact/contact_submission_confirmation.html create mode 100644 backEnd/contact/templates/contact/contact_submission_confirmation.txt create mode 100644 backEnd/home/__init__.py create mode 100644 backEnd/home/__pycache__/__init__.cpython-312.pyc create mode 100644 backEnd/home/__pycache__/admin.cpython-312.pyc create mode 100644 backEnd/home/__pycache__/apps.cpython-312.pyc create mode 100644 backEnd/home/__pycache__/models.cpython-312.pyc create mode 100644 backEnd/home/__pycache__/serializers.cpython-312.pyc create mode 100644 backEnd/home/__pycache__/urls.cpython-312.pyc create mode 100644 backEnd/home/__pycache__/views.cpython-312.pyc create mode 100644 backEnd/home/admin.py create mode 100644 backEnd/home/apps.py create mode 100644 backEnd/home/management/__init__.py create mode 100644 backEnd/home/management/__pycache__/__init__.cpython-312.pyc create mode 100644 backEnd/home/management/commands/__init__.py create mode 100644 backEnd/home/management/commands/__pycache__/__init__.cpython-312.pyc create mode 100644 backEnd/home/management/commands/__pycache__/populate_home_banners.cpython-312.pyc create mode 100644 backEnd/home/management/commands/populate_home_banners.py create mode 100644 backEnd/home/migrations/0001_initial.py create mode 100644 backEnd/home/migrations/__init__.py create mode 100644 backEnd/home/migrations/__pycache__/0001_initial.cpython-312.pyc create mode 100644 backEnd/home/migrations/__pycache__/__init__.cpython-312.pyc create mode 100644 backEnd/home/models.py create mode 100644 backEnd/home/serializers.py create mode 100644 backEnd/home/urls.py create mode 100644 backEnd/home/views.py create mode 100644 backEnd/media/services/images/ai.jpg create mode 100644 backEnd/media/services/images/api-integrations.jpg create mode 100644 backEnd/media/services/images/artificial-intelligence-machine-learning-solutions.jpg create mode 100644 backEnd/media/services/images/artificial-intelligence-machine-learning-solutions_k2ns35k.jpg create mode 100644 backEnd/media/services/images/backend-engineering_jdxflin.jpg create mode 100644 backEnd/media/services/images/devops-engineering-infrastructure-automation-services.jpg create mode 100644 backEnd/media/services/images/devops-engineering-infrastructure-automation-services_OYGpGto.jpg create mode 100644 backEnd/media/services/images/devops-services.jpg create mode 100644 backEnd/media/services/images/enterprise-api-integration-services.jpg create mode 100644 backEnd/media/services/images/enterprise-api-integration-services_VCRRrC6.jpg create mode 100644 backEnd/media/services/images/enterprise-api-integration-services_cNmdpRu.jpg create mode 100644 backEnd/media/services/images/enterprise-backend-development-services.jpg create mode 100644 backEnd/media/services/images/enterprise-backend-development-services_VzGwXp3.jpg create mode 100644 backEnd/media/services/images/enterprise-data-replication-synchronization-services.jpg create mode 100644 backEnd/media/services/images/enterprise-data-replication-synchronization-services_5Ul87if.jpg create mode 100644 backEnd/media/services/images/enterprise-frontend-development-services.jpg create mode 100644 backEnd/media/services/images/enterprise-frontend-development-services_cQqQE5R.jpg create mode 100644 backEnd/media/services/images/enterprise-frontend-development-services_gKqfkLg.jpg create mode 100644 backEnd/media/services/images/enterprise-server-management-administration-services.jpg create mode 100644 backEnd/media/services/images/enterprise-server-management-administration-services_CX2eP9j.jpg create mode 100644 backEnd/media/services/images/frontend-engineering_vbwN78Z.jpg create mode 100644 backEnd/media/services/images/infrastructure-support.jpg create mode 100644 backEnd/media/services/images/it-infrastructure-management-support-services.jpg create mode 100644 backEnd/media/services/images/it-infrastructure-management-support-services_9n65syH.jpg create mode 100644 backEnd/media/services/images/replication-of-data.jpg create mode 100644 backEnd/media/services/images/servers-service.jpg delete mode 100644 backEnd/support/README.md create mode 100644 frontEnd/lib/api/homeService.ts create mode 100644 frontEnd/lib/hooks/useHome.ts delete mode 100644 frontEnd/public/data/offcanvas-data.ts diff --git a/backEnd/.env b/backEnd/.env index 5acd7e78..9d2f67ad 100644 --- a/backEnd/.env +++ b/backEnd/.env @@ -5,10 +5,19 @@ DEBUG=True ALLOWED_HOSTS=localhost,127.0.0.1 # Email Configuration (Development - uses console backend by default) -USE_SMTP_IN_DEV=False +USE_SMTP_IN_DEV=True DEFAULT_FROM_EMAIL=support@gnxsoft.com COMPANY_EMAIL=support@gnxsoft.com SUPPORT_EMAIL=support@gnxsoft.com # Site URL SITE_URL=http://localhost:3000 + +# SMTP Configuration (for production or when USE_SMTP_IN_DEV=True) +EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend +EMAIL_HOST=mail.gnxsoft.com +EMAIL_PORT=587 +EMAIL_USE_TLS=True +EMAIL_USE_SSL=False +EMAIL_HOST_USER=support@gnxsoft.com +EMAIL_HOST_PASSWORD=P4eli240453. diff --git a/backEnd/blog/management/__pycache__/__init__.cpython-312.pyc b/backEnd/blog/management/__pycache__/__init__.cpython-312.pyc index 1bd652b5466a6bd68d9cf7fea6a5cbdda3888f06..5debdfbaaf1d4c9b8faeba8c9476996c04594a50 100644 GIT binary patch delta 34 ocmZ3%IFFI%G%qg~0}z--DrZjQF=DixXfMT@l$f0DIx)im0EG_-X#fBK delta 44 ycmbQoxPp=AG%qg~0}vD&KFgTMW5nn_(O!x_J+DHyC^a#;L_aApIXiV?oC5#|a}6T^ diff --git a/backEnd/blog/management/commands/__pycache__/__init__.cpython-312.pyc b/backEnd/blog/management/commands/__pycache__/__init__.cpython-312.pyc index 9ca89da0d8de1a3f9e1cb321a490ee228fdde23b..db7537617b9d7f22fcec38913b9ea46de06b16f6 100644 GIT binary patch delta 34 ocmdnUxSWyaG%qg~0}z--DrZjQF=BL^XfMT@l$f0DIx)i&0EgcQjQ{`u delta 44 ycmZ3^xRH_PG%qg~0}zxLKFgTMW5gIR(O!x_J+DHyC^a#;L_aApIXiV?oF@Pba1BTR diff --git a/backEnd/blog/management/commands/__pycache__/populate_insights.cpython-312.pyc b/backEnd/blog/management/commands/__pycache__/populate_insights.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eebea8838e26a52f2235f1c3f1be30fd4a4580f GIT binary patch literal 39086 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 literal 0 HcmV?d00001 diff --git a/backEnd/blog/management/commands/populate_insights.py b/backEnd/blog/management/commands/populate_insights.py new file mode 100644 index 00000000..8bc94636 --- /dev/null +++ b/backEnd/blog/management/commands/populate_insights.py @@ -0,0 +1,725 @@ +from django.core.management.base import BaseCommand +from django.db import transaction +from django.utils import timezone +from datetime import timedelta +from blog.models import BlogAuthor, BlogCategory, BlogTag, BlogPost + + +class Command(BaseCommand): + help = 'Populate database with insights data (technology trends, best practices, industry news)' + + def add_arguments(self, parser): + parser.add_argument( + '--delete-old', + action='store_true', + help='Delete all existing insights/blog data before populating', + ) + + def handle(self, *args, **kwargs): + delete_old = kwargs.get('delete_old', False) + + self.stdout.write(self.style.SUCCESS('Starting to populate insights data...')) + + with transaction.atomic(): + # Delete old data if requested + if delete_old: + self.delete_old_data() + + # Create Authors + authors = self.create_authors() + + # Create Categories + categories = self.create_categories() + + # Create Tags + tags = self.create_tags() + + # Create Insights Posts + self.create_insights_posts(authors, categories, tags) + + self.stdout.write(self.style.SUCCESS('\n✓ Successfully populated insights data!')) + self.stdout.write(f' - Authors: {BlogAuthor.objects.count()}') + self.stdout.write(f' - Categories: {BlogCategory.objects.count()}') + self.stdout.write(f' - Tags: {BlogTag.objects.count()}') + self.stdout.write(f' - Insights Posts: {BlogPost.objects.count()}') + + def delete_old_data(self): + """Delete all existing insights/blog data""" + self.stdout.write(self.style.WARNING('Deleting old insights data...')) + + posts_count = BlogPost.objects.count() + BlogPost.objects.all().delete() + self.stdout.write(f' ✓ Deleted {posts_count} insights posts') + + tags_count = BlogTag.objects.count() + BlogTag.objects.all().delete() + self.stdout.write(f' ✓ Deleted {tags_count} tags') + + categories_count = BlogCategory.objects.count() + BlogCategory.objects.all().delete() + self.stdout.write(f' ✓ Deleted {categories_count} categories') + + authors_count = BlogAuthor.objects.count() + BlogAuthor.objects.all().delete() + self.stdout.write(f' ✓ Deleted {authors_count} authors') + + self.stdout.write(self.style.SUCCESS('Old data deleted successfully!')) + + def create_authors(self): + """Create blog authors""" + self.stdout.write('Creating authors...') + + authors_data = [ + { + 'name': 'Sarah Johnson', + 'email': 'sarah@gnxsoft.com', + 'bio': 'Senior Technology Consultant with 15+ years in enterprise solutions and digital transformation' + }, + { + 'name': 'Michael Chen', + 'email': 'michael@gnxsoft.com', + 'bio': 'Cloud Architecture Specialist and DevOps Expert with expertise in scalable infrastructure' + }, + { + 'name': 'Emily Rodriguez', + 'email': 'emily@gnxsoft.com', + 'bio': 'API Integration and System Integration Lead specializing in modern integration patterns' + }, + { + 'name': 'David Thompson', + 'email': 'david@gnxsoft.com', + 'bio': 'Digital Transformation and Business Intelligence Consultant focused on data-driven strategies' + }, + { + 'name': 'Jennifer Martinez', + 'email': 'jennifer@gnxsoft.com', + 'bio': 'AI/ML Solutions Architect with expertise in machine learning and artificial intelligence' + }, + { + 'name': 'Robert Kim', + 'email': 'robert@gnxsoft.com', + 'bio': 'Security and Compliance Expert specializing in enterprise security and regulatory compliance' + } + ] + + authors = {} + for author_data in authors_data: + author, created = BlogAuthor.objects.get_or_create( + email=author_data['email'], + defaults=author_data + ) + authors[author.name] = author + if created: + self.stdout.write(self.style.SUCCESS(f' ✓ Created author: {author.name}')) + else: + self.stdout.write(f' - Author already exists: {author.name}') + + return authors + + def create_categories(self): + """Create blog categories""" + self.stdout.write('Creating categories...') + + categories_data = [ + { + 'title': 'Technology Trends', + 'slug': 'technology-trends', + 'description': 'Latest trends and innovations in enterprise technology', + 'display_order': 1 + }, + { + 'title': 'Best Practices', + 'slug': 'best-practices', + 'description': 'Industry best practices and proven methodologies', + 'display_order': 2 + }, + { + 'title': 'Enterprise Software', + 'slug': 'enterprise-software', + 'description': 'Insights on enterprise software development and architecture', + 'display_order': 3 + }, + { + 'title': 'Cloud & Infrastructure', + 'slug': 'cloud-infrastructure', + 'description': 'Cloud computing, infrastructure, and DevOps insights', + 'display_order': 4 + }, + { + 'title': 'AI & Machine Learning', + 'slug': 'ai-machine-learning', + 'description': 'Artificial intelligence and machine learning insights', + 'display_order': 5 + }, + { + 'title': 'Security & Compliance', + 'slug': 'security-compliance', + 'description': 'Enterprise security, cybersecurity, and compliance topics', + 'display_order': 6 + }, + { + 'title': 'Digital Transformation', + 'slug': 'digital-transformation', + 'description': 'Digital transformation strategies and insights', + 'display_order': 7 + }, + { + 'title': 'Industry News', + 'slug': 'industry-news', + 'description': 'Latest news and updates from the technology industry', + 'display_order': 8 + } + ] + + categories = {} + for cat_data in categories_data: + category, created = BlogCategory.objects.get_or_create( + slug=cat_data['slug'], + defaults=cat_data + ) + categories[category.slug] = category + if created: + self.stdout.write(self.style.SUCCESS(f' ✓ Created category: {category.title}')) + else: + self.stdout.write(f' - Category already exists: {category.title}') + + return categories + + def create_tags(self): + """Create blog tags""" + self.stdout.write('Creating tags...') + + tags_data = [ + 'Technology Trends', 'Best Practices', 'Enterprise', 'Cloud', 'AWS', 'Azure', 'GCP', + 'DevOps', 'CI/CD', 'Docker', 'Kubernetes', 'Microservices', 'API', 'REST', 'GraphQL', + 'Security', 'Compliance', 'GDPR', 'SOC 2', 'Zero Trust', 'AI', 'Machine Learning', + 'Data Analytics', 'Business Intelligence', 'Digital Transformation', 'Architecture', + 'Scalability', 'Performance', 'Integration', 'Automation', 'Innovation', 'Industry News' + ] + + tags = {} + for tag_name in tags_data: + tag, created = BlogTag.objects.get_or_create( + name=tag_name, + defaults={'name': tag_name} + ) + tags[tag_name] = tag + if created: + self.stdout.write(self.style.SUCCESS(f' ✓ Created tag: {tag.name}')) + else: + self.stdout.write(f' - Tag already exists: {tag.name}') + + return tags + + def create_insights_posts(self, authors, categories, tags): + """Create insights blog posts""" + self.stdout.write('Creating insights posts...') + + posts_data = [ + { + 'title': 'Top 10 Technology Trends Shaping Enterprise Software in 2024', + 'content': '''

Introduction

+

As we navigate through 2024, enterprise software development continues to evolve at a rapid pace. Understanding these trends is crucial for organizations looking to stay competitive and innovative.

+ +

1. AI-Powered Development Tools

+

Artificial intelligence is revolutionizing how developers write code. From AI-assisted coding to automated testing, these tools are increasing productivity and reducing time-to-market for enterprise applications.

+ +

2. Edge Computing Adoption

+

Edge computing is becoming mainstream as organizations seek to reduce latency and improve performance. This trend is particularly important for IoT applications and real-time data processing.

+ +

3. Low-Code/No-Code Platforms

+

Low-code and no-code platforms are democratizing software development, enabling business users to create applications without extensive programming knowledge.

+ +

4. Quantum Computing Readiness

+

While still emerging, quantum computing is beginning to impact enterprise software planning. Organizations are preparing for quantum-safe cryptography and exploring quantum algorithms.

+ +

5. Sustainable Software Development

+

Green computing and sustainable development practices are gaining traction as organizations focus on reducing their carbon footprint and energy consumption.

+ +

6. Enhanced Security Posture

+

Zero-trust architecture and advanced threat detection are becoming standard practices as cyber threats become more sophisticated.

+ +

7. Serverless Architecture Growth

+

Serverless computing continues to grow, offering cost-effective and scalable solutions for enterprise applications.

+ +

8. Real-Time Data Processing

+

The demand for real-time analytics and data processing is driving adoption of stream processing technologies and event-driven architectures.

+ +

9. Multi-Cloud Strategies

+

Organizations are increasingly adopting multi-cloud approaches to avoid vendor lock-in and optimize costs.

+ +

10. Developer Experience Focus

+

Improving developer experience through better tools, documentation, and workflows is becoming a priority for enterprise organizations.

+ +

Conclusion

+

These trends represent significant opportunities for organizations willing to invest in modern technologies and practices. Staying informed and adaptable is key to success in the evolving enterprise software landscape.

''', + 'excerpt': 'Explore the top 10 technology trends that are reshaping enterprise software development and how they impact your organization.', + 'author': authors.get('Sarah Johnson'), + 'category': categories.get('technology-trends'), + 'tags': ['Technology Trends', 'Enterprise', 'Innovation', 'Industry News'], + 'thumbnail_url': '/images/blog/one.png', + 'featured': True, + 'reading_time': 12, + 'days_ago': 2, + 'meta_description': 'Discover the top 10 technology trends shaping enterprise software in 2024, from AI-powered tools to quantum computing readiness.', + 'meta_keywords': 'technology trends, enterprise software, AI, cloud computing, innovation' + }, + { + 'title': 'Best Practices for Building Scalable Enterprise APIs', + 'content': '''

Introduction

+

Building scalable APIs is fundamental to modern enterprise architecture. This guide covers essential best practices that ensure your APIs can handle growth and maintain performance.

+ +

Design Principles

+

Start with a clear API design that follows RESTful principles or GraphQL patterns. Consistency in naming, structure, and behavior is crucial for developer adoption and maintainability.

+ +

Versioning Strategy

+

Implement API versioning from the start. Use URL versioning (e.g., /api/v1/) or header-based versioning to ensure backward compatibility as your API evolves.

+ +

Rate Limiting and Throttling

+

Protect your API from abuse and ensure fair usage by implementing rate limiting. Consider different limits for different user tiers and provide clear error messages when limits are exceeded.

+ +

Caching Strategies

+

Implement multi-layer caching to reduce database load and improve response times. Use HTTP caching headers, application-level caching, and CDN caching where appropriate.

+ +

Error Handling

+

Provide clear, consistent error responses with appropriate HTTP status codes. Include error codes, messages, and documentation links to help developers resolve issues quickly.

+ +

Security Best Practices

+
    +
  • Implement OAuth 2.0 or JWT for authentication
  • +
  • Use HTTPS for all API communications
  • +
  • Validate and sanitize all inputs
  • +
  • Implement proper authorization checks
  • +
  • Regular security audits and penetration testing
  • +
+ +

Documentation

+

Comprehensive API documentation is essential. Use tools like OpenAPI/Swagger to generate interactive documentation that stays in sync with your API implementation.

+ +

Monitoring and Observability

+

Implement comprehensive logging, metrics, and tracing to monitor API performance, identify bottlenecks, and troubleshoot issues quickly.

+ +

Conclusion

+

Following these best practices will help you build APIs that are scalable, secure, and maintainable. Remember that API design is an iterative process that requires continuous improvement based on usage patterns and feedback.

''', + 'excerpt': 'Learn essential best practices for designing and building scalable enterprise APIs that can grow with your business needs.', + 'author': authors.get('Emily Rodriguez'), + 'category': categories.get('best-practices'), + 'tags': ['API', 'Best Practices', 'Architecture', 'Scalability'], + 'thumbnail_url': '/images/blog/two.png', + 'featured': True, + 'reading_time': 10, + 'days_ago': 5, + 'meta_description': 'Essential best practices for building scalable enterprise APIs including design, security, and performance optimization.', + 'meta_keywords': 'API design, REST API, GraphQL, API best practices, enterprise APIs' + }, + { + 'title': 'The Future of Cloud-Native Architecture', + 'content': '''

What is Cloud-Native Architecture?

+

Cloud-native architecture represents a fundamental shift in how applications are designed, built, and deployed. It leverages cloud computing capabilities to create scalable, resilient, and maintainable systems.

+ +

Key Characteristics

+
    +
  • Container-based deployment with Docker and Kubernetes
  • +
  • Microservices architecture for modularity
  • +
  • DevOps practices for continuous delivery
  • +
  • API-first design for integration
  • +
  • Automated scaling and self-healing capabilities
  • +
+ +

Benefits of Cloud-Native Approach

+

Organizations adopting cloud-native architecture experience faster time-to-market, improved scalability, better resource utilization, and enhanced resilience. These benefits translate to competitive advantages and cost savings.

+ +

Container Orchestration

+

Kubernetes has become the de facto standard for container orchestration. Understanding Kubernetes concepts like pods, services, and deployments is essential for cloud-native development.

+ +

Service Mesh

+

Service mesh technologies like Istio and Linkerd provide advanced traffic management, security, and observability for microservices architectures.

+ +

Serverless Integration

+

Combining serverless functions with containerized microservices offers flexibility and cost optimization. This hybrid approach is becoming increasingly popular.

+ +

Observability and Monitoring

+

Cloud-native applications require comprehensive observability. Implement distributed tracing, metrics collection, and centralized logging to maintain visibility into complex systems.

+ +

Migration Strategies

+

Migrating to cloud-native architecture requires careful planning. Start with new applications, then gradually modernize legacy systems. Consider factors like team skills, infrastructure, and business priorities.

+ +

Conclusion

+

Cloud-native architecture is not just a trend—it's the future of enterprise software. Organizations that embrace these principles will be better positioned to innovate and compete in the digital economy.

''', + 'excerpt': 'Explore how cloud-native architecture is transforming enterprise software development and what it means for your organization.', + 'author': authors.get('Michael Chen'), + 'category': categories.get('cloud-infrastructure'), + 'tags': ['Cloud', 'Kubernetes', 'Docker', 'Microservices', 'DevOps'], + 'thumbnail_url': '/images/blog/three.png', + 'featured': True, + 'reading_time': 11, + 'days_ago': 8, + 'meta_description': 'Understanding cloud-native architecture and how it transforms enterprise software development with containers and microservices.', + 'meta_keywords': 'cloud-native, Kubernetes, Docker, microservices, cloud architecture' + }, + { + 'title': 'AI and Machine Learning: Transforming Enterprise Applications', + 'content': '''

The AI Revolution in Enterprise Software

+

Artificial intelligence and machine learning are no longer futuristic concepts—they're transforming enterprise applications today. From predictive analytics to intelligent automation, AI is creating new possibilities.

+ +

Use Cases in Enterprise Applications

+
    +
  • Predictive maintenance for infrastructure
  • +
  • Intelligent customer service chatbots
  • +
  • Fraud detection and prevention
  • +
  • Personalized user experiences
  • +
  • Automated data analysis and insights
  • +
  • Natural language processing for document analysis
  • +
+ +

Machine Learning Model Deployment

+

Deploying ML models in production requires careful consideration of infrastructure, monitoring, and model versioning. MLOps practices help bridge the gap between data science and operations.

+ +

Data Requirements

+

Quality data is the foundation of successful AI initiatives. Organizations must invest in data collection, cleaning, and management to enable effective machine learning.

+ +

Ethical Considerations

+

As AI becomes more prevalent, ethical considerations around bias, privacy, and transparency become critical. Organizations must implement responsible AI practices.

+ +

Integration Challenges

+

Integrating AI capabilities into existing enterprise systems requires careful planning. Consider factors like API design, data pipelines, and user experience.

+ +

ROI and Business Value

+

Measuring the ROI of AI initiatives can be challenging. Focus on specific business outcomes and establish clear metrics for success before embarking on AI projects.

+ +

Getting Started

+

Start with well-defined use cases that have clear business value. Build internal capabilities gradually, and consider partnering with AI specialists for complex implementations.

+ +

Conclusion

+

AI and machine learning offer tremendous opportunities for enterprise applications. Organizations that strategically adopt these technologies will gain significant competitive advantages.

''', + 'excerpt': 'Discover how AI and machine learning are transforming enterprise applications and learn strategies for successful implementation.', + 'author': authors.get('Jennifer Martinez'), + 'category': categories.get('ai-machine-learning'), + 'tags': ['AI', 'Machine Learning', 'Enterprise', 'Innovation'], + 'thumbnail_url': '/images/blog/four.png', + 'featured': False, + 'reading_time': 9, + 'days_ago': 12, + 'meta_description': 'How AI and machine learning are transforming enterprise applications with practical use cases and implementation strategies.', + 'meta_keywords': 'artificial intelligence, machine learning, AI enterprise, ML models, data science' + }, + { + 'title': 'Zero Trust Security: A Modern Approach to Enterprise Protection', + 'content': '''

Understanding Zero Trust Architecture

+

Zero Trust is a security model based on the principle of "never trust, always verify." Unlike traditional perimeter-based security, Zero Trust assumes that threats can exist both inside and outside the network.

+ +

Core Principles

+
    +
  • Verify explicitly: Always authenticate and authorize based on all available data points
  • +
  • Use least privilege access: Limit user access with Just-In-Time and Just-Enough-Access
  • +
  • Assume breach: Minimize blast radius and segment access
  • +
+ +

Implementation Components

+

Implementing Zero Trust requires multiple components working together: identity verification, device compliance, network segmentation, application access control, and data protection.

+ +

Identity and Access Management

+

Strong identity management is the foundation of Zero Trust. Implement multi-factor authentication, single sign-on, and continuous authentication mechanisms.

+ +

Network Segmentation

+

Segment networks to limit lateral movement in case of a breach. Use micro-segmentation to create granular security boundaries.

+ +

Data Protection

+

Encrypt data at rest and in transit. Implement data loss prevention (DLP) policies and classify sensitive data appropriately.

+ +

Monitoring and Analytics

+

Continuous monitoring and behavioral analytics help detect anomalies and potential threats. Security Information and Event Management (SIEM) systems play a crucial role.

+ +

Compliance Considerations

+

Zero Trust architecture helps organizations meet compliance requirements for regulations like GDPR, HIPAA, and SOC 2 by providing comprehensive security controls.

+ +

Migration Path

+

Migrating to Zero Trust is a journey, not a destination. Start with high-value assets, implement in phases, and continuously refine your security posture.

+ +

Conclusion

+

Zero Trust is becoming essential for modern enterprise security. Organizations that adopt this model will be better protected against evolving cyber threats.

''', + 'excerpt': 'Learn about Zero Trust security architecture and how it provides comprehensive protection for modern enterprise environments.', + 'author': authors.get('Robert Kim'), + 'category': categories.get('security-compliance'), + 'tags': ['Security', 'Zero Trust', 'Compliance', 'Enterprise'], + 'thumbnail_url': '/images/blog/five.png', + 'featured': False, + 'reading_time': 10, + 'days_ago': 15, + 'meta_description': 'Understanding Zero Trust security architecture and its implementation for comprehensive enterprise protection.', + 'meta_keywords': 'zero trust, enterprise security, cybersecurity, compliance, access control' + }, + { + 'title': 'Digital Transformation: Strategies for Success', + 'content': '''

What is Digital Transformation?

+

Digital transformation is the integration of digital technology into all areas of a business, fundamentally changing how organizations operate and deliver value to customers.

+ +

Key Drivers

+
    +
  • Changing customer expectations
  • +
  • Competitive pressure
  • +
  • Technology advancement
  • +
  • Operational efficiency needs
  • +
  • Data-driven decision making
  • +
+ +

Common Challenges

+

Organizations face numerous challenges in digital transformation: resistance to change, legacy systems, skill gaps, budget constraints, and unclear strategy. Addressing these challenges requires strong leadership and clear vision.

+ +

Success Factors

+
    +
  1. Strong leadership commitment and vision
  2. +
  3. Clear strategy aligned with business goals
  4. +
  5. Customer-centric approach
  6. +
  7. Agile and iterative implementation
  8. +
  9. Investment in people and skills
  10. +
  11. Data-driven decision making
  12. +
  13. Partnership with technology experts
  14. +
+ +

Technology Stack

+

Modern digital transformation requires a comprehensive technology stack: cloud infrastructure, data analytics platforms, integration tools, security solutions, and modern development frameworks.

+ +

Cultural Transformation

+

Technology alone isn't enough. Organizations must foster a culture of innovation, agility, and continuous learning. This cultural shift is often the most challenging aspect of transformation.

+ +

Measuring Success

+

Define clear KPIs and metrics to measure transformation success. Focus on business outcomes like customer satisfaction, revenue growth, operational efficiency, and time-to-market.

+ +

Best Practices

+

Start with quick wins to build momentum, involve stakeholders early, communicate transparently, and be prepared to adapt your strategy based on learnings and feedback.

+ +

Conclusion

+

Digital transformation is a continuous journey that requires commitment, strategy, and execution. Organizations that approach it holistically will achieve sustainable competitive advantages.

''', + 'excerpt': 'Discover proven strategies for successful digital transformation and learn how to overcome common challenges.', + 'author': authors.get('David Thompson'), + 'category': categories.get('digital-transformation'), + 'tags': ['Digital Transformation', 'Enterprise', 'Best Practices', 'Innovation'], + 'thumbnail_url': '/images/blog/six.png', + 'featured': True, + 'reading_time': 11, + 'days_ago': 18, + 'meta_description': 'Proven strategies for successful digital transformation including best practices and common challenges.', + 'meta_keywords': 'digital transformation, enterprise strategy, business transformation, innovation' + }, + { + 'title': 'Microservices Architecture: Design Patterns and Best Practices', + 'content': '''

Introduction to Microservices

+

Microservices architecture has become the preferred approach for building large-scale enterprise applications. This architectural style structures applications as collections of loosely coupled services.

+ +

Key Benefits

+
    +
  • Independent deployment and scaling
  • +
  • Technology diversity
  • +
  • Fault isolation
  • +
  • Team autonomy
  • +
  • Easier maintenance and updates
  • +
+ +

Design Patterns

+
    +
  1. API Gateway: Single entry point for client requests
  2. +
  3. Service Discovery: Automatic detection of service instances
  4. +
  5. Circuit Breaker: Prevent cascading failures
  6. +
  7. Event Sourcing: Store all changes as a sequence of events
  8. +
  9. CQRS: Separate read and write models
  10. +
  11. Saga Pattern: Manage distributed transactions
  12. +
+ +

Communication Patterns

+

Microservices can communicate synchronously via REST or GraphQL APIs, or asynchronously through message queues and event streams. Choose the pattern based on your requirements.

+ +

Data Management

+

Each microservice should have its own database. This ensures loose coupling and allows services to evolve independently. Consider eventual consistency for distributed data.

+ +

Deployment Strategies

+

Containerization with Docker and orchestration with Kubernetes are standard practices. Implement blue-green or canary deployments for zero-downtime updates.

+ +

Monitoring and Observability

+

Distributed systems require comprehensive observability. Implement distributed tracing, centralized logging, and metrics collection to maintain visibility.

+ +

Common Pitfalls

+

Avoid creating too many small services, ignoring data consistency requirements, and underestimating operational complexity. Start with a modular monolith if needed.

+ +

Conclusion

+

Microservices architecture offers significant benefits but requires careful design and operational maturity. Start simple and evolve your architecture based on actual needs.

''', + 'excerpt': 'Learn essential design patterns and best practices for building successful microservices architectures.', + 'author': authors.get('Michael Chen'), + 'category': categories.get('enterprise-software'), + 'tags': ['Microservices', 'Architecture', 'Best Practices', 'Docker', 'Kubernetes'], + 'thumbnail_url': '/images/blog/seven.png', + 'featured': False, + 'reading_time': 13, + 'days_ago': 22, + 'meta_description': 'Essential design patterns and best practices for building successful microservices architectures.', + 'meta_keywords': 'microservices, architecture patterns, distributed systems, service design' + }, + { + 'title': 'DevOps Best Practices for Enterprise Teams', + 'content': '''

The DevOps Culture

+

DevOps is more than tools and processes—it's a cultural shift that brings development and operations teams together to deliver software faster and more reliably.

+ +

Core Principles

+
    +
  • Collaboration and communication
  • +
  • Automation of repetitive tasks
  • +
  • Continuous integration and delivery
  • +
  • Infrastructure as code
  • +
  • Monitoring and feedback loops
  • +
+ +

CI/CD Pipelines

+

Implement robust CI/CD pipelines that automate testing, building, and deployment. Use tools like Jenkins, GitLab CI, or GitHub Actions to streamline your workflow.

+ +

Infrastructure as Code

+

Manage infrastructure using code with tools like Terraform or CloudFormation. This enables version control, reproducibility, and easier management of complex environments.

+ +

Automated Testing

+

Implement comprehensive testing at multiple levels: unit tests, integration tests, and end-to-end tests. Automated testing is crucial for maintaining quality at speed.

+ +

Monitoring and Observability

+

Implement comprehensive monitoring with tools like Prometheus, Grafana, and ELK stack. Monitor application performance, infrastructure health, and business metrics.

+ +

Security Integration

+

Integrate security into your DevOps pipeline (DevSecOps). Implement automated security scanning, vulnerability assessments, and compliance checks.

+ +

Team Collaboration

+

Foster collaboration through shared responsibilities, cross-functional teams, and blameless post-mortems. Communication is key to DevOps success.

+ +

Continuous Improvement

+

DevOps is a journey of continuous improvement. Regularly review processes, gather feedback, and iterate on your practices to achieve better outcomes.

+ +

Getting Started

+

Start with small, incremental changes. Automate one process at a time, measure results, and expand based on learnings. Focus on cultural change alongside tool adoption.

+ +

Conclusion

+

DevOps practices enable organizations to deliver software faster, more reliably, and with higher quality. The key is to start small and continuously improve.

''', + 'excerpt': 'Discover essential DevOps best practices that help enterprise teams deliver software faster and more reliably.', + 'author': authors.get('Michael Chen'), + 'category': categories.get('cloud-infrastructure'), + 'tags': ['DevOps', 'CI/CD', 'Best Practices', 'Automation'], + 'thumbnail_url': '/images/blog/eight.png', + 'featured': False, + 'reading_time': 9, + 'days_ago': 25, + 'meta_description': 'Essential DevOps best practices for enterprise teams including CI/CD, automation, and monitoring.', + 'meta_keywords': 'DevOps, CI/CD, automation, infrastructure as code, continuous delivery' + }, + { + 'title': 'Data Analytics and Business Intelligence: Driving Data-Driven Decisions', + 'content': '''

The Power of Data-Driven Decision Making

+

In today's competitive landscape, organizations that leverage data analytics and business intelligence gain significant advantages. Data-driven decisions lead to better outcomes and competitive positioning.

+ +

Modern BI Platforms

+

Modern business intelligence platforms offer self-service analytics, real-time dashboards, and AI-powered insights. These tools democratize data access across organizations.

+ +

Analytics Maturity Model

+
    +
  1. Descriptive Analytics: What happened? Historical data analysis
  2. +
  3. Diagnostic Analytics: Why did it happen? Root cause analysis
  4. +
  5. Predictive Analytics: What will happen? Forecasting and modeling
  6. +
  7. Prescriptive Analytics: What should we do? Actionable recommendations
  8. +
+ +

Data Warehouse Design

+

A well-designed data warehouse serves as the foundation for business intelligence. Consider dimensional modeling, data quality, and ETL processes in your design.

+ +

Real-Time Analytics

+

Real-time analytics enable organizations to respond quickly to changing conditions. Implement stream processing technologies for time-sensitive insights.

+ +

Data Governance

+

Effective data governance ensures data quality, security, and compliance. Establish clear policies, roles, and processes for data management.

+ +

Visualization Best Practices

+

Effective data visualization communicates insights clearly. Choose appropriate chart types, use consistent design, and focus on key metrics that drive decisions.

+ +

AI and Machine Learning Integration

+

Integrating ML models into BI platforms provides deeper insights and predictive capabilities. Use AI to identify patterns and anomalies in large datasets.

+ +

Implementation Strategy

+

Start with clear business questions, identify key metrics, and build dashboards that answer those questions. Iterate based on user feedback and evolving needs.

+ +

Conclusion

+

Data analytics and business intelligence are essential for modern organizations. Investing in these capabilities enables better decision-making and competitive advantages.

''', + 'excerpt': 'Learn how data analytics and business intelligence drive better decision-making in enterprise organizations.', + 'author': authors.get('David Thompson'), + 'category': categories.get('best-practices'), + 'tags': ['Data Analytics', 'Business Intelligence', 'Enterprise', 'Best Practices'], + 'thumbnail_url': '/images/blog/one.png', + 'featured': False, + 'reading_time': 10, + 'days_ago': 28, + 'meta_description': 'How data analytics and business intelligence drive data-driven decision making in enterprises.', + 'meta_keywords': 'data analytics, business intelligence, BI, data-driven decisions, analytics' + }, + { + 'title': 'Industry News: Latest Developments in Enterprise Technology', + 'content': '''

Recent Industry Developments

+

The enterprise technology landscape continues to evolve rapidly. Here are the latest developments that are shaping the industry.

+ +

Cloud Provider Innovations

+

Major cloud providers are introducing new services and capabilities. AWS, Azure, and GCP are competing on AI/ML services, serverless computing, and edge computing solutions.

+ +

AI Regulation and Governance

+

Governments worldwide are developing regulations for AI use. Organizations must stay informed about compliance requirements and ethical AI practices.

+ +

Cybersecurity Threats

+

Cybersecurity threats continue to evolve. Ransomware attacks, supply chain vulnerabilities, and AI-powered attacks are top concerns for enterprise security teams.

+ +

Open Source Contributions

+

The open source community continues to drive innovation. New frameworks, tools, and libraries are emerging that simplify enterprise development.

+ +

Remote Work Technology

+

Remote and hybrid work models are driving demand for collaboration tools, virtual workspaces, and secure remote access solutions.

+ +

Sustainability Initiatives

+

Technology companies are focusing on sustainability. Green computing, carbon-neutral data centers, and energy-efficient software are gaining attention.

+ +

Industry Consolidation

+

Mergers and acquisitions continue to reshape the technology landscape. Organizations must stay informed about how these changes affect their technology choices.

+ +

Staying Informed

+

Staying current with industry news is essential for technology leaders. Follow industry publications, attend conferences, and engage with professional communities.

+ +

Conclusion

+

The enterprise technology industry is dynamic and constantly evolving. Organizations that stay informed and adaptable will be best positioned for success.

''', + 'excerpt': 'Stay updated with the latest developments and news in enterprise technology that impact your organization.', + 'author': authors.get('Sarah Johnson'), + 'category': categories.get('industry-news'), + 'tags': ['Industry News', 'Technology Trends', 'Enterprise', 'Innovation'], + 'thumbnail_url': '/images/blog/two.png', + 'featured': False, + 'reading_time': 7, + 'days_ago': 30, + 'meta_description': 'Latest developments and news in enterprise technology including cloud, AI, and cybersecurity updates.', + 'meta_keywords': 'industry news, technology news, enterprise technology, tech updates' + } + ] + + # Create posts + for post_data in posts_data: + tag_names = post_data.pop('tags', []) + days_ago = post_data.pop('days_ago', 0) + meta_description = post_data.pop('meta_description', '') + meta_keywords = post_data.pop('meta_keywords', '') + + # Set published_at based on days_ago + published_at = timezone.now() - timedelta(days=days_ago) + + post = BlogPost.objects.create( + **post_data, + published_at=published_at, + meta_description=meta_description, + meta_keywords=meta_keywords + ) + + # Add tags + for tag_name in tag_names: + if tag_name in tags: + post.tags.add(tags[tag_name]) + + if post.featured: + self.stdout.write(self.style.SUCCESS(f' ✓ Created featured post: {post.title}')) + else: + self.stdout.write(f' ✓ Created post: {post.title}') + diff --git a/backEnd/career/__pycache__/email_service.cpython-312.pyc b/backEnd/career/__pycache__/email_service.cpython-312.pyc index 76d608e9a73d38d9b7f2d6ef15ab7fd729a7d4c4..b11b2057907f39cc361d6867e319bd9e77531c27 100644 GIT binary patch literal 7158 zcmb7JTWlNGnLfM>?-EJLx=<9QkwnL3WL=!7j!nBx6y1E03lu>f?4k`;eOPP)2Uz!|bJmtib`>QupIv3cEAmo3sVI+I0^5|cna)a=MH>F9& zG-t|~=gcN-o70wzbBC(3r6Cj<=aPubE5{-uX7+UAN37N#D9P;(36Lh*@o&$i$NAvny#iIhvLQ znvKcH>w=^dwU0I4S@K zv>9GV$JSLFv{z_0ZqY~9akueuK!R`4h5X;!QbV7+*9_=1&l^X>k&{tba@E z0;tvvYl&MHQ!TG2O=b+eVMJNt;Ntu6|L34L>ukv)c9%4^gr zC2!fV=-=@(SUcHoa5fm@yM9LAw;FYrr)9%*4OWJ-aJ)_3k4g12p9N#=IqhGLtQy*c~v`W@2Z;(|}#1#`^*<387 z^ROvc0rwEQnv|DV+yU!sT3k%V*@Q^hWh(M3+7<#7o?XYB;VoB$p8+DYhs?+4{SfO=cxImW>N#wW>`T zWzWXel9`nZn_bB)2$U5QrP;@1S;#EQQdvve%~5t7H#NH;$g6^o)ns9>!x%7mI4OKZ zUQ?Xa_I}lr7ep}~WiQYbflVe1o5dv1&dRK`5|6{jBv#Vt^@HqWEG-GFC@%?gH7V)S ze}E_DLatf+R8->G(nQ&ulTE-12z-=%fTw&W7o61Etc;c|uTU%jC!Ec>4Mi!+PDVT` zLtzO7Y6VTzDlQ9Im5HZCNl>k*t2!sv;=(d|0o4Wz3zDjRHAb^=?o|u80@W%fGlI%U zX+c<48G%xfMr>-sQ%gkgG*Z~UM75Wut-31yMKuYM4VbvJEc@i>(2|%Dh8DAHL*s&U zO%|7jre?lBaCzd@p@mrd+C-KgipQuR&>?*gNubx0aba+IU2WxX(wt7mEvY%BbsB=+ z@gz(4A$yBF?jZXDH-pEd*dpdVKT}2yd=qPx)@}9085BsO)wqi4=7M~{`|6d=s5MSUSaX3SJo~ED7yfdSO zhHtmsIrPim?S?yVd?MXD^zrq(OG*&>eC-Qw>&@V2-teAp-woHhuAAT89{r&07t{IR zp&j1~d%pHBeXTbp%%k#>mA1EPi$M?g}+dBVN z^uvfxq%Qcb_oAbI^Y8u6v3BP79i#TKX66si9f17fW(G)ckSHg^?>_1T(hVYzITKIj z%)DvN!kgbFb5`C0IRmkRQJcmzV{1F_yl(2;^QDS*%9mnUJ`MYU)mLQzj(SWMN{&H_ zmm-fgHtqw>|K9`Z4dR4|xM50_r&Xz>s@6Oa(%ZGHO*b_ZhTG37*;fe)ZSYk>M>r2Y+9Q6}%N9OUY83 zwkkSPMYqc>#wZ)+4I9K9>qoX*B`a<^HXNxs5o5#7+l`)0L=KdDaNH{GolWP4lZIu$ zJbFsu8LLUWqyB2(N*et@6m*^^RsD3=bOKG@`K*3;*ZY>IdxDtF8a+VF9@un!L*H(> z&ye3JBPyIB@A;^qVgrbYjhn7FUF%-Gtcr-f++oe>qxU+G4i{WoB1toVro?Q?*Ml#P zEib2&@mN+a3+LKKb($tPE5rqWUpza&KJg7DGZ5RPA@I54;4m3 z0w*Wsw4i#hnik{Qh^nt7h`n+=oJG}v-Eb>34WKP43s}qbm7Hj`aP`CoYP&OAF`>JukY0DU`a{Fr{SM_`< zhJ4b<>cOmpICFj9s0N|;LqM#;TAWK}6XMKdq)D}a(Nsn=AVpWAHjPhAj$WL;z)jAc zJIhU+9X&M-5e?yu>crTrn;mRfva?4soxqoDeE!sh3GU+TG(~Jm(aot%5ba{|B`#J$ z*IF#12qX-o#BEJva7ya+y5WlUw8}bkvw~3H#}4bAJ2!6?{yz2bPwmd zhn22F%ArxE^VPl1aG`S`-#PG?276oM*3{#Dr1PM1@O9<<-2LE{t?9jBzjAO^xp3uv z@aop|V;gDd-)-;SZRyz!?%!<=K6WxKjaw5%4{2yBc*1#4c>C(@V>_OgL9%V&gNyfD zU)-AdA8+d(1ZwxYZl&w!o&G}fOg?%>IXbO$p55`y09M!++?si8A^tW!n2+DRQkb}u zpSYxqUsf&)N+_}8Tik8#*qZt4m)`b=#Ow?pbeMi;S_z)`opkrmZ?E53QUX)T?4_;g z9na;x=Jvl88IaP${XdUe#{0=9wlL=X&WRq&CnJ3mot8g#GElD{cK;vT{y!dec{8}* za@d8HEhW6nKtL{s;d+60(^AE+6Miu;Ckb4f>W=W92|}DHRVTy(hXGEVFbf+p2((t%}}WMYqf7HML{_ zCYX7hJ-BH4C~&Lv5TOC7?;3iQ5`a`k1w_=h0NoED?4^p1QL8VVI%4oEWd#Ds#|-L5 zEmS*ha8fTDwMxkc>wjY%s8;D`w4!g+_|9kb!-wiXwO0+j5>)&8zPscJL%s&8b$`TG ztPD_Xp9a->^s)-7_2y2O(U%6*vZ9Q|3axA;f#umgCnav8T26#iUatFDV z8Q`227ueAXjEk~43m`a(=S=mMB5GDH1??)r@{*VpC}L057hj?9z$SCcBEU1eYkLh! zX(np(x)7rhCnh*yZCQYKHh9=jJ#q0mJj$iv9S-j04a*{x6Jk24BRvn?$*u`}GOOV} z*CO18R~EFodsSF4V4&*7{^D?7j;_HAruLA^%Eu;kwVV&B5Hj4`! zPDAABe)xhJ+5>sSqPnOctz{)%(Ri^_uaO7L|fiFSm zuqGpYbQnsC9*T}&h8~R~d{P_6&YgX2bmk2miRw^}(Ra-x3Qb{l60=j7oyP18X49CR z#cT$%bC|t`+3T1ch72EPah+5P+yp4Po(gEC=wASS>c|z};Z*B#OkS!0S9%l`p2n>- z3bgvz^0}`d#p;E@CuPmlxuf3(WY$&XaO~g0MHta$6w&6u2iN{n{7@_mj^zi(l!5WP zWB1&Jlk@qL^UBl@lveI3=(*R<7TO2%?So3&5I|2`OIzcvkKOLq@n_Kj?Js;i+s6uh zBl*6OA_HwecmCco#f}sQ@ps<5Qh};PCsJL+-?x3H5Pl^eex>L}il?M`BHwqS*npHq z;(u=Y$Atrv`2&+hFH(HO-@WbDQEt(XlqTY5w}XYAXuc;}Y(~nyYMBl=CwlC zNWN>N*oKsL;_tfo<3ji0eD~pE04W{SqX&`FSxpHcrHlA`@avD~dyf~pk-}Dw-h-6h z(sv>JF7_cMOpcD53P(W0rcID{e_PH zd`G_$IQZCY)4+OTEm(&|@&yatp3l5JyS|o!uO|8~pDONIGtem<*Q6%}z)3B9@F`=@7M`teWB-}8Tb z>F!A-a8~&~Tsw9=^R<}%Watz_?y+IWKV_V!j#)l!>^pVX^66m)>ND^N;NY}dD95QT zj?2LFI(TJH^>EyeR$^&<7J!zW<9IR7aTKE~orCN{@(6OG-SsFwuxQy3R3t>cZ<9Y+ zM;==HnZTnt(+MU(e`ttA%n$G)y9hr>#g`*~)yHd(_JeVe3WIn#)~>qx19EGLhfnDE z2soG)WAL|;=3G>FSuvZ?FWh!~QHGa8iZ4{E6aICY)}EN@6=>^sWJ?n6v`hl}(cTus zwC;wqZ@^=(PZc5Z6UTAg9w#V*e|)Br(Ek-JCX?yE$=K)Q#m@=*XVUm*;{L+fvDH>^ vcI2HMH;>$RhTpRN#nx-`-4B&htVVLWZKYIwNWE=B)k^81oqw^xjnt9-%|GA# z^Y~}J`RzYD9-Z9$#$qudTH2<9iFF%7KSQHXw0YxTo*M5W0SQbJEiuy!1GXlqSz@PI z)n=30C2pEiZEaFFt^!3jXVwb=^9< zuHEH!^6_mL)(s0zQet=Z9BqU_lyeov9M^(=_b37eNfm{jg-UXPZy=q#xqQtSL{e3u zqZZ-D4PL4sW4w33B-Ir7b-r*A@1qYjf^pYe2!cUVNU&`1Z}MyU!+M2TL96T(T46#~ zqBEY?gtTPQ*rT}?BtIGb#7$!I2#6jM@ijWnCQ>;>v_&Q#;;_S1fY zxEhZpQnTsFkWFS6(wAjUN=Qi&bL5e!U&L@6n57`wW0Dk$&qrfPNyMp`l(;I&+KiYI zWL+{nHz#6Q3-ieQ&}v*CN^BC?#8(q>v1xft_L9HNUh|Wgl#+3G zBgt9ZO^Oa#?03d)k8NMPHTKwC|BKmvXZ-f~zNhW}Vy=B8+di`2Ho9MN=COI~iNi&P zt<9})=Wh+v4TR9c5I^W+AGQPsJ?z&Wj@t3Oj;RYmdisUqJXrngzE#v{gfbGgyGVnr zsmqyQK4z$j!{7%+C@)g0u84OP@p`G5B*jO`S!we}N#xr==2tYj__YkB=9E~9iPfXiux;gw?# z0Guj@>y<47uTGrnpPY&gP4u5Ri&epL%k$}!h?~Kw1)vom0?-BkCyqM+IsxE-F`Oap z0q6yQtRU;~j2e>6(wL4P9ri+}DgW|j=_{7C%Q0ylSHnmjfFA%d2o3-Q0ct6{^pJ1^ z@w;ZNu(Qkx6(s1tjlARP-*mXFPfGpU^|?StHqfE4wEeWSX1gaBjAVlmg`;iyAZ&pn zMh}bu*{Zf)|0w!iH0N!}dRr78SR=9px5sm}r?R!D6caG!{K&p+uuri7V@0;Q?d!Rd z!`YL=N{M5WQl-e|+cxF=omqdUVgn~TviY|wb2Z)Bnr_7bOj)sy6PR*j^KLEXsw3Iz zh~fgK0@a!}<$W{aK_htjViVvLp#mmq5@Bi3`qSZ`c4~p zuC3$T2j`eB&W* bool: + """ + Send email with retry logic for production reliability. + Uses Django settings from .env file. + + Args: + email_message: EmailMultiAlternatives instance + max_retries: Maximum number of retry attempts + delay: Delay between retries in seconds + + Returns: + bool: True if email was sent successfully, False otherwise + """ + for attempt in range(max_retries + 1): + try: + # Test connection before sending (uses EMAIL_BACKEND from settings) + connection = get_connection() + connection.open() + connection.close() + + # Send the email (uses EMAIL_BACKEND and credentials from settings) + email_message.send() + return True + + except Exception as e: + logger.warning(f"Email send attempt {attempt + 1} failed: {str(e)}") + + if attempt < max_retries: + time.sleep(delay * (2 ** attempt)) # Exponential backoff + continue + else: + logger.error(f"Failed to send email after {max_retries + 1} attempts: {str(e)}") + return False + + return False + + class CareerEmailService: """Service for handling career-related emails""" @@ -24,26 +62,31 @@ class CareerEmailService: 'job_title': application.job.title, 'job_location': application.job.location, 'application_date': application.applied_date, + 'logo_url': f'{settings.SITE_URL}/images/logo.png', + 'site_url': settings.SITE_URL, } # Render email templates text_content = render_to_string('career/application_confirmation.txt', context) html_content = render_to_string('career/application_confirmation.html', context) - # Create email + # Create email (uses DEFAULT_FROM_EMAIL from settings) email = EmailMultiAlternatives( subject=subject, body=text_content, - from_email=from_email, + from_email=from_email, # Uses settings.DEFAULT_FROM_EMAIL to=to_email ) email.attach_alternative(html_content, "text/html") - # Send email - email.send(fail_silently=False) + # Send email with retry logic (uses EMAIL_BACKEND and credentials from settings) + success = _send_email_with_retry(email) - logger.info(f"Confirmation email sent to {application.email}") - return True + if success: + logger.info(f"Confirmation email sent to {application.email}") + else: + logger.error(f"Failed to send confirmation email to {application.email} after retries") + return success except Exception as e: logger.error(f"Failed to send confirmation email: {str(e)}", exc_info=True) @@ -78,18 +121,20 @@ class CareerEmailService: 'notice_period': application.notice_period, 'application_date': application.applied_date, 'resume_url': application.resume.url if application.resume else None, + 'logo_url': f'{settings.SITE_URL}/images/logo.png', + 'site_url': settings.SITE_URL, } # Render email templates text_content = render_to_string('career/application_notification.txt', context) html_content = render_to_string('career/application_notification.html', context) - # Create email + # Create email (uses DEFAULT_FROM_EMAIL and COMPANY_EMAIL from settings) email = EmailMultiAlternatives( subject=subject, body=text_content, - from_email=from_email, - to=to_email, + from_email=from_email, # Uses settings.DEFAULT_FROM_EMAIL + to=to_email, # Uses settings.COMPANY_EMAIL reply_to=[application.email] ) email.attach_alternative(html_content, "text/html") @@ -98,11 +143,14 @@ class CareerEmailService: if application.resume: email.attach_file(application.resume.path) - # Send email - email.send(fail_silently=False) + # Send email with retry logic (uses EMAIL_BACKEND and credentials from settings) + success = _send_email_with_retry(email) - logger.info(f"Admin notification email sent for application from {application.email}") - return True + if success: + logger.info(f"Admin notification email sent for application from {application.email}") + else: + logger.error(f"Failed to send admin notification email for application from {application.email} after retries") + return success except Exception as e: logger.error(f"Failed to send admin notification email: {str(e)}", exc_info=True) diff --git a/backEnd/career/management/__pycache__/__init__.cpython-312.pyc b/backEnd/career/management/__pycache__/__init__.cpython-312.pyc index 4348b5b77970e7ccc19ba0dd1b703383889d9e4a..b0b7fe1697c81e277a86973e9523a3651607612c 100644 GIT binary patch delta 34 ocmZ3*xPX!8G%qg~0}z--DrZjQF=DizXfMT@l$f0DIx)iu0EMpzaR2}S delta 44 ycmZ3$xQdbIG%qg~0}yOcf0{9o$B5B$qP-Mh($ delta 44 ycmZ3{wF zHB&QVDJ>nl9gER;TWVXn=5`Gq*Q9FGb+_yIxHeUvZn)jR$91WAy76{nOxvbi)Xe&C zYi5HL`?N;Pd%LL+Pc%NFlSHhz{hZ-h<4!tlWK25Exkkn_k~!PS;544I(-w0w7RHS< zHmy|7p!+U6^V5!J(|t)XuQJtsc1_=W@G3{jYDI;g;rjaw|0iC{T=a%$|yz68wBcm@n^Lkb;?deV?RY-0N zKtR+ZOrH#K0Pe+>6-a@b%$T{&tod23qDf3EXo)?Cib zTkPa{eqA?GDc!njdpSF^7y)J8TEOjqjl+-M6WfaQf|SMDB`cK$-I@*4oHN|TeA>$7 z@O!Oir51|yS;O@#*CRZ1ee;dcB`0l-E@tkIp0~V}oRb~Bc=gTUn-k|o=Z)mbM8+IV z8m?uzqu`pcXwh7wNx?&JRIYE$S(0LNpqMw3EfiaVi+ij~l6)j|c{^b6_Tuoqwh?b# zkN2#_dp4T8H#+xiv|lJSXpOzU(P|r;o)9&YLDJUa!VdiRWE;@*)nm_Wl+!(olQ?uq%36=UcrsW7J{aE!28sWF&tQD>wbskA9%fPQe`vovYu!z z)+}1NV!f9$oqVoXx9ZwCt61md3Ms4DFmq#kd}3zCt;M2H+MJWNlf@ln@aM=F6?Z0G z3zjLYS#AS8)8Nc6TgjYPtV=q1sCKPOGE}UEu6xD$l~wxJ?ZPFGmeBF%k`NW^mtc5P z7Hd_?D9(vJ-k;+DE$r&~@b>p_f86|u^|0&I{ia{Vo4>dHJKNXed)DH6K05eENB`jH zdiT&;_t1mkw;y(Y^Yi%JuUmGnx9nSM+4r!e|F5ALY(8bUV1H`adworTTNmT`CV zZ&^C7;C0+dbd3Bh6DuNrW=u(|`WN;fu5Mc9Zdjd(f0tXr=X9o||Gn5Vo_&htc)Hbi ze%#G%_hLVUo%^wG>A3D!0wl&%WPSV=@{!Q}u%9H|ZpCW4 zPRcE&GIiD(zKiX>h6hRObfJZ&?gi{X|J6j3OIFI=O@}==6dP`iUB7zi>P4=QF1avw zA6>73&o0)BS=?@1No*6!*+hs=#jT_X>>j@@tiuklXdRoCPD*5dmf#{1Xf18ebt&*Mi! z8uroEPhS3H=;xUS-4mb3FNA*zY5mm0?yG+pzvdDPL)t|KhKEA4koPa5U1gn#X*NPm zv*rgev(~J`vEFRJF>W^E*ko?UvDs|FvDMsxW1HEIV~5#^<4&^+#}~|9IPNz0;Mi^U z;Mi;S;kb8EGxz-@hLMg@KOgPK=m3rI@4=tY@z76V=3(=QIbbHtqd%(u;~0l#5Ko1n z8N!t&a~Q{Fa|Fj$a}>um^B9gD=5ZXu(44@PZu2CLz2+$#37XSBG%xzld__X@5{Kri zfaYZm&DR3ZoWb*9XasG(j_ZmxuVCC}zKUaqc^1boG-J5ZZJxui*Br-@pgHeDGvPyX zK|*tpL-U%X%_Z}40Gca!J`7EeHk0_Z)fCVOPEFxT7@DiN(rsSDvDci&k)V0qhvvEu z&5VR*mP2!+DsA4t^R?zp9K&++CayG_0-7MF2&OPJw{WG~yp3b8`3)Qinzwvt-u9vS zri5mWL-US==8|ayXfu!JYt1B%VQ5TTQP2n}CW)yg#TKr2n+rJhnu|CRG)q1-whzs+ zgl2_9laibo2yrTn=WERjj$vpVTv5;nPGxbW!+aOVFl}61={7wad(9k<1Wn$D=8g}| zs)Xh)ho(@KHVn^iEjL2L1*iTF?(E>Q9ERo|u6LX7;n-__3rB+HcYJ8x_o4Y+3C-_u zX#TDb&9?)b`g?f3*8KZ8hH3Nrxbl3oxsN-$&F|pYYyJZq37UWCL-So9ntvpr`NtfZ z?^T8713X`Aejmp$H2(xwl!pHR<2Li3;@H8hPM9|T4A;BOe~x3X`5}%3%||{of8ay& zFC;WS{mB)l;AU*X7^et9?e)R3+lNS9`DKXMe0#cncZSdv)*C->Y|L?`<se-QQSU}S+p}Ke_-0;4lA8aIR*M*E?3A}tda7> zVX9RXTT)Kapb8cL1*ukH-nGqQTwP{OlTOBTGDG@}E5%lgP%VhD>gL=V2#Rdf;BW1XSxwM_J-}#@o-@jnowd0d9t++$pk<7a;W+@bF zCT?6Ww#chAw}T1sFQ2j4E`LBphL_fi6#MF+K98PqllNZFx!&j=H^VxOS(3{olT$1+lZ^ZBmkdJS-O$UrffkZPt@6x z`5Yzb!6o{4*YdJJ-zFqbc0-cD zMMW%W>S@EyGffM?a+<({eLmG?9;E0WYU#T`Jz8^f02&F4@4}6WAod z8k#nn1$FZoJ69kKRvmXmP|(m(dw@Jzroh0-0EvtP9@%$L9&{aEC>SX=ONk=c^%4zi zSjiP=t8*##xE4s%=(YeYH&4yvTnBJqLU4j)v_QnVZUO2c{i=00H?r&v0c2C3g<{Nb z8DIkwzC;UXrwh3yCo_6}*~lz9Iw*M+G{KW>bjC^9rk>A$L;xgXa-k~7xfKDHq zzC;8u^^2~NU3z_z9jutz@p6ly_EYi|8pYNC>2dM{G|0a#>5#+?+j%5mul zUb9ZRj^_<8)BI-wC3`>B2P}WW2N6=O%D&bmSyQcsg?pcP+ zl_eg`p_MZ^*PhQ~VTdBvT4;3&T9LFpn2F)ELE2bseHVtr2A`O0U@AKlui{uI{@IV zKwrJhLs8MV1F!)Xs0zTHls<6L&L!BXi;h!8;yh;|hXNWp0z%2TCIAg9SpYXT6BBon zR*EzZ)1}j(jzCW?PRxVHNZH;}qK;KSavsJMh!Wga^7F6;sQ!EGr7Ia{HN|ZplyUsh z==ga(YiF$#9FNDLoiyfgeMkr3ujS|UG0tKy!4CPn;N}_ZAjbmw1Ps8-4V$p}RwhW0M4XmRXDxVBvNOVy2suO_qwF!*vDdgC z6c&ptAjp3brIrG^Dcqm0zX-9?y@$ zSx&+wa(hdp4038d4_A`Y2mb2!es*H$*s)`yy8cgw) z>?}KY;dzgf<2%LkVQ3QBbUdo3#bNzK?o_b zaO7msSjPnz<(vf)NUMb4rC!jH?YPeAsSk))DDjAjGc0~mh7k|EfS z2)xapVi)()irGPVw|o!lo*@RqK7koLh!pBLJ~K0HXNE7&kXfBI?9{3ahT$q3z7h4d z%HIKQ#Bugw24LA4xTO@V)bZ%dB$yV2U3CTZ0XW_K-68!pR25PI^AxfrGXA-2+%ZIa z0NI>*aWJvDYYGogoJ9>-lbcZ9O+@wgxD@Olr%2!o-lgFISw!I2u}cWjd7Dxp;T61` zl@^W^MjN3VneUW6?;UNV!H7WMu^=QE1B%BMluQWU=bj}QI9b71F5Hr2+`r>_ zkkN2W_?MgGV;2*f2e~_Zwols=6$4}lZebn@%#MZFZDed1Lb8WGrS*Xeh+iP)Qx5%* zV7sD|sqpSV1qw40*CLTJI~#qPxWLT_twKr<>@MTlkO)-uS^4`UXMG_7H`afFclx9b zb3-ve;S~9CA%vUVRXkl5oJ2D`e-QMpYACq}It~BBEq`Kj-!nWG>!@^ln|-fEvMdq8 zNI$dr!i5xe2T)Q%a1-K7u(aOh&XdO~eOIw|Y-Viw5jC+{KjJVhh`!s<2STBFg6%kG zxrjdya#$207Fhh0@*Erg1)k&o9E@pf|Db;SB(gw`qY47TDI|MEB!R9o&y`#*98^gj z+lv%Q0Ks)dlAAcHctdVN0WT4YWOD3CIhGD) zaut+kr=r@0EjYmp%il3W#Q`K3T-RBp;s$6Z4KnMGPR+A5?){U<5WovI5V9qKxS4`@ zd;h>6;W;xQ~6<(n4;GT!y5FPahIHmher#kIuV!@}Dy8D#u0aXxXnI^jQMw zRp`$h5-uSqlQ8X(=^vbpYvERpf@I+%4n+)pF!%A~6DE=#vD42;jDl5@Kz#6(=W!s&X1G1!^$k6n%6kdq zNynm~jbs0lTj0Z7g7rnG znn)RNE=dpRL~;p^V}BK|!1M63Mciz!NPbwaH1i?tM6EANdYY#evhOGYsm$>qawQ^_ z>6^~aql~8W&2v;0(gD^AJ*ACc{nRL4|oU5yYPs1B(NP) zhE##`5e%(nzyA{KdVko4Bkh?`AR@S>1dE*&W}RfwuYypRFKR1xX2Auy+&s@IIUgfw z?TE3nY}mu$e*~^j$RC-QN*n>3UZqsW!&5TuTLCwu+bUk9+ah4fY7JF6>DMJxigd)U zHcBrdj)K9ZnU#<|Gdti3I-!&V>5xRiC?J@n(v3=6V9!T`_FR$!(R&1W%a8O~LaKiG z(w5b(!^o$7!_NgaU|a)5iLXQzKu{* zeqjQ#g8}d03qe!@*x-~{UKi0oIoFj{v!FPz{<4$sEY#tt?ijA`vcy;(g$zoa&}NX` z1P&~f-v~!(=8%}|pLHE5yM@xalZ!wP3+m-jlC1MR`lOx7-yOY?vG3}JNnHXcpa{UF z2dF5=%2GYn9Kg=pr6FBJ0SPuxVJcCnQb8u^yh4uc#9WDrDYTZIXK9rFk~-g@KG=#4kw@+p*|3Xd4E7sk@aYhBZT4qYW} zaAE09q_cziONUgAiuMqT(haP5u(!j;s#bE4)aFG^kLT5vZ)3`p95CC2VfRLi16!GJ zzb6p}J!HyF5t^yKi;qmep7V4JoW;InS-zKR%c_G+t5raPc!<(u9`Op|pWxF87X3i5kRym90WDLQ zom2swpYucUSCa1ac>%TEX!{ZHR|H+*IW~Uq?hr%}9YUr7C{w1LyNtJrL$Gy&_I0+64p`w)-V1 zldI@`B7%V84-px24s}~)e~EnX@Pds>G8tDvMUM@l5>8SnnDGo?k5vTMG92TqcFGZf zKmGnG+2iBrTX)ca@M~l;OJql;X<5)fau%6N(#qzzR3dR(u~0Uq_7+QA0_n*Cpf)1m zm!&UU;KW|AER*s$SWdj6@YD)WNSLId-y7wigh)Z!8#1%6%}z~@q98~xAi!mCA(1Ye zsu`o$x*KLjgJf`$V%Gzyzp=cN=f ziHNtWh~VY)IR~W=ud;#239q_I#54ptiMUJe#jv5Rg8gcSmg#-nS)U-#S+_xqU<+eA^n~yN7ut9g~S-Ou(7HF4oq-ih&fOp zcfd}KJK(XMA?Lw!x1e89c_fcj+(npBQH_Gd?MJ~h(s&=3IyZ(Dsq2I=AhD@>?1~Ez zccL6%3Ptvk)nAXAa36L&FJ2N878C_|+cl6`2!k^3z`7;a-U=6k05=eV^hcwK3$&pr z7)}7GowKxIh550Pv7O zipDUj^cGpe^H}R7X}5mI$%D%XFuJQX0AT5_&(5;lv$W9(#uD#S$|@%|I-vi|T1b5< zfaCk!inVmg+RmZgg)JKy@NfpZP%`%PU!Y8sZ5QSLU`Bxj{Dy=N@#!jcB9qoBZ*U+~ z!I*ApfOJ7_=L&-gr$M08_7HSh zP)ZXIOw3M_h*53Q-@o;YCiYK`3@Sq&s{;#Y3g)W4611Y;#DT%-f50 zf=vW;ks~XzbpC9ai2A?`_P-#ISi$C~bN1rvD8Lt}WoN=wE?}q5{tCqd#YZP5XUkM) zFH~d~Tv{VN0M2MZW(B*)4*Riv7_f*?vV);sfm)k_27mhl;;RD_R4kOdYO^8$gMUzr-s+SF*5NK^IiF*Cbvzak0J#|+*j8?G;;kf$0u`}W$Y;3>>v_S3$Kso9(N3$&>o4CR5*|7s zH!MZA0@2Ril&Z6MY)^&p(`A>KZGU~tx2yKqA7ReUDtm5FjuN7?h196Jg32O%w>Dzn zg;=#0Hdsp!EX!kB-(LDFpoYlP0v^pg-Ck1rir7TqZgjKEkiLpiC;f`n7%y(pjvR=t zFp$W%ME#sX6Sa0Eod0qv=l#Jt%j;vK3h012d^IXwbdQ3Y($Ik!be}SIo=VdN%3y)T zbjm0IMeGxWISR?MS|J=cR|XOY738f|WLb6{lwPxLX|jzRc6agQhgY`Xl~StAjh7z% z)~3aCB++3+Qw<+gVEaV}k_?F-{6=`g_RDQwR86Bj-wKsgbS!o3c{j2Dyz9EfdrUNu z$TQ~ii-aVo(5U}7) z^i_huLwMOgW2LaQAS$5cd!&URE6AlZSOJJ6hT&qLObaV&Zs$&%D}%r)w`xeq1&IdE z3j@Mq8fDPRkd>LtP>ZD;Q?G)ePnSd2XjcRFmm|I*6IuoW0s>EkT>TF6y@O*i^;Q%O zhH@N|>(?%^U2?%PG%{HmsIY?A2(7k`$O@XUg-8zl#9gFYe0KOzB=atH@kT3Cbm-ia zuTrSDk(QS?#aHalK>)XiB!Z(vI~Di}Wtas+QSIX!2VsP%e*n7p`MTucD6gA{N}MQ5 z@rm$2s1P7R*+7eLC@NOisXmiM-x82}*dT;NhkO%uGrDjNheH;bHusT!R&a~$dIOby ze8NLelLS+OsYjQCMxbtNg6}!#H1hSsQ`8xxD3_cYwjNRm0sUgW0flF?6v<)}AWzM? zC1yv;1P3grjo_J3maO(a@HTqYM84c6BI3-GeWx(eeTxonlT}Aif}}(WJTIrh%lf7A zJNQxvzXSWnAsYtrscDDX_xN$O2k*1{n5SnD&2+pD!pjNK_TJfxFnheqK!rLX3?lvE zVgyQ3AyU4F1vXKf0WvAuh&pbpx}AR(@Zm^PD1@^30-vW_e6ZTfLNvj*ArUMt6v*In zG(|jDT}tn3^E;Y8^E{@SOq&X%hB4 z09r(06??D8uTS}ff&tDEs8tgAvs60tnWH5%$WSmC@c=Ppgv#WT?O2LMbvy)Kgi|RRydqf{0$qtOQc`p zeF=aS-0X}+$u;tMB2`Jsk?5r=$cjl#tpe)|88V4SMTQ}1$=g;9qS|;cSd!$m9NdI= zNMS2TG={j$;!7=}cF#ZN^0Llq@R239n?ALK zFTr6)1BA^iK;fu3^0J<%7rOb!o77XRyZo9(@C$AOUIO28*6kD*%ZO(D$D4ImOmfm{j-*a&jG@^Hq5)IrwC#GZ=fzSDhQDg-{U}|k!wBDCYTy6y*GdgEj%)4u$Gc07G;Y$`dp?>hZKrXw z*53bdf2oDWty=rxk6CF4joY;LzK^U@JB>TUxRb^^Y0lH7E*if;b9R?@(RjDke(=Ge zcS?Kcq?@0tmU`%<7f+WoZQtd(QXie~)!O$x*5dsgrG0dIOlv=Y(?cDl<8*p127n%G z^#?ji<1t)#JRPg=?|9tW*w=xz_l<6J@89UvH+uIzF3``Vd$F%c^oL6|7)tap^3kWU zLZ8Nj{)67((snvg_|sV7Ph*8YjTQbhR`}Cc;ZI|M|Mk)yIuZD1OFeX=@PDti)JNw5 z{OMHS-$3}&=~;n)9q=C`)E-ZU@IR#R?|Yo5pG$XRXC(e-N;Mct{4w(Jr?JAH#yx^Z9@D{{#NN7Uch8nE&}N!heB3@n7N}hx~VF`<}x8gwOw_ zQXP>-sXvV?`G2akoqqUo`9B%t|5BL$=b`_!;@^t@0{;;IVFkGP1OG83`M00L{9XHP zn7@gj`2+jOKq>Km^Gh{*c=rm;faX}gX1}J}0I!? zfr1}89pS+bIsZ{QeTBz9Ep|>I)pyWA=A&f@5JctOYLtrb~W8^EPbm(+tYo& zWn*{$6RoYWg@UG;#%jy_0FSfokt&b4y|{dTI)RZ^O?^MJnVdBz4O9a=Y>D_ zelh;Ab9%k=&9%-qAKZHD!8hM|*lDbH+H0NmgXQ!C=iP^$?)~$>?m4{PGqTn*vfguM zt>?@}*Pe|%{iQms_v=rzn%>s$Ox_>=VAo&AwYFUwZG9iNueI&}pamZS{c!vDx39PL zueJ4W?A-m~$59Z|Kxu@^B>RrV&uV*TMu{M{!Puc z_6}lISK!$fMn3WWwD8lyCo7+I;=#B6?5)qPKG=EXfAf3$fNSYs=%b<=&28Vi{GH3| z&3o6H_kO(h=PjT7&VyIpe6a7p#`_G$MYdS1VmQ(Can)tH$5fHnzX|{`tqXb#+aT zTU+a1k3H5K>ZW5)I_@^s2?+QD$VrMlCjThP2sUw9Bju{x2&HXq4Q4Dh$~(+?@#WZN zd5+z2DbJ-u3#k-x75W^JOYH-sBRn%3;oV+OBsUyNhF{B&Z^q9EykBwO#}6p`XddBN ls)@y7ztm3tQtRjc-}_7L(EqCcMpLZm{>pDO`j^k~{{XOj=-~hW literal 0 HcmV?d00001 diff --git a/backEnd/career/management/commands/populate_european_jobs.py b/backEnd/career/management/commands/populate_european_jobs.py new file mode 100644 index 00000000..6e6606c0 --- /dev/null +++ b/backEnd/career/management/commands/populate_european_jobs.py @@ -0,0 +1,676 @@ +from django.core.management.base import BaseCommand +from django.db import transaction +from django.utils import timezone +from datetime import timedelta +from career.models import JobPosition + + +class Command(BaseCommand): + help = 'Populate database with European job positions only' + + def add_arguments(self, parser): + parser.add_argument( + '--delete-old', + action='store_true', + help='Delete all existing job positions before populating', + ) + + def handle(self, *args, **kwargs): + delete_old = kwargs.get('delete_old', False) + + self.stdout.write(self.style.SUCCESS('Starting to populate European job positions...')) + + with transaction.atomic(): + # Delete old data if requested + if delete_old: + self.delete_old_data() + + # Create European Job Positions + self.create_european_jobs() + + self.stdout.write(self.style.SUCCESS('\n✓ Successfully populated European job positions!')) + self.stdout.write(f' - Total positions: {JobPosition.objects.count()}') + + def delete_old_data(self): + """Delete all existing job positions""" + self.stdout.write(self.style.WARNING('Deleting old job positions...')) + + jobs_count = JobPosition.objects.count() + JobPosition.objects.all().delete() + self.stdout.write(f' ✓ Deleted {jobs_count} job positions') + self.stdout.write(self.style.SUCCESS('Old data deleted successfully!')) + + def create_european_jobs(self): + """Create European job positions""" + self.stdout.write('Creating European job positions...') + + jobs_data = [ + { + 'title': 'Senior Full Stack Developer', + 'department': 'Engineering', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'London, UK', + 'open_positions': 2, + 'experience_required': '5+ years', + 'salary_min': 60000, + 'salary_max': 85000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Annual bonus + Stock options + Private health insurance', + 'short_description': 'Build scalable applications with cutting-edge technologies in our London office.', + 'about_role': 'We are seeking an experienced Full Stack Developer to join our engineering team in London. You will be responsible for developing and maintaining our web applications using modern technologies and best practices. This is an exciting opportunity to work with a talented team on innovative projects.', + 'requirements': [ + '5+ years of full-stack development experience', + 'Strong proficiency in React, Next.js, and TypeScript', + 'Experience with Python/Django or Node.js', + 'Solid understanding of RESTful APIs and GraphQL', + 'Experience with PostgreSQL and Redis', + 'Familiarity with AWS cloud services', + 'Right to work in the UK', + ], + 'responsibilities': [ + 'Develop and maintain web applications', + 'Write clean, maintainable, and efficient code', + 'Participate in code reviews and pair programming', + 'Collaborate with cross-functional teams', + 'Optimize applications for performance and scalability', + 'Mentor junior developers', + 'Contribute to technical decision-making', + ], + 'qualifications': [ + 'Bachelor\'s degree in Computer Science or related field', + 'Strong problem-solving and analytical skills', + 'Experience with version control (Git)', + 'Good understanding of software development lifecycle', + 'Excellent communication skills in English', + ], + 'bonus_points': [ + 'Experience with Docker and Kubernetes', + 'Knowledge of CI/CD pipelines (GitLab CI, GitHub Actions)', + 'Contributions to open-source projects', + 'Experience with microservices architecture', + 'Knowledge of test-driven development', + ], + 'benefits': [ + 'Competitive salary with stock options', + 'Hybrid work model (3 days office, 2 days remote)', + 'Latest MacBook Pro or custom PC', + 'Learning and development budget (€2,000/year)', + 'Private health insurance (Bupa)', + 'Gym membership', + '25 days annual leave + bank holidays', + 'Pension contribution matching', + ], + 'start_date': 'Within 1 month', + 'status': 'active', + 'featured': True, + 'priority': 10, + }, + { + 'title': 'Frontend Developer', + 'department': 'Engineering', + 'employment_type': 'full-time', + 'location_type': 'remote', + 'location': 'Remote (Europe)', + 'open_positions': 3, + 'experience_required': '3+ years', + 'salary_min': 45000, + 'salary_max': 65000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Performance bonus + Remote work allowance', + 'short_description': 'Create beautiful and performant user interfaces for our web applications.', + 'about_role': 'We are looking for a talented Frontend Developer to join our distributed team across Europe. You will work on building modern, responsive web applications using React and Next.js. This is a fully remote position, but we have offices in major European cities if you prefer hybrid work.', + 'requirements': [ + '3+ years of frontend development experience', + 'Strong proficiency in React, Next.js, and TypeScript', + 'Experience with CSS-in-JS or Tailwind CSS', + 'Understanding of responsive design principles', + 'Experience with state management (Redux, Zustand)', + 'Knowledge of modern JavaScript (ES6+)', + 'Must be based in Europe', + ], + 'responsibilities': [ + 'Develop responsive and accessible user interfaces', + 'Implement design systems and component libraries', + 'Optimize applications for performance', + 'Write unit and integration tests', + 'Collaborate with designers and backend developers', + 'Participate in code reviews', + ], + 'qualifications': [ + 'Portfolio demonstrating strong frontend skills', + 'Experience with version control (Git)', + 'Understanding of web accessibility standards (WCAG)', + 'Good communication skills in English', + ], + 'bonus_points': [ + 'Experience with Storybook', + 'Knowledge of animation libraries (Framer Motion)', + 'Experience with GraphQL', + 'Understanding of SEO best practices', + 'Experience with testing frameworks (Jest, React Testing Library)', + ], + 'benefits': [ + 'Fully remote work (within Europe)', + 'Competitive salary package', + 'Remote work allowance (€500/month)', + 'Learning and development budget', + 'Latest MacBook Pro', + 'Health insurance contribution', + 'Flexible working hours', + '30 days annual leave', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': True, + 'priority': 9, + }, + { + 'title': 'Backend Developer (Python/Django)', + 'department': 'Engineering', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'Berlin, Germany', + 'open_positions': 2, + 'experience_required': '4+ years', + 'salary_min': 55000, + 'salary_max': 75000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ 13th month salary + Annual bonus', + 'short_description': 'Build robust backend systems and APIs using Python and Django.', + 'about_role': 'We are seeking a Backend Developer to join our engineering team in Berlin. You will work on developing scalable backend systems, RESTful APIs, and microservices using Python and Django. This is an excellent opportunity to work with modern technologies in a dynamic startup environment.', + 'requirements': [ + '4+ years of backend development experience', + 'Strong proficiency in Python and Django', + 'Experience with PostgreSQL and database optimization', + 'Understanding of RESTful API design', + 'Experience with Redis for caching', + 'Knowledge of Docker and containerization', + 'Right to work in Germany', + ], + 'responsibilities': [ + 'Design and develop backend APIs', + 'Optimize database queries and performance', + 'Implement authentication and authorization', + 'Write comprehensive tests', + 'Participate in architecture decisions', + 'Collaborate with frontend and DevOps teams', + ], + 'qualifications': [ + 'Bachelor\'s degree in Computer Science or related field', + 'Strong problem-solving skills', + 'Experience with Git and version control', + 'Good understanding of software engineering principles', + 'Good communication skills in English (German is a plus)', + ], + 'bonus_points': [ + 'Experience with Celery and async task processing', + 'Knowledge of GraphQL', + 'Experience with AWS services', + 'Understanding of microservices architecture', + 'Experience with Elasticsearch', + ], + 'benefits': [ + 'Competitive salary with 13th month', + 'Hybrid work model', + 'Latest development equipment', + 'Learning budget (€1,500/year)', + 'Public transport ticket (BVG)', + 'Health insurance contribution', + '30 days annual leave', + 'German language courses', + ], + 'start_date': 'Within 1 month', + 'status': 'active', + 'featured': False, + 'priority': 8, + }, + { + 'title': 'DevOps Engineer', + 'department': 'Engineering', + 'employment_type': 'full-time', + 'location_type': 'remote', + 'location': 'Remote (Europe)', + 'open_positions': 1, + 'experience_required': '4+ years', + 'salary_min': 60000, + 'salary_max': 80000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Annual bonus + Equipment budget', + 'short_description': 'Build and maintain our cloud infrastructure and CI/CD pipelines.', + 'about_role': 'We are looking for a DevOps Engineer to join our infrastructure team. You will be responsible for managing our cloud infrastructure, implementing CI/CD pipelines, and ensuring high availability of our services. This is a fully remote position open to candidates across Europe.', + 'requirements': [ + '4+ years of DevOps or infrastructure experience', + 'Strong experience with AWS cloud services', + 'Proficiency with Docker and Kubernetes', + 'Experience with CI/CD tools (GitLab CI, GitHub Actions)', + 'Knowledge of Infrastructure as Code (Terraform, CloudFormation)', + 'Experience with monitoring tools (Prometheus, Grafana)', + 'Must be based in Europe', + ], + 'responsibilities': [ + 'Manage and optimize cloud infrastructure', + 'Design and implement CI/CD pipelines', + 'Monitor system performance and availability', + 'Implement security best practices', + 'Automate deployment and scaling processes', + 'Troubleshoot infrastructure issues', + ], + 'qualifications': [ + 'Strong Linux/Unix administration skills', + 'Experience with scripting (Bash, Python)', + 'Understanding of networking and security', + 'Good problem-solving abilities', + 'Excellent communication skills in English', + ], + 'bonus_points': [ + 'Experience with GitOps (ArgoCD, Flux)', + 'Knowledge of service mesh (Istio)', + 'Experience with multi-cloud environments', + 'Certifications (AWS, Kubernetes)', + 'Experience with observability tools (Datadog, New Relic)', + ], + 'benefits': [ + 'Fully remote work', + 'Competitive salary package', + 'Equipment budget (€3,000)', + 'Learning and certification budget', + 'Health insurance contribution', + 'Flexible working hours', + '30 days annual leave', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': True, + 'priority': 9, + }, + { + 'title': 'UI/UX Designer', + 'department': 'Design', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'Amsterdam, Netherlands', + 'open_positions': 1, + 'experience_required': '3+ years', + 'salary_min': 45000, + 'salary_max': 60000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ 8% holiday allowance + Annual bonus', + 'short_description': 'Create beautiful and intuitive user experiences for our products.', + 'about_role': 'We are looking for a talented UI/UX Designer to join our design team in Amsterdam. You will work closely with product managers and engineers to design user-friendly interfaces for our web and mobile applications. This role offers the opportunity to shape the user experience of our products.', + 'requirements': [ + '3+ years of UI/UX design experience', + 'Strong portfolio showcasing web and mobile projects', + 'Proficiency in Figma or Sketch', + 'Understanding of user-centered design principles', + 'Experience with user research and usability testing', + 'Fluent English (Dutch is a plus)', + 'Right to work in the Netherlands', + ], + 'responsibilities': [ + 'Create wireframes, prototypes, and high-fidelity designs', + 'Conduct user research and usability testing', + 'Collaborate with developers to implement designs', + 'Maintain and evolve design systems', + 'Present design concepts to stakeholders', + 'Iterate on designs based on user feedback', + ], + 'qualifications': [ + 'Portfolio demonstrating strong UI/UX design skills', + 'Experience with design systems', + 'Knowledge of HTML/CSS basics', + 'Understanding of accessibility standards (WCAG)', + 'Strong communication and presentation skills', + ], + 'bonus_points': [ + 'Experience with motion design and animation', + 'Knowledge of front-end development', + 'Illustration skills', + 'Experience with design tokens', + 'Experience with user analytics tools', + ], + 'benefits': [ + 'Hybrid work model', + 'Competitive salary with 8% holiday allowance', + 'Latest design tools and software', + 'Learning and development budget', + 'Health insurance contribution', + 'Public transport card', + '25 days annual leave', + 'Pension contribution', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': False, + 'priority': 7, + }, + { + 'title': 'Product Manager', + 'department': 'Product', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'Paris, France', + 'open_positions': 1, + 'experience_required': '5+ years', + 'salary_min': 65000, + 'salary_max': 85000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Annual bonus + Stock options', + 'short_description': 'Lead product strategy and development for our flagship products.', + 'about_role': 'We are looking for an experienced Product Manager to drive the vision and execution of our products from our Paris office. You will work closely with engineering, design, and marketing teams to deliver exceptional products that delight our customers. This role requires strong leadership and strategic thinking.', + 'requirements': [ + '5+ years of product management experience', + 'Proven track record of successful product launches', + 'Strong understanding of agile methodologies', + 'Excellent communication and leadership skills', + 'Data-driven decision-making approach', + 'Experience with product analytics tools', + 'Right to work in France', + ], + 'responsibilities': [ + 'Define product vision and strategy', + 'Create and maintain product roadmap', + 'Gather and prioritize requirements', + 'Work with engineering team on implementation', + 'Conduct market research and competitive analysis', + 'Analyze product metrics and user feedback', + 'Coordinate with stakeholders across the organization', + ], + 'qualifications': [ + 'Bachelor\'s degree (MBA preferred)', + 'Strong analytical and problem-solving skills', + 'Experience with product management tools (Jira, Productboard)', + 'Understanding of UX principles', + 'Fluent English (French is a plus)', + ], + 'bonus_points': [ + 'Technical background', + 'Experience in SaaS products', + 'Knowledge of growth strategies', + 'Experience with A/B testing', + 'Understanding of API design', + ], + 'benefits': [ + 'Competitive salary with equity', + 'Hybrid work model', + 'Professional development budget', + 'Health and wellness benefits', + 'Public transport pass', + 'Lunch vouchers', + '30 days annual leave + RTT', + 'Team offsites and events', + ], + 'start_date': 'Within 1 month', + 'status': 'active', + 'featured': True, + 'priority': 8, + }, + { + 'title': 'Data Engineer', + 'department': 'Data', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'Barcelona, Spain', + 'open_positions': 1, + 'experience_required': '4+ years', + 'salary_min': 50000, + 'salary_max': 70000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Annual bonus + Flexible benefits', + 'short_description': 'Build and maintain data pipelines and infrastructure.', + 'about_role': 'We are seeking a Data Engineer to join our data team in Barcelona. You will be responsible for designing, building, and maintaining data pipelines, data warehouses, and ETL processes. This role offers the opportunity to work with large-scale data systems and modern data technologies.', + 'requirements': [ + '4+ years of data engineering experience', + 'Strong proficiency in Python', + 'Experience with SQL and database design', + 'Knowledge of data pipeline tools (Airflow, Luigi)', + 'Experience with cloud data warehouses (Snowflake, BigQuery, Redshift)', + 'Understanding of ETL/ELT processes', + 'Right to work in Spain', + ], + 'responsibilities': [ + 'Design and build data pipelines', + 'Maintain data warehouse infrastructure', + 'Optimize data processing performance', + 'Ensure data quality and reliability', + 'Collaborate with data analysts and scientists', + 'Document data processes and architecture', + ], + 'qualifications': [ + 'Bachelor\'s degree in Computer Science or related field', + 'Strong problem-solving skills', + 'Experience with version control (Git)', + 'Understanding of data modeling concepts', + 'Good communication skills in English (Spanish is a plus)', + ], + 'bonus_points': [ + 'Experience with Apache Spark', + 'Knowledge of real-time data processing (Kafka)', + 'Experience with dbt', + 'Understanding of data governance', + 'Experience with machine learning pipelines', + ], + 'benefits': [ + 'Hybrid work model', + 'Competitive salary package', + 'Learning and development budget', + 'Health insurance', + 'Flexible working hours', + 'Public transport card', + '23 days annual leave + local holidays', + 'Flexible benefits package', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': False, + 'priority': 7, + }, + { + 'title': 'QA Engineer', + 'department': 'Engineering', + 'employment_type': 'full-time', + 'location_type': 'remote', + 'location': 'Remote (Europe)', + 'open_positions': 2, + 'experience_required': '3+ years', + 'salary_min': 40000, + 'salary_max': 55000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Performance bonus', + 'short_description': 'Ensure quality and reliability of our software products.', + 'about_role': 'We are looking for QA Engineers to join our quality assurance team. You will be responsible for testing our web applications, writing automated tests, and ensuring the quality of our products. This is a fully remote position open to candidates across Europe.', + 'requirements': [ + '3+ years of QA/testing experience', + 'Experience with test automation (Selenium, Cypress, Playwright)', + 'Knowledge of testing methodologies', + 'Experience with API testing', + 'Understanding of CI/CD processes', + 'Strong attention to detail', + 'Must be based in Europe', + ], + 'responsibilities': [ + 'Design and execute test plans', + 'Write and maintain automated tests', + 'Perform manual testing when needed', + 'Report and track bugs', + 'Collaborate with development teams', + 'Participate in release processes', + ], + 'qualifications': [ + 'Strong analytical and problem-solving skills', + 'Experience with version control (Git)', + 'Understanding of software development lifecycle', + 'Good communication skills in English', + ], + 'bonus_points': [ + 'Experience with performance testing', + 'Knowledge of security testing', + 'Experience with mobile app testing', + 'Programming skills (Python, JavaScript)', + 'Experience with test management tools', + ], + 'benefits': [ + 'Fully remote work', + 'Competitive salary package', + 'Learning and development budget', + 'Health insurance contribution', + 'Flexible working hours', + '30 days annual leave', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': False, + 'priority': 6, + }, + { + 'title': 'Marketing Manager', + 'department': 'Marketing', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'Dublin, Ireland', + 'open_positions': 1, + 'experience_required': '4+ years', + 'salary_min': 50000, + 'salary_max': 70000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Annual bonus + Health insurance', + 'short_description': 'Lead our marketing efforts and grow our brand presence in Europe.', + 'about_role': 'We are looking for a Marketing Manager to join our marketing team in Dublin. You will be responsible for developing and executing marketing strategies to increase brand awareness and drive customer acquisition across European markets. This role offers the opportunity to shape our marketing approach.', + 'requirements': [ + '4+ years of marketing experience', + 'Proven track record of successful marketing campaigns', + 'Strong understanding of digital marketing channels', + 'Experience with marketing automation tools', + 'Excellent analytical and communication skills', + 'Experience with B2B marketing', + 'Right to work in Ireland', + ], + 'responsibilities': [ + 'Develop and execute marketing strategies', + 'Manage digital marketing campaigns', + 'Oversee content marketing initiatives', + 'Analyze campaign performance and ROI', + 'Manage marketing budget', + 'Collaborate with sales and product teams', + 'Coordinate events and webinars', + ], + 'qualifications': [ + 'Bachelor\'s degree in Marketing or related field', + 'Experience with Google Analytics and marketing tools', + 'Strong project management skills', + 'Creative thinking and problem-solving abilities', + 'Excellent communication skills in English', + ], + 'bonus_points': [ + 'Experience with HubSpot or similar platforms', + 'Knowledge of SEO and content marketing', + 'Video production skills', + 'Experience with paid advertising', + 'Multilingual (French, German, Spanish)', + ], + 'benefits': [ + 'Hybrid work model', + 'Competitive salary package', + 'Marketing conferences and events budget', + 'Professional development opportunities', + 'Health insurance', + 'Public transport card', + '25 days annual leave', + 'Pension contribution', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': False, + 'priority': 6, + }, + { + 'title': 'Sales Development Representative', + 'department': 'Sales', + 'employment_type': 'full-time', + 'location_type': 'hybrid', + 'location': 'Warsaw, Poland', + 'open_positions': 2, + 'experience_required': '1+ years', + 'salary_min': 35000, + 'salary_max': 45000, + 'salary_currency': 'EUR', + 'salary_period': 'per year', + 'salary_additional': '+ Commission + Annual bonus', + 'short_description': 'Generate leads and build relationships with potential customers.', + 'about_role': 'We are looking for Sales Development Representatives to join our sales team in Warsaw. You will be responsible for prospecting, qualifying leads, and setting up meetings for our sales team. This is an excellent entry-level opportunity with growth potential.', + 'requirements': [ + '1+ years of sales or customer service experience', + 'Strong communication and interpersonal skills', + 'Self-motivated and goal-oriented', + 'Experience with CRM systems (Salesforce, HubSpot)', + 'Fluent English (Polish is a plus)', + 'Right to work in Poland', + ], + 'responsibilities': [ + 'Prospect and qualify leads', + 'Conduct outbound outreach (email, phone, LinkedIn)', + 'Schedule meetings for sales team', + 'Maintain CRM database', + 'Follow up with prospects', + 'Achieve monthly quotas', + ], + 'qualifications': [ + 'Strong communication skills', + 'Ability to work in a fast-paced environment', + 'Basic understanding of sales processes', + 'Proficiency with Microsoft Office', + ], + 'bonus_points': [ + 'Experience in B2B sales', + 'Knowledge of the tech industry', + 'Multilingual skills', + 'Experience with sales tools', + ], + 'benefits': [ + 'Hybrid work model', + 'Competitive base salary + commission', + 'Sales training and development', + 'Health insurance', + 'Public transport card', + '20 days annual leave', + 'Career growth opportunities', + ], + 'start_date': 'ASAP', + 'status': 'active', + 'featured': False, + 'priority': 5, + }, + ] + + created_count = 0 + for job_data in jobs_data: + # Generate slug from title + slug = job_data['title'].lower().replace(' ', '-').replace('/', '-').replace('(', '').replace(')', '') + + job, created = JobPosition.objects.get_or_create( + slug=slug, + defaults=job_data + ) + if created: + created_count += 1 + self.stdout.write( + self.style.SUCCESS(f' ✓ Created job: {job.title} - {job.location}') + ) + else: + self.stdout.write( + f' - Job already exists: {job.title} - {job.location}' + ) + + self.stdout.write( + self.style.SUCCESS(f'\n✓ Created {created_count} European job position(s)!') + ) + diff --git a/backEnd/career/templates/career/application_confirmation.html b/backEnd/career/templates/career/application_confirmation.html index ed2afe44..5eb2b3ee 100644 --- a/backEnd/career/templates/career/application_confirmation.html +++ b/backEnd/career/templates/career/application_confirmation.html @@ -1,78 +1,276 @@ - + + + + Application Received - GNX -
-
-

Application Received

+