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)
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()
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()
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()
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
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
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