From 6baa5f4e3d7e26465d5d465597e39f09a9755b3b Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 9 Jun 2026 23:18:34 +0000 Subject: [PATCH] Knb --- core/__pycache__/views.cpython-311.pyc | Bin 12893 -> 13713 bytes core/templates/core/job_list.html | 9 +++++++++ core/templates/core/ops_dashboard.html | 11 +++++++++++ core/views.py | 25 ++++++++++++++++++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index 09ca623119931654abd6337b3a138633772b2f52..5a85e4b6dc53f36f75a276d4ff1beab65a00cd4e 100644 GIT binary patch delta 2421 zcmZ`*TW=dh7~S<{*WR^v9beXW$4+cFPVA;h+=ezl3#Doi^j<(n2+PSjP0}Pz$L=N3 zm;|*vfKW>rsj47VjZg}x22}D3$`gHygQYB%g8G6~2_dLPauSF~C zWWCJEylj})suW6}F>W?KYKcM6XLBw@?so)0l$$8bt?b z@HW)t8FbHTMK>jpHlgn&FWrLvk^;23iWVf=19}})0jbXPKvluIrIdOjL0zzIA!ybK z64Vr=Ed(7h1tk=7nEhEx{fra^b+WzbYI^b_Hb+wd4(jt9xrrZgO(`ByV~vV=9)0C# z*BYQ9Z@_e$-62z(H=rq;GZNOUag@q>8%rtKDZ4gv7ih>s8mgcgYM?gDtaHc2dOT*T zN7=S|L{Verdi+0m{0M85bpq5Oe@AdTG|KLIeu2&j*{*sO{8W_efx>P4?c5>XPqm$- zB3`uM3?|E(Od4d%%w+09DwBP}$A&;EnN7)wWVXz0h}og^#8h%}dPWypiy|6u3fC$# z>2Vn^#q1g*k(^nNXOfHeoeWL$XvyVPfs^Q=D?>}@J$Dz~jV`&9-6H74MSx7;H~~L_ z69i6TC>zGog9&oP#6)rmbfc&4K4z3;`_Rp(7aj3%{4^fEk9+2>3YDT^^s#5~guMWwAA{$xjr;cu9=U9YTM4ezz!sZAI`c3%(l{i$X_9=$Jc*?t7;qMv+ohxYszTLa?%+S3#V>u6DlK>i-vXHf zd*~0);eb#3As${wQ-PyRLlMIM3v?P)oFrwIs8f zzsVevWsz6vRAr55N5~a!7XBEEcd0hWT%mF-wt)kX#p(;OrkZk)FKEX$a4JY_02=_y zRt8Nt}5teN6=%#;fbKlP~Ws4ht7w3 zv^?aoOo@c0=SY~(3q-=S0X+-FXglf*hXPHWAycyLBbBp$GAd`prkS9fXesPQ10hjW zaG_`6owR_bV<@q$x5c^nAO$xmi!-7oCsyxoN0%ZJ-|(-36=@>9nw+WjI2zeg@RFH* zxt1p7`moc)8YiLTR@uM#m9W!r&Z0nT zYKDsu>1NZ}vd8a^f4cU?y4Jz09YFhf^Sv7#Tf1Qs&kMNi(X%WS{(gRgb@smX3E?^iB%R(lb%%006hDOq(L#YfP zeiCs4@>>AT5Ew_lbwy1RB%CCWCNPC;(e1Mt5&{en^9JYgli9{DWigXJ2ZmA&-)c;x zft&(~!RazrV`LI%GvGW~e1X6f0v8EXE$%9bJ|l3Az~>l@0Ab9SG5Gy{v=9w)U*Py_ zGWikuH9GR{M(2B}$oG`^o)x}-neQ+1yG#7;s`EKI6^lo)colO{vBwmtt72sB*pe{J z9j%xsdw4~PEK8AZgG)PJElT@K(*C)lXdvcgN-c+fnO#~u9n+|sRz0^WSQJygV#+3g`uLhqRZXK>f2WGZ7=zDH3FqAUfG7%Rj4{VVjTwNF@>Q*IS{j>)J^Oh z5bFcvX5Uf3MPdhrC%P9W((<|S)XRWenEc0*Ilidxank#C(t9dY1Ey%6#`PNDIz*H4 I^RZh0KY=?l$^ZZW delta 1858 zcmZ`(T})#|6rO2sf9`F2`+rLdl=9c5P+{#TPZc$QlwG5{$kWqYoBcqtO@7Tqw|@lgyVhXTE#p z+%w;qcdzcK@<%S0L~wk*+>v=AdSAXBa5!;k#`*hi!bYs^G=(37L$I!N!)3t@zbK)4 zThYEo3Au}NZxk$yYR@psiWNQ!1i&dc1xAY^oDVfp2^K@m)M20#mgCK$g_$&^LT+HD zqU%^R^HGAiC?6vThlD{U6y3E1-CN0x5N1(5YbMMW=YGDJXRtNst@+BvtSh4N2Xl2k zfsqV>vXHbEL?*5{&>swXRZ<;^5+*`lSb0x$zb?%Xy}oh;A*xUHSCdyMvop#}%*+Jc zddSSk6+7duSbD5t5t2Fhng7}MajpS}1T3&0#*~&GCaHlt(kd-D^u%FIM${m4tl>T1 z<#%n2r%6JAbfj(L=ZKZ!#qHMDgSR0^gK(pv3qEOhG33jfw7f|fT(CW~!ZO>#UCuV2zx|YM`I46#p;9hSWzHXd^o6+w;Z_34;ZtITZ-t@F? zwqJW7X297bOHWsiCV7XaZ3BZSi}&lcRW5&(^0zXfJD^V0{ixU3N{l>Fq-h-6R{UX zfnO7DxSeSA)&Q{*rbXkI=4g zh;bO^Z~-Afw?(dgJ*%f?wO8T8H_W!2*HijJeqw4mJ2REeYrN+YVQrGLrZ}ju)RXk2x%o1OS2#?=7d<_bSGk!% zNVt!5ag2NU0ozhOyP#pviEDXnj(g`hEON+lF#7ujw{CKHlfx|zZz1IQ!v%}IZPF4N zA8=1UtoKes?qs9;TkpkhycfTm-h6iafp=nS15OI2uwRsRWPizXy5uSBTFh?wAwejc z{cx{;tZyfJVk_FS6+Lxelv)PM?f6ldRAAQ@a#|k}gfa=i(7;wNe^@l$>Kf1DW1>a4 y&0n9t?Puq*>cVXLoc2C0DbD6uPCTqXzb9Cc8PcL0&Ie0dy<(EkF9|Axu{ diff --git a/core/templates/core/job_list.html b/core/templates/core/job_list.html index 9327b35..e8fdeda 100644 --- a/core/templates/core/job_list.html +++ b/core/templates/core/job_list.html @@ -41,6 +41,15 @@ {% for value,label in source_status_choices %}{% endfor %} +
+ + +
diff --git a/core/templates/core/ops_dashboard.html b/core/templates/core/ops_dashboard.html index 84d8c4d..216bb49 100644 --- a/core/templates/core/ops_dashboard.html +++ b/core/templates/core/ops_dashboard.html @@ -41,6 +41,17 @@ {% for value,label in status_choices %}{% endfor %} +
+ + +
diff --git a/core/views.py b/core/views.py index 733eebb..b2fed62 100644 --- a/core/views.py +++ b/core/views.py @@ -96,6 +96,15 @@ def job_list(request): contract = request.GET.get("contract", "").strip() family = request.GET.get("family", "").strip() source_status = request.GET.get("source_status", "").strip() + sort = request.GET.get("sort", "newest").strip() + + job_sort_map = { + "newest": "-created_at", + "oldest": "created_at", + "company_az": "company", + "company_za": "-company", + } + order_by = job_sort_map.get(sort, "-created_at") jobs_qs = JobPosting.objects.select_related("source").filter(is_active=True) if query: @@ -111,6 +120,7 @@ def job_list(request): jobs_qs = jobs_qs.filter(source__family=family) if source_status: jobs_qs = jobs_qs.filter(source__status=source_status) + jobs_qs = jobs_qs.order_by(order_by) paginator = Paginator(jobs_qs, 9) page_number = request.GET.get("page") @@ -127,6 +137,7 @@ def job_list(request): "contract": contract, "family": family, "source_status": source_status, + "sort": sort, "contract_choices": JobPosting.ContractType.choices, "family_choices": JobSource.Family.choices, "source_status_choices": JobSource.Status.choices, @@ -153,8 +164,19 @@ def ops_dashboard(request): query = request.GET.get("q", "").strip() family = request.GET.get("family", "").strip() status = request.GET.get("status", "").strip() + sort = request.GET.get("sort", "family_name").strip() - sources_qs = JobSource.objects.annotate(job_total=Count("jobs")).order_by("family", "name") + source_sort_map = { + "family_name": ("family", "name"), + "name_az": ("name",), + "name_za": ("-name",), + "status": ("status", "name"), + "offers_high": ("-job_total", "name"), + "offers_low": ("job_total", "name"), + } + source_order_by = source_sort_map.get(sort, ("family", "name")) + + sources_qs = JobSource.objects.annotate(job_total=Count("jobs")).order_by(*source_order_by) if query: sources_qs = sources_qs.filter(Q(name__icontains=query) | Q(owner__icontains=query) | Q(url__icontains=query)) if family: @@ -205,6 +227,7 @@ def ops_dashboard(request): "query": query, "family": family, "status": status, + "sort": sort, "family_choices": JobSource.Family.choices, "status_choices": JobSource.Status.choices, "current_filters_qs": current_filters_qs,