class Vulnerability(ObjectType):
    """Vulnerability Class."""

    id = String()  # noqa pylint: disable=invalid-name
    analyst = String()
    finding_id = String()
    vuln_type = String()
    where = String()
    specific = String()
    historic_state = List(GenericScalar)
    current_state = String()
    current_approval_status = String()
    last_analyst = String()
    last_approved_status = String()
    acceptance_date = String()
    treatment = String()
    external_bts = String()
    treatment_justification = String()
    treatment_manager = String()
    severity = String()
    tag = String()
    tags = List(String)
    remediated = Boolean()
    verification = String()

    def __getitem__(self, key: str) -> str:
        if key == 'UUID':
            key = 'id'
        return getattr(self, key)

    def resolve_acceptance_date(self, info: object) -> String:
        """Resolve Acceptance Date"""
        del info
        return self.acceptance_date

    def resolve_treatment_manager(self, info: object) -> String:
        """Resolve Treatment Manager"""
        del info
        return self.treatment_manager

    def resolve_treatment_justification(self, info: object) -> String:
        """Resolve Treatment Justification"""
        del info
        return self.treatment_justification

    def resolve_external_bts(self, info: object) -> String:
        """Resolve External Bts"""
        del info
        return self.external_bts

    def resolve_id(self, info: object) -> String:
        """Resolve id attribute."""
        del info
        return self.id

    def resolve_treatment(self, info: object) -> String:
        """Resolve treatment attribute."""
        del info
        return self.treatment

    def resolve_finding_id(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.finding_id

    def resolve_vuln_type(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.vuln_type

    def resolve_where(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.where

    def resolve_specific(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.specific

    def resolve_historic_state(self, info: object) -> List:
        """Resolve vulnerabilities attribute."""
        del info
        return self.historic_state

    def resolve_current_state(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.current_state

    def resolve_severity(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.severity

    def resolve_tag(self, info: object) -> str:
        """Resolve vulnerabilities attribute."""
        del info
        return ', '.join(cast(Iterable[str], self.tags))

    def resolve_current_approval_status(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.current_approval_status

    def resolve_last_approved_status(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.last_approved_status

    @enforce_authz
    def resolve_last_analyst(self, info: object) -> String:
        """ Resolve last approved analyst attribute """
        del info
        return self.last_analyst

    @enforce_authz
    def resolve_analyst(self, info: object) -> String:
        """ Resolve analyst attribute """
        del info
        return self.analyst

    def resolve_remediated(self, info: object) -> Boolean:
        """Resolve vulnerabilities attribute."""
        del info
        return self.remediated

    def resolve_verification(self, info: object) -> String:
        """Resolve vulnerabilities attribute."""
        del info
        return self.verification
Пример #2
0
def convert_field_to_boolean(field, registry=None):
    return Boolean(description=field.help_text, required=field.get('required', False))
Пример #3
0
class Query(ObjectType):
    sites = List(Site)
    sessions = List(Session, parked=Boolean(default_value=False))
    users = List(User)
    user_permissions = List(Permission, user_id=String())
    available_permissions = List(ApiPermission)
    releasing = List(Releasing)

    @staticmethod
    def sessions_list(repo):
        for site in repo.sites:
            site = Site(**site)
            for session in site.sessions or ():
                yield dict(**session, site=site)

    @inject_permissions
    async def resolve_sites(self, info, permissions):
        repo = info.context['repo']
        return [
            Site(**x) for x in repo.sites
            if ADMIN in permissions or f'user:{x["site_id"]}' in permissions
        ]

    @inject_permissions
    async def resolve_sessions(self, info, parked, permissions):
        repo = info.context['repo']
        await repo.init_sessions()
        sessions = (Session(**x) for x in Query.sessions_list(repo))
        return [
            x for x in sessions if (bool(x.edit_url) != parked and (
                ADMIN in permissions or f'user:{x.site.site_id}' in permissions
            ))
        ]

    @inject_permissions(admin=True)
    async def resolve_users(self, info, permissions):
        auth0_client = info.context['auth0_client']
        return [User(**x) for x in await auth0_client.get_users()]

    @inject_permissions(admin=True)
    async def resolve_user_permissions(self, info, user_id, permissions):
        auth0_client = info.context['auth0_client']
        return [
            Permission(**x)
            for x in await auth0_client.get_user_permissions(user_id)
        ]

    @inject_permissions(admin=True)
    async def resolve_available_permissions(self, info, permissions):
        repo = info.context['repo']
        return [
            ApiPermission(v, v) for v in (
                'admin',
                *(f'user:{x["site_id"]}' for x in repo.sites),
            )
        ]

    @inject_permissions
    async def resolve_releasing(self, info, permissions):
        repo = info.context['repo']
        return [Releasing(**x) for x in repo.releasing]
Пример #4
0
class ShardStatusIncident(RiotGrapheneObject):
    active = Boolean()
    created_at = String()
    id = Int()
    updates = List(ShardStatusMessage)
class BooleanField(ObjectType):
    boolean = Boolean()
Пример #6
0
def convert_column_to_boolean(type, attribute, registry=None):
    return Boolean(description=attribute.attr_name,
                   required=not attribute.null)
Пример #7
0
class AddFiles(Mutation):
    """ Update evidence files """
    class Arguments(object):
        files_data = JSONString()
        project_name = String()

    resources = Field(Resource)
    success = Boolean()

    @require_login
    @require_role(['analyst', 'customer', 'admin'])
    @require_project_access_gql
    def mutate(self, info, **parameters):
        success = False
        json_data = []
        files_data = parameters['files_data']
        project_name = parameters['project_name'].lower()
        for file_info in files_data:
            json_data.append({
                'fileName':
                file_info.get('fileName'),
                'description':
                file_info.get('description'),
                'uploadDate':
                str(datetime.now().replace(second=0, microsecond=0))[:-3],
                'uploader':
                info.context.session['username']
            })
        uploaded_file = info.context.FILES.get('document', '')
        file_id = '{project}/{file_name}'.format(project=project_name,
                                                 file_name=uploaded_file)
        try:
            file_size = 100
            resources.validate_file_size(uploaded_file, file_size)
        except InvalidFileSize:
            raise GraphQLError('File exceeds the size limits')
        files = integrates_dao.get_project_attributes_dynamo(
            project_name, ['files'])
        project_files = files.get('files')
        if project_files:
            contains_repeated = [
                f.get('fileName') for f in project_files
                if f.get('fileName') == uploaded_file.name
            ]
            if contains_repeated:
                raise GraphQLError('File already exist')
            else:
                # File is unique
                pass
        else:
            # Project doesn't have files
            pass
        if util.is_valid_file_name(uploaded_file):
            try:
                resources.upload_file_to_s3(uploaded_file, file_id)
                integrates_dao.add_list_resource_dynamo(
                    'FI_projects', 'project_name', project_name, json_data,
                    'files')
                user_email = info.context.session['username']
                resources.send_mail(project_name, user_email, json_data,
                                    'added', 'file')
                success = True
            except ErrorUploadingFileS3:
                raise GraphQLError('Error uploading file')
        if success:
            util.cloudwatch_log(
                info.context, 'Security: Added evidence files to \
                {project} project succesfully'.format(project=project_name))
        else:
            util.cloudwatch_log(
                info.context, 'Security: Attempted to add evidence files \
                from {project} project'.format(project=project_name))
        ret = AddFiles(success=success, resources=Resource(project_name))
        util.invalidate_cache(project_name)
        return ret
Пример #8
0
class Person(graphene.ObjectType):
    """定义创建对象 """
    name = String()
    age = Int()
    gender = Boolean()
Пример #9
0
def convert_field_to_boolean(field, registry=None):
    return Boolean(description=field.help_text)
Пример #10
0
class OrderByType(InputObjectType):
    field = String(required=True)
    desk = Boolean(default_value=False)
Пример #11
0
class Events(ObjectType):  # noqa pylint: disable=too-many-instance-attributes
    """ Formstack Events Class """
    id = String()  # noqa pylint: disable=invalid-name
    success = Boolean()
    error_message = String()
    analyst = String()
    client = String()
    project_name = String()
    client_project = String()
    detail = String()
    evidence = String()
    event_type = String()
    event_date = String()
    event_status = String()
    affectation = String()
    accessibility = String()
    affected_components = String()
    context = String()
    subscription = String()
    evidence_file = String()

    def __init__(self, identifier):
        """ Class constructor """
        self.id = ''  # noqa pylint: disable=invalid-name
        self.analyst = ''
        self.client = ''
        self.project_name = ''
        self.client_project = ''
        self.event_type = ''
        self.event_date = ''
        self.detail = ''
        self.affectation = ''
        self.event_status = ''
        self.evidence = ''
        self.accessibility = ''
        self.affected_components = ''
        self.context = ''
        self.subscription = ''
        self.evidence_file = ''

        event_id = str(identifier)
        resp = event_data(event_id)

        if resp:
            self.id = event_id
            self.analyst = resp.get('analyst')
            self.client = resp.get('client')
            self.project_name = resp.get('projectName')
            self.client_project = resp.get('clientProject')
            self.event_type = resp.get('eventType')
            self.event_date = resp.get('eventDate')
            self.detail = resp.get('detail')
            self.affectation = resp.get('affectation')
            self.event_status = resp.get('eventStatus')
            self.evidence = resp.get('evidence', '')
            self.evidence_file = resp.get('evidence_file', '')
            self.accessibility = resp.get('accessibility')
            self.affected_components = resp.get('affectedComponents')
            self.context = resp.get('context')
            self.subscription = resp.get('subscription')
        else:
            self.success = False
            self.error_message = 'Finding does not exist'
        self.success = True

    def resolve_id(self, info):
        """ Resolve id attribute """
        del info
        return self.id

    def resolve_analyst(self, info):
        """ Resolve analyst attribute """
        del info
        return self.analyst

    def resolve_client(self, info):
        """ Resolve client attribute """
        del info
        return self.client

    def resolve_evidence(self, info):
        """ Resolve evidence attribute """
        del info
        return self.evidence

    def resolve_project_name(self, info):
        """ Resolve project_name attribute """
        del info
        return self.project_name

    def resolve_client_project(self, info):
        """ Resolve client_project attribute """
        del info
        return self.client_project

    def resolve_event_type(self, info):
        """ Resolve event_type attribute """
        del info
        return self.event_type

    def resolve_detail(self, info):
        """ Resolve detail attribute """
        del info
        return self.detail

    def resolve_event_date(self, info):
        """ Resolve date attribute """
        del info
        return self.event_date

    def resolve_event_status(self, info):
        """ Resolve status attribute """
        del info
        return self.event_status

    def resolve_affectation(self, info):
        """ Resolve affectation attribute """
        del info
        if not self.affectation:
            return ''
        return self.affectation

    def resolve_accessibility(self, info):
        """ Resolve accessibility attribute """
        del info
        if not self.accessibility:
            return ''
        return self.accessibility

    def resolve_affected_components(self, info):
        """ Resolve affected components attribute """
        del info
        if not self.affected_components:
            return ''
        return self.affected_components

    def resolve_context(self, info):
        """ Resolve context attribute """
        del info
        return self.context

    def resolve_subscription(self, info):
        """ Resolve subscription attribute """
        del info
        return self.subscription

    def resolve_evidence_file(self, info):
        """ Resolve evidence file attribute """
        del info
        return self.evidence_file
Пример #12
0
def create_standard_changelog_graphql_mixin(
    diffable_models,
    models_enum=None,
    model_fields_enum=None,
    page_size=50,
    field_name="changelog",
):
    # will use models_enum and model_fields_enum if provided, otherwise generates those

    if models_enum is None:
        model_enum = create_model_enum_type(diffable_models)
    if model_fields_enum is None:
        model_fields_enum = create_model_field_enum_type(diffable_models)

    field = graphene.Field(
        ChangelogPage,
        page_num=Int(required=True),
        models=List(model_enum, required=False),
        user_ids=List(Int, required=False),
        fields=List(model_fields_enum, required=False),
        exclude_create=Boolean(required=False),
        only_creates=Boolean(required=False),
        start_date=DateTime(required=False),
        end_date=DateTime(required=False),
    )

    def resolver(
        _parent,
        _info,
        page_num=None,
        models=None,
        user_ids=None,
        fields=None,
        exclude_create=False,
        only_creates=False,
        start_date=None,
        end_date=None,
    ):
        if models and fields:
            raise Exception(
                "use models or fields but not both - TODO: split this up in 2 different fields"
            )

        if models:
            model_classes = [
                m for m in diffable_models if m.__name__ in models
            ]
        else:
            model_classes = [*diffable_models]

        if fields:
            fields_by_model = convert_enum_list_to_dict(model_classes, fields)
        else:
            fields_by_model = None

        fetcher = ConsecutiveVersionsFetcher(
            page_size=get_changelog_page_size(page_size),
            page_num=page_num,
            models=model_classes,
            user_ids=user_ids,
            exclude_create=exclude_create,
            only_creates=only_creates,
            fields_by_model=fields_by_model,
            start_date=start_date,
            end_date=end_date,
        )

        return {"fetcher": fetcher}

    return type(
        "StandardChangelogMixin",
        (graphene.ObjectType, ),
        {
            field_name: field,
            f"resolve_{field_name}": staticmethod(resolver)
        },
    )
Пример #13
0
def convert_field_to_nullboolean(field,
                                 registry=None,
                                 input_flag=None,
                                 nested_field=False):
    return Boolean(description=field.help_text or field.verbose_name,
                   required=is_required(field) and input_flag == 'create')
Пример #14
0
def convert_form_field_to_boolean(field):
    return Boolean(description=field.help_text, required=field.required)
Пример #15
0
def convert_field_to_nullboolean(field, registry=None):
    return Boolean(description=field.help_text, required=not field.null)
Пример #16
0
class Query(ObjectType):
    countries = List(CountryType)
    institutions = List(InstitutionType,
                        archived=Boolean(),
                        year_archived=Int())
    memorandums = List(MemorandumType, archived=Boolean(), year_archived=Int())
    academic_years = List(AcademicYearType)
    terms = List(TermType, year=Int())
    outbound_programs = List(OutboundProgramType,
                             institution=Int(),
                             year=Int(),
                             term=Int())
    inbound_programs = List(InboundProgramType, year=Int(), term=Int())
    outbound_requirements = List(OutboundRequirementType)
    inbound_requirements = List(InboundRequirementType)

    institution = Field(InstitutionType, id=Int())
    memorandum = Field(MemorandumType, id=Int())
    outbound_program = Field(OutboundProgramType, id=Int())
    inbound_program = Field(InboundProgramType, id=Int())

    def resolve_academic_years(self, info, **kwargs):
        return AcademicYear.objects.all()

    def resolve_countries(self, info, **kwargs):
        return [
            country for country in Country.objects.all()
            if country.institution_set.filter(
                archived_at__isnull=True).count() > 0
        ]

    def resolve_institutions(self, info, **kwargs):
        archived = kwargs.get('archived', False)
        year_archived = kwargs.get('year_archived')

        return Institution.archived.filter(
            archived_at__year=year_archived
        ) if archived else Institution.current.all()

    def resolve_memorandums(self, info, **kwargs):
        archived = kwargs.get('archived', False)
        year_archived = kwargs.get('year_archived')

        return Memorandum.archived.filter(
            archived_at__year=year_archived
        ) if archived else Memorandum.current.all()

    def resolve_memorandum(self, info, **kwargs):
        id = kwargs.get('id')
        return Memorandum.current.get(pk=id)

    def resolve_institution(self, info, **kwargs):
        id = kwargs.get('id')
        return Institution.objects.get(pk=id)

    def resolve_terms(self, info, **kwargs):
        terms = Term.current.all()
        year = kwargs.get('year')

        if year:
            terms = terms.filter(academic_year__academic_year_start=year)

        return terms

    def resolve_outbound_programs(self, info, **kwargs):
        institution = kwargs.get('institution', False)
        year = kwargs.get('year', False)
        term = kwargs.get('term', False)

        outbound_programs = OutboundProgram.objects.all()

        if year:
            outbound_programs = outbound_programs.filter(
                program__academic_year__academic_year_start=year)

        if institution:
            outbound_programs = outbound_programs.filter(
                institution_id=institution)

        if term:
            outbound_programs = outbound_programs.filter(
                program__terms_available__number=term)

        return outbound_programs

    def resolve_outbound_program(self, info, **kwargs):
        id = kwargs.get('id')
        return OutboundProgram.objects.get(pk=id)

    def resolve_inbound_programs(self, info, **kwargs):
        year = kwargs.get('year', False)
        term = kwargs.get('term', False)

        inbound_programs = InboundProgram.objects.all()

        if year:
            inbound_programs = inbound_programs.filter(
                program__academic_year__academic_year_start=year)

        if term:
            inbound_programs = inbound_programs.filter(
                program__terms_available__number=term)

        return inbound_programs

    def resolve_inbound_program(self, info, **kwargs):
        id = kwargs.get('id')
        return InboundProgram.objects.get(pk=id)

    def resolve_inbound_requirements(self, info, **kwargs):
        return InboundRequirement.objects.all()

    def resolve_outbound_requirements(self, info, **kwargs):
        return OutboundRequirement.objects.all()
Пример #17
0
class ValidateScheduleType(ObjectType):
    status = Boolean()
    reason = String()
Пример #18
0
class DjangoSerializerMutation(ObjectType):
    """
        Serializer Mutation Type Definition
    """
    ok = Boolean(
        description="Boolean field that return mutation result request.")
    errors = List(ErrorType, description="Errors list for the field")

    class Meta:
        abstract = True

    @classmethod
    def __init_subclass_with_meta__(
            cls,
            serializer_class=None,
            only_fields=(),
            include_fields=(),
            exclude_fields=(),
            input_field_name=None,
            output_field_name=None,
            description="",
            nested_fields=(),
            **options,
    ):

        if not serializer_class:
            raise Exception(
                "serializer_class is required on all DjangoSerializerMutation")

        model = serializer_class.Meta.model

        description = description or "SerializerMutation for {} model".format(
            model.__name__)

        input_field_name = input_field_name or "new_{}".format(
            model._meta.model_name)
        output_field_name = output_field_name or model._meta.model_name

        input_class = getattr(cls, "Arguments", None)
        if not input_class:
            input_class = getattr(cls, "Input", None)
            if input_class:
                warn_deprecation((
                    "Please use {name}.Arguments instead of {name}.Input."
                    "Input is now only used in ClientMutationID.\nRead more: "
                    "https://github.com/graphql-python/graphene/blob/2.0/UPGRADE-v2.0.md#mutation-input"
                ).format(name=cls.__name__))
        if input_class:
            arguments = props(input_class)
        else:
            arguments = {}

        registry = get_global_registry()

        factory_kwargs = {
            "model": model,
            "only_fields": only_fields,
            "include_fields": include_fields,
            "exclude_fields": exclude_fields,
            "nested_fields": nested_fields,
            "registry": registry,
            "skip_registry": False,
        }

        output_type = registry.get_type_for_model(model)

        if not output_type:
            output_type = factory_type("output", DjangoObjectType,
                                       **factory_kwargs)

        django_fields = OrderedDict({output_field_name: Field(output_type)})

        global_arguments = {}
        for operation in ("create", "delete", "update"):
            global_arguments.update({operation: OrderedDict()})

            if operation != "delete":
                input_type = registry.get_type_for_model(model,
                                                         for_input=operation)

                if not input_type:
                    # factory_kwargs.update({'skip_registry': True})
                    input_type = factory_type("input", DjangoInputObjectType,
                                              operation, **factory_kwargs)

                global_arguments[operation].update(
                    {input_field_name: Argument(input_type, required=True)})
            else:
                global_arguments[operation].update({
                    "id":
                    Argument(
                        ID,
                        required=True,
                        description="Django object unique identification field",
                    )
                })
            global_arguments[operation].update(arguments)

        _meta = SerializerMutationOptions(cls)
        _meta.output = cls
        _meta.arguments = global_arguments
        _meta.fields = django_fields
        _meta.output_type = output_type
        _meta.model = model
        _meta.serializer_class = serializer_class
        _meta.input_field_name = input_field_name
        _meta.output_field_name = output_field_name
        _meta.nested_fields = nested_fields

        super(DjangoSerializerMutation,
              cls).__init_subclass_with_meta__(_meta=_meta,
                                               description=description,
                                               **options)

    @classmethod
    def get_errors(cls, errors):
        errors_dict = {
            cls._meta.output_field_name: None,
            "ok": False,
            "errors": errors
        }

        return cls(**errors_dict)

    @classmethod
    def perform_mutate(cls, obj, info):
        resp = {cls._meta.output_field_name: obj, "ok": True, "errors": None}

        return cls(**resp)

    @classmethod
    def get_serializer_kwargs(cls, root, info, **kwargs):
        return {}

    @classmethod
    def manage_nested_fields(cls, data, root, info):
        nested_objs = {}
        if cls._meta.nested_fields and type(cls._meta.nested_fields) == dict:
            for field in cls._meta.nested_fields:
                sub_data = data.pop(field, None)
                if sub_data:
                    serialized_data = cls._meta.nested_fields[field](
                        data=sub_data,
                        many=True if type(sub_data) == list else False)
                    ok, result = cls.save(serialized_data, root, info)
                    if not ok:
                        return cls.get_errors(result)
                    if type(sub_data) == list:
                        nested_objs.update({field: result})
                    else:
                        data.update({field: result.id})
        return nested_objs

    @classmethod
    def create(cls, root, info, **kwargs):
        data = kwargs.get(cls._meta.input_field_name)
        request_type = info.context.META.get("CONTENT_TYPE", "")
        if "multipart/form-data" in request_type:
            data.update(
                {name: value
                 for name, value in info.context.FILES.items()})

        nested_objs = cls.manage_nested_fields(data, root, info)
        serializer = cls._meta.serializer_class(data=data,
                                                **cls.get_serializer_kwargs(
                                                    root, info, **kwargs))

        ok, obj = cls.save(serializer, root, info)
        if not ok:
            return cls.get_errors(obj)
        elif nested_objs:
            [
                getattr(obj, field).add(*objs)
                for field, objs in nested_objs.items()
            ]
        return cls.perform_mutate(obj, info)

    @classmethod
    def delete(cls, root, info, **kwargs):
        pk = kwargs.get("id")

        old_obj = get_Object_or_None(cls._meta.model, pk=pk)
        if old_obj:
            old_obj.delete()
            old_obj.id = pk
            return cls.perform_mutate(old_obj, info)
        else:
            return cls.get_errors([
                ErrorType(
                    field="id",
                    messages=[
                        "A {} obj with id {} do not exist".format(
                            cls._meta.model.__name__, pk)
                    ],
                )
            ])

    @classmethod
    def update(cls, root, info, **kwargs):
        data = kwargs.get(cls._meta.input_field_name)
        request_type = info.context.META.get("CONTENT_TYPE", "")
        if "multipart/form-data" in request_type:
            data.update(
                {name: value
                 for name, value in info.context.FILES.items()})

        pk = data.pop("id")
        old_obj = get_Object_or_None(cls._meta.model, pk=pk)
        if old_obj:
            nested_objs = cls.manage_nested_fields(data, root, info)
            serializer = cls._meta.serializer_class(
                old_obj,
                data=data,
                partial=True,
                **cls.get_serializer_kwargs(root, info, **kwargs),
            )

            ok, obj = cls.save(serializer, root, info)
            if not ok:
                return cls.get_errors(obj)
            elif nested_objs:
                [
                    getattr(obj, field).add(*objs)
                    for field, objs in nested_objs.items()
                ]
            return cls.perform_mutate(obj, info)
        else:
            return cls.get_errors([
                ErrorType(
                    field="id",
                    messages=[
                        "A {} obj with id: {} do not exist".format(
                            cls._meta.model.__name__, pk)
                    ],
                )
            ])

    @classmethod
    def save(cls, serialized_obj, root, info, **kwargs):
        if serialized_obj.is_valid():
            obj = serialized_obj.save()
            return True, obj

        else:
            errors = [
                ErrorType(field=key, messages=value)
                for key, value in serialized_obj.errors.items()
            ]
            return False, errors

    @classmethod
    def CreateField(cls, *args, **kwargs):
        return Field(
            cls._meta.output,
            args=cls._meta.arguments["create"],
            resolver=cls.create,
            **kwargs,
        )

    @classmethod
    def DeleteField(cls, *args, **kwargs):
        return Field(
            cls._meta.output,
            args=cls._meta.arguments["delete"],
            resolver=cls.delete,
            **kwargs,
        )

    @classmethod
    def UpdateField(cls, *args, **kwargs):
        return Field(
            cls._meta.output,
            args=cls._meta.arguments["update"],
            resolver=cls.update,
            **kwargs,
        )

    @classmethod
    def MutationFields(cls, *args, **kwargs):
        create_field = cls.CreateField(*args, **kwargs)
        delete_field = cls.DeleteField(*args, **kwargs)
        update_field = cls.UpdateField(*args, **kwargs)

        return create_field, delete_field, update_field
Пример #19
0
    class Arguments:
        workflows = List(WorkflowID, required=True)
        cylc_version = CylcVersion(description=sstrip('''
                Set the Cylc version that the workflow starts with.
            '''))
        initial_cycle_point = CyclePoint(description=sstrip('''
                Set the initial cycle point.

                Required if not defined in flow.cylc.
            '''))
        start_cycle_point = CyclePoint(description=sstrip('''
                Set the start cycle point, which may be after the initial cycle
                point.

                If the specified start point is not in the sequence, the next
                on-sequence point will be used.

                (Not to be confused with the initial cycle point).

                This replaces the Cylc 7 --warm option.
            '''))
        final_cycle_point = CyclePoint(description=sstrip('''
                Set the final cycle point. This command line option overrides
                the workflow config option `[scheduling]final cycle point`.
            '''))
        stop_cycle_point = CyclePoint(description=sstrip('''
                Set the stop cycle point. Shut down after all tasks have PASSED
                this cycle point. (Not to be confused with the final cycle
                point.) This command line option overrides the workflow config
                option `[scheduling]stop after cycle point`.
            '''))
        pause = Boolean(description=sstrip('''
                Pause workflow immediately on starting.
            '''))
        hold_cycle_point = CyclePoint(description=sstrip('''
                Hold all tasks after this cycle point.
            '''))
        mode = RunMode()
        host = String(description=sstrip('''
                Specify the host on which to start-up the workflow. If not
                specified, a host will be selected using the
                `[scheduler]run hosts` global config.
            '''))
        main_loop = List(String,
                         description=sstrip('''
                Specify an additional plugin to run in the main loop. These
                are used in combination with those specified in
                `[scheduler][main loop]plugins`. Can be used multiple times.
            '''))
        abort_if_any_task_fails = Boolean(default_value=False,
                                          description=sstrip('''
                If set workflow will abort with status 1 if any task fails.
            '''))
        debug = Boolean(default_value=False,
                        description=sstrip('''
                Output developer information and show exception tracebacks.
            '''))
        no_timestamp = Boolean(default_value=False,
                               description=sstrip('''
                Don't timestamp logged messages.
            '''))
        set = List(  # noqa: A003 (graphql field name)
            String,
            description=sstrip('''
                Set the value of a Jinja2 template variable in the workflow
                definition. Values should be valid Python literals so strings
                must be quoted e.g. `STR="string"`, `INT=43`, `BOOL=True`.
                This option can be used multiple  times on the command line.
                NOTE: these settings persist across workflow restarts, but can
                be set again on the `cylc play` command line if they need to be
                overridden.
            '''))
        set_file = String(description=sstrip('''
                Set the value of Jinja2 template variables in the workflow
                definition from a file containing NAME=VALUE pairs (one per
                line). As with "set" values should be valid Python literals so
                strings must be quoted e.g.  `STR='string'`. NOTE: these
                settings persist across workflow restarts, but can be set again
                on the `cylc play` command line if they need to be overridden.
            '''))
Пример #20
0
def convert_column_to_boolean(type, column, registry=None):
    return Boolean(description=get_column_doc(column),
                   required=not (is_column_nullable(column)))
Пример #21
0
 class Query(ObjectType):
     all_reporters = DjangoFilterConnectionField(
         ReporterType, reverse_order=Boolean()
     )
Пример #22
0
class QueryType(ObjectType):
    class Meta:
        name = "Query"
        description = "..."

    # User
    login = Field(Login,
                  email=String(required=True),
                  password=String(required=True),
                  remember_me=Boolean(),
                  required=True)

    # Company
    company = Field(CompanyType, _id=ID(required=True))
    company_list = List(CompanyType)
    company_members = List(UserType, company_id=ID(required=True))

    # Product
    product_category_list = List(ProductCategoryType)
    product_category = Field(ProductCategoryType, _id=ID(required=True))
    product = Field(ProductType, _id=ID(required=True))
    product_list = List(ProductType, company_id=ID(required=True))

    # Contact
    customer = Field(CustomerType, _id=ID(required=True))
    customer_list = List(CustomerType, company_id=ID(required=True))

    # Campaign
    campaign = Field(CampaignType, _id=ID(required=True))
    campaign_list = List(CampaignType, company_id=ID(required=True))

    # RESOLVERS
    @staticmethod
    def resolve_login(root, info, email, password, remember_me=False):
        user = UserModel.find_by_email(email)
        if user and check_password_hash(user.password, password):
            return Login(user=user, token=create_tokens(user, remember_me))
        raise Exception("email or password were incorrect")

    @staticmethod
    def resolve_company(root, info, _id):
        return CompanyModel.find_by_id(_id)

    @staticmethod
    def resolve_company_list(root, info):
        return CompanyModel.find_all()

    @staticmethod
    def resolve_company_members(root, info, company_id):
        return UserModel.find_many_by("company", company_id)

    @staticmethod
    def resolve_product_category_list(root, info):
        return ProductCategoryModel.find_all()

    @staticmethod
    def resolve_product_category(root, info, _id):
        return ProductCategoryModel.find_by_id(_id)

    @staticmethod
    def resolve_product_list(root, info, company_id):
        return ProductModel.find_many_by(company_id)

    @staticmethod
    def resolve_product(root, info, _id):
        return ProductModel.find_by_id(_id)

    @staticmethod
    def resolve_customer(root, info, _id):
        return CustomerModel.find_by_id(_id)

    @staticmethod
    def resolve_customer_list(root, info, company_id):
        return CustomerModel.find_many_by(company_id)

    @staticmethod
    def resolve_campaign(root, info, _id):
        return CampaignModel.find_by_id(_id)

    @staticmethod
    def resolve_campaign_list(root, info, company_id):
        return CampaignModel.find_many_by(company_id)
Пример #23
0
class DjangoSerializerType(ObjectType):
    """
        DjangoSerializerType definition
    """

    ok = Boolean(
        description='Boolean field that return mutation result request.')
    errors = List(ErrorType, description='Errors list for the field')

    class Meta:
        abstract = True

    @classmethod
    def __init_subclass_with_meta__(cls,
                                    serializer_class=None,
                                    queryset=None,
                                    only_fields=(),
                                    exclude_fields=(),
                                    pagination=None,
                                    input_field_name=None,
                                    output_field_name=None,
                                    results_field_name=None,
                                    nested_fields=False,
                                    filter_fields=None,
                                    description='',
                                    **options):

        if not serializer_class:
            raise Exception(
                'serializer_class is required on all ModelSerializerType')

        model = serializer_class.Meta.model

        description = description or 'ModelSerializerType for {} model'.format(
            model.__name__)

        input_field_name = input_field_name or 'new_{}'.format(
            model._meta.model_name)
        output_field_name = output_field_name or model._meta.model_name

        input_class = getattr(cls, 'Arguments', None)
        if not input_class:
            input_class = getattr(cls, 'Input', None)
            if input_class:
                warn_deprecation((
                    "Please use {name}.Arguments instead of {name}.Input."
                    "Input is now only used in ClientMutationID.\nRead more: "
                    "https://github.com/graphql-python/graphene/blob/2.0/UPGRADE-v2.0.md#mutation-input"
                ).format(name=cls.__name__))
        if input_class:
            arguments = props(input_class)
        else:
            arguments = {}

        registry = get_global_registry()

        factory_kwargs = {
            'model': model,
            'only_fields': only_fields,
            'exclude_fields': exclude_fields,
            'filter_fields': filter_fields,
            'pagination': pagination,
            'queryset': queryset,
            'nested_fields': nested_fields,
            'registry': registry,
            'skip_registry': False
        }

        output_type = registry.get_type_for_model(model)

        if not output_type:
            output_type = factory_type('output', DjangoObjectType,
                                       **factory_kwargs)

        output_list_type = factory_type('list', DjangoListObjectType,
                                        **factory_kwargs)

        django_fields = OrderedDict({output_field_name: Field(output_type)})

        global_arguments = {}
        for operation in ('create', 'delete', 'update'):
            global_arguments.update({operation: OrderedDict()})

            if operation != 'delete':
                input_type = registry.get_type_for_model(model,
                                                         for_input=operation)

                if not input_type:
                    factory_kwargs.update({'skip_registry': True})
                    input_type = factory_type('input', DjangoInputObjectType,
                                              operation, **factory_kwargs)

                global_arguments[operation].update(
                    {input_field_name: Argument(input_type, required=True)})
            else:
                global_arguments[operation].update({
                    'id':
                    Argument(
                        ID,
                        required=True,
                        description='Django object unique identification field'
                    )
                })
            global_arguments[operation].update(arguments)

        _meta = DjangoSerializerOptions(cls)
        _meta.mutation_output = cls
        _meta.arguments = global_arguments
        _meta.fields = django_fields
        _meta.output_type = output_type
        _meta.output_list_type = output_list_type
        _meta.model = model
        _meta.queryset = queryset or model._default_manager
        _meta.serializer_class = serializer_class
        _meta.input_field_name = input_field_name
        _meta.output_field_name = output_field_name

        super(DjangoSerializerType,
              cls).__init_subclass_with_meta__(_meta=_meta,
                                               description=description,
                                               **options)

    @classmethod
    def list_object_type(cls):
        return cls._meta.output_list_type

    @classmethod
    def object_type(cls):
        return cls._meta.output_type

    @classmethod
    def get_errors(cls, errors):
        errors_dict = {
            cls._meta.output_field_name: None,
            'ok': False,
            'errors': errors
        }

        return cls(**errors_dict)

    @classmethod
    def perform_mutate(cls, obj, info):
        resp = {cls._meta.output_field_name: obj, 'ok': True, 'errors': None}

        return cls(**resp)

    @classmethod
    def get_serializer_kwargs(cls, root, info, **kwargs):
        return {}

    @classmethod
    def create(cls, root, info, **kwargs):
        new_obj = kwargs.get(cls._meta.input_field_name, None)

        if new_obj:
            serializer = cls._meta.serializer_class(
                data=new_obj,
                **cls.get_serializer_kwargs(root, info, **kwargs))

            if serializer.is_valid():
                obj = serializer.save()
                return cls.perform_mutate(obj, info)

            else:
                errors = [
                    ErrorType(field=key, messages=value)
                    for key, value in serializer.errors.items()
                ]
                return cls.get_errors(errors)

    @classmethod
    def delete(cls, root, info, **kwargs):
        pk = kwargs.get('id', None)

        if id:
            model = cls._meta.model
            old_obj = get_Object_or_None(model, pk=pk)
            if old_obj:
                old_obj.delete()
                old_obj.id = pk

                return cls.perform_mutate(old_obj, info)
            else:
                errors = [
                    ErrorType(field='id',
                              messages=[
                                  'A {} obj with id {} do not exist'.format(
                                      model.__name__, pk)
                              ])
                ]
            return cls.get_errors(errors)

    @classmethod
    def update(cls, root, info, **kwargs):
        new_obj = kwargs.get(cls._meta.input_field_name, None)

        if new_obj:
            model = cls._meta.model
            id = new_obj.pop('id')
            old_obj = get_Object_or_None(model, pk=id)
            if old_obj:
                new_obj_serialized = dict(
                    cls._meta.serializer_class(
                        old_obj,
                        **cls.get_serializer_kwargs(root, info,
                                                    **kwargs)).data)
                new_obj_serialized.update(new_obj)
                serializer = cls._meta.serializer_class(
                    old_obj,
                    data=new_obj_serialized,
                    **cls.get_serializer_kwargs(root, info, **kwargs))

                if serializer.is_valid():
                    obj = serializer.save()
                    return cls.perform_mutate(obj, info)
                else:
                    errors = [
                        ErrorType(field=key, messages=value)
                        for key, value in serializer.errors.items()
                    ]
            else:
                errors = [
                    ErrorType(field='id',
                              messages=[
                                  'A {} obj with id: {} do not exist'.format(
                                      model.__name__, id)
                              ])
                ]
            return cls.get_errors(errors)

    @classmethod
    def retrieve(cls, manager, root, info, **kwargs):
        id = kwargs.pop('id', None)

        try:
            return manager.get_queryset().get(pk=id)
        except manager.model.DoesNotExist:
            return None

    @classmethod
    def list(cls, manager, filterset_class, filtering_args, root, info,
             **kwargs):

        qs = queryset_factory(cls._meta.queryset or manager, info.field_asts,
                              info.fragments, **kwargs)

        filter_kwargs = {
            k: v
            for k, v in kwargs.items() if k in filtering_args
        }

        qs = filterset_class(data=filter_kwargs, queryset=qs).qs
        count = qs.count()

        return DjangoListObjectBase(
            count=count,
            results=maybe_queryset(qs),
            results_field_name=cls.list_object_type()._meta.results_field_name)

    @classmethod
    def RetrieveField(cls, *args, **kwargs):
        return DjangoObjectField(cls._meta.output_type,
                                 resolver=cls.retrieve,
                                 **kwargs)

    @classmethod
    def ListField(cls, *args, **kwargs):
        return DjangoListObjectField(cls._meta.output_list_type,
                                     resolver=cls.list,
                                     **kwargs)

    @classmethod
    def CreateField(cls, *args, **kwargs):
        return Field(cls._meta.mutation_output,
                     args=cls._meta.arguments['create'],
                     resolver=cls.create,
                     **kwargs)

    @classmethod
    def DeleteField(cls, *args, **kwargs):
        return Field(cls._meta.mutation_output,
                     args=cls._meta.arguments['delete'],
                     resolver=cls.delete,
                     **kwargs)

    @classmethod
    def UpdateField(cls, *args, **kwargs):
        return Field(cls._meta.mutation_output,
                     args=cls._meta.arguments['update'],
                     resolver=cls.update,
                     **kwargs)

    @classmethod
    def QueryFields(cls, *args, **kwargs):
        retrieve_field = cls.RetrieveField(*args, **kwargs)
        list_field = cls.ListField(*args, **kwargs)

        return retrieve_field, list_field

    @classmethod
    def MutationFields(cls, *args, **kwargs):
        create_field = cls.CreateField(*args, **kwargs)
        delete_field = cls.DeleteField(*args, **kwargs)
        update_field = cls.UpdateField(*args, **kwargs)

        return create_field, delete_field, update_field
Пример #24
0
class TopicListQuery(ObjectType):
    topics = Field(
        TopicList,
        slug=String(required=True),
        year=Int(),
        page=Int(),
        search_keys=String(),
        refresh=Boolean(),
        tab=String(),
        exclusions=List(String),
        extra=JSONString(),
    )

    @staticmethod
    def resolve_topics(_parent, info, slug, **kwargs):
        # Convert string query parameters to actual dictionary to use it in TopicListHandler
        search_keys = dict(parse_qsl(
            kwargs.get("search_keys"))) if kwargs.get("search_keys") else {}
        manager = TopicListManager(
            slug,
            info.context.user,
            kwargs.get("year"),
            search_keys,
            kwargs.get("tab"),
            kwargs.get("exclusions"),
            extra=kwargs.get("extra"),
        )

        if kwargs.get("refresh"):
            manager.delete_cache(delimiter=True)

        frame = LeftFrame(manager, kwargs.get("page"))
        page = frame.page  # May raise PermissionDenied or Http404

        object_list = [
            Topic(title=t["title"],
                  slug=t["slug"],
                  count=humanize_count(t.get("count")))
            for t in page["object_list"]
        ]

        paginator = {
            "num_pages": page["paginator"]["num_pages"],
            "page_range": page["paginator"]["page_range"]
        }

        tabs = (Tabs(
            current=frame.tabs["current"],
            available=[
                Tab(name=key, safename=value)
                for key, value in frame.tabs["available"].items()
            ],
        ) if frame.tabs else None)

        exclusions = (Exclusions(active=frame.exclusions["active"],
                                 available=frame.exclusions["available"])
                      if frame.exclusions else None)

        extra = [
            Extra(name=key, value=value) for key, value in frame.extra.items()
        ] if frame.extra else None

        page_data = {
            "has_next": page.get("has_next"),
            "has_other_pages": page.get("has_other_pages"),
            "has_previous": page.get("has_previous"),
            "number": page.get("number"),
            "object_list": object_list,
            "paginator": Paginator(**paginator),
        }

        data = {
            "page": Page(**page_data),
            "parameters": frame.parameters,
            "refresh_count": frame.refresh_count,
            "year": frame.year,
            "year_range": frame.year_range,
            "safename": frame.safename,
            "slug": frame.slug,
            "slug_identifier": frame.slug_identifier,
            "tabs": tabs,
            "exclusions": exclusions,
            "extra": extra,
        }

        return TopicList(**data)
Пример #25
0
class Query(ObjectType):
    paged_logistics_request = Field(PagedLogisticsRequestType,
                                    paged=PagedInput(required=True),
                                    filters=LogisticsRequestFilter())
    transfer_request = Field(TransferRequestData,
                             requestId=IntID(required=True),
                             sort_by=String(),
                             desc=Boolean())
    get_logistics_request = Field(LogisticsRequestType, id=IntID())
    paged_transfer_requests = Field(PagedTransferRequestsType,
                                    paged=PagedInput(required=True),
                                    filters=TransferRequestsFilter())
    paged_logistics_request_position = Field(
        PagedLogisticsRequestPositionType,
        paged=PagedInput(required=True),
        filters=LogisticsRequestPositionFilter())
    transfer_request_position_info = List(TransferRequestType,
                                          position_id=IntID(required=True))
    good_location_info = List(GoodLocationInfoType,
                              position_id=IntID(required=True))
    get_logistics_request_id = IntID()
    get_logistics_request_project_id = IntID()

    def resolve_paged_logistics_request(self, info, paged, **kwargs):
        logistics_requests, total_count = LogisticsRequest.objects.list_paged_logistics_requests(
            info.context.user, **paged, **kwargs)
        return PagedLogisticsRequestType(logistics_requests=logistics_requests,
                                         total_count=total_count)

    def resolve_transfer_request(self, info, **kwargs):
        transfer_request, transfer_positions = TransferRequest.objects.transfer_request(
            info, **kwargs)
        return TransferRequestData(transfer_request=transfer_request,
                                   transfer_positions=transfer_positions)

    def resolve_get_logistics_request(self, info, id):
        return LogisticsRequest.objects.get(id=id)

    def resolve_paged_transfer_requests(self, info, paged, **kwargs):
        transfer_requests, total_count = TransferRequest.objects.list_paged_transfer_requests(
            info.context.user, **paged, **kwargs)
        return PagedTransferRequestsType(transfer_requests=transfer_requests,
                                         total_count=total_count)

    def resolve_paged_logistics_request_position(self, info, paged, **kwargs):
        logistics_request_positions, total_count = LogisticsRequestPosition.objects.list_paged_logistics_request_position(
            info.context.user, **paged, **kwargs)
        return PagedLogisticsRequestPositionType(
            logistics_request_positions=logistics_request_positions,
            total_count=total_count)

    def resolve_transfer_request_position_info(self, info, position_id):
        try:
            position = LogisticsRequestPosition.objects.get(id=position_id)
        except LogisticsRequestPosition.DoesNotExist:
            return []
        transfer_requests = []
        for tp in TransferPosition.objects.filter(
                good__good_kind=position.good_kind,
                good__unit=position.unit,
                transfer_request__completed=False).exclude(
                    logistics_request_position=position):
            transfer_request = tp.transfer_request
            transfer_request.count = '%s %s' % (str(
                int(tp.count) if isinstance(tp.count, float) and tp.count.
                is_integer() else tp.count), tp.good.unit.short_name)
            transfer_requests.append(transfer_request)
        transfer_requests = list(set(transfer_requests))
        return transfer_requests

    def resolve_good_location_info(self, info, position_id):
        try:
            position = LogisticsRequestPosition.objects.get(id=position_id)
        except LogisticsRequestPosition.DoesNotExist:
            return []
        result = []
        for g in Good.objects.filter(
                good_kind=position.good_kind,
                unit=position.unit).exclude(location_id__in=(1, 646)):
            if (g.project and g.project.id == position.request.reason.project.id) or \
              (g.location.project and g.location.project.id == position.request.reason.project.id):
                continue
            result.append(
                GoodLocationInfoType(project=g.location.project, good=g))
        return result

    def resolve_get_logistics_request_id(self, info):
        lr = LogisticsRequest.objects.filter(
            logisticsrequestposition__transferposition__transfer_request__ready_to_go
            =False,
            logisticsrequestposition__transferposition__transfer_request__who_requested
            =info.context.user).distinct()
        if lr:
            lr = lr[0].id
            return lr
        else:
            return -1

    def resolve_get_logistics_request_project_id(self, info):
        proj = None
        tr = TransferRequest.objects.filter(ready_to_go=False,
                                            who_requested=info.context.user)
        if tr:
            tp = TransferPosition.objects.filter(
                transfer_request=tr[0]).select_related(
                    'logistics_request_position__request')
            proj = tp[0].logistics_request_position.request.reason.project

        if proj:
            proj = proj.id
            return proj
        else:
            return -1
Пример #26
0
def convert_column_to_boolean(type, column, registry=None):
    return Boolean(description=column.doc, required=not (column.nullable))
Пример #27
0
 class Input:
     first_name = String(required=True)
     last_name = String(required=True)
     is_alive = Boolean(required=True)
     origin_id = Int(required=True)
     seasons = List(Int)
Пример #28
0
def convert_field_to_boolean(field, registry=None, input_flag=None, nested_field=False):
    required = is_required(field) and input_flag == "create"
    if required:
        return NonNull(Boolean, description=field.help_text)
    return Boolean(description=field.help_text)
Пример #29
0
class MutationResult(ObjectType):
    ok = Boolean()
 class Arguments():
     """Arguments of the class."""
     uuid = String()
     finding_id = String(required=True)
     approval_status = Boolean(required=True)