user.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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. def get(self, user_id=None, method=None):
  21. """
  22. fetch user list or one user
  23. /user/<int:user_id>
  24. :return:
  25. """
  26. super(UserAPI, self).get()
  27. return self.item(user_id) if user_id else self.list()
  28. def list(self):
  29. """
  30. fetch user list or one user
  31. :return:
  32. """
  33. page = int(request.args.get('page', 0))
  34. page = page - 1 if page else 0
  35. size = int(request.args.get('size', 10))
  36. space_id = int(request.args.get('space_id', 0))
  37. kw = request.values.get('kw', '')
  38. user_ids = []
  39. if current_user.role != SUPER and space_id:
  40. members = MemberModel(group_id=current_user.last_space).members()
  41. user_ids = members['user_ids']
  42. user_model = UserModel()
  43. user_list, count = user_model.list(uids=user_ids, page=page, size=size, space_id=space_id, kw=kw)
  44. filters = {
  45. 'username': ['线上', '线下'],
  46. 'status': ['正常', '禁用']
  47. }
  48. return self.list_json(list=user_list, count=count, table=self.table(filters),
  49. enable_create=permission.role_upper_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_info = form.form2dict()
  72. # add user
  73. user = UserModel().add(user_info)
  74. # send an email
  75. message = u"""Hi, %s
  76. <br> <br>Welcome to walle, it cost a lot of time and lock to meet you, enjoy it.
  77. <br><br>name: %s<br>password: %s""" \
  78. % (user.username, user.email, form.password.data)
  79. emails.send_email(user.email, 'Welcome to walle', message, '')
  80. return self.render_json(data=user.item(user_id=user.id))
  81. return self.render_json(code=-1, message=form.errors)
  82. def put(self, user_id, action=None):
  83. """
  84. edit user
  85. /user/<int:user_id>
  86. :return:
  87. """
  88. super(UserAPI, self).put()
  89. if action:
  90. if action in self.actions:
  91. self_action = getattr(self, action.lower(), None)
  92. return self_action(user_id=user_id)
  93. else:
  94. abort(404)
  95. form = UserUpdateForm(request.form, csrf_enabled=False)
  96. if form.validate_on_submit():
  97. user = UserModel(id=user_id)
  98. user.update_name_pwd(username=form.username.data, password=form.password.data)
  99. return self.render_json(data=user.item())
  100. return self.render_json(code=-1, message=form.errors)
  101. def delete(self, user_id):
  102. """
  103. remove a user with his group relation
  104. /user/<int:user_id>
  105. :param user_id:
  106. :return:
  107. """
  108. super(UserAPI, self).delete()
  109. UserModel(id=user_id).remove()
  110. MemberModel().remove(user_id=user_id)
  111. return self.render_json(message='')
  112. @staticmethod
  113. def table(filter={}):
  114. table = {
  115. 'username': {
  116. 'sort': 0
  117. },
  118. 'email': {
  119. 'sort': 0
  120. },
  121. 'status': {
  122. 'sort': 0
  123. },
  124. 'role_name': {
  125. 'sort': 0
  126. },
  127. }
  128. ret = []
  129. for (key, value) in table.items():
  130. value['key'] = key
  131. if key in filter:
  132. value['value'] = filter[key]
  133. else:
  134. value['value'] = []
  135. ret.append(value)
  136. return ret
  137. def avatar(self, user_id):
  138. # TODO uid
  139. # fname = current_user.id + '.jpg'
  140. random = generate_password_hash(str(user_id))
  141. fname = random[-10:] + '.jpg'
  142. current_app.logger.info(fname)
  143. f = request.files['avatar']
  144. # todo rename to uid relation
  145. # fname = secure_filename(f.filename)
  146. # TODO try
  147. ret = f.save(os.path.join(current_app.config['UPLOAD_AVATAR'], fname))
  148. user = UserModel.query.get(user_id)
  149. user.avatar = fname
  150. user.save()
  151. return self.render_json(data={
  152. 'avatar': UserModel.avatar_url(user.avatar),
  153. })
  154. def block(self, user_id):
  155. user = UserModel(id=user_id)
  156. user.block_active(UserModel.status_blocked)
  157. return self.render_json(data=user.item())
  158. def active(self, user_id):
  159. user = UserModel(id=user_id)
  160. user.block_active(UserModel.status_active)
  161. return self.render_json(data=user.item())