updates and fixes
This commit is contained in:
parent
7d9b200536
commit
bd0baa900e
@ -62,7 +62,7 @@ INSTALLED_APPS = [
|
||||
"django_q",
|
||||
"widget_tweaks",
|
||||
"easyaudit",
|
||||
"mathfilters"
|
||||
# "mathfilters"
|
||||
]
|
||||
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# Generated by Django 6.0 on 2025-12-08 10:22
|
||||
# Generated by Django 6.0 on 2025-12-10 11:08
|
||||
|
||||
import django.contrib.auth.models
|
||||
import django.contrib.auth.validators
|
||||
@ -73,6 +73,8 @@ class Migration(migrations.Migration):
|
||||
('start_time', models.DateTimeField(db_index=True, verbose_name='Start Time')),
|
||||
('duration', models.PositiveIntegerField(verbose_name='Duration (minutes)')),
|
||||
('status', models.CharField(choices=[('waiting', 'Waiting'), ('started', 'Started'), ('ended', 'Ended'), ('cancelled', 'Cancelled')], db_index=True, default='waiting', max_length=20)),
|
||||
('cancelled_at', models.DateTimeField(blank=True, null=True, verbose_name='Cancelled At')),
|
||||
('cancelled_reason', models.TextField(blank=True, null=True, verbose_name='Cancellation Reason')),
|
||||
('meeting_id', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='External Meeting ID')),
|
||||
('password', models.CharField(blank=True, max_length=20, null=True)),
|
||||
('zoom_gateway_response', models.JSONField(blank=True, null=True)),
|
||||
@ -166,7 +168,7 @@ class Migration(migrations.Migration):
|
||||
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
|
||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||
('user_type', models.CharField(choices=[('staff', 'Staff'), ('agency', 'Agency'), ('candidate', 'Candidate')], default='staff', max_length=20, verbose_name='User Type')),
|
||||
('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')),
|
||||
('phone', models.CharField(blank=True, null=True, verbose_name='Phone')),
|
||||
('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/', validators=[recruitment.validators.validate_image_size], verbose_name='Profile Image')),
|
||||
('designation', models.CharField(blank=True, max_length=100, null=True, verbose_name='Designation')),
|
||||
('email', models.EmailField(error_messages={'unique': 'A user with this email already exists.'}, max_length=254, unique=True)),
|
||||
@ -258,8 +260,8 @@ class Migration(migrations.Migration):
|
||||
('slug', django_extensions.db.fields.RandomCharField(blank=True, editable=False, length=8, unique=True, verbose_name='Slug')),
|
||||
('name', models.CharField(max_length=200, unique=True, verbose_name='Agency Name')),
|
||||
('contact_person', models.CharField(blank=True, max_length=150, verbose_name='Contact Person')),
|
||||
('email', models.EmailField(blank=True, max_length=254)),
|
||||
('phone', models.CharField(blank=True, max_length=20)),
|
||||
('email', models.EmailField(max_length=254, unique=True)),
|
||||
('phone', models.CharField(blank=True, max_length=20, null=True)),
|
||||
('website', models.URLField(blank=True)),
|
||||
('notes', models.TextField(blank=True, help_text='Internal notes about the agency')),
|
||||
('country', django_countries.fields.CountryField(blank=True, max_length=2, null=True)),
|
||||
@ -501,10 +503,11 @@ class Migration(migrations.Migration):
|
||||
('last_name', models.CharField(max_length=255, verbose_name='Last Name')),
|
||||
('middle_name', models.CharField(blank=True, max_length=255, null=True, verbose_name='Middle Name')),
|
||||
('email', models.EmailField(db_index=True, max_length=254, unique=True, verbose_name='Email')),
|
||||
('phone', models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone')),
|
||||
('phone', models.CharField(blank=True, null=True, verbose_name='Phone')),
|
||||
('date_of_birth', models.DateField(blank=True, null=True, verbose_name='Date of Birth')),
|
||||
('gender', models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female')], max_length=1, null=True, verbose_name='Gender')),
|
||||
('gpa', models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True, verbose_name='GPA')),
|
||||
('gpa', models.DecimalField(decimal_places=2, help_text='GPA must be between 0 and 4.', max_digits=3, verbose_name='GPA')),
|
||||
('national_id', models.CharField(help_text='Enter the national id or iqama number')),
|
||||
('nationality', django_countries.fields.CountryField(blank=True, max_length=2, null=True, verbose_name='Nationality')),
|
||||
('address', models.TextField(blank=True, null=True, verbose_name='Address')),
|
||||
('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/', validators=[recruitment.validators.validate_image_size], verbose_name='Profile Image')),
|
||||
|
||||
@ -70,8 +70,9 @@ from .decorators import (
|
||||
staff_user_required,
|
||||
StaffRequiredMixin,
|
||||
StaffOrAgencyRequiredMixin,
|
||||
StaffOrCandidateRequiredMixin,
|
||||
superuser_required
|
||||
staff_or_candidate_required,
|
||||
superuser_required,
|
||||
staff_or_agency_required
|
||||
)
|
||||
from .forms import (
|
||||
StaffUserCreationForm,
|
||||
|
||||
@ -116,7 +116,7 @@
|
||||
<i class="fas fa-envelope"></i>
|
||||
</a>
|
||||
</li> {% endcomment %}
|
||||
|
||||
|
||||
<li class="nav-item me-2 d-none d-lg-block">
|
||||
{% if LANGUAGE_CODE == 'en' %}
|
||||
<form action="{% url 'set_language' %}" method="post" class="d-inline">
|
||||
@ -192,7 +192,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
|
||||
<li><hr class="dropdown-divider my-1"></li>
|
||||
|
||||
<li class="nav-item me-3 dropdown-item py-2 px-4 d-flex align-items-center text-decoration-none text-teal d-lg-none">
|
||||
@ -229,16 +229,16 @@
|
||||
</li>
|
||||
{% if request.user.is_superuser %}
|
||||
<li>
|
||||
<a class="dropdown-item py-2 px-4 d-flex align-items-center text-decoration-none text-teal" href="{% url 'settings' %}">
|
||||
<a class="dropdown-item py-2 px-4 d-flex align-items-center text-decoration-none text-teal" href="{% url 'admin_settings' %}">
|
||||
<i class="fas fa-cog me-3 fs-5"></i> <span>{% trans "Settings" %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
<li><hr class="dropdown-divider my-1"></li>
|
||||
|
||||
|
||||
|
||||
<li>
|
||||
<form method="post" action="{% url 'account_logout'%}" class="d-inline">
|
||||
{% csrf_token %}
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
|
||||
/* Filter Controls */
|
||||
.filter-controls {
|
||||
|
||||
|
||||
border-radius: 0.75rem;
|
||||
padding: 1.5rem;
|
||||
margin-bottom: 2rem;
|
||||
@ -426,15 +426,26 @@
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
<div class="alert alert-info text-center py-5" role="alert">
|
||||
<i class="fas fa-info-circle fa-2x mb-3"></i>
|
||||
<h5>{% trans "No interviews found" %}</h5>
|
||||
<p class="text-muted mb-0">
|
||||
{% trans "There are no interviews matching your current filters." %}
|
||||
<a href="{% url 'interview_list' %}" class="alert-link">{% trans "Clear filters" %}</a>
|
||||
{% trans "to see all interviews." %}
|
||||
</p>
|
||||
<!-- Empty State -->
|
||||
<div class="text-center py-5">
|
||||
<div class="mb-4">
|
||||
<i class="fas fa-calendar fa-4x text-muted"></i>
|
||||
</div>
|
||||
<h4 class="text-muted mb-3">
|
||||
{% if search_query %}
|
||||
{% trans "There are no interviews matching your search filters." %}
|
||||
{% else %}
|
||||
{% trans "There are no interviews." %}
|
||||
{% endif %}
|
||||
</h4>
|
||||
<p class="text-muted mb-4">
|
||||
{% trans "Start by adding your first interview." %}
|
||||
</p>
|
||||
{% comment %} <a href="{% url 'interview_list' %}" class="btn btn-main-action">
|
||||
<i class="fas fa-plus me-2"></i> {% trans "Add Your First Agency" %}
|
||||
</a> {% endcomment %}
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user