def login():
    schema = UserSchema()
    req = request.form or request.get_json()
    response = dict(errors=dict(), logged_in=False, results=dict())

    # Valid data or return errors
    try:
        data = schema.load(req).data
    except ValidationError as err:
        response['errors'] = err.messages

        return jsonify(response)

    users = mongo_mgr.db.users
    login_user = users.find_one({'username': data['username']})

    if login_user:
        if check_password_hash(login_user['password'],
                               data['password'].encode('utf-8')):
            session['username'] = data['username']

            response['results'] = schema.dump(login_user)
            response['logged_in'] = True

    return json.dumps(response)
    def post(self):
        """Create a User."""
        user_schema = UserSchema()
        json_input = request.json
        obj_user, errors = user_schema.load(json_input)

        if errors:
            return jsonify({'errors': errors}), 422
        try:
            DB.session.add(obj_user)
            DB.session.commit()
            return 'saved', 200
        except Exception, e:
            return 'Something went wrong %s' % e, 500
def new_user(req):
    schema = UserSchema()
    response = dict(errors=dict(), logged_in=False, results=dict())

    # Valid data or return errors
    try:
        data = schema.load(req).data
    except ValidationError as err:
        response['errors'] = err.messages

        return jsonify(response)

    users = mongo_mgr.db.users
    existing_user = users.find_one({'username': data['username']})

    if existing_user is None:
        hash_pass = generate_password_hash(data['password'])
        user = dict(
            username=data['username'],
            password=hash_pass,
            first_name=None,
            last_name=None,
            coordinates=dict(
                lat=None,
                lng=None,
            ),
        )

        add_user = users.insert_one(user)
        session['username'] = data['username']

        response['logged_in'] = True
        response['results']['username'] = session['username']
        response['results']['id'] = str(add_user.inserted_id)

        return response

    # User exists
    response['errors']['user_exists'] = 'This account already exists.'
    response['results'] = schema.dump(existing_user)

    return response
def update_user(user_id):
    """
    Update user specified with user ID and return updated user contents
    Note: Always return the appropriate response for the action requested.
    """
    schema = UserSchema()
    req = request.form or request.get_json()
    response = dict(errors=dict(), results=dict(), updated=False)

    data = schema.load(req)
    users = mongo_mgr.db.users
    update = users.update_one(
        {'_id': ObjectId(user_id)},
        {'$set': data.data},
    )

    if update.matched_count and update.modified_count:
        response['updated'] = True
        updated_user = users.find_one({'_id': ObjectId(user_id)})
        results = schema.dump(updated_user)
        response['results'] = results.data

    return jsonify(response)