diff --git a/src/lumina/database/models.py b/src/lumina/database/models.py index df0eb49..9934b18 100644 --- a/src/lumina/database/models.py +++ b/src/lumina/database/models.py @@ -14,7 +14,7 @@ class DynamoExportMixin: def ddict(self: BaseModelProtocol, **kwargs): """dict() export for DynamoDB, removes any Python-only fields, essentially JSON but still in dict form""" - return jsonable_encoder(self.dict(**kwargs)) + return jsonable_encoder(self.model_dump(**kwargs)) class BaseDynamoModel(BaseModel): @@ -96,5 +96,7 @@ class SubmissionModel(BaseDynamoModel, DynamoExportMixin): @property def issue_id(self) -> int: - # TODO: Use this when we have Python 3.9 - return int(self.sk.split("/")[-1]) + try: + return int(self.sk.removeprefix(table.SK_SUBMISSION_PREFIX)) + except ValueError as e: + raise ValueError(f"Invalid target_id: {self.sk}, cannot parse int") from e diff --git a/src/lumina/database/operations.py b/src/lumina/database/operations.py index fb3e719..5ea555c 100644 --- a/src/lumina/database/operations.py +++ b/src/lumina/database/operations.py @@ -131,7 +131,7 @@ def move_anonymous_submissions_to_member( # Create a new submission using the member ID new_member_submissions.append( # Direct copy and change only the PK - put_submission(anonymous_submission.copy(update={"pk": member_id})) + put_submission(anonymous_submission.model_copy(update={"pk": member_id})) ) # Delete the old submission delete_response = get_member_table().delete_item( diff --git a/src/lumina/github/webhooks.py b/src/lumina/github/webhooks.py index 5df0b8a..45a422c 100644 --- a/src/lumina/github/webhooks.py +++ b/src/lumina/github/webhooks.py @@ -46,7 +46,7 @@ def verify_webhook(signature: str, body: bytes) -> bool: def update_issue_from_webhook(webhook: GitHubWebhook) -> None: - github_issue = GitHubIssueModel(**webhook.issue.dict()) + github_issue = GitHubIssueModel(**webhook.issue.model_dump()) github_issue.state = get_state_from_issue(webhook.issue) if not webhook.issue: raise ValueError("Webhook does not contain an issue") diff --git a/tests/unit/lumina/database/test_operations.py b/tests/unit/lumina/database/test_operations.py index 5a47e2b..ec96809 100644 --- a/tests/unit/lumina/database/test_operations.py +++ b/tests/unit/lumina/database/test_operations.py @@ -109,7 +109,7 @@ def _make_submission(id: int, **kwargs) -> SubmissionModel: closed_at=None, comments=0, ), - ).copy(update=kwargs) + ).model_copy(update=kwargs) def test_put_member_submission(): @@ -189,7 +189,7 @@ def test_update_submission_github_issue(): to_close_at = dates.now() operations.update_submission_github_issue( 101, - new_submission.github_issue.copy( + new_submission.github_issue.model_copy( update={ "state": GitHubIssueState.CLOSED, "comments": 5, diff --git a/tests/unit/lumina/endpoints/test_member.py b/tests/unit/lumina/endpoints/test_member.py index 198c415..6bb4d74 100644 --- a/tests/unit/lumina/endpoints/test_member.py +++ b/tests/unit/lumina/endpoints/test_member.py @@ -77,7 +77,7 @@ def test_success_self_first_call( auth_fred_bloggs, snapshot, ): - mock_get_member.return_value = MemberModel(**auth_fred_bloggs.dict()) + mock_get_member.return_value = MemberModel(**auth_fred_bloggs.model_dump()) mock_get_member.return_value.email_verified_at = "2021-01-01T00:00:00" response = client.get("/member/fred_bloggs") assert response.status_code == HTTPStatus.OK, response.json() diff --git a/tests/unit/lumina/endpoints/test_submissions.py b/tests/unit/lumina/endpoints/test_submissions.py index 2443a89..1616308 100644 --- a/tests/unit/lumina/endpoints/test_submissions.py +++ b/tests/unit/lumina/endpoints/test_submissions.py @@ -252,9 +252,9 @@ def test_success_not_authed(self): # This mess needed as pydantic doesn't serialise UUID by default # See https://github.com/samuelcolvin/pydantic/issues/1157 json={ - **submission_request.dict(), + **submission_request.model_dump(), "submitter": { - **submission_request.submitter.dict(), + **submission_request.submitter.model_dump(), "id": str(submission_request.submitter.id), }, }, @@ -311,7 +311,7 @@ def test_success_authed(self, auth_fred_bloggs): ) response = client.post( "/submissions/message", - json=submission_request.dict(), + json=submission_request.model_dump(), ) assert response.status_code == HTTPStatus.OK assert response.json() == { diff --git a/tests/unit/lumina/github/test_webhooks.py b/tests/unit/lumina/github/test_webhooks.py index 416b5eb..4410698 100644 --- a/tests/unit/lumina/github/test_webhooks.py +++ b/tests/unit/lumina/github/test_webhooks.py @@ -87,7 +87,7 @@ def test_issue_closed(self): webhooks.handle_webhook(ISSUE_CLOSED_HOOK) assert mock_update_issue.call_count == 1 assert mock_update_issue.call_args[0][1] == GitHubIssueModel( - **ISSUE_CLOSED_HOOK.issue.dict() + **ISSUE_CLOSED_HOOK.issue.model_dump() ) def test_issue_completed(self):