Compare commits

...

1 Commits

Author SHA1 Message Date
Flatlogic Bot
fdb06c9979 v1 2025-12-16 03:38:16 +00:00
38 changed files with 686 additions and 159 deletions

View File

@ -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', '')

View File

@ -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:

View File

@ -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>

View 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 %}

View 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 %}

View 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 %}

View File

@ -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 %}

View 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 %}

View 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 %}

View 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 %}

View 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 %}

View 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>&#10003; Custom Design</li>
<li>&#10003; Mobile-Friendly</li>
<li>&#10003; SEO Optimized</li>
<li>&#10003; 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>&#10003; 24/7 Customer Support</li>
<li>&#10003; Lead Qualification</li>
<li>&#10003; Data-driven Insights</li>
<li>&#10003; Seamless Integration</li>
</ul>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View 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 %}

View File

@ -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"),
]

View File

@ -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')

View File

@ -1,3 +1,4 @@
Django==5.2.7
mysqlclient==2.2.7
python-dotenv==1.1.1
stripe==10.3.0

View File

@ -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 */
}

View File

@ -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
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
voice_agent/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
voice_agent/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class VoiceAgentConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'voice_agent'

View File

3
voice_agent/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View 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
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

7
voice_agent/urls.py Normal file
View 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
View File

@ -0,0 +1,4 @@
from django.shortcuts import render
def voice_agent_view(request):
return render(request, 'voice_agent/index.html')