Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions src/pardner/services/strava.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ def _convert_to_datetime(self, raw_datetime: str | None) -> datetime | None:
return datetime.strptime(raw_datetime, '%Y-%m-%dT%H:%M:%SZ')
return None

def _parse_social_posting(self, raw_data: Any) -> SocialPostingVertical | None:
def parse_social_posting_vertical(
self, raw_data: Any
) -> SocialPostingVertical | None:
"""
Given the response from the API request, creates a
:class:`SocialPostingVertical` model object, if possible.
Expand Down Expand Up @@ -114,8 +116,12 @@ def _parse_social_posting(self, raw_data: Any) -> SocialPostingVertical | None:
for photo_url in photo_urls
]

athlete_id = str(raw_data_dict['athlete'].get('id'))

return SocialPostingVertical(
creator_user_id=str(raw_data_dict['athlete'].get('id')),
creator_user_id=athlete_id,
data_owner_id=athlete_id,
service_object_id=raw_data_dict.get('id'),
service=self._service_name,
created_at=created_at,
url=url_str,
Expand Down Expand Up @@ -150,15 +156,15 @@ def fetch_social_posting_vertical(
'athlete/activities', params={'per_page': count, **request_params}
).json()
return [
self._parse_social_posting(raw_social_posting)
self.parse_social_posting_vertical(raw_social_posting)
for raw_social_posting in raw_social_postings
], raw_social_postings
raise UnsupportedRequestException(
self._service_name,
f'can only make a request for at most {max_count} posts at a time.',
)

def _parse_physical_activity(
def parse_physical_activity_vertical(
self, raw_data: Any
) -> PhysicalActivityVertical | None:
"""
Expand All @@ -170,7 +176,7 @@ def _parse_physical_activity(
:returns: :class:`PhysicalActivityVertical` or ``None``, depending on whether it
was possible to extract data from the response
"""
social_posting = self._parse_social_posting(raw_data)
social_posting = self.parse_social_posting_vertical(raw_data)
if not social_posting:
return None

Expand Down Expand Up @@ -233,7 +239,7 @@ def fetch_physical_activity_vertical(
'athlete/activities', params={'per_page': count, **request_params}
).json()
return [
self._parse_physical_activity(raw_activity)
self.parse_physical_activity_vertical(raw_activity)
for raw_activity in raw_activities
], raw_activities
raise UnsupportedRequestException(
Expand Down
26 changes: 23 additions & 3 deletions src/pardner/verticals/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from datetime import datetime
from typing import Type

from pydantic import AnyHttpUrl, BaseModel, Field
from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field


class BaseVertical(BaseModel, ABC):
Expand All @@ -13,8 +13,28 @@ class BaseVertical(BaseModel, ABC):
supported by every transfer service.
"""

id: str = Field(default_factory=lambda: uuid.uuid4().hex)
creator_user_id: str
model_config = ConfigDict(coerce_numbers_to_str=True)

pardner_object_id: str = Field(
default_factory=lambda: uuid.uuid4().hex,
description='The id of the vertical object for identification from pardner. '
'Differs from the service_generated_id, which is created by the service.',
)
service_object_id: str | None = Field(
description='The id of the vertical object, generated by the service itself '
'rather than pardner.',
default=None,
)

creator_user_id: str | None = Field(
description='The user who created the vertical. '
'May or may not be the data owner. Generated by the service.',
default=None,
)
data_owner_id: str = Field(
description='The id of the user whose data the vertical object comes from. '
'Generated by the service.'
)
service: str = Field(
description='The name of the service the data was pulled from.'
)
Expand Down
2 changes: 2 additions & 0 deletions src/pardner/verticals/conversation_direct.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ class ConversationDirectVertical(ConversationVertical):
"""

vertical_name: str = 'conversation_direct'

is_group_conversation: bool = False
members_count: int = 2
8 changes: 6 additions & 2 deletions tests/test_transfer_services/test_strava.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,12 @@ def test_fetch_physical_activity_vertical(mocker, mock_strava_transfer_service):
)

model_obj1_json = model_obj1.model_dump()
del model_obj1_json['id']
del model_obj1_json['pardner_object_id']

assert model_obj1_json == {
'service_object_id': '154504250376823',
'creator_user_id': '134815',
'data_owner_id': '134815',
'service': 'Strava',
'vertical_name': 'physical_activity',
'created_at': datetime.datetime(2018, 5, 2, 12, 15, 9),
Expand Down Expand Up @@ -216,10 +218,12 @@ def test_fetch_physical_activity_vertical(mocker, mock_strava_transfer_service):
}

model_obj2_json = model_obj2.model_dump()
del model_obj2_json['id']
del model_obj2_json['pardner_object_id']

assert model_obj2_json == {
'service_object_id': '1234567809',
'creator_user_id': '167560',
'data_owner_id': '167560',
'service': 'Strava',
'vertical_name': 'physical_activity',
'created_at': datetime.datetime(2018, 4, 30, 12, 35, 51),
Expand Down