diff --git a/NorahUniversity/settings.py b/NorahUniversity/settings.py index a2a138d..e2757e7 100644 --- a/NorahUniversity/settings.py +++ b/NorahUniversity/settings.py @@ -62,7 +62,7 @@ INSTALLED_APPS = [ "django_q", "widget_tweaks", "easyaudit", - "mathfilters" +# "mathfilters" ] diff --git a/recruitment/migrations/0001_initial.py b/recruitment/migrations/0001_initial.py index 009608e..0798d3d 100644 --- a/recruitment/migrations/0001_initial.py +++ b/recruitment/migrations/0001_initial.py @@ -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')), diff --git a/recruitment/views.py b/recruitment/views.py index f39f5ee..9f31d58 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -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, diff --git a/templates/base.html b/templates/base.html index 9808e75..93461e1 100644 --- a/templates/base.html +++ b/templates/base.html @@ -116,7 +116,7 @@ {% endcomment %} - +