def _recipe_list(self, tiddlers, recipe_name): representation_link = '%s/recipes/%s/tiddlers' % ( self._server_prefix(), encode_name(recipe_name)) representations = self._tiddler_list_header(representation_link) user_object = get_user_object(self.environ) recipe = self.environ['tiddlyweb.store'].get(Recipe(recipe_name)) publicity = '' try: recipe.policy.allows(user_object, 'manage') policy = recipe.policy if policy.read == [user_object['name']]: publicity = 'private' elif policy.read == []: publicity = 'public' else: publicity = 'custom' delete = True except (UserRequiredError, ForbiddenError): policy = None delete = False data = {'title': 'TiddlyHoster Recipe %s' % recipe.name, 'policy': policy, 'publicity': publicity, 'delete': delete, 'recipe': recipe, 'tiddlers': tiddlers, 'representations': representations} del self.environ['tiddlyweb.title'] return send_template(self.environ, 'recipelist.html', data)
def post_createbag(environ, start_response): user = get_user_object(environ) store = environ["tiddlyweb.store"] bag_name = environ["tiddlyweb.query"].get("bag", [""])[0] publicity = environ["tiddlyweb.query"].get("publicity", [""])[0] description = environ["tiddlyweb.query"].get("description", [""])[0] if not bag_name: raise HTTP400("missing data") bag = Bag(bag_name) try: bag = store.get(bag) raise HTTP400("bag exists") except NoBagError: pass if publicity == "public": bag = ensure_public_bag(store, user["name"], desc=description, name=bag_name) elif publicity == "protected": bag = ensure_protected_bag(store, user["name"], desc=description, name=bag_name) else: bag = ensure_private_bag(store, user["name"], desc=description, name=bag_name) # the bag has already been stored raise HTTP303("%s/tiddlers" % bag_url(environ, bag))
def list_tiddlers(self, bag): """ If the URL is a list of bag tiddlers, we present a bag editing interface. Otherwise we use the parent serialization. """ if (self.environ['wsgiorg.routing_args'][1].get('tiddler_name')): return HTMLSerialization.list_tiddlers(self, bag) try: name = self.environ['wsgiorg.routing_args'][1]['bag_name'] except KeyError: # not a bag link return HTMLSerialization.list_tiddlers(self, bag) representation_link = '%s/bags/%s/tiddlers' % ( self._server_prefix(), encode_name(bag.name)) representations = self._tiddler_list_header(representation_link) user_object = get_user_object(self.environ) publicity = '' try: bag.policy.allows(user_object, 'manage') policy = bag.policy publicity = determine_publicity(user_object, policy) except (UserRequiredError, ForbiddenError): policy = None try: bag.policy.allows(user_object, 'delete') delete = True except (UserRequiredError, ForbiddenError): delete = False data = {'title': 'TiddlyHoster Bag %s' % bag.name, 'policy': policy, 'publicity': publicity, 'delete': delete, 'bag': bag, 'representations': representations} del self.environ['tiddlyweb.title'] return send_template(self.environ, 'baglist.html', data)
def send_template(environ, template_name, template_data=None): if template_data == None: template_data = {} template = get_template(environ, template_name) server_prefix = environ['tiddlyweb.config']['server_prefix'] user = get_user_object(environ) template_defaults = { #'message': 'test me you are a message', 'version': VERSION, 'user': user, 'member_role': 'MEMBER', 'title': 'TiddlyHoster', 'userpage': { 'link': '%s/home' % server_prefix, 'title': 'homepage', }, 'login': { 'link': '%s/challenge' % server_prefix, 'title': 'Login', }, 'help': { 'link': '%s/help' % server_prefix, 'title': 'Help', }, 'register': { 'link': '%s/register' % server_prefix, 'title': 'Register', }, 'server_prefix': server_prefix, 'main_css': environ['tiddlyweb.config'].get( 'hoster.main_css', 'main.css'), } template_defaults.update(template_data) return template.generate(template_defaults)
def post_createbag(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] bag_name = environ['tiddlyweb.query'].get('bag', [''])[0] publicity = environ['tiddlyweb.query'].get('publicity', [''])[0] description = environ['tiddlyweb.query'].get('description', [''])[0] if not bag_name: raise HTTP400('missing data') bag = Bag(bag_name) try: bag = store.get(bag) raise HTTP400('bag exists') except NoBagError: pass if publicity == 'public': bag = ensure_public_bag( store, user['name'], desc=description, name=bag_name) elif publicity == 'protected': bag = ensure_protected_bag( store, user['name'], desc=description, name=bag_name) else: bag = ensure_private_bag( store, user['name'], desc=description, name=bag_name) # the bag has already been stored raise HTTP303('%s/tiddlers' % bag_url(environ, bag))
def _recipe_list(self, tiddlers, recipe_name): representation_link = '%s/recipes/%s/tiddlers' % ( self._server_prefix(), encode_name(recipe_name)) representations = self._tiddler_list_header(representation_link) user_object = get_user_object(self.environ) recipe = self.environ['tiddlyweb.store'].get(Recipe(recipe_name)) publicity = '' try: recipe.policy.allows(user_object, 'manage') policy = recipe.policy if policy.read == [user_object['name']]: publicity = 'private' elif policy.read == []: publicity = 'public' else: publicity = 'custom' delete = True except (UserRequiredError, ForbiddenError): policy = None delete = False data = { 'title': 'TiddlyHoster Recipe %s' % recipe.name, 'policy': policy, 'publicity': publicity, 'delete': delete, 'recipe': recipe, 'tiddlers': tiddlers, 'representations': representations } del self.environ['tiddlyweb.title'] return send_template(self.environ, 'recipelist.html', data)
def send_template(environ, template_name, template_data=None): if template_data is None: template_data = {} template = get_template(environ, template_name) server_prefix = environ['tiddlyweb.config']['server_prefix'] user = get_user_object(environ) template_defaults = { #'message': 'test me you are a message', 'version': VERSION, 'user': user, 'member_role': 'MEMBER', 'title': '', 'userpage': { 'link': '%s/home' % server_prefix, 'title': 'homepage', }, 'login': { 'link': '%s/login' % server_prefix, 'title': 'Login', }, 'help': { 'link': '%s/help' % server_prefix, 'title': 'Help', }, 'register': { 'link': '%s/register' % server_prefix, 'title': 'Register', }, 'server_prefix': server_prefix, 'main_css': environ['tiddlyweb.config'].get('hoster.main_css', 'main.css'), } template_defaults.update(template_data) return template.generate(template_defaults)
def _bag_list(self, tiddlers): if '/feedbag' in self.environ['selector.matches'][0]: representation_link = '%s/feedbag' % (self._server_prefix()) bag = Bag('feedbag') bag.policy.manage = ["NONE"] bag.policy.delete = ["NONE"] bag.desc = 'Recent Public Stuff' else: name = self.environ['wsgiorg.routing_args'][1]['bag_name'] name = urllib.unquote(name) name = name.decode('utf-8') representation_link = '%s/bags/%s/tiddlers' % ( self._server_prefix(), encode_name(name)) bag = self.environ['tiddlyweb.store'].get(Bag(name)) representations = self._tiddler_list_header(representation_link) user_object = get_user_object(self.environ) publicity = '' try: bag.policy.allows(user_object, 'manage') policy = bag.policy publicity = determine_publicity(user_object, policy) except (UserRequiredError, ForbiddenError): policy = None try: bag.policy.allows(user_object, 'delete') delete = True except (UserRequiredError, ForbiddenError): delete = False data = {'title': 'TiddlyHoster Bag %s' % bag.name, 'policy': policy, 'publicity': publicity, 'delete': delete, 'bag': bag, 'tiddlers': tiddlers, 'representations': representations} del self.environ['tiddlyweb.title'] return send_template(self.environ, 'baglist.html', data)
def user_page(environ, start_response): userpage = environ['wsgiorg.routing_args'][1]['userpage'] user = environ['tiddlyweb.usersign'] userpage = _decode_name(userpage) first_time_check(environ, user) store = environ['tiddlyweb.store'] # If we try to go to a user page that doesn't exist, # just go to the home page. XXX maybe should 404 instead. try: userpage_user = User(userpage) userpage_user = store.get(userpage_user) except NoUserError: pass # roles will be empty if 'MEMBER' not in userpage_user.list_roles(): raise HTTP404('%s has no page' % userpage) user_friend_names = get_friends(store, user['name']) friend_names = sorted(get_friends(store, userpage)) friends = [] for name in friend_names: email = get_email_tiddler(store, name) email_md5 = md5(email.lower()).hexdigest() friends.append((name, email_md5)) profile_tiddler = get_profile(store, user, userpage) profile_html = render_wikitext(profile_tiddler, environ) notice_tiddler = get_notice(environ) notice_html = render_wikitext(notice_tiddler, environ) kept_recipes = get_stuff(store, store.list_recipes(), user, userpage) kept_bags = get_stuff(store, store.list_bags(), user, userpage) kept_favorites = get_stuff(store, get_favorited_bags(store, userpage), user) kept_bookmarks = get_stuff(store, get_bookmarked_recipes(store, userpage), user) email = get_email_tiddler(store, userpage) email_md5 = md5(email.lower()).hexdigest() data = { 'bags': kept_bags, 'user_friends': user_friend_names, 'friends': friends, 'recipes': kept_recipes, 'favorites': kept_favorites, 'bookmarks': kept_bookmarks, 'home': userpage, 'profile': profile_html, 'notice': { 'html': notice_html, 'modified': notice_tiddler.modified }, 'title': userpage, 'email': email, 'email_md5': email_md5, 'user': get_user_object(environ) } return send_template(environ, 'profile.html', data)
def add_email(environ, start_response): user = get_user_object(environ) store = environ["tiddlyweb.store"] ensure_user_bag(store, user["name"]) tiddler = Tiddler("email", user["name"]) email = environ["tiddlyweb.query"].get("email", [""])[0] tiddler.text = email store.put(tiddler) raise HTTP303("%s/home" % server_base_url(environ))
def add_email(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) tiddler = Tiddler('email', user['name']) email = environ['tiddlyweb.query'].get('email', [''])[0] tiddler.text = email store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def user_page(environ, start_response): userpage = environ['wsgiorg.routing_args'][1]['userpage'] user = environ['tiddlyweb.usersign'] userpage = _decode_name(userpage) first_time_check(environ, user) store = environ['tiddlyweb.store'] # If we try to go to a user page that doesn't exist, # just go to the home page. XXX maybe should 404 instead. try: userpage_user = User(userpage) userpage_user = store.get(userpage_user) except NoUserError: pass # roles will be empty if 'MEMBER' not in userpage_user.list_roles(): raise HTTP404('%s has no page' % userpage) user_friend_names = get_friends(store, user['name']) friend_names = sorted(get_friends(store, userpage)) friends = [] for name in friend_names: email = get_email_tiddler(store, name) email_md5 = md5(email.lower()).hexdigest() friends.append((name, email_md5)) profile_tiddler = get_profile(store, user, userpage) profile_html = render_wikitext(profile_tiddler, environ) notice_tiddler = get_notice(environ) notice_html = render_wikitext(notice_tiddler, environ) kept_recipes = get_stuff(store, store.list_recipes(), user, userpage) kept_bags = get_stuff(store, store.list_bags(), user, userpage) kept_favorites = get_stuff(store, get_favorited_bags(store, userpage), user) kept_bookmarks = get_stuff(store, get_bookmarked_recipes(store, userpage), user) email = get_email_tiddler(store, userpage) email_md5 = md5(email.lower()).hexdigest() data = {'bags': kept_bags, 'user_friends': user_friend_names, 'friends': friends, 'recipes': kept_recipes, 'favorites': kept_favorites, 'bookmarks': kept_bookmarks, 'home': userpage, 'profile': profile_html, 'notice': {'html': notice_html, 'modified': notice_tiddler.modified}, 'title': userpage, 'email': email, 'email_md5': email_md5, 'user': get_user_object(environ)} return send_template(environ, 'profile.html', data)
def add_email(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) tiddler = Tiddler('email', user['name']) email = environ['tiddlyweb.query'].get('email', [''])[0] tiddler.text = email tiddler.modifier = user['name'] store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def user_page(environ, start_response): userpage = environ["wsgiorg.routing_args"][1]["userpage"] user = environ["tiddlyweb.usersign"] userpage = _decode_name(userpage) first_time_check(environ, user) store = environ["tiddlyweb.store"] # If we try to go to a user page that doesn't exist, # just go to the home page. XXX maybe should 404 instead. try: userpage_user = User(userpage) userpage_user = store.get(userpage_user) except NoUserError: pass # roles will be empty if "MEMBER" not in userpage_user.list_roles(): raise HTTP404("%s has no page" % userpage) user_friend_names = get_friends(store, user["name"]) friend_names = sorted(get_friends(store, userpage)) friends = [] for name in friend_names: email = get_email_tiddler(store, name) email_md5 = md5(email.lower()).hexdigest() friends.append((name, email_md5)) profile_tiddler = get_profile(store, user, userpage) profile_html = render_wikitext(profile_tiddler, environ) notice_tiddler = get_notice(environ) notice_html = render_wikitext(notice_tiddler, environ) kept_recipes = get_stuff(store, store.list_recipes(), user, userpage) kept_bags = get_stuff(store, store.list_bags(), user, userpage) kept_favorites = get_stuff(store, get_favorited_bags(store, userpage), user) kept_bookmarks = get_stuff(store, get_bookmarked_recipes(store, userpage), user) email = get_email_tiddler(store, userpage) email_md5 = md5(email.lower()).hexdigest() data = { "bags": kept_bags, "user_friends": user_friend_names, "friends": friends, "recipes": kept_recipes, "favorites": kept_favorites, "bookmarks": kept_bookmarks, "home": userpage, "profile": profile_html, "notice": {"html": notice_html, "modified": notice_tiddler.modified}, "title": userpage, "email": email, "email_md5": email_md5, "user": get_user_object(environ), } return send_template(environ, "profile.html", data)
def add_friend(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) new_friend = environ['tiddlyweb.query'].get('name', [''])[0] friends = get_friends(store, user['name']) if new_friend and new_friend not in friends: friends.append(new_friend) tiddler = store.get(Tiddler('friends', user['name'])) tiddler.text = '\n'.join(friends) store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def bag_favor(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) new_favorite = environ['tiddlyweb.query'].get('bag', [''])[0] favorites = get_favorites(store, user['name']) # XXX I suppose a set would be okay here. if new_favorite and new_favorite not in favorites: favorites.append(new_favorite) tiddler = store.get(Tiddler('favorites', user['name'])) tiddler.text = '\n'.join(favorites) store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def public_stuff(environ, start_response): """ A collection of the most recent stuff. A place where _all_ the content readable by the current user can be viewed. """ user = get_user_object(environ) store = environ['tiddlyweb.store'] kept_bags = get_stuff(store, store.list_bags(), user) tiddlers = Tiddlers() for bag in kept_bags: bag = store.get(bag) for tiddler in store.list_bag_tiddlers(bag): tiddlers.add(tiddler) return send_tiddlers(environ, start_response, tiddlers=tiddlers)
def add_friend(environ, start_response): user = get_user_object(environ) store = environ["tiddlyweb.store"] ensure_user_bag(store, user["name"]) new_friend = environ["tiddlyweb.query"].get("name", [""])[0] friends = get_friends(store, user["name"]) if new_friend and new_friend not in friends: friends.append(new_friend) tiddler = Tiddler("friends", user["name"]) try: tiddler = store.get(tiddler) except NoTiddlerError: pass # is okay if tiddler doesn't exist yet tiddler.text = "\n".join(friends) store.put(tiddler) raise HTTP303("%s/home" % server_base_url(environ))
def _recipe_policy(environ, recipe_name, publicity): user = get_user_object(environ) store = environ["tiddlyweb.store"] recipe = Recipe(recipe_name) recipe = store.get(recipe) recipe.policy.allows(user, "manage") if publicity == "custom": raise HTTP303(recipe_url(environ, recipe) + "/tiddlers") if publicity == "public": recipe.policy.read = [] else: recipe.policy.read = [user["name"]] store.put(recipe) raise HTTP303(recipe_url(environ, recipe) + "/tiddlers")
def recipe_favor(environ, start_response): user = get_user_object(environ) store = environ["tiddlyweb.store"] ensure_user_bag(store, user["name"]) new_bookmark = environ["tiddlyweb.query"].get("recipe", [""])[0] bookmarks = get_bookmarks(store, user["name"]) # XXX I suppose a set would be okay here. if new_bookmark and new_bookmark not in bookmarks: bookmarks.append(new_bookmark) tiddler = Tiddler("bookmarks", user["name"]) try: tiddler = store.get(tiddler) except NoTiddlerError: pass # is okay if tiddler doesn't exist yet tiddler.text = "\n".join(bookmarks) store.put(tiddler) raise HTTP303("%s/home" % server_base_url(environ))
def bag_favor(environ, start_response): user = get_user_object(environ) store = environ["tiddlyweb.store"] ensure_user_bag(store, user["name"]) new_favorite = environ["tiddlyweb.query"].get("bag", [""])[0] favorites = get_favorites(store, user["name"]) # XXX I suppose a set would be okay here. if new_favorite and new_favorite not in favorites: favorites.append(new_favorite) tiddler = Tiddler("favorites", user["name"]) try: tiddler = store.get(tiddler) except NoTiddlerError: pass # is okay if tiddler doesn't exist yet tiddler.text = "\n".join(favorites) store.put(tiddler) raise HTTP303("%s/home" % server_base_url(environ))
def add_friend(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) new_friend = environ['tiddlyweb.query'].get('name', [''])[0] friends = get_friends(store, user['name']) if new_friend and new_friend not in friends: friends.append(new_friend) tiddler = Tiddler('friends', user['name']) try: tiddler = store.get(tiddler) except NoTiddlerError: pass # is okay if tiddler doesn't exist yet tiddler.text = '\n'.join(friends) tiddler.modifier = user['name'] store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def _recipe_policy(environ, recipe_name, publicity): user = get_user_object(environ) store = environ['tiddlyweb.store'] recipe = Recipe(recipe_name) recipe = store.get(recipe) recipe.policy.allows(user, 'manage') if publicity == 'custom': raise HTTP303(recipe_url(environ, recipe) + '/tiddlers') if publicity == 'public': recipe.policy.read = [] else: recipe.policy.read = [user['name']] store.put(recipe) raise HTTP303(recipe_url(environ, recipe) + '/tiddlers')
def post_createrecipe(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] recipe_name = environ['tiddlyweb.query'].get('recipe', [''])[0] bag_name = environ['tiddlyweb.query'].get('bag', [''])[0] publicity = environ['tiddlyweb.query'].get('publicity', [''])[0] description = environ['tiddlyweb.query'].get('description', [''])[0] if not bag_name or not recipe_name: raise HTTP400('missing data') recipe = Recipe(recipe_name) bag = Bag(bag_name) try: recipe = store.get(recipe) raise HTTP400('recipe exists') except NoRecipeError: pass try: bag.skinny = True bag = store.get(bag) try: bag.policy.allows(user, 'read') except (UserRequiredError, ForbiddenError): raise HTTP400('bag not readable') except NoBagError: bag.policy.owner = user['name'] for constraint in ['read', 'write', 'create', 'delete', 'manage']: setattr(bag.policy, constraint, [user['name']]) store.put(bag) if publicity == 'private': recipe.policy.read = [user['name']] else: recipe.policy.read = [] recipe.policy.manage = [user['name']] recipe.policy.owner = user['name'] recipe.desc = description recipe.set_recipe([ ('system', ''), (bag.name, ''), ]) store.put(recipe) raise HTTP303('%s/home' % server_base_url(environ))
def bag_favor(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) new_favorite = environ['tiddlyweb.query'].get('bag', [''])[0] favorites = get_favorites(store, user['name']) # XXX I suppose a set would be okay here. if new_favorite and new_favorite not in favorites: favorites.append(new_favorite) tiddler = Tiddler('favorites', user['name']) try: tiddler = store.get(tiddler) except NoTiddlerError: pass # is okay if tiddler doesn't exist yet tiddler.text = '\n'.join(favorites) tiddler.modifier = user['name'] store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def recipe_favor(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] ensure_user_bag(store, user['name']) new_bookmark = environ['tiddlyweb.query'].get('recipe', [''])[0] bookmarks = get_bookmarks(store, user['name']) # XXX I suppose a set would be okay here. if new_bookmark and new_bookmark not in bookmarks: bookmarks.append(new_bookmark) tiddler = Tiddler('bookmarks', user['name']) try: tiddler = store.get(tiddler) except NoTiddlerError: pass # is okay if tiddler doesn't exist yet tiddler.text = '\n'.join(bookmarks) tiddler.modifier = user['name'] store.put(tiddler) raise HTTP303('%s/home' % server_base_url(environ))
def post_createrecipe(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] recipe_name = environ['tiddlyweb.query'].get('recipe', [''])[0] bag_name = environ['tiddlyweb.query'].get('bag', [''])[0] publicity = environ['tiddlyweb.query'].get('publicity', [''])[0] description = environ['tiddlyweb.query'].get('description', [''])[0] if not bag_name or not recipe_name: raise HTTP400('missing data') recipe = Recipe(recipe_name) bag = Bag(bag_name) try: recipe = store.get(recipe) raise HTTP400('recipe exists') except NoRecipeError: pass try: bag = store.get(bag) try: bag.policy.allows(user, 'read') except (UserRequiredError, ForbiddenError): raise HTTP400('bag not readable') except NoBagError: bag.policy.owner = user['name'] for constraint in ['read', 'write', 'create', 'delete', 'manage']: setattr(bag.policy, constraint, [user['name']]) store.put(bag) if publicity == 'private': recipe.policy.read = [user['name']] else: recipe.policy.read = [] recipe.policy.manage = [user['name']] recipe.policy.owner = user['name'] recipe.desc = description recipe.set_recipe([ ('system', ''), (bag.name, ''), ]) store.put(recipe) raise HTTP303('%s/home' % server_base_url(environ))
def _bag_policy(environ, bag_name, publicity): user = get_user_object(environ) store = environ['tiddlyweb.store'] bag = Bag(bag_name) bag = store.get(bag) bag.policy.allows(user, 'manage') if publicity == 'custom': raise HTTP303(bag_url(environ, bag) + '/tiddlers') if publicity == 'public': bag.policy = public_policy(user['name']) elif publicity == 'protected': bag.policy = protected_policy(user['name']) else: bag.policy = private_policy(user['name']) store.put(bag) raise HTTP303(bag_url(environ, bag) + '/tiddlers')
def _bag_policy(environ, bag_name, publicity): user = get_user_object(environ) store = environ["tiddlyweb.store"] bag = Bag(bag_name) bag = store.get(bag) bag.policy.allows(user, "manage") if publicity == "custom": raise HTTP303(bag_url(environ, bag) + "/tiddlers") if publicity == "public": bag.policy = public_policy(user["name"]) elif publicity == "protected": bag.policy = protected_policy(user["name"]) else: bag.policy = private_policy(user["name"]) store.put(bag) raise HTTP303(bag_url(environ, bag) + "/tiddlers")
def post_createrecipe(environ, start_response): user = get_user_object(environ) store = environ["tiddlyweb.store"] recipe_name = environ["tiddlyweb.query"].get("recipe", [""])[0] bag_name = environ["tiddlyweb.query"].get("bag", [""])[0] publicity = environ["tiddlyweb.query"].get("publicity", [""])[0] description = environ["tiddlyweb.query"].get("description", [""])[0] if not bag_name or not recipe_name: raise HTTP400("missing data") recipe = Recipe(recipe_name) bag = Bag(bag_name) try: recipe = store.get(recipe) raise HTTP400("recipe exists") except NoRecipeError: pass try: bag = store.get(bag) try: bag.policy.allows(user, "read") except (UserRequiredError, ForbiddenError): raise HTTP400("bag not readable") except NoBagError: bag.policy.owner = user["name"] for constraint in ["read", "write", "create", "delete", "manage"]: setattr(bag.policy, constraint, [user["name"]]) store.put(bag) if publicity == "private": recipe.policy.read = [user["name"]] else: recipe.policy.read = [] recipe.policy.manage = [user["name"]] recipe.policy.owner = user["name"] recipe.desc = description recipe.set_recipe([("system", ""), (bag.name, "")]) store.put(recipe) raise HTTP303("%s/home" % server_base_url(environ))
def _bag_list(self, tiddlers): if '/feedbag' in self.environ['selector.matches'][0]: representation_link = '%s/feedbag' % (self._server_prefix()) bag = Bag('feedbag') bag.policy.manage = ["NONE"] bag.policy.delete = ["NONE"] bag.desc = 'Recent Public Stuff' else: name = self.environ['wsgiorg.routing_args'][1]['bag_name'] name = urllib.unquote(name) name = name.decode('utf-8') representation_link = '%s/bags/%s/tiddlers' % ( self._server_prefix(), encode_name(name)) bag = self.environ['tiddlyweb.store'].get(Bag(name)) representations = self._tiddler_list_header(representation_link) user_object = get_user_object(self.environ) publicity = '' try: bag.policy.allows(user_object, 'manage') policy = bag.policy publicity = determine_publicity(user_object, policy) except (UserRequiredError, ForbiddenError): policy = None try: bag.policy.allows(user_object, 'delete') delete = True except (UserRequiredError, ForbiddenError): delete = False data = { 'title': 'TiddlyHoster Bag %s' % bag.name, 'policy': policy, 'publicity': publicity, 'delete': delete, 'bag': bag, 'tiddlers': tiddlers, 'representations': representations } del self.environ['tiddlyweb.title'] return send_template(self.environ, 'baglist.html', data)
def bag_policy(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] publicity = environ['tiddlyweb.query'].get('publicity', [''])[0] bag_name = environ['tiddlyweb.query'].get('bag', [''])[0] bag = Bag(bag_name) bag.skinny = True bag = store.get(bag) bag.policy.allows(user, 'manage') if publicity == 'custom': raise HTTP303(bag_url(environ, bag) + '/tiddlers') if publicity == 'public': bag.policy = public_policy(user['name']) elif publicity == 'protected': bag.policy = protected_policy(user['name']) else: bag.policy = private_policy(user['name']) store.put(bag) raise HTTP303(bag_url(environ, bag) + '/tiddlers')
def post_createbag(environ, start_response): user = get_user_object(environ) store = environ['tiddlyweb.store'] bag_name = environ['tiddlyweb.query'].get('bag', [''])[0] publicity = environ['tiddlyweb.query'].get('publicity', [''])[0] description = environ['tiddlyweb.query'].get('description', [''])[0] if not bag_name: raise HTTP400('missing data') bag = Bag(bag_name) try: bag = store.get(bag) raise HTTP400('bag exists') except NoBagError: pass if publicity == 'public': bag = ensure_public_bag(store, user['name'], desc=description, name=bag_name) elif publicity == 'protected': bag = ensure_protected_bag(store, user['name'], desc=description, name=bag_name) else: bag = ensure_private_bag(store, user['name'], desc=description, name=bag_name) # the bag has already been stored raise HTTP303('%s/tiddlers' % bag_url(environ, bag))