Esempio n. 1
0
    def confirm(self, args):
        """
        Confirm user account with valid verification code.

        :param args: Input data
        :return: Confirmation status
        """

        email = args['email']
        code = args['code']

        user = User.get_user_by_email(email)

        # Check if already confirmed
        if user.confirmed_at:
            return json_response(message='Account has been already verified.')

        # Verify and confirm account
        if user.verify_secret_code(code):
            user.confirm_email()
            user.save()
            db.session.commit()

            return json_response(message='Verification has been completed.')

        # Output error for incorrect verification code
        return json_response_with_error(
            code=422,
            errors={'code': ['Incorrect verification code.']},
            message='Incorrect verification code or has expired.')
Esempio n. 2
0
    def reset_password(self, args):
        """
         Reset user password.

        :param args: Input data
        :return: Request status
        """

        email = args['email']
        password = args['password']
        code = args['code']

        user = User.get_user_by_email(email)

        # Verify and reset password
        if user.verify_secret_code(code):
            user.password = password
            user.secret_code = None
            user.save()
            db.session.commit()

            return json_response(
                message='Password has been successfully changed.')

        # Output error for incorrect verification code
        return json_response_with_error(
            code=422,
            errors={'code': ['Incorrect verification code.']},
            message='Incorrect verification code or has expired.')
Esempio n. 3
0
    def request_code(self, args):
        """
        Send new secret code.

        :param args: Input data
        :return: Request Status
        """

        email = args['email']

        user = User.get_user_by_email(email)

        # Return new code or false
        code = user.generate_secret_code()

        if code:
            # Send email with new verification code
            from app.tasks.user_tasks import send_verification_code_email
            send_verification_code_email.delay(email, code)

            # Save new code
            user.save()
            db.session.commit()

            return json_response(message='Verification code has been sent.')

        return json_response_with_error(
            code=403,
            errors={
                'limit': [
                    'You must wait 5 minutes before you can request another code.'
                ]
            },
            message='You can only request new code after each 5 minutes.')
Esempio n. 4
0
    def change_card_id(self, args, todo_id):
        """
        Change todo card ID.
        :param args: Validated input
        :param todo_id: Todo ID
        :return: Action status with new info
        """

        # Fetch todo
        todo = Todo.query.get(todo_id)

        # Update card ID
        if not args['card_id'] == todo.card_id:
            todo.card_id = args['card_id']
            todo.save()
            db.session.commit()

        # Define schema
        todo_schema = TodoSchema()

        # Return output
        return json_response(
            code=200,
            message='Todo information has been successfully updated.',
            data=todo_schema.dump(todo).data)
Esempio n. 5
0
    def create(self, args):
        """
        Perform user signup.

        :param args: New user validated information
        :return: New user account information
        """

        # Create new user
        user = User(**args)
        user.secret_code = generate_secret_key(6, False)
        user.save()
        db.session.commit()

        # Send welcome email
        from app.tasks.user_tasks import send_welcome_email
        send_welcome_email.delay(user.email)

        # Send verification code
        from app.tasks.user_tasks import send_verification_code_email
        send_verification_code_email.delay(user.email, user.secret_code)

        # Respond with user data
        user_schema = UserSchema()
        return json_response(code=201,
                             message='Successfully created an user account.',
                             data=[user_schema.dump(user).data])
Esempio n. 6
0
    def authenticate(self, args):
        """
        Authenticate and return user access token.

        :param args: Input data
        :return: Access token or errors
        """

        email = args['email']
        password = args['password']

        user = User.get_user_by_email(email)

        # Verify user password
        if user.verify_password(password):
            # Create token
            token = user.generate_token()

            return json_response(message='Successfully authenticated.',
                                 data={'access_token': token.decode()})

        return json_response_with_error(
            status='unauthorized',
            code=401,
            errors={'password': ['Password mismatch.']},
            message='Unable to authenticate user account.')
Esempio n. 7
0
    def change_parent(self, args, card_id):
        """
        Change card parent ID.
        :param args: Validated input
        :param card_id: Card ID
        :return: Status with new info
        """

        # Fetch card
        card = Card.query.get(card_id)

        if card.change_parent(args['parent_card_id']):
            # Save updated info
            card.save()
            db.session.commit()

            # Define schema
            card_schema = CardSchema()

            # Return output
            return json_response(
                code=200,
                message='Card information has been successfully updated.',
                data=card_schema.dump(card).data)

        # Return error output
        return json_response_with_error(
            code=422,
            errors={'parent_card_id': ['Invalid parent card id.']},
            message='You can not use child card as a parent card.')
Esempio n. 8
0
    def read(self):
        """
        Read user account information.
        :return: User account information.
        """
        user_schema = UserSchema()

        return json_response(
            message='User account information enquiry was successful.',
            data=[user_schema.dump(current_user).data])
Esempio n. 9
0
    def cards_feed(self):
        """
        Fetch cards with child cards and todo list.
        :return: JSON response
        """

        # Fetch cards
        cards = Card.query.filter_by(parent_card=None,
                                     owner_id=current_user.id)

        # Define schema
        cards_feed_schema = CardFeedsSchema(many=True)

        # Return output
        return json_response(code=200,
                             message='Cards feed enquiry was successful.',
                             data=cards_feed_schema.dump(cards).data)
Esempio n. 10
0
    def delete(self, card_id):
        """
        Delete card and associate child cards with todo list.
        :param card_id: Card ID
        :return: Action status
        """

        # Delete card
        card = Card.query.get(card_id)
        db.session.delete(card)
        db.session.commit()

        # Return output
        return json_response(
            code=200,
            message='Card has been deleted successfully.',
        )
Esempio n. 11
0
    def card_feeds(self, card_id):
        """
        Read single card feeds.
        :param card_id: Card ID
        :return: JSON Response
        """

        # Fetch card
        card = Card.query.get(card_id)

        # Define schema
        card_feeds_schema = CardFeedsSchema()

        # Return output
        return json_response(code=200,
                             message='Card feeds enquiry was successful.',
                             data=card_feeds_schema.dump(card).data)
Esempio n. 12
0
    def read(self, todo_id):
        """
        Read single todo.
        :param todo_id: Todo ID
        :return: JSON response
        """

        # Fetch todo
        todo = Todo.query.get(todo_id)

        # Define schema
        todo_schema = TodoSchema()

        # Return output
        return json_response(code=200,
                             message='Todo enquiry was successful.',
                             data=todo_schema.dump(todo).data)
Esempio n. 13
0
    def delete(self, todo_id):
        """
        Delete todo.
        :param todo_id: Todo ID
        :return Action status
        """

        # Delete todo
        todo = Todo.query.get(todo_id)
        db.session.delete(todo)
        db.session.commit()

        # Return output
        return json_response(
            code=200,
            message='Card has been deleted successfully.',
        )
Esempio n. 14
0
    def read_all(self):
        """
        Read all todo list.
        :return: Todo list data
        """

        # Get arg
        state = request.args.get(key='state', default='all', type=str)

        # Fetch todo list
        todos = get_todo_list(state)

        # Define schema
        todos_schema = TodoSchema(many=True)

        # Return output
        return json_response(code=200,
                             message='Todo list enquiry was successful.',
                             data=todos_schema.dump(todos).data)
Esempio n. 15
0
    def create(self, args):
        """
        Create new todo.

        :param args: New todo validated information
        :return: New todo data
        """

        # Create new todo
        args['owner_id'] = current_user.id
        todo = Todo(**args)
        todo.save()
        db.session.commit()

        # Respond with new todo data
        todo_schema = TodoSchema()
        return json_response(code=201,
                             message='Successfully created a new todo.',
                             data=[todo_schema.dump(todo).data])
Esempio n. 16
0
    def update(self, args):
        """
        Update user information.
        :param args: Input data
        :return: Updated information.
        """

        # Update new info
        user = current_user
        user.first_name = args['first_name']
        user.last_name = args['last_name']
        user.save()
        db.session.commit()

        user_schema = UserSchema()

        return json_response(
            message='Account information has been successfully updated.',
            data=[user_schema.dump(user).data])
Esempio n. 17
0
    def create(self, args):
        """
        Create new card.

        :param args: New card validated information
        :return: New card data
        """

        # Create new card
        args['owner_id'] = current_user.id
        card = Card(**args)
        card.save()
        db.session.commit()

        # Respond with new card data
        card_schema = CardSchema()
        return json_response(code=201,
                             message='Successfully created a new card.',
                             data=[card_schema.dump(card).data])
Esempio n. 18
0
    def update(self, args, todo_id):
        """
        Update todo info.
        :param args: Validated input
        :param todo_id: Todo ID
        :return: Updated information
        """

        # Get args
        title = args['title']
        note = args['note']
        due_date = args['due_date']

        # Update todo
        changed = False
        todo = Todo.query.get(todo_id)

        if title and not title == todo.title:
            todo.title = title
            changed = False

        if note and not note == todo.note:
            todo.note = note
            changed = False

        if due_date and not due_date == todo.due_date:
            todo.due_date = due_date
            changed = False

        # Save new record
        if changed:
            todo.save()
            db.session.commit()

        # Define schema
        todo_schema = TodoSchema()

        # Return output
        return json_response(
            code=200,
            message='Todo information has been successfully updated.',
            data=todo_schema.dump(todo).data)
Esempio n. 19
0
    def todos(self, card_id):
        """
        Read specific card todos.
        :param card_id: Card ID
        :return: Card todo list
        """

        # Get args
        state = request.args.get(key='state', default='all', type=str)

        # Fetch todo list
        todos = get_todo_list(card_id, state)

        # Define schema
        todos_schema = TodoSchema(many=True)

        # Return output
        return json_response(code=200,
                             message='Card todos enquiry was successful.',
                             data=todos_schema.dump(todos).data)
Esempio n. 20
0
    def mark_complete(self, todo_id):
        """
        Mark todo as completed.
        :param todo_id: Todo ID
        :return: Action status
        """

        # Fetch todo
        todo = Todo.query.get(todo_id)

        # Mark complete
        todo.completed_at = datetime.now()
        todo.completed = True
        todo.save()
        db.session.commit()

        # Return output
        return json_response(
            code=200,
            message='Todo has been marked completed.',
        )
Esempio n. 21
0
    def update(self, args, card_id):
        """
        Update card info.
        :param args: Validated input
        :param card_id: Card ID
        :return: Status with updated info
        """

        # Extract args
        title = args['title']
        note = args['note']

        # Update card
        changed = False
        card = Card.query.get(card_id)

        if not title == card.title:
            card.title = title
            changed = True

        if note and not note == card.note:
            card.note = note
            changed = True

        # Save new record
        if changed:
            card.save()
            db.session.commit()

        # Define schema
        card_schema = CardSchema()

        # Return output
        return json_response(
            code=200,
            message='Card information has been successfully updated.',
            data=card_schema.dump(card).data)