user.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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 walle.api.api import SecurityResource
  11. from walle.form.user import UserUpdateForm, RegistrationForm
  12. from walle.model.member import MemberModel
  13. from walle.model.user import UserModel
  14. from walle.service import emails
  15. from walle.service.extensions import permission
  16. from walle.service.rbac.role import *
  17. from werkzeug.security import generate_password_hash
  18. class UserAPI(SecurityResource):
  19. actions = ['avatar', 'block', 'active']
  20. @permission.upper_developer
  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. user_ids = []
  40. if current_user.role != SUPER and space_id:
  41. members = MemberModel(group_id=current_user.last_space).members()
  42. user_ids = members['user_ids']
  43. user_model = UserModel()
  44. user_list, count = user_model.list(uids=user_ids, 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),
  50. enable_create=permission.role_upper_master())
  51. def item(self, user_id):
  52. """
  53. 获取某个用户
  54. :param user_id:
  55. :return:
  56. """
  57. user_info = UserModel(id=user_id).item()
  58. if not user_info:
  59. return self.render_json(code=-1)
  60. return self.render_json(data=user_info)
  61. def post(self, user_id=None, action=None):
  62. """
  63. create user
  64. /user/
  65. :return:
  66. """
  67. super(UserAPI, self).post()
  68. if action and action == 'avatar':
  69. return self.avatar(user_id)
  70. return self.create_user()
  71. @permission.upper_developer
  72. def create_user(self):
  73. form = RegistrationForm(request.form, csrf=False)
  74. if form.validate_on_submit():
  75. user_info = form.form2dict()
  76. # add user
  77. user = UserModel().add(user_info)
  78. # send an email
  79. message = """Hi, %s
  80. <br> <br>Welcome to walle, it cost a lot of time and lock to meet you, enjoy it : )
  81. <br><br>name: %s<br>password: %s""" \
  82. % (user.username, user.email, form.password.data)
  83. emails.send_email(user.email, 'Welcome to walle', message, '')
  84. return self.render_json(data=user.item(user_id=user.id))
  85. return self.render_error(code=Code.form_error, message=form.errors)
  86. @permission.upper_developer
  87. def put(self, user_id, action=None):
  88. """
  89. edit user
  90. /user/<int:user_id>
  91. :return:
  92. """
  93. super(UserAPI, self).put()
  94. if action:
  95. if action in self.actions:
  96. self_action = getattr(self, action.lower(), None)
  97. return self_action(user_id=user_id)
  98. else:
  99. abort(404)
  100. form = UserUpdateForm(request.form, csrf=False)
  101. if form.validate_on_submit():
  102. user = UserModel(id=user_id)
  103. user.update_name_pwd(username=form.username.data, password=form.password.data)
  104. return self.render_json(data=user.item())
  105. return self.render_error(code=Code.form_error, message=form.errors)
  106. @permission.upper_developer
  107. def delete(self, user_id):
  108. """
  109. remove a user with his group relation
  110. /user/<int:user_id>
  111. :param user_id:
  112. :return:
  113. """
  114. super(UserAPI, self).delete()
  115. UserModel(id=user_id).remove()
  116. MemberModel().remove(user_id=user_id)
  117. return self.render_json(message='')
  118. @staticmethod
  119. def table(filter={}):
  120. table = {
  121. 'username': {
  122. 'sort': 0
  123. },
  124. 'email': {
  125. 'sort': 0
  126. },
  127. 'status': {
  128. 'sort': 0
  129. },
  130. 'role_name': {
  131. 'sort': 0
  132. },
  133. }
  134. ret = []
  135. for (key, value) in list(table.items()):
  136. value['key'] = key
  137. if key in filter:
  138. value['value'] = filter[key]
  139. else:
  140. value['value'] = []
  141. ret.append(value)
  142. return ret
  143. def avatar(self, user_id):
  144. random = generate_password_hash(str(user_id))
  145. fname = random[-10:] + '.jpg'
  146. current_app.logger.info(fname)
  147. f = request.files['avatar']
  148. # todo rename to uid relation
  149. # fname = secure_filename(f.filename)
  150. # TODO try
  151. ret = f.save(os.path.join(current_app.config['UPLOAD_AVATAR'], fname))
  152. user = UserModel.query.get(user_id)
  153. user.avatar = fname
  154. user.save()
  155. return self.render_json(data={
  156. 'avatar': UserModel.avatar_url(user.avatar),
  157. })
  158. def block(self, user_id):
  159. user = UserModel(id=user_id)
  160. user.block_active(UserModel.status_blocked)
  161. return self.render_json(data=user.item())
  162. def active(self, user_id):
  163. user = UserModel(id=user_id)
  164. user.block_active(UserModel.status_active)
  165. return self.render_json(data=user.item())