def cache_key(*keys, **pairs): """Smart key maker, returns the object itself if a key, else a list delimited by ':', automatically hashing any non-scalar objects.""" if is_string_like(keys): keys = [keys] if is_list_or_tuple(keys): if len(keys) == 1 and is_list_or_tuple(keys[0]): keys = keys[0] else: keys = [md5_hash(keys)] if pairs: keys = list(keys) klist = pairs.keys() klist.sort() for k in klist: keys.append(k) keys.append(pairs[k]) key = KEY_DELIM.join([_hash_or_string(x) for x in keys]) prefix = CACHE_PREFIX + KEY_DELIM if not key.startswith(prefix): key = prefix+key return key.replace(" ", ".")
def __init__(self, key, name, *args, **kwargs): """Create a new ConfigurationGroup. Arguments: - key - group name - for display to user Named Arguments: - ordering: integer, optional, defaults to 1. - requires: See `Value` requires. The default `requires` all member values will have if not overridden. - requiresvalue: See `Values` requires_value. The default `requires_value` if not overridden on the `Value` objects. """ self.key = key self.name = name self.ordering = kwargs.pop('ordering', 1) self.requires = kwargs.pop('requires', None) if self.requires: reqval = kwargs.pop('requiresvalue', key) if not is_list_or_tuple(reqval): reqval = (reqval, reqval) self.requires_value = reqval[0] self.requires.add_choice(reqval) super(ConfigurationGroup, self).__init__(*args, **kwargs)
def add_choice(self, choice): """Add a choice if it doesn't already exist.""" if not is_list_or_tuple(choice): choice = (choice, choice) skip = False for k, v in self.choices: if k == choice[0]: skip = True break if not skip: self.choices += (choice, )
def to_python(self, value): if not value or value == NOTSET: return [] if is_list_or_tuple(value): return value else: try: return simplejson.loads(value) except: if is_string_like(value): return [value] else: log.warning('Could not decode returning empty list: %s', value) return []
def __init__(self, group, key, **kwargs): """ Create a new Value object for configuration. Args: - `ConfigurationGroup` - key - a string key Named arguments: - `description` - Will be passed to the field for form usage. Should be a translation proxy. Ex: _('example') - `help_text` - Will be passed to the field for form usage. - `choices` - If given, then the form field will use a select box - `ordering` - Defaults to alphabetical by key if not given. - `requires` - If given as a `Value`, then this field will only be rendered if that Value evaluates true (for Boolean requires) or the proper key is in the associated value. - `requiresvalue` - If set, then this field will only be rendered if that value is in the list returned by self.value. Defaults to self.key. - `hidden` - If true, then render a hidden field. - `default` - If given, then this Value will return that default whenever it has no assocated `Setting`. """ self.group = group self.key = key self.description = kwargs.get('description', None) self.help_text = kwargs.get('help_text') self.choices = kwargs.get('choices',[]) self.ordering = kwargs.pop('ordering', 0) self.hidden = kwargs.pop('hidden', False) self.requires = kwargs.pop('requires', None) if self.requires: reqval = kwargs.pop('requiresvalue', key) if not is_list_or_tuple(reqval): reqval = (reqval, reqval) self.requires_value = reqval[0] self.requires.add_choice(reqval) elif group.requires: self.requires = group.requires self.requires_value = group.requires_value if kwargs.has_key('default'): self.default = kwargs.pop('default') self.use_default = True else: self.use_default = False self.creation_counter = Value.creation_counter Value.creation_counter += 1