abstract "update profile" button across protocols

adds new /[protocol]/[id]/update-profile endpoint
pull/968/head
Ryan Barrett 2024-04-22 20:21:56 -07:00
rodzic 03b0f54cfe
commit 115d85909a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 52 dodań i 7 usunięć

Wyświetl plik

@ -19,6 +19,8 @@ from oauth_dropins.webutil.flask_util import (
flash,
redirect,
)
import requests
import werkzeug.exceptions
import common
from common import DOMAIN_RE
@ -27,6 +29,7 @@ import ids
from models import fetch_objects, fetch_page, Follower, Object, PAGE_SIZE, PROTOCOLS
from protocol import Protocol
# precompute this because we get a ton of requests for non-existing users
# from weird open redirect referrers:
# https://github.com/snarfed/bridgy-fed/issues/422
@ -160,6 +163,30 @@ def notifications(protocol, id):
return render_template('notifications.html', **TEMPLATE_VARS, **locals())
@app.post(f'/<any({",".join(PROTOCOLS)}):protocol>/<id>/update-profile')
@canonicalize_request_domain(common.PROTOCOL_DOMAINS, common.PRIMARY_DOMAIN)
def update_profile(protocol, id):
user = load_user(protocol, id)
try:
profile_obj = user.load(user.profile_id(), remote=True)
if profile_obj:
msg, status = user.receive(profile_obj)
else:
status = 400
msg = "couldn't fetch profile"
except (requests.RequestException, werkzeug.exceptions.HTTPException) as e:
status, msg = util.interpret_http_exception(e)
if int(status) // 100 == 2:
flash(f'Updating profile for {user.handle_or_id()}')
else:
flash(f"Couldn't update profile for {user.handle_or_id()}: {msg}")
return redirect(user.user_page_path(), code=302)
@app.get(f'/<any({",".join(PROTOCOLS)}):protocol>/<id>/<any(followers,following):collection>')
@canonicalize_request_domain(common.PROTOCOL_DOMAINS, common.PRIMARY_DOMAIN)
def followers_or_following(protocol, id, collection):

Wyświetl plik

@ -47,13 +47,10 @@
{{ user.handle_or_id() }}
</a>
{% if user.LABEL == 'web' %}
<form method="post" action="/webmention-interactive">
<input name="source" type="hidden" value="{{ user.web_url() }}" />
<button id="update-profile-button" type="submit" title="Update profile"
class="btn btn-default glyphicon glyphicon-refresh"></button>
</form>
{% endif %}
<form method="post" action="{{ user.user_page_path('update-profile') }}">
<button id="update-profile-button" type="submit" title="Update profile"
class="btn btn-default glyphicon glyphicon-refresh"></button>
</form>
</nobr>
</span>

Wyświetl plik

@ -168,6 +168,27 @@ class PagesTest(TestCase):
got = self.client.get('/web/user.com?before=2024-01-01+01:01:01&after=2023-01-01+01:01:01')
self.assert_equals(400, got.status_code)
def test_update_profile(self):
self.make_user('fake:user', cls=Fake)
actor = {
'objectType': 'person',
'id': 'fake:user',
'displayName': 'Ms User',
}
Fake.fetchable = {'fake:user': actor}
got = self.client.post('/fa/fake:user/update-profile')
self.assert_equals(302, got.status_code)
self.assert_equals('/fa/fake:handle:user', got.headers['Location'])
self.assertEqual(['Updating profile for fake:handle:user'],
get_flashed_messages())
self.assertEqual(['fake:user'], Fake.fetched)
self.assert_object('fake:user', source_protocol='fake', our_as1={
**actor,
'updated': '2022-01-02T03:04:05+00:00',
})
def test_followers(self):
Follower.get_or_create(
to=self.user,