users.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.api.users
  4. ~~~~~~~~~~~~~~~~~
  5. The User API.
  6. TODO: Permission checks.
  7. :copyright: (c) 2015 by the FlaskBB Team.
  8. :license: BSD, see LICENSE for more details.
  9. """
  10. from datetime import datetime
  11. from flask_restful import Resource, reqparse, fields, marshal, abort
  12. from flaskbb.api import auth
  13. from flaskbb.user.models import User
  14. user_fields = {
  15. 'id': fields.Integer,
  16. 'username': fields.String,
  17. 'email': fields.String,
  18. 'date_joined': fields.DateTime,
  19. 'lastseen': fields.DateTime,
  20. 'birthday': fields.DateTime,
  21. 'gender': fields.String,
  22. 'website': fields.String,
  23. 'location': fields.String,
  24. 'signature': fields.String,
  25. 'notes': fields.String,
  26. 'theme': fields.String,
  27. 'language': fields.String,
  28. 'post_count': fields.Integer,
  29. 'primary_group': fields.String(attribute="primary_group.name")
  30. }
  31. class UserListAPI(Resource):
  32. def __init__(self):
  33. self.reqparse = reqparse.RequestParser()
  34. self.reqparse.add_argument('username', type=str, required=True,
  35. location="json")
  36. self.reqparse.add_argument('email', type=str, required=True,
  37. location='json')
  38. self.reqparse.add_argument('password', type=str, required=True,
  39. location='json')
  40. self.user_fields = user_fields
  41. super(UserListAPI, self).__init__()
  42. def get(self):
  43. users = {'users': [marshal(user, user_fields)
  44. for user in User.query.all()]}
  45. return users
  46. @auth.login_required
  47. def post(self):
  48. args = self.reqparse.parse_args()
  49. user = User(username=args['username'],
  50. password=args['password'],
  51. email=args['email'],
  52. date_joined=datetime.utcnow(),
  53. primary_group_id=4)
  54. user.save()
  55. return {'user': marshal(user, user_fields)}, 201
  56. class UserAPI(Resource):
  57. def __init__(self):
  58. self.reqparse = reqparse.RequestParser()
  59. self.reqparse.add_argument('email', type=str, location='json')
  60. self.reqparse.add_argument('birthday', type=str, location='json')
  61. self.reqparse.add_argument('gender', type=str, location='json')
  62. self.reqparse.add_argument('website', type=str, location='json')
  63. self.reqparse.add_argument('location', type=str, location='json')
  64. self.reqparse.add_argument('signature', type=str, location='json')
  65. self.reqparse.add_argument('notes', type=str, location='json')
  66. self.reqparse.add_argument('theme', type=str, location='json')
  67. self.reqparse.add_argument('language', type=str, location='json')
  68. super(UserAPI, self).__init__()
  69. def get(self, user_id):
  70. user = User.query.filter_by(id=user_id).first()
  71. if not user:
  72. abort(404)
  73. return {'user': marshal(user, user_fields)}
  74. @auth.login_required
  75. def put(self, user_id):
  76. user = User.query.filter_by(id=user_id).first()
  77. if not user:
  78. abort(404)
  79. if user.username != auth.username():
  80. abort(403, message="You are not allowed to modify this user.")
  81. args = self.reqparse.parse_args()
  82. for k, v in args.items():
  83. if v is not None:
  84. setattr(user, k, v)
  85. user.save()
  86. return {'user': marshal(user, user_fields)}
  87. @auth.login_required
  88. def delete(self, user_id):
  89. user = User.query.filter_by(id=user_id).first()
  90. if not user:
  91. abort(404)
  92. if user.username != auth.username() and not user.permissions['admin']:
  93. abort(403, message="You are not allowed to delete this user.")
  94. user.delete()
  95. return {'result': True}