Add workspace due indicators and todo assignment

This commit is contained in:
rucki
2026-09-11 12:19:38 +02:00
parent 291c8db471
commit d7472554df
7 changed files with 135 additions and 7 deletions
+64
View File
@@ -104,6 +104,70 @@ class WorkspaceTenancyTests(TestCase):
self.client.force_login(outsider)
self.assertNotContains(self.client.get(reverse('index')), 'Workspace public')
def test_workspace_switcher_shows_due_counts_for_other_workspaces(self):
user = get_user_model().objects.create_user(username='workspace-due', password='secret')
personal = get_or_create_personal_workspace(user)
company = Workspace.objects.create(owner=user, name='Company Due', slug='company-due')
WorkspaceMembership.objects.create(workspace=company, user=user, role=WorkspaceMembership.Role.OWNER)
due = timezone.make_aware(datetime.combine(timezone.localdate(), time(12, 0)))
Item.objects.create(workspace=company, owner=user, kind=Item.Kind.TODO, content='Due elsewhere', due_at=due)
self.client.force_login(user)
self.client.post(reverse('workspace_switch', args=[personal.id]), {'next': reverse('index')})
response = self.client.get(reverse('index'))
self.assertContains(response, 'Company Due')
self.assertContains(response, 'text-bg-danger">1</span>')
self.assertNotContains(response, 'Due elsewhere')
def test_todo_can_be_assigned_to_workspace_member_with_mention(self):
owner = get_user_model().objects.create_user(username='assign-owner', password='secret')
assignee = get_user_model().objects.create_user(username='alice', password='secret')
workspace = Workspace.objects.create(owner=owner, name='Assign Co', slug='assign-co')
WorkspaceMembership.objects.create(workspace=workspace, user=owner, role=WorkspaceMembership.Role.OWNER)
WorkspaceMembership.objects.create(workspace=workspace, user=assignee, role=WorkspaceMembership.Role.MEMBER)
self.client.force_login(owner)
self.client.post(reverse('workspace_switch', args=[workspace.id]), {'next': reverse('index')})
response = self.client.post(reverse('index'), {'content': '/todo Prepare report @alice'})
self.assertRedirects(response, reverse('index'))
item = Item.objects.get(content='Prepare report @alice')
self.assertEqual(item.workspace, workspace)
self.assertEqual(item.assignee, assignee)
def test_assigned_private_todo_is_visible_to_assignee(self):
owner = get_user_model().objects.create_user(username='assign-owner2', password='secret')
assignee = get_user_model().objects.create_user(username='bob', password='secret')
workspace = Workspace.objects.create(owner=owner, name='Assign Co 2', slug='assign-co-2')
WorkspaceMembership.objects.create(workspace=workspace, user=owner, role=WorkspaceMembership.Role.OWNER)
WorkspaceMembership.objects.create(workspace=workspace, user=assignee, role=WorkspaceMembership.Role.MEMBER)
Item.objects.create(workspace=workspace, owner=owner, assignee=assignee, kind=Item.Kind.TODO, content='Assigned private')
self.client.force_login(assignee)
self.client.post(reverse('workspace_switch', args=[workspace.id]), {'next': reverse('index')})
response = self.client.get(reverse('index'))
self.assertContains(response, 'Assigned private')
self.assertContains(response, '@bob')
def test_team_todo_assignment_requires_team_membership(self):
owner = get_user_model().objects.create_user(username='assign-owner3', password='secret')
non_team_member = get_user_model().objects.create_user(username='charlie', password='secret')
workspace = Workspace.objects.create(owner=owner, name='Assign Co 3', slug='assign-co-3')
WorkspaceMembership.objects.create(workspace=workspace, user=owner, role=WorkspaceMembership.Role.OWNER)
WorkspaceMembership.objects.create(workspace=workspace, user=non_team_member, role=WorkspaceMembership.Role.MEMBER)
team = Team.objects.create(workspace=workspace, owner=owner, name='Ops', slug='ops')
TeamMembership.objects.create(team=team, user=owner, role=TeamMembership.Role.OWNER)
self.client.force_login(owner)
self.client.post(reverse('workspace_switch', args=[workspace.id]), {'next': reverse('index')})
self.client.post(reverse('index'), {'content': '/todo Team task @charlie #ops'})
item = Item.objects.get(content='Team task @charlie #ops')
self.assertEqual(item.team, team)
self.assertIsNone(item.assignee)
def test_authenticated_overview_is_limited_to_current_workspace(self):
user = get_user_model().objects.create_user(username='tenant-visible', password='secret')
other = get_user_model().objects.create_user(username='tenant-other', password='secret')