4970dab6d7
One item can have multiple media:content elements which may be located in multiple media:group element to indicate that content is the same but for the format. This patch adds the ability to add multiple content elements and define the group to which they go belong. If no group is specified, all elements are located in a `default` group. If the group is set to None, the content element is directly attached to the item element. Part of #58
74 lines
2.3 KiB
Python
74 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
'''
|
|
feedgen.util
|
|
~~~~~~~~~~~~
|
|
|
|
This file contains helper functions for the feed generator module.
|
|
|
|
:copyright: 2013, Lars Kiesow <lkiesow@uos.de>
|
|
:license: FreeBSD and LGPL, see license.* for more details.
|
|
'''
|
|
import locale
|
|
import sys
|
|
|
|
|
|
def ensure_format(val, allowed, required, allowed_values=None, defaults=None):
|
|
'''Takes a dictionary or a list of dictionaries and check if all keys are in
|
|
the set of allowed keys, if all required keys are present and if the values
|
|
of a specific key are ok.
|
|
|
|
:param val: Dictionaries to check.
|
|
:param allowed: Set of allowed keys.
|
|
:param required: Set of required keys.
|
|
:param allowed_values: Dictionary with keys and sets of their allowed
|
|
values.
|
|
:param defaults: Dictionary with default values.
|
|
:returns: List of checked dictionaries.
|
|
'''
|
|
if not val:
|
|
return []
|
|
if allowed_values is None:
|
|
allowed_values = {}
|
|
if defaults is None:
|
|
defaults = {}
|
|
# Make shure that we have a list of dicts. Even if there is only one.
|
|
if not isinstance(val, list):
|
|
val = [val]
|
|
for elem in val:
|
|
if not isinstance(elem, dict):
|
|
raise ValueError('Invalid data (value is no dictionary)')
|
|
# Set default values
|
|
|
|
version = sys.version_info[0]
|
|
|
|
if version == 2:
|
|
items = defaults.iteritems()
|
|
else:
|
|
items = defaults.items()
|
|
|
|
for k, v in items:
|
|
elem[k] = elem.get(k, v)
|
|
if not set(elem.keys()) <= allowed:
|
|
raise ValueError('Data contains invalid keys')
|
|
if not set(elem.keys()) >= required:
|
|
raise ValueError('Data contains not all required keys')
|
|
|
|
if version == 2:
|
|
values = allowed_values.iteritems()
|
|
else:
|
|
values = allowed_values.items()
|
|
|
|
for k, v in values:
|
|
if elem.get(k) and not elem[k] in v:
|
|
raise ValueError('Invalid value for %s' % k)
|
|
return val
|
|
|
|
|
|
def formatRFC2822(d):
|
|
'''Make sure the locale setting do not interfere with the time format.
|
|
'''
|
|
l = locale.setlocale(locale.LC_ALL)
|
|
locale.setlocale(locale.LC_ALL, 'C')
|
|
d = d.strftime('%a, %d %b %Y %H:%M:%S %z')
|
|
locale.setlocale(locale.LC_ALL, l)
|
|
return d
|