def POST(self, world): cur_world = world_exists(world) self.redirect_if_not_admin(cur_world) o = cur_world.is_open world_menu = self.get_or_put_menu(cur_world, "admin") f = self.world_form() form = CombinedForm([f], **self.formargs) if not f.validates(): section = render().section_world(form) return render().admin(cur_world, section, world_menu, "%s on Palimpsest" % cur_world.title) else: edit_world = World.get_by_id(world) edit_world.title=f.d.title edit_world.blurb=f.d.blurb edit_world.publish=f.d.publish edit_world.void_text=f.d.void_text edit_world.is_open=f.d.is_open edit_world.put() if o != edit_world.is_open: # update menu world_menu = self.replace_or_put_and_get_menu(edit_world, "admin") section = render().section_world(form) return render().admin(edit_world, section, world_menu, "%s on Palimpsest" % cur_world.title)
def GET(self, world, prop): cur_world = world_exists(world) cur_prop = property_exists(prop) a = cur_world.get_access_string(self.page_user) menu = self.get_or_put_menu(cur_world, a) menu['properties'][0][2] = "active" param = web.input() if hasattr(param, 'r'): # In read-only mode section = render().section_property_read(cur_prop) return render().admin(cur_world, section, menu, "%s's %s on Palimpsest" % (cur_world.title, cur_prop.name)) self.redirect_if_not_edit(cur_world, cur_prop) if cur_prop.valid_values == "|text|" or cur_prop.valid_values == "|num|": valid_vals = cur_prop.valid_values else: valid_vals = 0 f = self.properties_form() f.fill(**{'name':cur_prop.name,'valid_values':valid_vals,'fixed_values':cur_prop.valid_values,'sorter':cur_prop.sorter,'info':cur_prop.info,'discrete':cur_prop.discrete}) edit_form = CombinedForm([f], **self.formargs) del_form = CombinedForm([self.delete_form()], **self.formargs) section = render().section_property(edit_form, del_form, True) return render().admin(cur_world, section, menu, "%s's %s on Palimpsest" % (cur_world.title, cur_prop.name), pre=["/js/showhide_form_fields.js"])
def POST(self, world): cur_world = world_exists(world) self.redirect_if_not_create(cur_world) f = self.properties_form() form = CombinedForm([f], **self.formargs) if not f.validates(): access = cur_world.get_access_string(self.page_user) world_menu = self.get_or_put_menu(cur_world, access) section = render().section_properties(form) return render().admin( cur_world, section, world_menu, title="Add a new property to %s on Palimpsest" % cur_world.title, pre=["/js/showhide_form_fields.js"]) else: access = cur_world.get_access_string(self.page_user) try: if int(f.d.valid_values) == 0: valid_values = f.d.fixed_values else: valid_values = f.d.valid_values except ValueError: valid_values = f.d.valid_values if f.d.discrete == "True": discrete = True else: discrete = False if cur_world.is_mod(self.page_user): visible = True """ Flush menus and available properties for everyone so they get reset""" # TODO: Fix this memcache.delete("%s-admin" % cur_world.key.id()) memcache.delete("%s-closed" % cur_world.key.id()) else: visible = False new_property = Property(name=f.d.name, sorter=f.d.sorter, info=f.d.info, discrete=discrete, valid_values=valid_values, world=cur_world.key, added_by=self.page_user.key, visible=visible, rejected=False) new_property.put() self.set_menu(cur_world, access) memcache.delete("_properties-%s-global" % cur_world.key.id()) return web.seeother('/%s/property/%s' % (cur_world.key.id(), new_property.key.id()))
def GET(self, world, text): cur_world = world_exists(world) cur_text = text_exists(text) access = cur_world.get_access_string(self.page_user) world_menu = self.get_or_put_menu(cur_world, access) world_menu['texts'][0][2] = "active" param = web.input() if hasattr(param, 'r'): # In read-only mode world_properties = cur_world.get_properties_allowed(self.page_user).get_result() try: js = self.js_add_properties(world_properties, cur_world) properties_available = True except IndexError: properties_available = False property_values = cur_text.get_allowed_property_values(self.page_user).get_result() js += self.js_one_room_on_map(cur_text) section = render().section_texts_read(cur_text, cur_world.is_open, properties_available, property_values) return render().admin(cur_world, section, world_menu, "%s on Palimpsest" % cur_text.name, pre = ['http://maps.google.com/maps/api/js?sensor=false'], js=js, post=['/js/viewroomcoords.js', '/js/add_text_properties.js']) self.redirect_if_not_edit(cur_world, cur_text) form = self.text_form() form.fill(**{'name':cur_text.name, 'short_desc':cur_text.short_desc, 'long_desc':cur_text.long_desc}) return self.reset_text_page(cur_world, form, access, world_menu, cur_text)
def GET(self): f = self.world_form() form = CombinedForm([f], **self.formargs) f.fill(**{'void_text':get_default_void()}) section = render().section_world(form) return render().admin(self.def_world, section, self.empty_menu, "Palimpsest: Create an experience")
def POST(self, world, prop): cur_world = world_exists(world) cur_prop = property_exists(prop) self.redirect_if_not_edit(cur_world, cur_prop) a = cur_world.get_access_string(self.page_user) post = web.input() if hasattr(post, 'delete'): PropertyValue.delete_all_for_property(cur_prop) cur_prop.key.delete() """ Flush menus and available properties for everyone so they get reset""" # TODO: Fix cache flushing for everyone else memcache.delete("_properties-%s-global" % cur_world.key.id()) if a == "admin": memcache.delete("%s-closed" % cur_world.key.id()) elif a == "closed": memcache.delete("%s-admin" % cur_world.key.id()) self.replace_or_put_menu(cur_world, a) raise web.seeother("/%s/property" % cur_world.key.id()) f = self.properties_form() if not f.validates(): menu = self.get_or_put_menu(cur_world, a) edit_form = CombinedForm([f], **self.formargs) section = render().section_property(edit_form) return render().admin(cur_world, section, menu, "%s's %s on Palimpsest" % (cur_world.title, cur_prop.name), pre=["/js/showhide_form_fields.js"]) else: try: if int(f.d.valid_values) == 0: valid_values = f.d.fixed_values else: valid_values = f.d.valid_values except ValueError: valid_values = f.d.valid_values if f.d.discrete == "True": discrete = True else: discrete = False to_edit = cur_prop to_edit.name=f.d.name to_edit.sorter=f.d.sorter to_edit.info=f.d.info to_edit.discrete=discrete to_edit.valid_values=valid_values to_edit.last_modified_by=self.page_user.key to_edit.put() return web.seeother("/%s/property/%s" % (cur_world.key.id(), cur_prop.key.id()))
def POST(self): f = self.u_form() form = CombinedForm([f], **self.formargs) if not f.validates(): return render().user(form, self.delform) else: user_ftr = self.page_user.set_info(**{'penname':f.d.penname, 'realname':f.d.realname, 'contact':f.d.contact}) page = render().user(form, self.delform, "Saved.") user_ftr.get_result() return page
def GET(self): f = self.world_form() form = CombinedForm([f], **self.formargs) f.fill(**{'void_text': get_default_void()}) section = render().section_world(form) return render().admin(self.def_world, section, self.empty_menu, "Palimpsest: Create an experience")
def POST(self, world): cur_world = world_exists(world) self.redirect_if_not_create(cur_world) f = self.properties_form() form = CombinedForm([f], **self.formargs) if not f.validates(): access = cur_world.get_access_string(self.page_user) world_menu = self.get_or_put_menu(cur_world, access) section = render().section_properties(form) return render().admin(cur_world, section, world_menu, title="Add a new property to %s on Palimpsest" % cur_world.title, pre=["/js/showhide_form_fields.js"]) else: access = cur_world.get_access_string(self.page_user) try: if int(f.d.valid_values) == 0: valid_values = f.d.fixed_values else: valid_values = f.d.valid_values except ValueError: valid_values = f.d.valid_values if f.d.discrete == "True": discrete = True else: discrete = False if cur_world.is_mod(self.page_user): visible = True """ Flush menus and available properties for everyone so they get reset""" # TODO: Fix this memcache.delete("%s-admin" % cur_world.key.id()) memcache.delete("%s-closed" % cur_world.key.id()) else: visible = False new_property = Property(name=f.d.name, sorter=f.d.sorter, info=f.d.info, discrete=discrete, valid_values=valid_values, world=cur_world.key, added_by=self.page_user.key, visible=visible, rejected=False ) new_property.put() self.set_menu(cur_world, access) memcache.delete("_properties-%s-global" % cur_world.key.id()) return web.seeother('/%s/property/%s' % (cur_world.key.id(), new_property.key.id()))
def GET(self, world): cur_world = world_exists(world) self.redirect_if_not_admin(cur_world) world_menu = self.get_or_put_menu(cur_world, "admin") f = self.world_form() form = CombinedForm([f], **self.formargs) f.fill(**{'title':cur_world.title,'blurb':cur_world.blurb,'publish':cur_world.publish,'is_open':cur_world.is_open,'void_text':cur_world.void_text}) section = render().section_world(form) return render().admin(cur_world, section, world_menu, "%s on Palimpsest" % cur_world.title)
def GET(self, world): cur_world = world_exists(world) self.redirect_if_not_create(cur_world) access = cur_world.get_access_string(self.page_user) world_menu = self.get_or_put_menu(cur_world, access) world_menu['properties'][0][2] = "active" logging.warning(access) f = self.properties_form() form = CombinedForm([f], **self.formargs) section = render().section_property(form) return render().admin(cur_world, section, world_menu, title="Add a new property to %s on Palimpsest" % cur_world.title, pre=["/js/showhide_form_fields.js"])
def reset_text_page(self, world, form, access, world_menu, text=None): js = self.js_all_rooms_on_map(world) world_properties = world.get_properties_allowed(self.page_user) if text is not None: del_form = CombinedForm([self.delete_form()], **{'method': 'post'}) edit = True title = "Edit %s in %s on Palimpsest" % (text.name, world.title) js += self.js_editable_room_on_map(text) post = ['/js/editroomcoords.js'] propvals = {} allowed_ftr = text.get_allowed_property_values(self.page_user) if world.is_mod(self.page_user): pending_ftr = text.get_pending_property_values() propvals['visible'] = allowed_ftr.get_result() if world.is_mod(self.page_user): propvals['pending'] = pending_ftr.get_result() else: propvals['pending'] = [] else: del_form = None edit = False propvals = [] title = "Add a new text to %s on Palimpsest" % world.title post = ['/js/addroomcoords.js'] try: js += self.js_add_properties(world_properties, world) properties_available = True except IndexError: properties_available = False pre = [ 'http://maps.google.com/maps/api/js?sensor=false', '/js/add_text_properties.js' ] section = render().section_texts(form, properties_available, del_form, edit, propvals) return render().admin(world, section, world_menu, title=title, pre=pre, js=js, post=post)
def POST(self): f = self.u_form() form = CombinedForm([f], **self.formargs) if not f.validates(): return render().user(form, self.delform) else: user_ftr = self.page_user.set_info( **{ 'penname': f.d.penname, 'realname': f.d.realname, 'contact': f.d.contact }) page = render().user(form, self.delform, "Saved.") user_ftr.get_result() return page
def GET(self, world): cur_world = world_exists(world) self.redirect_if_not_admin(cur_world) mods_ftr = cur_world.get_moderators() access = cur_world.get_access_string(self.page_user) world_menu = self.get_or_put_menu(cur_world, access) world_menu['contributors'][0][2] = "active" f = self.moderator_form() form = CombinedForm([f], **self.formargs) cur_mods = mods_ftr.get_result() section = render().section_moderators(form, cur_mods) return render().admin(cur_world, section, world_menu, title="Moderators of %s on Palimpsest" % cur_world.title, post=self.epost)
def GET(self): user = self.page_user f = self.u_form() form = CombinedForm([f], **self.formargs) f.fill(**{'penname':user.penname, 'realname':user.name, 'contact':user.contact}) return render().user(form, self.delform)
def GET(self, worldkey, save): world = world_exists(worldkey) save = save_exists(save) self.redirect_if_not_exists(world, "/yours/saves") self.redirect_if_not_exists(save, "/yours/saves") #self.can_access_world(world) self.can_edit_save(save) if not world.publish: raise web.notfound() sofaUrl = "/%s/save/%s?s=1" % (world.key.id(), save.key.id()) param = web.input() if hasattr(param, 's'): # In sofa mode post = ['/js/maps.google.polygon.containsLatLng.js', '/js/page_scroll.js', '/js/text_queue.js', '/js/room_expand.js','/js/sofa_location.js', '/js/toggle_info.js'] else: post = ['/js/maps.google.polygon.containsLatLng.js', '/js/page_scroll.js', '/js/text_queue.js', '/js/room_expand.js','/js/get_location.js', '/js/toggle_info.js'] js = self.js_coords_list(world, "/%s/save/%s" % (world.key.id(), save.key.id()), sofaUrl) return render().go(title="%s on Palimpsest" % world.title ,navleft=[('Back to %s' % world.title,'/%s' % world.key.id())] ,pre=['http://maps.google.com/maps/api/js?sensor=false', '/js/set_page_height.js'] ,js=js ,post=post )
def GET(self): everything = self.page_user.get_works().get_result() bys = everything[0] mods = everything[1] opens = everything[2] yours_menu = copy.deepcopy(self.menu) for by in bys: yours_menu['yours'].append((by.title, "/%s/edit" % by.key.id(), "")) for mod in mods: w = mod.world.get() yours_menu['unmod'].append((w.title, "/%s/texts" % w.key.id(), "")) if len(mods) < 1: yours_menu['unmod'][0][2] = "disabled" for o in opens: yours_menu['contr'].append((o.title, "/%s/texts" % o.key.id(), "")) if len(opens) < 1: yours_menu['contr'][0][2] = "disabled" return render().yours(yours_menu, "Palimpsest: Your experiences")
def GET(self): everything = self.page_user.get_works().get_result() bys = everything[0] mods = everything[1] opens = everything[2] yours_menu = copy.deepcopy(self.menu) for by in bys: yours_menu['yours'].append( (by.title, "/%s/edit" % by.key.id(), "")) for mod in mods: w = mod.world.get() yours_menu['unmod'].append((w.title, "/%s/texts" % w.key.id(), "")) if len(mods) < 1: yours_menu['unmod'][0][2] = "disabled" for o in opens: yours_menu['contr'].append((o.title, "/%s/texts" % o.key.id(), "")) if len(opens) < 1: yours_menu['contr'][0][2] = "disabled" return render().yours(yours_menu, "Palimpsest: Your experiences")
def reset_text_page(self, world, form, access, world_menu, text=None): js = self.js_all_rooms_on_map(world) world_properties = world.get_properties_allowed(self.page_user) if text is not None: del_form = CombinedForm([self.delete_form()], **{'method':'post'}) edit = True title = "Edit %s in %s on Palimpsest" % (text.name, world.title) js+= self.js_editable_room_on_map(text) post = ['/js/editroomcoords.js'] propvals = {} allowed_ftr = text.get_allowed_property_values(self.page_user) if world.is_mod(self.page_user): pending_ftr = text.get_pending_property_values() propvals['visible'] = allowed_ftr.get_result() if world.is_mod(self.page_user): propvals['pending'] = pending_ftr.get_result() else: propvals['pending'] = [] else: del_form = None edit = False propvals = [] title = "Add a new text to %s on Palimpsest" % world.title post = ['/js/addroomcoords.js'] try: js += self.js_add_properties(world_properties, world) properties_available = True except IndexError: properties_available = False pre = ['http://maps.google.com/maps/api/js?sensor=false', '/js/add_text_properties.js'] section = render().section_texts(form, properties_available, del_form, edit, propvals) return render().admin(world, section, world_menu, title=title, pre=pre, js=js, post=post )
def POST(self): f = self.world_form() form = CombinedForm([f], **self.formargs) if not f.validates(): section = render().section_world(form) return render().admin(self.def_world, section, self.empty_menu, "Palimpsest: Create an experience") else: slug = make_world_slug(f.d.title) new_world = World(id=slug, title=f.d.title, blurb=f.d.blurb, creator=self.page_user.key, publish=f.d.publish, void_text=f.d.void_text, is_open=f.d.is_open ) new_world.put() #f.fill(**{'title':new_world.title,'blurb':new_world.blurb,'publish':new_world.publish,'is_open':new_world.is_open,'void_text':new_world.void_text}) return web.seeother('/%s/edit' % new_world.key.id())
def POST(self): f = self.world_form() form = CombinedForm([f], **self.formargs) if not f.validates(): section = render().section_world(form) return render().admin(self.def_world, section, self.empty_menu, "Palimpsest: Create an experience") else: slug = make_world_slug(f.d.title) new_world = World(id=slug, title=f.d.title, blurb=f.d.blurb, creator=self.page_user.key, publish=f.d.publish, void_text=f.d.void_text, is_open=f.d.is_open) new_world.put() #f.fill(**{'title':new_world.title,'blurb':new_world.blurb,'publish':new_world.publish,'is_open':new_world.is_open,'void_text':new_world.void_text}) return web.seeother('/%s/edit' % new_world.key.id())
def GET(self): user = self.page_user f = self.u_form() form = CombinedForm([f], **self.formargs) f.fill( **{ 'penname': user.penname, 'realname': user.name, 'contact': user.contact }) return render().user(form, self.delform)
def GET(self, worldkey): world = world_exists(worldkey) #self.can_access_world(world) self.redirect_if_not_exists(world, "/yours/new") try: if not world.publish: raise web.notfound() except AttributeError: web.seeother("/yours/new") js = self.js_all_rooms_on_map(world) return render().cover(world, pre=['http://maps.google.com/maps/api/js?sensor=false'], js=js, post=['/js/all_rooms_on_map.js'])
def GET(self, worldkey): world = world_exists(worldkey) #self.can_access_world(world) self.redirect_if_not_exists(world, "/yours/new") try: if not world.publish: raise web.notfound() except AttributeError: web.seeother("/yours/new") js = self.js_all_rooms_on_map(world) return render().cover( world, pre=['http://maps.google.com/maps/api/js?sensor=false'], js=js, post=['/js/all_rooms_on_map.js'])
def GET(self, save): save = SavePath.get_by_id(int(save)) self.can_access_save(save) texts = [] ftrs = [] prev = None for text in save.texts: ftrs.append(text.get_async()) for ftr in ftrs: t = ftr.get_result() if prev is None or t.key != prev.key: texts.append(t) prev = t if self.page_user: access = save.user == self.page_user.key else: access = False return render().save(save, texts, access)
def GET(self, worldkey, save): world = world_exists(worldkey) save = save_exists(save) self.redirect_if_not_exists(world, "/yours/saves") self.redirect_if_not_exists(save, "/yours/saves") #self.can_access_world(world) self.can_edit_save(save) if not world.publish: raise web.notfound() sofaUrl = "/%s/save/%s?s=1" % (world.key.id(), save.key.id()) param = web.input() if hasattr(param, 's'): # In sofa mode post = [ '/js/maps.google.polygon.containsLatLng.js', '/js/page_scroll.js', '/js/text_queue.js', '/js/room_expand.js', '/js/sofa_location.js', '/js/toggle_info.js' ] else: post = [ '/js/maps.google.polygon.containsLatLng.js', '/js/page_scroll.js', '/js/text_queue.js', '/js/room_expand.js', '/js/get_location.js', '/js/toggle_info.js' ] js = self.js_coords_list( world, "/%s/save/%s" % (world.key.id(), save.key.id()), sofaUrl) return render().go( title="%s on Palimpsest" % world.title, navleft=[('Back to %s' % world.title, '/%s' % world.key.id())], pre=[ 'http://maps.google.com/maps/api/js?sensor=false', '/js/set_page_height.js' ], js=js, post=post)
def POST(self, world): cur_world = world_exists(world) self.redirect_if_not_admin(cur_world) param = web.input() if hasattr(param, 'mod'): # Access rights form submitted edit_mod = ndb.Key("Moderator", int(param.userid)).get() if int(param.action) == 1: edit_mod.admin = True if int(param.action) == 2: edit_mod.admin = False if int(param.action) == 0: try: edit_mod.user_pending.delete() except AttributeError: # (no pending user) pass edit_mod.key.delete() else: edit_mod.put() raise web.seeother("/%s/mods" % world) f = self.moderator_form() form = CombinedForm([f], **self.formargs) if not f.validates(): mods_ftr = cur_world.get_moderators() access = cur_world.get_access_string(self.page_user) world_menu = self.get_or_put_menu(cur_world, access) world_menu['contributors'][0][2] = "active" f = self.moderator_form() form = CombinedForm([f], **self.formargs) cur_mods = mods_ftr.get_result() section = render().section_moderators(form, cur_mods) return render().admin(cur_world, section, world_menu, title="Moderators of %s on Palimpsest" % cur_world.title, post=self.epost) else: try_user = users.User(f.d.add_contrib) user_result = get_google_user_key(try_user).get_result() if len(user_result) > 0 and user_result[0] is not None: user = user_exists_bykey(user_result[0]) m = Moderator(world=cur_world.key, user=user.key, admin=False) msg = """You've been added as a contributor to %s. This means you can add texts and properties which are published straight away. You can also approve or reject publicly submitted texts and properties. Try it out: %s/%s/texts""" % (cur_world.title, web.ctx.host, cur_world.key.id()) else: email = str(f.d.add_contrib).lower() # TODO: Check UserPending doesn't already exist with that email u_p = UserPending(email=email) u_p.put() m = Moderator(world=cur_world.key, user_pending=u_p.key, admin=False) msg = """You've been added as a contributor to %s. This means you can add texts which bypass the moderation stage, and are published straight away. Try it out: %s/%s/auth/%s""" % (cur_world.title, web.ctx.host, cur_world.key.id(), str(u_p.key.id())) m.put() to_addr = f.d.add_contrib if not mail.is_email_valid(to_addr): return "Could not send: invalid email. Press back and try again." message = mail.EmailMessage() message.sender = get_current_user().user.email() message.to = to_addr message.subject = "Palimpsest: You have been added as a moderator of %s!" % cur_world.title message.body = msg message.send() return web.seeother('/%s/mods' % cur_world.key.id())
def GET(self): user_saves = get_saves_by(self.page_user) return render().saves(user_saves)