another update to interview update
This commit is contained in:
parent
f168ab4ba8
commit
b158cb3e7b
@ -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']
|
||||
@ -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'),
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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 %}
|
||||
|
||||
@ -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" %}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user