diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 5be02db..46de154 100644 Binary files a/config/__pycache__/settings.cpython-311.pyc and b/config/__pycache__/settings.cpython-311.pyc differ diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 28817aa..6894d98 100644 Binary files a/config/__pycache__/urls.cpython-311.pyc and b/config/__pycache__/urls.cpython-311.pyc differ diff --git a/config/settings.py b/config/settings.py index 291d043..beb9df7 100644 --- a/config/settings.py +++ b/config/settings.py @@ -56,6 +56,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'core', + 'voice_agent', ] MIDDLEWARE = [ @@ -180,3 +181,7 @@ if EMAIL_USE_SSL: # https://docs.djangoproject.com/en/5.2/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +# Stripe +STRIPE_PUBLISHABLE_KEY = os.getenv('STRIPE_PUBLISHABLE_KEY', '') +STRIPE_SECRET_KEY = os.getenv('STRIPE_SECRET_KEY', '') diff --git a/config/urls.py b/config/urls.py index bcfc074..e90bb64 100644 --- a/config/urls.py +++ b/config/urls.py @@ -22,6 +22,7 @@ from django.conf.urls.static import static urlpatterns = [ path("admin/", admin.site.urls), path("", include("core.urls")), + path("voice-agent/", include("voice_agent.urls")), ] if settings.DEBUG: diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 1f807fa..c8eba65 100644 Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 6867ddf..954e05e 100644 Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..2d26f19 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -3,7 +3,7 @@ - {% block title %}Knowledge Base{% endblock %} + {% block title %}BB Web Solutions{% endblock %} {% if project_description %} @@ -13,13 +13,64 @@ {% endif %} + + + {% load static %} + {% block head %}{% endblock %} + + {% block content %}{% endblock %} + + diff --git a/core/templates/core/about.html b/core/templates/core/about.html new file mode 100644 index 0000000..d609208 --- /dev/null +++ b/core/templates/core/about.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+

About Us

+

This is the about page.

+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/blog.html b/core/templates/core/blog.html new file mode 100644 index 0000000..bd314ab --- /dev/null +++ b/core/templates/core/blog.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Blog

+

This is the blog page.

+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/contact.html b/core/templates/core/contact.html new file mode 100644 index 0000000..e4bac12 --- /dev/null +++ b/core/templates/core/contact.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Contact Us

+

This is the contact page.

+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..db0c718 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,66 @@ {% extends "base.html" %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} +{% block title %}BB Web Solutions - Modern Digital Solutions{% endblock %} {% block head %} - - - - + {% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ + +
-
- + + + +
+
+

We Build What's Next

+

High-performance websites, AI agents, and custom software solutions that drive growth and efficiency.

+ Get in Touch +
+
+ + +
+
+

Our Expertise

+
+
+
+

Websites

+

Sleek, fast, and reliable websites that convert visitors into customers.

+
+
+
+
+

AI Agents

+

Automate workflows and enhance customer interactions with intelligent AI agents.

+
+
+
+
+

Custom Software

+

Tailored software solutions to solve your unique business challenges.

+
+
+
+
+
+ + + + + {% endblock %} \ No newline at end of file diff --git a/core/templates/core/login.html b/core/templates/core/login.html new file mode 100644 index 0000000..56e56fc --- /dev/null +++ b/core/templates/core/login.html @@ -0,0 +1,21 @@ + +{% extends "base.html" %} + +{% block content %} +
+
+
+
+
+

Login

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/payment.html b/core/templates/core/payment.html new file mode 100644 index 0000000..dd03452 --- /dev/null +++ b/core/templates/core/payment.html @@ -0,0 +1,48 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Stripe Payments

+ {% if not stripe_publishable_key %} + + {% else %} +

You are about to purchase the {{ product }} package.

+ + {% endif %} +
+ + + +{% endblock %} diff --git a/core/templates/core/portfolio.html b/core/templates/core/portfolio.html new file mode 100644 index 0000000..9d90ad3 --- /dev/null +++ b/core/templates/core/portfolio.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Our Portfolio

+

This is the portfolio page.

+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/pricing.html b/core/templates/core/pricing.html new file mode 100644 index 0000000..8ba8889 --- /dev/null +++ b/core/templates/core/pricing.html @@ -0,0 +1,47 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

Our Pricing

+

Choose the plan that's right for you.

+
+ +
+
+
+
+

Websites

+
+
+

$500 upfront

+
    +
  • + $100/month maintenance
  • +
  • Custom website design
  • +
  • Hosting and domain support
  • +
  • 24/7 customer support
  • +
+ Get Started +
+
+
+
+
+
+

AI Agents

+
+
+

$1000 upfront

+
    +
  • + $500/month maintenance
  • +
  • Custom AI agent development
  • +
  • Integration with your systems
  • +
  • 24/7 customer support
  • +
+ Get Started +
+
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/services.html b/core/templates/core/services.html new file mode 100644 index 0000000..1e226f7 --- /dev/null +++ b/core/templates/core/services.html @@ -0,0 +1,41 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

Our Services

+

We offer a range of services to help your business grow.

+
+ +
+
+
+
+

Custom Websites

+

We build beautiful, responsive, and high-performing websites tailored to your brand. Whether you need a simple landing page or a complex e-commerce platform, our team of experts will work with you to create a stunning online presence.

+
    +
  • ✓ Custom Design
  • +
  • ✓ Mobile-Friendly
  • +
  • ✓ SEO Optimized
  • +
  • ✓ ongoing Maintenance
  • +
+
+
+
+
+
+
+

AI-Powered Agents

+

Automate your workflows and enhance customer interactions with our intelligent AI agents. We develop custom agents that can handle customer support, lead generation, data analysis, and much more, freeing up your team to focus on what matters most.

+
    +
  • ✓ 24/7 Customer Support
  • +
  • ✓ Lead Qualification
  • +
  • ✓ Data-driven Insights
  • +
  • ✓ Seamless Integration
  • +
+
+
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/signup.html b/core/templates/core/signup.html new file mode 100644 index 0000000..76d8b8c --- /dev/null +++ b/core/templates/core/signup.html @@ -0,0 +1,21 @@ + +{% extends "base.html" %} + +{% block content %} +
+
+
+
+
+

Sign Up

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..e9f8082 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,18 @@ from django.urls import path -from .views import home +from .views import home, about, services, portfolio, blog, contact, pricing, signup_view, login_view, logout_view, payment_view, create_checkout_session urlpatterns = [ path("", home, name="home"), + path("about/", about, name="about"), + path("services/", services, name="services"), + path("portfolio/", portfolio, name="portfolio"), + path("blog/", blog, name="blog"), + path("contact/", contact, name="contact"), + path("pricing/", pricing, name="pricing"), + path("signup/", signup_view, name="signup"), + path("login/", login_view, name="login"), + path("logout/", logout_view, name="logout"), + path("payment/", payment_view, name="payment"), + path("create-checkout-session/", create_checkout_session, name="create-checkout-session"), ] diff --git a/core/views.py b/core/views.py index c9aed12..537c4f8 100644 --- a/core/views.py +++ b/core/views.py @@ -2,7 +2,9 @@ import os import platform from django import get_version as django_version -from django.shortcuts import render +from django.shortcuts import render, redirect +from django.contrib.auth import login, authenticate, logout +from django.contrib.auth.forms import AuthenticationForm, UserCreationForm from django.utils import timezone @@ -23,3 +25,101 @@ def home(request): "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), } return render(request, "core/index.html", context) + + +def about(request): + return render(request, "core/about.html") + + +def services(request): + return render(request, "core/services.html") + + +def portfolio(request): + return render(request, "core/portfolio.html") + + +def blog(request): + return render(request, "core/blog.html") + + +def contact(request): + return render(request, "core/contact.html") + + +from django.conf import settings + +def pricing(request): + return render(request, "core/pricing.html") + +import stripe +from django.http import JsonResponse + +def payment_view(request): + product = request.GET.get('product') + context = { + 'stripe_publishable_key': settings.STRIPE_PUBLISHABLE_KEY, + 'product': product + } + return render(request, 'core/payment.html', context) + +def create_checkout_session(request): + product = request.GET.get('product') + if product == 'website': + price = 50000 # $500 in cents + name = 'Website' + elif product == 'agent': + price = 100000 # $1000 in cents + name = 'AI Agent' + else: + return JsonResponse({'error': 'Invalid product'}) + + stripe.api_key = settings.STRIPE_SECRET_KEY + try: + checkout_session = stripe.checkout.Session.create( + payment_method_types=['card'], + line_items=[ + { + 'price_data': { + 'currency': 'usd', + 'product_data': { + 'name': name, + }, + 'unit_amount': price, + }, + 'quantity': 1, + }, + ], + mode='payment', + success_url=request.build_absolute_uri('/') + '?success=true', + cancel_url=request.build_absolute_uri('/') + '?canceled=true', + ) + return JsonResponse({'id': checkout_session.id}) + except Exception as e: + return JsonResponse({'error': str(e)}) + +def signup_view(request): + if request.method == 'POST': + form = UserCreationForm(request.POST) + if form.is_valid(): + user = form.save() + login(request, user) + return redirect('home') + else: + form = UserCreationForm() + return render(request, 'core/signup.html', {'form': form}) + +def login_view(request): + if request.method == 'POST': + form = AuthenticationForm(data=request.POST) + if form.is_valid(): + user = form.get_user() + login(request, user) + return redirect('home') + else: + form = AuthenticationForm() + return render(request, 'core/login.html', {'form': form}) + +def logout_view(request): + logout(request) + return redirect('home') diff --git a/requirements.txt b/requirements.txt index e22994c..16feb27 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ Django==5.2.7 mysqlclient==2.2.7 python-dotenv==1.1.1 +stripe==10.3.0 diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..979b20d 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,109 @@ -/* Custom styles for the application */ +/* +BB Web Solutions - Custom Styles +*/ + +/* --- General & Typography --- */ body { - font-family: system-ui, -apple-system, sans-serif; + background-color: #111827; /* Dark base */ + color: #F9FAFB; /* Off-white text */ + font-family: 'Inter', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +h1, h2, h3, .navbar-brand { + font-family: 'Poppins', sans-serif; + font-weight: 700; +} + +.lead { + font-weight: 400; + color: rgba(249, 250, 251, 0.8); +} + +/* --- Layout & Spacing --- */ +.page-wrapper { + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.container { + max-width: 1140px; +} + +/* --- Header / Navbar --- */ +.navbar-brand { + font-size: 1.75rem; + font-weight: 700; +} + +/* --- Hero Section --- */ +.hero-section { + padding: 8rem 0; + background: linear-gradient(170deg, #111827 0%, #1a253a 100%); +} + +.hero-section .display-3 { + margin-bottom: 1rem; +} + +.hero-section .lead { + margin-bottom: 2rem; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + + +/* --- Buttons --- */ +.btn-primary { + background-color: #3B82F6; /* Vibrant Blue */ + border-color: #3B82F6; + padding: 0.75rem 2rem; + font-weight: 600; + font-family: 'Poppins', sans-serif; + transition: background-color 0.2s ease-in-out, transform 0.2s ease; +} + +.btn-primary:hover { + background-color: #2563EB; + border-color: #2563EB; + transform: translateY(-2px); +} + +/* --- Services Section --- */ +.services-section { + background-color: #1a253a; + color: #F9FAFB; +} + +.services-section h2 { + font-weight: 600; +} + +.service-card { + background-color: #111827; + padding: 2.5rem 2rem; + border-radius: 0.5rem; + height: 100%; + border: 1px solid rgba(255,255,255,0.05); +} + +.service-card h3 { + color: #10B981; /* Emerald Green Highlight */ + font-weight: 600; + margin-bottom: 1rem; +} + + +/* --- Contact Section --- */ +.contact-section { + background-color: #111827; +} + +.contact-section .contact-number { + font-size: 2.5rem; + font-weight: 700; + color: #3B82F6; /* Vibrant Blue */ +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..979b20d 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,109 @@ +/* +BB Web Solutions - Custom Styles +*/ -:root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); -} +/* --- General & Typography --- */ body { - margin: 0; - font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; - overflow: hidden; - position: relative; + background-color: #111827; /* Dark base */ + color: #F9FAFB; /* Off-white text */ + font-family: 'Inter', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +h1, h2, h3, .navbar-brand { + font-family: 'Poppins', sans-serif; + font-weight: 700; +} + +.lead { + font-weight: 400; + color: rgba(249, 250, 251, 0.8); +} + +/* --- Layout & Spacing --- */ +.page-wrapper { + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.container { + max-width: 1140px; +} + +/* --- Header / Navbar --- */ +.navbar-brand { + font-size: 1.75rem; + font-weight: 700; +} + +/* --- Hero Section --- */ +.hero-section { + padding: 8rem 0; + background: linear-gradient(170deg, #111827 0%, #1a253a 100%); +} + +.hero-section .display-3 { + margin-bottom: 1rem; +} + +.hero-section .lead { + margin-bottom: 2rem; + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + + +/* --- Buttons --- */ +.btn-primary { + background-color: #3B82F6; /* Vibrant Blue */ + border-color: #3B82F6; + padding: 0.75rem 2rem; + font-weight: 600; + font-family: 'Poppins', sans-serif; + transition: background-color 0.2s ease-in-out, transform 0.2s ease; +} + +.btn-primary:hover { + background-color: #2563EB; + border-color: #2563EB; + transform: translateY(-2px); +} + +/* --- Services Section --- */ +.services-section { + background-color: #1a253a; + color: #F9FAFB; +} + +.services-section h2 { + font-weight: 600; +} + +.service-card { + background-color: #111827; + padding: 2.5rem 2rem; + border-radius: 0.5rem; + height: 100%; + border: 1px solid rgba(255,255,255,0.05); +} + +.service-card h3 { + color: #10B981; /* Emerald Green Highlight */ + font-weight: 600; + margin-bottom: 1rem; +} + + +/* --- Contact Section --- */ +.contact-section { + background-color: #111827; +} + +.contact-section .contact-number { + font-size: 2.5rem; + font-weight: 700; + color: #3B82F6; /* Vibrant Blue */ +} \ No newline at end of file diff --git a/voice_agent/__init__.py b/voice_agent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_agent/__pycache__/__init__.cpython-311.pyc b/voice_agent/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..a8b472b Binary files /dev/null and b/voice_agent/__pycache__/__init__.cpython-311.pyc differ diff --git a/voice_agent/__pycache__/admin.cpython-311.pyc b/voice_agent/__pycache__/admin.cpython-311.pyc new file mode 100644 index 0000000..d79db9a Binary files /dev/null and b/voice_agent/__pycache__/admin.cpython-311.pyc differ diff --git a/voice_agent/__pycache__/apps.cpython-311.pyc b/voice_agent/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000..3bf5a1b Binary files /dev/null and b/voice_agent/__pycache__/apps.cpython-311.pyc differ diff --git a/voice_agent/__pycache__/models.cpython-311.pyc b/voice_agent/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000..c381434 Binary files /dev/null and b/voice_agent/__pycache__/models.cpython-311.pyc differ diff --git a/voice_agent/__pycache__/urls.cpython-311.pyc b/voice_agent/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000..cd6ccd8 Binary files /dev/null and b/voice_agent/__pycache__/urls.cpython-311.pyc differ diff --git a/voice_agent/__pycache__/views.cpython-311.pyc b/voice_agent/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000..90a8aff Binary files /dev/null and b/voice_agent/__pycache__/views.cpython-311.pyc differ diff --git a/voice_agent/admin.py b/voice_agent/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/voice_agent/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/voice_agent/apps.py b/voice_agent/apps.py new file mode 100644 index 0000000..d808c11 --- /dev/null +++ b/voice_agent/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class VoiceAgentConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'voice_agent' diff --git a/voice_agent/migrations/__init__.py b/voice_agent/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/voice_agent/migrations/__pycache__/__init__.cpython-311.pyc b/voice_agent/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..9c269a2 Binary files /dev/null and b/voice_agent/migrations/__pycache__/__init__.cpython-311.pyc differ diff --git a/voice_agent/models.py b/voice_agent/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/voice_agent/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/voice_agent/templates/voice_agent/index.html b/voice_agent/templates/voice_agent/index.html new file mode 100644 index 0000000..f0abaaa --- /dev/null +++ b/voice_agent/templates/voice_agent/index.html @@ -0,0 +1,8 @@ +{% extends 'base.html' %} + +{% block content %} +
+

AI Voice Agent

+

This is where the AI voice agent will be.

+
+{% endblock %} diff --git a/voice_agent/tests.py b/voice_agent/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/voice_agent/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/voice_agent/urls.py b/voice_agent/urls.py new file mode 100644 index 0000000..8c6621f --- /dev/null +++ b/voice_agent/urls.py @@ -0,0 +1,7 @@ +from django.urls import path + +from .views import voice_agent_view + +urlpatterns = [ + path("", voice_agent_view, name="voice_agent"), +] diff --git a/voice_agent/views.py b/voice_agent/views.py new file mode 100644 index 0000000..6180638 --- /dev/null +++ b/voice_agent/views.py @@ -0,0 +1,4 @@ +from django.shortcuts import render + +def voice_agent_view(request): + return render(request, 'voice_agent/index.html')