another update to interview update

This commit is contained in:
ismail 2025-11-30 12:50:15 +03:00
parent f168ab4ba8
commit b158cb3e7b
5 changed files with 76 additions and 6 deletions

View File

@ -2821,4 +2821,17 @@ class ScheduledInterviewForm(forms.Form):
start_time = self.cleaned_data.get('start_time')
if start_time and start_time < timezone.now():
raise forms.ValidationError(_('Start time cannot be in the past.'))
return start_time
return start_time
class ScheduledInterviewUpdateStatusForm(forms.Form):
status = forms.ChoiceField(
choices=ScheduledInterview.InterviewStatus.choices,
widget=forms.Select(attrs={
'class': 'form-control',
'required': True
}),
label=_('Interview Status')
)
class Meta:
model = ScheduledInterview
fields = ['status']

View File

@ -571,6 +571,7 @@ urlpatterns = [
# Interview URLs
path('interviews/', views.interview_list, name='interview_list'),
path('interviews/<slug:slug>/', views.interview_detail, name='interview_detail'),
path('interviews/<slug:slug>/update_interview_status', views.update_interview_status, name='update_interview_status'),
# Interview Creation URLs
path('interviews/create/<slug:candidate_slug>/', views.interview_create_type_selection, name='interview_create_type_selection'),

View File

@ -5331,10 +5331,24 @@ def interview_create_onsite(request, candidate_slug):
def get_interview_list(request, job_slug):
from .forms import ScheduledInterviewUpdateStatusForm
application = Application.objects.get(slug=job_slug)
interviews = ScheduledInterview.objects.filter(application=application).order_by("interview_date","interview_time").select_related('interview')
print(interviews)
return render(request, 'interviews/partials/interview_list.html', {'interviews': interviews, 'application': application})
interview_status_form = ScheduledInterviewUpdateStatusForm()
return render(request, 'interviews/partials/interview_list.html', {'interviews': interviews, 'application': application,'interview_status_form':interview_status_form})
@require_POST
def update_interview_status(request,slug):
from .forms import ScheduledInterviewUpdateStatusForm
if request.method == 'POST':
form = ScheduledInterviewUpdateStatusForm(request.POST)
if form.is_valid():
scheduled_interview = get_object_or_404(ScheduledInterview, slug=slug)
scheduled_interview.status = form.cleaned_data['status']
scheduled_interview.save(update_fields=['status'])
messages.success(request, "Interview status updated successfully.")
return redirect('interview_detail', slug=slug)
@login_required
def agency_access_link_deactivate(request, slug):
@ -5861,13 +5875,16 @@ def interview_list(request):
@staff_user_required
def interview_detail(request, slug):
"""View details of a specific interview"""
from .forms import ScheduledInterviewUpdateStatusForm
interview = get_object_or_404(ScheduledInterview, slug=slug)
reschedule_form = ScheduledInterviewForm()
reschedule_form.initial['topic'] = interview.interview.topic
context = {
'interview': interview,
'reschedule_form':reschedule_form
'reschedule_form':reschedule_form,
'interview_status_form':ScheduledInterviewUpdateStatusForm()
}
return render(request, 'interviews/interview_detail.html', context)

View File

@ -224,6 +224,11 @@
<a href="{% url 'job_detail' interview.job.slug %}" class="btn btn-outline-secondary">
<i class="fas fa-briefcase me-1"></i> {% trans "View Job" %}
</a>
<button type="button" class="btn btn-outline-secondary"
data-bs-toggle="modal"
data-bs-target="#statusModal">
<i class="fas fa-redo-alt me-1"></i> {% trans "Update Interview status" %}
</button>
</div>
</div>
@ -323,6 +328,13 @@
<span class="detail-label">{% trans "Duration:" %}</span>
<span class="detail-value">{{ interview.interview.duration }} {% trans "minutes" %}</span>
</div>
<div class="detail-item">
<span class="detail-label">{% trans "Status:" %}</span>
<span class="detail-value">
<span class="badge bg-primary-theme">
{{ interview.status }}</span>
</span>
</div>
</div>
</div>
<div class="col-md-6">
@ -739,6 +751,34 @@
</div>
</div>
<!-- Update Status Modal -->
<div class="modal fade" id="statusModal" tabindex="-1" aria-labelledby="statusModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content kaauh-card">
<div class="modal-header" style="border-bottom: 1px solid var(--kaauh-border);">
<h5 class="modal-title" id="statusModalLabel" style="color: var(--kaauh-teal-dark);">
<i class="fas fa-sync-alt me-2"></i> {% trans "Update Interview Status" %}
</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 'update_interview_status' interview.slug %}">
{% csrf_token %}
{{interview_status_form|crispy}}
<div class="d-flex gap-2">
<button type="submit" class="btn btn-main-action">
<i class="fas fa-check me-1"></i> {% trans "Update Status" %}
</button>
<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">
{% trans "Close" %}
</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endblock %}
{% block customJS %}

View File

@ -230,9 +230,8 @@
</div>
</form>
</div>
{{meetings}}
{# Using 'meetings' based on the context_object_name provided #}
{% if meetings %}
{% if interviews %}
<div id="meetings-list">
{# View Switcher (kept the name for simplicity) #}
{% include "includes/_list_view_switcher.html" with list_id="meetings-list" %}