Improve collection editing and rendering

This commit is contained in:
rucki
2026-08-30 13:05:57 +02:00
parent 5aeb12899b
commit d5917d411a
5 changed files with 172 additions and 14 deletions
+31 -1
View File
@@ -163,6 +163,8 @@ def user_can_delete_item(user, item):
def desired_item_scope(item, user, force_private=False):
if force_private:
return Item.Visibility.PRIVATE, None
if item.visibility == Item.Visibility.PUBLIC:
return Item.Visibility.PUBLIC, None
tag_names = {match.group(1).lower() for match in re.finditer(r'(?<!\w)#([\wäöüÄÖÜß-]+)', item.content)}
membership = TeamMembership.objects.select_related('team').filter(user=user, team__slug__in=tag_names).first()
if membership:
@@ -187,6 +189,10 @@ def apply_team_from_tags(item, user, force_private=False):
item.visibility = Item.Visibility.PRIVATE
item.save(update_fields=['team', 'visibility', 'updated_at'])
return
if item.visibility == Item.Visibility.PUBLIC:
item.team = None
item.save(update_fields=['team', 'updated_at'])
return
tag_names = list(item.tags.values_list('name', flat=True))
membership = TeamMembership.objects.select_related('team').filter(user=user, team__slug__in=tag_names).first()
if membership:
@@ -980,6 +986,29 @@ def api_item_suggestions(request):
return JsonResponse({'items': data})
def api_items_queryset(request, user, api_key=None):
items = visible_items(user, api_key)
tags = [tag.strip().lstrip('#').lower() for tag in request.GET.getlist('tag') if tag.strip()]
if tags:
if request.GET.get('tag_mode') == 'all':
for tag in tags:
items = items.filter(tags__name=tag)
else:
items = items.filter(tags__name__in=tags).distinct()
q = request.GET.get('q', '').strip()
if q:
items = items.filter(Q(content__icontains=q) | Q(comment__icontains=q) | Q(url__icontains=q) | Q(tags__name__icontains=q)).distinct()
return items
def api_items_limit(request):
try:
limit = int(request.GET.get('limit', 200))
except (TypeError, ValueError):
limit = 200
return max(1, min(limit, 500))
def serialize_item(item):
return {
'id': item.id,
@@ -1006,7 +1035,8 @@ def serialize_item(item):
def api_items(request):
user = request.api_key.owner if request.api_key else request.user
if request.method == 'GET':
return JsonResponse({'items': [serialize_item(i) for i in visible_items(user, request.api_key)[:200]]})
items = api_items_queryset(request, user, request.api_key)[:api_items_limit(request)]
return JsonResponse({'items': [serialize_item(i) for i in items]})
data = json.loads(request.body or '{}') if request.content_type == 'application/json' else request.POST
raw = data.get('content', '')
raw, command_due_at, _ = parse_due_command(raw)