DeeMcCart / CI_PP5_Jeweller

Jewellery website for CI Project 5
0 stars 2 forks source link

Jeweller

Developer: Deirdre McCarthy, Feb 2024

Live webpage link

site screenshot

Jeweller site: Use Ctrl + click to open in new tab: https://jeweller-bd1caeb15bbd.herokuapp.com/

Table of Contents:

  1. About
    1. Responsiveness
  2. Project Goals:
    1. UX Design - Strategy
    2. UX Design - Strategy - Competitor Portals
    3. UX Design - Strategy - Target Audience
  3. Ecommerce and Marketing Stagtegy
    1. Ecommerce Business Model
    2. Business impacts of adopting an ecommerce strategy
    3. Customer Profiles
    4. Marketing Strategy
  4. UX Design - Scope
    1. UX Design - Scope - User Requirements and Expectations
    2. UX Design - Scope - Geographical
    3. UX Design - Scope - Data
  5. User goals/ user stories:
    1. Site Owner Goals
    2. First-time User Goals
    3. Returning User Goals
  6. Further UX Design:
    1. Skeleton - Wireframes;
    2. Surface - Fonts;
    3. Surface - Colours
    4. Surface - Imagery
  7. Database
    1. Conceptual database design
    2. Database schemas
    3. Techncial implementation
  8. Agile Methology:
    1. Project setup
    2. Designing an Issue Template
    3. Creating project issues
    4. EPICs
    5. MoSCoW Prioritisation;
    6. Level of Effort estimation - Story Points
    7. Project Milestones
    8. Project Sprints
    9. Issue Lifecycle
    10. Project tabular view
    11. Kanban board
    12. Observations and learnings
  9. Features
    1. Included
    2. Mapped to user stories
    3. Future Development
  10. Technology
    1. Languages
    2. Frameworks and Tools
  11. Validation
    1. HTML Validation
    2. CSS Validation
    3. Javascript Validation
    4. Accessibility
    5. Performance
    6. Multi-device Testing
    7. Multi-browser Testing
    8. Testing user stories
    9. Unfixed Bugs
  12. Accessibility
  13. Performance
  14. Deployment
  15. Credits
    1. Content
    2. Media
    3. Code
    4. References
    5. Acknowledgements

About


Jeweller is a system which is designed for a real-life retail Jewellery business. This business built a first website 4 years ago, but it was not integrated with the retail business or everyday processes, and was never successfully implemented.
The existing website remains in use as a 'shop window' for off-the-shelf items, but is not actively maintained, with many products showing as 'out of stock', and online orders discouraged. The business owners are, however, quite active on social media (facebook and Instagram) for (free) advertising and organic marketing - marketing to existing customers and friends of the business.

Facebook is used to showcase custom-made products, and to prompt time/event-based purchases, e.g. Valentines Day, Communion, Mothers Day, Confirmation, Fathers Day, monthly birth-stone, Christmas. The business operates in a medium sized town in the south-east of Ireland, and currently makes all sales in-person, relying on the customer to physically visit. (Often this will begin with an enquiry phonecall) . There are two competing jewellers in close proximity.

The Jeweller business offers four retail (B2C) & 1 trade (B2B) line of business:

As a family-owned and -operated business the unique selling points are:

The challenges of the current business model (which may be partly addressed with a fresh ecommerce strategy) are:

This Jeweller e-commerce offering is:

Responsiveness

The site is built, with the help of Bootstrap & CSS media queries, to be largely responsive so it can be used on a range of devices. It is anticipated that certain system admin tasks such as adding or maintaining products, maintaining customer orders, will be performed on a mid to large screen device - a tablet or desktop. The shop currently has a laptop and a tablet for performing admin tasks.

Responsive Mockup

Project Goals


  1. To provide a website and associated marketing materials
  2. Which aligns with the jewellers current business processes
  3. Extend reach into new market segments
  4. Which uses the capabilities of Django python, HTML, CSS and Javascript.
  5. And is accessible, responsive and relevant.

UX Design Strategy

UX Design Strategy Analysis of Competitors

The following websites were reviewed as part of an assessment of features:

Generally the websites in this space tend to be strong on imagery and imagination, but perhaps somewhat lacking in personality and features. The jewellery website Simone Walsh australian jeweller stands out as having some very interesting and relatable features such as an asynchronous 'chatbot' approach to FAQ.

The Jeweller website delivered in this project is functional and, provides a strong e-commerce solution with good functionality and features, but needs further UX work to implement some of the very visually appealing design approaches that elevate a site and encourage users to spend more time browsing and admiring products.

UX Design Strategy Target Audience

Target audience is people who might not otherwise make it across the physical threshold

Ecommerce Strategy


E-Commerce Business Model

Jeweller is a B2C platform whose goal is to extend the reach of the existing physical business and increase awareness beyond the current customer base.
High-value products are offered for sale, which the customer can browse annonymously without feeling social pressure to complete a purchase.

The retailer is keen to continue to promote physical presence - jewellery tends to be a very personalised purchase, with the customer keen to see and touch the product before committing. Therefore a 'click and collect' option has been added to encourage site visitors to physcially come and make their purchase.

Business Impacts

The benefits for the business owners are:

  1. Extends the shop window
  2. Makes people aware of jewellery products for sale
  3. Allows users to raise enquiries outside 9:30-5:30x 6 days opening hours
  4. Promotes awareness of services provided such as cleaning, repairs, watch batteries, refashioning of personal jewellery into a new creation.
  5. High gain for relatively low cost through use of in-house web design and low-cost promotions/campaign management using MailChimp.
  6. Enourage customer to physically visit to collect click&collect purchases
  7. Use of 'lead times' allows the Jeweller to manage ebb & flow of work
  8. Automated emailed notifications to customers save time rather than needing to call or text
  9. Less time on phone called inquiries
  10. Greatly increased visibility of buying patterns

The challenges for the business owners are:

  1. Additional enquiries must be reponded to, and are perhaps less likely to result in a sale than in-person inquiries
  2. Reduced opportunities for up-/cross-selling compared to a physical visit (this should be improved in future Jeweller versions )
  3. Overhead in maintaining the website and keeping it 'fresh'
  4. Overhead in generating newsletter and blog content
  5. Concern about customer returns* and increased business costs as a result
  6. Concerns about needing to deal with lost or missing deliveries

(*) The business owners pointed out that consumer rights for online purchases are heavily weighted towards the consumer particularly with no fault/ change of mind returns. With physical purchases, change of mind customers are legally entitled to a credit note/exchange, whereas online purchases can result in a refund and a loss to the retailer of packaging/restocking/shipping costs.

Customer Profiles

User 1: It is anticipated that a typcial site user will be from the existing customer base, female aged 30 to 60.
This person will likely be making a purchase for themselves, in which case customised jewellery is of particular interest. They may alternatively be gifting for family or friends, and seeking a present for a specific occasion. They may have spotted an item of interest on fb or Instragram and want to follow up with a purchase, but lead busy lives and may prefer the convenience of online enquiries/ online ordering.

User 2: Female aged between 50 and 90 (or above). This customer may likely use the website as a 'shop window' and physically come into the shop to create or complete their purchase. This customer typically has both time and money, and will react to affinity marketing, likes to feel close to the brand and to feel a personal connection with the shop owners.

User 3: Couples getting engaged or married who need engagement and/or wedding rings.

User 4: Males seeking gifts for close females in their life. These purchasers are likely to be suggestible (so newsletter prompts to purchase certain occasion items can act as a nudge to purchase) as they are unsure of what their partner would like. Often under time pressure due to delayed purchasing decisions, e.g. Christmas-eve shoppers, and willing to pay a premium to ensure the gift is acceptable.

User 5: Persons (male or female) with a strong interest in celtic jewellery, particularly when it is personalised for them (sizing, engraving, one-off-modifications)

Marketing Strategy

The plan for Jeweller going forward is to:

  1. Build on the organic marketing already being done on facebook and Instragram (which generally gathers up to 20 likes and comments per post), extend this by always including a website link in the marketing content. Similarly link from the website to these social media platforms.
  2. Build content in the 'about' section of the website (it is designed to be quite maintainable from the admin console) to build the website's credibility and increase awareness and alignment with potential customers. Fresh, regularly updated website content should increase SEO rankings.
  3. Build text in individual product descriptions using SEO keywords
  4. Encourage customers to create profiles and leave reviews, and dedicate time to moderating, responding to, and curating these reviews. Encourage customers to create a photo for their profile, this personalises the experience and promotes brand affinity & a sense of 'belonging'.
  5. Encourage customer feedback and consider customer questinos and suggestions when introducing or modifying products
  6. Gain subscribers through the mailchimp application and track response rates; tune the product offerings accordingly. Each newsletter should include a call-to-action.

Note that, the business does have an active facebook page at https://www.facebook.com/goldmarkjewellerscarlow.jewellers/, however for the purpose of this project a specially-created facebook page was created at https://www.facebook.com/profile.php?id=61556652324443, and this link is used on the Jeweller version1 website.

SEO Keywords

By looking at competitor websites, and gaining some understanding of the Jeweller's business strategy, certain keywords were chosen. Because of the range of products offered, it is quite a long list. The american spelling jewelery (one l as opposed to two) was included as american tourists often have a strong interest in celtic or heritage jewellery.

Short-tail jewellery, jewelry, jewellers, jewellery Ireland, jewelry Ireland, jewellers carlow, carlow town, tullow street, dolmen, ducketts grove, Ireland Jeweller, Irish jewellery, celtic jewellery, celtic jewelry, engagement ring, engagement ring carlow, wedding ring, wedding rings, carlow wedding rings, silver, gold, yellow gold, white gold, platinum, claddagh ring, celtic knot, celtic jewellery, tie-pin, tiepin, brooch, earrings,
silver pendant, silver rings, diamond, pearl, garnet, cubic zirconia, cubic zircona,
family business, jewellery, jewelry Ireland, craft, bespoke jewellery, watch, watches, watch strap carlow, watch battery, watch batteries, watch repairs, same-day service, same day, lighter, lighters, ring, rings, pendant, pendants, jewellery repairs, fix broken chain, jewellery engraving, ogham, engrave, customised jewellery, remodelled jewellery, handmade jewellery, rhodium plating rings,

Long-tail keywords include:

Sitemap.xml

A sitemap was generated using the Free Online Sitemap Generator www.xml-sitemaps.com, and added to the site, which will help Google to search the site effectively.

Robots.txt

A robots.txt file was created which points to the sitemap allowing google to crawl the site. I blocked the account pages as these are generic and not unique to this site.

UX Design Scope


User Requirements Scope


Shipping constraints:

Currently interested in orders to be shipped within Ireland only. The business is comfortable using registered mail as a shipping method. The business would ideally prefer to implement 'click and collect' and largely use the website as an extension of the physical shop window.

Data Scope

To build this project, product images and details from the jeweller's facebook posts over the last 3 years was harvested, and formed into a Google sheets database, which was used to control initial manual dataload into the DEV environment. Once loaded it was possible to transfer these test products via json export/import into the PROD database. Products are now maintained directly in the PROD database.

Test customers (with real email accounts) and test payment details ONLY have been used during validation and initial user testing.

User Goals/ User Stories


Written in the format 'As a role I want to action to achieve desired outcome

First-time User/ Unregistered User

ID I want to to achieve
FTU_01 quickly understand the site purpose decide whether to spend time exploring and discovering the site
FTU_02 easily navigate the site don't become frustrated and leave
FTU_03 receive feedback at each step on the site understand what I am doing, and, if I'm in a multi-step process, I understand how far along I am in the processs
FTU_04 access this site on a device of my choosing (mobile, tablet, laptop, desktop) access by a method and at a time that is convenient and accessible to me
FTU_05 navigate the site without mandatory login I can discover site features before deciding whether to commit to using site
FTU_06 see a range of products which are offered by the Jeweller, to see pictures, descriptions price (for off-the-shelf items), lead-time for each item make purchase decisions
FTU_07 whether an item is in-stock, made-to-order and what are lead times (e.g. available now, lead time 6 weeks for make-to-order, lead time 1 week for casted items) make purchase decisions
FTU_08 search for a product by name or description does Jeweller sells the item of interest
FTU_09 filter my product view see only what I'm interested in ** (e.g. particular metals, stones, colours, particular occasions) (Preferably filter by multiple categories)
FTU_10 sort my product view by price, date added .... see the items most relevant to me
FTU_11 view custom products get inspiration for my design idea
FTU_12 receive prompt on affinity items see items that are related to the item I'm interested in (e.g. earrings may have matching necklace or bracelet)
FTU_13 receive suggestions or prompts for particular occasions (which could be date-related e.g. communions, confirmations, mothers day, christmas)
FTU_14 share/like a item I like with a 3rd party (e.g. via whatsapp, fb etc) prompt them to buy it (for me!) <- affinity marketing
FTU_15 create a shopping basket of items determine price
FTU_16 amend or remove items in my shopping basket determine price
FTU_17 convert my shopping basket into a collection order purchase items
FTU_18 personalise my order reflect gift messages, special wrapping etc
FTU_19 pay for my order using credit card ensure the purchase is completed
FTU_20 receive an on-screen confirmation of order number ensure the purchase is completed
FTU_21 receive email/text notifying me of my order number and lead time plan when to collect
FTU_22: complete an enquiry form ask a question about products or services
FTU_23: see services offered (repairs, make-to-order items benefit
FTU_24: browse the Jeweller's blog increase my affinity with this retailer
FTU_25: consult the Jeweller's FAQ understand the retailer's processes for orders, shipping etc
FTU_26: signup for newsletter increase my affinity with this retailer
FTU_27: create a profile track my history with this retailer
FTU_28 (Future): make an appointment for engagement rings elevate a high value buying decision

Returning User - Additional Goals

ID I want to to achieve
RU_01 quickly navigate to the Products Page focus on items i'm most intersted in
RU_02 filter products by type, type-of-metal, type-of-stone see the products I am most interested in
RU_03 sort products by date added** so i can see what is new on the site
RU_04 receive prompts of upcoming celebration days and associated promotions
RU_05 be prompted with affinity products, based on on what I've previously purchased make coordinated buying decisions
RU_06 view my order status know if the order has been shipped
RU_07 raise product enquiries on the site save time rather than phonning
RU_08 receive an emailed newsletter periodically alerted to promotions
RU_09 add or update contact details and preferences (email, phone number) on my profile Jeweller can contact me in a way that suits me
RU_10 add an image of my choosing to my profile personalise my experience
RU_11 assign delivery address(es) to my account streamline the ordering process
RU_12 choose a saved delivery address when placing an order streamline the ordering process
RU_13 create Product Reviews and ratings increase interaction with the site and help to guide other purchasers

Site owner/moderator Goals

ID I want to to achieve
SO_01 provide a system that is easy to use encourage users to visit and return to the site
SO_02 provide responsive web pages encourage users to use the site across multiple devices
SO_03 include social links increase user engagement with site
SO_04 use the site as a shop window facilitate unregistered users who will complete purchases in-person
SO_05 permit guest checkout facilitate unregistered users to complete purchases on the site
SO_06 track orders raised ensure they progress through the shipping lifecycle
SO_07 link to an post tracking provide delivery status to customers
SO_08 create and maintain product catgories benefit
SO_09 create and maintain items benefit
SO_10 identify make-to-order/custom products as well as off-the-shelf products advertise both business streams
SO_11 create and maintain item affinities benefit
SO_12 create and maintain time-based marketing promotions benefit
SO_13 link products product categories to marketing promotions
SO_14 provide a robust payment interface maintain trust and integrity and minimse payment queries
SO_XX showcase my Jewellery business professionally align with my business values and processes
SO_XX provide straightforward, intuitive, consistent website navigation, ease of use and encourage re-use
SO_XX provide a website, which meets current programming, performance and accessibility standards (html, css, javascript, responsive, accessibility, performance)
SO_XX provide an opportunity for the user to provide feedback, including reporting issues, or suggesting improvements to the Jeweller site greater engage with users
SO-XX acknowledge to the user that their feedback has been received encourage feedback

UX Design Decisions


Wireframes

Landing Page, search & filter functionality
Product Search
Product detail
Create a basket
Checkout - additional selections
Checkout - address page/action tracker

Fonts Chosen

(To be completed)

Colour Scheme

A plain white page backdrop was implemented. This is to complement the existing design images which tend to be against textured, natural backgrounds, stone and wood etc. Text and buttons shown in a near-black colour with certain notificiations showing teal-coloured button or text.

Design Images

The Jeweller's existing design images which had been uploaded to facebook, were re-used for this Version 1 implementation. The landing page provides a splash of colour, this uses a recent flyer image developed by the Jeweller.

Database

Database design

Database Schema

Profiles App
#### User Model (from AllAuth) | id | Field | |--|--| |first_name|CharField| |last_name|CharField| |username|CharField| |email|EmailField| |phone_number|CharField| |date_joined|DateTimeField| |last_login|DateTimeField| |is_admin|BooleanField| |is_staff|BooleanField| |is_active|BooleanField| |is_superadmin|BooleanField| #### UserProfile Model | id | Field | |--|--| |user|OneToOneField| |phone_number1|Charfield| |profile_image|ImageField| |created_on|DateTimeField| #### UserAddress Model | id | Field | |--|--| |user_profile|OneToOneField| |address_type|Charfield| default 'BILL' |address_id|CharField|default 'HOME' |address_label|CharField| |profile_image|ImageField| |created_on|DateTimeField| |address1|CharField| |address2|CharField| |town_or_city|CharField| |county|CharField| |postcode|CharField| |country|CountryField| |created_on|DateTimeField|

Products App
#### Category Model | id | Field | |--|--| |name|OneToOneField| |friendly_name|Charfield| #### Products Model | id | Field | |--|--| |category | ForeignKey('Category')| | sku | CharField | | name | CharField | | hide_display | BooleanField | | can_be_engraved | BooleanField | | max_char_engrave | IntegerField | | price | DecimalField | | source | CharField| choices=ITEM_SOURCE_CHOICES, default='STOCK') | item_lead_time | IntegerField | | promotion | CharField | | image | ImageField | | image_url | URLField | | description | TextField | | rating | DecimalField | | created_on | DateTimeField | #### StockType Model | id | Field | |--|--| | source | CharField | | default_lead_time | IntegerField | | name | CharField | #### Review Model | id | Field | |--|--| | user_profile | ForeignKey(UserProfile) | | product | ForeignKey(Product) | | title | CharField | | body | CharField | | review_rating | DecimalField | | approved | BooleanField | | created_on | DateTimeField |

Checkout App
#### Order Model | id | Field | |--|--| | order_number | CharField | | user_profile | ForeignKey(UserProfile) | | full_name | CharField | | email | EmailField | | phone_number | CharField | | street_address1 | CharField | | street_address2 | CharField | | town_or_city | CharField | | county | CharField | | country | CountryField | | postcode |CharField | | date |DateTimeField | | planned_ship_date | DateField | | delivery_method | CharField | default='REGPOST' | delivery_track | CharField | | order_status | CharField | default='ORDERED' | delivery_cost | DecimalField | | order_total |DecimalField | | grand_total | DecimalField | | original_basket | TextField | | stripe_pid | CharField | #### OrderLine Model | id | Field | |--|--| | order | ForeignKey(Order) | | line_number| IntegerField | | product | ForeignKey(Product) | | sku | CharField | | quantity |IntegerField | | price | DecimalField | | category | CharField | | product_size | CharField | | can_be_engraved |BooleanField | | engrave_text |CharField | | lineitem_total |Decimal | | line_ship_date = DateField | #### OrderLine Model | id | Field | |--|--| | order | ForeignKey(Order) | | address_type | CharField | | address_id | CharField | | address_label |CharField | | address1 | CharField | | address2 | CharField | | town_or_city | CharField | | county | CharField | | postcode | CharField | | country | CountryField | | created_on | DateTimeField |

Home App
#### AboutSection Model | id | Field | |--|--| | section | CharField | | disp_seq | IntegerField | | hide_display | BooleanField | | section_title | CharField | #### AboutText Model | id | Field | |--|--| | section | ForeignKey(AboutSection) | | disp_seq | IntegerField | | hide_display | BooleanField | | text_title | CharField | | text_body | TextField |

Database Technical

The DEV environment was built using a sqlite backend, this was migrated to a PostGRES SQL database on the ElephantSQL platform for the PROD environment. (This is a medium-term solution as ElephantSQL have made an end-of-life announcement for Jan 2025). Static data for the site (css and site images) is stored on AWS S3 buckets, which provides a robust interface with strong security features.

Agile


An Agile approach was followed in plannning this project.

Github Issues and Projects were used to track project work as follows:

Project

A github project was created within the Jeweller repo. At a high level the project details are very simple really just a name and description.

At the outset, an issue template was setup for user stories, with 5 sections - EPIC, requirement, pre-requisites, acceptance criteria, tasks. This template made it easier to structure issues when created. I also setup a template for bug reporting, but found it too cumbersome for practical use.

Project Issues

Issues were created to track planned end-to-end work in Financial_Planner, using the issue template for consistent appearance and

Example issue - based on user stories: https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/49

Example issue - based on deployment tasks (not directly linked to a user story): https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/9

EPICs

This project had 10 EPICs, it is easiest to get a picture of these from the Kanban board below.
For cross-reference EPIC is also listed at the top of each issue, so it is possible to click from a child issue to its parent EPIC and vice verssa.

Kanban board showing all EPICs in project: https://github.com/users/DeeMcCart/projects/5/views/7

MoSCoW prioritisation

For prioritising user stories and known tasks, I assigned a label to each issue, one of:

Estimated & Actual Story Points

Story points were assigned per issue, and then actual hours tracked in a separate label.

Milestones

Three project milestones were used:

Sprints and Iterations

In Agile methodology, effort is timeboxed into Srints, with a kickoff at the start of each Sprint time period, in which items from the product backlog are made ready for work (groomed) by ensuring all the details are completed on the user-story/issue card (task details, acceptance criteria, priority, dependencies, Story Point estimate ) before a developer starts working on it. At the end of a sprint a retrospective should be undertaken to determine what worked well or not during that sprint. For Jeweller a time-period of weekly sprints was chosen. Loosely (given that the developer consisted of a one-person team), the sprint ran from Monday-Sunday inclusive, and the aim was to complete certain agreed user stories during a particular sprint.

At the end of each sprint a formal process was followed:

I added the last task, readme updates, based on learning from my previous Code Institute PP4 project, where I'd invested so much effort and detail into the Agile record keeping that I faced an impossible task to duplicate the content into READme at project completion. So the intention is to keep it Agile with small, incremental updates to the Readme, as well as the code!

Burndown charts were maintained over the 5 project sprints. These can be seen on the:

Sprint1 Retrospective: Issue # https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/12

Sprint2 Retrospective: Issue # https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/38

Sprint3 Retrospective: Issue # https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/54

Sprint4 Retrospective: Issue # https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/65

Sprint5 Retrospective: Issue # https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/70

The insights/ burndown charts were useful to track the actual time logged, a useful metric

Issue Lifeycle

An issue is set to progress through a number of stages, each represented by a status during its lifecycle.
Issues progressed from backlog through to done, as per Kanban board. Kanban board showing issue lifecycle: https://github.com/users/DeeMcCart/projects/5/views/2

Commit Messages

The conventionalcommits.org approach was adopted for my PP5 commit messsages, as per marking feedback from previous projects. Where possible the Kanban issue # is referenced, this links the commit message to the issue on the Kanban board.

Kanban board

Within a sprint, the kanban board provides invaluable visual tracking.
In the Jeweller kanban board, issues progress from leftmost column (backlog) to rightmost (done)

Two main Kanban views were used, one for EPICs only, and one for Issues. This was useful for keeping an overview (EPICs) and detailed tracking of the complex work in developing this website.

Viewing by EPIC was useful for an overall view of the project: https://github.com/users/DeeMcCart/projects/5/views/7

Each EPIC contains a drill down into its 'child tasks', e.g. https://github.com/DeeMcCart/CI_PP5_Jeweller/issues/16

Agile Observations and learnings

Features

Features in Scope

The site includes over 20 features, these are listed in a separate READme document (use ctrl-click to open in a separate tab):

Site features, open in separate tab using Ctrl-click

It was helpful to create this as a separate document, as it is also offered to users as a 'how to' guide.

Features vs user stories

Requirements Traceability Matrix - First-time Users Requirements Traceability Matrix - Returning Users and System/Shop Owner

Implementation Decisions



Some of the site ideas and features needed only really became clear as I played with the site as it was delivered, and experienced frustration or spotted opportunites or elements that were worth adding. So the site grew organically as time went on.

The Agile approach with weekly sprints suits incremental development, as it encouraged weekly analysis of what had been done, and how it might progress.
There were a number of 'false starts' when I tried to implement functionality and then found that it just didnt work in practice.

Examples were:

Features Left to Implement

As this relates to a real-life site there are a number of features that the Jeweller shop owners have discussed as being part of their current business processes, which would be good to reflect in the next software version. A mapping of user stories vs features is given in this google sheet: https://docs.google.com/spreadsheets/d/14lpwEkuFtDyyV5SUqFzs6Nml3einTpHCULN3nOynp5Q/edit?usp=sharing

Technologies

Langugages

Frameworks & Tools

Python Libraries/ Other external tools

The following additional python libraries were used:

Third-Party Libraries

Validation

HTML Validation

W3C Validator - index page

W3C validator - products page

W3C validator - product details page

W3C validator - basket page

W3C validator - checkout page

CSS Validation

No errors returned when passing through the official Jigsaw validator.

Performance

Performance for all pages was tested using the Lighthouse tool within Google Chrome. These results are not yet satisfactory and will require more work.

Performance - Lighthouse - index

Performance - products page

Performance - product detail page

Python Linting

There are 5 apps plus a project so approx 30 python files involved. The approach taken to identifying and resolving python linting errors was to work through module-by-module using a command such as 'python3 -m flake8 APPNAME --exclude=APPNAME/migrations/'. That way it was possible to systematically work through each of the app files and tick off each of the identified errors. Of course, following the linting process means introducing more errors so it is a somewhat cyclical process! Code not written directly by me (e.g. migrations within each app) was not included in the linting validation, as I was cautious about making inadvertent changes.

Linting output - home app:
Python flake8-profiles-app

Linting output - profiles app:
Python flake8-profiles-app

Linting output - products app:
Python flake8-profiles-app

Linting output - basket app:
Python flake8-profiles-app

Linting output - jeweller app:
Python flake8-jeweller-app

Linting output - checkout app - several errors remain here,I experimeted with resolving but was cautious about chaging certain code that was needed for Stripe/checkout functionality:
Python flake8-profiles-app

Device Testing

The website was tested on the following devices:

Multi-browser Testing

The website was tested on the following browsers:

Testing User Stories

Features were tested under the following personas: User Type Description
FTU First-time user/ Guest user (not registered)
RTU Returning user/ Registered user (has a profile)
SO Sysadmin user, has additional privileges
F01 Account Registration & Navigation Tests
| Role | Test |Result | |--|--|--| | FTU | can create an account | Pass | | FTU | is notified that a confirmation email has been sent (Toast messsage) | Pass | | FTU | receives email notification of new account | Pass | | FTU | cannot log into new account until confirmed | Pass | | FTU | can verify the new account using email link | Pass | | RU | can log into account once account hs been verified | Pass | | RU | is notified on logging into account (Toast message) | Pass | | RU | can log out of account |Pass | | RU | is notified on logging out of account (Toast message) |Pass | | RU | can take the 'forgotten password' link on signnin page | Pass | | RU | is notified that a reset link has been set (Toast message) | Pass | | RU | receives a password reset email | Pass | | RU | can follow the link and reset account password | Pass | | RU | can log in with the new password | Pass | | RU | can modify profile pic and it displays at top of screen | Pass | | RU | (with order history) can see orders previously created for their user profile | Pass | | RU | (with order history) Order history show order number, date raised, status, product details and order total | Pass | | RU | Clicking on an order brings the user to an order history screen where more details including delivery method and ship/collection date can be seen | Pass | | RU | Clicking on 'back to profile' button returns to the user profile page| Pass | | All | User can access the About page and form|Pass| | All| All links on footer open to correct pages|Pass| | All | All links on Heading Navigation open to correct option|Pass|

Product & Navigation Tests | Role | Test |Result | |--|--|--| | ALL | can navigate to products | Pass | | ALL | can select 'ALL PRODUCTS' dropdown and see drop-down menu | Pass | | ALL | can select 'ALL PRODUCTS' - All Producs see a list of 30+ products (with count to top lhs of screen) | Pass | | FTU | sees a product card with picture, title, price, category, rating (if rated) | Pass | | RU | sees a product card as above but with 'Review' link | Pass | | RU | can leave a review for a product | Pass | | SO | sees a product card as above but with 'Review' 'Edit' and 'Delete' links | Pass | | ALL | can select 'BY TYPE' dropdown, choose one of the dropdown options, and see just products in that category | Pass | | ALL | can select 'ABOUT' dropdown, choose one of the dropdown options, and screen will load | Pass |

Basket Tests
| Test | Role | Result | Role | Result | Role | Result | |--|--|--|--|--|--|--| |User can navigate to product| FTU | Pass | RU | Pass | SO | Pass | |User can restrict view by product type e.g. earrings | FTU | Pass | RU | Pass | SO | Pass | |User can access product details| FTU | Pass| RU | Pass | SO | Pass | |User can add a 'earrings' product to cart| FTU | Pass| RU | Pass | SO | Pass | |User can navigate back to products| FTU | Pass| RU | Pass | SO | Pass | |User can add a ring to cart, and can choose ring size,e.g. M before adding |FTU | Pass | RU | Pass | SO | Pass | |User can view basket and can modify the quantity of the 'earrings' item |FTU | Pass | RU | Pass | SO | Pass | |User can continue shopping and can add the same ring in a different size e.g. J to basket |FTU | Pass | RU | Pass | SO | Pass | |User can view basket and modify the quantity of one of the ring sizes |FTU | Pass | RU | Pass | SO | Pass | |User can return to shopping, and select 'st brigids cross' (engraveable item) and choose some engravable text then add to basket |FTU | Pass | RU | Pass | SO | Pass | |User can select product 'gift wrap' and add to basket |FTU | Pass | RU | Pass | SO | Pass | |User can select product 'gift tag' and add some personalisation text before adding to basket |FTU | Pass | RU | Pass | SO | Pass | |Basket accurately shows products, sizes and choices made |FTU | Pass | RU | Pass | SO | Pass |

Checkout Tests
| Test | Role | Result | Role | Result | Role | Result | |--|--|--|--|--|--|--| |User can navigate to checkout| FTU | Pass | RU | Pass | SO | Pass | |User can choose delivery method 'COLLECT' or 'REGPOST'| FTU | Pass | RU | Pass | SO | Pass | |User can create order using test credit card details | FTU | Pass | RU | Pass | SO | Pass | |payment comes through to stripe| FTU | Pass| RU | Pass | SO | Pass | |User receives on-screen confirmation| FTU | Pass| RU | Pass | SO | Pass | |User receives confirmation email | FTU | Pass| RU | Pass | SO | Pass |

Admin Tests - Product Admin
| Role | Test |Result | |--|--|--| | SO | can access sysadmin dropdown | Pass | | SO | can access product maintenance page from sysadmin dropdown|Pass| | SO | can access order maintenance grid from sysadmin dropdown |Pass| | SO | can add and edit products from Product maintenance grid |Pass| | SO | can delete products from Product maintenance grid ONLY if they are not on an order |Pass| | SO | can hide products from display using the edit product hide_display attribute |Pass| | SO | can make a (non-ring) product engraveable, causing the 'engrave-text' entry field to activate on product detail -> basket add |Pass|

Admin Tests - Order Admin
| Role | Test |Result | |--|--|--| | SO | can access order maintenance page from sysadmin dropdown|Pass| | SO | can view orders on Order grid |Pass| | SO | can use 'show address' and 'show details' buttons to toggle display of address/ product details |Pass| | SO | can use the update button to LHS of panel to update order status through ORDER-PACK-SHIP-RECEIVE-CLOSE where delivery moe = REGPOST |Pass| | SO | Can add tracker # | Fail| | SO | can use the update button to LHS of panel to update order status through ORDER-PACK-RECEIVE-CLOSE where delivery moe = COLLECT | Pass | causing the | | SO | confirm that user update emails with appropriate content are generated at each stage of the process |Pass|

Bugs and issues

Almost 130 issues were recorded, I used an excel spreadhseet to keep track. At the time of submission approx 30 issues remain open, some of these are configuration or data-gathering related and some relate to incomplete functionality.

The structure of the log is shown here:

Excerpt from issue log

There are a number of smaller responsiveness issues still open at the time of writing (icon alignment on mobile phone)

Deployment - ECOMMERCE APPLICATION

Deployment Approach:

CI_PP5_Jeweller code is stored in a github repository. Github Integrated Development Environment was used to build & test the DEVELOPMENT environment. Sqlite was used as the development database with a local install on my PC. Python Django and libraries were installed into a DEV github workspace and configuration variables stored in a local/hidden .env file The DEV environment was connected to Stripe DEV environment which accepted transactions using dummy credit card details.

This allows local environment & installation setup in a github workspace (captured in a .env file and installed programs within the workspace).

For deployment (providing a stable public-facing website with supporting database) the architecture was transferred to: Heroku website hosting (with configuration variables set in alignment with .env file in DEV environment) With linked ElephantSQL database to hold app records. And Amazon S3 storage to hold static (e.g. CSS) files and media images The PROD environment was connected to Stripe TEST using a new endpoint (verified channel) And depended on a linked gmail account for python send_mail processing.

Certain email, error pages) could not be fully tested in the DEV environment, therefore it made sense to deploy early (sprint 1 of 5) for some parallel testing.

Keeping DEV & PROD environments in sync after initial deploy

The project's settings.py file was set, after initial deployment, to be environment-sensitive, so it would use either the DEV .env file or Heroku config file to pickup environment-specific variables. A github workspace keeps track of installed python libraries, and, using 'freeze', these installations and versions are were copied to the requirements.txt file. When deploying & building the app, Heroku seeks to implement the libraries and versions specified within requirements.TXT to ensure PROD install matches DEV.

Database model changes were made after initial deploy. These changes were made and tested (using 'buildmigrations' and 'migrate' commands) in DEV (which involves building and applying migration changes to the database). Periodically, to keep DEV and PROD database structures in sync, the DEV github environment was re-connected to the Production database. Django 'showmigrations' command was then used to identify any migrations not yet applied to the PROD database, these were applied to PROD using the normal 'Migrate' command. This meant that ongoing code changes could be tested in both environments during Sprint3, 4 & 5.

Keeping DEV & PROD data in sync after initial deploy

For the jeweller project there were multiple staged deployments over the project duration:

Additional installs needed to DEV environment for deployment:

This is the DEV environment and can be used for local host testing on port 8000. The locally hosted site can be made public for demonstration to other people, but will only be active while the runserver command is active in the development environment. The .env file can be used to hold private configuration variables (e.g. Stripe handshaking variables)

( CHECK IF THE BELOW STEPS ARE STILL RELEVANT - USED ON PREVIOUS PROJECT ):

Attach the database:

In dev environment root dir add env.py import os os.environ['DATABASE_URL']=['pasted URL from elephant'] os.environ['SECRET_KEY']='some key"

Add secret key to Heroku config vars

Prepare environment and settings.py file

settings.py:
if os.path.isfile("env.py"): import env SECRET_KEY = os.eviron.get(SECRET_KEY) DATABASES = {'default':dj-database-url,parse(os.environ.get("DATABASE_URL"))} Save all files and migrate ( END CHECK )

Connect to & Build ElephantSQL Database:

Load Data into PROD ElephantSQL Database:

Create the Heroku app:

Prepare to Deploy

Build & Test (without static)

Configure AWS for Static files

SET AWS IAM (Identity and Access Management)

TRANSFER STATIC FILES FROM DEV TO PROD

AMAZON S3 - Load media images

Create a procfile (process file) commit From Heroku panel, deploy from main & test.

TEST

Note that the development and production sites may have small operating differences, for example when testing I ran into difficulty with static paths which worked in DEV but needed tweaking to pick up in PROD. Similarly I had some commented-out python code in one of my DEV templates which ran without difficulty, but the PROD environment failed on trying to process the commented-out code. At a later point I encountered some database validation (field length) which caused a crash when running against the PROD database, although worked fine in DEV.

Intermittently turning DEBUG on in the Production environment during initial testing helped with getting to the bottom of these errors.

Link PROD website to Stripe TEST/Developer environment

When you first connect, Stripe will only be aware of the DEV site endpoint. This is used when the Stripe webhook needs to create an order in the database. So it makes sense to create an endpoint for the PROD database. This can still connect to the Stripe test/developer environment, and can still be used with test credit card numbers until ready to bring Stripe live. There are some Heroku config settings needed for Stripe to interconnect with the PROD website.

Configure Email processing

To re-deploy

To fork the repository:

To clone the repository:

You can clone a repository from GitHub.com to your local computer to make it easier to fix merge conflicts, add or remove files, and push larger commits.

Credits

Multiple sources were used in assembling this site.

Content - Jeweller

Product images and descriptions

Goldmark facebook page

References

Agile implementation in github

Code - Jeweller

DeeMac YouTube series - Setting up a Django receipe website Book - Multiple Code Institute PP5 projects used for reference

Acknowledgements