class EntryGQFilterSet(GrapheneFilterSetMixin, UserResourceGqlFilterSet): class CommentStatus(models.TextChoices): RESOLVED = 'resolved', 'Resolved', UNRESOLVED = 'unresolved', 'Unresolved', # Lead fields leads = IDListFilter(field_name='lead') lead_created_by = IDListFilter(field_name='lead__created_by') lead_published_on = django_filters.DateFilter() lead_published_on_gte = DateGteFilter(field_name='lead__published_on') lead_published_on_lte = DateLteFilter(field_name='lead__published_on') lead_title = django_filters.CharFilter(lookup_expr='icontains', field_name='lead__title') lead_assignees = IDListFilter(label='Lead Assignees', field_name='lead__assignee') lead_statuses = MultipleInputFilter(LeadStatusEnum, field_name='lead__status') lead_priorities = MultipleInputFilter(LeadPriorityEnum, field_name='lead__priority') lead_confidentialities = MultipleInputFilter( LeadConfidentialityEnum, field_name='lead__confidentiality') lead_authoring_organization_types = IDListFilter( method='authoring_organization_types_filter') lead_author_organizations = IDListFilter(field_name='lead__authors') lead_source_organizations = IDListFilter(field_name='lead__source') search = django_filters.CharFilter(method='search_filter') created_by = IDListFilter() modified_by = IDListFilter() comment_status = SimpleInputFilter( convert_enum_to_graphene_enum(CommentStatus, name='EntryFilterCommentStatusEnum'), label='Comment Status', method='comment_status_filter', ) entry_types = MultipleInputFilter(EntryTagTypeEnum, field_name='entry_type') project_entry_labels = IDListFilter(label='Project Entry Labels', method='project_entry_labels_filter') entries_id = IDListFilter(field_name='id') geo_custom_shape = django_filters.CharFilter( label='GEO Custom Shapes', method='geo_custom_shape_filter') # Entry Group Label Filters lead_group_label = django_filters.CharFilter( label='Lead Group Label', method='lead_group_label_filter') # Dynamic filterable data filterable_data = MultipleInputFilter(EntryFilterDataType, method='filterable_data_filter') class Meta: model = Entry fields = { **{x: ['exact'] for x in [ 'id', 'excerpt', 'controlled', ]}, } filter_overrides = { models.CharField: { 'filter_class': django_filters.CharFilter, 'extra': lambda _: { 'lookup_expr': 'icontains', }, }, } def filterable_data_filter(self, queryset, _, value): if value: project = self.request and self.request.active_project if project is None or project.analysis_framework_id is None: # This needs to be defined raise Exception( f'Both should be defined {project=} {project and project.analysis_framework_id=}' ) filters = Filter.qs_with_widget_type().filter( analysis_framework_id=project.analysis_framework_id).all() return get_filtered_entries_using_af_filter( queryset, filters, value, project=project, new_query_structure=True) return queryset def comment_status_filter(self, queryset, name, value): if value == self.CommentStatus.UNRESOLVED: return queryset.filter( entrycomment__is_resolved=False, entrycomment__parent__isnull=True, ) elif value == self.CommentStatus.RESOLVED: return queryset.filter( entrycomment__is_resolved=True, entrycomment__parent__isnull=True, ) return queryset def geo_custom_shape_filter(self, queryset, name, value): if value: query_params = reduce( lambda acc, item: acc | item, [ models.Q( attribute__widget__widget_id='geoWidget', attribute__data__value__contains=[{ 'type': v }], ) for v in value.split(',') ], ) return queryset.filter(query_params) return queryset def project_entry_labels_filter(self, queryset, name, value): if value: return queryset.filter(entrygrouplabel__label__in=value, ) return queryset def lead_group_label_filter(self, queryset, name, value): if value: return queryset.filter( entrygrouplabel__group__title__icontains=value) return queryset def authoring_organization_types_filter(self, qs, name, value): if value: qs = qs.annotate(organization_types=models.functions.Coalesce( 'lead__authors__parent__organization_type', 'lead__authors__organization_type')) if type(value[0]) == OrganizationType: return qs.filter( organization_types__in=[ot.id for ot in value]).distinct() return qs.filter(organization_types__in=value).distinct() return qs def search_filter(self, qs, _, value): if value: return qs.filter( models.Q(lead__title__icontains=value) | models.Q(excerpt__icontains=value)) return qs @property def qs(self): qs = super().qs # Note: Since we cannot have `.distinct()` inside a subquery if self.data.get('from_subquery', False): return Entry.objects.filter(id__in=qs) return qs.distinct()
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import Export ExportFormatEnum = convert_enum_to_graphene_enum(Export.Format, name='ExportFormatEnum') ExportStatusEnum = convert_enum_to_graphene_enum(Export.Status, name='ExportStatusEnum') ExportDataTypeEnum = convert_enum_to_graphene_enum(Export.DataType, name='ExportDataTypeEnum') ExportExportTypeEnum = convert_enum_to_graphene_enum( Export.ExportType, name='ExportExportTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ((Export.format, ExportFormatEnum), (Export.status, ExportStatusEnum), (Export.type, ExportDataTypeEnum), (Export.export_type, ExportExportTypeEnum)) }
import graphene from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import ConnectorSource, ConnectorLead ConnectorSourceSourceEnum = convert_enum_to_graphene_enum( ConnectorSource.Source, name='ConnectorSourceSourceEnum') ConnectorLeadExtractionStatusEnum = convert_enum_to_graphene_enum( ConnectorLead.ExtractionStatus, name='ConnectorLeadExtractionStatusEnum') ConnectorSourceStatusEnum = convert_enum_to_graphene_enum( ConnectorSource.Status, name='ConnectorSourceStatusEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ( (ConnectorSource.source, ConnectorSourceSourceEnum), (ConnectorSource.status, ConnectorSourceStatusEnum), (ConnectorLead.extraction_status, ConnectorLeadExtractionStatusEnum), ) } class UnifiedConnectorOrderingEnum(graphene.Enum): # ASC ASC_ID = 'id' ASC_CREATED_AT = 'created_at' ASC_TITLE = 'title'
get_enum_name_from_django_field, ) from deep.permissions import ProjectPermissions as PP from .models import ( Project, ProjectRole, ProjectJoinRequest, ProjectOrganization, ProjectStats, ProjectMembership, ProjectUserGroupMembership, ) ProjectPermissionEnum = graphene.Enum.from_enum(PP.Permission) ProjectStatusEnum = convert_enum_to_graphene_enum(Project.Status, name='ProjectStatusEnum') ProjectRoleTypeEnum = convert_enum_to_graphene_enum(ProjectRole.Type, name='ProjectRoleTypeEnum') ProjectOrganizationTypeEnum = convert_enum_to_graphene_enum( ProjectOrganization.Type, name='ProjectOrganizationTypeEnum') ProjectJoinRequestStatusEnum = convert_enum_to_graphene_enum( ProjectJoinRequest.Status, name='ProjectJoinRequestStatusEnum') ProjectStatsStatusEnum = convert_enum_to_graphene_enum( ProjectStats.Status, name='ProjectStatsStatusEnum') ProjectStatsActionEnum = convert_enum_to_graphene_enum( ProjectStats.Action, name='ProjectStatsActionEnum') ProjectMembershipBadgeTypeEnum = convert_enum_to_graphene_enum( ProjectMembership.BadgeType, name='ProjectMembershipBadgeTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import DiscardedEntry DiscardedEntryTagTypeEnum = convert_enum_to_graphene_enum(DiscardedEntry.TagType, name='DiscardedEntryTagTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ( (DiscardedEntry.tag, DiscardedEntryTagTypeEnum), ) }
import graphene from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import ( DraftEntry, AssistedTaggingPrediction, ) DraftEntryPredictionStatusEnum = convert_enum_to_graphene_enum( DraftEntry.PredictionStatus, name='DraftEntryPredictionStatusEnum') AssistedTaggingPredictionDataTypeEnum = convert_enum_to_graphene_enum( AssistedTaggingPrediction.DataType, name='AssistedTaggingPredictionDataTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ( (DraftEntry.prediction_status, DraftEntryPredictionStatusEnum), (AssistedTaggingPrediction.data_type, AssistedTaggingPredictionDataTypeEnum), ) } class AssistedTaggingModelOrderingEnum(graphene.Enum): # ASC ASC_ID = 'id'
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import Entry EntryTagTypeEnum = convert_enum_to_graphene_enum(Entry.TagType, name='EntryTagTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ((Entry.entry_type, EntryTagTypeEnum), ) }
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import Notification NotificationTypeEnum = convert_enum_to_graphene_enum( Notification.Type, name='NotificationTypeEnum') NotificationStatusEnum = convert_enum_to_graphene_enum( Notification.Status, name='NotificationStatusEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ( (Notification.notification_type, NotificationTypeEnum), (Notification.status, NotificationStatusEnum), ) }
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import GroupMembership GroupMembershipRoleEnum = convert_enum_to_graphene_enum( GroupMembership.Role, name='GroupMembershipRoleEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ((GroupMembership.role, GroupMembershipRoleEnum), ) }
import graphene from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from quality_assurance.models import EntryReviewComment EntryReviewCommentTypeEnum = convert_enum_to_graphene_enum( EntryReviewComment.CommentType, name='EntryReviewCommentTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ((EntryReviewComment.comment_type, EntryReviewCommentTypeEnum), ) } class EntryReviewCommentOrderingEnum(graphene.Enum): # ASC ASC_ID = 'id' ASC_CREATED_AT = 'created_at' ASC_COMMENT_TYPE = 'comment_type' ASC_ENTRY = 'entry' # DESC DESC_ID = f'-{ASC_ID}' DESC_CREATED_AT = f'-{ASC_CREATED_AT}' DESC_COMMENT_TYPE = f'-{ASC_COMMENT_TYPE}' DESC_ENTRY = f'-{ASC_ENTRY}'
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import ( Widget, Filter, AnalysisFrameworkRole, ) AnalysisFrameworkRoleTypeEnum = convert_enum_to_graphene_enum( AnalysisFrameworkRole.Type, name='AnalysisFrameworkRoleTypeEnum') WidgetWidgetTypeEnum = convert_enum_to_graphene_enum(Widget.WidgetType, name='WidgetWidgetTypeEnum') WidgetWidthTypeEnum = convert_enum_to_graphene_enum(Widget.WidthType, name='WidgetWidthTypeEnum') WidgetFilterTypeEnum = convert_enum_to_graphene_enum(Filter.FilterType, name='WidgetFilterTypeEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ( (Widget.widget_id, WidgetWidgetTypeEnum), (Widget.width, WidgetWidthTypeEnum), (Filter.filter_type, WidgetFilterTypeEnum), (AnalysisFrameworkRole.type, AnalysisFrameworkRoleTypeEnum), ) }
from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import User, Profile UserEmailConditionOptOutEnum = convert_enum_to_graphene_enum( Profile.EmailConditionOptOut, name='UserEmailConditionOptOutEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ((Profile.email_opt_outs, UserEmailConditionOptOutEnum), ) } # Additional enums which doesn't have a field in model but are used in serializer enum_map.update({ get_enum_name_from_django_field( None, field_name='email_opt_outs', # UserMeSerializer.email_opt_outs model_name=User.__name__, ): UserEmailConditionOptOutEnum, })
import graphene from utils.graphene.enums import ( convert_enum_to_graphene_enum, get_enum_name_from_django_field, ) from .models import Lead LeadConfidentialityEnum = convert_enum_to_graphene_enum( Lead.Confidentiality, name='LeadConfidentialityEnum') LeadStatusEnum = convert_enum_to_graphene_enum(Lead.Status, name='LeadStatusEnum') LeadPriorityEnum = convert_enum_to_graphene_enum(Lead.Priority, name='LeadPriorityEnum') LeadSourceTypeEnum = convert_enum_to_graphene_enum(Lead.SourceType, name='LeadSourceTypeEnum') LeadExtractionStatusEnum = convert_enum_to_graphene_enum( Lead.ExtractionStatus, name='LeadExtractionStatusEnum') enum_map = { get_enum_name_from_django_field(field): enum for field, enum in ( (Lead.confidentiality, LeadConfidentialityEnum), (Lead.status, LeadStatusEnum), (Lead.priority, LeadPriorityEnum), (Lead.source_type, LeadSourceTypeEnum), (Lead.extraction_status, LeadExtractionStatusEnum), ) }