space.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. # -*- coding: utf-8 -*-
  2. """
  3. walle-web
  4. :copyright: © 2015-2017 walle-web.io
  5. :created time: 2017-03-25 11:15:01
  6. :author: wushuiyong@walle-web.io
  7. """
  8. import json
  9. from flask import current_app
  10. from flask import request, abort
  11. from walle.api.api import SecurityResource
  12. from walle.form.space import SpaceForm
  13. from walle.model.member import MemberModel
  14. from walle.model.space import SpaceModel
  15. from walle.model.user import UserModel
  16. from walle.service.extensions import permission
  17. from walle.service.rbac.role import *
  18. class SpaceAPI(SecurityResource):
  19. actions = ['members', 'item', 'list', 'member', 'switch']
  20. def get(self, space_id=None, action=None):
  21. """
  22. fetch space list or one item
  23. /space/<int:space_id>
  24. :return:
  25. """
  26. super(SpaceAPI, self).get()
  27. if action is None:
  28. action = 'item' if space_id else 'list'
  29. if action in self.actions:
  30. self_action = getattr(self, action.lower(), None)
  31. return self_action(space_id)
  32. else:
  33. abort(404)
  34. def list(self, space_id=None):
  35. """
  36. fetch space list
  37. :return:
  38. """
  39. page = int(request.args.get('page', 0))
  40. page = page - 1 if page else 0
  41. size = int(request.args.get('size', 10))
  42. kw = request.values.get('kw', '')
  43. space_model = SpaceModel()
  44. space_list, count = space_model.list(page=page, size=size, kw=kw)
  45. return self.list_json(list=space_list, count=count, enable_create=permission.role_upper_owner())
  46. def item(self, space_id):
  47. """
  48. 获取某个用户组
  49. :param id:
  50. :return:
  51. """
  52. space_model = SpaceModel(id=space_id)
  53. space_info = space_model.item()
  54. if not space_info:
  55. return self.render_json(code=-1)
  56. return self.render_json(data=space_info)
  57. def post(self):
  58. """
  59. create a space
  60. /environment/
  61. :return:
  62. """
  63. super(SpaceAPI, self).post()
  64. form = SpaceForm(request.form, csrf_enabled=False)
  65. # return self.render_json(code=-1, data = form.form2dict())
  66. if form.validate_on_submit():
  67. # create space
  68. space_new = SpaceModel()
  69. data = form.form2dict()
  70. id = space_new.add(data)
  71. if not id:
  72. return self.render_json(code=-1)
  73. current_app.logger.info(request.json)
  74. # create group
  75. data['role'] = OWNER
  76. members = [data]
  77. MemberModel(group_id=id).update_group(members=members)
  78. return self.render_json(data=space_new.item())
  79. else:
  80. return self.render_json(code=-1, message=form.errors)
  81. def put(self, space_id, action=None):
  82. """
  83. update environment
  84. /environment/<int:id>
  85. :return:
  86. """
  87. super(SpaceAPI, self).put()
  88. if action is None:
  89. return self.update(space_id)
  90. if action in self.actions:
  91. self_action = getattr(self, action.lower(), None)
  92. return self_action(space_id)
  93. else:
  94. abort(404)
  95. def update(self, space_id):
  96. current_app.logger.info(json.loads(request.form['members']))
  97. form = SpaceForm(request.form, csrf_enabled=False)
  98. form.set_id(space_id)
  99. if form.validate_on_submit():
  100. space = SpaceModel().get_by_id(space_id)
  101. data = form.form2dict()
  102. current_app.logger.info(data)
  103. # a new type to update a model
  104. ret = space.update(data)
  105. # create group
  106. if 'members' in request.form:
  107. MemberModel(group_id=space_id).update_group(members=json.loads(request.form['members']))
  108. return self.render_json(data=space.item())
  109. else:
  110. return self.render_json(code=-1, message=form.errors)
  111. def delete(self, space_id):
  112. """
  113. remove an environment
  114. /environment/<int:id>
  115. :return:
  116. """
  117. super(SpaceAPI, self).delete()
  118. space_model = SpaceModel(id=space_id)
  119. space_model.remove(space_id)
  120. return self.render_json(message='')
  121. def switch(self, space_id):
  122. session['space_id'] = space_id
  123. # TODO
  124. current_user.last_space = space_id
  125. current_user.save()
  126. UserModel.fresh_session()
  127. return self.render_json()
  128. def member(self, space_id):
  129. space_id = session['space_id']
  130. user_id = request.form['user_id']
  131. role = request.form['role']
  132. members = MemberModel(group_id=space_id).member(user_id=user_id, role=role, group_id=space_id)
  133. return self.render_json(data=members)
  134. def members(self, space_id):
  135. page = int(request.args.get('page', 1))
  136. page = page - 1 if page else 0
  137. size = int(request.args.get('size', 10))
  138. kw = request.values.get('kw', '')
  139. members, count, user_ids = MemberModel(group_id=space_id).members(page=page, size=size, kw=kw)
  140. return self.list_json(list=members, count=count, enable_create=permission.role_upper_master())