From d1a1176ea8ada5910d7c05381a750d0928d249e6 Mon Sep 17 00:00:00 2001 From: Faheed Date: Wed, 24 Dec 2025 19:03:23 +0300 Subject: [PATCH] new update --- recruitment/views.py | 10 +- templates/applicant/applicant_profile.html | 422 ----------- .../applicant/application_submit_form.html | 674 ++++-------------- templates/applicant/career.html | 568 ++++++++------- .../applicant/job_application_detail.html | 477 +++++++------ .../partials/candidate_facing_base copy.html | 485 +++++++++++++ .../partials/candidate_facing_base.html | 657 ++++++----------- templates/interviews/interview_detail.html | 32 +- templates/jobs/application_success.html | 288 +++----- templates/recruitment/applicant_signup.html | 480 +++++++------ 10 files changed, 1831 insertions(+), 2262 deletions(-) delete mode 100644 templates/applicant/applicant_profile.html create mode 100644 templates/applicant/partials/candidate_facing_base copy.html diff --git a/recruitment/views.py b/recruitment/views.py index 5951654..590dafb 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -721,6 +721,8 @@ def kaauh_career(request): selected_job_type = request.GET.get("employment_type", "") + + job_type_keys = ( active_jobs.order_by("job_type") .distinct("job_type") @@ -739,6 +741,10 @@ def kaauh_career(request): if selected_workplace_type and selected_workplace_type in workplace_type_keys: active_jobs = active_jobs.filter(workplace_type=selected_workplace_type) + search_query=request.GET.get("q","") + if search_query: + active_jobs=active_jobs.filter(title__icontains=search_query) + JOBS_PER_PAGE = 10 paginator = Paginator(active_jobs, JOBS_PER_PAGE) page_number = request.GET.get("page", 1) @@ -763,6 +769,7 @@ def kaauh_career(request): "department_type_keys": department_type_keys, "total_open_roles": total_open_roles, "page_obj": page_obj, + "q":search_query }, ) @@ -1346,7 +1353,7 @@ def application_submit_form(request, slug): return render( request, "applicant/application_submit_form.html", - {"template_slug": job.form_template.slug,"job_slug": job.slug, "job_id": job.internal_job_id}, + {"template_slug": job.form_template.slug,"job_slug": job.slug, "job_id": job.internal_job_id,"job":job}, ) @@ -3047,6 +3054,7 @@ def portal_login(request): @login_required @candidate_user_required def applicant_portal_dashboard(request): + """applicant portal dashboard""" if not request.user.is_authenticated: return redirect("account_login") diff --git a/templates/applicant/applicant_profile.html b/templates/applicant/applicant_profile.html deleted file mode 100644 index 9bb43cd..0000000 --- a/templates/applicant/applicant_profile.html +++ /dev/null @@ -1,422 +0,0 @@ -{% extends 'applicant/partials/candidate_facing_base.html'%} -{% load static i18n %} - - -{% block title %}{% trans "My Dashboard" %} - {{ block.super }}{% endblock %} - -{% block customCSS %} - -{% endblock %} - -{% block content %} -
- - {# Header: Larger, more dynamic on large screens. Stacks cleanly on mobile. #} -
-

- {% trans "Your Candidate Dashboard" %} -

- - {% trans "Update Profile" %} - -
- - {# Candidate Quick Overview Card: Use a softer background color #} -
-
- {% trans 'Profile Picture' %} -
-

{{ candidate.name|default:"Candidate Name" }}

-

{{ candidate.email }}

-
-
-
- - {# ================================================= #} - {# MAIN TABBED INTERFACE #} - {# ================================================= #} -
- - {# Tab Navigation: Used nav-scroll for responsiveness #} - - - {# Tab Content #} -
- -
-

{% trans "Personal Information" %}

-
    -
  • -
    {% trans "Phone" %}
    - {{ candidate.phone|default:"N/A" }} -
  • -
  • -
    {% trans "Nationality" %}
    - {{ candidate.get_nationality_display|default:"N/A" }} -
  • -
  • -
    {% trans "Date of Birth" %}
    - {{ candidate.date_of_birth|date:"M d, Y"|default:"N/A" }} -
  • -
  • {% trans "Use the 'Update Profile' button above to edit these details." %}
  • -
- -
- -

{% trans "Quick Actions" %}

- -
- -
-

{% trans "Application Tracking" %}

- - {% if applications %} -
- - - - - - - - - - - - {% for application in applications %} - - - - - - - - {% endfor %} - -
{% trans "Job Title" %}{% trans "Applied On" %}{% trans "Current Stage" %}{% trans "Status" %}{% trans "Action" %}
- - {{ application.job.title }} - - {{ application.applied_date|date:"d M Y" }} - - {{ application.stage }} - - - {% if application.is_active %} - {% trans "Active" %} - {% else %} - {% trans "Closed" %} - {% endif %} - - - {% trans "Details" %} - -
-
- - {% else %} -
- -
{% trans "You haven't submitted any applications yet." %}
- - {% trans "View Available Jobs" %} - -
- {% endif %} -
- -
-

{% trans "My Uploaded Documents" %}

- -

{% trans "You can upload and manage your resume, certificates, and professional documents here. These documents will be attached to your applications." %}

- - - {% trans "Upload New Document" %} - - -
- - {# Example Document List (Refined structure) #} -
    -
  • -
    - **{% trans "Resume" %}** (CV\_John\_Doe\_2024.pdf) -
    -
    - {% trans "Uploaded: 10 Jan 2024" %} - - -
    -
  • -
  • -
    - **{% trans "Medical Certificate" %}** (Cert\_KSA\_MED.jpg) -
    -
    - {% trans "Uploaded: 22 Feb 2023" %} - - -
    -
  • -
- -
- -
-

{% trans "Security & Preferences" %}

- -
-
-
-
{% trans "Password Security" %}
-

{% trans "Update your password regularly to keep your account secure." %}

- - {% trans "Change Password" %} - -
-
-
-
-
{% trans "Email Preferences" %}
-

{% trans "Manage subscriptions and job alert settings." %}

- - {% trans "Manage Alerts" %} - -
-
-
- -
- {% trans "To delete your profile, please contact HR support." %} -
-
- -
-
- {# ================================================= #} - - -
-{% endblock %} \ No newline at end of file diff --git a/templates/applicant/application_submit_form.html b/templates/applicant/application_submit_form.html index e794788..84efafd 100644 --- a/templates/applicant/application_submit_form.html +++ b/templates/applicant/application_submit_form.html @@ -1,541 +1,149 @@ -{% extends 'applicant/partials/candidate_facing_base.html'%} - +{% extends 'applicant/partials/candidate_facing_base.html' %} {% load static i18n %} +{% block title %}{% trans "Career Application Form" %} | KAAUH{% endblock %} {% block content %} - - - - -
-
-
-
-
- -
- -
1 of 1
-
- -
-
- - -
- - + --kaauh-teal: #00636e; + --kaauh-teal-dark: #004a53; + --kaauh-teal-light: #f0f7f8; + --error-red: #e74c3c; + --border-color: #e2e8f0; + --text-dark: #2d3436; + --text-muted: #636e72; + --shadow: 0 10px 25px rgba(0, 0, 0, 0.08); + --radius: 12px; + } + + /* 2. GLOSSY NAVBAR */ + #bottomNavbar { + top: 0; + background: rgba(0, 99, 110, 0.85) !important; + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + z-index: 1030; + } + + /* 3. WIZARD CONTAINER */ + .page-content-wrapper { + display: flex; + justify-content: center; + padding: 40px 20px; + min-height: calc(100vh - 56px); + } + + .wizard-container { + width: 100%; + max-width: 850px; + background: #ffffff; + border-radius: 24px; + + display: flex; + flex-direction: column; + overflow: hidden; + animation: slideIn 0.5s ease-out; + } + + @keyframes slideIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } + + .progress-container { height: 6px; background: #f1f5f9; } + .progress-bar { height: 100%; background: var(--kaauh-teal); transition: width 0.6s ease; width: 0%; } + + .wizard-header { padding: 30px 40px 10px; display: flex; justify-content: space-between; align-items: center; } + .logo { font-size: 1.3rem; font-weight: 800; color: var(--secondary); display: flex; align-items: center; gap: 10px; } + .progress-text { background: #e6f0f1; color: var(--kaauh-teal); padding: 4px 12px; border-radius: 20px; font-size: 0.85rem; font-weight: 700; } + + /* 4. CONTENT & DYNAMIC FIELDS */ + .wizard-content { padding: 10px 40px 30px; flex: 1; display: flex; flex-direction: column; overflow: hidden; } + .stage-container { flex: 1; overflow-y: auto; padding-right: 10px; } + .stage-title { font-size: 1.8rem; font-weight: 800; color: var(--text-main); margin-bottom: 25px; } + + /* Field Styles (Used by JS) */ + .field-container { margin-bottom: 24px; animation: fadeIn 0.3s ease; } + @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } + + .field-label { display: block; font-weight: 700; color: var(--text-main); margin-bottom: 8px; font-size: 0.95rem; } + .required-indicator { color: var(--error); } + + .form-input { + width: 100%; padding: 12px 16px; border: 2px solid var(--border-color); + border-radius: 12px; font-size: 1rem; background: var(--bg-light); transition: var(--transition); + } + .form-input:focus { outline: none; border-color: var(--primary); background: #fff; box-shadow: 0 0 0 4px rgba(0, 99, 110, 0.1); } + .form-input.error { border-color: var(--error); background: #fff1f2; } + + .error-message { color: var(--error); font-size: 0.85rem; font-weight: 600; margin-top: 6px; display: none; } + .error-message.show { display: block; } + + /* Options & File Upload */ + .option-item { + display: flex; align-items: center; padding: 12px 16px; border: 2px solid var(--border-color); + border-radius: 12px; margin-bottom: 10px; cursor: pointer; transition: var(--transition); font-weight: 600; + } + .option-item:hover { border-color: var(--primary); background: #f0f9fa; } + .option-item input { margin-right: 12px; width: 18px; height: 18px; accent-color: var(--primary); } + + .file-upload-area { + border: 2px dashed #cbd5e1; border-radius: 16px; padding: 30px; + text-align: center; background: var(--bg-light); cursor: pointer; transition: var(--transition); + } + .file-upload-area:hover { border-color: var(--primary); background: #e6f0f1; } + .file-upload-icon { font-size: 2rem; color: var(--primary); margin-bottom: 10px; } + + .uploaded-file { + display: flex; align-items: center; justify-content: space-between; background: white; + border: 1px solid var(--border-color); padding: 12px; border-radius: 12px; margin-top: 10px; + } + + /* 5. FOOTER & BUTTONS */ + .wizard-footer { padding: 20px 40px 40px; display: flex; justify-content: space-between; border-top: 1px solid #f1f5f9; } + .nav-btn { padding: 12px 28px; border-radius: 50px; font-weight: 700; border: none; cursor: pointer; display: flex; align-items: center; gap: 8px; transition: var(--transition); } + .btn-back { background: #f1f5f9; color: var(--text-muted); } + .btn-next { background: var(--kaauh-teal); color: white; box-shadow: 0 10px 15px -3px rgba(0, 99, 110, 0.3); } + .btn-submit { background: var(--kaauh-teal); color: white; box-shadow: 0 10px 15px -3px rgba(16, 185, 129, 0.3); } + .nav-btn:hover { transform: translateY(-2px); filter: brightness(1.1); } + + @media (max-width: 600px) { .wizard-container { border-radius: 0; max-height: 100vh; } } + + #confirmationNavbar { + background-color: var(--kaauh-teal); + padding: 12px 20px; + color:white; + } + + + +
+
+ + {{job.title}}   {{job_id}} + +
+
+ +
+
+
+
+ +
1 of 1
+
+
+
+
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/templates/applicant/job_application_detail.html b/templates/applicant/job_application_detail.html index e1defc0..9411852 100644 --- a/templates/applicant/job_application_detail.html +++ b/templates/applicant/job_application_detail.html @@ -1,229 +1,294 @@ {% extends 'applicant/partials/candidate_facing_base.html' %} {% load static i18n %} + {% block title %}{% trans "Application" %}-{{ job.title }}{% endblock %} + {% block content %} + + + + +
+
+
+
+

+ {{ job.title }} +

+
+ +
+

+ {% trans "Summary" %} +

+ +
+ {% if job.salary_range %} +
+ + {% trans "Salary:" %} {{ job.salary_range }}
-
-

{% trans "Review the full job details below before submitting your application." %}

+ {% endif %} - {% if job.form_template %} - {% if user.is_authenticated and already_applied %} - - {% else %} - - {% trans "Apply for this Position" %} - - {% endif %} - {% endif %} - {% comment %} - {% trans "Apply for this Position" %} - - {% elif not job.is_expired %} -

{% trans "Application form is unavailable." %}

- {% endif %} {% endcomment %} +
+ + {% trans "Deadline:" %} + {% if job.application_deadline %} + {{ job.application_deadline|date:"M d, Y" }} + {% if job.is_expired %}(EXPIRED){% endif %} + {% else %}{% trans "Ongoing" %}{% endif %}
-
-
- {# 📝 LEFT COLUMN: Job Details #} -
-
+
+ + {% trans "Type:" %} {{ job.get_job_type_display }} +
- {# Job Title Header #} -
-

{{ job.title }}

-
+
+ + {% trans "Location:" %} {{ job.get_location_display }} +
-
+
+ + {% trans "Department:" %} {{ job.department|default:"N/A" }} +
-

{% trans "Summary" %}

- - {# Job Metadata/Overview Grid #} -
- - {# SALARY #} - {% if job.salary_range %} -
- - {% trans "Salary:" %} - {{ job.salary_range }} -
- {% endif %} - - {# DEADLINE #} -
- - {% trans "Deadline:" %} - {% if job.application_deadline %} - - {% if job.is_expired %} - {% trans "EXPIRED" %} - {% endif %} - {% else %} - {% trans "Ongoing" %} - {% endif %} -
- - {# JOB TYPE #} -
- - {% trans "Job Type:" %} {{ job.get_job_type_display }} -
- - {# LOCATION #} -
- - {% trans "Location:" %} {{ job.get_location_display }} -
- - {# DEPARTMENT #} -
- - {% trans "Department:" %} {{ job.department|default:"N/A" }} -
- - {# JOB ID #} -
- - {% trans "JOB ID:" %} {{ job.internal_job_id|default:"N/A" }} -
- - {# WORKPLACE TYPE #} -
- - {% trans "Workplace:" %} {{ job.get_workplace_type_display }} -
- -
- - {# Detailed Accordion Section #} -
- - {% with active_collapse="collapseOne" %} - - {# JOB DESCRIPTION #} - {% if job.has_description_content %} -
-

- -

-
-
-
{{ job.description|safe }}
-
-
-
- {% endif %} - - {# QUALIFICATIONS #} - {% if job.has_qualifications_content %} -
-

- -

-
-
-
{{ job.qualifications|safe }}
-
-
-
- {% endif %} - - {# BENEFITS #} - {% if job.has_benefits_content %} -
-

- -

-
-
-
{{ job.benefits|safe }}
-
-
-
- {% endif %} - - {# APPLICATION INSTRUCTIONS #} - {% if job.has_application_instructions_content %} -
-

- -

-
-
-
{{ job.application_instructions|safe }}
-
-
-
- {% endif %} - - {% endwith %} +
+ + {% trans "ID:" %} {{ job.internal_job_id|default:"N/A" }} +
+ +
+ + {% if job.has_description_content %} +
+ + +
+
{{ job.description|safe }}
-
+ {% endif %} + + {% if job.has_qualifications_content %} +
+ + +
+
{{ job.qualifications|safe }}
+
+
+ {% endif %} + +
+
+ + + +
+ +
- {# 📱 MOBILE FIXED APPLY BAR (Replaced inline style with utility classes) #} - {% if job.form_template %} - +{% if job.form_template %} +
+ {% if user.is_authenticated and already_applied %} + + {% else %} + {% trans "Apply for this Position" %} {% endif %} -{% endblock content%} \ No newline at end of file +
+{% endif %} + +{% endblock %} \ No newline at end of file diff --git a/templates/applicant/partials/candidate_facing_base copy.html b/templates/applicant/partials/candidate_facing_base copy.html new file mode 100644 index 0000000..4afb4c4 --- /dev/null +++ b/templates/applicant/partials/candidate_facing_base copy.html @@ -0,0 +1,485 @@ +{% load static i18n %} +{% get_current_language as LANGUAGE_CODE %} +{% get_available_languages as LANGUAGES %} +{% get_language_info_list for LANGUAGES as language_info_list %} + + + + + + + {% trans "Careers" %} - {% block title %}{% trans "Application Form" %}{% endblock %} + + + + + + + {% comment %} Load the correct Bootstrap CSS file for RTL/LTR {% endcomment %} + {% if LANGUAGE_CODE == 'ar' %} + + {% else %} + + {% endif %} + + + + + + + + +{% if messages %} +
+
+ {# Use responsive columns matching the main content block for alignment #} +
+ {% for message in messages %} + + {% endfor %} +
+
+
+ {% endif %} + + {# ================================================= #} + {# DJANGO MESSAGE BLOCK - Placed directly below the main navbar #} + {# ================================================= #} + + {# ================================================= #} + + + + {% block content %} + + + {% endblock content %} + + + + +{% block customJS %} +{% endblock %} + + diff --git a/templates/applicant/partials/candidate_facing_base.html b/templates/applicant/partials/candidate_facing_base.html index 4afb4c4..463e40b 100644 --- a/templates/applicant/partials/candidate_facing_base.html +++ b/templates/applicant/partials/candidate_facing_base.html @@ -1,7 +1,5 @@ {% load static i18n %} {% get_current_language as LANGUAGE_CODE %} -{% get_available_languages as LANGUAGES %} -{% get_language_info_list for LANGUAGES as language_info_list %} @@ -9,477 +7,284 @@ {% trans "Careers" %} - {% block title %}{% trans "Application Form" %}{% endblock %} - - - - + + - - {% comment %} Load the correct Bootstrap CSS file for RTL/LTR {% endcomment %} - {% if LANGUAGE_CODE == 'ar' %} - - {% else %} - - {% endif %} - - - - -{% if messages %} -
-
- {# Use responsive columns matching the main content block for alignment #} -
- {% for message in messages %} - -
+ {% endif %} +
+ + + {% if messages %} +
+ {% for message in messages %} +
+
+ + {{ message }} +
+ +
+ {% endfor %}
{% endif %} - {# ================================================= #} - {# DJANGO MESSAGE BLOCK - Placed directly below the main navbar #} - {# ================================================= #} +
+ {% block content %}{% endblock %} +
- {# ================================================= #} + - - {% block content %} - - - {% endblock content %} - - - - -{% block customJS %} -{% endblock %} + {% block customJS %}{% endblock %} - + \ No newline at end of file diff --git a/templates/interviews/interview_detail.html b/templates/interviews/interview_detail.html index cc9e760..2a73aac 100644 --- a/templates/interviews/interview_detail.html +++ b/templates/interviews/interview_detail.html @@ -537,10 +537,10 @@
  • -
    + {% csrf_token %} -
  • @@ -1089,33 +1089,7 @@ async function copyJoinUrl(){ } } -document.addEventListener('DOMContentLoaded', function() { - const aiForm = document.getElementById('aiGenForm'); - const aiBtn = document.getElementById('aiGenBtn'); - const aiMainToggle = document.getElementById('aiDropdown'); - if (aiForm) { - aiForm.addEventListener('submit', function() { - // 1. Disable the button to prevent multiple requests - aiBtn.disabled = true; - - // 2. Change the inner HTML to show a spinner - aiBtn.innerHTML = ` - - {% trans "Generating..." %} - `; - - // 3. Update the main visible toggle button to show loading state too - if (aiMainToggle) { - aiMainToggle.classList.add('disabled'); - aiMainToggle.innerHTML = ` - - {% trans "AI Working..." %} - `; - } - }); - } -}); {% endblock %} diff --git a/templates/jobs/application_success.html b/templates/jobs/application_success.html index 2a0699f..4a09dcc 100644 --- a/templates/jobs/application_success.html +++ b/templates/jobs/application_success.html @@ -1,201 +1,133 @@ +{% extends 'applicant/partials/candidate_facing_base.html' %} {% load static i18n %} - - - - - - {% trans "Application Submitted - Thank You" %} - - - - - - - - - - -
    -
    - -
    -
    -
    - - {# SUCCESS ICON #} -
    - - - -
    - -

    {% translate "Thank You!" %}

    -

    {% trans "Your application has been submitted successfully" %}

    - - {% comment %} {# JOB INFO BLOCK #} -
    -

    {% trans "Position" %}: {{ job.title }}

    -

    {% trans "Job ID" %}: {{ job.internal_job_id }}

    -

    {% trans "Department" %}: {{ job.department|default:"Not specified" }}

    - {% if job.application_deadline %} -

    {% trans "Application Deadline" %}: {{ job.application_deadline|date:"F j, Y" }}

    - {% endif %} -
    {% endcomment %} - -

    - {% trans "We appreciate your interest in joining our team. Our hiring team will review your application and contact you if there's a potential match for this position." %} -

    - -
    - - {% trans "Return to Job Listings" %} - - {# You can add a link to view the saved application here if applicable #} - {% comment %} View Job Details {% endcomment %} -
    -
    -
    -
    - -
    -
    - - - \ No newline at end of file +
    +
    + + {% trans "Submission Complete" %} + +
    +
    + +
    +
    + +
    + + + +
    + +

    {% trans "Thank You!" %}

    +

    + {% trans "Your application has been received." %} +

    + +

    + {% trans "We appreciate your interest in KAAUH. Our recruitment team will review your qualifications and contact you if you are shortlisted for an interview." %} +

    + + + + +
    +
    + +{% endblock content %} \ No newline at end of file diff --git a/templates/recruitment/applicant_signup.html b/templates/recruitment/applicant_signup.html index c655b8b..6faa046 100644 --- a/templates/recruitment/applicant_signup.html +++ b/templates/recruitment/applicant_signup.html @@ -1,244 +1,278 @@ {% extends 'applicant/partials/candidate_facing_base.html' %} -{% load i18n crispy_forms_tags %} -{% load widget_tweaks %} +{% load i18n %} {% block title %}{% trans "Create Account" %}{% endblock %} {% block content %} -
    -
    -
    -
    -
    -

    - - {% trans "Create Account" %} -

    -
    -
    - {% if messages %} - {% for message in messages %} - - {% endfor %} +
    +
    +
    +

    {% trans "Create Account" %}

    +
    + +
    + {% if messages %} + {% for message in messages %} +
    + {{ message }} +
    + {% endfor %} + {% endif %} + +
    + {% csrf_token %} + +
    +
    + + {{ form.first_name }} + {% if form.first_name.errors %}
    {{ form.first_name.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.middle_name }} + {% if form.middle_name.errors %}
    {{ form.middle_name.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.last_name }} + {% if form.last_name.errors %}
    {{ form.last_name.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.email }} + {% if form.email.errors %}
    {{ form.email.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.phone }} + {% if form.phone.errors %}
    {{ form.phone.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.gpa }} + {% if form.gpa.errors %}
    {{ form.gpa.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.national_id }} + {% if form.national_id.errors %}
    {{ form.national_id.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.nationality }} + {% if form.nationality.errors %}
    {{ form.nationality.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.gender }} + {% if form.gender.errors %}
    {{ form.gender.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.password }} + {% if form.password.errors %}
    {{ form.password.errors.0 }}
    {% endif %} +
    + +
    + + {{ form.confirm_password }} + {% if form.confirm_password.errors %}
    {{ form.confirm_password.errors.0 }}
    {% endif %} +
    + + {% if form.non_field_errors %} +
    +
    + {% for error in form.non_field_errors %}{{ error }}{% endfor %} +
    +
    {% endif %} - - {% csrf_token %} - -
    -
    - - {{ form.first_name }} - {% if form.first_name.errors %} -
    - {{ form.first_name.errors.0 }} -
    - {% endif %} -
    - -
    - - {{ form.middle_name }} - {% if form.middle_name.errors %} -
    - {{ form.middle_name.errors.0 }} -
    - {% endif %} -
    - -
    - - {{ form.last_name }} - {% if form.last_name.errors %} -
    - {{ form.last_name.errors.0 }} -
    - {% endif %} -
    -
    -
    - -
    - - {{ form.email }} - {% if form.email.errors %} -
    - {{ form.email.errors.0 }} -
    - {% endif %} -
    -
    - - {{ form.phone }} - {% if form.phone.errors %} -
    - {{ form.phone.errors.0 }} -
    - {% endif %} -
    -
    - - -
    -
    - - {{ form.gpa|add_class:"form-control" }} - {% if form.gpa.errors %} -
    - {{ form.gpa.errors.0 }} -
    - {% endif %} -
    - -
    - - {{ form.national_id }} - {% if form.national_id.errors %} -
    - {{ form.national_id.errors.0 }} -
    - {% endif %} -
    - - -
    -
    - - {{ form.nationality }} - {% if form.nationality.errors %} -
    - {{ form.nationality.errors.0 }} -
    - {% endif %} -
    - -
    - - {{ form.gender }} - {% if form.gender.errors %} -
    - {{ form.gender.errors.0 }} -
    - {% endif %} -
    -
    - -
    -
    - - {{ form.password }} - {% if form.password.errors %} -
    - {{ form.password.errors.0 }} -
    - {% endif %} -
    - -
    - - {{ form.confirm_password }} - {% if form.confirm_password.errors %} -
    - {{ form.confirm_password.errors.0 }} -
    - {% endif %} -
    -
    - - {% if form.non_field_errors %} -
    - {% for error in form.non_field_errors %} - {{ error }} - {% endfor %} -
    - {% endif %} - -
    - -
    - - -
    - + +
    -
    +
    -{% endblock %} +{% endblock %} \ No newline at end of file