Dynavera/apps/onboarding/models.py

121 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}'