예제 #1
0
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()
예제 #2
0
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))
}
예제 #3
0
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'
예제 #4
0
    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
예제 #5
0
파일: enums.py 프로젝트: the-deep/server
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),
    )
}
예제 #6
0
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'
예제 #7
0
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), )
}
예제 #8
0
파일: enums.py 프로젝트: the-deep/server
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),
    )
}
예제 #9
0
파일: enums.py 프로젝트: the-deep/server
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), )
}
예제 #10
0
파일: enums.py 프로젝트: the-deep/server
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}'
예제 #11
0
파일: enums.py 프로젝트: the-deep/server
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),
    )
}
예제 #12
0
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,
})
예제 #13
0
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),
    )
}