html_document_controller.py 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # coding=utf-8
  2. import typing
  3. import transaction
  4. from pyramid.config import Configurator
  5. from tracim.models.data import UserRoleInWorkspace
  6. try: # Python 3.5+
  7. from http import HTTPStatus
  8. except ImportError:
  9. from http import client as HTTPStatus
  10. from tracim import TracimRequest
  11. from tracim.extensions import hapic
  12. from tracim.lib.core.content import ContentApi
  13. from tracim.views.controllers import Controller
  14. from tracim.views.core_api.schemas import TextBasedContentSchema
  15. from tracim.views.core_api.schemas import TextBasedRevisionSchema
  16. from tracim.views.core_api.schemas import TextBasedContentModifySchema
  17. from tracim.views.core_api.schemas import SetContentStatusSchema
  18. from tracim.views.core_api.schemas import WorkspaceAndContentIdPathSchema
  19. from tracim.views.core_api.schemas import NoContentSchema
  20. from tracim.lib.utils.authorization import require_content_types
  21. from tracim.lib.utils.authorization import require_workspace_role
  22. from tracim.exceptions import WorkspaceNotFound
  23. from tracim.exceptions import ContentTypeNotAllowed
  24. from tracim.exceptions import InsufficientUserRoleInWorkspace
  25. from tracim.exceptions import NotAuthenticated
  26. from tracim.exceptions import AuthenticationFailed
  27. from tracim.models.context_models import ContentInContext
  28. from tracim.models.context_models import RevisionInContext
  29. from tracim.models.contents import ContentTypeLegacy as ContentType
  30. from tracim.models.contents import html_documents_type
  31. from tracim.models.revision_protection import new_revision
  32. HTML_DOCUMENT_ENDPOINTS_TAG = 'HTML documents'
  33. class HTMLDocumentController(Controller):
  34. @hapic.with_api_doc(tags=[HTML_DOCUMENT_ENDPOINTS_TAG])
  35. @require_workspace_role(UserRoleInWorkspace.READER)
  36. @require_content_types([html_documents_type])
  37. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  38. @hapic.output_body(TextBasedContentSchema())
  39. def get_html_document(self, context, request: TracimRequest, hapic_data=None) -> ContentInContext: # nopep8
  40. """
  41. Get html document content
  42. """
  43. app_config = request.registry.settings['CFG']
  44. api = ContentApi(
  45. current_user=request.current_user,
  46. session=request.dbsession,
  47. config=app_config,
  48. )
  49. content = api.get_one(
  50. hapic_data.path.content_id,
  51. content_type=ContentType.Any
  52. )
  53. return api.get_content_in_context(content)
  54. @hapic.with_api_doc(tags=[HTML_DOCUMENT_ENDPOINTS_TAG])
  55. @require_workspace_role(UserRoleInWorkspace.CONTRIBUTOR)
  56. @require_content_types([html_documents_type])
  57. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  58. @hapic.input_body(TextBasedContentModifySchema())
  59. @hapic.output_body(TextBasedContentSchema())
  60. def update_html_document(self, context, request: TracimRequest, hapic_data=None) -> ContentInContext: # nopep8
  61. """
  62. update_html_document
  63. """
  64. app_config = request.registry.settings['CFG']
  65. api = ContentApi(
  66. current_user=request.current_user,
  67. session=request.dbsession,
  68. config=app_config,
  69. )
  70. content = api.get_one(
  71. hapic_data.path.content_id,
  72. content_type=ContentType.Any
  73. )
  74. with new_revision(
  75. session=request.dbsession,
  76. tm=transaction.manager,
  77. content=content
  78. ):
  79. api.update_content(
  80. item=content,
  81. new_label=hapic_data.body.label,
  82. new_content=hapic_data.body.raw_content,
  83. )
  84. api.save(content)
  85. return api.get_content_in_context(content)
  86. @hapic.with_api_doc(tags=[HTML_DOCUMENT_ENDPOINTS_TAG])
  87. @require_workspace_role(UserRoleInWorkspace.READER)
  88. @require_content_types([html_documents_type])
  89. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  90. @hapic.output_body(TextBasedRevisionSchema(many=True))
  91. def get_html_document_revisions(
  92. self,
  93. context,
  94. request: TracimRequest,
  95. hapic_data=None
  96. ) -> typing.List[RevisionInContext]:
  97. """
  98. get html_document revisions
  99. """
  100. app_config = request.registry.settings['CFG']
  101. api = ContentApi(
  102. current_user=request.current_user,
  103. session=request.dbsession,
  104. config=app_config,
  105. )
  106. content = api.get_one(
  107. hapic_data.path.content_id,
  108. content_type=ContentType.Any
  109. )
  110. revisions = content.revisions
  111. return [
  112. api.get_revision_in_context(revision)
  113. for revision in revisions
  114. ]
  115. @hapic.with_api_doc(tags=[HTML_DOCUMENT_ENDPOINTS_TAG])
  116. @require_workspace_role(UserRoleInWorkspace.CONTRIBUTOR)
  117. @require_content_types([html_documents_type])
  118. @hapic.input_path(WorkspaceAndContentIdPathSchema())
  119. @hapic.input_body(SetContentStatusSchema())
  120. @hapic.output_body(NoContentSchema(), default_http_code=HTTPStatus.NO_CONTENT) # nopep8
  121. def set_html_document_status(
  122. self,
  123. context,
  124. request: TracimRequest,
  125. hapic_data=None
  126. ) -> None:
  127. """
  128. set html_document status
  129. """
  130. app_config = request.registry.settings['CFG']
  131. api = ContentApi(
  132. current_user=request.current_user,
  133. session=request.dbsession,
  134. config=app_config,
  135. )
  136. content = api.get_one(
  137. hapic_data.path.content_id,
  138. content_type=ContentType.Any
  139. )
  140. with new_revision(
  141. session=request.dbsession,
  142. tm=transaction.manager,
  143. content=content
  144. ):
  145. api.set_status(
  146. content,
  147. hapic_data.body.status,
  148. )
  149. api.save(content)
  150. return
  151. def bind(self, configurator: Configurator) -> None:
  152. # Get html-document
  153. configurator.add_route(
  154. 'html_document',
  155. '/workspaces/{workspace_id}/html-documents/{content_id}',
  156. request_method='GET'
  157. )
  158. configurator.add_view(self.get_html_document, route_name='html_document') # nopep8
  159. # update html-document
  160. configurator.add_route(
  161. 'update_html_document',
  162. '/workspaces/{workspace_id}/html-documents/{content_id}',
  163. request_method='PUT'
  164. ) # nopep8
  165. configurator.add_view(self.update_html_document, route_name='update_html_document') # nopep8
  166. # get html document revisions
  167. configurator.add_route(
  168. 'html_document_revisions',
  169. '/workspaces/{workspace_id}/html-documents/{content_id}/revisions', # nopep8
  170. request_method='GET'
  171. )
  172. configurator.add_view(self.get_html_document_revisions, route_name='html_document_revisions') # nopep8
  173. # get html document revisions
  174. configurator.add_route(
  175. 'set_html_document_status',
  176. '/workspaces/{workspace_id}/html-documents/{content_id}/status', # nopep8
  177. request_method='PUT'
  178. )
  179. configurator.add_view(self.set_html_document_status, route_name='set_html_document_status') # nopep8