diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc
index cd6f855..af32b26 100644
Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ
diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc
new file mode 100644
index 0000000..99018bf
Binary files /dev/null and b/core/__pycache__/forms.cpython-311.pyc differ
diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc
index 9aa598b..02069c8 100644
Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ
diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc
index 1f807fa..b35138a 100644
Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ
diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc
index 6867ddf..4017f09 100644
Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ
diff --git a/core/admin.py b/core/admin.py
index 8c38f3f..6364bf1 100644
--- a/core/admin.py
+++ b/core/admin.py
@@ -1,3 +1,4 @@
from django.contrib import admin
+from .models import StudentProfile
-# Register your models here.
+admin.site.register(StudentProfile)
diff --git a/core/forms.py b/core/forms.py
new file mode 100644
index 0000000..61c719d
--- /dev/null
+++ b/core/forms.py
@@ -0,0 +1,16 @@
+from django import forms
+from .models import StudentProfile
+
+class StudentProfileForm(forms.ModelForm):
+ class Meta:
+ model = StudentProfile
+ fields = ['education', 'interests', 'aptitude_scores', 'skills',
+ 'resume_id', 'digilocker_id', 'languages',
+ 'consent_for_portfolio', 'career_preferences']
+ widgets = {
+ 'interests': forms.Textarea(attrs={'rows': 3}),
+ 'aptitude_scores': forms.Textarea(attrs={'rows': 3}),
+ 'skills': forms.Textarea(attrs={'rows': 3}),
+ 'languages': forms.Textarea(attrs={'rows': 3}),
+ 'career_preferences': forms.Textarea(attrs={'rows': 3}),
+ }
\ No newline at end of file
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
new file mode 100644
index 0000000..5cfbcdb
--- /dev/null
+++ b/core/migrations/0001_initial.py
@@ -0,0 +1,38 @@
+# Generated by Django 5.2.7 on 2025-12-03 17:18
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Skill',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=255, unique=True)),
+ ('description', models.TextField(blank=True, null=True)),
+ ('proficiency_levels', models.JSONField(blank=True, null=True)),
+ ('related_jobs', models.JSONField(blank=True, null=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='CareerPath',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=255, unique=True)),
+ ('description', models.TextField(blank=True, null=True)),
+ ('typical_roles', models.JSONField(blank=True, null=True)),
+ ('clusters', models.JSONField(blank=True, null=True)),
+ ('salary_range', models.CharField(blank=True, max_length=255, null=True)),
+ ('growth_trends', models.TextField(blank=True, null=True)),
+ ('sample_roadmap_id', models.CharField(blank=True, max_length=255, null=True)),
+ ('required_skills', models.ManyToManyField(related_name='career_paths', to='core.skill')),
+ ],
+ ),
+ ]
diff --git a/core/migrations/0002_studentprofile.py b/core/migrations/0002_studentprofile.py
new file mode 100644
index 0000000..d48248b
--- /dev/null
+++ b/core/migrations/0002_studentprofile.py
@@ -0,0 +1,32 @@
+# Generated by Django 5.2.7 on 2025-12-03 17:20
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('core', '0001_initial'),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='StudentProfile',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('education', models.CharField(blank=True, max_length=255, null=True)),
+ ('interests', models.JSONField(blank=True, null=True)),
+ ('aptitude_scores', models.JSONField(blank=True, null=True)),
+ ('skills', models.JSONField(blank=True, null=True)),
+ ('resume_id', models.CharField(blank=True, max_length=255, null=True)),
+ ('digilocker_id', models.CharField(blank=True, max_length=255, null=True)),
+ ('languages', models.JSONField(blank=True, null=True)),
+ ('consent_for_portfolio', models.BooleanField(default=False)),
+ ('career_preferences', models.JSONField(blank=True, null=True)),
+ ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc
new file mode 100644
index 0000000..62ce9b5
Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ
diff --git a/core/migrations/__pycache__/0002_studentprofile.cpython-311.pyc b/core/migrations/__pycache__/0002_studentprofile.cpython-311.pyc
new file mode 100644
index 0000000..4ac3fdb
Binary files /dev/null and b/core/migrations/__pycache__/0002_studentprofile.cpython-311.pyc differ
diff --git a/core/models.py b/core/models.py
index 71a8362..c0fa65d 100644
--- a/core/models.py
+++ b/core/models.py
@@ -1,3 +1,44 @@
from django.db import models
-# Create your models here.
+class Skill(models.Model):
+ name = models.CharField(max_length=255, unique=True)
+ description = models.TextField(blank=True, null=True)
+ proficiency_levels = models.JSONField(blank=True, null=True) # e.g., ["Beginner", "Intermediate", "Advanced"]
+ related_jobs = models.JSONField(blank=True, null=True) # e.g., ["Software Engineer", "Data Scientist"]
+
+ def __str__(self):
+ return self.name
+
+class CareerPath(models.Model):
+ title = models.CharField(max_length=255, unique=True)
+ description = models.TextField(blank=True, null=True)
+ required_skills = models.ManyToManyField(Skill, related_name='career_paths') # Many-to-Many relationship with Skill
+ typical_roles = models.JSONField(blank=True, null=True) # e.g., ["Junior Developer", "Senior Developer"]
+ clusters = models.JSONField(blank=True, null=True) # e.g., ["Software Development", "AI/ML"]
+ salary_range = models.CharField(max_length=255, blank=True, null=True) # e.g., "$50k - $80k"
+ growth_trends = models.TextField(blank=True, null=True)
+ sample_roadmap_id = models.CharField(max_length=255, blank=True, null=True) # Reference to a roadmap
+
+ def __str__(self):
+ return self.title
+
+
+from django.contrib.auth import get_user_model
+from django.db.models import JSONField # Import JSONField
+
+User = get_user_model()
+
+class StudentProfile(models.Model):
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ education = models.CharField(max_length=255, blank=True, null=True)
+ interests = JSONField(blank=True, null=True)
+ aptitude_scores = JSONField(blank=True, null=True)
+ skills = JSONField(blank=True, null=True)
+ resume_id = models.CharField(max_length=255, blank=True, null=True)
+ digilocker_id = models.CharField(max_length=255, blank=True, null=True)
+ languages = JSONField(blank=True, null=True)
+ consent_for_portfolio = models.BooleanField(default=False)
+ career_preferences = JSONField(blank=True, null=True)
+
+ def __str__(self):
+ return f"Profile for {self.user.username}"
diff --git a/core/templates/base.html b/core/templates/base.html
index 1e7e5fb..b5e5326 100644
--- a/core/templates/base.html
+++ b/core/templates/base.html
@@ -3,7 +3,9 @@
+
{% block title %}Knowledge Base{% endblock %}
+
{% if project_description %}
@@ -19,6 +21,28 @@
+
+
+
{% block content %}{% endblock %}
diff --git a/core/templates/core/career_explorer.html b/core/templates/core/career_explorer.html
new file mode 100644
index 0000000..bcbb939
--- /dev/null
+++ b/core/templates/core/career_explorer.html
@@ -0,0 +1,80 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block title %}Career Explorer - AI Career Advisor{% endblock %}
+
+{% block content %}
+
+
+
Explore Career Paths
+
Discover various career opportunities and the skills required to achieve them.
+
+
+
+
+
+ Available Career Paths
+
+ {% for career_path in career_paths %}
+
+
+
+
{{ career_path.title }}
+
{{ career_path.description }}
+
Required Skills:
+
+ {% for skill in career_path.required_skills.all %}
+ {{ skill.name }}
+ {% endfor %}
+
+ {% if career_path.typical_roles %}
+
Typical Roles:
+
+ {% for role in career_path.typical_roles %}
+ {{ role }}
+ {% endfor %}
+
+ {% endif %}
+ {% if career_path.salary_range %}
+
Salary Range: {{ career_path.salary_range }}
+ {% endif %}
+
+
+
+ {% empty %}
+
+
No career paths available yet.
+
+ {% endfor %}
+
+
+
+
+ Skills Catalog
+
+ {% for skill in skills %}
+
+
+
+
{{ skill.name }}
+
{{ skill.description }}
+ {% if skill.proficiency_levels %}
+
Proficiency Levels:
+
+ {% for level in skill.proficiency_levels %}
+ {{ level }}
+ {% endfor %}
+
+ {% endif %}
+
+
+
+ {% empty %}
+
+
No skills available yet.
+
+ {% endfor %}
+
+
+
+{% endblock %}
diff --git a/core/templates/core/index.html b/core/templates/core/index.html
index faec813..32e2d86 100644
--- a/core/templates/core/index.html
+++ b/core/templates/core/index.html
@@ -1,145 +1,88 @@
-{% extends "base.html" %}
+{% extends 'base.html' %}
+{% load static %}
-{% block title %}{{ project_name }}{% endblock %}
-
-{% block head %}
-
-
-
-
-{% endblock %}
+{% block title %}AI Career Advisor{% endblock %}
{% block content %}
-
-
Analyzing your requirements and generating your app…
-
- Loading…
-
-
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" }}
-
-
+
+
+
Unlock Your Potential with AI Career Advisor
+
Get personalized career path recommendations, skill development roadmaps, and job matching powered by advanced AI.
+
Start Your Assessment
+
+
+
+
+
+
How It Works
+
+
+
+
+
1. Assess Your Skills
+
Take our AI-powered assessments to identify your strengths, interests, and potential career aptitudes.
+
+
+
+
+
+
2. Plan Your Path
+
Receive a personalized career roadmap with recommended courses, projects, and learning resources.
+
+
+
+
+
+
3. Achieve Your Goals
+
Track your progress, earn certifications, and get matched with relevant job and internship opportunities.
+
+
+
+
+
+
+
+
+
Success Stories
+
+
+
+ "The AI Career Advisor helped me discover my true calling and provided a clear path to achieve my dreams. I'm now pursuing a career I'm passionate about!"
+
+
+
+
+
+
+
+
+
+
Featured Career Paths
+
+
+
+
Data Scientist
+
Leverage data to solve complex problems and drive business decisions.
+
Explore Path
+
+
+
+
+
AI/ML Engineer
+
Build intelligent systems and algorithms that learn and adapt.
+
Explore Path
+
+
+
+
+
Full-Stack Developer
+
Develop both front-end and back-end components of web applications.
+
Explore Path
+
+
+
+
+
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC)
-
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/core/templates/core/student_profile_form.html b/core/templates/core/student_profile_form.html
new file mode 100644
index 0000000..f737bf3
--- /dev/null
+++ b/core/templates/core/student_profile_form.html
@@ -0,0 +1,34 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block content %}
+
+
+
+
+
+ {% if student_profile %}Edit Your Profile{% else %}Create Your Profile{% endif %}
+
+
+
+
+
+
+{% endblock content %}
diff --git a/core/urls.py b/core/urls.py
index 6299e3d..e173805 100644
--- a/core/urls.py
+++ b/core/urls.py
@@ -1,7 +1,8 @@
from django.urls import path
-from .views import home
-
+from .views import home, career_explorer_view, student_profile_view
urlpatterns = [
path("", home, name="home"),
+ path("explore/", career_explorer_view, name="career_explorer"), # New URL pattern
+ path("profile/", student_profile_view, name="student_profile"),
]
diff --git a/core/views.py b/core/views.py
index c9aed12..ccbc6bf 100644
--- a/core/views.py
+++ b/core/views.py
@@ -4,6 +4,7 @@ import platform
from django import get_version as django_version
from django.shortcuts import render
from django.utils import timezone
+from .models import CareerPath, Skill # Import the new models
def home(request):
@@ -23,3 +24,43 @@ def home(request):
"project_image_url": os.getenv("PROJECT_IMAGE_URL", ""),
}
return render(request, "core/index.html", context)
+
+def career_explorer_view(request):
+ """Render the career explorer page with all career paths and skills."""
+ career_paths = CareerPath.objects.all().prefetch_related('required_skills')
+ skills = Skill.objects.all()
+ context = {
+ 'career_paths': career_paths,
+ 'skills': skills,
+ }
+ return render(request, 'core/career_explorer.html', context)
+
+
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import redirect
+from .forms import StudentProfileForm
+from .models import StudentProfile
+
+
+@login_required
+def student_profile_view(request):
+ try:
+ student_profile = request.user.studentprofile
+ except StudentProfile.DoesNotExist:
+ student_profile = None
+
+ if request.method == 'POST':
+ form = StudentProfileForm(request.POST, instance=student_profile)
+ if form.is_valid():
+ profile = form.save(commit=False)
+ profile.user = request.user
+ profile.save()
+ return redirect('student_profile') # Redirect to the same page or a success page
+ else:
+ form = StudentProfileForm(instance=student_profile)
+
+ context = {
+ 'form': form,
+ 'student_profile': student_profile
+ }
+ return render(request, 'core/student_profile_form.html', context)
diff --git a/static/css/custom.css b/static/css/custom.css
index 925f6ed..ff6e6a9 100644
--- a/static/css/custom.css
+++ b/static/css/custom.css
@@ -1,4 +1,53 @@
-/* Custom styles for the application */
-body {
- font-family: system-ui, -apple-system, sans-serif;
+:root {
+ --primary-color: #0A2540;
+ --secondary-color: #FFFFFF;
+ --accent-color: #30C59B;
+ --background-color: #F6F9FC;
+ --text-color: #333333;
}
+
+body {
+ font-family: 'Lato', sans-serif;
+ color: var(--text-color);
+ background-color: var(--background-color);
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: 'Poppins', sans-serif;
+ color: var(--primary-color);
+}
+
+/* Basic styling for the hero section to be implemented in index.html */
+.hero-section {
+ background: linear-gradient(180deg, var(--primary-color) 0%, #1A3E62 100%);
+ color: var(--secondary-color);
+ padding: 100px 0;
+ text-align: center;
+}
+
+.hero-section h1 {
+ font-family: 'Poppins', sans-serif;
+ color: var(--secondary-color);
+ font-size: 3.5rem;
+ margin-bottom: 20px;
+}
+
+.hero-section p {
+ font-size: 1.25rem;
+ margin-bottom: 30px;
+}
+
+.hero-button {
+ background-color: var(--accent-color);
+ color: var(--secondary-color);
+ padding: 15px 30px;
+ border-radius: 5px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.1rem;
+ transition: background-color 0.3s ease;
+}
+
+.hero-button:hover {
+ background-color: #28a77f; /* Slightly darker accent for hover */
+}
\ No newline at end of file
diff --git a/static/images/icon-achieve.svg b/static/images/icon-achieve.svg
new file mode 100644
index 0000000..aae2f1f
--- /dev/null
+++ b/static/images/icon-achieve.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/static/images/icon-assess.svg b/static/images/icon-assess.svg
new file mode 100644
index 0000000..0e01dd0
--- /dev/null
+++ b/static/images/icon-assess.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/static/images/icon-plan.svg b/static/images/icon-plan.svg
new file mode 100644
index 0000000..b6d4433
--- /dev/null
+++ b/static/images/icon-plan.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css
index 108056f..ff6e6a9 100644
--- a/staticfiles/css/custom.css
+++ b/staticfiles/css/custom.css
@@ -1,21 +1,53 @@
-
: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);
+ --primary-color: #0A2540;
+ --secondary-color: #FFFFFF;
+ --accent-color: #30C59B;
+ --background-color: #F6F9FC;
+ --text-color: #333333;
}
+
body {
- margin: 0;
- font-family: 'Inter', sans-serif;
- background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end));
+ font-family: 'Lato', sans-serif;
color: var(--text-color);
- display: flex;
- justify-content: center;
- align-items: center;
- min-height: 100vh;
- text-align: center;
- overflow: hidden;
- position: relative;
+ background-color: var(--background-color);
}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: 'Poppins', sans-serif;
+ color: var(--primary-color);
+}
+
+/* Basic styling for the hero section to be implemented in index.html */
+.hero-section {
+ background: linear-gradient(180deg, var(--primary-color) 0%, #1A3E62 100%);
+ color: var(--secondary-color);
+ padding: 100px 0;
+ text-align: center;
+}
+
+.hero-section h1 {
+ font-family: 'Poppins', sans-serif;
+ color: var(--secondary-color);
+ font-size: 3.5rem;
+ margin-bottom: 20px;
+}
+
+.hero-section p {
+ font-size: 1.25rem;
+ margin-bottom: 30px;
+}
+
+.hero-button {
+ background-color: var(--accent-color);
+ color: var(--secondary-color);
+ padding: 15px 30px;
+ border-radius: 5px;
+ text-decoration: none;
+ font-weight: bold;
+ font-size: 1.1rem;
+ transition: background-color 0.3s ease;
+}
+
+.hero-button:hover {
+ background-color: #28a77f; /* Slightly darker accent for hover */
+}
\ No newline at end of file
diff --git a/staticfiles/images/icon-achieve.svg b/staticfiles/images/icon-achieve.svg
new file mode 100644
index 0000000..aae2f1f
--- /dev/null
+++ b/staticfiles/images/icon-achieve.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/staticfiles/images/icon-assess.svg b/staticfiles/images/icon-assess.svg
new file mode 100644
index 0000000..0e01dd0
--- /dev/null
+++ b/staticfiles/images/icon-assess.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/staticfiles/images/icon-plan.svg b/staticfiles/images/icon-plan.svg
new file mode 100644
index 0000000..b6d4433
--- /dev/null
+++ b/staticfiles/images/icon-plan.svg
@@ -0,0 +1,3 @@
+
+
+