update
This commit is contained in:
190
backEnd/contact/models.py
Normal file
190
backEnd/contact/models.py
Normal 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)
|
||||
Reference in New Issue
Block a user