def get_tiddlers(environ, start_response): """ Get a list representation of the tiddlers in a bag. The information sent is dependent on the serialization chosen. """ store = environ['tiddlyweb.store'] filters = environ['tiddlyweb.filters'] bag_name = web.get_route_value(environ, 'bag_name') bag = _get_bag(environ, bag_name) title = 'Tiddlers From Bag %s' % bag.name title = environ['tiddlyweb.query'].get('title', [title])[0] usersign = environ['tiddlyweb.usersign'] # will raise exception if there are problems bag.policy.allows(usersign, 'read') tiddlers = Tiddlers(title=title) if not filters: tiddlers.store = store tiddlers.bag = bag_name for tiddler in store.list_bag_tiddlers(bag): tiddlers.add(tiddler) tiddlers.link = '%s/tiddlers' % web.bag_url(environ, bag, full=False) return send_tiddlers(environ, start_response, tiddlers=tiddlers)
def get_tiddlers(environ, start_response): """ Get a list representation of the tiddlers in a bag. The information sent is dependent on the serialization chosen. """ store = environ["tiddlyweb.store"] filters = environ["tiddlyweb.filters"] bag_name = web.get_route_value(environ, "bag_name") bag = _get_bag(environ, bag_name) title = "Tiddlers From Bag %s" % bag.name title = environ["tiddlyweb.query"].get("title", [title])[0] usersign = environ["tiddlyweb.usersign"] # will raise exception if there are problems bag.policy.allows(usersign, "read") tiddlers = Tiddlers(title=title) if not filters: tiddlers.store = store tiddlers.bag = bag_name # A special bag can raise NoBagError here. try: for tiddler in store.list_bag_tiddlers(bag): tiddlers.add(tiddler) except NoBagError, exc: raise HTTP404("%s not found, %s" % (bag.name, exc))
def _send_tiddler_revisions(environ, start_response, tiddler): """ Push the list of tiddler revisions out the network. """ store = environ['tiddlyweb.store'] title = 'Revisions of Tiddler %s' % tiddler.title title = environ['tiddlyweb.query'].get('title', [title])[0] container = 'recipes' if tiddler.recipe else 'bags' if environ['tiddlyweb.filters']: tiddlers = Tiddlers(title=title) else: tiddlers = Tiddlers(title=title, store=store) tiddlers.is_revisions = True tiddlers.link = '%s/revisions' % tiddler_url(environ, tiddler, container=container, full=False) # Set the container on the tiddlers. Since tiddler.recipe # defaults to None, we're "safe" here. tiddlers.recipe = tiddler.recipe tiddlers.bag = tiddler.bag try: for revision in store.list_tiddler_revisions(tiddler): tmp_tiddler = Tiddler(title=tiddler.title, bag=tiddler.bag) tmp_tiddler.revision = revision tmp_tiddler.recipe = tiddler.recipe tiddlers.add(tmp_tiddler) except NoTiddlerError, exc: # If a tiddler is not present in the store. raise HTTP404('tiddler %s not found, %s' % (tiddler.title, exc))
def list_tiddlers(self, tiddlers): """ Turn the contents of a Tiddlers into an Atom Feed. """ authors = set() try: from tiddlyweb.model.collections import Tiddlers config = self.environ['tiddlyweb.config'] default_filter = config['atom.default_filter'] filters, _ = parse_for_filters(default_filter, self.environ) new_tiddlers = Tiddlers() new_tiddlers.is_search = tiddlers.is_search new_tiddlers.is_revisions = tiddlers.is_revisions new_tiddlers.bag = tiddlers.bag new_tiddlers.recipe = tiddlers.recipe new_tiddlers.link = tiddlers.link for tiddler in recursive_filter(filters, tiddlers): new_tiddlers.add(tiddler) authors.add(tiddler.modifier) new_tiddlers.title = tiddlers.title new_tiddlers.is_search = tiddlers.is_search new_tiddlers.is_revisions = tiddlers.is_revisions tiddlers = new_tiddlers except (KeyError, ImportError): pass author_name = None author_link = None author_avatar = None if len(authors) == 1: author_name = authors.pop() author_link = self._get_author_link(author_name) author_avatar = self._get_author_avatar(author_name) hub = self.environ.get('tiddlyweb.config', {}).get('atom.hub', None) if tiddlers.link: link = tiddlers.link else: link = self._current_url() if not link.startswith('http'): link = u'%s%s' % (self._host_url(), link) feed = AtomFeed(link=link, language=u'en', hub=hub, author_name=author_name, author_link=author_link, author_avatar=author_avatar, title=tiddlers.title, description=tiddlers.title) for tiddler in tiddlers: self._add_tiddler_to_feed(feed, tiddler) # can we avoid sending utf-8 and let the wrapper handle it? return feed.writeString('utf-8')
def _filter_tiddlers(filters, store, tiddlers): """ Filter the tiddlers by filters provided by the enviornment. """ candidate_tiddlers = Tiddlers(store=store) try: candidate_tiddlers.title = tiddlers.title candidate_tiddlers.link = tiddlers.link candidate_tiddlers.is_search = tiddlers.is_search candidate_tiddlers.is_revisions = tiddlers.is_revisions candidate_tiddlers.bag = tiddlers.bag candidate_tiddlers.recipe = tiddlers.recipe except AttributeError: pass try: for tiddler in recursive_filter(filters, tiddlers): candidate_tiddlers.add(tiddler) except FilterError, exc: raise HTTP400('malformed filter: %s' % exc)
def _filter_tiddlers(filters, store, tiddlers): """ Filter the tiddlers by filters provided by the environment. """ candidate_tiddlers = Tiddlers(store=store) try: candidate_tiddlers.title = tiddlers.title candidate_tiddlers.link = tiddlers.link candidate_tiddlers.is_search = tiddlers.is_search candidate_tiddlers.is_revisions = tiddlers.is_revisions candidate_tiddlers.bag = tiddlers.bag candidate_tiddlers.recipe = tiddlers.recipe except AttributeError: pass try: for tiddler in recursive_filter(filters, tiddlers): candidate_tiddlers.add(tiddler) except FilterError as exc: raise HTTP400('malformed filter: %s' % exc) return candidate_tiddlers
def _send_tiddler_revisions(environ, start_response, tiddler): """ Push the list of tiddler revisions out the network. """ store = environ['tiddlyweb.store'] title = 'Revisions of Tiddler %s' % tiddler.title title = environ['tiddlyweb.query'].get('title', [title])[0] container = 'recipes' if tiddler.recipe else 'bags' if environ['tiddlyweb.filters']: tiddlers = Tiddlers(title=title) else: tiddlers = Tiddlers(title=title, store=store) tiddlers.is_revisions = True tiddlers.link = '%s/revisions' % tiddler_url(environ, tiddler, container=container, full=False) # Set the container on the tiddlers. Since tiddler.recipe # defaults to None, we're "safe" here. tiddlers.recipe = tiddler.recipe tiddlers.bag = tiddler.bag try: for revision in store.list_tiddler_revisions(tiddler): tmp_tiddler = Tiddler(title=tiddler.title, bag=tiddler.bag) tmp_tiddler.revision = revision tmp_tiddler.recipe = tiddler.recipe tiddlers.add(tmp_tiddler) except NoTiddlerError as exc: # If a tiddler is not present in the store. raise HTTP404('tiddler %s not found, %s' % (tiddler.title, exc)) except NoBagError as exc: raise HTTP404('tiddler %s not found, bag %s does not exist, %s' % (tiddler.title, tiddler.bag, exc)) except StoreMethodNotImplemented: raise HTTP400('no revision support') return send_tiddlers(environ, start_response, tiddlers=tiddlers)
def get_tiddlers(environ, start_response): """ Handle ``GET`` on a tiddlers-within-a-bag URI. Get a list representation of the :py:class:`tiddlers <tiddlyweb.model.tiddler.Tiddler>` in a :py:class:`bag <tiddlyweb.model.bag.Bag>`. The information sent is dependent on the serialization chosen via :py:mod:`tiddlyweb.web.negotiate`. """ store = environ['tiddlyweb.store'] filters = environ['tiddlyweb.filters'] bag_name = web.get_route_value(environ, 'bag_name') bag = _get_bag(environ, bag_name) title = 'Tiddlers From Bag %s' % bag.name title = environ['tiddlyweb.query'].get('title', [title])[0] usersign = environ['tiddlyweb.usersign'] # will raise exception if there are problems bag.policy.allows(usersign, 'read') tiddlers = Tiddlers(title=title) if not filters: tiddlers.store = store tiddlers.bag = bag_name # A special bag can raise NoBagError here. try: for tiddler in store.list_bag_tiddlers(bag): tiddlers.add(tiddler) except NoBagError as exc: raise HTTP404('%s not found, %s' % (bag.name, exc)) tiddlers.link = '%s/tiddlers' % web.bag_url(environ, bag, full=False) return send_tiddlers(environ, start_response, tiddlers=tiddlers)