38191-vm/core/models.py
2026-02-05 16:44:24 +00:00

69 lines
2.5 KiB
Python

from django.db import models
from django.contrib.auth.models import User
from taggit.managers import TaggableManager
class Team(models.Model):
name = models.CharField(max_length=255)
description = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
members = models.ManyToManyField(User, through='TeamMembership', related_name='teams')
def __str__(self):
return self.name
class TeamMembership(models.Model):
ROLE_CHOICES = [
('OWNER', 'Owner'),
('ADMIN', 'Admin'),
('MEMBER', 'Member'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE)
team = models.ForeignKey(Team, on_delete=models.CASCADE)
role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='MEMBER')
joined_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'team')
class Bookmark(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='bookmarks')
url = models.URLField(max_length=1000)
title = models.CharField(max_length=255, blank=True)
notes = models.TextField(blank=True)
is_favorite = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
tags = TaggableManager()
def __str__(self):
return self.title or self.url
class BookmarkShare(models.Model):
bookmark = models.ForeignKey(Bookmark, on_delete=models.CASCADE, related_name='shares')
team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='shared_bookmarks')
shared_by = models.ForeignKey(User, on_delete=models.CASCADE)
shared_at = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('bookmark', 'team')
class Extraction(models.Model):
bookmark = models.OneToOneField(Bookmark, on_delete=models.CASCADE, related_name='extraction')
content_html = models.TextField(blank=True)
content_text = models.TextField(blank=True)
metadata = models.JSONField(default=dict, blank=True)
extracted_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Extraction for {self.bookmark}"
class Summary(models.Model):
bookmark = models.OneToOneField(Bookmark, on_delete=models.CASCADE, related_name='summary')
content = models.TextField()
generated_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Summary for {self.bookmark}"