Deployed website: Link to website
Card number for payment testing: 4242424242424242
This is my e-commerce platform built using Django where customers can purchase custom or pre-designed tattoos and consultations. It integrates Stripe for secure payments, provides user authentication, and enables booking consultation appointments through a calendar system. Users can view previous orders, save favorite tattoo designs, and manage their bookings and store owners have the control over product and consultation management.
The website is designed with simplicity and style, aligning with the aesthetics of the tattoo culture. It ensures ease of navigation while being visually appealing. Key features include:
- Ease of Navigation: Simple and intuitive navigation across categories.
- Contrast Visuals: High-quality images to attract customers and reflect the artistic essence of tattoos.
- User-Focused: Features such as a wishlist, a newsletter, and a few social media accounts for marketing.
- Primary Audience: Tattoo enthusiasts and individuals seeking tattoo-related products.
- Demographics: Women aged 18-45 with a passion for tattoo sticker art and culture.
- Goals: To make tattoo products accessible and provide a seamless shopping experience.
1. Authentication and User Profiles
- As a user, I want to create an account so that I can save my favorite tattoos and view my order history.
- As a user, I want to log in using my email or social media account so that I can easily access my saved items.
- As a user, I want to update my profile details (name, email, password) so that my account information is accurate.
- As an admin, I want to view a list of registered users so that I can manage accounts and view their activities.
2. Shopping & Filtering
- As a customer, I want to filter tattoos by size and style so that I can quickly find designs that match my preferences.
- As a customer, I want to sort tattoos by price or rating so that I can find options within my budget or the highest-rated designs.
- As a user, I want to view a gallery of custom designs so that I can get inspired for my own tattoo.
- As a user, I want to view detailed product information, including pricing and design descriptions so that I can make an informed purchase.
3. Payment and Booking
- As a customer, I want to add products to my cart so that I can purchase multiple items at once.
- As a customer, I want to securely pay for my tattoo consultation via Stripe so that I can complete my booking without any worries.
- As a user, I want to book a tattoo appointment based on available slots so that I can reserve a convenient time with an artist.
- As a user, I want to receive a confirmation email with my appointment details after payment so that I know my booking is confirmed.
4. Consultation Booking
- As a customer, I want to browse consultation packages for small, medium, and large tattoos so that I can choose the service that fits my needs.
- As a customer, I want to see available dates and times for consultations so that I can select a slot that works for me.
- As a customer, I want to cancel or reschedule my consultation if my plans change, with an easy-to-use interface.
- As a user, I want to view my past consultations, including dates, artist details, and feedback, so that I can keep track of my sessions.
5. Wishlist and Likes
- As a user, I want to save my favorite tattoos to a wishlist so that I can easily return to them later.
- As a user, I want to "like" products in the store so that I can quickly access them from my profile.
- As a user, I want to view all the products I've liked on a dedicated page so that I can easily browse my favorites.
6. Order History and Tracking
- As a user, I want to view my order history so that I can track my previous purchases and consultations.
- As a user, I want to reorder previously purchased items with a simple click so that I can easily get a design I liked again.
- As a user, I want to track the status of my current orders (booked) so that I know when to expect my tattoo consultation.
7. Admin Management
- As an admin, I want to manage products and consultations in the system so that I can keep the catalog up to date.
- As an admin, I want to track customer purchases and consultations so that I can offer tailored services and recommendations.
- As an admin, I want to manage user accounts (approve, deactivate) so that I maintain the security of the platform.
8. SEO & Marketing
- As a user, I want to share tattoo designs and consultations on social media platforms like Instagram so that I can show my choices to friends.
- As a marketer, I want to optimize the website's SEO using meta tags, sitemaps, and descriptions to ensure it ranks higher on search engines.
- As a user, I want to subscribe to a newsletter so that I can receive updates about new tattoo designs and promotions.
9. Accessibility
- As a visually impaired user, I want the website to be compatible with screen readers so that I can navigate it easily.
- As a user, I want to have sufficient contrast in visuals so that the website is easy to read under various lighting conditions.
- As a user, I want the forms to have clear labels and instructions so that I can easily fill them out without confusion.
10. 404 Error and Custom Pages
- As a user, I want to be shown a custom 404 error page if I navigate to a non-existing page so that my experience isn't disrupted with an unfriendly error.
- As an admin, I want to update the content on the 404 error page to reflect the website's branding, offering users helpful links to explore other parts of the site.
11. Security
- As a user, I want my payment details to be securely processed via Stripe so that I can be assured my financial information is protected.
- As a user, I want to reset my password if I forget it, using a secure password recovery process.
- As an admin, I want to ensure all user data (personal information, payment details) is encrypted and securely stored to maintain privacy.
The platform operates as a B2C (Business-to-Consumer) e-commerce website, focusing on direct sales to customers. Revenue streams include:
- Product Sales: Offering tattoo premade designs, custom designs, and potential graphic designs for branded merchandise/ content.
- Optional Customer Service: Providing users with newsletters that offer exclusive discounts on products, consultations, and personalised design services.
Individuals passionate about tattoos and artistic expression, seeking:
- Creative Designs: Unique, professional, and customisable tattoo designs to reflect their personal style.
- Branded Content: High-quality graphic designs for merchandise or content that aligns with their vision.
- Great Customer Relations: A seamless, supportive, and responsive service experience.
Key Values: Creativity, customisation, professionalism, and exceptional customer service.
The admin manages platform operations, including:
- Handling customer queries with a focus on relationship building and satisfaction.
- Overseeing the delivery of graphic design services, ensuring quality and timeliness.
- Managing newsletters, promotional offers, and exclusive content for users.
Competitors: Platforms such as Pinterest and AI-generated design services.
Strategic Focus:
- Standing out through exceptional communication and outstanding customer relations.
- Offering affordable yet premium-quality graphic design services tailored to individual needs.
- A
robots.txt
file will be added to the project to guide web crawlers. - A
sitemap.xml
file will be created to help with indexing. https://www.xml-sitemaps.com/details-girls-get-tattoos-6ad59281377a.herokuapp.com-da3b5e825.html - Descriptive meta tags are included on all key pages.
Newsletters were implemented in the email_notification app. The manager can create a newsletter and send it to all customers. It also handles sending newsletters about new loyalty programs with promo codes.
- Newsletter Functionality
The newsletter feature allows the manager to create and send updates to all subscribed customers effortlessly. Using Mailchimp, emails are sent with professionally designed templates to ensure compatibility across email clients
Customers can easily subscribe to the newsletter using the form located in the footer of the website.
Here’s how it looks:
Proof of customer subscription is visible in the MailChimp dashboard, where the audience list is managed effectively:
The admin has full control over when newsletters are sent to users. A dedicated email creation template is provided to craft engaging and professional newsletters.
GGT Facebook Page | Facebook is essential for the store to be able to reach customers. According to the statistics, the store has a good reach among people who prefer to use Facebook. Facebook has excellent coverage worldwide among people who can purchase products online. "GGT" Facebook page is for marketing purposes to post adverts and exciting content and engage users.
GGT Instagram Page | Instagram attracts people of younger ages and is essential for the store to reach this demographic. According to a 2023 report by DataReportal, approximately 70% of Instagram’s global advertising audience is under 34 years old See Report. "GGT" Instagram page is for marketing purposes to post adverts, interesting content, and engage users.
A chat support feature is planned to provide customers with the highest standard of service.
As the application already uses ASGI instead of WSGI, implementing chat support in the future will be more straightforward with Django Channels and Redis channel layers.
Facebook and Twitter were not considered for future development at this stage due to their additional business requirements. Google, being the most popular third-party registration service and relatively easy to implement, was prioritised. However, it is not accessible in all countries and regions, such as China.
The integration of PayPal as a payment option is planned for the future, as it is a preferred choice for many customers. Additionally, Alipay and WeChat Pay functionality are being considered for inclusion alongside the existing Stripe payment system, as these options are widely used in Asian countries, including China and Thailand.
Further research and analysis are required for the order cancellation feature, which is why it has not been implemented at this stage.
Elastic Search is recognised as an essential feature for future development, as it has the potential to significantly enhance search speed and improve the quality of search results.
The decision to defer certain features was made thoughtfully. As a developer, it is necessary to evaluate the importance of each feature, estimate the time required for their development, and plan their implementation accordingly.
Understanding the exact operational procedures of a real business is crucial. For instance, insights into product prioritisation will play a vital role in setting up recommendation functionality. Therefore, some features have been intentionally left as opportunities for future learning and development.
- Python 3.11.9: The primary language used to develop the server-side of the website.
Official Python Website - JavaScript (JS): The primary language used to develop interactive components of the website.
MDN JavaScript Docs - HTML: The markup language used to create the website.
MDN HTML Docs - CSS: The styling language used to style the website.
MDN CSS Docs
- Django: Python framework used to create all the logic.
Official Django Website - jQuery: Used to control click events and send AJAX requests.
Official jQuery Website - jQuery UI: Used to create interactive elements.
jQuery UI Website
- SQLite: Used as a development database.
Official SQLite Website - PostgreSQL: The database used to store all the data.
Official PostgreSQL Website
- Git: The version control system used to manage the code.
Official Git Website - Pip3: The package manager used to install dependencies.
Pip3 Documentation - Gunicorn: The web server used to run the website.
Official Gunicorn Website - Psycopg2: The database driver used to connect to the PostgreSQL database.
Official Psycopg2 Website - Django-allauth: The authentication library used to create user accounts.
Django-allauth Docs - Django-crispy-forms: Used to control the rendering behavior of Django forms.
Django-crispy-forms Docs - GitHub: Used to host the website's source code.
Official GitHub Website - Chrome DevTools: Used to debug the website.
Chrome DevTools Docs - Font Awesome: Used to create the icons used on the website.
Official Font Awesome Website - Coolors: Used to create a color palette for the website.
Official Coolors Website - W3C Validator: Used to validate HTML5 code for the website.
W3C HTML Validator - W3C CSS Validator: Used to validate CSS code for the website.
W3C CSS Validator - JShint: Used to validate JS code for the website.
Official JShint Website - PEP8: Used to validate Python code for the website.
PEP8 Docs - GeoNames: Used to get country and city names.
Official GeoNames Website - Stripe: Used to create the payment system.
Official Stripe Website - Birme.net: Used to crop and center Unsplash images.
Official Birme.net Website - Sitemap Generator: Used to create the
sitemap.xml
file.
XML Sitemap Generator - Privacy Policy Generator: Used to create the privacy policy.
Privacy Policy Generator - Django-extensions: Used to create an Entity-Relationship Diagram.
Django-extensions Docs
Please refer to the FEATURES.md file for all test-related documentation.
- Authentication: User registration and login via email or social media.
- User Profiles: Save favorite tattoo designs, view order history, and bookings.
- Stripe Payment Integration: Secure payments for tattoos and consultations.
- Consultation Booking: Users can select dates from a calendar and manage appointments.
- Admin Interface: Manage orders, consultations, and calendar events.
- SEO & Marketing: SEO implementation, including robots.txt, sitemap, and meta tags.
The website embraces a minimalistic, black-and-white theme to echo the artistic nature of tattoos and ensure the designs remain the primary focus. By stripping away all distractions, this monochrome palette provides a clean, timeless aesthetic that enhances the browsing experience for both customers and tattoo enthusiasts.
The site exclusively uses black and white as the foundational colours:
- Background: White (
#FFFFFF
) to create a clean and spacious environment. - Text and Elements: Black (
#000000
) for strong contrast and optimal readability. - Interactive Elements (e.g., buttons, hover states): Subtle gradients or bold black borders to differentiate interactions without straying from the monochrome theme.
This stark contrast ensures that every tattoo design and visual element stands out while maintaining an understated, professional look.
The website uses the font Montserrat, chosen for its modern and versatile aesthetic, which aligns with the bold and creative energy of tattoo art. Montserrat ensures legibility and elegance across all devices and screen sizes.
- Headings: Font-weight set to 900, emphasising key information such as "New Designs Are Here." This bold choice commands attention and reflects the strength and permanence of tattoos.
- Body Text: Font-weight set to 400, providing a clean, smooth reading experience without overwhelming the viewer.
- Buttons and Calls to Action: Font-weight set to 700, striking a balance between emphasis and consistency, encouraging user engagement.
- All imagery was sticking to my professional development in grapic design, all drawn by myself.
The result is a bold and refined aesthetic that ensures a seamless and impactful user experience, perfectly complementing the artistic nature of tattoo designs.
I have designed multiple wireframes to visually represent the layout and functionality of the application. These wireframes were created using Canva , a versatile and user-friendly design tool.
You can view the wireframes through the following link:
These wireframes provide a detailed overview of the interface design, ensuring that the structure and user experience align with the project’s goals. They serve as a foundational step in the development process, helping to guide further discussions and decisions.
GitHub Project Management was used to manage the project. Without GitHub Project Management, it would have been difficult to effectively oversee the development of the application. It provided the tools necessary to:
- Prioritise tasks
- Track progress
- Ensure a structured workflow
This methodology ensured the project stayed on track and that all aspects of development were properly managed.
To understand some concepts, I created a couple flowchart diagrams.
- The purchasing flow chart will show what steps are required to successfully complete a purchase.
- The consultation flow chart wil show what a user needs to do in order to book a consultation.
This document outlines the core data models used in the application. Each model is designed to handle specific functionality and relationships, ensuring a scalable and efficient database structure.
The Order
model handles user orders, including bookings and pricing. It ensures accurate calculation of order totals and includes a unique order number.
Name | Database Key | Field Type | Validation |
---|---|---|---|
Order Number | order_number | CharField | max_length=32, editable=False |
User Profile | user_profile | ForeignKey | UserProfile, on_delete=models.SET_NULL, null=True, blank=True, related_name='orders' |
Full Name | full_name | CharField | max_length=50, null=False, blank=False |
EmailField | max_length=254, null=False, blank=False |
||
Phone Number | phone_number | CharField | max_length=20, null=False, blank=False |
Country | country | CharField | max_length=40, null=False, blank=False |
Postcode | postcode | CharField | max_length=20, null=True, blank=True |
Town/City | town_or_city | CharField | max_length=40, null=False, blank=False |
Street Address 1 | street_address1 | CharField | max_length=80, null=False, blank=False |
Street Address 2 | street_address2 | CharField | max_length=80, null=True, blank=True |
County | county | CharField | max_length=80, null=True, blank=True |
Date | date | DateTimeField | auto_now_add=True |
Order Total | order_total | DecimalField | max_digits=10, decimal_places=2, default=0 |
Grand Total | grand_total | DecimalField | max_digits=10, decimal_places=2, default=0 |
Tracks individual items in an order, including product details and line item totals.
Name | Database Key | Field Type | Validation |
---|---|---|---|
Order | order | ForeignKey | Order, on_delete=models.CASCADE, related_name='lineitems' |
Product | product | ForeignKey | Product, on_delete=models.CASCADE |
Quantity | quantity | IntegerField | default=0 |
Line Item Total | lineitem_total | DecimalField | max_digits=6, decimal_places=2, editable=False |
Stores messages submitted by users through the contact form.
Name | Database Key | Field Type | Validation |
---|---|---|---|
Name | name | CharField | max_length=100, null=False, blank=False |
EmailField | null=False, blank=False |
||
Message | message | TextField | null=False, blank=False |
Read | read | BooleanField | default=False |
Organizes products into categories for easier browsing and filtering.
Name | Database Key | Field Type | Validation |
---|---|---|---|
Name | name | CharField | max_length=254, null=False, blank=False |
Friendly Name | friendly_name | CharField | max_length=254, null=True, blank=True |
Stores product information available for purchase.
Name | Database Key | Field Type | Validation |
---|---|---|---|
Category | category | ForeignKey | Category, on_delete=models.SET_NULL, null=True, blank=True |
SKU | sku | CharField | max_length=254, null=True, blank=True |
Name | name | CharField | max_length=254, null=False, blank=False |
Description | description | TextField | null=False, blank=False |
Price | price | DecimalField | max_digits=6, decimal_places=2 |
Rating | rating | DecimalField | max_digits=6, decimal_places=2, null=True, blank=True |
Image URL | image_url | URLField | max_length=1024, null=True, blank=True |
Image | image | ImageField | null=True, blank=True |
Allows users to like/unlike products. Liked products are shown on a dedicated page.
Like
model links a user to a liked product.- AJAX requests (secured with CSRF) toggle likes.
- Liked items are dynamically updated on the frontend.
- A list of liked items is shown via
liked_items_view
.
class Like(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
liked_on = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.user} likes {self.product.name}"
Views
like_view: Toggles like/unlike via AJAX. liked_items_view: Displays liked products for the user. Template: liked_items.html
Loops through liked items and links to product detail pages.
$(document).on('click', '.likeButton', function() {
const button = $(this);
const productId = button.data('post-id');
const url = button.data('url');
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
$.ajax({
url: url,
type: 'POST',
headers: {
'X-CSRFToken': csrfToken
},
data: {
'product_id': productId
},
success: function(response) {
alert('Product liked successfully!');
button.find('i').toggleClass('far fas');
},
error: function(response) {
alert('Failed to like the product.');
}
});
});
Allows users to contact the business. Messages are saved and marked read/unread by admins.
Model
class ContactMessage(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
message = models.TextField()
read = models.BooleanField(default=False)
Views:
contact_view Templates:
contact.html
Users can express interest in tattoo consultations.
How It Works
ConsultationInterest model stores topic, time, message, and user. express_interest view saves data. Admins view submissions via consultation_admin_view at /admin-submissions. Templates:
consultation_interest.html consultation_admin.html Product CRUD Feature Admins can add, edit, or delete products. All users can view listings.
class Product(models.Model):
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)
rating = models.DecimalField(max_digits=6, decimal_places=2, null=True, blank=True)
image_url = models.URLField(max_length=1024, null=True, blank=True)
image = models.ImageField(null=True, blank=True)
Views:
add_product, edit_product, delete_product, all_products Templates:
add_product.html, edit_product.html, products.html
Manages user info for streamlined checkout.
Model
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
default_phone_number = models.CharField(max_length=20, null=True, blank=True)
default_country = CountryField(blank_label='Country *', null=True, blank=True)
default_postcode = models.CharField(max_length=20, null=True, blank=True)
default_town_or_city = models.CharField(max_length=40, null=True, blank=True)
default_street_address1 = models.CharField(max_length=80, null=True, blank=True)
default_street_address2 = models.CharField(max_length=80, null=True, blank=True)
default_county = models.CharField(max_length=80, null=True, blank=True)
Views:
profile_view Template:
profile.html
CustomClearableFileInput: A user-friendly file input widget that supports image uploads, current image display, and removal options for consultation images.
Below is a demonstration of the full CRUD functionality for products on the site, including Create, Read, Update, Delete, and a simulated Like/Favourite feature.
Users with appropriate permissions can add a new product through the admin panel or a product form.
All users can browse products from the store. Clicking on a product displays detailed information such as price, image, and description.
Screenshot: Product Detail Page
Admins or store managers can update a product’s details such as name, price, category, or image.
Admins can delete a product. Once removed, it no longer appears on the storefront.
Screenshot: Delete Confirmation
Logged-in users can favourite products to save them for later viewing.
Screenshot: Favourite Button & Favourites Page
Action | Who Can Perform | Method | Result |
---|---|---|---|
Create | Admin / Manager | Form or Admin | New product added |
Read | All users | Product page | View product details |
Update | Admin / Manager | Edit form | Product details updated |
Delete | Admin / Manager | Delete button | Product removed from catalog |
Like | Logged-in users | Button toggle | Product added to favourites |
A custom 404 error page has been implemented to improve user experience. The template is located in the templates
directory as 404.html
.
This section explains how Google Calendar is integrated into the project and how users can use it to book consultations.
Users can visit the consultations page to book a 30-minute video chat session to discuss graphic designs for their tattoo designs. This functionality is powered by Google Calendar API and ensures seamless scheduling.
-
Environment Variables:
- Add the following environment variables to your
.env
file:GOOGLE_CLIENT_ID=. ... GOOGLE_CLIENT_CONFIG_FILE=consultations/config/calendar.json GOOGLE_PROJECT_ID=girls-get-tattoos GOOGLE_AUTH_URI=https://accounts.google.com/o/oauth2/auth GOOGLE_TOKEN_URI=https://oauth2.googleapis.com/token GOOGLE_AUTH_PROVIDER_CERT_URL=https://www.googleapis.com/oauth2/v1/certs GOOGLE_CLIENT_SECRET= ... GOOGLE_REDIRECT_URI=https://girls-get-tattoos-6ad59281377a.herokuapp.com/oauth2callback
- Add the following environment variables to your
-
Google Cloud Console Configuration:
- In the Google Cloud Console, ensure the following:
- OAuth 2.0 credentials are set up.
- The redirect URI matches:
https://girls-get-tattoos-6ad59281377a.herokuapp.com/oauth2callback
. - Scopes include
https://www.googleapis.com/auth/calendar
.
- In the Google Cloud Console, ensure the following:
-
Calendar JSON Configuration:
- Update
consultations/config/calendar.json
:{ "web": { "client_id": "client_id_here", "project_id": "girls-get-tattoos", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_secret": "secret_key_here", "redirect_uris": [ "https://girls-get-tattoos-6ad59281377a.herokuapp.com/oauth2callback" ] } }
- Update
-
Dependencies:
- Install the following libraries in your
requirements.txt
:google-auth==2.17.0 google-auth-oauthlib==1.0.0 google-api-python-client==2.70.0
- Install the following libraries in your
-
Session Storage:
- Ensure credentials are securely stored in Heroku database. Avoid hardcoding sensitive data in env.py.
-
Django Views and URLs:
- Users access the consultations page (
/consultations
) to:- Authenticate via Google.
- Book a session via Google Calendar.
- The key views and URLs are defined in
consultations/views.py
andconsultations/urls.py
.
- Users access the consultations page (
-
Access:
- Users navigate to the
/consultations
page.
- Users navigate to the
-
Login:
- If users are not authenticated with Google, they are redirected to log in.
-
Booking:
- Once logged in, users can book a 30-minute session, which is added to their Google Calendar.
-
Confirmation:
- A confirmation message is displayed, and the event is saved in both the user’s and your Google Calendar.
- Error Handling:
- Ensure proper validation for tokens, state parameters, and session expiration.
- Security:
- Use encrypted storage for sensitive credentials.
- Never expose sensitive data in version control.
By following these steps, users can easily book video chat sessions through Google Calendar, streamlining the consultation process for tattoo design discussions.
Please see TESTING.md to understand the error presented when in development, explaining the inability to currently bypass.
Please refer to the DEPLOYMENT.md file for all deployment and payment-related documentation.
Please refer to the TESTING.md file for all test-related documentation.
I have recently received email notifications from AWS indicating a bill of several hundred pounds. As I was under the impression that AWS usage during this course would fall within free tier limits or educational allowances, I did not expect to incur charges.
As such, I have not identified any errors at the time of submitting this project. However, if errors occur when accessing the deployed site or database, it may be due to unpaid AWS services being paused or restricted. Unfortunately, I am unable to cover these charges personally, as this project is part of a course submission and I assumed AWS resources would remain accessible throughout.
Thank you for your understanding.
- WireFrames (Canva): Used Canva for designing wireframes, backgrounds, and visual assets that helped guide the user interface design of the project.
- Code Institute's Boutique Ado tutorial: The base for my project.
- Text over image: Utilised this guide to effectively overlay text on images, enhancing visual appeal and usability.
- Google Fonts: Selected and embedded fonts to ensure the app has a cohesive and attractive typography.
- Favicon Generator: Created a custom favicon to enhance the branding and recognition of our web application.
- Stripe: This project uses Stripe for secure payment processing, enabling seamless and reliable transactions with industry-leading security standards.
- Stripe Testing: These test cards were a neccessity for testing my fuctionality.
- Like count implementation: Incorporated a like/unlike feature for posts, enabling user interaction and engagement.
- Django Documentation: Consulted extensively for understanding and implementing various Django views.
- Django Forms: Used to manage and validate forms within the app.
- Django Models: Helped in designing and interacting with the database models.
- Django Authentication: Implemented authentication features, ensuring secure user access and management.
- Django File Uploads: Managed user-uploaded files, including profile images.
- Django Admin: The page provides documentation for the Django Admin site, detailing its features, customisation options, and how to use it to manage application data through a web interface.
- Django Contact Form: Used to create the booking form/ contact page, for these messages to be displayed on admin for superusers.
- Google Calendar API
- Bootstrap Tables: Used Bootstrap's table component to display organized and responsive tables in the application.
- Bootstrap Grid System: Implemented the Bootstrap grid system for responsive layouts, ensuring the site works well across various screen sizes.
- Bootstrap Cards: Utilized Bootstrap cards for content boxes, making information display cleaner and more interactive.
- Mailchimp Embedded Forms Tutorial (YouTube): Followed this tutorial for integrating Mailchimp's embedded forms into the application to manage user subscriptions.
- Bootstrap Toasts: Used Bootstrap's toast component to provide non-intrusive feedback messages to users, improving UX by informing users of successful actions or errors.
- Google Cloud Console Setup: Used this guide to set up a Google Cloud Console project and configure API access, enabling the use of Google services like Calendar and authentication.
- Google Calendar API Setup: Followed this tutorial to integrate Google Calendar API for consultation bookings and managing appointments through Google Calendar.
- iPad Drawing App: Used this app to sketch all the tattoo designs and artwork for sale on the platform, allowing for creative flexibility and digital artwork processing.
- Instagram: Connect with us on Instagram for updates and promotions.
- Facebook: Follow us on Facebook for news and community engagement.
- Julia Krowkaw: Provided valuable insights and understanding on the implementation of models.