diff --git a/attendees/occasions/services/attendance_service.py b/attendees/occasions/services/attendance_service.py index 7490f0c3..7d698d55 100644 --- a/attendees/occasions/services/attendance_service.py +++ b/attendees/occasions/services/attendance_service.py @@ -133,6 +133,11 @@ def by_organization_meet_characters(current_user, meet_slugs, character_slugs, s | Q(attending__registration__registrant=current_user.attendee)), Q.AND) + if search_value and search_operation == 'contains' and search_expression == 'attending_label': # only contains supported now + extra_filters.add((Q(attending__registration__registrant__infos__icontains=search_value) + | + Q(attending__attendee__infos__icontains=search_value)), Q.AND) + if filter: # only support single/double level so far filter_list = json.loads(filter) search_term = (filter_list[-1][-1] diff --git a/attendees/occasions/services/gathering_service.py b/attendees/occasions/services/gathering_service.py index 3b1e1b8b..6cce7ceb 100644 --- a/attendees/occasions/services/gathering_service.py +++ b/attendees/occasions/services/gathering_service.py @@ -52,7 +52,7 @@ def by_family_meets(user, meet_slugs): ) # another way is to get assemblys from registration, but it relies on attendingmeet validations @staticmethod - def by_organization_meets(current_user, meet_slugs, start, finish, orderbys, filter): + def by_organization_meets(current_user, meet_slugs, start, finish, orderbys, filter, search_value, search_expression=None, search_operation=None,): orderby_list = GatheringService.orderby_parser(orderbys) extra_filters = Q( meet__assembly__division__organization__slug=current_user.organization.slug @@ -63,11 +63,16 @@ def by_organization_meets(current_user, meet_slugs, start, finish, orderbys, fil | Q(attendings__registration__registrant=current_user.attendee)), Q.AND) + if search_value and search_operation == 'contains' and search_expression == 'display_name': # for searching in drop down of popup editor + extra_filters.add((Q(display_name__icontains=search_value) + | + Q(infos__icontains=search_value)), Q.AND) + if filter: # [["meet","=",1],"or",["meet","=",2]] is already filtered by slugs above filter_term = json.loads(filter) # [["display_name","contains","207"],"or",["site","contains","207"]] if isinstance(filter_term[0], list) and filter_term[0][1] == 'contains': search_term = filter_term[0][2] - if search_term: + if search_term: # for searching in the upper right search bar of datagrid search_filters = Q(display_name__icontains=search_term) # Gathering level search_filters.add(Q(infos__icontains=search_term), Q.OR) # Gathering level diff --git a/attendees/occasions/views/api/organization_meet_gatherings.py b/attendees/occasions/views/api/organization_meet_gatherings.py index fcf08929..b17579f7 100644 --- a/attendees/occasions/views/api/organization_meet_gatherings.py +++ b/attendees/occasions/views/api/organization_meet_gatherings.py @@ -107,6 +107,9 @@ def get_queryset(self): finish=self.request.query_params.get("finish"), orderbys=orderby_list, filter=self.request.query_params.get("filter"), + search_value=self.request.query_params.get("searchValue"), + search_expression=self.request.query_params.get("searchExpr"), + search_operation=self.request.query_params.get("searchOperation"), ) else: diff --git a/attendees/persons/services/atteningmeet_service.py b/attendees/persons/services/atteningmeet_service.py index 074e3ab6..02d4b2d3 100644 --- a/attendees/persons/services/atteningmeet_service.py +++ b/attendees/persons/services/atteningmeet_service.py @@ -19,7 +19,7 @@ def by_organization_meet_characters(current_user, meet_slugs, character_slugs, s | Q(attending__registration__registrant=current_user.attendee)), Q.AND) - if search_value and search_operation == 'contains' and search_expression == 'attending_label': # only contains supported now + if search_value and search_operation == 'contains' and search_expression == 'attending_label': # for searching in drop down of popup editor extra_filters.add((Q(attending__registration__registrant__infos__icontains=search_value) | Q(attending__attendee__infos__icontains=search_value)), Q.AND) @@ -28,7 +28,7 @@ def by_organization_meet_characters(current_user, meet_slugs, character_slugs, s search_term = (filter_list[-1][-1] if filter_list[1] == 'or' else filter_list[0][0][-1]) if isinstance(filter_list[-1], list) else filter_list[-1] - if isinstance(search_term, str): + if isinstance(search_term, str): # for searching in the upper right search bar of datagrid extra_filters.add((Q(attending__registration__registrant__infos__icontains=search_term) | Q(category__display_name__icontains=search_term) diff --git a/attendees/persons/views/api/organization_meet_character_attendings_for_attendance.py b/attendees/persons/views/api/organization_meet_character_attendings_for_attendance.py index 615ae19b..4d7cd767 100644 --- a/attendees/persons/views/api/organization_meet_character_attendings_for_attendance.py +++ b/attendees/persons/views/api/organization_meet_character_attendings_for_attendance.py @@ -1,6 +1,7 @@ import time from django.contrib.auth.mixins import LoginRequiredMixin +from django.db.models import Q from rest_framework import viewsets from rest_framework.exceptions import AuthenticationFailed from rest_framework.response import Response @@ -50,14 +51,13 @@ def get_queryset(self): ) # order_by('meet','start') # Todo: add group column to orderby_list if pk: - filters = { - 'pk': pk, - 'meets__assembly__division__organization': current_user_organization, - } + filters = Q(meets__assembly__division__organization=current_user_organization).add(Q(pk=pk), Q.AND) if not current_user.can_see_all_organizational_meets_attendees(): - filters['attendee'] = current_user.attendee + filters.add((Q(attendee__in=current_user.attendee.scheduling_attendees()) + | + Q(registration__registrant=current_user.attendee)), Q.AND) - return Attending.objects.filter(**filters).distinct() + return Attending.objects.filter(filters).distinct() else: return Attending.objects.filter( diff --git a/attendees/persons/views/api/organization_meet_character_attendings_for_attendingmeet.py b/attendees/persons/views/api/organization_meet_character_attendings_for_attendingmeet.py index 2449a22e..fd2d4451 100644 --- a/attendees/persons/views/api/organization_meet_character_attendings_for_attendingmeet.py +++ b/attendees/persons/views/api/organization_meet_character_attendings_for_attendingmeet.py @@ -1,6 +1,7 @@ import time from django.contrib.auth.mixins import LoginRequiredMixin +from django.db.models import Q from rest_framework import viewsets from rest_framework.exceptions import AuthenticationFailed from rest_framework.response import Response @@ -53,14 +54,13 @@ def get_queryset(self): ) # order_by('meet','start') # Todo: add group column to orderby_list if pk: - filters = { - 'pk': pk, - 'meets__assembly__division__organization': current_user_organization, - } + filters = Q(meets__assembly__division__organization=current_user_organization).add(Q(pk=pk), Q.AND) if not current_user.can_see_all_organizational_meets_attendees(): - filters['attendee'] = current_user.attendee + filters.add((Q(attendee__in=current_user.attendee.scheduling_attendees()) + | + Q(registration__registrant=current_user.attendee)), Q.AND) - return Attending.objects.filter(**filters).distinct() + return Attending.objects.filter(filters).distinct() else: if group_string: