diff --git a/NorahUniversity/__pycache__/settings.cpython-312.pyc b/NorahUniversity/__pycache__/settings.cpython-312.pyc index 745fbd7..7d14999 100644 Binary files a/NorahUniversity/__pycache__/settings.cpython-312.pyc and b/NorahUniversity/__pycache__/settings.cpython-312.pyc differ diff --git a/NorahUniversity/settings.py b/NorahUniversity/settings.py index 8049d5a..249db2c 100644 --- a/NorahUniversity/settings.py +++ b/NorahUniversity/settings.py @@ -120,6 +120,8 @@ DATABASES = { # Password validation # https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators + + AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', diff --git a/db.sqlite3 b/db.sqlite3 index 6cb77e4..f6a402d 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/recruitment/__pycache__/admin.cpython-312.pyc b/recruitment/__pycache__/admin.cpython-312.pyc index 8f6824f..ccbec15 100644 Binary files a/recruitment/__pycache__/admin.cpython-312.pyc and b/recruitment/__pycache__/admin.cpython-312.pyc differ diff --git a/recruitment/__pycache__/forms.cpython-312.pyc b/recruitment/__pycache__/forms.cpython-312.pyc index 72e2db2..3921c26 100644 Binary files a/recruitment/__pycache__/forms.cpython-312.pyc and b/recruitment/__pycache__/forms.cpython-312.pyc differ diff --git a/recruitment/__pycache__/models.cpython-312.pyc b/recruitment/__pycache__/models.cpython-312.pyc index 4d11b5e..c1d4db5 100644 Binary files a/recruitment/__pycache__/models.cpython-312.pyc and b/recruitment/__pycache__/models.cpython-312.pyc differ diff --git a/recruitment/__pycache__/views.cpython-312.pyc b/recruitment/__pycache__/views.cpython-312.pyc index a190007..1c2171f 100644 Binary files a/recruitment/__pycache__/views.cpython-312.pyc and b/recruitment/__pycache__/views.cpython-312.pyc differ diff --git a/recruitment/__pycache__/views_frontend.cpython-312.pyc b/recruitment/__pycache__/views_frontend.cpython-312.pyc index 7ee2519..6d78c62 100644 Binary files a/recruitment/__pycache__/views_frontend.cpython-312.pyc and b/recruitment/__pycache__/views_frontend.cpython-312.pyc differ diff --git a/recruitment/admin.py b/recruitment/admin.py index 9480c13..0676c9e 100644 --- a/recruitment/admin.py +++ b/recruitment/admin.py @@ -5,7 +5,7 @@ from django.utils import timezone from .models import ( JobPosting, Candidate, TrainingMaterial, ZoomMeeting, FormTemplate, FormStage, FormField, FormSubmission, FieldResponse, - SharedFormTemplate, Source, HiringAgency, IntegrationLog,InterviewSchedule + SharedFormTemplate, Source, HiringAgency, IntegrationLog,InterviewSchedule,Profile ) class FormFieldInline(admin.TabularInline): @@ -261,4 +261,5 @@ admin.site.register(FormStage) admin.site.register(FormField) admin.site.register(FieldResponse) admin.site.register(InterviewSchedule) +admin.site.register(Profile) # admin.site.register(HiringAgency) diff --git a/recruitment/forms.py b/recruitment/forms.py index 05d2ae0..866307e 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -259,8 +259,9 @@ class JobPostingForm(forms.ModelForm): 'type': 'date' }), 'application_instructions': SummernoteWidget(attrs={ - # Removed 'class' and 'rows' - 'placeholder': 'Special instructions for applicants (e.g., required documents, reference requirements, etc.)' + + 'placeholder': 'Special instructions for applicants (e.g., required documents, reference requirements, etc.)', + }), 'open_positions': forms.NumberInput(attrs={ 'class': 'form-control', diff --git a/recruitment/migrations/0027_profile.py b/recruitment/migrations/0027_profile.py new file mode 100644 index 0000000..d2b58c8 --- /dev/null +++ b/recruitment/migrations/0027_profile.py @@ -0,0 +1,24 @@ +# Generated by Django 5.2.7 on 2025-10-08 13:01 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('recruitment', '0026_interviewschedule_scheduledinterview'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Profile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('profile_image', models.ImageField(blank=True, null=True, upload_to='profile_pic/')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/recruitment/models.py b/recruitment/models.py index 88fa105..f3645ba 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -9,6 +9,9 @@ from django.core.exceptions import ValidationError from django_countries.fields import CountryField from django.urls import reverse +class Profile(models.Model): + profile_image=models.ImageField(null=True,blank=True,upload_to='profile_pic/') + user=models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile') class Base(models.Model): created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('Created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('Updated at')) diff --git a/recruitment/views.py b/recruitment/views.py index 2b8b7fb..95a2b40 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -83,8 +83,7 @@ class ZoomMeetingListView(ListView): if search_query: queryset = queryset.filter( Q(topic__icontains=search_query) | - Q(meeting_id__icontains=search_query) | - Q(host_email__icontains=search_query) + Q(meeting_id__icontains=search_query) ) return queryset @@ -143,27 +142,30 @@ def ZoomMeetingDeleteView(request, pk): #Job Posting -def job_list(request): - """Display the list of job postings order by creation date descending""" - jobs=JobPosting.objects.all().order_by('-created_at') +# def job_list(request): +# """Display the list of job postings order by creation date descending""" +# jobs=JobPosting.objects.all().order_by('-created_at') - # Filter by status if provided - status=request.GET.get('status') - if status: - jobs=jobs.filter(status=status) +# # Filter by status if provided +# print(f"the request is: {request} ") +# status=request.GET.get('status') +# print(f"DEBUG: Status filter received: {status}") +# if status: +# jobs=jobs.filter(status=status) - #pagination - paginator=Paginator(jobs,10) # Show 10 jobs per page - page_number=request.GET.get('page') - page_obj=paginator.get_page(page_number) - return render(request, 'jobs/job_list.html', { - 'page_obj': page_obj, - 'status_filter': status - }) +# #pagination +# paginator=Paginator(jobs,10) # Show 10 jobs per page +# page_number=request.GET.get('page') +# page_obj=paginator.get_page(page_number) +# return render(request, 'jobs/job_list.html', { +# 'page_obj': page_obj, +# 'status_filter': status +# }) def create_job(request): """Create a new job posting""" + if request.method=='POST': form=JobPostingForm(request.POST,is_anonymous_user=not request.user.is_authenticated) @@ -761,7 +763,8 @@ def delete_form_template(request, template_id): def form_wizard_view(request, template_id): """Display the form as a step-by-step wizard""" template = get_object_or_404(FormTemplate, id=template_id, is_active=True) - return render(request, 'forms/form_wizard.html', {'template_id': template_id}) + job_id=template.job.internal_job_id + return render(request, 'forms/form_wizard.html', {'template_id': template_id,'job_id':job_id}) @require_http_methods(["POST"]) def submit_form(request, template_id): """Handle form submission""" diff --git a/recruitment/views_frontend.py b/recruitment/views_frontend.py index 353f5c9..f323882 100644 --- a/recruitment/views_frontend.py +++ b/recruitment/views_frontend.py @@ -41,10 +41,15 @@ class JobListView(LoginRequiredMixin, ListView): # Filter for non-staff users if not self.request.user.is_staff: queryset = queryset.filter(status='Published') + + status=self.request.GET.get('status') + if status: + queryset=queryset.filter(status=status) return queryset def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) context['search_query'] = self.request.GET.get('search', '') context['lang'] = get_language() @@ -288,7 +293,7 @@ class TrainingListView(LoginRequiredMixin, ListView): template_name = 'recruitment/training_list.html' context_object_name = 'materials' paginate_by = 10 - + def get_queryset(self): queryset = super().get_queryset() @@ -296,8 +301,7 @@ class TrainingListView(LoginRequiredMixin, ListView): search_query = self.request.GET.get('search', '') if search_query: queryset = queryset.filter( - Q(title__icontains=search_query) | - Q(description__icontains=search_query) + Q(title__icontains=search_query) ) # Filter for non-staff users diff --git a/templates/base.html b/templates/base.html index 5e676c5..caf1cc4 100644 --- a/templates/base.html +++ b/templates/base.html @@ -320,11 +320,13 @@