before update the meeting

This commit is contained in:
ismail 2025-11-19 14:50:20 +03:00
parent 61cd47ccc9
commit d1a49717ee
8 changed files with 119 additions and 112 deletions

View File

@ -2490,12 +2490,11 @@ class StaffAssignmentForm(forms.ModelForm):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# Filter users to only show staff members # Filter users to only show staff members
self.fields['assigned_to'].queryset = User.objects.filter( self.fields['assigned_to'].queryset = User.objects.filter(
user_type='staff' user_type='staff',is_superuser=False
).order_by('first_name', 'last_name') ).order_by('first_name', 'last_name')
# Add empty choice for unassigning # Add empty choice for unassigning
self.fields['assigned_to'].required = False self.fields['assigned_to'].required = False
self.fields['assigned_to'].empty_label = _('-- Unassign Staff --')
self.helper = FormHelper() self.helper = FormHelper()
self.helper.form_method = 'post' self.helper.form_method = 'post'
@ -2516,3 +2515,4 @@ class StaffAssignmentForm(forms.ModelForm):
if assigned_to and assigned_to.user_type != 'staff': if assigned_to and assigned_to.user_type != 'staff':
raise forms.ValidationError(_('Only staff members can be assigned to jobs.')) raise forms.ValidationError(_('Only staff members can be assigned to jobs.'))
return assigned_to return assigned_to

View File

@ -129,7 +129,7 @@ class JobPosting(Base):
blank=True, blank=True,
) )
application_deadline = models.DateField(db_index=True) # Added index application_deadline = models.DateField(db_index=True)
application_instructions = CKEditor5Field( application_instructions = CKEditor5Field(
blank=True, null=True, config_name="extends" blank=True, null=True, config_name="extends"
) )

View File

@ -615,6 +615,7 @@ def job_detail(request, slug):
"avg_t2i_days": avg_t2i_days, "avg_t2i_days": avg_t2i_days,
"avg_t_in_exam_days": avg_t_in_exam_days, "avg_t_in_exam_days": avg_t_in_exam_days,
"linkedin_content_form": linkedin_content_form, "linkedin_content_form": linkedin_content_form,
"staff_form": StaffAssignmentForm(),
} }
return render(request, "jobs/job_detail.html", context) return render(request, "jobs/job_detail.html", context)
@ -2994,7 +2995,8 @@ def staff_assignment_view(request, slug):
form = StaffAssignmentForm(request.POST, instance=job) form = StaffAssignmentForm(request.POST, instance=job)
if form.is_valid(): if form.is_valid():
assignment = form.save() job.assigned_to = form.cleaned_data["assigned_to"]
job.save(update_fields=["assigned_to"])
messages.success(request, f"Staff assigned to job '{job.title}' successfully!") messages.success(request, f"Staff assigned to job '{job.title}' successfully!")
return redirect("job_detail", slug=job.slug) return redirect("job_detail", slug=job.slug)
else: else:

View File

@ -1,5 +1,5 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load i18n static %} {% load i18n static crispy_forms_tags %}
{% block title %}{{ job.title }} - University ATS{% endblock %} {% block title %}{{ job.title }} - University ATS{% endblock %}
@ -303,7 +303,7 @@
</li> </li>
<li class="nav-item flex-fill" role="presentation"> <li class="nav-item flex-fill" role="presentation">
<button class="nav-link" id="staff-tab" data-bs-toggle="tab" data-bs-target="#staff-pane" type="button" role="tab" aria-controls="staff-pane" aria-selected="false"> <button class="nav-link" id="staff-tab" data-bs-toggle="tab" data-bs-target="#staff-pane" type="button" role="tab" aria-controls="staff-pane" aria-selected="false">
<i class="fas fa-user-tie me-1 text-primary"></i> {% trans "Staff" %} <i class="fas fa-user-tie me-1 text-primary"></i> {% trans "Assigned Staff" %}
</button> </button>
</li> </li>
<li class="nav-item flex-fill" role="presentation"> <li class="nav-item flex-fill" role="presentation">
@ -384,42 +384,47 @@
<div class="tab-pane fade" id="staff-pane" role="tabpanel" aria-labelledby="staff-tab"> <div class="tab-pane fade" id="staff-pane" role="tabpanel" aria-labelledby="staff-tab">
<h5 class="mb-3"><i class="fas fa-user-tie me-2 text-primary"></i>{% trans "Staff Assignment" %}</h5> <h5 class="mb-3"><i class="fas fa-user-tie me-2 text-primary"></i>{% trans "Staff Assignment" %}</h5>
<div class="d-grid gap-3"> <div class="d-grid gap-3">
<p class="text-muted small mb-3">
{% trans "Assign staff members to manage this job posting and track applications." %}
</p>
<a href="{% url 'staff_assignment_view' job.slug %}" class="btn btn-main-action">
<i class="fas fa-user-plus me-1"></i> {% trans "Assign Staff Member" %}
</a>
{% if job.assigned_to %} {% if job.assigned_to %}
<div class="mt-3"> <p class="text-muted small mb-3">
<h6 class="text-muted">{% trans "Current Assignments" %}</h6> <strong>{% trans "Assigned to:" %}</strong> {{ job.assigned_to }}
{% for assignment in job.staff_assignments.all %} </p>
<div class="card mb-2">
<div class="card-body p-2">
<div class="d-flex justify-content-between align-items-center">
<div>
<strong>{{ assignment.staff.get_full_name|default:assignment.staff.username }}</strong>
<br>
<small class="text-muted">{{ assignment.staff.email }}</small>
</div>
<div>
{% if assignment.staff.is_active %}
<span class="badge bg-success">Active</span>
{% else %}
<span class="badge bg-danger">Inactive</span>
{% endif %} {% endif %}
</div> {% if not job.assigned_to %}
</div> <button type="button" class="btn btn-main-action" data-bs-toggle="modal" data-bs-target="#staffAssignmentModal">
{% if assignment.notes %} <i class="fas fa-user-plus me-1"></i> {% trans "Assign Staff Member" %}
<small class="text-muted d-block mt-1">{{ assignment.notes }}</small> </button>
{% elif job.assigned_to and job.assigned_to == request.user %}
<button type="button" class="btn btn-main-action" data-bs-toggle="modal" data-bs-target="#staffAssignmentModal">
<i class="fas fa-user-plus me-1"></i> {% trans "Assign Staff Member" %}
</button>
{% endif %} {% endif %}
<!-- Modal for Staff Assignment -->
<div class="modal fade" id="staffAssignmentModal" tabindex="-1" aria-labelledby="staffAssignmentModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staffAssignmentModalLabel">
<i class="fas fa-user-plus me-2"></i> {% trans "Assign Staff Member" %}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form method="post" action="{% url 'staff_assignment_view' job.slug %}">
{% csrf_token %}
{{staff_form|crispy}}
<div class="d-flex justify-content-end mt-3">
<button type="submit" class="btn btn-main-action">
<i class="fas fa-save me-1"></i> {% trans "Save Assignment" %}
</button>
</div>
</form>
</div> </div>
</div> </div>
{% endfor %}
</div> </div>
{% else %} </div>
{% if not job.assigned_to %}
<div class="alert alert-info p-2 small mb-0"> <div class="alert alert-info p-2 small mb-0">
<i class="fas fa-info-circle me-1"></i> {% trans "No staff members assigned to this job yet." %} <i class="fas fa-info-circle me-1"></i> {% trans "No staff members assigned to this job yet." %}
</div> </div>

View File

@ -291,7 +291,7 @@
hx-get="{% url 'candidate_criteria_view_htmx' candidate.pk %}" hx-get="{% url 'candidate_criteria_view_htmx' candidate.pk %}"
hx-target="#candidateviewModalBody" hx-target="#candidateviewModalBody"
title="View Profile"> title="View Profile">
{{ candidate.name }}<i class="fas fa-eye ms-1"></i> {{ candidate.name }} <i class="fas fa-eye ms-1"></i>
</button> </button>
{% comment %} <div class="candidate-name"> {% comment %} <div class="candidate-name">
{{ candidate.name }} {{ candidate.name }}