PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/api/routes/Categories.py

https://gitlab.com/fdemian/Shelob
Python | 201 lines | 149 code | 50 blank | 2 comment | 9 complexity | 6d4d133603d5ac01a14b70bdd8f5bbc5 MD5 | raw file
  1. import json
  2. from api.model.models import Category, Story
  3. from api.authentication.AuthenticatedHandler import AuthenticatedHandler
  4. from tornado.web import RequestHandler
  5. from tornado.gen import coroutine
  6. from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
  7. from api.Utils import authenticated
  8. class CategoryHandler(AuthenticatedHandler):
  9. def get(self, category_id):
  10. session = self.settings['db']
  11. category = session.query(Category).filter(Category.id == category_id).one()
  12. response = {
  13. 'id': category.id,
  14. 'name': category.name
  15. }
  16. self.set_status(200, 'Ok')
  17. self.set_header("Content-Type", "application/jsonp;charset=UTF-8")
  18. self.set_header("Access-Control-Allow-Origin", "*")
  19. self.write(response)
  20. return
  21. @authenticated
  22. def delete(self, category_id):
  23. try:
  24. session = self.settings['db']
  25. category = session.query(Category).filter(Category.id == category_id).one()
  26. session.delete(category)
  27. session.commit()
  28. response = {'id': category_id}
  29. self.set_status(200, 'Ok')
  30. self.set_header("Access-Control-Allow-Origin", "*")
  31. self.write(response)
  32. return
  33. except NoResultFound:
  34. response = {'message': 'No result found for the specified id.'}
  35. self.set_status(500, 'Error')
  36. self.set_header("Access-Control-Allow-Origin", "*")
  37. self.write(response)
  38. return
  39. except MultipleResultsFound:
  40. response = {'message': 'Multiple categories found for the specified id.'}
  41. self.set_status(500, 'Error')
  42. self.set_header("Access-Control-Allow-Origin", "*")
  43. self.write(response)
  44. return
  45. @coroutine
  46. def options(self, id):
  47. response = {}
  48. self.set_header("Content-Type", "test/plain;charset=UTF-8")
  49. self.set_header("Access-Control-Allow-Origin", "*")
  50. self.set_header("Access-Control-Allow-Headers", "Authorization")
  51. self.set_header("Access-Control-Allow-Methods ", "GET, POST, DELETE, OPTIONS")
  52. self.set_status(200, "Ok")
  53. self.write(response)
  54. return
  55. class CategoryTopicsHandler(RequestHandler):
  56. def get(self, category_id, page):
  57. session = self.settings['db']
  58. if int(category_id) == -1:
  59. id_to_search = None
  60. else:
  61. id_to_search = int(category_id)
  62. category_stories = session.query(Story).filter(Story.category_id == id_to_search).all()
  63. data = []
  64. for story in category_stories:
  65. if story.category is None:
  66. category = {'id': -1, 'name': "uncatalogued"}
  67. else:
  68. category = {'id': story.category.id, 'name': story.category.name}
  69. json_item = {
  70. 'id': story.id,
  71. 'name': story.title,
  72. 'title': story.title,
  73. 'date': str(story.date),
  74. 'comments': len(story.comments),
  75. 'category': category,
  76. 'author': {
  77. 'id': story.user.id,
  78. 'name': story.user.username,
  79. 'avatar': story.user.avatar
  80. }
  81. }
  82. data.append(json_item)
  83. response = {
  84. 'currentPage': int(1),
  85. 'totalPages': int(1),
  86. 'items': data
  87. }
  88. self.set_header("Content-Type", "application/jsonp;charset=UTF-8")
  89. self.set_header("Access-Control-Allow-Origin", "*")
  90. self.write(response)
  91. @coroutine
  92. def options(self, **id):
  93. response = {}
  94. self.set_header("Content-Type", "test/plain;charset=UTF-8")
  95. self.set_header("Access-Control-Allow-Origin", "*")
  96. self.set_header("Access-Control-Allow-Headers", "Authorization")
  97. self.set_header("Access-Control-Allow-Methods ", "GET, POST, DELETE, OPTIONS")
  98. self.set_status(200, "Ok")
  99. self.write(response)
  100. return
  101. class CategoriesHandler(AuthenticatedHandler):
  102. # GET /categories
  103. @coroutine
  104. def get(self):
  105. session = self.settings['db']
  106. all_categories = session.query(Category).all()
  107. data = []
  108. for category in all_categories:
  109. json_category = {
  110. 'id': category.id,
  111. 'name': category.name,
  112. 'description': category.description,
  113. }
  114. data.append(json_category)
  115. response = {
  116. "page": 1,
  117. "items": data
  118. }
  119. self.set_header("Content-Type", "application/jsonp;charset=UTF-8")
  120. self.set_header("Access-Control-Allow-Origin", "*")
  121. self.write(response)
  122. return
  123. @coroutine
  124. def options(self, **id):
  125. response = {}
  126. self.set_header("Content-Type", "test/plain;charset=UTF-8")
  127. self.set_header("Access-Control-Allow-Origin", "*")
  128. self.set_header("Access-Control-Allow-Headers", "Authorization")
  129. self.set_header("Access-Control-Allow-Methods ", "GET, POST, DELETE, OPTIONS")
  130. self.set_status(200, "Ok")
  131. self.write(response)
  132. return
  133. # POST /categories
  134. @authenticated
  135. def post(self):
  136. request = self.request.body.decode("utf-8")
  137. json_request = json.loads(json.loads(request))
  138. name = json_request["name"]
  139. description = json_request["description"]
  140. category = Category()
  141. category.name = name
  142. category.description = description
  143. session = self.settings['db']
  144. session.add(category)
  145. session.commit()
  146. response = {'id': category.id, 'name': category.name, 'description': category.description}
  147. self.set_status(200, 'Ok')
  148. self.set_header("Access-Control-Allow-Origin", "*")
  149. self.set_header("Content-Type", "application/jsonp;charset=UTF-8")
  150. self.write(response)
  151. return