def __init__(self, password_reset_id, users): Span.__init__( self, H3(u"complete your password reset"), P(""" Below is a list of Luminotes users matching your email address. You can reset the passwords of any of these users. If you just needed a username reminder and you already know your password, then click the login link above without performing a password reset. """), Form( [ Span( P( Div(Strong(u"%s: new password" % user.username)), Input(type=u"password", name=user.object_id, size=30, maxlength=30, class_=u"text_field"), ), P( Div( Strong(u"%s: new password (again)" % user.username)), Input(type=u"password", name=user.object_id, size=30, maxlength=30, class_=u"text_field"), ), ) for user in users ], P( Input(type=u"hidden", id=u"password_reset_id", name=u"password_reset_id", value=password_reset_id), Input(type=u"submit", name=u"reset_button", id=u"reset_button", class_=u"button", value=(len(users) > 1) and u"reset passwords" or u"reset password"), ), id="reset_form", target="/users/reset_password", ), P( Strong(u"tip:"), u""" When you submit this form, you'll be redirected to the front page where you can login with your new password. """, ), )
def note_controls(note, read_write): read_write_access = ( read_write == Notebook.READ_WRITE ) or \ ( read_write == Notebook.READ_WRITE_FOR_OWN_NOTES and note.user_id == user.object_id ) return Div( read_write_access and Input( type = "button", class_ = "note_button", id = "delete_note_%s" % note.object_id, value = "delete" + ( note.deleted_from_id and " forever" or "" ), title = "delete note [ctrl-d]" ) or None, read_write_access and note.deleted_from_id and Input( type = "button", class_ = "note_button", id = "undelete_note_%s" % note.object_id, value = "undelete", title = "undelete note" ) or None, ( read_write == Notebook.READ_WRITE ) and not note.deleted_from_id and Input( type = "button", class_ = "note_button", id = "changes_note_%s" % note.object_id, value = "changes", title = "previous revisions", ) or None, ( read_write == Notebook.READ_WRITE ) and not note.deleted_from_id and Input( type = "button", class_ = "note_button", id = "tools_note_%s" % note.object_id, value = "tools", title = "note tools", ) or None, ( read_write != Notebook.READ_ONLY or not note.startup ) and not note.deleted_from_id and \ ( read_write != Notebook.READ_WRITE_FOR_OWN_NOTES ) and Input( type = "button", class_ = "note_button", id = "hide_note_%s" % note.object_id, value = "hide", title = "hide note [ctrl-h]", ) or None, id = u"note_controls_%s" % note.object_id, class_ = u"note_controls", )
def __init__( self ): title = None Form.__init__( self, Input( type = u"text", name = u"search_text", id = u"search_text", maxlength = 512, value = "search", autocomplete = u"off", ), id = u"search_form", )
def __init__(self, notebook, root_notes, recent_notes, total_notes_count, user): tags = [tag for tag in notebook.tags if tag.name == u"forum"] if tags: forum_name = tags[0].value forum_tag = True else: forum_name = None forum_tag = False Div.__init__( self, Div( Div( Search_form(), class_=u"link_area_item", ), H4( forum_tag and u"posts" or u"notes", Span( Span(total_notes_count, id=u"total_notes_count"), u"total", class_=u"small_text link_area_item", ), notebook.read_write != Notebook.READ_ONLY and Input( type=u"button", class_=u"note_button small_text", id=u"save_button", value=u"saved", disabled=u"true", title=u"save your work", ) or None, id=u"note_tree_area_title", ) or None, (not forum_tag) and self.make_tree( [ self.make_item( title=note.title, link_attributes=u'href="/notebooks/%s?note_id=%s"' % (notebook.object_id, note.object_id), link_class=u"note_tree_link", has_children=(notebook.name != u"trash") and self.LINK_PATTERN.search(note.contents) or False, root_note_id=note.object_id, ) for note in root_notes ], Tr( Td(), (notebook.name != u"trash" and notebook.read_write == Notebook.READ_WRITE) and Td( Input( type=u"button", class_=u"note_button", id=u"new_note_tree_link_button", value=u"+ note link", title=u"Add one of your notes to this list.", ), Span(id=u"new_note_tree_link_area"), ) or None, id=u"new_note_tree_link_row", ) or None, tree_id="note_tree_root_table", ) or None, (not forum_tag and recent_notes is not None and notebook.name != u"trash") and Span( H4( u"recent updates", id=u"recent_notes_area_title", ), self.make_tree( Tr(id="recent_notes_top"), [ self.make_item( title=note.title, link_attributes= u'href="/notebooks/%s?note_id=%s"' % (notebook.object_id, note.object_id), link_class=u"recent_note_link", has_children=False, root_note_id=note.object_id, base_name=u"recent_note", ) for note in recent_notes ], navigation=Tbody( Tr(id="recent_notes_spacer"), Tr( Td(), Td( A(u"more", href=u"#", id=u"recent_notes_more_link", class_=u"undisplayed"), A(u"less", href=u"#", id=u"recent_notes_less_link", class_=u"undisplayed"), ), ), id=u"recent_notes_navigation"), tree_id="recent_notes_table", ), ) or None, (user.username is None) and P( A(u"Download", href=u"/download", class_=u"hook_action"), Span(u" or ", class_=u"hook_action_or"), A(u"Sign up", href=u"/pricing", class_=u"hook_action"), Br(), Span("Get started in seconds.", class_=u"hook_action_detail"), class_=u"hook_action_area", separator=u"", ) or None, id=u"note_tree_area_holder", ), Span(id="tree_arrow_hover_preload"), Span(id="tree_arrow_down_preload"), Span(id="tree_arrow_down_hover_preload"), id=u"note_tree_area", )
def __init__( self, notebook, hide_toolbar = False, note_word = None ): Div.__init__( self, Div( P( Div( Input( type = u"button", id = u"newNote", title = u"make a new %s [ctrl-M]" % ( note_word or u"note" ), class_ = "image_button newNote_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"createLink", title = u"link [ctrl-L]", class_ = "image_button createLink_large", ), class_ = u"button_background" ), # Notebook.READ_WRITE_FOR_OWN_NOTES should not have a file upload button ( notebook.read_write == Notebook.READ_WRITE ) and Div( Input( type = u"button", id = u"attachFile", title = u"attach file or image", class_ = "image_button attachFile_large", ), class_ = u"button_background" ) or None, ), P( Div( Input( type = u"button", id = u"bold", title = u"bold [ctrl-B]", class_ = "image_button bold_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"italic", title = u"italic [ctrl-I]", class_ = "image_button italic_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"underline", title = u"underline [ctrl-U]", class_ = "image_button underline_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"strikethrough", title = u"strikethrough [ctrl-S]", class_ = "image_button strikethrough_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"color", title = u"text color", class_ = "image_button color_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"font", title = u"font", class_ = "image_button font_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"title", title = u"title", class_ = "image_button title_large", ), class_ = u"button_background" ), ), P( Div( Input( type = u"button", id = u"insertUnorderedList", title = u"bullet list [ctrl-period]", class_ = "image_button insertUnorderedList_large", ), class_ = u"button_background" ), Div( Input( type = u"button", id = u"insertOrderedList", title = u"numbered list [ctrl-1]", class_ = "image_button insertOrderedList_large", ), class_ = u"button_background" ), ), class_ = u"button_wrapper", ), id = u"toolbar", class_ = hide_toolbar and u"undisplayed" or None, )
def __init__( self, user, rate_plan, notebooks, notebook, parent_id=None, login_url=None, logout_url=None, startup_notes=None, total_notes_count=None, notes=None, note_read_write=True, start=None, count=None, http_url=None, conversion=None, rename=False, deleted_id=None, invites=None, invite_id=None, after_login=None, signup_plan=None, signup_yearly=None, recent_notes=None, groups=None, ): startup_note_ids = [ startup_note.object_id for startup_note in startup_notes ] def note_controls(note, read_write): read_write_access = ( read_write == Notebook.READ_WRITE ) or \ ( read_write == Notebook.READ_WRITE_FOR_OWN_NOTES and note.user_id == user.object_id ) return Div( read_write_access and Input( type = "button", class_ = "note_button", id = "delete_note_%s" % note.object_id, value = "delete" + ( note.deleted_from_id and " forever" or "" ), title = "delete note [ctrl-d]" ) or None, read_write_access and note.deleted_from_id and Input( type = "button", class_ = "note_button", id = "undelete_note_%s" % note.object_id, value = "undelete", title = "undelete note" ) or None, ( read_write == Notebook.READ_WRITE ) and not note.deleted_from_id and Input( type = "button", class_ = "note_button", id = "changes_note_%s" % note.object_id, value = "changes", title = "previous revisions", ) or None, ( read_write == Notebook.READ_WRITE ) and not note.deleted_from_id and Input( type = "button", class_ = "note_button", id = "tools_note_%s" % note.object_id, value = "tools", title = "note tools", ) or None, ( read_write != Notebook.READ_ONLY or not note.startup ) and not note.deleted_from_id and \ ( read_write != Notebook.READ_WRITE_FOR_OWN_NOTES ) and Input( type = "button", class_ = "note_button", id = "hide_note_%s" % note.object_id, value = "hide", title = "hide note [ctrl-h]", ) or None, id = u"note_controls_%s" % note.object_id, class_ = u"note_controls", ) def static_note_divs(notes, read_write): return [ Table( Tr(Td(note_controls(note, read_write), )), Tr( Td( Div( Span( note.contents, class_=u"static_note_contents", separator="", ), id="static_note_%s" % note.object_id, class_=u"static_note_div", ), width="100%", ), Td( u".....", id=u"note_grabber_%s" % note.object_id, class_=u"note_grabber" + (read_write != Notebook.READ_WRITE and " invisible" or ""), ), ), Tr( Td( Div(class_="note_shadow_corner"), id=u"note_shadow_%s" % note.object_id, class_=u"note_shadow undisplayed", ), ), id=u"note_holder_%s" % note.object_id, class_=u"note_holder", ) for note in notes ] static_notes = notes and static_note_divs( notes, note_read_write and notebook.read_write or Notebook.READ_ONLY ) or \ static_note_divs( startup_notes, notebook.read_write ) # Since the contents of these notes are included in the static_notes section below, don't # include them again in the hidden fields here. Accomplish this by making custom dicts for # sending to the client. startup_note_dicts = [{ u"object_id": startup_note.object_id, u"revision": startup_note.revision, u"deleted_from_id": startup_note.deleted_from_id, u"user_id": startup_note.user_id, u"username": startup_note.username, } for startup_note in startup_notes] note_dicts = [{ u"object_id": note.object_id, u"revision": note.revision, u"deleted_from_id": note.deleted_from_id, u"user_id": note.user_id, u"username": note.username, u"creation": note.creation, } for note in notes] root_notes = startup_notes + (notes and [ note for note in notes if note.object_id not in startup_note_ids ] or []) def json(string): return escape(unicode(Json(string)), quote=True) if len(notes) == 1: title = notes[0].title else: title = notebook.name if rate_plan.get(u"notebook_sharing"): updates_path = u"/notebooks/updates/%s?rss&%s" % ( notebook.object_id, urlencode([(u"notebook_name", notebook.name.encode("utf8"))]), ) else: updates_path = None forum_tags = [tag for tag in notebook.tags if tag.name == u"forum"] forum_tag = None if notebook.name == u"Luminotes": notebook_path = u"/" updates_path = None # no RSS feed for the main notebook elif notebook.name == u"Luminotes user guide": notebook_path = u"/guide" elif forum_tags: forum_tag = forum_tags[0] if forum_tag.value == u"blog": notebook_path = u"/blog/%s" % notebook.friendly_id else: notebook_path = u"/forums/%s/%s" % (forum_tag.value, notebook.object_id) else: notebook_path = u"/notebooks/%s" % notebook.object_id conversion_js = None if conversion: try: conversion_js = file(u"static/js/%s_conversion.js" % conversion).read() except IOError: pass if notebook.read_write == Notebook.READ_WRITE: header_note_title = u"wiki" else: all_notes = startup_notes + notes header_note_title = ( notebook.name == "Luminotes" ) and all_notes and all_notes[0].title or notebook.name header_note_title = { "contact info": "contact", "meet the team": "team", "Luminotes user guide": "guide", "Luminotes privacy policy": "privacy", }.get(header_note_title, header_note_title) own_notebooks = [ nb for nb in notebooks if nb.read_write == Notebook.READ_WRITE ] header_notebook = own_notebooks and own_notebooks[0] or notebook Page.__init__( self, title, Link( rel = u"stylesheet", type = u"text/css", href = u"/static/css/header.css?%s" % VERSION ), updates_path and \ Link( rel = u"alternate", type = u"application/rss+xml", title = notebook.name, href = updates_path ) or None, Script( type = u"text/javascript", src = u"/static/js/MochiKit.js?%s" % VERSION ) or None, Script( type = u"text/javascript", src = u"/static/js/Invoker.js?%s" % VERSION ) or None, Script( type = u"text/javascript", src = u"/static/js/Editor.js?%s" % VERSION ) or None, Script( type = u"text/javascript", src = u"/static/js/Wiki.js?%s" % VERSION ) or None, Input( type = u"hidden", name = u"user", id = u"user", value = json( user ) ), Input( type = u"hidden", name = u"rate_plan", id = u"rate_plan", value = json( rate_plan ) ), Input( type = u"hidden", name = u"yearly", id = u"yearly", value = json( signup_yearly ) ), Input( type = u"hidden", name = u"notebooks", id = u"notebooks", value = json( notebooks ) ), Input( type = u"hidden", name = u"notebook", id = u"notebook", value = json( notebook ) ), Input( type = u"hidden", name = u"parent_id", id = u"parent_id", value = parent_id or "" ), Input( type = u"hidden", name = u"startup_notes", id = u"startup_notes", value = json( startup_note_dicts ) ), Input( type = u"hidden", name = u"current_notes", id = u"current_notes", value = json( note_dicts ) ), Input( type = u"hidden", name = u"note_read_write", id = u"note_read_write", value = json( note_read_write ) ), Input( type = u"hidden", name = u"rename", id = u"rename", value = json( rename ) ), Input( type = u"hidden", name = u"deleted_id", id = u"deleted_id", value = deleted_id ), Input( type = u"hidden", name = u"invites", id = u"invites", value = json( invites ) ), Input( type = u"hidden", name = u"invite_id", id = u"invite_id", value = invite_id ), Input( type = u"hidden", name = u"after_login", id = u"after_login", value = after_login ), Input( type = u"hidden", name = u"signup_plan", id = u"signup_plan", value = signup_plan ), Input( type = u"hidden", name = u"groups", id = u"groups", value = json( groups ) ), Div( id = u"status_area", ), Header( user, header_notebook, login_url, logout_url, header_note_title, rate_plan ), Div( Div( Link_area( Toolbar( notebook, hide_toolbar = parent_id or notebook.read_write == Notebook.READ_ONLY, note_word = forum_tag and u"post" or u"note", ), notebooks, notebook, parent_id, notebook_path, updates_path, user, rate_plan, ), id = u"left_area", ), Div( ( notebook.read_write != Notebook.READ_ONLY ) and Noscript( P( Strong( u""" Luminotes requires JavaScript to be enabled in your web browser in order to edit your wiki. Please <a href="/enable_javascript">enable JavaScript</a> before continuing. """ ) ), ) or None, Rounded_div( ( notebook.name == u"trash" ) and u"trash_notebook" or u"current_notebook", parent_id and Span( A( u"empty", href = u"/notebooks/%s" % notebook.object_id, id = u"empty_trash_link" ), u" | ", A( u"go back", href = u"/notebooks/%s" % parent_id ), id = u"notebook_header_links", ) or None, ( notebook.name == u"Luminotes" and title == u"source code" ) and \ Strong( "%s %s" % ( notebook.name, VERSION ) ) or \ Span( ( notebook.name == u"trash" or notebook.read_write != Notebook.READ_WRITE ) \ and Strong( notebook.name ) \ or Span( Strong( notebook.name ), id = u"notebook_header_name", title = "Rename this notebook." ), ), id = u"notebook_header_area", corners = ( u"tl", u"tr", u"br" ), ), Div( Rounded_div( ( notebook.name == u"trash" ) and u"trash_notebook_inner" or u"current_notebook_inner", Div( id = u"deleted_notebooks", ), Page_navigation( notebook_path, len( notes ), total_notes_count, start, count, ), Div( Span( id = u"notes_top" ), static_notes, id = u"notes", ), ( notebook.read_write == Notebook.READ_WRITE ) and Div( id = u"blank_note_stub", class_ = u"blank_note_stub_hidden_border", ) or None, ( forum_tag and user.username and user.username != u"anonymous" ) and \ Span( ( forum_tag.value == "blog" ) and P( u"To write a comment, click that large \"+\" button to the left. To publish your comment, click the save button.", class_ = u"small_text" ) or P( u"To write a comment, click that large \"+\" button to the left. To publish your comment, click the save button. Or, ", A( u"start a new discussion", href = u"/forums/%s/create_thread" % forum_tag.value ), u".", separator = "", class_ = u"small_text" ), ) or None, ( forum_tag and ( not user.username or user.username == u"anonymous" ) ) and \ P( u"To write a comment, please login first. No account?", A( u"Sign up", href = u"/pricing" ), u"to get a free account.", class_ = "small_text" ) or None, Page_navigation( notebook_path, len( notes ), total_notes_count, start, count, return_text = u"return to the discussion", ), Div( id = u"iframe_area", ), id = u"notebook_background", corners = ( u"tl", ), ), id = u"notebook_border", class_ = ( notebook.name == u"trash" ) and u"trash_notebook_color" or u"current_notebook_color", ), id = u"center_content_area", ), Div( Note_tree_area( notebook, root_notes, recent_notes, total_notes_count, user, ), id = u"right_area", ), id = u"everything_area", ), Span( id = "grabber_hover_preload" ), )
def __init__(self, toolbar, notebooks, notebook, parent_id, notebook_path, updates_path, user, rate_plan): linked_notebooks = [ nb for nb in notebooks if (nb.read_write == Notebook.READ_WRITE or (nb.read_write == Notebook.READ_ONLY and not nb.name.startswith(u"Luminotes"))) and nb.name not in (u"trash") and nb.deleted is False ] if [tag for tag in notebook.tags if tag.name == u"forum"]: forum_tag = True forum_name = tag.value notebook_word = u"discussion" note_word = u"post" else: forum_tag = False forum_name = None notebook_word = u"notebook" note_word = u"note" Div.__init__( self, toolbar, (user.username == u"anonymous") and self.forum_link(forum_tag, forum_name) or None, (user.username != u"anonymous") and Div( (notebook_path != u"/") and Div( H4( u"this %s" % notebook_word, id=u"this_notebook_area_title", ), self.forum_link(forum_tag, forum_name), (rate_plan.get(u"notebook_sharing") and notebook.name == u"Luminotes blog") and Div( A( u"follow", href=u"%s?rss" % notebook_path, id=u"blog_rss_link", title= u"Subscribe to the RSS feed for the Luminotes blog.", ), A( Img(src=u"/static/images/rss.png", width=u"14", height=u"14", class_=u"middle_image padding_left"), href=u"%s?rss" % notebook_path, title= u"Subscribe to the RSS feed for the Luminotes blog.", ), class_=u"link_area_item", ) or (updates_path and rate_plan.get(u"notebook_sharing") and (not forum_tag) and Div( A( u"follow", href=updates_path, id=u"notebook_rss_link", title=u"Subscribe to the RSS feed for this %s." % notebook_word, ), A( Img(src=u"/static/images/rss.png", width=u"14", height=u"14", class_=u"middle_image padding_left"), href=updates_path, title=u"Subscribe to the RSS feed for this %s." % notebook_word, ), class_=u"link_area_item", ) or None), (notebook.read_write != Notebook.READ_ONLY) and Div( A( u"nothing but %ss" % note_word, href=u"#", id=u"declutter_link", title= u"Focus on just your %ss without any distractions." % note_word, ), class_=u"link_area_item", ) or None, (notebook.read_write != Notebook.READ_WRITE and notebook.name != u"Luminotes") and Div( A( u"export", href=u"#", id=u"export_link", title= u"Download a stand-alone copy of the entire %s." % notebook_word, ), class_=u"link_area_item", ) or None, (notebook.read_write != Notebook.READ_WRITE) and Div( A( u"print", href=u"/notebooks/export?notebook_id=%s&format=print" % notebook.object_id, id=u"print_notebook_link", target=u"_new", title=u"Print this %s." % notebook_word, ), class_=u"link_area_item", ) or None, (notebook.read_write == Notebook.READ_WRITE) and Span( Div( (notebook.name != u"trash") and A( u"import", href=u"#", id=u"import_link", title= u"Import %ss from other software into Luminotes." % note_word, ) or None, (notebook.name != u"trash") and u"|" or None, A( u"export", href=u"#", id=u"export_link", title= u"Download a stand-alone copy of the entire %s." % notebook_word, ), class_=u"link_area_item", ) or None, (notebook.name != u"trash") and Div( notebook.trash_id and A( u"trash", href=u"/notebooks/%s?parent_id=%s" % (notebook.trash_id, notebook.object_id), id=u"trash_link", title=u"Look here for %ss you've deleted." % note_word, ) or None, (notebook.owner and notebook.name != u"trash" and notebook.trash_id) and u"|" or None, (notebook.owner and notebook.name != u"trash") and A( u"delete", href=u"#", id=u"delete_notebook_link", title=u"Move this %s to the trash." % notebook_word, ) or None, class_=u"link_area_item", ) or None, (notebook.owner and notebook.name != u"trash") and Div( A( u"rename", href=u"#", id=u"rename_notebook_link", title=u"Change the name of this %s." % notebook_word, ), class_=u"link_area_item", ) or None, (notebook.owner and notebook.name != u"trash" and user.username and rate_plan.get(u"notebook_sharing")) and Div( A( u"share", href=u"#", id=u"share_notebook_link", title=u"Share this %s with others." % notebook_word, ), class_=u"link_area_item", ) or None, Div( A( u"print", href= u"/notebooks/export?notebook_id=%s&format=print" % notebook.object_id, id=u"print_notebook_link", target=u"_new", title=u"Print this %s." % notebook_word, ), class_=u"link_area_item", ) or None, (notebook.name == u"trash") and Rounded_div( u"trash_notebook", A( u"trash", href=u"#", id=u"trash_link", title=u"Look here for %ss you've deleted." % note_word, ), class_=u"link_area_item", ) or None, ) or None, id=u"this_notebook_area", ) or None, (not forum_tag) and Div((len(linked_notebooks) > 0) and H4( u"notebooks", id=u"notebooks_area_title", ) or None, [ (nb.object_id == notebook.object_id) and Rounded_div( u"current_notebook", A( nb.name, href=u"/notebooks/%s" % nb.object_id, id=u"notebook_%s" % nb.object_id, ), (len(linked_notebooks) > 1) and Span( Img(src=u"/static/images/up_arrow.png", width=u"20", height=u"17", id=u"current_notebook_up"), Img(src=u"/static/images/down_arrow.png", width=u"20", height=u"17", id=u"current_notebook_down"), Span(id="current_notebook_up_hover_preload"), Span(id="current_notebook_down_hover_preload"), ) or None, class_=u"link_area_item", ) or Div( A( nb.name, href=u"/notebooks/%s" % nb.object_id, id=u"notebook_%s" % nb.object_id, ), class_=u"link_area_item", ) for nb in linked_notebooks ], id=u"notebooks_area") or None, (not forum_tag) and Div( Input( type=u"button", class_=u"note_button", id=u"new_notebook_button", value=u"+ notebook", title=u"Create a new wiki notebook.", ), class_=u"link_area_item", ) or None, Div(id=u"storage_usage_area", ), id=u"link_area_holder", ) or None, id=u"link_area", )