Skip to content

Commit 090dc0e

Browse files
committed
membership-requests [inveniosoftware#855]: serialize expires_at to UTC-offset datetime string
1 parent 3b877d2 commit 090dc0e

File tree

4 files changed

+26
-6
lines changed

4 files changed

+26
-6
lines changed

Diff for: invenio_communities/members/services/schemas.py

+15-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from datetime import timezone
1313
from types import SimpleNamespace
1414

15+
import arrow
1516
from invenio_i18n import lazy_gettext as _
1617
from invenio_users_resources.proxies import (
1718
current_groups_service,
@@ -54,12 +55,22 @@ class RequestSchema(Schema):
5455
id = fields.String()
5556
status = fields.String()
5657
is_open = fields.Boolean()
57-
# TODO: expires_at is dumped in the index and thus a string. This is
58-
# because the relations field doesn't properly load data from the index
59-
# (it should have converted expires_at into a datetime object).
60-
expires_at = fields.String()
58+
expires_at = fields.Method(serialize="serialize_expires_at")
6159
type = fields.String()
6260

61+
def serialize_expires_at(self, obj):
62+
"""Makes sure that the expires_at datetime is serialized into a UTC offset str.
63+
64+
As of writing, the input `expires_at` is a naive datetime string because
65+
relations field doesn't convert loaded data from the index. We want an aware
66+
UTC timezoned datetime string in ISO format.
67+
68+
:param obj: Request dict
69+
:return: ISO datetime string
70+
"""
71+
aware = arrow.get(obj["expires_at"]).to(timezone.utc)
72+
return aware.isoformat()
73+
6374

6475
#
6576
# Schemas used for validation

Diff for: invenio_communities/templates/semantic-ui/invenio_communities/details/members/membership_requests.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
{{ webpack['invenio-communities-membership-requests.js'] }}
1616
{%- endblock javascript %}
1717

18-
{% set active_members_menu_item = 'membership_requests' %}
1918
{% set active_community_header_menu_item= 'members' %}
19+
{% set active_members_menu_item = 'membership_requests' %}
2020

2121
{%- block settings_body %}
2222

Diff for: tests/conftest.py

+8
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242
CommunityInvitationDeclineNotificationBuilder,
4343
CommunityInvitationExpireNotificationBuilder,
4444
CommunityInvitationSubmittedNotificationBuilder,
45+
CommunityMembershipRequestAcceptNotificationBuilder,
46+
CommunityMembershipRequestCancelNotificationBuilder,
47+
CommunityMembershipRequestDeclineNotificationBuilder,
48+
CommunityMembershipRequestExpireNotificationBuilder,
4549
CommunityMembershipRequestSubmittedNotificationBuilder,
4650
)
4751
from invenio_communities.proxies import current_communities
@@ -124,6 +128,10 @@ def app_config(app_config):
124128
CommunityInvitationDeclineNotificationBuilder.type: CommunityInvitationDeclineNotificationBuilder,
125129
CommunityInvitationExpireNotificationBuilder.type: CommunityInvitationExpireNotificationBuilder,
126130
CommunityInvitationSubmittedNotificationBuilder.type: CommunityInvitationSubmittedNotificationBuilder,
131+
CommunityMembershipRequestAcceptNotificationBuilder.type: CommunityMembershipRequestAcceptNotificationBuilder,
132+
CommunityMembershipRequestCancelNotificationBuilder.type: CommunityMembershipRequestCancelNotificationBuilder,
133+
CommunityMembershipRequestDeclineNotificationBuilder.type: CommunityMembershipRequestDeclineNotificationBuilder,
134+
CommunityMembershipRequestExpireNotificationBuilder.type: CommunityMembershipRequestExpireNotificationBuilder,
127135
CommunityMembershipRequestSubmittedNotificationBuilder.type: CommunityMembershipRequestSubmittedNotificationBuilder,
128136
}
129137

Diff for: tests/members/test_members_services.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1402,7 +1402,8 @@ def test_request_membership_expire_flow(
14021402
hit = hits["hits"][0]
14031403
assert "expired" == hit["request"]["status"]
14041404
assert hit["request"]["is_open"] is False
1405-
1405+
# `expires_at`` is UTC-offset
1406+
assert hit["request"]["expires_at"].endswith("+00:00")
14061407

14071408
#
14081409
# Change notifications

0 commit comments

Comments
 (0)