Initial commit from monorepo
This commit is contained in:
165
teams_app/models.py
Normal file
165
teams_app/models.py
Normal file
@@ -0,0 +1,165 @@
|
||||
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}"
|
||||
Reference in New Issue
Block a user