Files
teams/teams_app/models.py
2026-01-07 09:17:34 +07:00

166 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.conf import settings
from django.db import models
import uuid
class Team(models.Model):
TEAM_TYPE_CHOICES = [
('BUYER', 'Покупатель'),
('SELLER', 'Продавец'),
]
LOCATION_TYPE_CHOICES = [
('address', 'Адрес'),
('hub', 'Хаб'),
]
uuid = models.CharField(max_length=100, unique=True, default=uuid.uuid4)
name = models.CharField(max_length=255)
team_type = models.CharField(max_length=20, choices=TEAM_TYPE_CHOICES, default='BUYER')
logto_org_id = models.CharField(max_length=255, null=True, blank=True)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='owned_teams',
null=True,
blank=True,
)
selected_location_type = models.CharField(max_length=20, choices=LOCATION_TYPE_CHOICES, null=True, blank=True)
selected_location_uuid = models.CharField(max_length=100, null=True, blank=True)
selected_location_name = models.CharField(max_length=255, null=True, blank=True)
selected_location_latitude = models.FloatField(null=True, blank=True)
selected_location_longitude = models.FloatField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'teams_team'
def __str__(self):
return f"Team {self.name}"
class UserProfile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='profile'
)
logto_id = models.CharField(max_length=255, unique=True)
avatar_id = models.CharField(max_length=100, blank=True, null=True)
phone = models.CharField(max_length=20, blank=True, null=True)
active_team = models.ForeignKey(Team, on_delete=models.SET_NULL, null=True, blank=True, related_name='active_profiles')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'teams_user_profile'
def __str__(self):
return f"Profile {self.logto_id}"
class TeamMember(models.Model):
ROLE_CHOICES = [
('OWNER', 'Владелец'),
('ADMIN', 'Администратор'),
('MANAGER', 'Менеджер'),
('MEMBER', 'Участник'),
]
uuid = models.CharField(max_length=100, unique=True, default=uuid.uuid4)
team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='members')
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='team_memberships',
null=True,
blank=True,
)
role = models.CharField(max_length=50, choices=ROLE_CHOICES, default='MEMBER')
joined_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'teams_member'
unique_together = ['team', 'user']
def __str__(self):
return f"{self.team.name} - {self.user} ({self.role})"
class TeamInvitation(models.Model):
INVITATION_STATUS_CHOICES = [
('PENDING', 'Ожидает ответа'),
('ACCEPTED', 'Принято'),
('DECLINED', 'Отклонено'),
('EXPIRED', 'Истекло'),
]
ROLE_CHOICES = TeamMember.ROLE_CHOICES
uuid = models.CharField(max_length=100, unique=True, default=uuid.uuid4)
team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='invitations')
email = models.EmailField()
role = models.CharField(max_length=50, choices=ROLE_CHOICES, default='MEMBER')
status = models.CharField(max_length=50, choices=INVITATION_STATUS_CHOICES, default='PENDING')
invited_by = models.CharField(max_length=255)
expires_at = models.DateTimeField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'teams_invitation'
unique_together = ['team', 'email']
def __str__(self):
return f"Приглашение в {self.team.name} для {self.email}"
class TeamInvitationToken(models.Model):
WORKFLOW_STATUS_CHOICES = [
('pending', 'Ожидает обработки'),
('active', 'Активен'),
('error', 'Ошибка'),
]
uuid = models.CharField(max_length=100, unique=True, default=uuid.uuid4)
invitation = models.ForeignKey(TeamInvitation, on_delete=models.CASCADE, related_name='tokens')
token_hash = models.CharField(max_length=255, unique=True)
workflow_status = models.CharField(
max_length=20,
choices=WORKFLOW_STATUS_CHOICES,
default='pending',
)
expires_at = models.DateTimeField()
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'teams_invitation_token'
def __str__(self):
return f"Token {self.uuid} for invitation {self.invitation_id}"
class TeamAddress(models.Model):
ADDRESS_STATUS_CHOICES = [
('pending', 'Ожидает обработки'),
('active', 'Активен'),
('error', 'Ошибка'),
]
uuid = models.CharField(max_length=100, unique=True, default=uuid.uuid4)
team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='addresses')
name = models.CharField(max_length=255) # "Офис", "Склад", "Производство"
address = models.TextField()
latitude = models.FloatField(null=True, blank=True)
longitude = models.FloatField(null=True, blank=True)
country_code = models.CharField(max_length=2, null=True, blank=True) # ISO 3166-1 alpha-2
is_default = models.BooleanField(default=False)
status = models.CharField(max_length=20, choices=ADDRESS_STATUS_CHOICES, default='pending')
processed_at = models.DateTimeField(null=True, blank=True)
error_message = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = 'teams_address'
def __str__(self):
return f"{self.team.name} - {self.name}"