Coverage for apps/kwai-api/src/kwai_api/v1/portal/applications/presenters.py: 100%

16 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2024-01-01 00:00 +0000

1"""Module for defining presenters for api/v1/portal/applications.""" 

2 

3from typing import Self 

4 

5from kwai_bc_portal.domain.application import ApplicationEntity 

6from kwai_core.domain.presenter import AsyncPresenter, IterableResult, Presenter 

7from kwai_core.json_api import JsonApiPresenter, Meta, ResourceMeta 

8 

9from kwai_api.v1.portal.applications.schemas import ( 

10 ApplicationAttributes, 

11 ApplicationDocument, 

12 ApplicationResource, 

13 ApplicationsDocument, 

14) 

15 

16 

17class JsonApiApplicationPresenter( 

18 JsonApiPresenter[ApplicationDocument], Presenter[ApplicationEntity] 

19): 

20 """A presenter that transforms an application entity into a JSON:API document.""" 

21 

22 def present(self, application: ApplicationEntity) -> Self: 

23 self._document = ApplicationDocument( 

24 data=ApplicationResource( 

25 id=str(application.id), 

26 meta=ResourceMeta( 

27 created_at=str(application.traceable_time.created_at), 

28 updated_at=str(application.traceable_time.created_at), 

29 ), 

30 attributes=ApplicationAttributes( 

31 name=application.name, 

32 title=application.title, 

33 short_description=application.short_description, 

34 description=application.description, 

35 remark=application.remark, 

36 news=application.can_contain_news, 

37 events=application.can_contain_events, 

38 pages=application.can_contain_pages, 

39 weight=application.weight, 

40 ), 

41 ) 

42 ) 

43 return self 

44 

45 

46class JsonApiApplicationsPresenter( 

47 JsonApiPresenter[ApplicationsDocument], 

48 AsyncPresenter[IterableResult[ApplicationEntity]], 

49): 

50 """A presenter that transforms an iterable list of applications into a JSON:API document.""" 

51 

52 async def present(self, result: IterableResult[ApplicationEntity]) -> Self: 

53 self._document = ApplicationsDocument( 

54 meta=Meta(count=result.count, offset=result.offset, limit=result.limit) 

55 ) 

56 async for application in result.iterator: 

57 application_document = ( 

58 JsonApiApplicationPresenter().present(application).get_document() 

59 ) 

60 self._document.data.append(application_document.data) 

61 return self