user.py 5.1 KB

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