Coverage for src/henrri_connect/document_lines/synchro.py: 96%

25 statements  

« prev     ^ index     » next       coverage.py v7.14.1, created at 2026-06-09 19:37 +0200

1""" 

2Sous-client pour les endpoints /v1/documents/{documentId}/lines. 

3 

4Classes: 

5- ``henrri_connect.document_lines.synchro.SyncDocumentLinesClient`` 

6 Accès synchrone aux endpoints lignes de documents. 

7 

8Notes: 

9- Utiliser de préférence l'objet ``henrri_connect.SyncHenrriClient`` pour acceder aux endpoints. 

10""" 

11 

12from __future__ import annotations 

13 

14from typing import TYPE_CHECKING, Optional 

15 

16from ..models import DocumentLine, ListResponse, DocumentLineListQueryParameters 

17 

18if TYPE_CHECKING: 

19 from ..connect import SyncHenrriClient 

20 

21DOCUMENT_ENDPOINT = "/v1/documents" 

22 

23class SyncDocumentLinesClient: 

24 """ 

25 Accès synchrone aux lignes de document. 

26 

27 Arguments 

28 - ``client`` : Objet ``henrri_connect.SyncHenrriClient``. 

29 

30 Methods 

31 - ``list_document_lines`` : Liste les lignes d'un document. 

32 - ``add`` : Ajoute une ligne à un document. 

33 - ``get`` : Récupère une ligne de document par son identifiant. 

34 - ``modify`` : Met à jour une ligne de document. 

35 - ``delete`` : Supprime une ligne de document. 

36 - ``move`` : Déplace une ligne vers une position donnée. 

37 """ 

38 

39 def __init__(self, client: SyncHenrriClient) -> None: 

40 self._c = client 

41 

42 def list_document_lines( 

43 self, 

44 document_id: int, 

45 query_params: Optional[DocumentLineListQueryParameters] = None, 

46 ) -> ListResponse[DocumentLine]: 

47 """ 

48 Liste les lignes d'un document. 

49 

50 Arguments 

51 - ``document_id`` (int) : Identifiant du document (min 1 et max 2 147 483 647). 

52 - ``query_params`` (DocumentLineListQueryParameters, optional) : Paramètres de requête. 

53 

54 Returns 

55 - ``ListResponse[DocumentLine]`` : Liste de lignes de document. 

56 """ 

57 if query_params: 

58 resp = self._c.request( 

59 "GET", 

60 f"{DOCUMENT_ENDPOINT}/{document_id}/lines", 

61 params=query_params.model_dump( 

62 by_alias=True, 

63 exclude_unset=True, 

64 exclude_none=True 

65 ), 

66 ) 

67 else: 

68 resp = self._c.request("GET", f"{DOCUMENT_ENDPOINT}/{document_id}/lines") 

69 return ListResponse[DocumentLine].model_validate(resp.json()) 

70 

71 def add(self, document_id: int, line: DocumentLine) -> DocumentLine: 

72 """ 

73 Ajoute une ligne à un document. 

74 

75 Arguments 

76 - ``document_id`` : Identifiant du document. 

77 - ``line`` : Ligne de document. 

78 

79 Returns 

80 - ``DocumentLine`` : Ligne de document ajoutée. 

81 """ 

82 resp = self._c.request( 

83 "POST", 

84 f"{DOCUMENT_ENDPOINT}/{document_id}/lines", 

85 json=line.model_dump(by_alias=True, exclude_unset=True, exclude_none=True), 

86 ) 

87 return DocumentLine.model_validate(resp.json()) 

88 

89 def get(self, document_id: int, line_id: int) -> DocumentLine: 

90 """ 

91 Récupère une ligne de document par son identifiant. 

92 

93 Arguments 

94 - ``document_id`` : Identifiant du document. 

95 - ``line_id`` : Identifiant de la ligne de document. 

96 

97 Returns 

98 - ``DocumentLine`` : Ligne de document. 

99 """ 

100 resp = self._c.request("GET", f"{DOCUMENT_ENDPOINT}/{document_id}/lines/{line_id}") 

101 return DocumentLine.model_validate(resp.json()) 

102 

103 def modify(self, document_id: int, line_id: int, line: DocumentLine) -> DocumentLine: 

104 """ 

105 Met à jour une ligne de document. 

106 

107 Arguments 

108 - ``document_id`` : Identifiant du document. 

109 - ``line_id`` : Identifiant de la ligne de document. 

110 - ``line`` : Ligne de document. 

111 

112 Returns 

113 - ``DocumentLine`` : Ligne de document modifiée. 

114 """ 

115 resp = self._c.request( 

116 "PUT", 

117 f"{DOCUMENT_ENDPOINT}/{document_id}/lines/{line_id}", 

118 json=line.model_dump(by_alias=True, exclude_unset=True, exclude_none=True), 

119 ) 

120 return DocumentLine.model_validate(resp.json()) 

121 

122 def delete(self, document_id: int, line_id: int) -> None: 

123 """ 

124 Supprime une ligne de document. 

125 

126 Arguments 

127 - ``document_id`` : Identifiant du document. 

128 - ``line_id`` : Identifiant de la ligne de document. 

129 

130 Returns 

131 - ``None`` 

132 """ 

133 self._c.request("DELETE", f"{DOCUMENT_ENDPOINT}/{document_id}/lines/{line_id}") 

134 

135 def move(self, document_id: int, line_id: int, to: int) -> None: 

136 """ 

137 Déplace une ligne vers une position donnée. 

138 

139 Arguments 

140 - ``document_id`` : Identifiant du document. 

141 - ``line_id`` : Identifiant de la ligne de document. 

142 - ``to`` : Position de destination. 

143 

144 Returns 

145 - ``None`` 

146 """ 

147 self._c.request( 

148 "POST", 

149 f"{DOCUMENT_ENDPOINT}/{document_id}/lines/{line_id}/move", 

150 json={"to": to}, 

151 )