From e863dc970a2c11a91aa0caea0f79e12f757e5281 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sun, 30 Nov 2025 16:52:35 +0000 Subject: [PATCH] V1 --- ai/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 404 bytes ai/__pycache__/local_ai_api.cpython-311.pyc | Bin 0 -> 19874 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 348 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2183 bytes core/templates/base.html | 5 + core/templates/core/index.html | 188 +++++--------------- core/urls.py | 4 +- core/views.py | 54 +++--- static/css/custom.css | 79 +++++++- staticfiles/css/custom.css | 90 ++++++++-- 10 files changed, 237 insertions(+), 183 deletions(-) create mode 100644 ai/__pycache__/__init__.cpython-311.pyc create mode 100644 ai/__pycache__/local_ai_api.cpython-311.pyc diff --git a/ai/__pycache__/__init__.cpython-311.pyc b/ai/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bcb2fbacced8a64c23d6a403697ca4fcbf18d9a GIT binary patch literal 404 zcma)(ze__g5XbX=w3XW8>=xX*yf^72LP5n+adGl3Atu*0^}Qq}d9?K(adQ>_0RNAU z@+QH_P3YFi1k~B%_}m@b_wL}H`~5ER_H?u>UVZ!s#jnLb$>zW(kBFlJ@rcJ|RK-PH zB}G!DMOw9rR)lzRjRxt%*#(pujKvdWu#gT6WlqQ`UI;hCZU*?gq^?v`!SHZ|wNc9z zo)}f((>aw>g_+`zeMWxYAZ@yriqUd78fww(F$2^AF<`Zl7MhNM`x>lk_BjL7X?UczE z%G_B^8RS&tga|1dA(>uncaAH?>k>{(&&$K<_R!-iiK6HYjn`=Wj&9cfa}%EN4X0ar Ad;kCd literal 0 HcmV?d00001 diff --git a/ai/__pycache__/local_ai_api.cpython-311.pyc b/ai/__pycache__/local_ai_api.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa9977d8c7f6a3dd70fe97b8027d3793d79129e6 GIT binary patch literal 19874 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 literal 0 HcmV?d00001 diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 1f807fae1897c89361c99c5e868a26d00799b73f..f16a9e15397668f2e269f8b01ac810d9bd6925ab 100644 GIT binary patch delta 86 zcmcc3bccy|IWI340}z}p)yd4A$Xme1nwgi9S~0O{v6;jL1{Cyxje(W3!KFi}BXoxN a1s27NEQ(iH6hAOC@iR4WgJ2O4&>#S12^fk1 delta 85 zcmcb^beoBHIWI340}vcY|CNz7k+*=AB_lsKbz<{kGw}-yDCh$l11o2PONUTL$PBg% ZEbLBc3RU7?Xu0%gQ%kj0iWI5h&{K_Q5#rQ08#}>NjK^=@d-HoA z^X7Scuf4qm!PxOe&1YeR{^UY^glf#wQDAN(0~vya7Wo>ogmh>zBye7|#I&?10WaM| zi?SiiqqzJRH=T@(7!>uXSY?)tq$A8hVBC5{vK*AR0z@E8IMpKDXGpGq9GY_A(RJ&p#(I1CuB4k z%{3iJDozpLa$u zpsU`=Jaqs7Nc_qCxj8VR+I8$K zRfGeWu$(jyQa)Vr#9m{gEJX@DhPiGz_V(p6KG3gMB<)0hUHiGdA`Y1p)RaXlN-f^P5-r6(X{xsaDG$y~T3gK*&T zKF!JNT$oXG1(s!HRRP!xEFd|uwYP|&Lp@bd>g;+VD!m>5ARxESRHG=``*q=~!sc`- za=08hTt(6LRiUc1cFqdh{qb`D*n?cD|3ta}#KxKJzWzJoTgg&iqTH9*IQ2L-ur>U% zREixf$BtH!_~vIqQW+4W-IM zsg3YvxD>^YTRS&KihZL$u9RBG%B^EXY0T}1OZ#PHvgxB^=+|T2CkMobN;9XCrjrN7 zhX-Zg;|lEtlpi%xn!VzvZqlI)y21@Q&W~uOYVkkhCCyyYGG@@`K|}n6o`M~sJjRQr yi8MTW7Wt6A1tR}rb!UJ;-hxm;tv7;C1q~G&X9XQDHqNRvC>*b%{}Vb4{{90WYebO% literal 1364 zcmZ`(&1)M+6ra_{dS%J>I!@|TuH%hUh$T{~CE!96oTjQ1oHkCdQ%ZHHPf-Q6#oP5Eq{V!1Q7#*Ku^61OfEk4%~~s}guETzy!YnKoA>c! z|CpMZL_mL+PRlpL2>m0JfI>sz+l$SscSs^=|k4VB6wxYJ2mwh>6 zP1s6a0Xh0B%Et_88>QrbMYzqB#N#E*3Oks3CUHQODRvA@K~k7$;|6iCE(zZu#bJlk z(8(RJK1WUTVt6pV9fEo^GQIeJgpqaJXHRNMhV;}glZK3tBN^en5Q~o7QAND#(>piA zMx+^HvEUS;@pC3}9#TaPq;a2SxGAxj;0&RP639l>kPjiNqhJ8&1AY_l`WecBvKL`< zK_mp-GGfihA=Gg+ss)BI*;w21yRNY^)~upqm`+Labc(T~)l62_EK-D_XmFxoXUC+( zv9ZH61GA!Od6`C{=(;tt(Wqy1VsquT>;5P-9=l@|nMF#b-iU4DnzqgA7Upvgw;tSE z&pj%9yS|;<+IaYA=m{Nfc9(G8LP76tKq2MQk+Efgahls~zxB^Y15iq2p ze1hU%s@P+67IZo#*hj*3LMINxyUY_2H9@DJWy{3I+3Mq}!>U=li}flaG+QI|spl4T zob~hDF>%eyxOE;8-gFVJ3n+TO18bo->ila}J65%hy4+QlU#ly}>PkmVchz)jqo<`_ z{(P+6Xlpn2)BEXH3$5?^ljojY`z`Y<)5;BG^zo;?`Q?6crISo|lj(kPxtsi=lf2$d zUhiF8=v}zfU%GryZ>QE?g*r>Q?ozJ5xODJS`|4MJebZUI)m^+bn2pWI0|cyf_w9L< zIJbYby>RVisS{uA##h^s)e}e(07x&wM(2TX`E06G0Q9V<>X{|ul?i3g0?%(HPYlgf z1`zb;;Me{qqL;+gPk@~&H*I26ExbmrfGYk1-V {% endif %} {% load static %} + + + + {% block head %}{% endblock %} {% block content %}{% endblock %} + diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..b2437e2 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,51 @@ -{% extends "base.html" %} +{% extends 'base.html' %} +{% load static %} -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% block title %}ExamAid - AI-Powered Study Assistant{% endblock %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+
+

Welcome to ExamAid

+

Your AI-powered study assistant for competitive exams.

-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
-{% endblock %} \ No newline at end of file + + +
+
+
+

Generate MCQs

+

Enter a topic to generate multiple-choice questions with detailed explanations.

+
+ {% csrf_token %} +
+ + +
+ +
+
+
+

Generated Questions

+ {% if mcqs %} + {% for mcq in mcqs %} +
+
{{ mcq.question }}
+
    + {% for option in mcq.options %} +
  • {{ option }}
  • + {% endfor %} +
+
+

Correct Answer: {{ mcq.correct_answer }}

+

Explanation: {{ mcq.explanation }}

+
+
+ {% endfor %} + {% else %} +

No questions generated yet. Use the form to generate some!

+ {% endif %} +
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..8e0d0ae 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,7 @@ from django.urls import path -from .views import home +from .views import index urlpatterns = [ - path("", home, name="home"), + path("", index, name="index"), ] diff --git a/core/views.py b/core/views.py index c9aed12..0bfc355 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,39 @@ -import os -import platform - -from django import get_version as django_version +import json from django.shortcuts import render -from django.utils import timezone +from ai.local_ai_api import LocalAIApi +def index(request): + """Render the landing page and handle MCQ generation.""" + context = {} + if request.method == "POST": + topic = request.POST.get("topic") + if topic: + # This is a simplified example. In a real app, you would have + # more sophisticated error handling and prompt engineering. + response = LocalAIApi.create_response( + { + "input": [ + {'role': 'system', 'content': 'You are an educational content generator. Produce a JSON array of 3 objects, where each object has the following structure: {"question": "...", "options": ["...", "...", "...", "..."], "correct_answer": "...", "explanation": "..."}. The topic is ' + topic + '. Return ONLY valid JSON.'}, {"role": "user", "content": "Generate 3 MCQs about " + topic}, + ], + } + ) -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() + if response.get("success"): + # The AI response might be a string that needs to be parsed as JSON. + # It's important to handle potential JSON parsing errors. + try: + raw_text = LocalAIApi.extract_text(response) + mcqs = json.loads(raw_text) + # Basic validation to ensure we have a list + if isinstance(mcqs, list): + context["mcqs"] = mcqs + else: + context["error"] = "AI returned data in an unexpected format." + except json.JSONDecodeError: + context["error"] = "Failed to parse the response from the AI." + except Exception as e: + context["error"] = f"An unexpected error occurred: {e}" + else: + context["error"] = response.get("error", "An unknown error occurred with the AI service.") - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } return render(request, "core/index.html", context) diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..574ef49 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,77 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +:root { + --bs-primary: #4F46E5; + --bs-secondary: #10B981; + --bs-accent: #F59E0B; + --bs-neutral-light: #F9FAFB; + --bs-neutral-dark: #111827; + --bs-font-sans-serif: "Inter", sans-serif; + --bs-font-monospace: "Poppins", sans-serif; } + +body { + font-family: var(--bs-font-sans-serif); + background-color: var(--bs-neutral-light); + color: var(--bs-neutral-dark); +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--bs-font-monospace); + font-weight: 600; +} + +.btn-primary { + background-color: var(--bs-primary); + border-color: var(--bs-primary); +} + +.btn-primary:hover { + background-color: #4338ca; + border-color: #4338ca; +} + +.btn-secondary { + background-color: var(--bs-secondary); + border-color: var(--bs-secondary); +} + +.btn-secondary:hover { + background-color: #059669; + border-color: #059669; +} + +.bg-gradient-primary { + background: linear-gradient(90deg, var(--bs-primary), var(--bs-secondary)); +} + +.hero-section { + padding: 6rem 0; + color: white; +} + +.question-card { + border: 1px solid #e5e7eb; + border-radius: 0.5rem; + padding: 1.5rem; + margin-bottom: 1.5rem; + background-color: white; +} + +.question-card h5 { + font-weight: 600; +} + +.question-card .options { + list-style-type: none; + padding-left: 0; +} + +.question-card .options li { + padding: 0.5rem 0; +} + +.question-card .explanation { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid #e5e7eb; + font-size: 0.9rem; +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..574ef49 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,77 @@ - :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); + --bs-primary: #4F46E5; + --bs-secondary: #10B981; + --bs-accent: #F59E0B; + --bs-neutral-light: #F9FAFB; + --bs-neutral-dark: #111827; + --bs-font-sans-serif: "Inter", sans-serif; + --bs-font-monospace: "Poppins", sans-serif; } + 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; + font-family: var(--bs-font-sans-serif); + background-color: var(--bs-neutral-light); + color: var(--bs-neutral-dark); } + +h1, h2, h3, h4, h5, h6 { + font-family: var(--bs-font-monospace); + font-weight: 600; +} + +.btn-primary { + background-color: var(--bs-primary); + border-color: var(--bs-primary); +} + +.btn-primary:hover { + background-color: #4338ca; + border-color: #4338ca; +} + +.btn-secondary { + background-color: var(--bs-secondary); + border-color: var(--bs-secondary); +} + +.btn-secondary:hover { + background-color: #059669; + border-color: #059669; +} + +.bg-gradient-primary { + background: linear-gradient(90deg, var(--bs-primary), var(--bs-secondary)); +} + +.hero-section { + padding: 6rem 0; + color: white; +} + +.question-card { + border: 1px solid #e5e7eb; + border-radius: 0.5rem; + padding: 1.5rem; + margin-bottom: 1.5rem; + background-color: white; +} + +.question-card h5 { + font-weight: 600; +} + +.question-card .options { + list-style-type: none; + padding-left: 0; +} + +.question-card .options li { + padding: 0.5rem 0; +} + +.question-card .explanation { + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid #e5e7eb; + font-size: 0.9rem; +} \ No newline at end of file