Add desktop note collections
This commit is contained in:
+39
-1
@@ -35,7 +35,7 @@ def without_markdown_code(text):
|
||||
def delete_unused_tags(tags=None):
|
||||
"""Delete tags that are no longer used by items or tag-based features."""
|
||||
candidates = Tag.objects.all() if tags is None else Tag.objects.filter(pk__in=[tag.pk for tag in tags])
|
||||
candidates.filter(items__isnull=True, kanbans__isnull=True, api_keys__isnull=True).exclude(
|
||||
candidates.filter(items__isnull=True, kanbans__isnull=True, api_keys__isnull=True, collections__isnull=True).exclude(
|
||||
name__in=Team.objects.values_list('slug', flat=True),
|
||||
).delete()
|
||||
|
||||
@@ -195,6 +195,44 @@ class Kanban(models.Model):
|
||||
return self.name
|
||||
|
||||
|
||||
class Collection(models.Model):
|
||||
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='collections')
|
||||
team = models.ForeignKey(Team, on_delete=models.SET_NULL, blank=True, null=True, related_name='collections')
|
||||
title = models.CharField(max_length=200)
|
||||
description = models.TextField(blank=True)
|
||||
visibility = models.CharField(max_length=10, choices=Item.Visibility.choices, default=Item.Visibility.PRIVATE)
|
||||
tags = models.ManyToManyField(Tag, blank=True, related_name='collections')
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['-updated_at']
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('collection_detail', args=[self.pk])
|
||||
|
||||
|
||||
class CollectionSection(models.Model):
|
||||
collection = models.ForeignKey(Collection, on_delete=models.CASCADE, related_name='sections')
|
||||
item = models.ForeignKey(Item, on_delete=models.PROTECT, related_name='collection_sections')
|
||||
title = models.CharField(max_length=200, blank=True)
|
||||
position = models.PositiveIntegerField(default=0)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['position', 'id']
|
||||
constraints = [
|
||||
models.UniqueConstraint(fields=['collection', 'item'], name='unique_collection_item'),
|
||||
models.UniqueConstraint(fields=['collection', 'position'], name='unique_collection_position'),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f'{self.collection}: {self.title or self.item}'
|
||||
|
||||
|
||||
class UserPreference(models.Model):
|
||||
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='preferences')
|
||||
language = models.CharField(max_length=10, blank=True, default='', choices=[('', _('Browser default')), ('de', 'Deutsch'), ('en', 'English')])
|
||||
|
||||
Reference in New Issue
Block a user