From 22931452e377f8434233655ec861410e565b5ca5 Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 27 Aug 2026 03:14:01 +0200 Subject: [PATCH] stash --- backend/authentication/admin.py | 7 +++++++ backend/toolshed/serializers.py | 12 ++++++------ backend/toolshed/tests/test_friend.py | 8 ++++---- backend/toolshed/tests/test_idmap.py | 6 +++--- frontend/src/components/UserNameTag.vue | 2 +- frontend/src/store.js | 8 ++++---- frontend/src/views/Friends.vue | 6 +++--- 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/backend/authentication/admin.py b/backend/authentication/admin.py index 50dfdbe..be119bb 100644 --- a/backend/authentication/admin.py +++ b/backend/authentication/admin.py @@ -1,8 +1,15 @@ from django.contrib import admin +from django.contrib.auth.models import Group as DjangoPermissionGroup from authentication.models import ToolshedUser, KnownIdentity, FriendRequestOutgoing, FriendRequestIncoming, \ AccountPreference, Group, GroupInvite, GroupInviteIncoming, GroupMembership +# django.contrib.auth's own permission-groups model is unused (this app authenticates via +# signature_auth, not Django's built-in permission system) and otherwise collides in the admin +# sidebar with our own Group (the actor-type group), which is registered below under the same +# "Groups" label. +admin.site.unregister(DjangoPermissionGroup) + class ToolshedUserAdmin(admin.ModelAdmin): list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'is_active', 'date_joined', 'domain') diff --git a/backend/toolshed/serializers.py b/backend/toolshed/serializers.py index 846117b..586e958 100644 --- a/backend/toolshed/serializers.py +++ b/backend/toolshed/serializers.py @@ -50,13 +50,13 @@ def resolve_tag_handle(handle): class FriendSerializer(serializers.ModelSerializer): - username = serializers.SerializerMethodField() + handle = serializers.SerializerMethodField() class Meta: model = KnownIdentity - fields = ['id', 'username', 'public_key'] + fields = ['id', 'handle', 'public_key'] - def get_username(self, obj): + def get_handle(self, obj): return obj.username + '@' + obj.domain @@ -72,13 +72,13 @@ class FriendRequestSerializer(serializers.ModelSerializer): class GroupMemberSerializer(serializers.ModelSerializer): - username = serializers.SerializerMethodField() + handle = serializers.SerializerMethodField() class Meta: model = KnownIdentity - fields = ['id', 'username', 'public_key'] + fields = ['id', 'handle', 'public_key'] - def get_username(self, obj): + def get_handle(self, obj): return obj.username + '@' + obj.domain diff --git a/backend/toolshed/tests/test_friend.py b/backend/toolshed/tests/test_friend.py index 202030b..cb0bf1e 100644 --- a/backend/toolshed/tests/test_friend.py +++ b/backend/toolshed/tests/test_friend.py @@ -63,20 +63,20 @@ class FriendApiTestCase(UserTestMixin, ToolshedTestCase): reply = client.get('/api/friends/', self.f['local_user1']) self.assertEqual(reply.status_code, 200) self.assertEqual(len(reply.json()), 2) - self.assertEqual(reply.json()[0]['username'], str(self.f['local_user2'])) - self.assertEqual(reply.json()[1]['username'], str(self.f['ext_user1'])) + self.assertEqual(reply.json()[0]['handle'], str(self.f['local_user2'])) + self.assertEqual(reply.json()[1]['handle'], str(self.f['ext_user1'])) def test_friend_list_internal2(self): reply = client.get('/api/friends/', self.f['local_user2']) self.assertEqual(reply.status_code, 200) self.assertEqual(len(reply.json()), 1) - self.assertEqual(reply.json()[0]['username'], str(self.f['local_user1'])) + self.assertEqual(reply.json()[0]['handle'], str(self.f['local_user1'])) def test_friend_list_external(self): reply = client.get('/api/friends/', self.f['ext_user1']) self.assertEqual(reply.status_code, 200) self.assertEqual(len(reply.json()), 1) - self.assertEqual(reply.json()[0]['username'], str(self.f['local_user1'])) + self.assertEqual(reply.json()[0]['handle'], str(self.f['local_user1'])) def test_friend_delete(self): reply = client.delete('/api/friends/{}/'.format(self.f['local_user2'].public_identity.id), diff --git a/backend/toolshed/tests/test_idmap.py b/backend/toolshed/tests/test_idmap.py index fba74db..bc54941 100644 --- a/backend/toolshed/tests/test_idmap.py +++ b/backend/toolshed/tests/test_idmap.py @@ -16,20 +16,20 @@ class IdMapTestCase(UserTestMixin, GroupTestMixin, ToolshedTestCase): reply = client.get('/api/idmap/', self.f['local_user1']) self.assertEqual(reply.status_code, 200) identities = reply.json()['identities'] - self.assertIn(str(self.f['local_user1']), [i['username'] for i in identities]) + self.assertIn(str(self.f['local_user1']), [i['handle'] for i in identities]) def test_idmap_includes_friends(self): self.f['local_user1'].friends.add(self.f['local_user2'].public_identity) reply = client.get('/api/idmap/', self.f['local_user1']) self.assertEqual(reply.status_code, 200) identities = reply.json()['identities'] - self.assertIn(str(self.f['local_user2']), [i['username'] for i in identities]) + self.assertIn(str(self.f['local_user2']), [i['handle'] for i in identities]) def test_idmap_excludes_non_friends(self): reply = client.get('/api/idmap/', self.f['local_user1']) self.assertEqual(reply.status_code, 200) identities = reply.json()['identities'] - self.assertNotIn(str(self.f['local_user2']), [i['username'] for i in identities]) + self.assertNotIn(str(self.f['local_user2']), [i['handle'] for i in identities]) def test_idmap_includes_member_groups(self): self.prepare_groups() diff --git a/frontend/src/components/UserNameTag.vue b/frontend/src/components/UserNameTag.vue index abd3b49..450645f 100644 --- a/frontend/src/components/UserNameTag.vue +++ b/frontend/src/components/UserNameTag.vue @@ -39,7 +39,7 @@ export default { computed: { ...mapGetters(['allUserProfiles']), displayUsername() { - return this.user.username || this.user.owner || ''; + return this.user.handle || this.user.owner || ''; }, profilePictureUrl() { // Check for explicitly set profile picture from allUserProfiles getter diff --git a/frontend/src/store.js b/frontend/src/store.js index c79eb25..6c6b85b 100644 --- a/frontend/src/store.js +++ b/frontend/src/store.js @@ -370,11 +370,11 @@ export default createStore({ servers.add(home) for (const friend of friends) { try { - const s = await dispatch('lookupServer', {username: friend.username}) + const s = await dispatch('lookupServer', {username: friend.handle}) servers.add(new ServerSet(s, state.unreachable_neighbors)) } catch (e) { // Skip an unresolvable/unreachable friend rather than aborting the whole lookup. - console.error('could not resolve server for friend', friend.username, e) + console.error('could not resolve server for friend', friend.handle, e) } } return servers @@ -893,13 +893,13 @@ export default createStore({ groupInventoryItems: (state) => (groupHandle) => state.item_map['/' + groupHandle] || [], groupStorageLocations: (state) => (groupHandle) => state.location_map['/' + groupHandle] || [], identityIdByHandle(state) { - return Object.fromEntries(state.idmap.identities.map(i => [i.username, i.id])) + return Object.fromEntries(state.idmap.identities.map(i => [i.handle, i.id])) }, groupIdByHandle(state) { return Object.fromEntries(state.idmap.groups.map(g => [g.handle, g.id])) }, identityHandleById(state) { - return Object.fromEntries(state.idmap.identities.map(i => [i.id, i.username])) + return Object.fromEntries(state.idmap.identities.map(i => [i.id, i.handle])) }, groupHandleById(state) { return Object.fromEntries(state.idmap.groups.map(g => [g.id, g.handle])) diff --git a/frontend/src/views/Friends.vue b/frontend/src/views/Friends.vue index 9d9bc2b..173d202 100644 --- a/frontend/src/views/Friends.vue +++ b/frontend/src/views/Friends.vue @@ -142,8 +142,8 @@ export default { const friendsList = Array.isArray(friends) ? friends : Object.values(friends); friendsList.map((friend) => { this.lookupServer(friend).then((server) => { - this.friends[friend.username] = {...friend, server: server} - this.fetchFriendProfile({username: friend.username}); + this.friends[friend.handle] = {...friend, server: server} + this.fetchFriendProfile({username: friend.handle}); }) }) }) @@ -175,7 +175,7 @@ export default { tryDropFriend(friend) { this.dropFriend(friend).then((ok) => { if (ok) { - delete this.friends[friend.username] + delete this.friends[friend.handle] } }).catch(() => { })