# HG changeset patch # User Paul Boddie # Date 1443546204 -7200 # Node ID fde5ece8dc9ad63bc9b66b2d2561b89eb8b74588 # Parent 7cbf127b2711e7113a6246ca36f6dc8d08a6fd5e Improved address and URI conversion, supporting verbose addresses and accompanying name information. diff -r 7cbf127b2711 -r fde5ece8dc9a imiptools/data.py --- a/imiptools/data.py Tue Sep 29 19:02:01 2015 +0200 +++ b/imiptools/data.py Tue Sep 29 19:03:24 2015 +0200 @@ -705,6 +705,17 @@ # Conversion functions. +def get_address_parts(values): + + "Return name and address tuples for each of the given 'values'." + + l = [] + for name, address in values and email.utils.getaddresses(values) or []: + if is_mailto_uri(name): + name = name[7:] # strip "mailto:" + l.append((name, address)) + return l + def get_addresses(values): """ @@ -713,24 +724,48 @@ itself. """ - return [address for name, address in email.utils.getaddresses(values)] + return [address for name, address in get_address_parts(values)] def get_address(value): "Return an e-mail address from the given 'value'." if not value: return None - return get_addresses([value.startswith("mailto:") and value[7:] or value])[0] + return get_addresses([value])[0] + +def get_verbose_address(value, attr=None): + + """ + Return a verbose e-mail address featuring any name from the given 'value' + and any accompanying 'attr' dictionary. + """ + + name, address = get_address_parts([value])[0] + if not name: + name = attr and attr.get("CN") + if name and address: + return "%s <%s>" % (name, address) + else: + return address + +def is_mailto_uri(value): + return value.lower().startswith("mailto:") def get_uri(value): "Return a URI for the given 'value'." if not value: return None - return value.lower().startswith("mailto:") and ("mailto:%s" % value[7:]) or \ + return is_mailto_uri(value) and ("mailto:%s" % value[7:]) or \ ":" in value and value or \ "mailto:%s" % get_address(value) +def uri_parts(values): + + "Return any common name plus the URI for each of the given 'values'." + + return [(name, get_uri(address)) for name, address in get_address_parts(values)] + uri_value = get_uri def uri_values(values):