Yield generated for 76b072a2-699a-4fac-8bff-b30a97c5dd1e
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

66 lines
2.1 KiB

# -*- coding: utf-8 -*-
"""User views."""
from flask import Blueprint, request
from flask_apispec import use_kwargs, marshal_with
from flask_jwt_extended import jwt_required, jwt_optional, create_access_token, current_user
from sqlalchemy.exc import IntegrityError
from conduit.database import db
from conduit.exceptions import InvalidUsage
from conduit.profile.models import UserProfile
from .models import User
from .serializers import user_schema
blueprint = Blueprint('user', __name__)
@blueprint.route('/api/users', methods=('POST',))
@use_kwargs(user_schema)
@marshal_with(user_schema)
def register_user(username, password, email, **kwargs):
try:
userprofile = UserProfile(User(username, email, password=password, **kwargs).save()).save()
userprofile.user.token = create_access_token(identity=userprofile.user)
except IntegrityError:
db.session.rollback()
raise InvalidUsage.user_already_registered()
return userprofile.user
@blueprint.route('/api/users/login', methods=('POST',))
@jwt_optional
@use_kwargs(user_schema)
@marshal_with(user_schema)
def login_user(email, password, **kwargs):
user = User.query.filter_by(email=email).first()
if user is not None and user.check_password(password):
user.token = create_access_token(identity=user, fresh=True)
return user
else:
raise InvalidUsage.user_not_found()
@blueprint.route('/api/user', methods=('GET',))
@jwt_required
@marshal_with(user_schema)
def get_user():
user = current_user
# Not sure about this
user.token = request.headers.environ['HTTP_AUTHORIZATION'].split('Token ')[1]
return current_user
@blueprint.route('/api/user', methods=('PUT',))
@jwt_required
@use_kwargs(user_schema)
@marshal_with(user_schema)
def update_user(**kwargs):
user = current_user
# take in consideration the password
password = kwargs.pop('password', None)
if password:
user.set_password(password)
if 'updated_at' in kwargs:
kwargs['updated_at'] = user.created_at.replace(tzinfo=None)
user.update(**kwargs)
return user