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