user.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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 os
  9. from flask import request, current_app, abort
  10. from flask_login import current_user
  11. from walle.api.api import SecurityResource
  12. from walle.form.user import UserUpdateForm, RegistrationForm
  13. from walle.model.database import db
  14. from walle.model.user import MemberModel
  15. from walle.model.user import UserModel
  16. from werkzeug.security import generate_password_hash
  17. from walle.service.rbac.role import *
  18. from walle.service.extensions import permission
  19. class UserAPI(SecurityResource):
  20. actions = ['avatar', 'block', 'active']
  21. def get(self, user_id=None, method=None):
  22. """
  23. fetch user list or one user
  24. /user/<int:user_id>
  25. :return:
  26. """
  27. super(UserAPI, self).get()
  28. return self.item(user_id) if user_id else self.list()
  29. def list(self):
  30. """
  31. fetch user list or one user
  32. :return:
  33. """
  34. page = int(request.args.get('page', 0))
  35. page = page - 1 if page else 0
  36. size = int(request.args.get('size', 10))
  37. space_id = int(request.args.get('space_id', 0))
  38. kw = request.values.get('kw', '')
  39. uids = []
  40. if current_user.role != SUPER and space_id:
  41. members = MemberModel(group_id=current_user.last_space).members()
  42. uids = members['user_ids']
  43. user_model = UserModel()
  44. user_list, count = user_model.list(uids=uids, page=page, size=size, space_id=space_id, kw=kw)
  45. filters = {
  46. 'username': ['线上', '线下'],
  47. 'status': ['正常', '禁用']
  48. }
  49. return self.list_json(list=user_list, count=count, table=self.table(filters), enable_create=permission.enable_role(MASTER))
  50. def item(self, user_id):
  51. """
  52. 获取某个用户
  53. :param user_id:
  54. :return:
  55. """
  56. user_info = UserModel(id=user_id).item()
  57. if not user_info:
  58. return self.render_json(code=-1)
  59. return self.render_json(data=user_info)
  60. def post(self, user_id=None, action=None):
  61. """
  62. create user
  63. /user/
  64. :return:
  65. """
  66. super(UserAPI, self).post()
  67. if action and action == 'avatar':
  68. return self.avatar(user_id)
  69. form = RegistrationForm(request.form, csrf_enabled=False)
  70. if form.validate_on_submit():
  71. user = UserModel().add(form.form2dict())
  72. return self.render_json(data=user.item(user_id=user.id))
  73. return self.render_json(code=-1, message=form.errors)
  74. def put(self, user_id, action=None):
  75. """
  76. edit user
  77. /user/<int:user_id>
  78. :return:
  79. """
  80. super(UserAPI, self).put()
  81. if action:
  82. if action in self.actions:
  83. self_action = getattr(self, action.lower(), None)
  84. return self_action(user_id=user_id)
  85. else:
  86. abort(404)
  87. form = UserUpdateForm(request.form, csrf_enabled=False)
  88. if form.validate_on_submit():
  89. user = UserModel(id=user_id)
  90. user.update_name_pwd(username=form.username.data, password=form.password.data)
  91. return self.render_json(data=user.item())
  92. return self.render_json(code=-1, message=form.errors)
  93. def delete(self, user_id):
  94. """
  95. remove a user with his group relation
  96. /user/<int:user_id>
  97. :param user_id:
  98. :return:
  99. """
  100. super(UserAPI, self).delete()
  101. UserModel(id=user_id).remove()
  102. MemberModel().remove(user_id=user_id)
  103. return self.render_json(message='')
  104. @staticmethod
  105. def table(filter={}):
  106. table = {
  107. 'username': {
  108. 'sort': 0
  109. },
  110. 'email': {
  111. 'sort': 0
  112. },
  113. 'status': {
  114. 'sort': 0
  115. },
  116. 'role_name': {
  117. 'sort': 0
  118. },
  119. }
  120. ret = []
  121. for (key, value) in table.items():
  122. value['key'] = key
  123. if key in filter:
  124. value['value'] = filter[key]
  125. else:
  126. value['value'] = []
  127. ret.append(value)
  128. return ret
  129. def avatar(self, user_id):
  130. # TODO uid
  131. # fname = current_user.id + '.jpg'
  132. random = generate_password_hash(str(user_id))
  133. fname = random[-10:] + '.jpg'
  134. current_app.logger.info(fname)
  135. f = request.files['avatar']
  136. # todo rename to uid relation
  137. # fname = secure_filename(f.filename)
  138. # TODO try
  139. ret = f.save(os.path.join(current_app.config['UPLOAD_AVATAR'], fname))
  140. user = UserModel.query.get(user_id)
  141. user.avatar = fname
  142. user.save()
  143. return self.render_json(data={
  144. 'avatar': UserModel.avatar_url(user.avatar),
  145. })
  146. def block(self, user_id):
  147. user = UserModel(id=user_id)
  148. user.block_active(UserModel.status_blocked)
  149. return self.render_json(data=user.item())
  150. def active(self, user_id):
  151. user = UserModel(id=user_id)
  152. user.block_active(UserModel.status_active)
  153. return self.render_json(data=user.item())