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

+
+
+
+ Assess Icon +

1. Assess Your Skills

+

Take our AI-powered assessments to identify your strengths, interests, and potential career aptitudes.

+
+
+
+
+ Plan Icon +

2. Plan Your Path

+

Receive a personalized career roadmap with recommended courses, projects, and learning resources.

+
+
+
+
+ Achieve Icon +

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!"

+
Priya S., Successful Software Engineer
+
+
+
+
+
+ +
- -{% 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 %} +

+
+ {% csrf_token %} + {% for field in form %} +
+ + {{ field }} + {% if field.help_text %} +
{{ field.help_text }}
+ {% endif %} + {% if field.errors %} + {% for error in field.errors %} +
{{ error }}
+ {% endfor %} + {% endif %} +
+ {% endfor %} + +
+
+
+
+
+{% 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 @@ + + +