fix few ui issues
This commit is contained in:
parent
0cb21885f7
commit
80791e5fa7
@ -320,7 +320,7 @@ Q_CLUSTER = {
|
||||
"name": "KAAUH_CLUSTER",
|
||||
"workers": 2,
|
||||
"recycle": 500,
|
||||
"timeout": 120,
|
||||
"timeout": 360,
|
||||
"max_attempts": 1,
|
||||
"compress": True,
|
||||
"save_limit": 250,
|
||||
|
||||
@ -2220,7 +2220,10 @@ Job: {job.title}
|
||||
if interview.location_type == 'Remote':
|
||||
initial_message += f"Pease join using meeting link {interview.join_url} \n\n"
|
||||
else:
|
||||
initial_message += "This is an onsite schedule. Please arrive 10 minutes early.\n\n"
|
||||
initial_message += f"""
|
||||
Location: {interview.physical_address}
|
||||
Room No: {interview.room_number}
|
||||
This is an onsite schedule. Please arrive 10 minutes early.\n\n"""
|
||||
|
||||
|
||||
|
||||
|
||||
44
recruitment/services/ollama_service.py
Normal file
44
recruitment/services/ollama_service.py
Normal file
@ -0,0 +1,44 @@
|
||||
import ollama
|
||||
import re
|
||||
# def clean_json_response(raw_string):
|
||||
# """
|
||||
# Removes Markdown code blocks and extra whitespace from AI responses.
|
||||
# """
|
||||
# # Use regex to find content between ```json and ``` or just ```
|
||||
# match = re.search(r'```(?:json)?\s*([\s\S]*?)\s*```', raw_string)
|
||||
# if match:
|
||||
# return match.group(1).strip()
|
||||
# return raw_string.strip()
|
||||
|
||||
import json
|
||||
import re
|
||||
|
||||
def robust_json_parser(raw_output):
|
||||
# 1. Strip Markdown blocks
|
||||
clean = re.sub(r'```(?:json)?|```', '', raw_output).strip()
|
||||
|
||||
# 2. Fix trailing commas before closing braces/brackets
|
||||
clean = re.sub(r',\s*([\]}])', r'\1', clean)
|
||||
|
||||
try:
|
||||
return json.loads(clean)
|
||||
except json.JSONDecodeError:
|
||||
# 3. Last resort: try to find the first '{' and last '}'
|
||||
start_idx = clean.find('{')
|
||||
end_idx = clean.rfind('}')
|
||||
if start_idx != -1 and end_idx != -1:
|
||||
try:
|
||||
return json.loads(clean[start_idx:end_idx+1])
|
||||
except:
|
||||
pass
|
||||
raise
|
||||
|
||||
def get_model_reponse(prompt):
|
||||
response=ollama.chat(
|
||||
model='alibayram/smollm3:latest',
|
||||
messages=[{'role': 'user', 'content': prompt}],
|
||||
stream=False # Set to True for real-time streaming
|
||||
)
|
||||
# print(response['message']['content'])
|
||||
response=robust_json_parser(response['message']['content'])
|
||||
return response
|
||||
@ -337,7 +337,7 @@ def create_job(request):
|
||||
logger.error(f"Error creating job: {e}")
|
||||
messages.error(request, f"Error creating job: {e}")
|
||||
else:
|
||||
messages.error(request, f"Please correct the errors below.{form.errors}")
|
||||
messages.error(request, f"Please correct the errors below.")
|
||||
else:
|
||||
form = JobPostingForm()
|
||||
return render(request, "jobs/create_job.html", {"form": form})
|
||||
@ -4795,6 +4795,8 @@ def interview_list(request):
|
||||
"search_query": search_query,
|
||||
"interviews": page_obj,
|
||||
"jobs": jobs,
|
||||
"interview_type":interview_type,
|
||||
|
||||
}
|
||||
return render(request, "interviews/interview_list.html", context)
|
||||
|
||||
|
||||
@ -1,18 +1,16 @@
|
||||
{% load i18n %}
|
||||
<style>
|
||||
|
||||
</style>
|
||||
<form method="get" class="d-flex gap-2 align-items-center">
|
||||
<div class="input-group flex-grow-1" style="max-width: 300px;">
|
||||
<span class="input-group-text bg-white border-end-0">
|
||||
<svg class="heroicon icon-sm" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<input type="text" name="search"
|
||||
class="form-control border-start-0"
|
||||
placeholder="{% trans 'Search...' %}"
|
||||
value="{{ search_query }}"
|
||||
aria-label="{% trans 'Search' %}">
|
||||
<button class="btn btn-outline-primary" type="submit">
|
||||
<i class="fas fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
@ -774,18 +774,18 @@
|
||||
</button>
|
||||
<div class="w-100 text-center">
|
||||
{% if interview.interview_result %}
|
||||
{% trans 'Interview Result : ' %}
|
||||
<div class="my-2">{% trans 'Interview Result : ' %}</div>
|
||||
{% if interview.interview_result == 'passed' %}
|
||||
<div class="card border-success mb-3" style="max-width: 30rem;">
|
||||
<div class="card mb-3" style="max-width: 30rem;">
|
||||
<div class="card-header text-white">
|
||||
<!-- Status Badge as a Pill -->
|
||||
<span class="badge rounded-pill bg-white text-success p-2">
|
||||
<span class="badge rounded-pill bg-white text-primary-theme p-2">
|
||||
<i class="fas fa-check-circle me-1"></i>
|
||||
<strong>{{ interview.interview_result|upper }}</strong>
|
||||
</span>
|
||||
</div>
|
||||
{% if interview.result_comments %}
|
||||
<div class="card-body text-success">
|
||||
<div class="card-body text-primary-theme">
|
||||
<h5 class="card-title">{% trans 'Result Comment:' %}</h5>
|
||||
<!-- The comment text with slightly adjusted margins -->
|
||||
<p class="card-text text-dark">
|
||||
@ -796,7 +796,7 @@
|
||||
</div>
|
||||
{% elif interview.interview_result == 'failed' %}
|
||||
|
||||
<div class="card border-danger mb-3" style="max-width: 30rem;">
|
||||
<div class="card mb-3" style="max-width: 30rem;">
|
||||
<div class="card-header text-white">
|
||||
<!-- Status Badge as a Pill -->
|
||||
<span class="badge rounded-pill bg-white text-danger p-2">
|
||||
@ -816,16 +816,16 @@
|
||||
</div>
|
||||
{% else %}
|
||||
|
||||
<div class="card border-info mb-3" style="max-width: 30rem;">
|
||||
<div class="card mb-3" style="max-width: 30rem;">
|
||||
<div class="card-header text-white">
|
||||
<!-- Status Badge as a Pill -->
|
||||
<span class="badge rounded-pill bg-white text-info p-2">
|
||||
<span class="badge rounded-pill bg-white text-primary-theme p-2">
|
||||
<i class="fas fa-check-circle me-1"></i>
|
||||
<strong>{{ interview.interview_result|upper }}</strong>
|
||||
</span>
|
||||
</div>
|
||||
{% if interview.result_comments %}
|
||||
<div class="card-body text-info">
|
||||
<div class="card-body text-primary-theme">
|
||||
<h5 class="card-title">{% trans 'Result Comment:' %}</h5>
|
||||
<!-- The comment text with slightly adjusted margins -->
|
||||
<p class="card-text text-dark">
|
||||
|
||||
@ -174,51 +174,70 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="filter-controls">
|
||||
<form method="get" class="row g-3">
|
||||
<div class="col-md-3">
|
||||
<label for="job_filter" class="form-label small text-muted">{% trans "Filter by Job" %}</label>
|
||||
|
||||
<select name="job" id="job_filter" class="form-select form-select-sm">
|
||||
<option value="">{% trans "All Jobs" %}</option>
|
||||
{% for job in jobs %}
|
||||
<option value="{{ job.slug }}" {% if job_filter == job.slug %}selected{% endif %}>{{ job.title }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<label for="status_filter" class="form-label form-label-sm">{% trans "Status" %}</label>
|
||||
<select name="status" id="status_filter" class="form-select form-select-sm">
|
||||
<option value="">{% trans "All Status" %}</option>
|
||||
<option value="scheduled" {% if request.GET.status == "scheduled" %}selected{% endif %}>{% trans "Scheduled" %}</option>
|
||||
<option value="confirmed" {% if request.GET.status == "confirmed" %}selected{% endif %}>{% trans "Confirmed" %}</option>
|
||||
<option value="cancelled" {% if request.GET.status == "cancelled" %}selected{% endif %}>{% trans "Cancelled" %}</option>
|
||||
<option value="completed" {% if request.GET.status == "completed" %}selected{% endif %}>{% trans "Completed" %}</option>
|
||||
</select>
|
||||
<div class="card mb-4 shadow-sm no-hover">
|
||||
<div class="card-body">
|
||||
<div class="row g-4">
|
||||
<div class="col-md-4">
|
||||
<label for="search" class="form-label small text-muted">{% trans "Search by Name or Email" %}</label>
|
||||
<div class="input-group input-group-lg mb-3">
|
||||
<form method="get" action="" class="w-100">
|
||||
{% include 'includes/search_form.html' %}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-8">
|
||||
<form method="GET" class="row g-2 align-items-end h-100">
|
||||
{# Keep search query context when filtering #}
|
||||
{% if request.GET.search %}<input type="hidden" name="search" value="{{ request.GET.search }}">{% endif %}
|
||||
|
||||
<div class="col-md-4">
|
||||
<label for="job_filter" class="form-label small text-muted">{% trans "Filter by Job" %}</label>
|
||||
<select name="job" id="job_filter" class="form-select form-select-sm">
|
||||
<option value="">{% trans "All Jobs" %}</option>
|
||||
{% for job in jobs %}
|
||||
<option value="{{ job.slug }}" {% if request.GET.job == job.slug %}selected{% endif %}>{{ job.title }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<label for="status_filter" class="form-label small text-muted">{% trans "Status" %}</label>
|
||||
<select name="status" id="status_filter" class="form-select form-select-sm">
|
||||
<option value="">{% trans "All" %}</option>
|
||||
<option value="scheduled" {% if request.GET.status == "scheduled" %}selected{% endif %}>{% trans "Scheduled" %}</option>
|
||||
<option value="confirmed" {% if request.GET.status == "confirmed" %}selected{% endif %}>{% trans "Confirmed" %}</option>
|
||||
<option value="cancelled" {% if request.GET.status == "cancelled" %}selected{% endif %}>{% trans "Cancelled" %}</option>
|
||||
<option value="completed" {% if request.GET.status == "completed" %}selected{% endif %}>{% trans "Completed" %}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-2">
|
||||
<label for="type_filter" class="form-label small text-muted">{% trans "Type" %}</label>
|
||||
<select name="type" id="type_filter" class="form-select form-select-sm">
|
||||
<option value="">{% trans "All" %}</option>
|
||||
<option value="Remote" {% if request.GET.type == "Remote" %}selected{% endif %}>{% trans "Remote" %}</option>
|
||||
<option value="Onsite" {% if request.GET.type == "Onsite" %}selected{% endif %}>{% trans "Onsite" %}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3">
|
||||
<div class="d-flex gap-1">
|
||||
<button type="submit" class="btn btn-main-action btn-sm flex-grow-1 text-nowrap">
|
||||
<i class="fas fa-filter me-1"></i> {% trans "Apply Filters" %}
|
||||
</button>
|
||||
{% if request.GET.search or request.GET.job or request.GET.status or request.GET.type %}
|
||||
<a href="{% url 'interview_list' %}" class="btn btn-outline-secondary btn-sm" title="{% trans 'Clear Filter' %}">
|
||||
<i class="fas fa-times me-1"></i>{% trans 'Clear Filter' %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<label for="type_filter" class="form-label form-label-sm">{% trans "Type" %}</label>
|
||||
<select name="type" id="type_filter" class="form-select form-select-sm">
|
||||
<option value="">{% trans "All Types" %}</option>
|
||||
<option value="Remote" {% if request.GET.type == "Remote" %}selected{% endif %}>{% trans "Remote" %}</option>
|
||||
<option value="Onsite" {% if request.GET.type == "Onsite" %}selected{% endif %}>{% trans "Onsite" %}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label for="search_filter" class="form-label form-label-sm">{% trans "Search Candidate" %}</label>
|
||||
<input type="text" name="search" id="search_filter" class="form-control form-control-sm"
|
||||
value="{{ request.GET.search }}" placeholder="{% trans 'Name or Email' %}">
|
||||
</div>
|
||||
<div class="col-md-2 d-flex align-items-end">
|
||||
<button type="submit" class="btn btn-main-action btn-sm me-2">
|
||||
<i class="fas fa-filter me-1"></i> {% trans "Filter" %}
|
||||
</button>
|
||||
<a href="{% url 'interview_list' %}" class="btn btn-outline-secondary btn-sm">
|
||||
<i class="fas fa-times me-1"></i> {% trans "Clear" %}
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if interviews %}
|
||||
<div id="interview-list">
|
||||
|
||||
@ -201,9 +201,9 @@
|
||||
<button type="submit" class="btn btn-main-action btn-sm">
|
||||
<i class="fas fa-filter me-1"></i> {% trans "Apply Filters" %}
|
||||
</button>
|
||||
{% if request.GET.q or request.GET.nationality or request.GET.gender %}
|
||||
{% if search_query or nationality %}
|
||||
<a href="{% url 'person_list' %}" class="btn btn-outline-secondary btn-sm">
|
||||
<i class="fas fa-times me-1"></i> {% trans "Clear" %}
|
||||
<i class="fas fa-times me-1"></i> {% trans "Clear Filter" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
@ -71,18 +71,24 @@
|
||||
|
||||
<!-- Search and Filters -->
|
||||
<div class="kaauh-card p-3 mb-4">
|
||||
<form method="get" class="row g-3">
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<label for="search" class="form-label">{% trans "Search" %}</label>
|
||||
<input type="text" class="form-control" id="search" name="q"
|
||||
value="{{ search_query }}" placeholder="{% trans 'Search by agency or job title...' %}">
|
||||
<form method="get" class="row g-3 align-items-end">
|
||||
<div class="col-md-4 me-5">
|
||||
<label for="search" class="form-label">{% trans "Search by name and job" %}</label>
|
||||
<div class="input-group flex-grow-1">
|
||||
|
||||
<input type="text" class="form-control border-start-0 w-50" id="search" name="q"
|
||||
value="{{ search_query }}" placeholder="{% trans 'Search....' %}">
|
||||
<button class="btn btn-outline-primary" type="submit">
|
||||
<i class="fas fa-search"></i>
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="form-group">
|
||||
<div class="form-group-sm">
|
||||
<label for="status" class="form-label">{% trans "Status" %}</label>
|
||||
<select class="form-select" id="status" name="status">
|
||||
<select class="form-select form-select-sm" id="status" name="status">
|
||||
<option value="">{% trans "All Statuses" %}</option>
|
||||
<option value="ACTIVE" {% if status_filter == 'ACTIVE' %}selected{% endif %}>{% trans "Active" %}</option>
|
||||
<option value="EXPIRED" {% if status_filter == 'EXPIRED' %}selected{% endif %}>{% trans "Expired" %}</option>
|
||||
@ -91,15 +97,18 @@
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<div class="form-group">
|
||||
<label class="form-label"> </label>
|
||||
<button type="submit" class="btn btn-outline-secondary w-100">
|
||||
<i class="fas fa-search me-1"></i> {% trans "Search" %}
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="filter-buttons">
|
||||
<button type="submit" class="btn btn-main-action btn-sm">
|
||||
<i class="fas fa-filter me-1"></i> {% trans "Apply Filters" %}
|
||||
</button>
|
||||
{% if status_filter or search_query %}
|
||||
<a href="{% url 'agency_assignment_list' %}" class="btn btn-outline-secondary btn-sm">
|
||||
<i class="fas fa-times me-1"></i> {% trans "Clear Filter" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
|
||||
@ -584,6 +584,7 @@
|
||||
{% if application.phone %}
|
||||
<span class="ms-3"><i class="fas fa-phone me-1"></i> {{ application.phone }}</span>
|
||||
{% endif %}
|
||||
<span class="ms-3"><i class="fas fa-briefcase me-1"></i> {{ application.job.title}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-end">
|
||||
|
||||
@ -251,7 +251,7 @@
|
||||
</button>
|
||||
{% if job_filter or stage_filter or search_query %}
|
||||
<a href="{% url 'application_list' %}" class="btn btn-outline-secondary btn-sm">
|
||||
<i class="fas fa-times me-1"></i> {% trans "Clear" %}
|
||||
<i class="fas fa-times me-1"></i> {% trans "Clear Filter" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user