This commit is contained in:
Iliyan Angelov
2025-11-24 03:52:08 +02:00
parent dfcaebaf8c
commit 366f28677a
18241 changed files with 865352 additions and 567 deletions

190
backEnd/contact/models.py Normal file
View File

@@ -0,0 +1,190 @@
from django.db import models
from django.core.validators import EmailValidator
from django.utils import timezone
class ContactSubmission(models.Model):
"""
Model to store contact form submissions from the GNX website.
Based on the comprehensive contact form structure from ContactSection.tsx
"""
# Personal Information
first_name = models.CharField(max_length=100, verbose_name="First Name")
last_name = models.CharField(max_length=100, verbose_name="Last Name")
email = models.EmailField(validators=[EmailValidator()], verbose_name="Business Email")
phone = models.CharField(max_length=20, blank=True, null=True, verbose_name="Phone Number")
# Company Information
company = models.CharField(max_length=200, verbose_name="Company Name")
job_title = models.CharField(max_length=100, verbose_name="Job Title")
# Industry and Company Size
INDUSTRY_CHOICES = [
('technology', 'Technology'),
('finance', 'Finance'),
('healthcare', 'Healthcare'),
('manufacturing', 'Manufacturing'),
('retail', 'Retail'),
('education', 'Education'),
('government', 'Government'),
('other', 'Other'),
]
industry = models.CharField(
max_length=50,
choices=INDUSTRY_CHOICES,
blank=True,
null=True,
verbose_name="Industry"
)
COMPANY_SIZE_CHOICES = [
('1-10', '1-10 employees'),
('11-50', '11-50 employees'),
('51-200', '51-200 employees'),
('201-1000', '201-1000 employees'),
('1000+', '1000+ employees'),
]
company_size = models.CharField(
max_length=20,
choices=COMPANY_SIZE_CHOICES,
blank=True,
null=True,
verbose_name="Company Size"
)
# Project Details
PROJECT_TYPE_CHOICES = [
('software-development', 'Software Development'),
('cloud-migration', 'Cloud Migration'),
('digital-transformation', 'Digital Transformation'),
('data-analytics', 'Data Analytics'),
('security-compliance', 'Security & Compliance'),
('integration', 'System Integration'),
('consulting', 'Consulting Services'),
]
project_type = models.CharField(
max_length=50,
choices=PROJECT_TYPE_CHOICES,
blank=True,
null=True,
verbose_name="Project Type"
)
TIMELINE_CHOICES = [
('immediate', 'Immediate (0-3 months)'),
('short', 'Short-term (3-6 months)'),
('medium', 'Medium-term (6-12 months)'),
('long', 'Long-term (12+ months)'),
('planning', 'Still planning'),
]
timeline = models.CharField(
max_length=20,
choices=TIMELINE_CHOICES,
blank=True,
null=True,
verbose_name="Project Timeline"
)
BUDGET_CHOICES = [
('under-50k', 'Under €50,000'),
('50k-100k', '€50,000 - €100,000'),
('100k-250k', '€100,000 - €250,000'),
('250k-500k', '€250,000 - €500,000'),
('500k-1m', '€500,000 - €1,000,000'),
('over-1m', 'Over €1,000,000'),
('discuss', 'Prefer to discuss'),
]
budget = models.CharField(
max_length=20,
choices=BUDGET_CHOICES,
blank=True,
null=True,
verbose_name="Project Budget Range"
)
message = models.TextField(verbose_name="Project Description")
# Privacy & Communication
newsletter_subscription = models.BooleanField(
default=False,
verbose_name="Newsletter Subscription"
)
privacy_consent = models.BooleanField(
default=False,
verbose_name="Privacy Policy Consent"
)
# Metadata
STATUS_CHOICES = [
('new', 'New'),
('in_progress', 'In Progress'),
('contacted', 'Contacted'),
('qualified', 'Qualified'),
('closed', 'Closed'),
]
status = models.CharField(
max_length=20,
choices=STATUS_CHOICES,
default='new',
verbose_name="Status"
)
priority = models.CharField(
max_length=10,
choices=[
('low', 'Low'),
('medium', 'Medium'),
('high', 'High'),
('urgent', 'Urgent'),
],
default='medium',
verbose_name="Priority"
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created At")
updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated At")
# Admin notes for internal use
admin_notes = models.TextField(blank=True, null=True, verbose_name="Admin Notes")
assigned_to = models.CharField(
max_length=100,
blank=True,
null=True,
verbose_name="Assigned To"
)
class Meta:
verbose_name = "Contact Submission"
verbose_name_plural = "Contact Submissions"
ordering = ['-created_at']
indexes = [
models.Index(fields=['email']),
models.Index(fields=['company']),
models.Index(fields=['status']),
models.Index(fields=['created_at']),
]
def __str__(self):
return f"{self.first_name} {self.last_name} - {self.company} ({self.created_at.strftime('%Y-%m-%d')})"
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
@property
def is_high_priority(self):
return self.priority in ['high', 'urgent']
@property
def is_enterprise_client(self):
return self.company_size in ['201-1000', '1000+']
def get_industry_display(self):
return dict(self.INDUSTRY_CHOICES).get(self.industry, self.industry)
def get_project_type_display(self):
return dict(self.PROJECT_TYPE_CHOICES).get(self.project_type, self.project_type)
def get_budget_display(self):
return dict(self.BUDGET_CHOICES).get(self.budget, self.budget)