import cache from infogami.utils import delegate def _get_libraries(site=None): """Returns all the libraries each as a dict.""" if 'env' not in web.ctx: delegate.fakeload() site = site or web.ctx.site keys = site.things(query={"type": "/type/library", "limit": 1000, "status": "approved"}) libraries = site.get_many(keys) return [lib.dict() for lib in libraries] # cache the result for an hour in memcache _get_libraries_memoized = cache.memcache_memoize(_get_libraries, "inlibrary._get_libraries", timeout=60*60) def get_libraries(): """Returns all the libraries.""" libraries = _get_libraries_memoized() return [web.ctx.site.new(doc['key'], doc) for doc in libraries] def _get_library(libraries, ip): """Returns the library containing the given ip as dict. """ for lib in libraries: if lib.has_ip(ip): return lib def get_library(): """Returns library document if the IP of the current request is in the IP range of that library.
metadata = process_metadata_dict(item_json.get('metadata', {})) if metadata: # if any of the files is access restricted, consider it as # an access-restricted item. files = item_json.get('files', []) metadata['access-restricted'] = any(f.get('private') == 'true' for f in files) # remember the filenames to construct download links metadata['_filenames'] = [f['name'] for f in files] return metadata def get_metadata(itemid): item_json = get_item_json(itemid) return extract_item_metadata(item_json) get_metadata = cache.memcache_memoize(get_metadata, key_prefix='ia.get_metadata', timeout=5*60) def process_metadata_dict(metadata): """Process metadata dict to make sure multi-valued fields like collection and external-identifier are always lists. The metadata API returns a list only if a field has more than one value in _meta.xml. This puts burden on the application to handle both list and non-list cases. This function makes sure the known multi-valued fields are always lists. """ mutlivalued = set(['collection', 'external-identifier', 'isbn', 'subject', 'oclc-id']) def process_item(k, v): if k in mutlivalued and not isinstance(v, list): v = [v] elif k not in mutlivalued and isinstance(v, list):
stats.end() return web.storage() # archive.org returns html on internal errors. # Checking for valid xml before trying to parse it. if not metaxml.strip().startswith("<?xml"): return web.storage() try: defaults = {"collection": [], "external-identifier": []} return web.storage(xml2dict(metaxml, **defaults)) except Exception, e: print >> web.debug, "Failed to parse metaxml for %s: %s" % (itemid, str(e)) return web.storage() get_meta_xml = cache.memcache_memoize(get_meta_xml, key_prefix="ia.get_meta_xml", timeout=5*60) def xml2dict(xml, **defaults): """Converts xml to python dictionary assuming that the xml is not nested. To get some tag as a list/set, pass a keyword argument with list/set as value. >>> xml2dict('<doc><x>1</x><x>2</x></doc>') {'x': 2} >>> xml2dict('<doc><x>1</x><x>2</x></doc>', x=[]) {'x': [1, 2]} """ d = defaults dom = minidom.parseString(xml) for node in dom.documentElement.childNodes: