From 2a1b199558e9edc11c735f6fab25d848dc6c6a22 Mon Sep 17 00:00:00 2001 From: Ryan Barrett Date: Fri, 3 Feb 2023 08:10:09 -0800 Subject: [PATCH] Activity => Object: user dashboard UI bug fixes, add missing Object index --- index.yaml | 7 +++++++ models.py | 13 +++++++------ pages.py | 12 +++--------- tests/test_models.py | 17 +++++++++++++++++ 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/index.yaml b/index.yaml index 0c84d9c..b026f03 100644 --- a/index.yaml +++ b/index.yaml @@ -20,6 +20,13 @@ indexes: - name: updated direction: desc +- kind: Object + properties: + - name: domains + - name: labels + - name: created + direction: desc + - kind: Follower properties: - name: dest diff --git a/models.py b/models.py index 9d2f741..898a876 100644 --- a/models.py +++ b/models.py @@ -334,15 +334,16 @@ class Object(StringIdModel): return common.host_url('render?' + urllib.parse.urlencode({'id': self.key.id()})) - def actor_link(self, as1=None): + def actor_link(self): """Returns a pretty actor link with their name and profile picture.""" - if self.direction == 'out' and self.domains: + if self.source_protocol == 'webmention' and self.domains: + # TODO: why do we do this?! return User.get_by_id(self.domains[0]).user_page_link() - if not as1: - as1 = self.to_as1() - - actor = util.get_first(as1, 'actor') or util.get_first(as1, 'author') or {} + activity = json_loads(self.as1) + actor = (util.get_first(activity, 'actor') + or util.get_first(activity, 'author') + or {}) if isinstance(actor, str): return util.pretty_link(actor) diff --git a/pages.py b/pages.py index 5aaabbb..8cb5151 100644 --- a/pages.py +++ b/pages.py @@ -63,11 +63,6 @@ def check_web_site(): return redirect(f'/user/{user.key.id()}') -@app.get(f'/responses/') # deprecated -def user_deprecated(domain): - return redirect(f'/user/{domain}', code=301) - - @app.get(f'/user/') def user(domain): user = User.get_by_id(domain) @@ -80,7 +75,7 @@ def user(domain): query = Object.query( Object.domains == domain, - Object.labels == 'notification', + Object.labels.IN(('notification', 'user')), ) objects, before, after = fetch_objects(query) @@ -173,12 +168,11 @@ def fetch_objects(query): new_before, new_after: str query param values for `before` and `after` to fetch the previous and next pages, respectively """ - orig_objects, new_before, new_after = common.fetch_page(query, Object) - objects = [] + objects, new_before, new_after = common.fetch_page(query, Object) seen = set() # synthesize human-friendly content for objects - for i, obj in enumerate(orig_objects): + for i, obj in enumerate(objects): obj_as1 = json_loads(obj.as1) # synthesize text snippet diff --git a/tests/test_models.py b/tests/test_models.py index 19802b6..d3d4ca6 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -174,6 +174,23 @@ class ObjectTest(testutil.TestCase): obj = Object(id='abc', as1='{}') self.assertEqual('http://localhost/render?id=abc', obj.proxy_url()) + def test_actor_url(self): + for expected, as1 in ( + ('', {}), + ('foo', {'actor': 'http://foo'}), + ('Alice', {'actor': {'displayName': 'Alice'}}), + ('Alice', {'actor': { + 'displayName': 'Alice', + 'url': 'http://foo', + }}), + ("""\ + + + Alice + """, {'actor': {'displayName': 'Alice', 'image': 'http://pic'}}), + ): + self.assertEqual(expected, Object(id='x', as1=json_dumps(as1)).actor_link()) + class FollowerTest(testutil.TestCase):