Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fdb06c9979 |
Binary file not shown.
Binary file not shown.
@ -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', '')
|
||||
|
||||
@ -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:
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -3,7 +3,7 @@
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>{% block title %}Knowledge Base{% endblock %}</title>
|
||||
<title>{% block title %}BB Web Solutions{% endblock %}</title>
|
||||
{% if project_description %}
|
||||
<meta name="description" content="{{ project_description }}">
|
||||
<meta property="og:description" content="{{ project_description }}">
|
||||
@ -13,13 +13,64 @@
|
||||
<meta property="og:image" content="{{ project_image_url }}">
|
||||
<meta property="twitter:image" content="{{ project_image_url }}">
|
||||
{% endif %}
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Poppins:wght@600;700&display=swap" rel="stylesheet">
|
||||
{% load static %}
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="{% static 'css/custom.css' %}?v={{ deployment_timestamp }}">
|
||||
{% block head %}{% endblock %}
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="/">BB Web Solutions</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'home' %}">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'about' %}">About</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'services' %}">Services</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'portfolio' %}">Portfolio</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'blog' %}">Blog</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'contact' %}">Contact</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'pricing' %}">Pricing</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'voice_agent' %}">AI Voice Agent</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="d-flex">
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'logout' %}" class="btn btn-outline-light">Logout</a>
|
||||
{% else %}
|
||||
<a href="{% url 'login' %}" class="btn btn-outline-light me-2">Login</a>
|
||||
<a href="{% url 'signup' %}" class="btn btn-primary">Sign Up</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
8
core/templates/core/about.html
Normal file
8
core/templates/core/about.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<h1>About Us</h1>
|
||||
<p>This is the about page.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
8
core/templates/core/blog.html
Normal file
8
core/templates/core/blog.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<h1>Blog</h1>
|
||||
<p>This is the blog page.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
8
core/templates/core/contact.html
Normal file
8
core/templates/core/contact.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<h1>Contact Us</h1>
|
||||
<p>This is the contact page.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@ -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 %}
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
: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);
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
body::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'><path d='M-10 10L110 10M10 -10L10 110' stroke-width='1' stroke='rgba(255,255,255,0.05)'/></svg>");
|
||||
animation: bg-pan 20s linear infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
@keyframes bg-pan {
|
||||
0% {
|
||||
background-position: 0% 0%;
|
||||
}
|
||||
|
||||
100% {
|
||||
background-position: 100% 100%;
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
padding: 2rem;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: var(--card-bg-color);
|
||||
border: 1px solid var(--card-border-color);
|
||||
border-radius: 16px;
|
||||
padding: 2.5rem 2rem;
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
box-shadow: 0 12px 36px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: clamp(2.2rem, 3vw + 1.2rem, 3.2rem);
|
||||
font-weight: 700;
|
||||
margin: 0 0 1.2rem;
|
||||
letter-spacing: -0.02em;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0.5rem 0;
|
||||
font-size: 1.1rem;
|
||||
opacity: 0.92;
|
||||
}
|
||||
|
||||
.loader {
|
||||
margin: 1.5rem auto;
|
||||
width: 56px;
|
||||
height: 56px;
|
||||
border: 4px solid rgba(255, 255, 255, 0.25);
|
||||
border-top-color: #fff;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.runtime code {
|
||||
background: rgba(0, 0, 0, 0.25);
|
||||
padding: 0.15rem 0.45rem;
|
||||
border-radius: 4px;
|
||||
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
||||
}
|
||||
|
||||
.sr-only {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
border: 0;
|
||||
}
|
||||
|
||||
footer {
|
||||
position: absolute;
|
||||
bottom: 1rem;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-size: 0.85rem;
|
||||
opacity: 0.75;
|
||||
}
|
||||
</style>
|
||||
<meta name="description" content="BB Web Solutions builds high-performance websites, AI agents, and custom software to help your business grow.">
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<main>
|
||||
<div class="card">
|
||||
<h1>Analyzing your requirements and generating your app…</h1>
|
||||
<div class="loader" role="status" aria-live="polite" aria-label="Applying initial changes">
|
||||
<span class="sr-only">Loading…</span>
|
||||
<div class="page-wrapper">
|
||||
|
||||
<!-- Header -->
|
||||
<nav class="navbar navbar-expand-lg navbar-dark">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="#">BB Web Solutions</a>
|
||||
</div>
|
||||
<p class="hint">AppWizzy AI is collecting your requirements and applying the first changes.</p>
|
||||
<p class="hint">This page will refresh automatically as the plan is implemented.</p>
|
||||
<p class="runtime">
|
||||
Runtime: Django <code>{{ django_version }}</code> · Python <code>{{ python_version }}</code>
|
||||
— UTC <code>{{ current_time|date:"Y-m-d H:i:s" }}</code>
|
||||
</p>
|
||||
</div>
|
||||
</main>
|
||||
<footer>
|
||||
Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC)
|
||||
</footer>
|
||||
</nav>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<header class="hero-section text-center text-white">
|
||||
<div class="container">
|
||||
<h1 class="display-3">We Build What's Next</h1>
|
||||
<p class="lead">High-performance websites, AI agents, and custom software solutions that drive growth and efficiency.</p>
|
||||
<a href="#contact" class="btn btn-primary btn-lg">Get in Touch</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Services Section -->
|
||||
<section class="services-section py-5">
|
||||
<div class="container">
|
||||
<h2 class="text-center mb-5">Our Expertise</h2>
|
||||
<div class="row text-center">
|
||||
<div class="col-md-4">
|
||||
<div class="service-card">
|
||||
<h3>Websites</h3>
|
||||
<p>Sleek, fast, and reliable websites that convert visitors into customers.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="service-card">
|
||||
<h3>AI Agents</h3>
|
||||
<p>Automate workflows and enhance customer interactions with intelligent AI agents.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="service-card">
|
||||
<h3>Custom Software</h3>
|
||||
<p>Tailored software solutions to solve your unique business challenges.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Contact Section -->
|
||||
<footer id="contact" class="contact-section text-center text-white py-5">
|
||||
<div class="container">
|
||||
<h2 class="mb-3">Let's Build Together</h2>
|
||||
<p class="lead">The best way to contact us is by texting.</p>
|
||||
<h3 class="contact-number">341-204-5147</h3>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
21
core/templates/core/login.html
Normal file
21
core/templates/core/login.html
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title text-center">Login</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary w-100">Login</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
48
core/templates/core/payment.html
Normal file
48
core/templates/core/payment.html
Normal file
@ -0,0 +1,48 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<h1>Stripe Payments</h1>
|
||||
{% if not stripe_publishable_key %}
|
||||
<div class="alert alert-warning" role="alert">
|
||||
Stripe is not configured. Please add your Stripe publishable key to your .env file.
|
||||
</div>
|
||||
{% else %}
|
||||
<p>You are about to purchase the {{ product }} package.</p>
|
||||
<button id="checkout-button" class="btn btn-primary">Checkout</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<script src="https://js.stripe.com/v3/"></script>
|
||||
<script>
|
||||
{% if stripe_publishable_key %}
|
||||
var stripe = Stripe('{{ stripe_publishable_key }}');
|
||||
var checkoutButton = document.getElementById('checkout-button');
|
||||
|
||||
checkoutButton.addEventListener('click', function() {
|
||||
// Create a Checkout Session to begin payment collection
|
||||
fetch('/create-checkout-session?product={{ product }}', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'X-CSRFToken': '{{ csrf_token }}'
|
||||
}
|
||||
})
|
||||
.then(function(response) {
|
||||
return response.json();
|
||||
})
|
||||
.then(function(session) {
|
||||
return stripe.redirectToCheckout({ sessionId: session.id });
|
||||
})
|
||||
.then(function(result) {
|
||||
// If `redirectToCheckout` fails due to a browser popup blocker, display the localized error message to your customer
|
||||
if (result.error) {
|
||||
alert(result.error.message);
|
||||
}
|
||||
})
|
||||
.catch(function(error) {
|
||||
console.error('Error:', error);
|
||||
});
|
||||
});
|
||||
{% endif %}
|
||||
</script>
|
||||
{% endblock %}
|
||||
8
core/templates/core/portfolio.html
Normal file
8
core/templates/core/portfolio.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<h1>Our Portfolio</h1>
|
||||
<p>This is the portfolio page.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
47
core/templates/core/pricing.html
Normal file
47
core/templates/core/pricing.html
Normal file
@ -0,0 +1,47 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1>Our Pricing</h1>
|
||||
<p class="lead">Choose the plan that's right for you.</p>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="card mb-4 rounded-3 shadow-sm">
|
||||
<div class="card-header py-3">
|
||||
<h4 class="my-0 fw-normal">Websites</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h1 class="card-title pricing-card-title">$500 <small class="text-muted fw-light">upfront</small></h1>
|
||||
<ul class="list-unstyled mt-3 mb-4">
|
||||
<li>+ $100/month maintenance</li>
|
||||
<li>Custom website design</li>
|
||||
<li>Hosting and domain support</li>
|
||||
<li>24/7 customer support</li>
|
||||
</ul>
|
||||
<a href="{% url 'payment' %}?product=website" class="w-100 btn btn-lg btn-outline-primary">Get Started</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="card mb-4 rounded-3 shadow-sm">
|
||||
<div class="card-header py-3">
|
||||
<h4 class="my-0 fw-normal">AI Agents</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h1 class="card-title pricing-card-title">$1000 <small class="text-muted fw-light">upfront</small></h1>
|
||||
<ul class="list-unstyled mt-3 mb-4">
|
||||
<li>+ $500/month maintenance</li>
|
||||
<li>Custom AI agent development</li>
|
||||
<li>Integration with your systems</li>
|
||||
<li>24/7 customer support</li>
|
||||
</ul>
|
||||
<a href="{% url 'payment' %}?product=agent" class="w-100 btn btn-lg btn-primary">Get Started</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
41
core/templates/core/services.html
Normal file
41
core/templates/core/services.html
Normal file
@ -0,0 +1,41 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1>Our Services</h1>
|
||||
<p class="lead">We offer a range of services to help your business grow.</p>
|
||||
</div>
|
||||
|
||||
<div class="row g-4">
|
||||
<div class="col-md-6">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">Custom Websites</h2>
|
||||
<p class="card-text">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.</p>
|
||||
<ul class="list-unstyled">
|
||||
<li>✓ Custom Design</li>
|
||||
<li>✓ Mobile-Friendly</li>
|
||||
<li>✓ SEO Optimized</li>
|
||||
<li>✓ ongoing Maintenance</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">AI-Powered Agents</h2>
|
||||
<p class="card-text">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.</p>
|
||||
<ul class="list-unstyled">
|
||||
<li>✓ 24/7 Customer Support</li>
|
||||
<li>✓ Lead Qualification</li>
|
||||
<li>✓ Data-driven Insights</li>
|
||||
<li>✓ Seamless Integration</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
21
core/templates/core/signup.html
Normal file
21
core/templates/core/signup.html
Normal file
@ -0,0 +1,21 @@
|
||||
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title text-center">Sign Up</h2>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<button type="submit" class="btn btn-primary w-100">Sign Up</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
13
core/urls.py
13
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"),
|
||||
]
|
||||
|
||||
102
core/views.py
102
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')
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
Django==5.2.7
|
||||
mysqlclient==2.2.7
|
||||
python-dotenv==1.1.1
|
||||
stripe==10.3.0
|
||||
|
||||
@ -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 */
|
||||
}
|
||||
@ -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 */
|
||||
}
|
||||
0
voice_agent/__init__.py
Normal file
0
voice_agent/__init__.py
Normal file
BIN
voice_agent/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
voice_agent/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
BIN
voice_agent/__pycache__/admin.cpython-311.pyc
Normal file
BIN
voice_agent/__pycache__/admin.cpython-311.pyc
Normal file
Binary file not shown.
BIN
voice_agent/__pycache__/apps.cpython-311.pyc
Normal file
BIN
voice_agent/__pycache__/apps.cpython-311.pyc
Normal file
Binary file not shown.
BIN
voice_agent/__pycache__/models.cpython-311.pyc
Normal file
BIN
voice_agent/__pycache__/models.cpython-311.pyc
Normal file
Binary file not shown.
BIN
voice_agent/__pycache__/urls.cpython-311.pyc
Normal file
BIN
voice_agent/__pycache__/urls.cpython-311.pyc
Normal file
Binary file not shown.
BIN
voice_agent/__pycache__/views.cpython-311.pyc
Normal file
BIN
voice_agent/__pycache__/views.cpython-311.pyc
Normal file
Binary file not shown.
3
voice_agent/admin.py
Normal file
3
voice_agent/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
voice_agent/apps.py
Normal file
6
voice_agent/apps.py
Normal file
@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class VoiceAgentConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'voice_agent'
|
||||
0
voice_agent/migrations/__init__.py
Normal file
0
voice_agent/migrations/__init__.py
Normal file
BIN
voice_agent/migrations/__pycache__/__init__.cpython-311.pyc
Normal file
BIN
voice_agent/migrations/__pycache__/__init__.cpython-311.pyc
Normal file
Binary file not shown.
3
voice_agent/models.py
Normal file
3
voice_agent/models.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
8
voice_agent/templates/voice_agent/index.html
Normal file
8
voice_agent/templates/voice_agent/index.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container py-5">
|
||||
<h1>AI Voice Agent</h1>
|
||||
<p>This is where the AI voice agent will be.</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
3
voice_agent/tests.py
Normal file
3
voice_agent/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
7
voice_agent/urls.py
Normal file
7
voice_agent/urls.py
Normal file
@ -0,0 +1,7 @@
|
||||
from django.urls import path
|
||||
|
||||
from .views import voice_agent_view
|
||||
|
||||
urlpatterns = [
|
||||
path("", voice_agent_view, name="voice_agent"),
|
||||
]
|
||||
4
voice_agent/views.py
Normal file
4
voice_agent/views.py
Normal file
@ -0,0 +1,4 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
def voice_agent_view(request):
|
||||
return render(request, 'voice_agent/index.html')
|
||||
Loading…
x
Reference in New Issue
Block a user