Files
vontor-cz/backend/social/hubs/models.py
2026-04-20 00:04:15 +02:00

102 lines
3.3 KiB
Python

from turtle import color
import uuid
from django.db import models
from django.conf import settings
from vontor_cz.custom_fields import WebPImageField
from vontor_cz.models import SoftDeleteModel
from django.core.exceptions import ValidationError
# Create your models here.
class Hub(SoftDeleteModel):
AUTHOR_FIELD = 'owner'
name = models.CharField(max_length=255, unique=True)
description = models.TextField(blank=True, null=True)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
related_name='owned_hubs'
)
icon = WebPImageField(upload_to='hub_icons/', null=True, blank=True)
banner = WebPImageField(upload_to='hub_banners/', null=True, blank=True)
members = models.ManyToManyField(
settings.AUTH_USER_MODEL,
related_name='hubs',
blank=True
)
is_public = models.BooleanField(default=True)
transfer_to = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='pending_hub_transfers'
)
transfer_token = models.UUIDField(null=True, blank=True, unique=True)
def create_transfer(self, new_owner):
self.transfer_to = new_owner
self.transfer_token = uuid.uuid4()
self.save(update_fields=['transfer_to', 'transfer_token'])
def verify_transfer(self, input_token, triggering_user):
"""Requires uuid and triggering user must match the transfer_to field"""
if self.transfer_token and str(self.transfer_token) == str(input_token) and self.transfer_to == triggering_user:
self.owner = self.transfer_to
self.transfer_to = None
self.transfer_token = None
self.save(update_fields=['owner', 'transfer_to', 'transfer_token'])
return True
raise ValidationError("Invalid transfer token or user does not match transfer_to field")
def cancel_transfer(self):
self.transfer_to = None
self.transfer_token = None
self.save(update_fields=['transfer_to', 'transfer_token'])
def get_all_tags(self):
return Tags.objects.filter(hub_id=self.id)
def __str__(self):
return self.name
class HubPermission(SoftDeleteModel):
hub = models.ForeignKey(Hub, on_delete=models.CASCADE, related_name='moderators')
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
changing_name = models.BooleanField(default=False)
changing_description = models.BooleanField(default=False)
changing_icon = models.BooleanField(default=False)
changing_banner = models.BooleanField(default=False)
managing_members = models.BooleanField(default=False)
managing_posts = models.BooleanField(default=False)
managing_chats = models.BooleanField(default=False)
class Meta:
unique_together = ('hub', 'user')
def __str__(self):
return f"{self.user} moderates {self.hub}"
class Tags(SoftDeleteModel):
hub = models.ForeignKey(Hub, on_delete=models.CASCADE, related_name='tags')
name = models.CharField(max_length=50)
description = models.TextField(blank=True, null=True)
color = models.CharField(max_length=7, default='#000000') # Hex color code