예제 #1
0
 def get(self, request, format=None):
     provider_data = ContentProvider \
         .objects \
         .values(IDENTIFIER, NAME, FILTER, URL)
     provider_table = {
         rec[IDENTIFIER]: (rec[NAME], rec[FILTER], rec[URL])
         for rec in provider_data
     }
     providers = get_providers('image')
     response = []
     for provider in providers:
         if provider in provider_table:
             display_name, _filter, provider_url = provider_table[provider]
             if not _filter:
                 response.append({
                     'provider_name': provider,
                     'image_count': providers[provider],
                     'display_name': display_name,
                     'provider_url': provider_url
                 })
         else:
             msg = 'provider_identifier missing from content_provider' \
                   ' table: {}. Check for typos/omissions.'.format(provider)
             log.error(msg)
     return Response(status=200, data=response)
예제 #2
0
 def validate_provider(self, value):
     allowed_providers = get_providers('image')
     if value not in allowed_providers:
         raise serializers.ValidationError(
             "Provider \'{}\' does not exist.".format(value))
     else:
         return value.lower()
예제 #3
0
    def validate_provider(input_providers):
        allowed_providers = list(get_providers('image').keys())

        for input_provider in input_providers.split(','):
            if input_provider not in allowed_providers:
                raise serializers.ValidationError(
                    "Provider \'{}\' does not exist.".format(input_providers))
        return input_providers.lower()
예제 #4
0
class ImageSearchQueryStringSerializer(_SearchQueryStringSerializer):
    """ Query parameters specific to image search."""
    provider = serializers.CharField(
        label="provider",
        help_text="A comma separated list of data sources to search. Valid "
        "inputs:"
        " `{}`".format(get_providers('image')),
        required=False)

    def validate_provider(self, value):
        allowed_providers = get_providers('image')
        if value not in allowed_providers:
            raise serializers.ValidationError(
                "Provider \'{}\' does not exist.".format(value))
        else:
            return value.lower()
예제 #5
0
class ImageSearchQueryStringSerializer(serializers.Serializer):
    """ Base class for search query parameters. """
    """ Parse and validate search query string parameters. """
    q = serializers.CharField(
        label="query",
        help_text="A query string that should not exceed 200 characters in "
        "length",
        required=False,
    )
    li = serializers.CharField(
        label="licenses",
        help_text="A comma-separated list of licenses. Example: `by,cc0`."
        " Valid inputs: `{}`".format(
            list(license_helpers.LICENSE_GROUPS['all'])),
        required=False,
    )
    lt = serializers.CharField(
        label="license type",
        help_text="A list of license types. "
        "Valid inputs: `{}`".format(
            (list(license_helpers.LICENSE_GROUPS.keys()))),
        required=False,
    )
    page = serializers.IntegerField(label="page number",
                                    help_text="The page number to retrieve.",
                                    default=1)
    pagesize = serializers.IntegerField(
        label="page size",
        help_text="The number of results to return in the requested page. "
        "Should be an integer between 1 and 500.",
        default=20)
    creator = serializers.CharField(
        label="creator",
        help_text="Search by creator only. Cannot be used with `q`.",
        required=False,
        max_length=200)
    tags = serializers.CharField(
        label="tags",
        help_text="Search by tag only. Cannot be used with `q`.",
        required=False,
        max_length=200)
    title = serializers.CharField(
        label="title",
        help_text="Search by title only. Cannot be used with `q`.",
        required=False,
        max_length=200)
    filter_dead = serializers.BooleanField(
        label="filter_dead",
        help_text="Control whether 404 links are filtered out.",
        required=False,
        default=True)
    provider = serializers.CharField(
        label="provider",
        help_text="A comma separated list of data sources to search. Valid "
        "inputs:"
        " `{}`".format(list(get_providers('image').keys())),
        required=False)
    extension = serializers.CharField(
        label="extension",
        help_text="A comma separated list of desired file extensions.",
        required=False)
    categories = serializers.CharField(
        label="categories",
        help_text="A comma separated list of categories; available categories "
        "include `illustration`, `photograph`, and "
        "`digitized_artwork`.",
        required=False)
    aspect_ratio = serializers.CharField(
        label='aspect_ratio',
        help_text="A comma separated list of aspect ratios; available aspect "
        "ratios include `tall`, `wide`, and `square`.",
        required=False)
    size = serializers.CharField(
        label='size',
        help_text="A comma separated list of image sizes; available sizes"
        "include `small`, `medium`, or `large`.",
        required=False)
    qa = serializers.BooleanField(
        label='quality_assurance',
        help_text="If enabled, searches are performed against the quality"
        " assurance index instead of production.",
        required=False,
        default=False)

    @staticmethod
    def validate_q(value):
        if len(value) > 200:
            return value[0:199]
        else:
            return value

    def validate_creator(self, value):
        return self.validate_q(value)

    def validate_tags(self, value):
        return self.validate_q(value)

    def validate_title(self, value):
        return self.validate_q(value)

    @staticmethod
    def validate_li(value):
        return _validate_li(value)

    @staticmethod
    def validate_lt(value):
        """
        Resolves a list of license types to a list of licenses.
        Example: commercial -> ['BY', 'BY-SA', 'BY-ND', 'CC0', 'PDM']
        """
        return _validate_lt(value)

    @staticmethod
    def validate_page(value):
        return _validate_page(value)

    @staticmethod
    def validate_pagesize(value):
        if 1 <= value <= 500:
            return value
        else:
            return 20

    @staticmethod
    def validate_provider(input_providers):
        allowed_providers = list(get_providers('image').keys())

        for input_provider in input_providers.split(','):
            if input_provider not in allowed_providers:
                raise serializers.ValidationError(
                    "Provider \'{}\' does not exist.".format(input_providers))
        return input_providers.lower()

    @staticmethod
    def validate_extension(value):
        return value.lower()

    @staticmethod
    def validate_categories(value):
        valid_categories = {'illustration', 'digitized_artwork', 'photograph'}
        _validate_enum('category', valid_categories, value)
        return value.lower()

    @staticmethod
    def validate_aspect_ratio(value):
        valid_ratios = {'tall', 'wide', 'square'}
        _validate_enum('aspect ratio', valid_ratios, value)
        return value.lower()

    def validate(self, data):
        advanced_search = 'creator' in data or 'title' in data or 'tags' in data
        if 'q' in data and advanced_search:
            raise serializers.ValidationError(
                "You cannot use `q` in combination with advanced search "
                "parameters `title`, `tags`, or `creator`.")
        elif 'q' not in data and not advanced_search:
            raise serializers.ValidationError(
                "You must use either the `q` parameter or an advanced search"
                "parameter such as `title`, `tags`, or `creator`.")
        elif 'li' in data and 'lt' in data:
            raise serializers.ValidationError(
                "Only license type or individual licenses can be defined, not "
                "both.")
        else:
            return data
예제 #6
0
class ImageSearchQueryStringSerializer(serializers.Serializer):
    """ Parse and validate search query string parameters. """
    DeprecatedParam = namedtuple('DeprecatedParam', ['original', 'successor'])
    deprecated_params = [
        DeprecatedParam('li', 'license'),
        DeprecatedParam('lt', 'license_type'),
        DeprecatedParam('pagesize', 'page_size'),
        DeprecatedParam('provider', 'source')
    ]

    q = serializers.CharField(
        label="query",
        help_text="A query string that should not exceed 200 characters in "
                  "length",
        required=False,
    )
    license = serializers.CharField(
        label="licenses",
        help_text="A comma-separated list of licenses. Example: `by,cc0`."
                  " Valid inputs: `{}`"
                  .format(list(license_helpers.LICENSE_GROUPS['all'])),
        required=False,
    )
    license_type = serializers.CharField(
        label="license type",
        help_text="A list of license types. "
                  "Valid inputs: `{}`"
                  .format((list(license_helpers.LICENSE_GROUPS.keys()))),
        required=False,
    )
    page = serializers.IntegerField(
        label="page number",
        help_text="The page number to retrieve.",
        default=1
    )
    page_size = serializers.IntegerField(
        label="page size",
        help_text="The number of results to return in the requested page. "
                  "Should be an integer between 1 and 500.",
        default=20
    )
    creator = serializers.CharField(
        label="creator",
        help_text="Search by creator only. Cannot be used with `q`.",
        required=False,
        max_length=200
    )
    tags = serializers.CharField(
        label="tags",
        help_text="Search by tag only. Cannot be used with `q`.",
        required=False,
        max_length=200
    )
    title = serializers.CharField(
        label="title",
        help_text="Search by title only. Cannot be used with `q`.",
        required=False,
        max_length=200
    )
    filter_dead = serializers.BooleanField(
        label="filter_dead",
        help_text="Control whether 404 links are filtered out.",
        required=False,
        default=True
    )
    source = serializers.CharField(
        label="provider",
        help_text="A comma separated list of data sources to search. Valid "
                  "inputs:"
                  " `{}`".format(list(get_providers('image').keys())),
        required=False
    )
    extension = serializers.CharField(
        label="extension",
        help_text="A comma separated list of desired file extensions.",
        required=False
    )
    categories = serializers.CharField(
        label="categories",
        help_text="A comma separated list of categories; available categories "
                  "include `illustration`, `photograph`, and "
                  "`digitized_artwork`.",
        required=False
    )
    aspect_ratio = serializers.CharField(
        label='aspect_ratio',
        help_text="A comma separated list of aspect ratios; available aspect "
                  "ratios include `tall`, `wide`, and `square`.",
        required=False
    )
    size = serializers.CharField(
        label='size',
        help_text="A comma separated list of image sizes; available sizes"
                  "include `small`, `medium`, or `large`.",
        required=False
    ),
    mature = serializers.BooleanField(
        label='mature',
        default=False,
        required=False,
        help_text="Whether to include content for mature audiences."
    )
    qa = serializers.BooleanField(
        label='quality_assurance',
        help_text="If enabled, searches are performed against the quality"
                  " assurance index instead of production.",
        required=False,
        default=False
    )

    @staticmethod
    def validate_q(value):
        if len(value) > 200:
            return value[0:199]
        else:
            return value

    def validate_creator(self, value):
        return self.validate_q(value)

    def validate_tags(self, value):
        return self.validate_q(value)

    def validate_title(self, value):
        return self.validate_q(value)

    @staticmethod
    def validate_license(value):
        return _validate_li(value)

    @staticmethod
    def validate_license_type(value):
        """
        Resolves a list of license types to a list of licenses.
        Example: commercial -> ['BY', 'BY-SA', 'BY-ND', 'CC0', 'PDM']
        """
        return _validate_lt(value)

    @staticmethod
    def validate_page(value):
        return _validate_page(value)

    @staticmethod
    def validate_page_size(value):
        if 1 <= value <= 500:
            return value
        else:
            return 20

    @staticmethod
    def validate_source(input_providers):
        allowed_providers = list(get_providers('image').keys())

        for input_provider in input_providers.split(','):
            if input_provider not in allowed_providers:
                raise serializers.ValidationError(
                    "Provider \'{}\' does not exist.".format(input_providers)
                )
        return input_providers.lower()

    @staticmethod
    def validate_extension(value):
        return value.lower()

    @staticmethod
    def validate_categories(value):
        valid_categories = {
            'illustration',
            'digitized_artwork',
            'photograph'
        }
        _validate_enum('category', valid_categories, value)
        return value.lower()

    @staticmethod
    def validate_aspect_ratio(value):
        valid_ratios = {'tall', 'wide', 'square'}
        _validate_enum('aspect ratio', valid_ratios, value)
        return value.lower()

    def validate(self, data):
        for deprecated in self.deprecated_params:
            param, successor = deprecated
            if param in self.initial_data:
                raise serializers.ValidationError(
                    f"Parameter '{param}' is deprecated in this release of"
                    f" the API. Use '{successor}' instead."
                )
        return data
예제 #7
0
class ImageSearchQueryStringSerializer(serializers.Serializer):
    """ Base class for search query parameters. """
    """ Parse and validate search query string parameters. """
    q = serializers.CharField(
        label="query",
        help_text="A comma-separated list of keywords. Should not exceed 200 "
        "characters in length. Example: `hello,world`",
        required=False,
    )
    li = serializers.CharField(
        label="licenses",
        help_text="A comma-separated list of licenses. Example: `by,cc0`."
        " Valid inputs: `{}`".format(list(LICENSE_GROUPS['all'])),
        required=False,
    )
    lt = serializers.CharField(
        label="license type",
        help_text="A list of license types. "
        "Valid inputs: `{}`".format((list(LICENSE_GROUPS.keys()))),
        required=False,
    )
    page = serializers.IntegerField(label="page number",
                                    help_text="The page number to retrieve.",
                                    default=1)
    pagesize = serializers.IntegerField(
        label="page size",
        help_text="The number of results to return in the requested page. "
        "Should be an integer between 1 and 500.",
        default=20)
    creator = serializers.CharField(label="creator",
                                    help_text="Search by creator.",
                                    required=False,
                                    max_length=200)
    tags = serializers.CharField(label="tags",
                                 help_text="Search by tag.",
                                 required=False,
                                 max_length=200)
    title = serializers.CharField(label="title",
                                  help_text="Search by title.",
                                  required=False,
                                  max_length=200)
    filter_dead = serializers.BooleanField(
        label="filter_dead",
        help_text="Control whether 404 links are filtered out.",
        required=False,
        default=True)
    provider = serializers.CharField(
        label="provider",
        help_text="A comma separated list of data sources to search. Valid "
        "inputs:"
        " `{}`".format(list(get_providers('image').keys())),
        required=False)

    def validate_q(self, value):
        if len(value) > 200:
            return value[0:199]
        else:
            return value

    def validate_creator(self, value):
        return self.validate_q(value)

    def validate_tags(self, value):
        return self.validate_q(value)

    def validate_title(self, value):
        return self.validate_q(value)

    def validate_li(self, value):
        licenses = [x.upper() for x in value.split(',')]
        for _license in licenses:
            if _license not in LICENSE_GROUPS['all']:
                raise serializers.ValidationError(
                    "License \'{}\' does not exist.".format(_license))
        return value.lower()

    def validate_lt(self, value):
        """
        Resolves a list of license types to a list of licenses.
        Example: commercial -> ['BY', 'BY-SA', 'BY-ND', 'CC0', 'PDM']
        """
        license_types = [x.lower() for x in value.split(',')]
        license_groups = []
        for _type in license_types:
            if _type not in LICENSE_GROUPS:
                raise serializers.ValidationError(
                    "License type \'{}\' does not exist.".format(_type))
            license_groups.append(LICENSE_GROUPS[_type])
        intersected = set.intersection(*license_groups)
        cleaned = {_license.lower() for _license in intersected}

        return ','.join(list(cleaned))

    def validate_page(self, value):
        if value < 1:
            return 1
        else:
            return value

    def validate_pagesize(self, value):
        if 1 <= value < 500:
            return value
        else:
            return 20

    def validate_provider(self, input_providers):
        allowed_providers = list(get_providers('image').keys())

        for input_provider in input_providers.split(','):
            if input_provider not in allowed_providers:
                raise serializers.ValidationError(
                    "Provider \'{}\' does not exist.".format(input_providers))
        return input_providers.lower()

    def validate(self, data):
        advanced_search = 'creator' in data or 'title' in data or 'tags' in data
        if 'q' in data and advanced_search:
            raise serializers.ValidationError(
                "You cannot use `q` in combination with advanced search "
                "parameters `title`, `tags`, or `creator`.")
        elif 'q' not in data and not advanced_search:
            raise serializers.ValidationError(
                "You must use either the `q` parameter or an advanced search"
                "parameter such as `title`, `tags`, or `creator`.")
        elif 'li' in data and 'lt' in data:
            raise serializers.ValidationError(
                "Only license type or individual licenses can be defined, not "
                "both.")
        else:
            return data