# Standard Python library imports.
import collections
import hashlib
# Django imports
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
# Read project settings for Pydenticon, or fall-back to default values.
PYDENTICON_ROWS = getattr(settings, "PYDENTICON_ROWS", 5)
PYDENTICON_COLUMNS = getattr(settings, "PYDENTICON_COLUMNS", 5)
PYDENTICON_WIDTH = getattr(settings, "PYDENTICON_WIDTH", 200)
PYDENTICON_HEIGHT = getattr(settings, "PYDENTICON_HEIGHT", 200)
PYDENTICON_PADDING = getattr(settings, "PYDENTICON_PADDING", (20, 20, 20, 20))
PYDENTICON_FORMAT = getattr(settings, "PYDENTICON_FORMAT", "png")
PYDENTICON_FOREGROUND = getattr(settings, "PYDENTICON_FOREGROUND", ( "rgb(45,79,255)",
"rgb(254,180,44)",
"rgb(226,121,234)",
"rgb(30,179,253)",
"rgb(232,77,65)",
"rgb(49,203,115)",
"rgb(141,69,170)" ))
PYDENTICON_BACKGROUND = getattr(settings, "PYDENTICON_BACKGROUND", "rgb(224,224,224)")
PYDENTICON_DIGEST = getattr(settings, "PYDENTICON_DIGEST", hashlib.md5)
PYDENTICON_INVERT = getattr(settings, "PYDENTICON_INVERT", False)
# Validate the settings.
if not isinstance(PYDENTICON_ROWS, int) or PYDENTICON_ROWS <= 0:
raise ImproperlyConfigured("Setting PYDENTICON_ROWS must be a positive integer.")
if not isinstance(PYDENTICON_COLUMNS, int) or PYDENTICON_COLUMNS <= 0:
raise ImproperlyConfigured("Setting PYDENTICON_COLUMNS must be a positive integer.")
if not isinstance(PYDENTICON_WIDTH, int) or PYDENTICON_WIDTH <= 0:
raise ImproperlyConfigured("Setting PYDENTICON_WIDTH must be a positive integer.")
if not isinstance(PYDENTICON_HEIGHT, int) or PYDENTICON_HEIGHT <= 0:
raise ImproperlyConfigured("Setting PYDENTICON_HEIGHT must be a positive integer.")
if not all([isinstance(p, int) and p >= 0 for p in PYDENTICON_PADDING]) or len(PYDENTICON_PADDING) != 4:
raise ImproperlyConfigured("Setting PYDENTICON_PADDING must be a 4-tuple where each element is a non-negative integer.")
if PYDENTICON_FORMAT not in ("png", "ascii"):
raise ImproperlyConfigured("Setting PYDENTICON_FORMAT must be set to one of: 'png', 'ascii'.")
if not all([isinstance(f, str) for f in PYDENTICON_FOREGROUND]):
raise ImproperlyConfigured("Setting PYDENTICON_FOREGROUND must be a tuple where each element is string representation of colour.")
if not isinstance(PYDENTICON_BACKGROUND, str):
raise ImproperlyConfigured("Setting PYDENTICON_BACKGROUND must be a string representation of colour")
if not isinstance(PYDENTICON_DIGEST, collections.Callable):
raise ImproperlyConfigured("Setting PYDENTICON_DIGEST must be a callable digest (usually from hashlib module).")
if not isinstance(PYDENTICON_INVERT, bool):
raise ImproperlyConfigured("Setting PYDENTICON_INVERT must be a boolean.")