122 lines
4.1 KiB
Python
122 lines
4.1 KiB
Python
|
|
from uuid import uuid4
|
||
|
|
from django.db.models import (
|
||
|
|
BigAutoField,
|
||
|
|
BooleanField,
|
||
|
|
CASCADE,
|
||
|
|
CharField,
|
||
|
|
DateTimeField,
|
||
|
|
ForeignKey,
|
||
|
|
IntegerField,
|
||
|
|
JSONField,
|
||
|
|
Model,
|
||
|
|
TextField,
|
||
|
|
UUIDField,
|
||
|
|
)
|
||
|
|
from apps.users.mixins import TimeStampMixin
|
||
|
|
from apps.users.models import User
|
||
|
|
from apps.orgs.models import Role
|
||
|
|
from apps.mlstore.models import Agent, AgentRun
|
||
|
|
|
||
|
|
|
||
|
|
class OnboardingFlow(TimeStampMixin, Model):
|
||
|
|
STATUS_CHOICES = [
|
||
|
|
('draft', 'Draft'),
|
||
|
|
('published', 'Published'),
|
||
|
|
('archived', 'Archived'),
|
||
|
|
]
|
||
|
|
|
||
|
|
id = BigAutoField(primary_key=True)
|
||
|
|
uuid = UUIDField(default=uuid4, editable=False, unique=True)
|
||
|
|
role = ForeignKey(Role, on_delete=CASCADE, related_name='onboarding_flows')
|
||
|
|
agent = ForeignKey(Agent, on_delete=CASCADE, related_name='onboarding_flows', null=True, blank=True)
|
||
|
|
title = CharField(max_length=255)
|
||
|
|
description = TextField(blank=True, default='')
|
||
|
|
status = CharField(max_length=20, choices=STATUS_CHOICES, default='draft')
|
||
|
|
|
||
|
|
class Meta:
|
||
|
|
verbose_name = 'Onboarding Flow'
|
||
|
|
verbose_name_plural = 'Onboarding Flows'
|
||
|
|
ordering = ['-created_at']
|
||
|
|
|
||
|
|
def __str__(self) -> str:
|
||
|
|
return f'{self.title} ({self.role.name})'
|
||
|
|
|
||
|
|
|
||
|
|
class OnboardingPage(TimeStampMixin, Model):
|
||
|
|
id = BigAutoField(primary_key=True)
|
||
|
|
uuid = UUIDField(default=uuid4, editable=False, unique=True)
|
||
|
|
flow = ForeignKey(OnboardingFlow, on_delete=CASCADE, related_name='pages')
|
||
|
|
order = IntegerField(default=0)
|
||
|
|
title = CharField(max_length=255)
|
||
|
|
body = TextField(blank=True, default='')
|
||
|
|
meta = JSONField(default=dict, blank=True)
|
||
|
|
|
||
|
|
class Meta:
|
||
|
|
verbose_name = 'Onboarding Page'
|
||
|
|
verbose_name_plural = 'Onboarding Pages'
|
||
|
|
ordering = ['order', 'created_at']
|
||
|
|
|
||
|
|
def __str__(self) -> str:
|
||
|
|
return f'{self.flow.title} - {self.title}'
|
||
|
|
|
||
|
|
|
||
|
|
class OnboardingField(TimeStampMixin, Model):
|
||
|
|
FIELD_TYPES = [
|
||
|
|
('text', 'Text'),
|
||
|
|
('textarea', 'Textarea'),
|
||
|
|
('select', 'Select'),
|
||
|
|
('multiselect', 'Multi Select'),
|
||
|
|
('number', 'Number'),
|
||
|
|
('boolean', 'Boolean'),
|
||
|
|
('date', 'Date'),
|
||
|
|
]
|
||
|
|
|
||
|
|
id = BigAutoField(primary_key=True)
|
||
|
|
uuid = UUIDField(default=uuid4, editable=False, unique=True)
|
||
|
|
page = ForeignKey(OnboardingPage, on_delete=CASCADE, related_name='fields')
|
||
|
|
order = IntegerField(default=0)
|
||
|
|
key = CharField(max_length=120)
|
||
|
|
label = CharField(max_length=255)
|
||
|
|
field_type = CharField(max_length=30, choices=FIELD_TYPES, default='text')
|
||
|
|
required = BooleanField(default=False)
|
||
|
|
help_text = TextField(blank=True, default='')
|
||
|
|
placeholder = CharField(max_length=255, blank=True, default='')
|
||
|
|
options = JSONField(default=list, blank=True)
|
||
|
|
default_value = JSONField(null=True, blank=True, default=None)
|
||
|
|
validation = JSONField(default=dict, blank=True)
|
||
|
|
|
||
|
|
class Meta:
|
||
|
|
verbose_name = 'Onboarding Field'
|
||
|
|
verbose_name_plural = 'Onboarding Fields'
|
||
|
|
ordering = ['order', 'created_at']
|
||
|
|
unique_together = [['page', 'key']]
|
||
|
|
|
||
|
|
def __str__(self) -> str:
|
||
|
|
return f'{self.page.title} - {self.label}'
|
||
|
|
|
||
|
|
|
||
|
|
class OnboardingSession(TimeStampMixin, Model):
|
||
|
|
STATUS_CHOICES = [
|
||
|
|
('in_progress', 'In Progress'),
|
||
|
|
('completed', 'Completed'),
|
||
|
|
('abandoned', 'Abandoned'),
|
||
|
|
]
|
||
|
|
|
||
|
|
id = BigAutoField(primary_key=True)
|
||
|
|
uuid = UUIDField(default=uuid4, editable=False, unique=True)
|
||
|
|
flow = ForeignKey(OnboardingFlow, on_delete=CASCADE, related_name='sessions')
|
||
|
|
user = ForeignKey(User, on_delete=CASCADE, related_name='onboarding_sessions')
|
||
|
|
agent_run = ForeignKey(AgentRun, on_delete=CASCADE, related_name='onboarding_sessions', null=True, blank=True)
|
||
|
|
status = CharField(max_length=20, choices=STATUS_CHOICES, default='in_progress')
|
||
|
|
current_page_order = IntegerField(default=0)
|
||
|
|
responses = JSONField(default=dict, blank=True)
|
||
|
|
completed_at = DateTimeField(null=True, blank=True)
|
||
|
|
|
||
|
|
class Meta:
|
||
|
|
verbose_name = 'Onboarding Session'
|
||
|
|
verbose_name_plural = 'Onboarding Sessions'
|
||
|
|
ordering = ['-created_at']
|
||
|
|
|
||
|
|
def __str__(self) -> str:
|
||
|
|
return f'{self.user.email_address} - {self.flow.title}'
|