From f510885092b4ca017e1eca877fdf584221a1b0a0 Mon Sep 17 00:00:00 2001 From: ismail Date: Tue, 18 Nov 2025 13:22:07 +0300 Subject: [PATCH 1/2] more changes and bug fixes --- NorahUniversity/settings.py | 3 + recruitment/__pycache__/forms.cpython-313.pyc | Bin 84599 -> 84667 bytes .../__pycache__/models.cpython-313.pyc | Bin 105856 -> 105836 bytes .../__pycache__/signals.cpython-313.pyc | Bin 7926 -> 9054 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 184252 -> 184448 bytes recruitment/forms.py | 7 +- recruitment/models.py | 4 +- recruitment/signals.py | 33 +++- recruitment/tasks.py | 7 +- recruitment/views.py | 24 +-- recruitment/views_source.py | 76 ++++---- .../partials/candidate_facing_base.html | 178 +++++++++++++++--- templates/base.html | 2 +- templates/jobs/job_list.html | 8 +- .../jobs/partials/applicant_tracking.html | 4 +- templates/people/person_list.html | 6 +- .../candidate_application_detail.html | 41 ++-- templates/recruitment/candidate_detail.html | 16 +- .../recruitment/candidate_screening_view.html | 2 +- templates/recruitment/candidate_signup.html | 49 ++--- templates/recruitment/source_detail.html | 18 +- templates/recruitment/source_form.html | 61 +++--- templates/recruitment/source_list.html | 18 +- 23 files changed, 371 insertions(+), 186 deletions(-) diff --git a/NorahUniversity/settings.py b/NorahUniversity/settings.py index e0387a6..ca20ac3 100644 --- a/NorahUniversity/settings.py +++ b/NorahUniversity/settings.py @@ -487,3 +487,6 @@ MESSAGE_TAGS = { # Custom User Model AUTH_USER_MODEL = "recruitment.CustomUser" + + +ZOOM_WEBHOOK_API_KEY = "2GNDC5Rvyw9AHoGikHXsQB" \ No newline at end of file diff --git a/recruitment/__pycache__/forms.cpython-313.pyc b/recruitment/__pycache__/forms.cpython-313.pyc index 3a761493213b7fa3385e534b822f623be77b1be5..91980bcab461bbc0adac84cc9b7c7f4d376ad841 100644 GIT binary patch delta 11782 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 UZB6^O7s}sG@A%(aXp`ap0q|IMR>$x2|EjA_ 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 W7RtJf@>A*`g#L delta 13806 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 delta 1682 zcmZuxTTC2P7(QoaXYV`gvNu?kG9b4VC<3K|DJ?`mN(1UnFg0vKM|N1&EVJ~?K(WS9 zFAqi&Q+gU7n)rZ;CTgNKn3(va4;tf>JYn`h6OB#O7aFi7#u)#9cLQ5=GV|q}|NG{@ zoy(8o_lD#>pU+L;xw%@KJvh4|*U;-5Z6B>GL?x>4LVU8G)hi@Ll4nr#;L}7>4gIua zV@j&NiS(BR%%AcAE2nByc~DTRVn3u>T(dgu|tn#*);@yF^4 zwnYub2x~3#u_7O;;M>YfU6Bb_Fzp$di2R00PbY+eGp$*=m0i*cF8&X_Or3mL(6}J> z3SN<)7JD4cgq$EVl;8G*WWzRFRj!t(BL6883HJ*ngF-T7wz^E-2#0wn5VEN@RYFy@ zOjLWHc*v7vg!e>(l4DRz*7ColnB9V&}5u{ACK{$Z9z}NVO$$} z^giJ0ax6^a__OFz-AMao(kG~%K|7{3BPA7HlDr|+gOEmpE-B|PdF1z`R{pybpe>My zLL2#p*bs0Kt&0$a%-W7B5|SS95)xF(m;I3%RTvZ%(mp9)h6LuEmZ#qs$tPME+i6hfF2!nd~%t_dd*T@}*e0^~z(hl#gAi3lp z;>|np-tBnr>r?w~o^kF54))Ixe|)E^eY>iCkBBark2r%}(x(%jPv4&26^XBVp9nsA zR|M)WGXSn{dB+6uwJ-gior|qL)XJh=9uO~Kv!}AD}2p15_^sl~C%?X$n?DI^= zp2;vtNdF1Uhva%Xz-Q$;Nd?91){An3&2tt#okO_D->dGS&+?t>asTn8c~`JQ830uw zWaO>vLUvxWvUy{!6fw;ffx5Z17EDk&!ru+OPoLrE!xP>dm`%J2u+n$JusAUOjDHz^ zl#Xm2gzr;&iSI^-M~{*yb`Ez1Ln-qh6pQneLd~t1I%BI~E_hAdf?Z>pSMn^)dbw4j zJb65C)Hx3|S7B<}0kHSjeWb&SS(Y_2b6Q3>=3h9h=q2F3;J?&-2${ZByGhqA6uag% zBb~(y0ruM^w73_t%(UhV4ey7XRvwlzl$ICshR&{lF5zVuogJ$b3ppy1t>N?NWx+=qXWfZk^#s`F9fKpSPXO{Bm zm7IQ-ZGer!XS#W3Q%ALn3ik=X9>Sj?Lc4jcskN$ww(W^TfP)F6yJ^1J^tSu1;H5Q1 GpZ@}|A#w`< diff --git a/recruitment/__pycache__/views.cpython-313.pyc b/recruitment/__pycache__/views.cpython-313.pyc index 7d346a34a26c526bc3d32f3b85f23aa4bb0daa54..ab80ab9d24525cb21e1cd44091cd491eefdb4953 100644 GIT binary patch delta 10700 zcmb6<30PIt)_3iD&js#f6fVf1To8e)g7bhgDmaulTyR!IL`4yB1C})C^Eoy=wUaI_ zOG(W{a|rEN*>g^Wwf8v( zHrN+b*!^z#`PoeL=MRzjAFc8WhrW9fvV6?$XCtbX`;6Ku3cdBKySG}+IiV&~bNy!b z7_3eP?uJ;Q`I1Jq0S^foa^|UO1oO2aI^x|+k4ABq2(axIXpXE35VLbbah)7d< z{6=Qfb2t1dJ!W@sirHxzuhrAtA#TU`5f7e1-C=nb9XXCQ zwty=rGFZfIpCR43>dU1}v>7AYs zs9$+!a??3PlP^$!d@rs(0(h;SHfH9tN%Qw>7`alYuy{hzA$!or1j3IwdJuj* zqzS`>R4v0M-fPp99!?}M=|uOQ8S&y|7YpGhdkknhOqfo0vt@XBoe|zdI%5mTXrY~H z&dq0Hf$3f5<1w@!%b^g6# z0Tos0r`|EcB3+#BqdiOXV^!&=k6T@CQU--_qsbX;KzRXRgf4Da|jOu18(DseapQ9k ziwk_fQ8n%QKmif@&aa)J7P?LHGgVOX$yAbG0Tpb31)E(C;V!O-NAyY6N0FBtj>dtn31{qgnQs(FWh=(V z!yAsnOlZj*@eH={<59d34+*di9SP8j{B|e6IJk>D6JUgvKj+{|K3 z-6mu#6Mn+CTSF|w5+GVaV_dV)Mx(sDvICm?8!7XkH z!H;#_b)T*S`tW{0DoMN%Ks2ZN)5jk0x2qvg z;CtghN6_rv%t{$y2cGH;W32Zhp3nzc1hTxm!49-$tPPIq1BF&k2=PoGxCPDeNM9K0 zP}WpxR<0>uVlXZhV*f=r#;3xNKot%($9Ny7iMB5l5~Dp1u+dIzRCQfBqKw?YyQ#1~ zumd+S7~;cSw5SPTyweYs`}?VB@Ssy8MnG)6%kxG+duWf_M?gYUN7lfz!{sBlvw3Cc z8^+@C+Yyigtub*V^sshj#x9sY5|&xJGJYL@7)i5!IYzs|VOOrH@T6lOH^f<$o9USE zhBS!5UG(GreMh--YVf=8Xr{2zv22+43Rjcg4}L=!Jl-+;T^yJRZLPf+?}3kJLMwZ3 z#``e1fqOE+Y3s*0gAa|*GGU0XO9e(P!-i41!gf6)%Is(O@j7PYK$~_=nGnu^C%(%n zm3b8=)kjZu;J$psQc+l$LoTJVKzqEL0}=NAj1ORthL$Pd3gML|{fL{&c5OycnJkfm zFm(znZr!jnRA4vzv*Dt} zK7$EISV2B|N$9B+5W#H>l28fY!doSj?VrTtQku-gIJuN^=%4iL3b&R^hgi^^Y0=ny z8^oGL7T_KWgy7&Z@WVGOlri%kV0|>&DOQw0kiH|<2e*|$3u-=H1|33_(>e9sE*H*3 zS%|@NVTiZQ)4!%`_CqsVIv09d7usp{?Z*%1LbUF_?Lg}z@QNrk>61#k#kz&toFWQg zychLE{dKFJ8j4M~mZkSy66&y0|4Ht*nsC=2AiR5n zaxZ4$!*1Mz!@A2mquhT?(zv3c*-5Fx2PbiPJ(b6Uw@4) zA9K*3BiaJf6@SNyqUA*w{9|hTW2$32eC*$G!N7}N{?8{~XwtT(N!yRT+WsXVa%0Du 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 diff --git a/recruitment/forms.py b/recruitment/forms.py index 677bdcb..1a6ba6a 100644 --- a/recruitment/forms.py +++ b/recruitment/forms.py @@ -55,7 +55,7 @@ class SourceForm(forms.ModelForm): class Meta: model = Source - fields = ["name", "source_type", "description", "ip_address", "is_active"] + fields = ["name", "source_type", "description", "ip_address","trusted_ips", "is_active"] widgets = { "name": forms.TextInput( attrs={ @@ -81,6 +81,9 @@ class SourceForm(forms.ModelForm): "ip_address": forms.TextInput( attrs={"class": "form-control", "placeholder": "192.168.1.100"} ), + "trusted_ips":forms.TextInput( + attrs={"class": "form-control", "placeholder": "192.168.1.100","required": False} + ), "is_active": forms.CheckboxInput(attrs={"class": "form-check-input"}), } @@ -2228,7 +2231,7 @@ class CandidateSignupForm(forms.ModelForm): 'last_name': forms.TextInput(attrs={'class': 'form-control'}), 'email': forms.EmailInput(attrs={'class': 'form-control'}), 'phone': forms.TextInput(attrs={'class': 'form-control'}), - 'gpa': forms.TextInput(attrs={'class': 'form-control'}), + # 'gpa': forms.TextInput(attrs={'class': 'form-control'}), "nationality": forms.Select(attrs={'class': 'form-control select2'}), 'date_of_birth': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}), 'gender': forms.Select(attrs={'class': 'form-control'}), diff --git a/recruitment/models.py b/recruitment/models.py index f00cb80..b05faad 100644 --- a/recruitment/models.py +++ b/recruitment/models.py @@ -99,9 +99,9 @@ class JobPosting(Base): # Core Fields title = models.CharField(max_length=200) department = models.CharField(max_length=100, blank=True) - job_type = models.CharField(max_length=20, choices=JOB_TYPES, default="FULL_TIME") + job_type = models.CharField(max_length=20, choices=JOB_TYPES, default="Full-time") workplace_type = models.CharField( - max_length=20, choices=WORKPLACE_TYPES, default="ON_SITE" + max_length=20, choices=WORKPLACE_TYPES, default="On-site" ) # Location diff --git a/recruitment/signals.py b/recruitment/signals.py index 51b73b6..ab502eb 100644 --- a/recruitment/signals.py +++ b/recruitment/signals.py @@ -18,7 +18,9 @@ from .models import ( Notification, HiringAgency, Person, + Source, ) +from .forms import generate_api_key, generate_api_secret from django.contrib.auth import get_user_model logger = logging.getLogger(__name__) @@ -29,11 +31,10 @@ User = get_user_model() @receiver(post_save, sender=JobPosting) def format_job(sender, instance, created, **kwargs): if created or not instance.ai_parsed: - try: - form_template = instance.form_template - except FormTemplate.DoesNotExist: + form = getattr(instance, "form_template", None) + if not form: FormTemplate.objects.get_or_create( - job=instance, is_active=False, name=instance.title + job=instance, is_active=True, name=instance.title ) async_task( "recruitment.tasks.format_job_description", @@ -469,3 +470,27 @@ def person_created(sender, instance, created, **kwargs): ) instance.user = user instance.save() + + +@receiver(post_save, sender=Source) +def source_created(sender, instance, created, **kwargs): + """ + Automatically generate API key and API secret when a new Source is created. + """ + if created: + # Only generate keys if they don't already exist + if not instance.api_key and not instance.api_secret: + logger.info(f"Generating API keys for new Source: {instance.pk} - {instance.name}") + + # Generate API key and secret using existing secure functions + api_key = generate_api_key() + api_secret = generate_api_secret() + + # Update the source with generated keys + instance.api_key = api_key + instance.api_secret = api_secret + instance.save(update_fields=['api_key', 'api_secret']) + + logger.info(f"API keys generated successfully for Source: {instance.name} (Key: {api_key[:8]}...)") + else: + logger.info(f"Source {instance.name} already has API keys, skipping generation") diff --git a/recruitment/tasks.py b/recruitment/tasks.py index b4cd871..7eaf1d4 100644 --- a/recruitment/tasks.py +++ b/recruitment/tasks.py @@ -28,7 +28,7 @@ logger = logging.getLogger(__name__) OPENROUTER_API_KEY ='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' # OPENROUTER_MODEL = 'qwen/qwen-2.5-72b-instruct:free' -OPENROUTER_MODEL = 'openai/gpt-oss-20b' +OPENROUTER_MODEL = 'qwen/qwen-2.5-72b-instruct' # OPENROUTER_MODEL = 'openai/gpt-oss-20b' # OPENROUTER_MODEL = 'mistralai/mistral-small-3.2-24b-instruct:free' @@ -506,6 +506,7 @@ def handle_zoom_webhook_event(payload): Background task to process a Zoom webhook event and update the local ZoomMeeting status. It handles: created, updated, started, ended, and deleted events. """ + print(payload) event_type = payload.get('event') object_data = payload['payload']['object'] @@ -534,7 +535,9 @@ def handle_zoom_webhook_event(payload): # elif event_type == 'meeting.updated': # Only update time fields if they are in the payload print(object_data) - meeting_instance.start_time = object_data.get('start_time', meeting_instance.start_time) + meeting_start_time = object_data.get('start_time', meeting_instance.start_time) + if meeting_start_time: + meeting_instance.start_time = datetime.fromisoformat(meeting_start_time) meeting_instance.duration = object_data.get('duration', meeting_instance.duration) meeting_instance.timezone = object_data.get('timezone', meeting_instance.timezone) diff --git a/recruitment/views.py b/recruitment/views.py index 8201e30..675ee16 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -1336,6 +1336,7 @@ def application_submit(request, template_slug): # email = submission.responses.get(field__label="Email Address") # phone = submission.responses.get(field__label="Phone Number") # address = submission.responses.get(field__label="Address") + gpa = submission.responses.get(field__label="GPA") resume = submission.responses.get(field__label="Resume Upload") @@ -1346,6 +1347,8 @@ def application_submit(request, template_slug): submission.save() # time=timezone.now() person = request.user.person_profile + person.gpa = gpa.value if gpa else None + person.save() Application.objects.create( person = person, resume=resume.get_file if resume.is_file else None, @@ -1806,7 +1809,7 @@ def candidate_screening_view(request, slug): min_experience_str = request.GET.get("min_experience") screening_rating = request.GET.get("screening_rating") tier1_count_str = request.GET.get("tier1_count") - gpa = request.GET.get("gpa") + gpa = request.GET.get("GPA") try: # Check if the string value exists and is not an empty string before conversion @@ -1854,8 +1857,9 @@ def candidate_screening_view(request, slug): ) if gpa: candidates = candidates.filter( - person__gpa = gpa + person__gpa__gt= gpa ) + print(candidates) if tier1_count > 0: candidates = candidates[:tier1_count] @@ -3018,7 +3022,6 @@ def is_superuser_check(user): def create_staff_user(request): if request.method == "POST": form = StaffUserCreationForm(request.POST) - print(form) if form.is_valid(): form.save() messages.success( @@ -3034,7 +3037,7 @@ def create_staff_user(request): @staff_user_required def admin_settings(request): - staffs = User.objects.filter(is_superuser=False) + staffs = User.objects.filter(user_type="staff",is_superuser=False) form = ToggleAccountForm() context = {"staffs": staffs, "form": form} return render(request, "user/admin_settings.html", context) @@ -3097,12 +3100,11 @@ def account_toggle_status(request, pk): @csrf_exempt -@staff_user_required def zoom_webhook_view(request): - print(request.headers) - print(settings.ZOOM_WEBHOOK_API_KEY) - # if api_key != settings.ZOOM_WEBHOOK_API_KEY: - # return HttpResponse(status=405) + api_key = request.headers.get("X-Zoom-API-KEY") + if api_key != settings.ZOOM_WEBHOOK_API_KEY: + return HttpResponse(status=405) + if request.method == "POST": try: payload = json.loads(request.body) @@ -5497,7 +5499,7 @@ def candidate_signup(request, slug): gender = form.cleaned_data["gender"] nationality = form.cleaned_data["nationality"] address = form.cleaned_data["address"] - gpa = form.cleaned_data["gpa"] + # gpa = form.cleaned_data["gpa"] password = form.cleaned_data["password"] user = User.objects.create_user( @@ -5512,7 +5514,7 @@ def candidate_signup(request, slug): phone=phone, gender=gender, nationality=nationality, - gpa=gpa, + # gpa=gpa, address=address, user = user ) diff --git a/recruitment/views_source.py b/recruitment/views_source.py index f594a6f..2f60d2e 100644 --- a/recruitment/views_source.py +++ b/recruitment/views_source.py @@ -204,26 +204,27 @@ def generate_api_keys_view(request, pk): source.save() # Log the key regeneration - IntegrationLog.objects.create( - source=source, - action=IntegrationLog.ActionChoices.CREATE, - endpoint=f'/api/sources/{source.pk}/generate-keys/', - method='POST', - request_data={ - 'name': source.name, - 'old_api_key': old_api_key[:8] + '...' if old_api_key else None, - 'new_api_key': new_api_key[:8] + '...' - }, - ip_address=request.META.get('REMOTE_ADDR'), - user_agent=request.META.get('HTTP_USER_AGENT', '') - ) + # IntegrationLog.objects.create( + # source=source, + # action=IntegrationLog.ActionChoices.CREATE, + # endpoint=f'/api/sources/{source.pk}/generate-keys/', + # method='POST', + # request_data={ + # 'name': source.name, + # 'old_api_key': old_api_key[:8] + '...' if old_api_key else None, + # 'new_api_key': new_api_key[:8] + '...' + # }, + # ip_address=request.META.get('REMOTE_ADDR'), + # user_agent=request.META.get('HTTP_USER_AGENT', '') + # ) - return JsonResponse({ - 'success': True, - 'api_key': new_api_key, - 'api_secret': new_api_secret, - 'message': 'API keys regenerated successfully' - }) + return redirect('source_detail', pk=source.pk) + # return JsonResponse({ + # 'success': True, + # 'api_key': new_api_key, + # 'api_secret': new_api_secret, + # 'message': 'API keys regenerated successfully' + # }) return JsonResponse({'error': 'Invalid request method'}, status=405) @@ -244,27 +245,28 @@ def toggle_source_status_view(request, pk): source.save() # Log the status change - IntegrationLog.objects.create( - source=source, - action=IntegrationLog.ActionChoices.SYNC, - endpoint=f'/api/sources/{source.pk}/toggle-status/', - method='POST', - request_data={ - 'name': source.name, - 'old_status': old_status, - 'new_status': source.is_active - }, - ip_address=request.META.get('REMOTE_ADDR'), - user_agent=request.META.get('HTTP_USER_AGENT', '') - ) + # IntegrationLog.objects.create( + # source=source, + # action=IntegrationLog.ActionChoices.SYNC, + # endpoint=f'/api/sources/{source.pk}/toggle-status/', + # method='POST', + # request_data={ + # 'name': source.name, + # 'old_status': old_status, + # 'new_status': source.is_active + # }, + # ip_address=request.META.get('REMOTE_ADDR'), + # user_agent=request.META.get('HTTP_USER_AGENT', '') + # ) status_text = 'activated' if source.is_active else 'deactivated' - return JsonResponse({ - 'success': True, - 'is_active': source.is_active, - 'message': f'Source "{source.name}" {status_text} successfully' - }) + return redirect('source_detail', pk=source.pk) + # return JsonResponse({ + # 'success': True, + # 'is_active': source.is_active, + # 'message': f'Source "{source.name}" {status_text} successfully' + # }) def copy_to_clipboard_view(request): """HTMX endpoint to copy text to clipboard""" diff --git a/templates/applicant/partials/candidate_facing_base.html b/templates/applicant/partials/candidate_facing_base.html index 1c7c277..785d21c 100644 --- a/templates/applicant/partials/candidate_facing_base.html +++ b/templates/applicant/partials/candidate_facing_base.html @@ -32,8 +32,8 @@ --gray-text: #6c757d; --kaauh-border: #d0d7de; /* Cleaner border color */ --kaauh-shadow: 0 15px 35px rgba(0, 0, 0, 0.1); /* Deeper shadow for premium look */ - --kaauh-dark-bg: #0d0d0d; - --kaauh-dark-contrast: #1c1c1c; + --kaauh-dark-bg: #0d0d0d; + --kaauh-dark-contrast: #1c1c1c; /* CALCULATED STICKY HEIGHTS (As provided in base) */ --navbar-height: 56px; @@ -43,17 +43,145 @@ body { min-height: 100vh; - background-color: #f0f0f5; + background-color: #f0f0f5; padding-top: 0; } .text-primary-theme { color: var(--kaauh-teal) !important; } .text-primary-theme-hover:hover { color: var(--kaauh-teal-dark) !important; } + /* Language Dropdown Styles */ + .language-toggle-btn { + background-color: transparent; + border: 1px solid var(--kaauh-border); + color: var(--kaauh-teal); + padding: 0.5rem 1rem; + border-radius: 0.5rem; + transition: all 0.3s ease; + display: flex; + align-items: center; + gap: 0.5rem; + font-weight: 500; + min-width: 120px; + justify-content: center; + } + + .language-toggle-btn:hover { + background-color: var(--kaauh-teal-light); + border-color: var(--kaauh-teal); + color: var(--kaauh-teal-dark); + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(0, 99, 110, 0.15); + } + + .language-toggle-btn:focus { + outline: none; + box-shadow: 0 0 0 0.2rem rgba(0, 99, 110, 0.25); + border-color: var(--kaauh-teal); + } + + .language-toggle-btn::after { + margin-left: 0.5rem; + } + + .dropdown-menu { + border: 1px solid var(--kaauh-border); + border-radius: 0.5rem; + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); + padding: 0.5rem; + min-width: 180px; + } + + .dropdown-menu .dropdown-item { + padding: 0.75rem 1rem; + transition: all 0.2s ease; + border-radius: 0.375rem; + margin: 0.25rem 0; + display: flex; + align-items: center; + gap: 0.75rem; + font-weight: 500; + border: none; + background: transparent; + width: 100%; + text-align: left; + } + + .dropdown-menu .dropdown-item:hover { + background-color: var(--kaauh-teal); + color: white; + transform: translateX(4px); + } + + .dropdown-menu .dropdown-item:focus { + outline: none; + box-shadow: 0 0 0 0.2rem rgba(0, 99, 110, 0.25); + } + + .dropdown-menu .dropdown-item.active { + background-color: var(--kaauh-teal); + color: white; + font-weight: 600; + box-shadow: 0 2px 4px rgba(0, 99, 110, 0.2); + } + + .dropdown-menu .dropdown-item.active:hover { + background-color: var(--kaauh-teal-dark); + } + + .flag-emoji { + font-size: 1.2rem; + line-height: 1; + min-width: 24px; + text-align: center; + } + + .language-text { + font-size: 0.9rem; + font-weight: 500; + } + + /* RTL Support for Language Dropdown */ + html[dir="rtl"] .language-toggle-btn { + flex-direction: row-reverse; + } + + html[dir="rtl"] .dropdown-menu .dropdown-item { + flex-direction: row-reverse; + text-align: right; + } + + html[dir="rtl"] .dropdown-menu .dropdown-item:hover { + transform: translateX(-4px); + } + + /* Mobile Responsiveness */ + @media (max-width: 768px) { + .language-toggle-btn { + min-width: 100px; + padding: 0.4rem 0.8rem; + font-size: 0.9rem; + } + + .dropdown-menu { + min-width: 160px; + } + + .dropdown-menu .dropdown-item { + padding: 0.6rem 0.8rem; + font-size: 0.85rem; + } + + .flag-emoji { + font-size: 1rem; + min-width: 20px; + } + } + .bg-kaauh-teal { background-color: #00636e; } - + .btn-main-action { background-color: var(--kaauh-teal); color: white; @@ -67,7 +195,7 @@ background-color: var(--kaauh-teal-dark); color: white; transform: translateY(-2px); /* More pronounced lift */ - box-shadow: 0 10px 20px rgba(0, 99, 110, 0.5); + box-shadow: 0 10px 20px rgba(0, 99, 110, 0.5); } /* ---------------------------------------------------------------------- */ /* 1. DARK HERO STYLING (High Contrast) */ @@ -75,16 +203,16 @@ .hero-section { background: linear-gradient(135deg, var(--kaauh-dark-contrast) 0%, var(--kaauh-dark-bg) 100%); padding: 4rem 0; /* Reduced from 8rem to 4rem */ - margin-top: -1px; - color: white; - position: relative; + margin-top: -1px; + color: white; + position: relative; overflow: hidden; } .hero-title { font-size: 2.5rem; /* Reduced from 3.5rem to 2.5rem */ font-weight: 800; /* Extra bold */ line-height: 1.1; - letter-spacing: -0.05em; + letter-spacing: -0.05em; max-width: 900px; } .hero-section .lead { @@ -104,7 +232,7 @@ padding: 10rem 0; } .hero-title { - font-size: 5.5rem; + font-size: 5.5rem; } } @@ -153,20 +281,20 @@ background-color: #f0f0f5; /* Separates the job list from the white path section */ padding-top: 3rem; } - + .job-listing-card { - border: 1px solid var(--kaauh-border); - border-left: 6px solid var(--kaauh-teal); + border: 1px solid var(--kaauh-border); + border-left: 6px solid var(--kaauh-teal); border-radius: 0.75rem; - padding: 2rem !important; + padding: 2rem !important; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05); /* Lighter default shadow */ } .job-listing-card:hover { transform: translateY(-3px); /* Increased lift */ box-shadow: 0 12px 25px rgba(0, 99, 110, 0.15); /* Stronger hover shadow */ - background-color: var(--kaauh-teal-light); + background-color: var(--kaauh-teal-light); } - + .card.sticky-top-filters { box-shadow: var(--kaauh-shadow); /* Uses the deeper card shadow */ } @@ -215,7 +343,8 @@
{% csrf_token %}
@@ -224,7 +353,8 @@
{% csrf_token %}
@@ -239,7 +369,7 @@
{# Use responsive columns matching the main content block for alignment #} -
+
{% for message in messages %}