[
  {
    "path": ".gitignore",
    "content": ".fuse*\n*.pyc\n__*__"
  },
  {
    "path": "App/Actor.py",
    "content": "from functools import wraps\nfrom flask import g, request, redirect, session\n\nclass Actor():\n\tsess_key = \"\"\n\troute_url = \"/\"\n\n\tdef uid(self):\n\t\tif self.isLoggedIn():\n\t\t\treturn session[self.sess_key]\n\n\t\treturn \"err\"\n\n\tdef set_session(self, session, g):\n\t\tg.user = 0\n\n\t\tif self.isLoggedIn():\n\t\t\tg.user = session[self.sess_key]\n\n\tdef isLoggedIn(self):\n\t\tif self.sess_key in session and session[self.sess_key] and session[self.sess_key]>0:\n\t\t\treturn True\n\n\t\treturn False\n\n\tdef login_required(self, f, path=\"signin\"):\n\t\t@wraps(f)\n\t\tdef decorated_function(*args, **kwargs):\n\t\t\tif self.sess_key not in session or session[self.sess_key] is None:\n\t\t\t\tprint(path)\n\t\t\t\treturn redirect(self.route_url+path)\n\t\t\treturn f(*args, **kwargs)\n\t\treturn decorated_function\n\n\tdef redirect_if_login(self, f, path=\"/\"):\n\t\t@wraps(f)\n\t\tdef decorated_function(*args, **kwargs):\n\t\t\tif self.sess_key in session and session[self.sess_key] is not None:\n\t\t\t    return redirect(self.route_url+path)\n\t\t\treturn f(*args, **kwargs)\n\t\treturn decorated_function\n\n\tdef signout(self):\n\t\tsession[self.sess_key] = None\n\n\tdef signin(self):\n\t\tpass"
  },
  {
    "path": "App/Admin.py",
    "content": "from App.Actor import Actor\n\nclass Admin(Actor):\n\tadmin = {}\n\t\n\tdef __init__(self, AdminDAO):\n\t\tself.sess_key = \"admin\"\n\t\tself.dao = AdminDAO\n\t\tself.route_url = \"/admin/\""
  },
  {
    "path": "App/Books.py",
    "content": "class Books():\n\tid = 0\n\tname = \"\"\n\tedition = \"\"\n\tyear = \"\"\n\tcount = 0\n\tavailability = False\n\n\tcourse = {}\n\n\tdef __init__(self, BookDAO):\n\t\tself.dao = BookDAO"
  },
  {
    "path": "App/User.py",
    "content": "from App.Actor import Actor\n\nclass User(Actor):\n\tid = 0\n\tname = \"\"\n\tlock = False\n\n\tuser = {}\n\n\tdef __init__(self, UserDAO):\n\t\tself.dao = UserDAO\n\t\tself.sess_key = \"user\" # session key"
  },
  {
    "path": "App/__init__.py",
    "content": ""
  },
  {
    "path": "Controllers/AdminManager.py",
    "content": "from App.Admin import Admin\n\nclass AdminManager():\n\tdef __init__(self, DAO):\n\t\tself.admin = Admin(DAO.db.admin)\n\t\tself.user = DAO.db.user\n\t\tself.dao = self.admin.dao\n\n\tdef signin(self, email, password):\n\t\tadmin = self.dao.getByEmail(email)\n\n\t\tif admin is None:\n\t\t\treturn False\n\n\t\tadmin_pass = admin[\"password\"] # admin pass at \n\t\tif admin_pass != password:\n\t\t\treturn False\n\n\t\treturn admin\n\t\t\n\tdef get(self, id):\n\t\tadmin = self.dao.getById(id)\n\n\t\treturn admin\n\t\t\n\tdef getUsersList(self):\n\t\tadmin = self.user.list()\n\t\tprint(admin)\n\n\t\treturn admin\n\n\tdef signout(self):\n\t\tself.admin.signout()\n\n\tdef user_list(self):\n\t\treturn self.user.list()"
  },
  {
    "path": "Controllers/BookManager.py",
    "content": "from App.Books import Books\n\nclass BookManager():\n\tdef __init__(self, DAO):\n\t\tself.misc = Books(DAO.db.book)\n\t\tself.dao = self.misc.dao\n\n\tdef list(self, availability=1,user_id=None):\n\t\tif user_id!= None:\n\t\t\tbook_list = self.dao.listByUser(user_id)\n\t\telse:\n\t\t\tbook_list = self.dao.list(availability)\n\n\t\treturn book_list\n\n\tdef getReserverdBooksByUser(self, user_id):\n\t\tbooks = self.dao.getReserverdBooksByUser(user_id)\n\n\t\treturn books\n\n\tdef getBook(self, id):\n\t\tbooks = self.dao.getBook(id)\n\n\t\treturn books\n\n\tdef search(self, keyword, availability=1):\n\t\tbooks = self.dao.search_book(keyword, availability)\n\n\t\treturn books\n\n\tdef reserve(self, user_id, book_id):\n\t\tbooks = self.dao.reserve(user_id, book_id)\n\n\t\treturn books\n\n\tdef getUserBooks(self, user_id):\n\t\tbooks = self.dao.getBooksByUser(user_id)\n\n\t\treturn books\n\n\tdef getUserBooksCount(self, user_id):\n\t\tbooks = self.dao.getBooksCountByUser(user_id)\n\n\t\treturn books\n\n\tdef delete(self, id):\n\t\tself.dao.delete(id)"
  },
  {
    "path": "Controllers/UserManager.py",
    "content": "from App.User import User\n\nclass UserManager():\n\tdef __init__(self, DAO):\n\t\tself.user = User(DAO.db.user)\n\t\tself.book = DAO.db.book\n\t\tself.dao = self.user.dao\n\n\tdef list(self):\n\t\tuser_list = self.dao.list()\n\n\t\treturn user_list\n\n\tdef signin(self, email, password):\n\t\tuser = self.dao.getByEmail(email)\n\n\t\tif user is None:\n\t\t\treturn False\n\n\t\tuser_pass = user['password'] # user pass at \n\t\tif user_pass != password:\n\t\t\treturn False\n\n\t\treturn user\n\n\tdef signout(self):\n\t\tself.user.signout()\n\t\t\n\tdef get(self, id):\n\t\tuser = self.dao.getById(id)\n\n\t\treturn user\n\n\tdef signup(self, name, email, password):\n\t\tuser = self.dao.getByEmail(email)\n\n\t\tif user is not None:\n\t\t\treturn \"already_exists\"\n\n\t\tuser_info = {\"name\": name, \"email\": email, \"password\": password}\n\t\t\n\t\tnew_user = self.dao.add(user_info)\n\n\t\treturn new_user\n\t\t\n\tdef get(self, id):\n\t\tuser = self.dao.getById(id)\n\n\t\treturn user\n\t\t\n\tdef update(self, name, email, password, bio, id):\n\t\tuser_info = {\"name\": name, \"email\": email, \"password\": password, \"bio\":bio}\n\t\t\n\t\tuser = self.dao.update(user_info, id)\n\n\t\treturn user\n\n\tdef getBooksList(self, id):\n\t\treturn self.book.getBooksByUser(id)\n\n\tdef getUsersByBook(self, book_id):\n\t\treturn self.dao.getUsersByBook(book_id)"
  },
  {
    "path": "Controllers/__init__.py",
    "content": ""
  },
  {
    "path": "Misc/functions.py",
    "content": "import hashlib, binascii\nimport timeago, datetime\n\nsalt=b'$#0x--.\\'/\\\\98'\ndef hash(string):\n    dk = hashlib.pbkdf2_hmac('sha256', b'password', salt, 100000)\n    return binascii.hexlify(dk).decode(\"utf-8\")\n\ndef b_hash(string):\n    dk = hashlib.pbkdf2_hmac('sha256', b'password', salt, 100000)\n    return binascii.hexlify(dk)\n    \ndef ago(date):\n    \"\"\"\n        Calculate a '3 hours ago' type string from a python datetime.\n    \"\"\"\n    now = datetime.datetime.now() + datetime.timedelta(seconds = 60 * 3.4)\n\n    return (timeago.format(date, now)) # will print x secs/hours/minutes ago"
  },
  {
    "path": "Models/AdminDAO.py",
    "content": "class AdminDAO():\n\tdb = {}\n\t\n\tdef __init__(self, DAO):\n\t\tself.db = DAO\n\t\tself.db.table = \"admin\"\n\n\tdef getById(self, id):\n\t\tq = self.db.query(\"select * from @table where id='{}'\".format(id))\n\n\t\tuser = q.fetchone()\n\n\t\treturn user\n\n\tdef getByEmail(self, email):\n\t\tq = self.db.query(\"select * from @table where email='{}'\".format(email))\n\n\t\tuser = q.fetchone()\n\n\t\treturn user"
  },
  {
    "path": "Models/BookDAO.py",
    "content": "class BookDAO():\n\tdef __init__(self, DAO):\n\t\tself.db = DAO\n\t\tself.db.table = \"books\"\n\n\tdef delete(self, id):\n\t\tq = self.db.query(\"DELETE FROM @table where id={}\".format(id))\n\t\tself.db.commit()\n\n\t\treturn q\n\n\n\tdef reserve(self, user_id, book_id):\n\t\tif not self.available(book_id):\n\t\t\treturn \"err_out\"\n\n\t\tq = self.db.query(\"INSERT INTO reserve (user_id, book_id) VALUES('{}', '{}');\".format(user_id, book_id))\n\t\t\n\t\tself.db.query(\"UPDATE @table set count=count-1 where id={};\".format(book_id))\n\t\tself.db.commit()\n\n\t\treturn q\n\n\tdef getBooksByUser(self, user_id):\n\t\tq = self.db.query(\"select * from @table left join reserve on reserve.book_id = @table.id where reserve.user_id={}\".format(user_id))\n\n\t\tbooks = q.fetchall()\n\n\t\tprint(books)\n\t\treturn books\n\n\tdef getBooksCountByUser(self, user_id):\n\t\tq = self.db.query(\"select count(reserve.book_id) as books_count from @table left join reserve on reserve.book_id = @table.id where reserve.user_id={}\".format(user_id))\n\n\t\tbooks = q.fetchall()\n\n\t\tprint(books)\n\t\treturn books\n\n\tdef getBook(self, id):\n\t\tq = self.db.query(\"select * from @table where id={}\".format(id))\n\n\t\tbook = q.fetchone()\n\n\t\tprint(book)\n\t\treturn book\n\n\tdef available(self, id):\n\t\tbook = self.getById(id)\n\t\tcount = book['count']\n\n\t\tif count < 1:\n\t\t\treturn False\n\n\t\treturn True\n\n\tdef getById(self, id):\n\t\tq = self.db.query(\"select * from @table where id='{}'\".format(id))\n\n\t\tbook = q.fetchone()\n\n\t\treturn book\n\n\tdef list(self, availability=1):\n\t\tquery=\"select * from @table\"\n\t\t# Usually when no-admin user query for book\n\t\tif availability==1: query= query+\"  WHERE availability={}\".format(availability)\n\t\t\n\t\tbooks = self.db.query(query)\n\t\t\n\t\tbooks = books.fetchall()\n\n\n\t\treturn books\n\n\tdef getReserverdBooksByUser(self, user_id):\n\t\tquery=\"select concat(book_id,',') as user_books from reserve WHERE user_id={}\".format(user_id)\n\t\t\n\t\tbooks = self.db.query(query)\n\t\t\n\t\tbooks = books.fetchone()\n\n\n\t\treturn books\n\n\tdef search_book(self, name, availability=1):\n\t\tquery=\"select * from @table where name LIKE '%{}%'\".format(name)\n\n\t\t# Usually when no-admin user query for book\n\t\tif availability==1: query= query+\"  AND availability={}\".format(availability)\n\n\t\tq = self.db.query(query)\n\t\tbooks = q.fetchall()\n\t\t\n\t\treturn books"
  },
  {
    "path": "Models/DAO.py",
    "content": "from Models.DBDAO import DBDAO\n\nclass DAO():\n\tdef __init__(self, app):\n\t\tself.db = DBDAO(app)"
  },
  {
    "path": "Models/DB.py",
    "content": "from flaskext.mysql import MySQL\nfrom pymysql.cursors import DictCursor\n\n\nclass DB(object):\n\t\"\"\"Initialize mysql database \"\"\"\n\thost = \"localhost\"\n\tuser = \"root\"\n\tpassword = \"\"\n\tdb = \"lms\"\n\ttable = \"\"\n\n\tdef __init__(self, app):\n\t\tapp.config[\"MYSQL_DATABASE_HOST\"] = self.host;\n\t\tapp.config[\"MYSQL_DATABASE_USER\"] = self.user;\n\t\tapp.config[\"MYSQL_DATABASE_PASSWORD\"] = self.password;\n\t\tapp.config[\"MYSQL_DATABASE_DB\"] = self.db;\n\n\t\tself.mysql = MySQL(app, cursorclass=DictCursor)\n\n\tdef cur(self):\n\t\treturn self.mysql.get_db().cursor()\n\n\tdef query(self, q):\n\t\th = self.cur()\n\t\n\t\tif (len(self.table)>0):\n\t\t\tq = q.replace(\"@table\", self.table)\n\n\t\th.execute(q)\n\n\t\treturn h\n\n\tdef commit(self):\n\t\tself.query(\"COMMIT;\")"
  },
  {
    "path": "Models/DBDAO.py",
    "content": "from copy import copy\n\nfrom Models.BookDAO import BookDAO\nfrom Models.UserDAO import UserDAO\nfrom Models.AdminDAO import AdminDAO\n\nfrom Models.DB import DB\n\nclass DBDAO(DB):\n\tdef __init__(self, app):\n\t\tsuper(DBDAO, self).__init__(app)\n\n\t\tself.book = BookDAO(copy(self))\n\t\tself.user = UserDAO(copy(self))\n\t\tself.admin = AdminDAO(copy(self))\n"
  },
  {
    "path": "Models/UserDAO.py",
    "content": "class UserDAO():\n\tdef __init__(self, DAO):\n\t\tself.db = DAO\n\t\tself.db.table = \"users\"\n\n\n\tdef list(self):\n\t\tusers = self.db.query(\"select @table.id,@table.name,@table.email,@table.bio,@table.mob,@table.lock,@table.created_at,count(reserve.book_id) as books_owned from @table LEFT JOIN reserve ON reserve.user_id=@table.id GROUP BY reserve.user_id\").fetchall()\n\n\t\treturn users\n\n\tdef getById(self, id):\n\t\tq = self.db.query(\"select * from @table where id='{}'\".format(id))\n\n\t\tuser = q.fetchone()\n\n\t\treturn user\n\n\tdef getUsersByBook(self, book_id):\n\t\tq = self.db.query(\"select * from @table LEFT JOIN reserve ON reserve.user_id = @table.id WHERE reserve.book_id={}\".format(book_id))\n\n\t\tuser = q.fetchall()\n\n\t\treturn user\n\n\tdef getByEmail(self, email):\n\t\tq = self.db.query(\"select * from @table where email='{}'\".format(email))\n\n\t\tuser = q.fetchone()\n\n\t\treturn user\n\n\tdef add(self, user):\n\t\tname = user['name']\n\t\temail = user['email']\n\t\tpassword = user['password']\n\n\t\tq = self.db.query(\"INSERT INTO @table (name, email, password) VALUES('{}', '{}', '{}');\".format(name, email, password))\n\t\tself.db.commit()\n\t\t\n\t\treturn q\n\n\n\tdef update(self, user, _id):\n\t\tname = user['name']\n\t\temail = user['email']\n\t\tpassword = user['password']\n\t\tbio = user['bio']\n\n\t\tq = self.db.query(\"UPDATE @table SET name = '{}', email='{}', password='{}', bio='{}' WHERE id={}\".format(name, email, password, bio, _id))\n\t\tself.db.commit()\n\t\t\n\t\treturn q\n"
  },
  {
    "path": "Models/__init__.py",
    "content": ""
  },
  {
    "path": "README.md",
    "content": "# Library Management System\nA simple flask app to manage users along with mysql service\n\n![Libray Management App - Flask](https://github.com/hamzaavvan/library-management-system/blob/master/ss/ss2.JPG?raw=true)\n\n\n## Installation\n\nTo run the app flawlessly, satisfy the requirements\n```bash\n$ pip install -r requirements.txt\n```\n\n## Set Environment Variables\n```bash\n$ export FLASK_APP=app.py\n$ export FLASk_ENV=development\n```\n\n## Start Server\n```bash\n$ flask run\n```\n\nOr run this command \n```bash\n$ python -m flask run\n```\n"
  },
  {
    "path": "app.py",
    "content": "from flask import Flask, g, escape, session, redirect, render_template, request, jsonify, Response\nfrom Misc.functions import *\n\napp = Flask(__name__)\napp.secret_key = '#$ab9&^BB00_.'\n\n# Setting DAO Class\nfrom Models.DAO import DAO\n\nDAO = DAO(app)\n\n# Registering blueprints\nfrom routes.user import user_view\nfrom routes.book import book_view\nfrom routes.admin import admin_view\n\n# Registering custom functions to be used within templates\napp.jinja_env.globals.update(\n    ago=ago,\n    str=str,\n)\n\napp.register_blueprint(user_view)\napp.register_blueprint(book_view)\napp.register_blueprint(admin_view)"
  },
  {
    "path": "db/lms.sql",
    "content": "-- phpMyAdmin SQL Dump\n-- version 4.8.5\n-- https://www.phpmyadmin.net/\n--\n-- Host: 127.0.0.1\n-- Generation Time: Feb 06, 2022 at 01:24 PM\n-- Server version: 10.1.38-MariaDB\n-- PHP Version: 7.3.3\n\nSET SQL_MODE = \"NO_AUTO_VALUE_ON_ZERO\";\nSET AUTOCOMMIT = 0;\nSTART TRANSACTION;\nSET time_zone = \"+00:00\";\n\n\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;\n/*!40101 SET NAMES utf8mb4 */;\n\n--\n-- Database: `lms`\n--\n\n-- --------------------------------------------------------\n\n--\n-- Table structure for table `admin`\n--\n\nCREATE TABLE `admin` (\n  `id` int(11) NOT NULL,\n  `email` varchar(255) NOT NULL,\n  `password` varchar(1000) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n--\n-- Dumping data for table `admin`\n--\n\nINSERT INTO `admin` (`id`, `email`, `password`) VALUES\n(1, 'hamza@gmail.com', '025db420560617303c2ba988d050ec62562343bc0fb0358d31d2f0bae8dbede8');\n\n-- --------------------------------------------------------\n\n--\n-- Table structure for table `books`\n--\n\nCREATE TABLE `books` (\n  `id` int(11) NOT NULL,\n  `name` varchar(255) NOT NULL,\n  `desc` longtext NOT NULL,\n  `author` varchar(255) NOT NULL,\n  `availability` tinyint(1) NOT NULL,\n  `edition` varchar(255) NOT NULL,\n  `count` int(11) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n--\n-- Dumping data for table `books`\n--\n\nINSERT INTO `books` (`id`, `name`, `desc`, `author`, `availability`, `edition`, `count`) VALUES\n(1, '101 Ways To Be A Software Engineer', 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aut repudiandae assumenda distinctio quas tempore, voluptatibus accusamus dolores temporibus, recusandae eligendi similique. Optio, eius? Sint vel nemo, quisquam architecto fugit odio!', 'Mr. Johnny Test', 1, '1', 3),\n(2, 'JAVA For Absolute Beginners', 'Step into the basics of java programmming along with globally famed programmer', '', 1, '1', 5);\n\n-- --------------------------------------------------------\n\n--\n-- Table structure for table `reserve`\n--\n\nCREATE TABLE `reserve` (\n  `id` int(11) NOT NULL,\n  `user_id` int(11) NOT NULL,\n  `book_id` int(11) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=latin1;\n\n--\n-- Dumping data for table `reserve`\n--\n\nINSERT INTO `reserve` (`id`, `user_id`, `book_id`) VALUES\n(1, 1, 1),\n(2, 6, 1);\n\n-- --------------------------------------------------------\n\n--\n-- Table structure for table `users`\n--\n\nCREATE TABLE `users` (\n  `id` int(11) NOT NULL,\n  `name` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL,\n  `email` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL,\n  `password` varchar(1000) COLLATE utf8mb4_unicode_520_ci NOT NULL,\n  `bio` longtext COLLATE utf8mb4_unicode_520_ci NOT NULL,\n  `mob` varchar(255) COLLATE utf8mb4_unicode_520_ci NOT NULL,\n  `lock` tinyint(1) NOT NULL,\n  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;\n\n--\n-- Dumping data for table `users`\n--\n\nINSERT INTO `users` (`id`, `name`, `email`, `password`, `bio`, `mob`, `lock`, `created_at`) VALUES\n(1, 'Hamza', 'hamza@gmail.com', '025db420560617303c2ba988d050ec62562343bc0fb0358d31d2f0bae8dbede8', 'They watch you from the shelf while you sleep 👀. Are you dreaming of them, they wonder, in that wistful mood books are prone to at night when they’re bored and there’s nothing else to do but tease the cat.?', '', 0, '2021-11-09 00:00:00'),\n(6, 'Naveed Ali', 'naveed@gmail.com', '025db420560617303c2ba988d050ec62562343bc0fb0358d31d2f0bae8dbede8', 'Hi :)! Long time no see ❤️', '', 0, '2021-11-18 23:07:53');\n\n--\n-- Indexes for dumped tables\n--\n\n--\n-- Indexes for table `admin`\n--\nALTER TABLE `admin`\n  ADD PRIMARY KEY (`id`);\n\n--\n-- Indexes for table `books`\n--\nALTER TABLE `books`\n  ADD PRIMARY KEY (`id`);\n\n--\n-- Indexes for table `reserve`\n--\nALTER TABLE `reserve`\n  ADD PRIMARY KEY (`id`);\n\n--\n-- Indexes for table `users`\n--\nALTER TABLE `users`\n  ADD PRIMARY KEY (`id`);\n\n--\n-- AUTO_INCREMENT for dumped tables\n--\n\n--\n-- AUTO_INCREMENT for table `admin`\n--\nALTER TABLE `admin`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;\n\n--\n-- AUTO_INCREMENT for table `books`\n--\nALTER TABLE `books`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;\n\n--\n-- AUTO_INCREMENT for table `reserve`\n--\nALTER TABLE `reserve`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;\n\n--\n-- AUTO_INCREMENT for table `users`\n--\nALTER TABLE `users`\n  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;\nCOMMIT;\n\n/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;\n/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;\n/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;\n"
  },
  {
    "path": "info.md",
    "content": "http://www.utm.mx/~caff/doc/OpenUPWeb/openup/guidances/guidelines/entity_control_boundary_pattern_C4047897.html\n\nAn example of an entity for a customer service application is a Customer entity that manages all information about a customer. **A design element for this entity would include data about the customer, behavior to manage the data, behavior to validate customer information and to perform other business calculations, such as \"Is this customer allowed to purchase product X?\"**"
  },
  {
    "path": "requirements.txt",
    "content": "flask==2.3.2\nflask-mysql==1.5.2\ntimeago==1.0.15"
  },
  {
    "path": "routes/__init__.py",
    "content": ""
  },
  {
    "path": "routes/admin.py",
    "content": "from flask import Blueprint, g, escape, session, redirect, render_template, request, jsonify, Response\nfrom app import DAO\nfrom Misc.functions import *\n\nfrom Controllers.AdminManager import AdminManager\nfrom Controllers.BookManager import BookManager\nfrom Controllers.UserManager import UserManager\n\nadmin_view = Blueprint('admin_routes', __name__, template_folder='../templates/admin/', url_prefix='/admin')\n\nbook_manager = BookManager(DAO)\nuser_manager = UserManager(DAO)\nadmin_manager = AdminManager(DAO)\n\n\n@admin_view.route('/', methods=['GET'])\n@admin_manager.admin.login_required\ndef home():\n\tadmin_manager.admin.set_session(session, g)\n\n\treturn render_template('admin/home.html', g=g)\n\n\n@admin_view.route('/signin/', methods=['GET', 'POST'])\n@admin_manager.admin.redirect_if_login\ndef signin():\n\tg.bg = 1\n\t\n\tif request.method == 'POST':\n\t\t_form = request.form\n\t\temail = str(_form[\"email\"])\n\t\tpassword = str(_form[\"password\"])\n\n\t\tif len(email)<1 or len(password)<1:\n\t\t\treturn render_template('admin/signin.html', error=\"Email and password are required\")\n\n\t\td = admin_manager.signin(email, hash(password))\n\n\t\tif d and len(d)>0:\n\t\t\tsession['admin'] = int(d[\"id\"])\n\n\t\t\treturn redirect(\"/admin\")\n\n\t\treturn render_template('admin/signin.html', error=\"Email or password incorrect\")\n\n\treturn render_template('admin/signin.html')\n\n\n@admin_view.route('/signout/', methods=['GET'])\n@admin_manager.admin.login_required\ndef signout():\n\tadmin_manager.signout()\n\n\treturn redirect(\"/admin/\", code=302)\n\n\n@admin_view.route('/users/view/', methods=['GET'])\n@admin_manager.admin.login_required\ndef users_view():\n\tadmin_manager.admin.set_session(session, g)\n\n\tid = int(admin_manager.admin.uid())\n\tadmin = admin_manager.get(id)\n\tmyusers = admin_manager.getUsersList()\n\n\treturn render_template('users.html', g=g, admin=admin, users=myusers)\n\n\n\n@admin_view.route('/books/', methods=['GET'])\n@admin_manager.admin.login_required\ndef books():\n\tadmin_manager.admin.set_session(session, g)\n\n\tid = int(admin_manager.admin.uid())\n\tadmin = admin_manager.get(id)\n\tmybooks = book_manager.list(availability=0)\n\n\treturn render_template('books/views.html', g=g, books=mybooks, admin=admin)\n\n@admin_view.route('/books/<int:id>')\n@admin_manager.admin.login_required\ndef view_book(id):\n\tadmin_manager.admin.set_session(session, g)\n\n\tif id != None:\n\t\tb = book_manager.getBook(id)\n\t\tusers = user_manager.getUsersByBook(id)\n\n\t\tprint('----------------------------')\n\t\tprint(users)\n\t\t\n\t\tif b and len(b) <1:\n\t\t\treturn render_template('books/book_view.html', error=\"No book found!\")\n\n\t\treturn render_template(\"books/book_view.html\", books=b, books_owners=users, g=g)\n\n\n@admin_view.route('/books/add', methods=['GET', 'POST'])\n@admin_manager.admin.login_required\ndef book_add():\n\tadmin_manager.admin.set_session(session, g)\n\t\n\treturn render_template('books/add.html', g=g)\n\n\n@admin_view.route('/books/edit/<int:id>', methods=['GET', 'POST'])\n@admin_manager.admin.login_required\ndef book_edit(id):\n\tadmin_manager.admin.set_session(session, g)\n\n\tif id != None:\n\t\tb = book_manager.getBook(id)\n\n\t\tif b and len(b) <1:\n\t\t\treturn render_template('edit.html', error=\"No book found!\")\n\n\t\treturn render_template(\"books/edit.html\", book=b, g=g)\n\t\n\treturn redirect('/books')\n\n@admin_view.route('/books/delete/<int:id>', methods=['GET'])\n@admin_manager.admin.login_required\ndef book_delete(id):\n\tid = int(id)\n\n\tif id is not None:\n\t\tbook_manager.delete(id)\n\t\n\treturn redirect('/admin/books/')\n\n\n@admin_view.route('/books/search', methods=['GET'])\ndef search():\n\tadmin_manager.admin.set_session(session, g)\n\n\tif \"keyword\" not in request.args:\n\t\treturn render_template(\"books/view.html\")\n\n\tkeyword = request.args[\"keyword\"]\n\n\tif len(keyword)<1:\n\t\treturn redirect('/admin/books')\n\n\tid = int(admin_manager.admin.uid())\n\tadmin = admin_manager.get(id)\n\n\td=book_manager.search(keyword, 0)\n\n\tif len(d) >0:\n\t\treturn render_template(\"books/views.html\", search=True, books=d, count=len(d), keyword=escape(keyword), g=g, admin=admin)\n\n\treturn render_template('books/views.html', error=\"No books found!\", keyword=escape(keyword))\n\n"
  },
  {
    "path": "routes/book.py",
    "content": "from flask import Blueprint, g, escape, session, redirect, render_template, request, jsonify, Response\nfrom app import DAO\n\nfrom Controllers.UserManager import UserManager\nfrom Controllers.BookManager import BookManager\n\nbook_view = Blueprint('book_routes', __name__, template_folder='/templates')\n\nbook_manager = BookManager(DAO)\nuser_manager = UserManager(DAO)\n\n@book_view.route('/books/', defaults={'id': None})\n@book_view.route('/books/<int:id>')\ndef home(id):\n\tuser_manager.user.set_session(session, g)\n\n\tif id != None:\n\t\tb = book_manager.getBook(id)\n\n\t\tprint('----------------------------')\n\t\tprint(b)\n\n\t\tuser_books={}\n\t\tif user_manager.user.isLoggedIn():\n\t\t\tuser_books = book_manager.getReserverdBooksByUser(user_id=user_manager.user.uid())['user_books'].split(',')\n\t\t\n\t\tif b and len(b) <1:\n\t\t\treturn render_template('book_view.html', error=\"No book found!\")\n\n\t\treturn render_template(\"book_view.html\", books=b, g=g, user_books=user_books)\n\telse:\n\t\tb = book_manager.list()\n\n\t\tuser_books=[]\n\t\tif user_manager.user.isLoggedIn():\n\t\t\treserved_books = book_manager.getReserverdBooksByUser(user_id=user_manager.user.uid())\n\t\t\t\n\t\t\tif reserved_books is not None:\n\t\t\t\tuser_books = reserved_books['user_books'].split(',')\n\t\t\n\t\tprint(\"---------------------------------------\")\n\t\tprint(user_books)\n\n\t\tif b and len(b) <1:\n\t\t\treturn render_template('books.html', error=\"No books found!\")\n\t\n\t\treturn render_template(\"books.html\", books=b, g=g, user_books=user_books)\n\n\n\treturn render_template(\"books.html\", books=b, g=g)\n\n\n@book_view.route('/books/add/<id>', methods=['GET'])\n@user_manager.user.login_required\ndef add(id):\n\tuser_id = user_manager.user.uid()\n\tbook_manager.reserve(user_id, id)\n\n\tb = book_manager.list()\n\tuser_manager.user.set_session(session, g)\n\t\n\treturn render_template(\"books.html\", msg=\"Book reserved\", books=b, g=g)\n\n\n@book_view.route('/books/search', methods=['GET'])\ndef search():\n\tuser_manager.user.set_session(session, g)\n\n\tif \"keyword\" not in request.args:\n\t\treturn render_template(\"search.html\")\n\n\tkeyword = request.args[\"keyword\"]\n\n\tif len(keyword)<1:\n\t\treturn redirect('/books')\n\n\td=book_manager.search(keyword)\n\n\tif len(d) >0:\n\t\treturn render_template(\"books.html\", search=True, books=d, count=len(d), keyword=escape(keyword), g=g)\n\n\treturn render_template('books.html', error=\"No books found!\", keyword=escape(keyword))\n\n"
  },
  {
    "path": "routes/user.py",
    "content": "from flask import Blueprint, g, escape, session, redirect, render_template, request, jsonify, Response, flash\nfrom app import DAO\nfrom Misc.functions import *\n\nfrom Controllers.UserManager import UserManager\n\nuser_view = Blueprint('user_routes', __name__, template_folder='/templates')\n\nuser_manager = UserManager(DAO)\n\n@user_view.route('/', methods=['GET'])\ndef home():\n\tg.bg = 1\n\n\tuser_manager.user.set_session(session, g)\n\tprint(g.user)\n\n\treturn render_template('home.html', g=g)\n\n\n@user_view.route('/signin', methods=['GET', 'POST'])\n@user_manager.user.redirect_if_login\ndef signin():\n\tif request.method == 'POST':\n\t\t_form = request.form\n\t\temail = str(_form[\"email\"])\n\t\tpassword = str(_form[\"password\"])\n\n\t\tif len(email)<1 or len(password)<1:\n\t\t\treturn render_template('signin.html', error=\"Email and password are required\")\n\n\t\td = user_manager.signin(email, hash(password))\n\n\t\tif d and len(d)>0:\n\t\t\tsession['user'] = int(d['id'])\n\n\t\t\treturn redirect(\"/\")\n\n\t\treturn render_template('signin.html', error=\"Email or password incorrect\")\n\n\n\treturn render_template('signin.html')\n\n\n@user_view.route('/signup', methods=['GET', 'POST'])\n@user_manager.user.redirect_if_login\ndef signup():\n\tif request.method == 'POST':\n\t\tname = request.form.get('name')\n\t\temail = request.form.get('email')\n\t\tpassword = request.form.get('password')\n\n\t\tif len(name) < 1 or len(email)<1 or len(password)<1:\n\t\t\treturn render_template('signup.html', error=\"All fields are required\")\n\n\t\tnew_user = user_manager.signup(name, email, hash(password))\n\n\t\tif new_user == \"already_exists\":\n\t\t\treturn render_template('signup.html', error=\"User already exists with this email\")\n\n\n\t\treturn render_template('signup.html', msg = \"You've been registered!\")\n\n\n\treturn render_template('signup.html')\n\n\n@user_view.route('/signout/', methods=['GET'])\n@user_manager.user.login_required\ndef signout():\n\tuser_manager.signout()\n\n\treturn redirect(\"/\", code=302)\n\n@user_view.route('/user/', methods=['GET'])\n@user_manager.user.login_required\ndef show_user(id=None):\n\tuser_manager.user.set_session(session, g)\n\t\n\tif id is None:\n\t\tid = int(user_manager.user.uid())\n\n\td = user_manager.get(id)\n\tmybooks = user_manager.getBooksList(id)\n\n\treturn render_template(\"profile.html\", user=d, books=mybooks, g=g)\n\n@user_view.route('/user', methods=['POST'])\n@user_manager.user.login_required\ndef update():\n\tuser_manager.user.set_session(session, g)\n\t\n\t_form = request.form\n\tname = str(_form[\"name\"])\n\temail = str(_form[\"email\"])\n\tpassword = str(_form[\"password\"])\n\tbio = str(_form[\"bio\"])\n\n\tuser_manager.update(name, email, hash(password), bio, user_manager.user.uid())\n\n\tflash('Your info has been updated!')\n\treturn redirect(\"/user/\")"
  },
  {
    "path": "run",
    "content": "#!/bin/bash\n\nexport FLASK_APP=app.py\nexport FLASK_ENV=development\n\nservice mysql start\n\nflask run"
  },
  {
    "path": "static/home.css",
    "content": ".welcome {\n\t    margin: 0 auto;\n}\n\n.welcome h1 {\n\tfont-size: 3.5em;\n}"
  },
  {
    "path": "static/style.css",
    "content": "@import url('https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@100&family=Montserrat:wght@100;300&display=swap');/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\nhtml, h1,h2,h3,h3,h5,h6 {\nfont-family: 'Montserrat', sans-serif;\nfont-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\n\nh1, h2, h3, h4 {\n    -webkit-font-smoothing: antialiased;\n}\n\n.home {\n\tbackground-image: url(\"/static/images/bg.jpg\");\n\tbackground-repeat: no-repeat;\n\tbackground-size: cover;\n\tbackground-position: 0 9.5em;\n}\n\n.book {\n\twidth: 18rem;\n\tdisplay: inline-block;\n\tmargin-right: 15px;\n    margin-bottom: 25px !important;\n}\n\n.book .card-title {\n\tfont-family: inherit !important;\n}\n\n#photo {\n\tmargin: 0 auto;\n    display: block;\n}\n\n.pwrapper {\n\tmargin-top: 5em;\n}\n\n.pwrapper div {\n\tbox-shadow: 0px 0px 0px #666;\n}\n\n.mwrapper {\n\tpadding: 0 !important;\n}\n\n.bwrapper.card {\n\tborder: 0 !important;\n}\n\n.profile.container {\n\tmax-width: 1181px !important;\n}\n\n.bookdesc{\n\t-webkit-line-clamp: 4;\n\t-webkit-box-orient: vertical;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tdisplay: -webkit-box;\n}"
  },
  {
    "path": "templates/admin/books/add.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Manage Books - Add{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container\">\n\t\t<div class=\"back\" style=\"font-size: 1.5em;position: absolute;\">\n\t\t\t<a href=\"javascript:history.back()\"><i class=\"bi bi-arrow-left\"></i></a>\n\t\t</div>\n\t\t<div class=\"d-flex justify-content-center\">\n\t\t\t<form action=\"/books/add\" method=\"GET\" class=\"col-md-5 \">\n\t\t\t<h3>Add Book</h3>\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"title\">Title</label>\n\t\t\t\t<input type=\"text\" name=\"title\" class=\"form-control\" id=\"title\" required  placeholder=\"Enter book title\">\n\t\t\t\t<small class=\"form-text text-muted\">Members will be able to search using title!</small>\n\t\t\t</div>\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"qty\">Quantity</label>\n\t\t\t\t<input type=\"number\" name=\"qty\" class=\"form-control\" id=\"qty\" required  placeholder=\"E.g 2\">\n\t\t\t</div>\n\t\t\t<div class=\"form-group form-check\">\n\t\t\t\t<input type=\"checkbox\" name=\"avaliable\" class=\"form-check-input\" id=\"avaliable\" required >\n\t\t\t\t<label class=\"form-check-label\" for=\"avaliable\">Avaliable</label>\n\t\t\t\t<small class=\"form-text text-muted\">Book will not be shown to members if unchecked!</small>\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"platforms mt-3 mb-3\">\n\t\t\t\t<label class=\"form-check-label\" for=\"avaliable\">Platforms</label>\n\t\t\t\t<div style=\"font-size: 2.1em;\">\n\t\t\t\t\t<i class=\"bi bi-xbox\" style=\"color: green;\"></i>\n\t\t\t\t\t<i class=\"bi bi-youtube ml-2\" style=\"color: red;\"></i>\n\t\t\t\t\t<i class=\"bi bi-windows ml-2\" style=\"color: rgb(39, 144, 185);\"></i>\n\t\t\t\t\t<i class=\"bi bi-github ml-2\" style=\"\"></i>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"desc\">Description</label>\n\t\t\t\t<textarea id=\"desc\" name=\"desc\" class=\"form-control\"></textarea>\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"form-group col-12\">\n\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Add</button>\n\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/admin/books/book_view.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Book - {{books['name']}} {% endblock %}\n\n{% block content %}\n<div class=\"container\">\n    <div style=\"width:100%; margin-top: 3em;margin-bottom: 2em;\">\n        {% if msg %}\n            <div class=\"alert alert-success\">{{msg}}</div>\n        {% endif %}\n        <form action=\"/books/search\" method=\"GET\">\n          <div class=\"form-group\">\n            <div style=\"width: 100%\">\n            <div style=\"width: 90%; display: inline-block;\">\n            <input type=\"search\" name=\"keyword\" autofocus class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" value=\"{{keyword}}\" placeholder=\"Search for books...\">\n            </div>\n            <button type=\"submit\" style=\"margin-left: 5px;\" class=\"btn btn-primary\">Search</button>\n            </div>\n          </div>\n        </form>\n    </div>\n\n    {% if books %}\n            <div class=\"row\">\n                <div class=\"col-md-12\">\n                    <div class=\"card  book\" style=\"width:100%\">\n                        <div class=\"card-body\">\n                            <div class=\"row\">\n                            <div class=\"col-md-5\">\n                                <img src=\"/static/images/bg.jpg\" style=\"height: 250px; width: auto; \n                                margin: 0 auto;\n                                display: block;\" class=\"card-img-top\" alt=\"{{books[1]}}\">\n\t\t\t\t\t\t\t\t<a href=\"edit/{{books['id']}}\" class=\"btn ml-3 mt-3 btn-outline-primary\"><i class=\"bi bi-pen-fill\"></i> Edit</a>\n\t\t\t\t\t\t\t\t<a href=\"delete/{{books['id']}}\" class=\"btn ml-3 mt-3 btn-outline-danger\"><i class=\"bi bi-trash\"></i> Delete</a>\n\n                                <div class=\"platforms mt-3 ml-3\">\n                                    <h4 class=\"font-weight-light\" style=\"margin-bottom: 0;\">Avaliable On:</h4>\n                                    <div style=\"font-size: 2.1em;\">\n                                        <i class=\"bi bi-xbox\" style=\"color: green;\"></i>\n                                        <i class=\"bi bi-youtube ml-2\" style=\"color: red;\"></i>\n                                        <i class=\"bi bi-windows ml-2\" style=\"color: rgb(39, 144, 185);\"></i>\n                                        <i class=\"bi bi-github ml-2\" style=\"\"></i>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"col-md-6\">\n                                <h2>{{books['name']}}</h2>\n                                {% if books['availability'] < 1 %}\n                                <span class=\"badge badge-warning\" style=\"margin-bottom: 5px;\">Assigned</span>\n                                {% endif %}\n                                <p class=\"card-text\">{{books['desc']}}</p>\n                                <p class=\"card-text font-weight-light\"><b>Author:</b> {{books['author']}}</p>\n            \n                                <p class=\"card-text\">\n                                <span class=\"badge badge-{{ 'primary' if books['count'] > 0 else 'secondary' }}\" style=\"margin-bottom: 5px;\">\n                                    {% if books['count'] > 0%}\n                                        Books Left: {{books['count']}}\n                                    {% else %}\n                                        All gone\n                                    {% endif %}\n                                </span>\n                                </p>\n\n\t\t\t\t\t\t\t\t{% if books_owners %}\n\t\t\t\t\t\t\t\t<hr class=\"mt-5 mb-4\">\n\t\t\t\t\t\t\t\t\t<h4 class=\"font-weight-light\">Book Owner(s)</h4>\n\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t{% for user in books_owners %}\n\t\t\t\t\t\t\t\t\t\t<div class=\"owner col-md-3\" style=\"padding-left: 0;\">\n\t\t\t\t\t\t\t\t\t\t\t<img style=\"height: auto !important; display: block;\" class=\"mr-auto ml-auto\" src=\"/static/images/avatar.jpg\">\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"text-center\">{{user['name']}}</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{% endfor %}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{% endif %}\n                            </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n        {% else %}\n            <div class=\"card bwrapper\">\n                <div class=\"card-body\">\n                    <div class=\"text-center mb-4\" style=\"\n                    margin-top: 21px !important;\"><i class=\"text-center mt-4 bi-book\" style=\"\n                        font-size: 6em; \"></i></div>\n                    <p class=\"text-center mb-4\">No Book Found!</p>\n                </div>\n            </div>\n        {% endif %}\t\n</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/admin/books/edit.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Manage Books - Edit {{book['name']}}{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container\">\n\t\t<div class=\"back\" style=\"font-size: 1.5em;position: absolute;\">\n\t\t\t<a href=\"javascript:history.back()\"><i class=\"bi bi-arrow-left\"></i></a>\n\t\t</div>\n\t\t<div class=\"d-flex justify-content-center\">\n\t\t\t<form action=\"/admin/books/edit/{{book['id']}}\" method=\"POST\" class=\"col-md-5 \">\n\t\t\t<h2 style=\"display: inline-block;\">Edit </h2> <h4 style=\"display: inline;\"><b><i>\"{{book['name']}}\"</i></b></h4>\n\t\t\t<div style=\"margin-top: 2em;\" class=\"form-group\">\n\t\t\t\t<label for=\"title\">Title</label>\n\t\t\t\t<input type=\"text\" name=\"title\" class=\"form-control\" value=\"{{book['name']}}\" id=\"title\" required  placeholder=\"Enter book title\">\n\t\t\t\t<small class=\"form-text text-muted\">Members will be able to search using title!</small>\n\t\t\t</div>\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"qty\">Quantity</label>\n\t\t\t\t<input type=\"number\" name=\"qty\" class=\"form-control\" id=\"qty\" value=\"{{book['count']}}\" required  placeholder=\"E.g 2\">\n\t\t\t</div>\n\t\t\t<div class=\"form-group form-check\">\n\t\t\t\t<input type=\"checkbox\" name=\"avaliable\" value=\"{{book['availability']}}\" {{'checked' if book['availability']==1 else''}} class=\"form-check-input\" id=\"avaliable\">\n\t\t\t\t<label class=\"form-check-label\" for=\"avaliable\">Avaliable</label>\n\t\t\t\t<small class=\"form-text text-muted\">Book will not be shown to members if unchecked!</small>\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"platforms mt-3 mb-3\">\n\t\t\t\t<label class=\"form-check-label\" for=\"avaliable\">Platforms</label>\n\t\t\t\t<div style=\"font-size: 2.1em;\">\n\t\t\t\t\t<i class=\"bi bi-xbox\" style=\"color: green;\"></i>\n\t\t\t\t\t<i class=\"bi bi-youtube ml-2\" style=\"color: red;\"></i>\n\t\t\t\t\t<i class=\"bi bi-windows ml-2\" style=\"color: rgb(39, 144, 185);\"></i>\n\t\t\t\t\t<i class=\"bi bi-github ml-2\" style=\"\"></i>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"desc\">Description</label>\n\t\t\t\t<textarea id=\"desc\" name=\"desc\" class=\"form-control\">{{book['desc']}}</textarea>\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<button type=\"submit\" class=\"btn btn-primary\">Update</button>\n\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/admin/books/views.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Manage Books - View {% endblock %}\n\n{% block content %}\n\t<div class=\"container\">\t\n\t\t<div style=\"width:100%; margin-top: 3em;\">\n\t\t\t{% if msg %}\n\t\t\t\t<div class=\"alert alert-success\">{{msg}}</div>\n\t\t\t{% endif %}\n\t\t\t<form action=\"/admin/books/search\" method=\"GET\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <div style=\"width: 100%\">\n\t\t\t    <div style=\"width: 90%; display: inline-block;\">\n\t\t\t    <input type=\"search\" name=\"keyword\" autofocus class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" value=\"{{keyword}}\" placeholder=\"Search for books...\">\n\t\t\t    </div>\n\t\t\t\t<button type=\"submit\" style=\"margin-left: 5px;\" class=\"btn btn-primary\">Search</button>\n\t\t\t    </div>\n\t\t\t  </div>\n\t\t\t</form>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<h2>Manage Books</h2>\n\t\t\t{% if books %}\n\t\t\t\t{% for book in books %}\n\t\t\t\t<div class=\"card book\">\n\t\t\t\t  <img src=\"/static/images/bg.jpg\" class=\"card-img-top\" alt=\"{{book[1]}}\">\n\t\t\t\t  <div class=\"card-body\">\n\t\t\t\t    <h5 class=\"card-title\"><a href=\"{{book['id']}}\">{{book['name']}}</a></h5>\n\t\t\t\t    {% if book[\"availability\"] < 1 %}\n\t\t\t\t    \t<span class=\"badge badge-warning\" style=\"margin-bottom: 5px;\">Assigned</span>\n\t\t\t\t    {% endif %}\n\t\t\t\t    <p class=\"card-text bookdesc\">{{book[\"desc\"]}}</p>\n\n\t\t\t\t    <p class=\"card-text\">\n\t\t\t\t    <span class=\"badge badge-{{ 'success' if book['availability'] > 0 else 'danger' }}\" style=\"margin-bottom: 5px;\">\n\t\t\t\t    \t{% if book[\"count\"] > 0%}\n\t\t\t\t    \t  Books Left: {{book['count']}}\n\t\t\t\t    \t{% else %}\n\t\t\t\t    \t  All gone\n\t\t\t\t    \t{% endif %}\n\t\t\t\t    </span>\n\t\t\t\t\t</p>\n\t\t\t\t\t<form method=\"get\" action=\"\">\n\t\t\t\t\t\t<a href=\"edit/{{book['id']}}\" class=\"btn btn-outline-primary\">\n\t\t\t\t\t\t\t<i class=\"bi bi-pen-fill\"></i> Edit\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<a href=\"delete/{{book['id']}}\" class=\"btn btn-outline-danger\">\n\t\t\t\t\t\t\t<i class=\"bi bi-trash\"></i> Delete\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</form>\n\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t{% endfor %}\n\t\t\t{% else %}\n\t\t\t\t<p>No Books In Stash!</p>\n\t\t\t{% endif %}\t\n\t\t</div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/admin/home.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Admin Home{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container d-flex h-75\">\n\t    <div class=\"row justify-content-center align-self-center welcome\">\n\t    \t<h3>WELCOME</h3>\n\t\t\t<div style=\"width:100%\">\n\t\t\t<form action=\"/admin/books/search\" method=\"GET\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"exampleInputEmail1\">Search</label>\n\t\t\t    <input type=\"search\" name=\"keyword\" autofocus class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" placeholder=\"Search for books...\">\n\t\t\t    <small id=\"emailHelp\" class=\"form-text text-muted\">Available books will be shown to members.</small>\n\t\t\t  </div>\n\t\t\t  <button type=\"submit\" class=\"btn btn-primary\">Search</button>\n\t\t\t</form>\n\t\t\t</div>\n\t    </div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/admin/signin.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Admin Signin{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container d-flex h-75\">\n\t    <div class=\"row justify-content-center align-self-center welcome\">\n\n\t\t\t<div style=\"width:100%\">\n\t\t\t<h4>ADMIN SIGNIN</h4>\n\t\t\t{% if error %}\n\t\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t\t{{error}}\n\t\t\t\t</div>\n\t\t\t{% endif %}\n\n\t\t\t<form action=\"/admin/signin/\" method=\"POST\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"exampleInputEmail1\">Email address</label>\n\t\t\t    <input type=\"email\" class=\"form-control\" name=\"email\" aria-describedby=\"emailHelp\" placeholder=\"Enter email\">\n\t\t\t    <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n\t\t\t  </div>\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"exampleInputPassword1\">Password</label>\n\t\t\t    <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" placeholder=\"Password\">\n\t\t\t  </div>\n\n\t\t\t  <button type=\"submit\" class=\"btn btn-primary\">Signin</button>\n\t\t\t</form>\n\t\t\t</div>\n\t    </div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/admin/users.html",
    "content": "{%extends \"/shared/admin_layout.html\" %}\n\n{% block title %}Manage Users {% endblock %}\n\n{% block content %}\n\t\n\t<div class=\"container\">\n\t\t<div>\n\t\t\t<h2>Manage Users</h2>\n\t\t\t<br>\n\t\t\t\n\t\t\t{% if users %}\n\t\t\t\t{% for user in users %}\n\t\t\t\t\t<div class=\"list-group\">\n\t\t\t\t\t  <a href=\"#\" class=\"list-group-item list-group-item-action flex-column align-items-start\">\n\t\t\t\t\t    <div class=\"d-flex w-100 justify-content-between\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<img style=\"height: auto !important;\" src=\"/static/images/avatar.jpg\">\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"col-md-11\">\n\t\t\t\t\t\t\t\t<h5 class=\"mb-1\">{{user['name']}}</h5>\n\t\t\t\t\t\t\t\t<form style=\"display: inline;\" method=\"POST\" action=\"../delete/{{user['id']}}\"><button style=\"border-radius: 100%; padding: 10px;\" class=\"btn btn-outline-danger float-right\"><i class=\"bi bi-trash\"></i></button></form>\n\t\t\t\t\t\t\t\t<small class=\"font-weight-light\" style=\"display: block;font-size: 15px;width: 90%;\">{{user['bio']}}</small>\n\t\t\t\t\t\t\t\t<p class=\"mb-1 font-weight-light\">{{user['email']}}</p>\n\t\t\t\t\t\t\t\t<p class=\"mb-1 font-weight-light\"><span class=\"badge badge-warning\">Books Owned: {{user['books_owned']}}</span></p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t    <small>{{ \"Locked\" if user['lock']>0 else \"\"}}</small>\n\t\t\t\t\t    <small class=\"float-right\">{{ ago(user['created_at']) }}</small>\n\t\t\t\t\t  </a>\n\t\t\t\t\t</div>\n\t\t\t\t{% endfor %}\n\t\t\t{% else %}\n\t\t\t\t<p>No Users Found!</p>\n\t\t\t{% endif %}\t\n\t\t</div>\n\t</div>\n\n\t<script>\n\n\t</script>\n{% endblock %}\n"
  },
  {
    "path": "templates/book_view.html",
    "content": "{%extends \"/shared/layout.html\" %}\n\n{% block title %}Book - {{books['name']}} {% endblock %}\n\n{% block content %}\n<div class=\"container\">\n    <div style=\"width:100%; margin-top: 3em;margin-bottom: 2em;\">\n        {% if msg %}\n            <div class=\"alert alert-success\">{{msg}}</div>\n        {% endif %}\n        <form action=\"/books/search\" method=\"GET\">\n          <div class=\"form-group\">\n            <div style=\"width: 100%\">\n            <div style=\"width: 90%; display: inline-block;\">\n            <input type=\"search\" name=\"keyword\" autofocus class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" value=\"{{keyword}}\" placeholder=\"Search for books...\">\n            </div>\n            <button type=\"submit\" style=\"margin-left: 5px;\" class=\"btn btn-primary\">Search</button>\n            </div>\n          </div>\n        </form>\n    </div>\n\n    {% if books %}\n            <div class=\"row\">\n                <div class=\"col-md-12\">\n                    <div class=\"card  book\" style=\"width:100%\">\n                        <div class=\"card-body\">\n                            <div class=\"row\">\n                            <div class=\"col-md-5\">\n                                <img src=\"/static/images/bg.jpg\" style=\"height: 250px; width: auto; \n                                margin: 0 auto;\n                                display: block;\" class=\"card-img-top\" alt=\"{{books[1]}}\">\n                                <a href=\"/books/add/{{books['id']}}\" class=\"btn btn-outline-warning ml-3 mt-3  {{ 'disabled' if str(books['id']) in user_books else '' }}\"><i class=\"bi bi-journal-plus\"></i> {{ 'Added' if str(books['id']) in user_books else 'Add' }}</a>\n\n                                <div class=\"platforms mt-3 ml-3\">\n                                    <h4 class=\"font-weight-light\" style=\"margin-bottom: 0;\">Avaliable On:</h4>\n                                    <div style=\"font-size: 2.1em;\">\n                                        <i class=\"bi bi-xbox\" style=\"color: green;\"></i>\n                                        <i class=\"bi bi-youtube ml-2\" style=\"color: red;\"></i>\n                                        <i class=\"bi bi-windows ml-2\" style=\"color: rgb(39, 144, 185);\"></i>\n                                        <i class=\"bi bi-github ml-2\" style=\"\"></i>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"col-md-6\">\n                                <h2>{{books['name']}}</h2>\n                                {% if books['availability'] < 1 %}\n                                <span class=\"badge badge-warning\" style=\"margin-bottom: 5px;\">Assigned</span>\n                                {% endif %}\n                                <p class=\"card-text\">{{books['desc']}}</p>\n                                <p class=\"card-text font-weight-light\"><b>Author:</b> {{books['author']}}</p>\n            \n                                <p class=\"card-text\">\n                                <span class=\"badge badge-{{ 'primary' if books['count'] > 0 else 'secondary' }}\" style=\"margin-bottom: 5px;\">\n                                    {% if books['count'] > 0%}\n                                        Books Left: {{books['count']}}\n                                    {% else %}\n                                        All gone\n                                    {% endif %}\n                                </span>\n                                </p>\n                            </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n\n        {% else %}\n            <div class=\"card bwrapper\">\n                <div class=\"card-body\">\n                    <div class=\"text-center mb-4\" style=\"\n                    margin-top: 21px !important;\"><i class=\"text-center mt-4 bi-book\" style=\"\n                        font-size: 6em; \"></i></div>\n                    <p class=\"text-center mb-4\">No Book Found!</p>\n                </div>\n            </div>\n        {% endif %}\t\n</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/books.html",
    "content": "{%extends \"/shared/layout.html\" %}\n\n{% block title %}Books{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container h-75\">\t\n\t\t<div style=\"width:100%; margin-top: 3em;\">\n\t\t\t{% if msg %}\n\t\t\t\t<div class=\"alert alert-success\">{{msg}}</div>\n\t\t\t{% endif %}\n\t\t\t<form action=\"/books/search\" method=\"GET\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <div style=\"width: 100%\">\n\t\t\t    <div style=\"width: 90%; display: inline-block;\">\n\t\t\t    <input type=\"search\" name=\"keyword\" autofocus class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" value=\"{{keyword}}\" placeholder=\"Search for books...\">\n\t\t\t    </div>\n\t\t\t\t<button type=\"submit\" style=\"margin-left: 5px;\" class=\"btn btn-primary\">Search</button>\n\t\t\t    </div>\n\t\t\t  </div>\n\t\t\t</form>\n\t\t</div>\n\n\t\t<div style=\"width:100%; margin-top: 3em;\">\n\t\t\t{% if books %}\n\t\t\t\t{% if search %}\n\t\t\t\t<h4>Search Found ({{count}})</h4>\n\t\t\t\t{% endif %}\n\t\t\t\t{% for book in books %}\n\t\t\t\t<div class=\"card book\">\n\t\t\t\t  <img src=\"/static/images/bg.jpg\" class=\"card-img-top\" alt=\"{{book[1]}}\">\n\t\t\t\t  <div class=\"card-body\">\n\t\t\t\t    <h5 class=\"card-title\"><a href=\"/books/{{book['id']}}\">{{book['name']}}</a></h5>\n\t\t\t\t    {% if book['availability'] < 1 %}\n\t\t\t\t    \t<span class=\"badge badge-warning\" style=\"margin-bottom: 5px;\">Assigned</span>\n\t\t\t\t    {% endif %}\n\t\t\t\t    <p class=\"card-text bookdesc\">{{book['desc']}}</p>\n\n\t\t\t\t    <p class=\"card-text\">\n\t\t\t\t    <span class=\"badge badge-{{ 'primary' if book['count'] > 0 else 'secondary' }}\" style=\"margin-bottom: 5px;\">\n\t\t\t\t    \t{% if book['count'] > 0%}\n\t\t\t\t    \t  Books Left: {{book['count']}}\n\t\t\t\t    \t{% else %}\n\t\t\t\t    \t  All gone\n\t\t\t\t    \t{% endif %}\n\t\t\t\t    </span>\n\t\t\t\t\t</p>\n\n\t\t\t\t    {% if book['count'] > 0 %}\n\t\t\t\t    <a href=\"/books/add/{{book['id']}}\" {{ 'disabled' if user_books!=None and str(book['id']) in user_books else '' }} class=\"btn btn-outline-warning {{ 'disabled' if str(book['id']) in user_books else '' }}\"><i class=\"bi bi-journal-plus\"></i> {{ 'Added' if str(book['id']) in user_books else 'Add' }}</a>\n\t\t\t\t    {% endif %}\n\t\t\t\t  </div>\n\t\t\t\t</div>\n\t\t\t\t{% endfor %}\n\t\t\t{% else %}\n\t\t\t\t<h4>No Books Found!</h4>\n\t\t\t\t<p>Please contact the librarian</p>\n\t\t\t{% endif %}\n\t\t</div>\n\t</div>\n{% endblock %}"
  },
  {
    "path": "templates/home.html",
    "content": "{%extends \"/shared/layout.html\" %}\n\n{% block title %}Home{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container d-flex h-75\">\n\t    <div class=\"row justify-content-center align-self-center welcome\">\n\t    \t<h3>WELCOME</h3>\n\t\t\t<div style=\"width:100%\">\n\t\t\t<form action=\"/books/search\" method=\"GET\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"exampleInputEmail1\">Search</label>\n\t\t\t    <input type=\"search\" autocomplete=\"false\" name=\"keyword\" autofocus class=\"form-control\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" placeholder=\"Search for books...\">\n\t\t\t    <small id=\"emailHelp\" class=\"form-text text-muted\">Available books will be shown to members.</small>\n\t\t\t  </div>\n\t\t\t  <button type=\"submit\" class=\"btn btn-primary\">Search</button>\n\t\t\t</form>\n\t\t\t</div>\n\t    </div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/profile.html",
    "content": "{%extends \"/shared/layout.html\" %}\n\n{% block title %}Profile - {{user['name']}} {% endblock %}\n\n{% block content %}\n\t<div class=\"profile container\">\n\t\t{% with messages = get_flashed_messages() %}\n\t\t\t{% if messages %}\n\t\t\t\t<div class=\"alert alert-success\">\n\t\t\t\t\t{% for message in messages %}\n\t\t\t\t\t\t<span>{{ message }}</span>\n\t\t\t\t\t{% endfor %}\n\t\t\t\t</div>\n\t\t\t{% endif %}\n\t\t{% endwith %}\n\t\t<div class=\"\">\n\n            <div class=\"card-body\">\n                <div class=\"row d-flex justify-content-between\">\n                    <div class=\"col-md-4 pt-4 card\" style=\"height: fit-content;\">\n                        <div class=\"card-body\">\n                            <div class=\"form-group\">\n                                <div class=\"profile-pic-div m-auto\">\n                                    <img src=\"/static/images/avatar.jpg\" id=\"photo\">\n                                    <!-- <input type=\"file\" id=\"file\">\n                                    <label for=\"file\" id=\"uploadBtn\" style=\"display: none;\">Choose Photo</label> -->\n\t\t\t\t\t\t\t\t\t<div class=\"text-center mt-4\">{{user['name']}}</div>\n                                </div>\n                            </div>\n                            <hr>\n                            <p class=\"lead\">\n                                {{user['bio']}}\n                            </p>\n\t\t\t\t\t\t\t<hr/>\n\t\t\t\t\t\t\t<p class=\"lead\">Joined: <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-activity\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t\t<path fill-rule=\"evenodd\" d=\"M6 2a.5.5 0 0 1 .47.33L10 12.036l1.53-4.208A.5.5 0 0 1 12 7.5h3.5a.5.5 0 0 1 0 1h-3.15l-1.88 5.17a.5.5 0 0 1-.94 0L6 3.964 4.47 8.171A.5.5 0 0 1 4 8.5H.5a.5.5 0 0 1 0-1h3.15l1.88-5.17A.5.5 0 0 1 6 2Z\"/>\n\t\t\t\t\t\t\t  </svg> {{ago(user['created_at'])}}</p>\n                        </div>\n                    </div>\n                    <div class=\"card col-md-7 mwrapper\">\n\n\t\t\t\t\t\t<ul class=\"nav nav-tabs\" id=\"myTab\" role=\"tablist\">\n\t\t\t\t\t\t\t<li class=\"nav-item\">\n\t\t\t\t\t\t\t  <a class=\"nav-link active\" id=\"home-tab\" data-toggle=\"tab\" href=\"#home\" role=\"tab\" aria-controls=\"home\" aria-selected=\"true\">Your Books</a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li class=\"nav-item\">\n\t\t\t\t\t\t\t  <a class=\"nav-link\" id=\"profile-tab\" data-toggle=\"tab\" href=\"#profile\" role=\"tab\" aria-controls=\"profile\" aria-selected=\"false\">Profile</a>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t  </ul>\n\n\t\t\t\t\t\t  <div class=\"col-md-12 \">\n\t\t\t\t\t\t\t<div class=\"tab-content\" id=\"myTabContent\">\n\t\t\t\t\t\t\t\t<div class=\"tab-pane fade show active\" id=\"home\" role=\"tabpanel\" aria-labelledby=\"home-tab\">\n\t\t\t\t\t\t\t\t<div class=\"\">\n\t\t\t\t\t\t\t\t\t{% if books %}\n\t\t\t\t\t\t\t\t\t\t<!-- <h2 class=\"text-center mt-4\" style=\"margin-bottom: 0.5em;\">Your Books</h2> -->\n\t\t\t\t\t\t\t\t\t\t<div class=\"text-center mb-4 mt-4\"><i class=\"text-center mt-4 bi-book\" style=\"\n\t\t\t\t\t\t\t\t\t\t\tfont-size: 6em; \"></i></div>\n\t\t\t\t\t\t\t\t\t\t{% for book in books %}\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"card book\">\n\t\t\t\t\t\t\t\t\t\t\t\t<img src=\"/static/images/bg.jpg\" class=\"card-img-top\" alt=\"{{book[1]}}\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"card-body\">\n\t\t\t\t    \t\t\t\t\t\t\t\t<h5 class=\"card-title\"><a href=\"/books/{{book['id']}}\">{{book['name']}}</a></h5>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{% if book['availability'] < 1 %}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"badge badge-warning\" style=\"margin-bottom: 5px;\">Assigned</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{% endif %}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- <p class=\"card-text bookdesc\">{{book['desc']}}</p> -->\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"card-text\">Author: <span class=\"font-weight-light\">{{book['author']}}</span></p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{% endfor %}\n\t\t\t\t\t\t\t\t\t\t{% else %}\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"card bwrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<h4 class=\"text-center mt-4\">Manage Books</h4>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"text-center mb-4\" style=\"margin-top: 21px !important;\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-- <i class=\"text-center mt-4 bi-book\" style=\"font-size: 6em; \"></i> -->\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"6em\" height=\"6em\" fill=\"currentColor\" class=\"bi bi-activity\" viewBox=\"0 0 16 16\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<path fill-rule=\"evenodd\" d=\"M6 2a.5.5 0 0 1 .47.33L10 12.036l1.53-4.208A.5.5 0 0 1 12 7.5h3.5a.5.5 0 0 1 0 1h-3.15l-1.88 5.17a.5.5 0 0 1-.94 0L6 3.964 4.47 8.171A.5.5 0 0 1 4 8.5H.5a.5.5 0 0 1 0-1h3.15l1.88-5.17A.5.5 0 0 1 6 2Z\"/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"text-center mb-4\">No Books You Reserved!</p>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{% endif %}\t\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"tab-pane fade\" id=\"profile\" role=\"tabpanel\" aria-labelledby=\"profile-tab\">\n\t\t\t\t\t\t\t\t\t<div class=\"card-body\">\n\t\t\t\t\t\t\t\t\t\t<h4 class=\"text-center mt-4\">Manage Account</h4>\n\t\t\t\t\t\t\t\t\t\t<p class=\"text-center mb-4\">One Account For Everything</p>\n\n\t\t\t\t\t\t\t\t\t\t<form method=\"POST\" action=\"/user\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-sm-12\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"inputFirstName\" class=\"form-label\">Your Name</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"Enter Your Name\" name=\"name\" value=\"{{user['name']}}\" class=\"form-control\" id=\"inputFirstName\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"row\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"inputEmail3\" class=\"form-label\">Email</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"email\" placeholder=\"Email\" value=\"{{user['email']}}\" name=\"email\" class=\"form-control\" id=\"inputEmail3\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"col-sm-6\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"password\" class=\"form-label\">Password</label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input type=\"password\" placeholder=\"Password\" class=\"form-control\" id=\"password\" name=\"password\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"inpBio\" class=\"form-label\">Bio</label>\n\t\t\t\t\t\t\t\t\t\t\t\t<textarea class=\"form-control\" rows=\"3\" name=\"bio\" id=\"inpBio\">{{user['bio']}}</textarea>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"form-group\">\n\t\t\t\t\t\t\t\t\t\t\t\t<button type=\"submit\" class=\"btn btn-block btn-primary\">Save Changes</button>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</form>\t\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t  </div>\n\n                    </div>\n\n                </div>\n            </form>\n        </div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/shared/admin_layout.html",
    "content": "<html>\n<!-- What the page is called in the tab bar  -->\n<!-- We will add out stylsheet here later -->\n<head>\n\t{%block head %}\n\t<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n\n    <title>{% block title %}{% endblock %}</title>\n\t<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css\">\n\n\t <script src=\"https://code.jquery.com/jquery-3.3.1.slim.min.js\" integrity=\"sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js\" integrity=\"sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1\" crossorigin=\"anonymous\"></script>\n\t<!-- JavaScript Bundle with Popper -->\n\t<script src=\"https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js\" integrity=\"sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM\" crossorigin=\"anonymous\"></script>\n  \n    <link rel=\"stylesheet\" href=\"/static/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"/static/style.css\" />\n    {% endblock %}\n</head>\n<!-- Put some text on the page -->\n<body {{\"class=home\" if g and g.bg==1 else \"\"}}>\n\t<div class=\"container-fluid\">\n\t\t<div class=\"navbar justify-content-end\">\n\t\t\t<ul class=\"nav\">\n\t\t\t  {% if g and g.user %}\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link active\" href=\"/admin/\">Home</a>\n\t\t\t\t  </li>\n\t\t\t\t  <li class=\"nav-item dropdown\">\n\t\t\t\t    <a class=\"nav-link dropdown-toggle\" id=\"navbarDropdown\" role=\"button\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\" href=\"#\">Manage Books</a>\n\t\t\t\t\t<div class=\"dropdown-menu\" aria-labelledby=\"navbarDropdown\">\n\t\t\t\t\t  <a class=\"dropdown-item\" href=\"/admin/books\"><i class=\"bi bi-view-list\"></i> View Books</a>\n\t\t\t\t\t  <a class=\"dropdown-item\" href=\"/admin/books/add\"><i class=\"bi bi-journal-plus\"></i> Add Book</a>\n\t\t\t\t\t</div>\n\t\t\t\t  </li>\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link\" href=\"/admin/users/view/\">Manage Users</a>\n\t\t\t\t  </li>\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link active\" href=\"/admin/signout\">Sign out</a>\n\t\t\t\t  </li>\n\t\t\t\t  <!-- <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link\" href=\"/user/\">Profile</a>\n\t\t\t\t  </li> -->\n\t\t\t  {% endif %}\n\t\t\t</ul>\n\t\t</div>\n\n\n\t\t{%block content %}{% endblock %}\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "templates/shared/layout.html",
    "content": "<html>\n<!-- What the page is called in the tab bar  -->\n<!-- We will add out stylsheet here later -->\n<head>\n\t{%block head %}\n\t<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n\n    <title>{% block title %}{% endblock %}</title>\n    <link rel=\"stylesheet\" href=\"/static/bootstrap.min.css\" />\n\t<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css\">\n\t\n    <link rel=\"stylesheet\" href=\"/static/style.css\" />\n\t\n\t<script src=\"https://code.jquery.com/jquery-3.2.1.slim.min.js\" integrity=\"sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js\" integrity=\"sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q\" crossorigin=\"anonymous\"></script>\n<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js\" integrity=\"sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl\" crossorigin=\"anonymous\"></script>\n    {% endblock %}\n</head>\n<!-- Put some text on the page -->\n<body {{\"class=home\" if g and g.bg==1 else \"\"}}>\n\t<div class=\"container-fluid\">\n\t\t<div class=\"navbar justify-content-end mb-5\">\n\t\t\t<ul class=\"nav\">\n\t\t\t  <li class=\"nav-item\">\n\t\t\t    <a class=\"nav-link active\" href=\"/\">Home</a>\n\t\t\t  </li>\n\t\t\t  <li class=\"nav-item\">\n\t\t\t    <a class=\"nav-link\" href=\"/books\">Books</a>\n\t\t\t  </li>\n\t\t\t  {% if g and g.user %}\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link\" href=\"/user/\">Profile</a>\n\t\t\t\t  </li>\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link\" href=\"/signout/\">Signout</a>\n\t\t\t\t  </li>\n\t\t\t  {% else %}\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link\" href=\"/signin\">Signin</a>\n\t\t\t\t  </li>\n\t\t\t\t  <li class=\"nav-item\">\n\t\t\t\t    <a class=\"nav-link\" href=\"/signup\">Signup</a>\n\t\t\t\t  </li>\n\t\t\t  {% endif %}\n\t\t\t</ul>\n\t\t</div>\n\n\t\t{%block content %}{% endblock %}\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "templates/signin.html",
    "content": "{%extends \"/shared/layout.html\" %}\n\n{% block title %}Signin{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container d-flex h-75\">\n\t    <div class=\"row justify-content-center align-self-center welcome\">\n\t\t\t<h4>SIGNIN</h4>\n\n\t\t\t<div style=\"width:90%\">\n\t\t\t{% if error %}\n\t\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t\t{{error}}\n\t\t\t\t</div>\n\t\t\t{% endif %}\n\t\t\t<form action=\"/signin\" method=\"POST\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"exampleInputEmail1\">Email address</label>\n\t\t\t    <input type=\"email\" class=\"form-control\" name=\"email\" id=\"exampleInputEmail1\" aria-describedby=\"emailHelp\" placeholder=\"Enter email\">\n\t\t\t    <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n\t\t\t  </div>\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"exampleInputPassword1\">Password</label>\n\t\t\t    <input type=\"password\" class=\"form-control\" name=\"password\" id=\"exampleInputPassword1\" placeholder=\"Password\">\n\t\t\t  </div>\n\n\t\t\t  <div class=\"form-group\">\n\t\t\t  \t<a href=\"/signup\">Join us now!</a>\n\t\t\t  </div>\n\n\t\t\t  <button type=\"submit\" class=\"btn btn-primary\">Signin</button>\n\t\t\t  \t<!-- <a style=\"margin-left: 10px\" href=\"/signup\">Or join us now!</a> -->\n\t\t\t</form>\n\t\t\t</div>\n\t    </div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/signup.html",
    "content": "{%extends \"/shared/layout.html\" %}\n\n{% block title %}Signup{% endblock %}\n\n{% block head %}\n\t{{ super() }}\n\n    <link rel=\"stylesheet\" href=\"/static/home.css\" />\n{% endblock %}\n\n{% block content %}\n\t<div class=\"container d-flex h-75\">\n\t    <div class=\"row justify-content-center align-self-center welcome\">\n\t\t\t<h4>SIGNUP</h4>\n\n\t\t\t<div style=\"width:90%\">\n\t\t\t{% if msg %}\n\t\t\t\t<div class=\"alert alert-success\">\n\t\t\t\t\t{{msg}}\n\t\t\t\t</div>\n\t\t\t{% endif %}\n\t\t\t{% if error %}\n\t\t\t\t<div class=\"alert alert-danger\">\n\t\t\t\t\t{{error}}\n\t\t\t\t</div>\n\t\t\t{% endif %}\n\t\t\t<form action=\"/signup\" method=\"POST\">\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"name\">Name</label>\n\t\t\t    <input type=\"text\" class=\"form-control\" id=\"name\" name=\"name\" aria-describedby=\"name\" placeholder=\"Your name\">\n\t\t\t  </div>\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"email\">Email address</label>\n\t\t\t    <input type=\"email\" class=\"form-control\" id=\"email\" name=\"email\" aria-describedby=\"emailHelp\" placeholder=\"Enter email address\">\n\t\t\t    <small id=\"emailHelp\" class=\"form-text text-muted\">We'll never share your email with anyone else.</small>\n\t\t\t  </div>\n\t\t\t  <div class=\"form-group\">\n\t\t\t    <label for=\"password\">Password</label>\n\t\t\t    <input type=\"password\" class=\"form-control\" id=\"password\" name=\"password\" placeholder=\"Password\">\n\t\t\t  </div>\n\n\t\t\t  <button type=\"submit\" class=\"btn btn-primary\">Signup</button>\n\t\t\t  \t<!-- <a style=\"margin-left: 10px\" href=\"/signup\">Or join us now!</a> -->\n\t\t\t</form>\n\t\t\t</div>\n\t    </div>\n\t</div>\n{% endblock %}\n"
  },
  {
    "path": "templates/welcome.html",
    "content": "welcome.html"
  }
]