Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .coverage
Original file line number Diff line number Diff line change
@@ -1 +1 @@
!coverage.py: This is a private format, don't read it directly!{"lines":{"/home/collo/my_projects/venv/Hello-Books/app/admin/views.py":[34,3,4,6,7,9,140,77,112,127],"/home/collo/my_projects/myenv/Hello-Books/app/__init__.py":[6,8,10,11,12,14,15,17,18,19,20,21,22,23,24,25,26],"/home/collo/my_projects/myenv/Hello-Books/app/home/views.py":[3,5,6,8,17,20,21,22,23,24,25,26,27,28,29,30,31,32,33,35,36,37,39,40,41,43,44,45,47,48,49,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,107,109,127,128,132,136,151,155,164,167],"/home/collo/my_projects/myenv/Hello-Books/app/classes.py":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,30,31,32,33,36,37,38,39,40,41,44,45,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,92,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,120,122,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215],"/home/collo/my_projects/myenv/Hello-Books/app/admin/views.py":[32,1,3,5,6,8,96,81,99,84,58,28,62],"/home/collo/my_projects/myenv/Hello-Books/app/admin/__init__.py":[4,6,8],"/home/collo/my_projects/venv/Hello-Books/app/home/views.py":[3,4,6,7,10,23,142,19,22,151,24,25,26,27,28,29,69,33,37,41,170,45,49,53,182,55,56,57,60,63,64,65,66,67,68,54,70,71,72,74,84,86,87,88,89,90,92,122],"/home/collo/my_projects/venv/Hello-Books/app/models/__init__.py":[1],"/home/collo/my_projects/myenv/Hello-Books/app/config.py":[4,6,7,8,9,10,13,14,15,18,19,20,21,23,24,25,26,28,29,30,31],"/home/collo/my_projects/venv/Hello-Books/app/config.py":[4,6,7,8,9,10,13,14,15,18,19,20,21,23,24,25,26,28,29,30,31],"/home/collo/my_projects/venv/Hello-Books/app/models/user.py":[4,5,7,8,9,11,12,14,16,17,18,19,20,21,22,23,25,26,27,29,30,32,33,34,35,36,37,39,41,42,43,44,50,52,56,57,58,59,60,61,63,64,67,76],"/home/collo/my_projects/venv/Hello-Books/app/__init__.py":[6,8,10,11,12,14,15,17,18,19,20,21,22,23,24,26],"/home/collo/my_projects/venv/Hello-Books/app/models/base.py":[4,5,6,8,9,10,11,12,14,16,17,18,19,23,25,26,27,28,32,34,35,36,40],"/home/collo/my_projects/venv/Hello-Books/app/home/__init__.py":[8,4,6],"/home/collo/my_projects/venv/Hello-Books/app/models/admin.py":[4,5,6,8,11,12,14,15,16,18,20,21,22,23,27,44,49,51,52,53,56,57,58,59,60,61,62,63,64,65,67,69,70,71,72,73,74,75,76,78,79,82,84,85,86,87,88,90,92,94,95,96],"/home/collo/my_projects/myenv/Hello-Books/app/home/__init__.py":[4,6,8],"/home/collo/my_projects/venv/Hello-Books/app/admin/__init__.py":[8,4,6]}}
!coverage.py: This is a private format, don't read it directly!{"lines":{"/home/collo/my_projects/venv/my_apis/Hello-Books/app/home/views.py":[3,4,6,7,10,23,142,19,22,151,24,25,26,27,28,29,69,33,37,41,170,45,49,53,182,55,56,57,60,63,64,65,66,67,68,54,70,71,72,74,84,86,87,88,89,90,92,122],"/home/collo/my_projects/venv/Hello-Books/app/__init__.py":[6,8,10,11,12,14,15,17,18,19,20,21,22,23,24,26],"/home/collo/projects3/myvenv/Hello-Books/app/home/views.py":[3,4,6,7,10,23,142,19,22,151,24,25,26,27,28,29,69,33,37,41,170,45,49,53,54,55,56,57,60,63,64,65,66,67,68,182,70,71,72,74,84,86,87,88,89,90,92,122],"/home/collo/my_projects/venv/Hello-Books/app/models/base.py":[4,5,6,8,9,10,11,12,14,16,17,18,19,23,25,26,27,28,32,34,35,36,40],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/__init__.py":[6,8,10,11,12,13,15,16,18,19,20,21,22,23,24,25,26,27,28,30],"/home/collo/my_projects/venv/Hello-Books/app/admin/views.py":[34,3,4,6,7,9,140,77,112,127],"/home/collo/projects3/myvenv/Hello-Books/app/admin/__init__.py":[8,4,6],"/home/collo/my_projects/myenv/Hello-Books/app/__init__.py":[6,8,10,11,12,14,15,17,18,19,20,21,22,23,24,25,26],"/home/collo/my_projects/venv/Hello-Books/app/models/__init__.py":[1],"/home/collo/my_projects/venv/Hello-Books/app/home/views.py":[3,4,6,7,10,23,142,19,22,151,24,25,26,27,28,29,69,33,37,41,170,45,49,53,182,55,56,57,60,63,64,65,66,67,68,54,70,71,72,74,84,86,87,88,89,90,92,122],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/models/admin.py":[4,5,6,8,11,12,14,15,16,18,20,21,22,23,27,44,49,51,52,53,57,58,59,60,61,62,63,64,65,66,68,70,71,72,73,74,75,76,77,79,80,84,86,87,88,89,90,92,94,96,97,98],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/home/__init__.py":[8,4,6],"/home/collo/projects3/myvenv/Hello-Books/app/__init__.py":[6,8,10,11,12,13,15,16,18,19,20,21,22,23,24,25,26,27,28,30],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/models/__init__.py":[1],"/home/collo/projects3/myvenv/Hello-Books/app/admin/views.py":[3,4,6,7,72,9,122,107,135,29],"/home/collo/projects3/myvenv/Hello-Books/app/models/user.py":[4,5,6,8,9,10,12,13,15,17,19,21,22,23,24,25,26,27,28,30,31,32,34,35,37,38,39,40,41,42,43,45,47,48,49,50,56,58,63,64,65,66,67,68,70,71,74,83],"/home/collo/projects3/myvenv/Hello-Books/app/models/__init__.py":[1],"/home/collo/projects3/myvenv/Hello-Books/app/config.py":[4,6,7,8,9,10,13,14,15,18,19,20,21,23,24,25,26,28,29,30,31],"/home/collo/my_projects/myenv/Hello-Books/app/config.py":[4,6,7,8,9,10,13,14,15,18,19,20,21,23,24,25,26,28,29,30,31],"/home/collo/my_projects/venv/Hello-Books/app/admin/__init__.py":[8,4,6],"/home/collo/my_projects/myenv/Hello-Books/app/admin/__init__.py":[4,6,8],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/models/user.py":[4,5,7,8,9,11,12,14,16,17,18,19,20,21,22,23,25,26,27,29,30,32,33,34,35,36,37,39,41,42,43,44,50,52,57,58,59,60,61,62,64,65,68,77],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/admin/__init__.py":[8,4,6],"/home/collo/my_projects/myenv/Hello-Books/app/home/views.py":[3,5,6,8,17,20,21,22,23,24,25,26,27,28,29,30,31,32,33,35,36,37,39,40,41,43,44,45,47,48,49,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,82,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,107,109,127,128,132,136,151,155,164,167],"/home/collo/my_projects/venv/Hello-Books/app/models/user.py":[4,5,7,8,9,11,12,14,16,17,18,19,20,21,22,23,25,26,27,29,30,32,33,34,35,36,37,39,41,42,43,44,50,52,56,57,58,59,60,61,63,64,67,76],"/home/collo/my_projects/myenv/Hello-Books/app/admin/views.py":[32,1,3,5,6,8,96,81,99,84,58,28,62],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/models/base.py":[4,5,6,8,9,10,11,12,14,16,17,18,19,23,25,26,27,28,32,34,35,36,40],"/home/collo/projects3/myvenv/Hello-Books/app/error.py":[1,11,4,20],"/home/collo/projects3/myvenv/Hello-Books/app/models/admin.py":[4,5,6,8,11,12,14,15,16,18,20,21,22,23,27,44,49,51,52,53,57,58,59,60,61,62,63,64,65,66,68,70,71,72,73,74,75,76,77,79,80,84,86,87,88,89,90,92,94,96,97,98],"/home/collo/my_projects/venv/Hello-Books/app/config.py":[4,6,7,8,9,10,13,14,15,18,19,20,21,23,24,25,26,28,29,30,31],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/admin/views.py":[3,4,6,7,72,9,107,122,135,29],"/home/collo/projects3/myvenv/Hello-Books/app/home/__init__.py":[8,4,6],"/home/collo/my_projects/myenv/Hello-Books/app/classes.py":[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,27,28,30,31,32,33,36,37,38,39,40,41,44,45,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,92,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,120,122,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/error.py":[1,11,4,20],"/home/collo/my_projects/myenv/Hello-Books/app/home/__init__.py":[4,6,8],"/home/collo/my_projects/venv/my_apis/Hello-Books/app/config.py":[4,6,7,8,9,10,13,14,15,18,19,20,21,23,24,25,26,28,29,30,31],"/home/collo/my_projects/venv/Hello-Books/app/home/__init__.py":[8,4,6],"/home/collo/projects3/myvenv/Hello-Books/app/models/base.py":[4,5,6,8,9,10,11,12,14,16,17,18,19,23,25,26,27,28,32,34,35,36,40],"/home/collo/my_projects/venv/Hello-Books/app/models/admin.py":[4,5,6,8,11,12,14,15,16,18,20,21,22,23,27,44,49,51,52,53,56,57,58,59,60,61,62,63,64,65,67,69,70,71,72,73,74,75,76,78,79,82,84,85,86,87,88,90,92,94,95,96]}}
1 change: 1 addition & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
web: gunicorn app:app --log-file=-
12 changes: 8 additions & 4 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@
from flask import Flask
#local imports
from app.config import app_config
from models.user import User
from models.admin import Admin
from .models.user import User
from .models.admin import Admin
from . error import method_not_allowed, server_error, resource_not_found

user = User()
admin_user = Admin()
Expand All @@ -18,9 +19,12 @@ def create_app(config_name):
app = Flask(__name__)
app.config['PRESERVE_CONTEXT_ON_EXCEPTION'] = False
app.config.from_object(app_config[config_name])
from admin import admin as admin_blueprint
from home import home as home_blueprint
from .admin import admin as admin_blueprint
from .home import home as home_blueprint
app.register_blueprint(admin_blueprint)
app.register_blueprint(home_blueprint)
app.register_error_handler(500, server_error)
app.register_error_handler(405, method_not_allowed)
app.register_error_handler(404, resource_not_found)

return app
17 changes: 6 additions & 11 deletions app/admin/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,13 @@
from app import user, admin_user
from . import admin

@admin.route('/auth/api/v1/admin/login', methods=['GET','POST'])
@admin.route('/auth/api/v1/admin/login', methods=['POST'])
def login():
"""logs the admin in"""
if request.method == 'POST':
username = request.json.get('username')
password = request.json.get('password')
response = admin_user.login(username, password)
if username.strip() or password.strip() == " ":
return make_response(jsonify(
{'message':'username or password cannot be empty'}
)), 403

if response == "succsefully logged in":
session['username'] = username
return make_response(jsonify(
Expand Down Expand Up @@ -46,7 +41,7 @@ def add_book():
edition = request.json.get('edition')
category = request.json.get('category')
response = admin_user.add_book(author, title, publisher, edition, category)
if author.strip() or title.strip() or publisher.strip() or edition.strip() or category.strip() == " ":
if len(author) == 0 or len(title) == 0 or len(publisher) == 0 or len(edition) == 0 or len(category) == 0:
return make_response(jsonify(
{'message':'no empty inputs allowed'}
)), 409
Expand Down Expand Up @@ -88,7 +83,7 @@ def modify_book(book_id):
publisher = request.json.get('new_publisher')
edition = request.json.get('new_edition')
category = request.json.get('new_category')
if author.strip() or title.strip() or publisher.strip() or edition.strip() or category.strip() == " ":
if len(title) == 0 or len(publisher) == 0 or len(edition) == 0 or len(category) == 0:
return make_response(jsonify(
{'message':'no empty inputs allowed'}
)), 409
Expand Down Expand Up @@ -122,7 +117,7 @@ def delete_book(book_id):
if response == "book deleted":
return make_response(jsonify(
{'message':response}
)), 200
)), 204

@admin.route('/api/v1/auth/logout')
def logout():
Expand All @@ -137,7 +132,7 @@ def logout():
{'message':'successfully logged out'}
)), 200

@admin.route('/api/auth/')
@admin.route('/api/auth/reset',methods=['POST'])
def reset_default_password():
"""
allowes admin to reset the default credentials
Expand All @@ -149,7 +144,7 @@ def reset_default_password():
password = request.json.get('password')
new_pwd = request.json.get('new_password')
email = request.json.get('admin_email')
if new_username.strip() or new_pwd.strip():
if len(new_username) < 4 or len(new_pwd) < 4:
return make_response(jsonify(
{'message':'new username or password cannot be empty'}
)), 409
Expand Down
24 changes: 24 additions & 0 deletions app/error.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from flask import jsonify


def resource_not_found(error):
"""resource not found"""
response = jsonify({"message": "the resource does not exist"})
response.status_code = 404
return response


def server_error(error):
"""Handle 500 error."""
response = jsonify({
"message":"Internal server error"
})
response.status_code = 500
return response


def method_not_allowed(error):
"""Handle 405 error."""
response = jsonify({"message": "Method not allowed"})
response.status_code = 405
return response
16 changes: 13 additions & 3 deletions app/home/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def homepage():
}
)), 200

@home.route('/auth/api/v1/register',methods=['GET','POST'])
@home.route('/auth/api/v1/register',methods=['POST'])
def register():
"""method to handle register requests"""
if request.method == 'POST':
Expand Down Expand Up @@ -85,6 +85,11 @@ def login():
def get_books():
if request.method == 'GET':
res = admin_user.books_list
if len(res) == 0:
return make_response(jsonify(
{'message':'no books to show'}
)), 200

return make_response(jsonify(
{'books':res}
)), 200
Expand All @@ -94,14 +99,18 @@ def borrow_book(book_id):
if not session.get('email'):
return make_response(jsonify(
{'message':'you are not logged in'}
)), 403
)), 403
return make_response(jsonify(
{'books':res}
)), 200

if request.method == 'POST':
author = request.json.get('author')
title = request.json.get('title')
publisher = request.json.get('publisher')
edition = request.json.get('edition')
email = session['email']
if author.strip() or title.strip() or publisher.strip() or edition.strip() == " ":
if len(title) == 0 or len(publisher) == 0 or len(edition) == 0:
return make_response(jsonify(
{'message':'no empty inputs allowed'}
)), 409
Expand Down Expand Up @@ -190,4 +199,5 @@ def reset_password():
return make_response(jsonify(
{'messaage':response}
)), 200


8 changes: 5 additions & 3 deletions app/models/admin.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#app/user.py
#coding:"utf-8"

from base import Base
from .base import Base
from datetime import date
import uuid

Expand Down Expand Up @@ -52,6 +52,7 @@ def add_book(self, author, title, publisher, edition, category):
for book in self.books_list:
if book['title'] == title and book['author'] == author:
return "book with similar details exists"
continue
else:
book_dict['author'] = author
book_dict['title'] = title
Expand All @@ -77,7 +78,8 @@ def modify_book_details(self, new_author, new_title, new_publisher, new_edition,
}
book_dict.update(new_details)
return "book details updated"
return "book not existing, you can add it"
continue
return "book not existing, you can add it"

def delete_book_details(self, book_id):
"""removes the book details given a title and author"""
Expand All @@ -97,4 +99,4 @@ def book_by_id(self,book_id):
continue
return "email provided does not match any user"



17 changes: 12 additions & 5 deletions app/models/user.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#app/user.py
#coding:"utf-8"

from base import Base
from .base import Base
import re
from werkzeug.security import generate_password_hash, check_password_hash

class User(Base):
"""user class contains methods allowed for user object"""
Expand All @@ -11,6 +12,10 @@ def __init__(self):
Base.__init__(self)
self.is_admin = False

def verify_password(self,password):
"""verify password against the password hash"""
return check_password_hash(self.password_hash,password)

def register(self, username, email, password, confirm_pwd):
""" Registration"""
registration_dict = dict()
Expand All @@ -24,14 +29,15 @@ def register(self, username, email, password, confirm_pwd):

if len(password) < 3:
return "password length should be more than 3 characters"
if username.strip() == "" or not username.isalpha():
if len(username) == 0 or not username.isalpha():
return "username cannot be empty, or non alphabet"
if password != confirm_pwd:
return "password does not match"
else:
self.password_hash = generate_password_hash(password)
registration_dict['username'] = username
registration_dict['email'] = email
registration_dict['password'] = password
registration_dict['password'] = self.password_hash
registration_dict['is_admin'] = self.is_admin
self.users_list.append(registration_dict)
return "registration succesfull"
Expand All @@ -40,10 +46,10 @@ def login(self, email, password):
"""login method"""
for user in self.users_list:
if email == user['email']:
if password == user['password']:
if self.verify_password(password):
return "succsefully logged in"

return "Inavlid username password"
continue
return "you have no account, register"


Expand All @@ -52,6 +58,7 @@ def borrow_book(self, author, title, publisher, edition, email, book_id):
for book in self.books_list:
if book['book_id'] != str(book_id):
return 'book does not exist'
continue
else:
book = {
'author' : author,
Expand Down
51 changes: 3 additions & 48 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,61 +1,16 @@
asn1crypto==0.24.0
astroid==1.6.1
backports.functools-lru-cache==1.5
bleach==2.1.2
blinker==1.4
certifi==2018.1.18
cffi==1.11.4
chardet==3.0.4
click==6.7
configparser==3.5.0
coverage==4.5.1
coveralls==1.2.0
cryptography==1.7.2
coveralls==1.3.0
docopt==0.6.2
dominate==2.3.1
enum34==1.1.6
Flask==0.12.2
Flask-Bootstrap==3.3.7.1
Flask-Login==0.4.1
Flask-Mail==0.9.1
Flask-Migrate==2.1.1
Flask-Moment==0.6.0
Flask-PageDown==0.2.2
Flask-Script==2.0.6
Flask-SQLAlchemy==2.3.2
Flask-Testing==0.7.1
Flask-WTF==0.14.2
futures==3.2.0
html5lib==1.0.1
gunicorn==19.7.1
idna==2.6
ipaddress==1.0.19
isort==4.3.4
itsdangerous==0.24
Jinja2==2.10
jwt==0.5.2
lazy-object-proxy==1.3.1
Mako==1.0.7
Markdown==2.6.11
MarkupSafe==1.0
mccabe==0.6.1
migrate==0.3.8
MySQL-python==1.2.5
nose==1.3.7
pyasn1==0.4.2
pycparser==2.18
PyJWT==1.6.0
pylint==1.8.2
pyOpenSSL==17.5.0
python-dateutil==2.6.1
python-editor==1.0.3
requests==2.18.4
singledispatch==3.4.0.3
six==1.11.0
SQLAlchemy==1.1.15
typing==3.5.3.0
urllib3==1.22
visitor==0.1.3
webencodings==0.5.1
Werkzeug==0.13
wrapt==1.10.11

Werkzeug==0.14.1
1 change: 1 addition & 0 deletions runtime.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
python-3.4.3