51 lines
2.4 KiB
Python
51 lines
2.4 KiB
Python
from datetime import datetime, time
|
|
|
|
from django.db.models import Q
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
from django.utils.translation import gettext as _
|
|
|
|
from .models import Item, UserPreference, WorkspaceMembership, get_or_create_personal_workspace
|
|
|
|
|
|
def active_workspace_navigation(request):
|
|
if not request.user.is_authenticated:
|
|
return {'active_workspace': None, 'workspace_memberships': []}
|
|
workspace = get_or_create_personal_workspace(request.user)
|
|
workspace_id = request.session.get('workspace_id')
|
|
if workspace_id:
|
|
membership = WorkspaceMembership.objects.select_related('workspace').filter(user=request.user, workspace_id=workspace_id).first()
|
|
if membership:
|
|
workspace = membership.workspace
|
|
memberships = list(WorkspaceMembership.objects.filter(user=request.user).select_related('workspace').order_by('workspace__name'))
|
|
today_end = timezone.make_aware(datetime.combine(timezone.localdate(), time(23, 59, 59)))
|
|
for membership in memberships:
|
|
team_ids = request.user.team_memberships.filter(team__workspace=membership.workspace).values_list('team_id', flat=True)
|
|
membership.due_count = Item.objects.filter(
|
|
workspace=membership.workspace, kind=Item.Kind.TODO, is_done=False, due_at__lte=today_end,
|
|
).filter(Q(owner=request.user) | Q(assignee=request.user) | Q(team_id__in=team_ids) | Q(visibility=Item.Visibility.PUBLIC)).distinct().count()
|
|
return {
|
|
'active_workspace': workspace,
|
|
'workspace_memberships': memberships,
|
|
}
|
|
|
|
|
|
def overview_navigation(request):
|
|
if not request.user.is_authenticated:
|
|
return {'nav_overview_labels': [_('Notes'), _('Tasks'), _('Links')], 'nav_hidden_links': []}
|
|
prefs, _created = UserPreference.objects.get_or_create(user=request.user)
|
|
overview = []
|
|
hidden = []
|
|
task_shown = prefs.show_open_todos or prefs.show_done_todos
|
|
items = [
|
|
(task_shown, _('Tasks'), f"{reverse('index')}?kind=todo"),
|
|
(prefs.show_notes, _('Notes'), f"{reverse('index')}?kind=note"),
|
|
(prefs.show_links, _('Links'), f"{reverse('index')}?kind=link"),
|
|
]
|
|
for shown, label, url in items:
|
|
if shown:
|
|
overview.append(label)
|
|
else:
|
|
hidden.append({'label': label, 'url': url})
|
|
return {'nav_overview_labels': overview or [_('Overview')], 'nav_hidden_links': hidden}
|