Giter Club home page Giter Club logo

white_library's Introduction

White Library

An e-commerce store that specialises in limited edition books and/or collectibles.

Deployed Link: https://white-library.herokuapp.com/

Project Goals:

  • Provide a platform for customers to purchase mainly limited edition books from various authors/series and also purchase collectibles
  • Demonstrate web development competencies by building an e-commerce store using Django and PostgreSQL

UX

User Stories

As a/an I want to So that I can
User See all the available products for sale Browse and discover products I may like
User Filter products by category and price Easily discover/find products that I like or are in my budget
User Contact the site owner Ask questions, send feedback or report issues regarding the site
User Search for a specific product or term Find product(s) easily and quickly
User View additional product information Read the book synopsis, view additional images and see more details about the product
User View the items in my cart Add/remove items and view the total
User Revisit my cart even after leaving the site or logging out Continue my shopping where I left off
User Purchase products securely Ensure that my account and payment methods details are safe
User Verify my account Confirm the creation of my account
Unregistered User Create an account View past orders and edit my account information
Registered User Log in View my order history, account information etc.
Registered User Log out Prevent unauthorized access on a shared device
Registered User View my order history See my previous purchases and the status of any current orders
Registered User View/edit my account information Update any details if needed
Registered User View/edit my shipping/billing addresses Update any addresses if needed
Registered User Save products View/buy them at a later date
Registered User Change my password Update my passwords if needed
Registered User Reset my password via email Access my account in case I've forgotten my password
Admin Add product(s) Add new products to the store
Admin Edit product(s) Update product details
Admin Delete product(s) Remove products from the store

Design

Wireframes: View wireframes here

Typeface: Inter

Features

  • Account registration/authentication
  • Stripe payment system
  • Responsive design
  • Product management portal
  • Address book
  • Product grid
  • Saved products list
  • Sorting of products/categories
  • Search bar
  • Order history
  • Contact form w/ email setup

Architecture

Models

Code does not include any class methods, fields only.

Category:

class Category(models.Model):

    name = models.CharField(max_length=254)
    friendly_name = models.CharField(max_length=254, null=True, blank=True)

Product:

class Product(PolymorphicModel):

    category = models.ForeignKey(
        Category, null=True, blank=True, on_delete=models.SET_NULL)
    sku = models.CharField(max_length=254, null=True, blank=True)
    name = models.CharField(max_length=254)
    description = models.TextField()
    price = models.DecimalField(max_digits=6, decimal_places=2, validators=[
        MinValueValidator(Decimal('0.01'), message="Price cannot be lower than 0")])
    image_url = models.URLField(max_length=1024, null=True, blank=True)
    image = models.ImageField(null=True, blank=True)

Book:

class Book(Product):
    author = models.CharField(max_length=254, null=True, blank=True)
    release_date = models.CharField(max_length=254, null=True, blank=True)
    signed_copy = models.CharField(max_length=254, null=True, blank=True)
    pages = models.IntegerField(null=True, blank=True)
    details = models.TextField(null=True, blank=True)

Boxed Set:

class BoxedSet(Product):
    release_date = models.CharField(max_length=254, null=True, blank=True)
    signed_copy = models.CharField(max_length=254, null=True, blank=True)
    details = models.TextField(null=True, blank=True)

Collectible:

class Collectible(Product):
    release_date = models.CharField(max_length=254, null=True, blank=True)
    dimensions = models.CharField(max_length=254, null=True, blank=True)
    details = models.TextField(null=True, blank=True)

Order:

class Order(models.Model):

    order_number = models.CharField(max_length=32, null=False, editable=False)
    user_profile = models.ForeignKey(
        UserProfile, on_delete=models.SET_NULL, null=True, blank=True, related_name='orders')
    full_name = models.CharField(max_length=50, null=False, blank=False)
    email = models.EmailField(max_length=254, null=False, blank=False)
    phone_number = models.CharField(max_length=20, null=False, blank=False)
    country = CountryField(
        blank_label="Country *", null=False, blank=False)
    postcode = models.CharField(max_length=20, null=True, blank=True)
    town_or_city = models.CharField(max_length=40, null=False, blank=False)
    street_address1 = models.CharField(max_length=80, null=False, blank=False)
    street_address2 = models.CharField(max_length=80, null=True, blank=True)
    county = models.CharField(max_length=80, null=True, blank=True)
    date = models.DateTimeField(auto_now_add=True)
    delivery_cost = models.DecimalField(
        max_digits=6, decimal_places=2, null=False, default=0)
    order_total = models.DecimalField(
        max_digits=10, decimal_places=2, null=False, default=0)
    grand_total = models.DecimalField(
        max_digits=10, decimal_places=2, null=False, default=0)
    original_bag = models.TextField(null=False, blank=False, default='')
    stripe_pid = models.CharField(
        max_length=254, null=False, blank=False, default='')

Order Line Item:

class OrderLineItem(models.Model):

    order = models.ForeignKey(Order, null=False, blank=False,
                              on_delete=models.CASCADE, related_name='lineitems')
    product = models.ForeignKey(
        Product, null=False, blank=False, on_delete=models.CASCADE)
    quantity = models.IntegerField(null=False, blank=False, default=0)
    lineitem_total = models.DecimalField(
        max_digits=6, decimal_places=2, null=False, blank=False, editable=False)

User Profile:

class UserProfile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)

Address:

class Address(models.Model):

    default = models.BooleanField(default=False)
    phone_number = models.CharField(max_length=20, null=False, blank=False)
    street_address1 = models.CharField(max_length=80, null=False, blank=False)
    street_address2 = models.CharField(max_length=80, null=True, blank=True)
    town_or_city = models.CharField(max_length=40, null=False, blank=False)
    county = models.CharField(max_length=80, null=True, blank=True)
    postcode = models.CharField(max_length=20, null=True, blank=True)
    country = CountryField(
        blank_label="Country", null=False, blank=False)
    profile = models.ForeignKey(
        UserProfile, on_delete=models.CASCADE, related_name="addresses")

Saved Product:

class SavedProduct(models.Model):

    profile = models.ForeignKey(
        UserProfile, related_name='saved', on_delete=models.CASCADE)
    product = models.ForeignKey(
        Product, related_name='saved', on_delete=models.CASCADE)

Technologies Used

Languages: HTML, CSS, JavaScript, Python

Front-end:

Back-end:

  • Django - High level Python web framework

Packages:

Tooling:

  • Figma - High-fidelity Wireframing

  • Visual Studio Code - Code Editor

  • Git - Version Control System

  • Github - Code Hosting Platform

  • Heroku - Platform-as-a-Service Cloud Provider

  • Pylint - Code linter for Python.

  • django-pylint - Pylint plugin for improving code analysis when analysing code using Django.

  • autopep8 - Code formatter for Python.

  • ESLint - Code linter for Javascript.

  • markdownlint - VSCode extension for linting Markdown.

Testing

Testing is documented in a separate file here.

Deployment

Deployment is documented in a separate file here.

Credits / Acknowledgements

  • Stack Overflow

  • All the doc sites: Django, Stripe etc.

  • The Code Institute Slack community for all the great resources, tips and support

  • My mentor Precious Ijege for his support and feedback with the project

white_library's People

Contributors

arlandfran avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.