CookTopia is an imaginary e-commerce site, selling modern, functional kitchenware. Currently, the e-store specializes in selling knives, pots, pans, and some extra accessories with the intention of expanding the scope.
Our target customers are anyone in need of functional, modern, high-quality products for domestic or professional use.
The design of the site is pretty simplistic yet modern I would say, with the easy-to-see navbar presenting the products the site is offering. The site follows a mostly black-and-white theme, where the fancy shade of red was used for some detailing.
The main background shows the first-time visitor what the site is about, and that the site is for those who cook with passion and expect nothing but quality.
The site is fully responsive, making it easy to use on phones as well as on PCs.
The site is developed according to the Agile Methodology, where the GitHub Project feature was used to utilize the Kanban board for this purpose.
While developing, I chose one issue to work on from the "Todo" column of the Kanban board and moved it into the "In Progress" column.
After I was done with the issue by fulfilling all the acceptance criteria, I moved the issue into the "Done" Column.
I chose to follow the MoSCoW Prioritization method to label my issues(user stories/features):
- Must Have
- Should Have
- Could Have
- Won't Have
The Must Have having the highest priority, next being Should Have and then Could Have, Won't Have presenting the features not being implemented at this point and time.
| User Story | Priority |
|---|---|
| As a customer, I can view listed products, so that I can find something to buy. | MUST HAVE |
| As a customer, I can view a detailed preview of the product, so that I can get more information about it(price, description, image...). | MUST HAVE |
| As a customer, I can search for the desired product by name or description, so that I can find the specific product I want to buy. | MUST HAVE |
| As a customer, I can see the total cost of the items in my bag, so that I can see if I am getting out of my budget. | MUST HAVE |
| As a customer, I can sort specific categories of products, so that I can find the cheapest/best-rated product in the given category. | SHOULD HAVE |
| As a customer, I can sort the list of products, so that I can easily find the best-priced/best-rated one. | SHOULD HAVE |
| As a customer, I can change the quantity of the added items within the shopping bag, so that I can add/remove specific items if desired. | SHOULD HAVE |
| As a customer, I can easily view the items added to my shopping bag, so that I can have an overview of the all items added and total cost. | MUST HAVE |
| As a customer, I can select the quantity of the products, so that I can be sure to add the right quantity of the products to my shopping bag. | MUST HAVE |
| As a customer, I can enter my payment information, so that I can checkout easily without any issues. | MUST HAVE |
| As a customer, I can have insight into the order confirmation details, so that I can be sure I made no mistakes. | SHOULD HAVE |
| As a customer, I can get registered, so that I can have a personal account/profile. | MUST HAVE |
| As a customer, I can view my profile, so that I can view my order history and save/update shipping/paying information. | SHOULD HAVE |
| As a customer, I can receive the confirmation email, so that I can be sure everything went well and keep it for just in case. | SHOULD HAVE |
| As a customer, I can receive email confirmation after filling in the register form, so that I can verify my account registration was successful. | SHOULD HAVE |
| As a customer, I can add items to wishlist, so that I don't need to search for them all over again when I decide to buy them. | SHOULD HAVE |
| As a customer, I can recover my password, so that I can get access to my account in case I forget my password. | SHOULD HAVE |
| As a customer, I can rate the product I already bought, so that I can leave positive/negative feedback. | SHOULD HAVE |
| As a customer, I can see if there are any special offers/deals, so that I can enjoy the discounted price and save some money. | WON'T HAVE |
| As a admin, I can perform CRUD operations, so that I can manipulate the site as desired. | MUST HAVE |
I have created wireframes within Balsamiq to get initial idea of how the site will look like.
CookTopia is an e-commerce site offering a variety of kitchenware. It is currently focused on knives, pots, pans, and a few extra accessories. Customers are able to pay with cards thanks to the implemented Stripe payment system and get the products delivered to their door.
CookTopia is still in the growing phase with the intention of expanding the range of products offered, focusing on modern design, functionality, and above everything, high quality of products.
Simply said the goal is to become the final destination for those searching for high-quality kitchenware products.
The site uses a kind of minimalistic approach, using black and white throughout the the site, gray for some hover effects, and a fancy shade of red for some extra details such as within the logo itself, delivery banner, and some buttons.
The font used is Lato, from Google Fonts, which is a versatile, open-source humanist sans-serif font family that has gained immense popularity for its warmth, legibility, and multilingual support across print and digital mediums.
Icons used are from the Font Awesome free packet of icons.
Images used for the products are taken artistically for a nice presentation, with an attempt to bring the practicality of the products closer to the customers.
The database model or so-called ERD(entity relationship diagram) was created to visualize the connection between models within the project. The diagram was created using Drawsql.app, here is the link to the diagram itself: CookTopia-ERD.
The custom models made for this project were:
- Product
- ReviewRating
- Wishlist
- The landing page consists of Navbar, Main Section where we can find Shop Now button which takes us to the list of all products present at the site, Newsletter sign up option from MailChimp as well as Footer at the bottom of the page.
- Desktop
- Mobile-Collapsed
- Mobile-Open
- Navbar is fully responsive. Here we can find:
- Logo, which acts as a Home button
- Search Bar
- My Account, with Icon for bigger screens
- Wishlist, with Icon for bigger screens
- Shopping Bag Icon, with the total amount under it
- Burger Icon on small and medium screens
- Home button for small and medium screens
- Desktop
- Mobile
- The Footer is pretty simple and self explanatory.
- The Footer is present at every page.
- The Links towards the social networks are being opened within the new tab as good UX practices.
- Privacy Policy also opens an independent page where the Policy is.
- Admin
- User
- My Account section is a drop-down with few different options for the authenticated and not authenticated user as well as Product Managment Tab for the admins.
- Product Management is a page available to the admins, which enables them to add the products to the e-store.
- This page consist of 2 sections:
- Delivery Informations, which is there to store personal info about the users, address, number, country...
- Order History, contains all of the previous orders, if there are any.
- Empty
- Not Empty
- Wishlist is an feature coming handy for storing desired items for some future purchase. The products can be removed from the wishlist as well by clicking on the heart icon.
- Empty
- Not Empty
- Shopping Bag is a page, where we can see details of the added items and cost of the planned purchase.
- We are also able to directly change the quantity of item/s to buy or completely remove them if needed.
- We can also continue shopping by clicking on the Keep Shopping button or proceed to Secure Checkout by pressing the aforementioned button.
- Checkout consists of 2 sections:
- Left Side, where we need to enter personal and delivery details, as well as payment details at the bottom
- Right Side, where we have Order Summary once again to ensure everything is as desired.
- Payment Details, here we need to enter the card number, date of expiration and bic/swift code.
- Here is an example of the testing the payment process, provided by Stripe. For this testing to work the month must be the present one or any month in the future.
- Loading process/making payment, symbolically presented with a loading symbol, letting the customer know that the order is being processed.
- After the successfully placed order, the customer is taken to the Thank You Page, where once again he/she is being presented with the order summery.
- At the bottom is the Checkout Other Products button in case the customer wants to keep on searching through the site.
- The Customer is also being informed that the confirmation e-mail has been sent to the provided e-mail address.
- No Search Criteria, in case someone clicks on search without typing in anything, the toast message will pop out.
- No Matching, the look of the search page in case there are no matches. With the small line of text saying:"0 Products found for..."
- Products Found, the look of the search page in case at least 1 product has been founded, in this case the line informs us that:"3 Products found for..."
- By clicking on the All Products drop-down menu, we can choose to open the All Products page, sorting by one of the given criteria.
- Similarly we can open one of the other sections, be it a Knives, Pans, Pots or Accessories.
- All Products Page, lists all of the present products at the site, with possibility of sorting the products by:
- Price
- Rating
- Name
- Brand
- Category
- Under the picture of each product is a small section, where we can find:
- Product Name
- Brand
- Price in €
- Badge, representing the group of products
- Rating
- Edit/Delte Buttons (only for admins)
- Add To Bag button
- Quantity Button
- Edit button takes the Admin to the Product Management page, in case some changes need to be done.
- Delete button, deletes the product from the e-store.
- This page contains all info about the product as well as Review/Comment section under the Product.
- The info about the Product from the All Products page is extended, and here we have added Description and Product Info.
- Under the Product Info, we have:
- Material
- Diametar
- Volume
- Country of Origin
- This section can be found under the Product Info on the Product Page.
- In case the customer is authenticated and the given product is already in his order history, meaning he/she has already bought the product, the customer can leave a review.
- Authenticated, but the product is not in the order history
- Authenticated, the product is in the order history
- Not Authenticated
-
Depending on the status of the site user, different options will be rendered.
-
Not Authenticated users will see the option to Log In or Register
-
Authenticated users will have the option to Logout
-
The pages to Sign Up, Sign In, and Sign Out are pretty self-explanatory.
-
Sign Up
- Sign In
- Sign Out
-
In case the customer forgets the password, there is a feature for password recovery.
-
It can be accessed from the Sign In Page, by clicking the
Forgot Password?link. -
Password Reset Form
- Password Reseted, the info customer gets after he clicks
Reset My Passwordbutton. At this moment the e-mail to reset the password is being sent to the customer.
- Password Change, the page customer is redirected to from the password reset e-mail.
- Password Changed, the page the customer lands on after the customer types in new passwords 2 times and clicks on the
Change Passwordbutton.
- Successful Registration
- Registration E-Mail Confirmation, the page the user lands on after clicking on the confirmation link within the registration confirmation e-mail.
- Product Badges, cards/links preseting groups of products, can be found at pages as Knives, Pots, Pans, and Accessories.
- The page that is rendered in case the user tries to open a non-existing page or simply appends
/404to the address of the site.
-
A blog could be added, as a way of presenting the products to future customers to help them decide if the given product is the right one for them.
-
About Us Page, could be used to describe CookTopia as a reliable provider of high-quality kitchenware.
-
Some kind of counter where the staff, as well as customers, can see the most sold items.
-
The sales page could be used to introduce the discount possibilities.
-
Add wishlist button to the All Products Page to improve UX.
- The Site CookTopia is an e-commerce store, operating on the principles of Business to Customer model(B2C). For the sake of practicality, the site is designed so that both authenticated and non-authenticated users can make purchases.
-
The main task of this page on the social network Facebook is to inform others about our new products, as well as place targeted advertising.
-
At the Home Page is the Mailchimp newsletter form, where the customers can subscribe and get informed about the new arrivals.
-
I tested several long-tail keywords using the websites Wordtracker, Moz. Most keywords showed low volume and competition.
- In the head of base.html, under the Meta Tags section
<meta name="description"... and<meta name="keywords"... tags were included.
- I created a sitemap.xml file using XML-Sitemaps, for the SEO improvements.
-
I created a robots.txt file within my root directory.
-
The file instructs search engines which directories not to crawl and index. It also links to the sitemap. The existence of this file signals a level of quality to search engines and so improves SEO ranking as a result.
- HTML
- CSS
- Python
- Javascript
- Django v3.2 developement framework
- Bootstrap v4.6 for template rendering
- AllAuth v0.41 for authentication
- django-crispy-forms v1.14.0 for form rendering
- boto3 v1.34.86 for AWS CRUD with Python scripts
- dj-database-url v0.5.0 for DATABASE_URL
- django-countries v7.2.1 for country field rendering in checkout form
- django-storages v1.14.2 for handling static and media files
- gunicorn v22.0.0 apure-Python WSGI server for UNIX
- oauthlib v3.2.2 OAuth request-signing logic
- psycopg2 v2.9.9 s PostgreSQL database adapter for Python
- Stripe v9.1.0 for payment system
- Balsamiq used to create wireframes
- Drawsql.app used to create ERD
- GitPod used as IDE
- Git used for version control
- GitHub used for online storage of codebase and projects tool
- Heroku used for site hosting
- AWS - Amazon Web Services (S3) used to host static and media files
- Image Resizer used for handling the images(resizing, cropping, formating...)
- Favicon used to create favicon
- Amiresponsive used to create a mockup image of the CookTopia site
- Perplexity AI used for debugging and problem solving
- Slack used for connecting as well as debugging and problem-solving during development
- Mailchimp used for newsletter subscription service
- Gmail used for real e-mail sending
- XML Sitemaps used to generate sitemap.xml file
- Privacy Policy Generator used to create policy
- For complete testings head to: TESTING.md
A live version of the site is deployed to Heroku and can be found here: CookTopia.
-
Since the recent change at ElephantSQL, I've decided to go with the database CI provided for us.
-
To make the database for the project, the steps are next:
-
First go to PostgreSQL from Code Institute, enter your e-mail address and click submit.
-
Your database will get generated automatically and you will receive an e-mail with the info about your database.
-
Within the e-mail, you will have a link to your database dashboard. Here you can see all of the needed information about your database or delete them if you'd like to.
-
After you click the
Infobutton, a list with all the needed information will pop up.
-
Before the deployment, the following steps were taken to prepare the application for the deployment on Heroku:
-
The setting
DEBUGin the settings.py has to be set toFALSE. -
It was achieved by the next lines:
-
Within
settings.py:import os import dj_database_url if os.path.isfile('env.py'): import envDEBUG = 'DEVELOPMENT' in os.environ -
Within
env.py:os.environ["DEVELOPMENT"] = 'False' -
Allow Heroku as host: In
settings.pyaddALLOWED_HOSTS = ['app-name.herokuapp.com', 'localhost'] -
All the dependencies were stored in the requirements.txt file with the command
pip3 freeze --local > requirements.txt. -
The start command for the application
web: gunicorn cooktopia.wsgi:applicationwas stored in a Procfile.
-
Go to Heroku, create account if you don't have and log in.
-
Head to your dashboard and click
New, thenCreate new app -
Next step is to give your app a name and to choose region. After that click on
Create app. -
After that head to
Settingstab which you can find on top of your Heroku page and under theConfig Varsset your Key/Value Pairs. -
Then in the
Buildpackssection you will need to add buildpacks. In this caseHeroku/Pythonwas already set, so I didn't need to change anything. -
Then head to the
Deploymenttab which you can also find on top of your Heroku page and underDeployment methodclick onGitHub(in my case that's where my repository is). -
After that, just under the
Deployment methodsection isConnect to GitHubsection where you need to find your repository and then click onConnect. -
Just under
Connect to GitHubsection isAutomatic deployssection where you can click onEnable Automatic Deploysif that's what you want and just under isManual Deploysection, where you need to click onDeploy Manually.
-
This project uses AWS to store media and static files online, because Heroku doesn't persist this type of data.
-
Once you've created an AWS account and logged-in, follow these series of steps to get your project connected.
-
Make sure you're on the AWS Management Console page.
-
Search for S3.
-
Create a new bucket, give it a name (matching your Heroku app name), and choose the region closest to you.
-
Uncheck Block all public access, and acknowledge that the bucket will be public (required for it to work on Heroku).
-
From Object Ownership, make sure to have ACLs enabled, and Bucket owner preferred selected.
-
From the Properties tab, turn on static website hosting, and type
index.htmlanderror.htmlin their respective fields, then clickSave. -
From the Permissions tab, paste in the following CORS configuration:
[ { "AllowedHeaders": [ "Authorization" ], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [] } ] -
Copy your ARN string.
-
From the Bucket Policy tab, select the Policy Generator link, and use the following steps:
-
Policy Type: S3 Bucket Policy
-
Effect: Allow
-
Principal:
* -
Actions: GetObject
-
Amazon Resource Name (ARN): paste-your-ARN-here
-
Click
Add Statement -
Click
Generate Policy -
Copy the entire Policy, and paste it into the Bucket Policy Editor
{ "Version": "2012-10-17", "Id": "Policy111111111111", "Statement": [ { "Sid": "Stmt11111111111", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::bucket-name/*" } ] } -
Before you click "Save", add
/*to the end of the Resource key in the Bucket Policy Editor (like above). -
Click
Save.
-
-
From the Access Control List (ACL) section, click
Editand enable List for Everyone (public access), and accept the warning box.- If the edit button is disabled, you need to change the Object Ownership section above to ACLs enabled.
From the AWS Services Menu, search for and open IAM (Identity and Access Management). Once on the IAM page, follow these steps:
- From User Groups, click
Create New Group.- Suggested Name: manage-cooktopia (manage + the project name)
- Tags are optional, but you must click it to get to the review policy page.
- From User Groups, select your newly created group, and go to the Permissions tab.
- Open the Add Permissions dropdown, and click
Attach Policies. - Select the policy, then click
Add Permissionsat the bottom when finished. - From the JSON tab, select the Import Managed Policy link.
-
Search for S3, select the
AmazonS3FullAccesspolicy, and then Import. -
You'll need your ARN from the S3 Bucket copied again, which is pasted into "Resources" key on the Policy.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::bucket-name", "arn:aws:s3:::bucket-name/*" ] } ] } -
Click
Review Policy. -
Suggested Name:
cooktopia-policy(site name-policy) -
Click Create Policy.
-
- From User Groups, click your
manage-cooktopia. - Click
Attach Policy. - Search for the policy you've just created ("cooktopia-policy") and select it, then Attach Policy.
- From User Groups, click
Add User.- Suggested Name:
cooktopia-staticfiles-user(site name + staticfiles-user)
- Suggested Name:
- For "Select AWS Access Type", select Programmatic Access.
- Select the group to add your new user to:
manage-cooktopia - Tags are optional, but you must click it to get to the review user page.
- Click
Create Useronce done. - You should see a button to Download .csv, so click it to save a copy on your system.
- IMPORTANT: once you pass this page, you cannot come back to download it again, so do it immediately!
- This contains the user's Access key ID and Secret access key.
AWS_ACCESS_KEY_ID= Access key IDAWS_SECRET_ACCESS_KEY= Secret access key
- The
DISABLE_COLLECTSTATICwithin Heroku Config Vars can be removed now, as AWS will handle the static files from now on. - Within you S3 Bucket, create a new folder called:
media. - Select any existing media images for your project to prepare them for being uploaded into the new folder.
- Under Manage Public Permissions, select Grant public read access to this object(s).
- No further settings are required, so click
Upload.
-
Stripe's API is used to handle payments. To setup Stripe follow next steps:
- Create if you don't have and Log In to a Stripe account.
- In the Stripe Dashboard -> Get your test API keys.
- Add your
STRIPE_PUBLIC_KEYandSTRIPE_SECRET_KEYto your env.py, connect to your settings.py using your environment variables and then enter them into your project's Heroku Config Vars. - Including Stripe's Webhooks creates a failsafe if a customer exits the page during payment authorisation. In Stripe's Dashboard -> Developers -> Webhooks -> Add Endpoint: 'herokuapp url/checkout/wh'
- Choose Retrieve all events -> Add Endpoint.
- Add new key STRIPE_WH_SECRET to env.py, settings.py and Heroku Config Vars as before.
- Setup a Gmail Account that will be used to hold and store the emails for your project.
- Log In and navigate to Settings -> See All Settings -> Accounts and Import -> Other Google Account settings
- Activate 2-Step Verification
- Once verified access App Passwords -> enter a name for the password.(e.g. Django-Project Name)
- Click
Create-> copy the 16 digit password that is generated. - In your
settings.pyadd the following Email Settings:
# Sending Emails
if 'DEVELOPMENT' in os.environ:
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
DEFAULT_FROM_EMAIL = 'cooktopia@example.com'
else:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASS')
DEFAULT_FROM_EMAIL = os.environ.get('EMAIL_HOST_USER')
- Add
EMAIL_HOST_PASS,EMAIL_HOST_USERto your Heroku Config Vars.
-
A fork is a copy of a repository. Forking a repository allows you to freely experiment with changes without affecting the original project.
-
To fork a project, follow next steps:
- Log into GitHub and click on repository to download: CookTopia
- Click the
Forkbutton in the top right-hand corner - Select a different owner, if desired
- Click
Create Fork - The repo is now in your chosen account
-
Changes made to a cloned repository will affect the original one if the branch to push to isn't changed.
-
To clone, follow the steps under:
- Navigate to the main page of the repostitory (this could be a forked instance)
- Click on the
Codedropdown menu above the list of files - Choose a method to copy the URL for the repository: either via
HTTPS, by using anSSH key, or by usingGitHub CLI - In your work environment, open Git Bash and change current directory to target location for cloned repository
- Type
git clonefollowed by the copied URL and press enterEnter
- Log In to GitHub and click on repository to download: CookTopia
- Click on the
Codedropdown menu and clickDownload Zipfile - Once downloaded, extract ZIP file and use in your local IDE
- The main guide for this project was the CI walkthrough project BoutiqueAdo.
- Sportswear was used as inspiration for the
README.mdfile. - Chirpy Chooks was used as inspiration for the
README.mdfile. - Everneed was used as inspiration for the
README.mdfile, as well as inspiration for the wishlist feature. - Perplexity.ai was used for debugging during development process.
- Review and Rating System, this video was used for inspiration to create review section within the project.
- Many code bugs were solved thanks to CI Slack channels.
- Simple website footer example, used as inspiration for the footer.
- Average for Ratings in Django, helped with calculating average ratings of a product.
- Images used for this project are from Unsplash.
- XXXLutz was used as inspiration while planing the look of the site.
- I want to say to my wife:"Thank you for all your love and support. <3"
- I want to thank my mentor Mitko Bachvarov for tips and suggestions.
- I want to thank our facilitator Kristyna, as well as our cohort members for advices and moral support during the course.
- I want to thank to tutors at CI Tutor Support for all their help.
- I want to thank to CI Student Support for their understaing and help.























































































