From fdb06c9979ec6b0ca0dd9b2dbbfc956a4bac9c47 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 16 Dec 2025 03:38:16 +0000 Subject: [PATCH] v1 --- config/__pycache__/settings.cpython-311.pyc | Bin 5552 -> 5730 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1557 -> 1655 bytes config/settings.py | 5 + config/urls.py | 1 + core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 1441 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 6077 bytes core/templates/base.html | 53 ++++- core/templates/core/about.html | 8 + core/templates/core/blog.html | 8 + core/templates/core/contact.html | 8 + core/templates/core/index.html | 193 ++++++------------ core/templates/core/login.html | 21 ++ core/templates/core/payment.html | 48 +++++ core/templates/core/portfolio.html | 8 + core/templates/core/pricing.html | 47 +++++ core/templates/core/services.html | 41 ++++ core/templates/core/signup.html | 21 ++ core/urls.py | 13 +- core/views.py | 102 ++++++++- requirements.txt | 1 + static/css/custom.css | 109 +++++++++- staticfiles/css/custom.css | 124 +++++++++-- voice_agent/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 164 bytes voice_agent/__pycache__/admin.cpython-311.pyc | Bin 0 -> 219 bytes voice_agent/__pycache__/apps.cpython-311.pyc | Bin 0 -> 544 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 216 bytes voice_agent/__pycache__/urls.cpython-311.pyc | Bin 0 -> 375 bytes voice_agent/__pycache__/views.cpython-311.pyc | Bin 0 -> 422 bytes voice_agent/admin.py | 3 + voice_agent/apps.py | 6 + voice_agent/migrations/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 175 bytes voice_agent/models.py | 3 + voice_agent/templates/voice_agent/index.html | 8 + voice_agent/tests.py | 3 + voice_agent/urls.py | 7 + voice_agent/views.py | 4 + 38 files changed, 686 insertions(+), 159 deletions(-) create mode 100644 core/templates/core/about.html create mode 100644 core/templates/core/blog.html create mode 100644 core/templates/core/contact.html create mode 100644 core/templates/core/login.html create mode 100644 core/templates/core/payment.html create mode 100644 core/templates/core/portfolio.html create mode 100644 core/templates/core/pricing.html create mode 100644 core/templates/core/services.html create mode 100644 core/templates/core/signup.html create mode 100644 voice_agent/__init__.py create mode 100644 voice_agent/__pycache__/__init__.cpython-311.pyc create mode 100644 voice_agent/__pycache__/admin.cpython-311.pyc create mode 100644 voice_agent/__pycache__/apps.cpython-311.pyc create mode 100644 voice_agent/__pycache__/models.cpython-311.pyc create mode 100644 voice_agent/__pycache__/urls.cpython-311.pyc create mode 100644 voice_agent/__pycache__/views.cpython-311.pyc create mode 100644 voice_agent/admin.py create mode 100644 voice_agent/apps.py create mode 100644 voice_agent/migrations/__init__.py create mode 100644 voice_agent/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 voice_agent/models.py create mode 100644 voice_agent/templates/voice_agent/index.html create mode 100644 voice_agent/tests.py create mode 100644 voice_agent/urls.py create mode 100644 voice_agent/views.py diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index 5be02db206d695487566bb415cb6b1e287631fb4..46de15400bc8790724480586950f484764777ff1 100644 GIT binary patch delta 390 zcmdm>{YZy*IWI340}wdxb;!IqkynyQf_0Kozd`qwSa3*?XMk&bK&X?CXRwE(laFh>w`=4rL8y4Jt8Y=Oir*5ZPk%#tF<$^C*7dd?tW7ZAY% zA_PGMKalvvVUwGmQks)$SCk3lG6Hci7t7|;g1(G`oI*?=7+^#L-v_bHn!+_q<{#J? zq?Bg}&5^vIY`r7sqNKwWNrwvzVmCx&Cpb;U1 zn3+uusI*9P^E{s8OpL20r|~y1Y3gql7C6l4V+@ip0TQ>EGxJJ{OhH_85Mco#EJ1`7 zh_C??w^)k{axzPb96)R#7gsmOP@j-^$IuY}csEa1AD78GLQ>pmKuJa*F22XSIZ()# gQIJE3=>r3dXyE%GvU$C54HNeT1|c9S5(Fv*0Eiwkm;e9( diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index 28817aa35512298e6df4bc5c0b678c917f71e36c..6894d981f0339cb39a06f5895e1a8bb85293f6a0 100644 GIT binary patch delta 228 zcmbQr^PNY1IWI340}ur7b;wL+VPJR+;=lk0l=0bUqIy3M6GJL%3MY_cN#U9}OIDXT ziYJvlix;N2$Rrh{gfoR3D9Q&DP2s8HW?)#uJMoFJJnu3l28Pu@3;|U@tx-HFe8CJL ztjWLGjPWd!6i-=xW^$@-VtQ&`iGGy;m=_P`ZT`zF$H>IZI9ZmpU-;#`MJ6jS$}@skqMSUz3@JdY$-6m@@hsD3Zx#tgrjHDhQ(5~tKd>_MGc|C3 K;F>JXmH+^W9~h|s 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 1f807fae1897c89361c99c5e868a26d00799b73f..c8eba65279f3c20d95a6e28b59e261dff5f6be32 100644 GIT binary patch literal 1441 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 - {% 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… +
+ + +
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
+ + + +
+
+

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.

+
+
+
+
+
+ + +
+
+

Let's Build Together

+

The best way to contact us is by texting.

+

341-204-5147

+
+
+ + {% 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 0000000000000000000000000000000000000000..a8b472b0f5e71d170d4cef7e5f01f76125120532 GIT binary patch literal 164 zcmZ3^%ge<81P*&0GC}lX5CH>>P{wCAAY(d13PUi1CZpd?%JijQrxF9h(Rlh7hGdVRrF+DY}L?3LTUP0wA4x8Nkl+v73yCM#tA&fv= XEDIz)Ff%eT-e6F;fDIL~0aXA1$0|6E literal 0 HcmV?d00001 diff --git a/voice_agent/__pycache__/apps.cpython-311.pyc b/voice_agent/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3bf5a1bcff20d4165857bcbaca565c892040f973 GIT binary patch literal 544 zcmZuty-ve05I!dW!rVcy+Tg3~2 z5YNCnbgZ&6u@#l66Lyj!5S;D1?|gUP+4oehSAa|VwQWCe`zD;FlnOA{I2Z#3iX3o} zfe=V=3{<)UDl_yb1HAB)iy=|v6x7nYa8;D9c7ou*_xiSF78#jAg)?t*Fa`z&qQGmB zAydgvsLVN(v~lL!ChJ(ti*t_KO?p8*%hza6bA8I3NZYrqP7?b^HgjlNy%q(Sh>EUS zO3N5~#AO(#6^wa7;s{*B_$nbz5m~3KPZB4_gwx=D#-oVXGt9*+7u))|?=n5UZxZdq83-9?=@}hOqAxdx-mKwE37YbyQ-X4 ziysQ2P>eOFstJ@Ou5q*|@8-YR3me=O(~M5In#l;EDQr!C@7aokS~K{o?uQ@Z_Vb@m G*6a%^=!%*E literal 0 HcmV?d00001 diff --git a/voice_agent/__pycache__/models.cpython-311.pyc b/voice_agent/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c381434baf41efced591b637695470998777746c GIT binary patch literal 216 zcmZ3^%ge<81P*&0GA)7hV-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdAO)I? zx7c#?Q&Mw^{WO_wai(M?=B4NBr6d(G10`27do?nz*T#%TYs$Z6$nVcG*n4X$fq7N}mub}c5hYgTjnv-f*!~ryg5r~Urfy4)9 RMn=XP3^Et6p&~Y*3IOZ4H!uJI literal 0 HcmV?d00001 diff --git a/voice_agent/__pycache__/urls.cpython-311.pyc b/voice_agent/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd6ccd8bf27cd984b8f9fd3ecec6d6f2fed5d330 GIT binary patch literal 375 zcmY*Tu};G<5Ix6EDMV2bGfYfbYALK0Vn8ei7Pc%^h^;h`#F3MvNG-8x~bAhpkT_PwX`yL)!sEzmf5KT7WP`(wyI?7w0@(8U8VU?_zQ1qcDN z7*4GW2N;0`95KQ%v)?*T7~oas5-|!0+qeL)J2QfZ6e+@LG($_WJr+sChhfa~YB)~# zM1gWvG}E7l89(=I<*=(Tk43+hX(`PBWt$(RG)pQ+%i6i(GB00Xt|eF;(2>YEtuO1m zswuzWQC$g1CqiDAMHq3qGKm`7esR0#4l=>&lpo5T_Aq;vr}}C!Lg)*2oAvmH{boJd g4%nO14-FrN1i2p(SPvW=O>RD6A9O-JmU%M}6ga7~l literal 0 HcmV?d00001 diff --git a/voice_agent/__pycache__/views.cpython-311.pyc b/voice_agent/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90a8affebde27abbfb0d74578515f2a66aa57148 GIT binary patch literal 422 zcmZ3^%ge<81Ri@GGAn`fV-N=hn4pZ$5Q1e02;>RS0z@K zpP8H*pO~JSSE8Q@G_gW2qa-({2xN>V<1O~0)WXu#;*w&JQ3}6I^fU5vQ}s)eO7lue z^;0WSlS@nTi}cI$i?WLg5|dN)kxeVhOf4_gE2z9BfFv3Z5-s8Yng+6=SQtn&Fx=%9 zoS=R|+V~>3$rWys3oIs|fx--an#{KZQnC{B()0C-GxCc{fR+^(f&2*8zmlPd6U1f* v62CZXa`RJ4b5iY!cz|4xV~Y)d#0O?ZM#dWq$`?@42Np&~(+>=o1lU9XDcWSK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..9c269a2ce95934338ef6bb421c4c47c6f89a9a87 GIT binary patch literal 175 zcmZ3^%ge<81P*&0GC}lX5CH>>P{wCAAY(d13PUi1CZpd=*er~FM zX;NukNvVEnMQU&ryk0@&FAkgB{FKt1RJ$TppphU;i}``X2WCb_#t#fIqKFwN1_0FAD~SLA literal 0 HcmV?d00001 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')