|
23 | 23 | from django.contrib import messages |
24 | 24 | from django.contrib.auth.decorators import login_required |
25 | 25 | from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin |
26 | | -from django.contrib.auth.models import User |
| 26 | +from django.contrib.auth.models import Group, User |
27 | 27 | from django.contrib.contenttypes.models import ContentType |
28 | 28 | from django.contrib.contenttypes.prefetch import GenericPrefetch |
29 | 29 | from django.contrib.sites.models import Site |
|
34 | 34 | from django.db import transaction |
35 | 35 | from django.db.models import ( |
36 | 36 | Count, |
| 37 | + Exists, |
37 | 38 | ExpressionWrapper, |
38 | 39 | F, |
39 | 40 | FloatField, |
|
66 | 67 | from recoco.apps.geomatics.serializers import RegionSerializer |
67 | 68 | from recoco.apps.home import models as home_models |
68 | 69 | from recoco.apps.onboarding import utils as onboarding_utils |
69 | | -from recoco.apps.projects.models import Project, Topic |
| 70 | +from recoco.apps.projects.models import ( |
| 71 | + Project, |
| 72 | + ProjectMember, |
| 73 | + ProjectSwitchtender, |
| 74 | + Topic, |
| 75 | +) |
70 | 76 | from recoco.apps.reminders import models as reminders_models |
71 | 77 | from recoco.apps.resources.models import Category |
72 | 78 | from recoco.apps.tasks.models import Task |
@@ -477,14 +483,65 @@ def organization_details(request, organization_id): |
477 | 483 | def user_list(request): |
478 | 484 | has_perm_or_403(request.user, "use_crm", request.site) |
479 | 485 |
|
480 | | - # filtered users |
481 | | - users = filters.UserFilter( |
482 | | - request.GET, |
483 | | - queryset=User.objects.filter( |
484 | | - profile__sites=request.site, profile__deleted__isnull=True |
485 | | - ).prefetch_related("profile__organization"), |
| 486 | + site = request.site |
| 487 | + advisor_group_name = make_group_name_for_site("advisor", site) |
| 488 | + staff_group_name = make_group_name_for_site("staff", site) |
| 489 | + admin_group_name = make_group_name_for_site("admin", site) |
| 490 | + selected_departments = request.GET.getlist("departments") |
| 491 | + |
| 492 | + base_qs = ( |
| 493 | + User.objects.filter(profile__sites=site, profile__deleted__isnull=True) |
| 494 | + .prefetch_related("profile__organization") |
| 495 | + .annotate( |
| 496 | + projects_count=( |
| 497 | + Subquery( |
| 498 | + Project.objects.filter( |
| 499 | + Q( |
| 500 | + pk__in=Subquery( |
| 501 | + ProjectMember.objects.filter( |
| 502 | + member_id=OuterRef(OuterRef("id")) |
| 503 | + ).values("project_id") |
| 504 | + ) |
| 505 | + ) |
| 506 | + | Q( |
| 507 | + pk__in=Subquery( |
| 508 | + ProjectSwitchtender.objects.filter( |
| 509 | + switchtender_id=OuterRef(OuterRef("id")) |
| 510 | + ).values("project_id") |
| 511 | + ) |
| 512 | + ) |
| 513 | + ) |
| 514 | + .distinct() |
| 515 | + .annotate(count=Func(F("id"), function="Count")) |
| 516 | + .values("count") |
| 517 | + ) |
| 518 | + ), |
| 519 | + is_advisor=Exists( |
| 520 | + Group.objects.filter(name=advisor_group_name, user=OuterRef("pk")) |
| 521 | + ), |
| 522 | + is_staff_member=Exists( |
| 523 | + Group.objects.filter(name=staff_group_name, user=OuterRef("pk")) |
| 524 | + ), |
| 525 | + is_admin=Exists( |
| 526 | + Group.objects.filter(name=admin_group_name, user=OuterRef("pk")) |
| 527 | + ), |
| 528 | + ) |
486 | 529 | ) |
487 | 530 |
|
| 531 | + users = filters.UserFilter(request.GET, queryset=base_qs) |
| 532 | + |
| 533 | + has_active_filter = any( |
| 534 | + [ |
| 535 | + request.GET.get("username"), |
| 536 | + request.GET.get("role"), |
| 537 | + selected_departments, |
| 538 | + request.GET.get("inactive"), |
| 539 | + ] |
| 540 | + ) |
| 541 | + |
| 542 | + max_users_without_filter = 25 |
| 543 | + display_qs = users.qs if has_active_filter else users.qs[:max_users_without_filter] |
| 544 | + |
488 | 545 | # required by default on crm |
489 | 546 | search_form = forms.CRMSearchForm() |
490 | 547 |
|
|
0 commit comments