The Reading Room is a (fictitious) book review 'club' website providing reviews on a range of books and book categories. The idea for this project is to provide the visitor with an interactive website allowing registered users to create new book reviews for the enjoyment of all site visitors. If a visitor likes a book review, they are able to select a hyperlink to an online retailer's website, where they are able to purchase a copy of the book.
Please note: This is only to simulate an affiliate marketing business model for educational purposes and in no way endorses or implies a business relationship with the chosen retailers.
I created the The Readng Room logo to present an intuitive image based on research of similar contemporary book review blog websites (details of these websites can be found in the Credits section). The muted, almost monochromatic colour scheme was chosen for a clean simple site allowing the reviews to be the main focus.
- UX (User Experience)
- Design Choices
- Technologies
- Features
- SEO
- Project Management
- Version Control
- Testing
- Bugs
- Deployment
- Credits
The goal of this project is to build a a website that allows site visitors to read book reviews created by registered users and to find links to online retailers to purchase books they like.
The features on the website will:
- Show an interactive list of book reviews containing book details and short user reviews for all site visitors.
- Provide links to online retailers for the associated books reviewed.
- Allow visitors to register a user account to log in to the site and create their own book reviews for others to see and read.
I achieve this by:
- Providing a Registration form with username and password for users to create an account
- Providing a log in page for existing users to log in to their account
- Enabling users who are logged in to create new book reviews or edit their own previous book reviews.
- Read book reviews created by other users.
- Create book reviews for others to read.
- Link to online retailers to purchase the books they like.
- As a user, I want to see a navigation bar at the top of the page where I can navigate to each of the different site pages.
- As a user, I can see a collapsed navigation bar icon on mobile devices that opens up to give access to the site navigation links when clicked.
- As a user, I can see a site logo or name in the navigation bar.
- As a user, I can see a hero image welcoming the user to the site.
- As a user, I can see Call To Actions (CTA) to learn more about the book reviews available.
- As a user, I want to see a page containing all the available book reviews.
- As a user, I want to be able to search for book reviews.
- As a user, I want to click on a book review to see more details about the book.
- As a user, I want to be able to click links to online retailers to purchase the reviewed books.
- As a user, I want to register a username and password to log in to the site.
- As a user, I can see the website privacy policy and terms and conditions.
- As a user, I can see a site map with links to all the site pages.
- As a user, I can contact the site owner(s) using their social media channels.
- As a user, I want to see my user account profile page.
- As a user, I want to be able to click on a book review favourite button to save my favourite reviews.
- As a user, I want to create, edit or delete my own book reviews.
- As a user, I want to be able to wite a comment on a book review.
- As an Administrator, I want to be able to add, edit and delete the book rewiew genre categories
- As a site owner, I want to create an interactive website allowing the user to easily understand the site's purpose and features.
- As a site owner, I want the visitor to create a user account with a password to log in and access more site features.
- As a site owner, I want the user to be able to log out of their account.
- As a site owner, I want an ADMIN user account to administer the site content.
I've chosen fonts that complement eachother using a combination of serif and sans-serif fonts to lend a feeling of printed words on a page or in a book.
The fonts I have chosed for this are Playfair Display for the headings and Source Sans Pro for the body text.
The Logo font was created using Special Elite to give the look of an old typewriter. This is also used for the error handling messages and the titles in the footer.
I've chosen the colours from the Materialize CSS teal palette to give a clean light feel with pastel shades. This gives some separation for the different page sections without overpowering the layout and taking the focus away from the book reviews.
- Teal Darken-4 (004D40) - Dark Teal Green
- Teal (009688) - Teal Green
- Teal Lighten-5 (E0F2F1) - Very Pale Teal Green
- White (FFFFFF) - White
These colours will compliment each other well to create a calm but visually pleasing accent to the white background of the site.
I designed the site mock-ups originally using pen and paper and then developing the designs further using Balsamiq wireframes.
I focussed on defining the basic layout structure of the site and identified how displays would change on different screen sizes such as mobile, tablet and desktop for each page.
The original hand drawn sketch wireframe was created as quick and rough method to try out page formatting ideas to form a basis for creating the wireframe within balsamic.
It represents the early stages of the design process for the website as ideas started to form and the flow of the design process from idea to finished website.
The final wireframes were created using Balsamiq adapted from the original hand drawn wireframe concepts. The image shows the homepage from the site in three display sizes to demonstrate the responsive page design and layout.
- Homepage
- Register
- Log In
- Book Reviews Page
- Book Page
- Add Review
- Edit Review
- Manage Genres
- Add Genre
- Add Comment
- Profile Page
- Privacy Policy
- Terms & Conditions
- Python3
- Used to create the main application functionality
- HTML5
- Used as the main markup language for the website content.
- CSS3
- Used to style the individual webpages.
- JavaScript
- Used to create the interactive functionality of the website
- MongoDB Atlas
- Cloud based document-oriented database used to store the backend data.
- MaterializeCSS
- Used to design a mobile-first responsive website layout.
- Flask
- Python web framework
- Werkzeug
- A comprehensive WSGI web application library installed with Flask
- PyMongo
- PyMongo is a Python tool for working with MongoDB
- Flask-Pymongo
- Flask-PyMongo bridges the gap between Flask and PyMongo
- DNSPython
- DNS toolkit for Python
- click
- Python CLI utilities installed with Flask
- itsdangerous
- Python utility for hash-based message authentication installed with Flask(HMAC, SHA-512)
- jQuery
- Used for the initialisation of the Materialize CSS components functionality.
- Jinja
- Templating language for Python.
- Git
- Git was used for version control by utilizing the Gitpod terminal to commit to Git and push to GitHub.
- GitHub
- Used to store, host and deploy the project files and source code after being pushed from Git.
- Gitpod
- An online IDE linked to the GitHub repository used for the majority of the code development.
- CodePen
- An online code editor and open-source learning environment used to test small sections of code quickly and easily.
- Visual Studio Code
- A locally installed IDE connected to the GitHub repository for when there was no internet connection to use Gitpod.
- Font-Awesome
- Used for icons to enhance headings and add emphasis to text.
- Google fonts
- Used for the website fonts.
- Coolors
- An online tool used to choose the website colour scheme.
- Favicons
- Used to generate a favicon for the website title.
- Am I Responsive?
- A tool for taking a quick snapshot of the responsive breakpoints of the website to visualize how the site will look on different device screen sizes in one place. The resulting screenshot is also used as the README.md logo image.
- What is my Screen Resolution
- An online tool to find out the screen resolution on your device used for CSS @media queries
- Adobe Photoshop CS4
- A raster graphics editor used to manipulate the clock face background image.
- randomkeygen.com
- Random secure password & keygen generator used to create the Flask SECRET_KEY.
The following section describes the site design and page layouts to demonstrate the features implementsed.
- Responsive mobile first design using a MaterializeCSS framework.
- Jinja2 templating framework for Python is used to create the site's front-end dynamic content.
- The app is created using Python3 and a Flask framework to render the HTML pages.
- The site is deployed via a Heroku app linked to a GitHub repository.
- The dynamic content is served utilising a MongoDB document based database.
-
Navbar contains the site logo
-
Jinja template conditions removes menu items based on:
- User logged in or out
- If the user account is Admin or Superuser
-
The welcome page contains a hero image utilising the Materialize CSS parallax feature
-
The CTA container shows the visitor welcome message and button inviting the user to find out more.
-
The book review page shows cards containing all available book reviews
- This page is available to all site visitors whether logged in or not.
-
Each card contains a floating orange button which opens the book page for that specific book review.
-
The search bar allows the user to search the available boo reviews using a text index on the book_review collection comprising the genre, author and title fields.
-
Shows the book review details containing the full book review details.
- The book cover image URL is an optional field.
- It was decided to serve a URL to a book cover image rather than saving a file for simplicity of demonstrating CRUD Functionality. However, as a future development, allowing the user to save an image file using the Flask-PyMongo
save_file()
andsend_file()
helpers is highly desirable.
-
Allows the logged in users to create comments about the book review by linking t the create comment page.
Book Page Buttons
-
Favourite button
- Writes the book ID, tile and author to the users collection as an object in the favourites array.
-
Shopping Cart
- Opens the Amazon.co.uk website showing the book as a search term in the URL.
- Saving a new book review creates a fake Amazon.co.uk affiliate link search URL using the following format:
https://www.amazon.co.uk/s?k=[book]+[title]+[words]&tag=faketag
- This format is a compromise as it only returns a general search for the book title because specific book product page uses an Amazon ASIN product number in the URL.
- In the case of books, the Amazon ASIN number directly matches the book's shorter ISBN-10 barcode and can link directly to the book using the minimum URL format:
https://www.amazon.co.uk/dp/[ASIN]
- However, physical copies of books primarily show the longer ISBN-13 code on the back which will not work correctly if the user records that number when creating a new book review.
- Saving a new book review creates a fake Amazon.co.uk affiliate link search URL using the following format:
- Opens the Amazon.co.uk website showing the book as a search term in the URL.
-
Book review edit button
- Opens the edit review page.
- Only available if the user created the review.
-
Book Review delete button
- Opens the edit review page.
- Only available if the user created the review.
-
Comments button
- Opens the add comment page.
- Only available to users logged in.
-
Users who are logged in can create new book reviews by entering the book details and a book review in the add bok review form.
- The Choose Genre select list reads data from the genres collection.
-
The ADD REVIEW button submits the form data to create a new document in the book_reviews table.
- Only users who created the book review are permitted to edit the review.
- Loading the page gets the current book data from the book_review collection and pre-fills the Edit Review form.
Edit Review Buttons
-
The red cancel button returns the user to the book review page without making any changes.
-
The green edit button updates the book_review document with the new data from all the form input fields.
-
New users are encouraged to create a new account to access more site features.
- Usernames are required to be unique and are checked against existing usernames in the users collection.
- The user is required to complete all fields and check-box before the new user is saved to the users collection
- Passwords are hashed / salted before saving to the database (SHA256)
- The member since date and last login date are also writted automatically at this point.
-
The user name and password are validated against existing users in the users collection.
- Users will not be allowed to log in if either the username or password are incorrect.
-
The profile page displays the user's current account details.
-
The Favourites section displays a summary of the user's favourite books
-
The Book Reviews Written displays a summary of the user's submitted book reviews.
- Only visible for selected users e.g. Admin or Superuser account holders.
- The page shows all current documents from the genres collection displayed in individual cards.
- Each card has an edit and delete button for that genre document.
Manage Genres Buttons
-
Add Genre redirects the user to the Add Genre page where a new genre category can be added
-
Edit button redirects the user to the Edit Genre page where the genre name chan be updated
-
Delete button deletes the genre category from the genre collection.
-
Allows the admin or superuser to create a new genre category
-
The Add Genre button writes the genre_name to the new genre document.
- Allows the admin or superuser to edit an existing genre category
- Loading the page gets the current genre_name from the genres collection and pre-fills the Edit Genre form.
Edit Genre Buttons
-
The red cancel button returns the user to the manage genres page without making any changes.
-
The green edit button updates the genres document with the new data from the form input field.
-
Any user logged in can create a comment on any book review.
-
The comment text, created date and username are saved as an object in the book_review table comments array.
Site Page | Create | Read | Update | Delete |
---|---|---|---|---|
Book Review | All book reviews | |||
Edit Review | Single book review | Update single book review | ||
Book Page | Add user favourite | Single book review | Delete single review | |
Sign Up | Add new user | |||
Log In | User details | |||
Profile | User details | |||
Profile | Created book reviews | |||
Profile | Favourite reviews | |||
Manage Genre | All genres | Delete genre | ||
Add Genre | Add new genre | |||
Edit Genre | Single genre | Update genre name | ||
Add Comment | Add new comment |
-
Coloured Flask flash alerts are used to feedback a range of different user actions:
- In order to try to maintain the site security, defensive programming to prevent "brute force" loading of restricted pages was introduced.
- At its simplest level, certain pages are removed from view unless a user is logged in to the site.
- This ustilises session cookies to validate whether a user is logged in or not.
- The Python functions also contain checks on user input validity by employing if...esle statements as well as exception handling with try..except.
- examples of this include preventing site visitors, who aren't logged in, from just entering a page URL to bypass the login process. This type of exception redirects the user to the login page with a warning flash message.
- At its simplest level, certain pages are removed from view unless a user is logged in to the site.
- A set of friendly HTTP Error landing pages for site visitors to see if a requested page is unavailable or cannot be accessed.
-
Site Admin User Account administration such as:
- User account deactivation
- User password change
- moderating user comments
-
Allowing users to upload image files:
- As an alternative to a URL on book reviews
- For a profile page thumbnail image etc.
Field Description | Collection Key | Data type |
---|---|---|
Unique ID | _id | ObjectId |
Genre Name | genre_name | String |
Field Description | Collection Key | Data type | Default Value |
---|---|---|---|
Unique ID | _id | ObjectId | |
User Name | username | string | |
SHA256 Hashed Password | password | String | |
Admin Account | is_admin | String | "off" |
Superuser Account | is_super_user | String | "off" |
Sign Up Date | date_joined | Date Object | utcnow() |
Last User Login Date | last_login | Date Object | utcnow() |
Field Description | Collection Key | Data type | Default Value |
---|---|---|---|
Unique ID | _id | ObjectId | |
Genre Category | genre | String | |
Book Title | title | String | |
Book Author | author | String | |
Book Cover Image URL | image_url | String | |
Number of Pages | number_pages | Integer | |
Book ISBN-13 Number | isbn | String | |
Book Review Text | review | String | |
User Book Rating | rating | String | |
Created By username | create_by | String | username |
Created Date | created_date | Date Object | utcnow() |
Updated By | mutator | String | |
Updated Date | mutation | Date Object | |
Amazon Purchase Link | purchase_link | String | "https://www.amazon.co.uk/s?k=[book]+[title]+[words]&tag=faketag" |
Comments Array | comments | Array | |
Commments Array Object | text | String | |
Commments Array Object | created_by | String | |
Commments Array Object | created_date | Date Object | utcnow() |
Field Description | Collection Key | Data type |
---|---|---|
Unique ID | _id | ObjectId |
Policy Section Title | title | String |
Section Text Array | text | Array |
Section Text Array Object | Index | String |
Field Description | Collection Key | Data type |
---|---|---|
Unique ID | _id | ObjectId |
Policy Section Title | title | String |
Section Text Array | text | Array |
Section Text Array Object | Index | String |
- ObjectId
- String
- Int32
- Date
- Array
- Object
Search Engine Optimisation for the site was provided in three complementary ways:
- HTML Sitemap links
- XML sitemap file saved in the root directory
- Google Search Console
- Secondary HTML links to each page in the website were added to the footer section of each site page to allow users an alternative means of navigating the site easily.
-
A sitemap.xml file was created to help search engines find, crawl and index the website more easily. It was created by using XML-Sitemaps.com and entering the URL for the deployed website and letting it automatically generate the required xml data for the whole site. The file was then saved in the GitHub repository root directory.
-
The following steps were used to generate the sitemap.xml file:
- Visit XML-Sitemaps.com and enter the URL of the website https://the-reading-room.herokuapp.com/
- Click Start
- The site pages will automatically be scanned
- Click View Sitemap Details
- Download the XML sitemap file
- Save the sitemap.xml file in the root directory of the GitHub repository
-
Google Search Console was used to assist with testing and indexing issues with the website and to see how the site performs in Google search results.
-
The following steps were used to perform the indexing tests:
- Visit Google Search Console
- Click Add Property in the menu bar
- Enter the website URL https://the-reading-room.herokuapp.com/
- Click Continue
- Download the unique verification file created by Google
- Save the verification file in the root directory of the GitHub repository
- On Google Search Console, click Verify
- Once the verification passes, the site is available in the Google Search Console dashboard.
Even though this website has a small number of pages and have navigation links on each page making the Sitemap largely unnecessary, I felt is was a good experience and good practice to add these features in. Note: I haven't added a robots.txt file yet but may add this in the future when I understand more about search engine optimisation techniques.
GitHub Projects are used to organize the planning and development of the website. Two GitHub projects are used to manage different aspects of the site development:
- Development
- Manages the project tasks and files.
- Bug Fixes
- Manages the triage and prioritization of the bug fixes.
The Projects are created using the following GitHub templates:
Automated kanban
template for the Development project.Bug Triage
template for the Bug Fixes project.
The following kanban project cards are used to manage the tasks:
- Backlog - this card is used to capture ideas for project tasks.
- To Do - this is the current work queue for the project.
- In Progress - this is the list of tasks currently in work.
- New issues and pull requests are automatically added to this column using project card automation options.
- Testing - Testing tasks list
- Done - completed tasks
The following Bug Triage template project cards are used to manage the Bux fixes tasks:
- Needs Triage - this card is used to capture new bugs prior to assigning a priority.
- A triage card is more appropriate for larger projects than this but left in as this is where all new issues are assigned when linking a project to a new issue.
- High Priority - this is the high priority queue for the project.
- Low Priority - this is the low priority queue for the project.
- Closed - completed tasks.
Markdown syntax is used to create "To-Do" list style checkboxes by adding - [ ]
for an un-ticked checkbox and - [x]
for a ticked checkbox on cards as a way of splitting a single complex task into a list of steps to be completed.
Version control for this repository is managed within GitHub and Gitpod using separate branches used to work on specific aspects of the project. The following describes the repository branch structure:
- Master - this is the default branch and the source for the repository deployment.
- Documentation - this branch is used for updating the README.md and testing.md documentation only.
- Development - this branch is used as the main working branch for the website development.
- Features - this branch is used to try out new ideas and enhancements for the website.
- Features and enhancements that are accepted are merged down into the Development branch.
- Each individual bug fixes are raised within their own separate branches using the naming convention <GitHub Issue ID Number>-<bug fix description> e.g. branch name 12-correct-navbar-links
The following workflow steps are used to create and update branches within Gitpod and to push changes back to GitHub.
- Open Gitpod from Github using the Gitpod button. This needs to only be done once at the start of the project.
- Start the Gitpod Workspace which opens an online IDE editor window.
- For changes to be made to any documentation files, the git command
git checkout documentation
is used to checkout and switch to the documentation branch. - For changes to be made to other files under normal site development, the git command
git checkout development
is used to checkout and switch to the development branch. - For changes to be made to new files for site enhancements, the git command
git checkout features
is used to checkout and switch to the features branch. - To create a new branch for bug fixes, use the git command
git checkout -b <branch-name>
to create and switch to the new branch.
- New or modified files are staged using the
git add .
command - The changes are committed using
git commit -m "<commit message>"
command. - If the changes are in a newly created branch, the committed changes are pushed from Gitpod to GitHub using the
git push --set-upstream origin <branch-name>
command as there is currently no upstream branch in the remote repository. - For branches that have already been synchronized, the committed changes are pushed from Gitpod to GitHub using the
git push
command.
- Opening the repository in Github, a new pull request is created for the updated branch and assigned to its related Development, Development - JavaScript or Bug Fixes project.
- The changes are reviewed to ensure there are no conflicts between the updated branch and the Master branch.
- The changes are then merged into the Master branch and the merge request is closed. The Project entry is automatically moved to the Done card.
- To update Gitpod with the latest commits From GitHub, the
git checkout master
command is used to checkout and switch to the master branch. - Use the
git pull
command to update the master branch and reset the pointer. - Now switch to the other branches in Gitpod using the
git checkout <branch-name>
command and use thegit merge origin/master
command to update each branch in turn. - Use the
git push
on each branch to update the relevant GiHub Branches to the same commit as the Master branch. - Repeat steps 3 - 17 regularly to ensure updates are saved and correctly version controlled in GitHub.
- Testing information can be found in a separate testing.md file.
To manage bugs and issues tracking, the default GitHub bug_report.md template has been created and activated within the repository settings Features > Issues section. All new bugs and issues are tracked within the GitHub repository Issues section . Open issues are managed within the GitHub Projects section
Each branch is then merged into the master branch using a pull request that is linked to the open issue. Once merged, and the bug report closed, the branch is deleted.
Fixed bugs and issues are marked as closed.
The website was developed using both Gitpod and Visual Studio Code and using Git pushed to GitHub, which hosts the repository. I made the following steps to deploy the site using Heroku:
Ensure the following are installed locally on your computer:
- Python 3.6 or higher
- PIP3 Python package installer
- Git Version Control
- Navigate to simonjvardy/the-reading-room.
- Click the Code button.
- Copy the url in the dropdown box.
- Using your favourite IDE open up your preferred terminal.
- Navigate to your desired file location.
Copy the following code and input it into your terminal to clone the-reading-room:
git clone https://github.com/simonjvardy/the-reading-room.git
Note: The process may be different depending upon your own OS - please follow this Python help guide to understand how to create a virtual environment
- In your IDE terminal window, install the dependencies from the requirements.txt file with the following command:
pip3 install -r requirements.txt
Please ensure you have an account created at MongoDB in order to build the database
- In your MongoDB cluster, create a new database called
the-reading-room
- Create the following collections within the new database:
- The
env.py
file should contain at least the following information:
import os
os.environ.setdefault("IP", "0.0.0.0")
os.environ.setdefault("PORT", "5000")
os.environ.setdefault("SECRET_KEY", "YOUR_OWN_SECRET_KEY")
os.environ.setdefault("MONGO_URI", "YOUR_OWN_MONGODB_URI")
os.environ.setdefault("MONGO_DBNAME", "YOUR_OWN_MONGODB_DATABASE_NAME")
- Please ensure you add in your own
SECRET_KEY
,MONGO_URI
andMONGO_DBNAME
values. - Important: Add the
env.py
file to your.gitignore
file before pushing your files to any public git repository.
- To run the application enter the following command into the terminal window:
python3 app.py
Please ensure you have an account created at Heroku in order to deploy the app
- Log in to your Heroku account dashboard and create a new app.
- Enter the App name.
- This needs to be unique and the-reading-room is already in use so choose a suitable alternative name for your own App.
- Choose a geographical region closest to where you live.
- Options available on a free account are United States or Europe
-
Commit and push your local repository to your GitHub linked repsitory
-
Ensure your local git repository has the following files in the root directory:
- Heroku
Procfile
requirements.txt
- Heroku
-
If these are not showing in your local Git repository for any reason, enter the following commands in the terminal window:
echo web: python app.py > Procfile
pip3 freeze --local > requirements.txt
- Stage, commit and push your local Git repository to GitHub
- In the Heroku App Settings page, open the section Config Vars
- Add all the environmant variables from your local
env.py
file into the Heroku Config Vars:
Key | Value |
---|---|
IP | 0.0.0.0 |
PORT | 5000 |
SECRET_KEY | YOUR_OWN_SECRET_KEY |
MONGO_URI | YOUR_OWN_MONGODB_URI |
MONGO_DBNAME | YOUR_OWN_MONGODB_DATABASE_NAME |
- In the Heroku App Deploy page:
- Select GitHub from the Deployment Method options.
- Select Connect to GitHub.
- Log in to your GitHub account from Heroku to link the App to GitHub.
- Search for and select the repository to be linked in Github.
- Select Connect.
- Select Enable Automatic Deployment from the GitHub Master / Main branch
- Click Open App in Heroku to launch the App in a new browser window.
You can find the images used for the site here. I have sourced them through various websites, which are either free to use or used under license:
-
Welcome Page
- The Background Hero Image was free to use, sourced from PIXNIO
-
Book Review
All demonstration book review image URLs were sourced from Waterstones online bookstore (© Waterstones, 2021. Waterstones Booksellers Limited - All Rights Reserved) from their CDN image delivery URLs and used purely for educational purposes only to demonstrate the app backend CRUD functionality. Please visit Waterstones for some fantastic deals on the latest books!
-
The Martian: Stranded on Mars, one astronaut fights to survive
-
404
- The Error 404 Text Background Image was sourced from Colorlib as part of a template licensed under CC BY 3.0
- The colour palette was identified on Coolors
The following websites were used as the starting point and inspiration for creating the website:
- Waterstones Online book store for website design inspiration and features as well as URL links to their book pages.
- Amazon UK Online retailer for website design inspiration and features as well as URL links to their book pages.
- Kirkus Book Review website / blog for design inspiration and content ideas.
- Instagram - Duchess Of Cornwall Instagram Book Club / Book review site
- Simon Vardy MS-1 & MS-2 Projects for the re-use of many ideas, site pages and code snippets.
- Richard Read for project inspiration and README.md format ideas.
- Neringa Bickmore for project inspiration and README.md content ideas.
- W3Schools for just being a constant source of help and inspiration!
- W3Schools for help working with Python datetime functions.
- Code Institute Course material for the inspiration from code-along challenges, specifically the Task Manager and Thorin Flask apps.
- Jinja Template Designer Documentation for loads of help and ideas.
- San Francisco State University PMO Resources webpage where the original Unit Testing and UAT Testing Plan documents were sourced
- usersnap.com blog which was the inspiration for the modified UAT Testing document and wording.
- Software Testing Fundamentals (STF) for an excellent guide on building testing processes.
- Git - Branching and Merging documentation for help understanding how to manage branches in GitHub / Gitpod.
- digitaljhelms for ideas and help with GitHub branch naming conventions.
- GitHub Help guide on using Error 404 pages on repositories.
- Colorlib the 404.html was adapted from a template made by Colorlib. Go visit their website for more awesome templates, themes and tools.
- Tutorials Point for help with writing timestamps data to MongoDB.
- JoeHx Blog Dissecting the Amazon URL anatomy
- GeeksForGeeks Python 404 error handling in Flask
- Python.org Python VENV virtual environments documentation
- Codementor
- Nielsen BookData Origin of the book jacket images supplied by Waterstones CDN
- Stack Overflow For help fixing so many thing that fell over on this project!
- Stack Overflow for ideas and help with GitHub branch naming conventions.
- Stack Overflow ofr Jinja2 MongoBD list iteration help.
- Stack Overflow for help with writing timestamps data to MongoDB.
- Stack Overflow How to sort a list of tuples by a specific index of the inner list.
- Stack Overflow Sorting datetime objects in a list of tuples
- Stack Overflow Pushing new items to an array inside of an object
- Stack Overflow Disable Materialize CSS Buttons with jQuery
- Flask
- Flashed Messages example code was copied and adapted for flashed messages.
- Flask Docs View Decorators
- Werkzeug
- Security Helpers code copied and adapted for user pasword hashing.
- Materialize CSS
- Cards example code was copied and adapted for the Help Page.
- Forms
- Text Input example code was copied and adapted for many of the pages from log in to adding reviews.
- Checkboxes example code was copied and adapted for sign up page.
- Carousel example code was copied and adapted for the home page
- Accordion example code was copied and adapted for the T&C & Privacy Policy pages.