diff --git a/NEWS b/NEWS index b6ee585..638fac1 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,7 @@ -1.5.0: +1.5.0 beta 2: + * + +1.5.0 beta 1: August 27, 2008 * Completed the Luminotes Desktop Windows installer. * Improved logging, so tracebacks in production and desktop mode actually go to a file. Also removed logs on startup to prevent endless log growth. diff --git a/config/Common.py b/config/Common.py index c0c4d67..0191edd 100644 --- a/config/Common.py +++ b/config/Common.py @@ -110,6 +110,15 @@ settings = { "luminotes.unsubscribe_button": """ """, + "luminotes.download_button": + """ +
+ """, }, "/files/download": { "stream_response": True, diff --git a/controller/Root.py b/controller/Root.py index 189a798..2235e19 100644 --- a/controller/Root.py +++ b/controller/Root.py @@ -17,6 +17,7 @@ from view.Main_page import Main_page from view.Front_page import Front_page from view.Tour_page import Tour_page from view.Upgrade_page import Upgrade_page +from view.Download_page import Download_page from view.Forums_page import Forums_page from view.Notebook_rss import Notebook_rss from view.Json import Json @@ -344,6 +345,28 @@ class Root( object ): redirect = u"/pricing", ) + @expose( view = Download_page ) + @strongly_expire + @end_transaction + @grab_user_id + @validate( + user_id = Valid_id( none_okay = True ), + ) + def download( self, user_id = None ): + """ + Provide the information necessary to display the Luminotes download page. + """ + result = self.__users.current( user_id ) + parents = [ notebook for notebook in result[ u"notebooks" ] if notebook.trash_id and not notebook.deleted ] + if len( parents ) > 0: + result[ "first_notebook" ] = parents[ 0 ] + else: + result[ "first_notebook" ] = None + + result[ "download_button" ] = self.__settings[ u"global" ].get( u"luminotes.download_button" ) + + return result + # TODO: move this method to controller.Notebooks, and maybe give it a more sensible name @expose( view = Json ) @end_transaction diff --git a/static/css/product.css b/static/css/product.css index abc66fd..290b760 100644 --- a/static/css/product.css +++ b/static/css/product.css @@ -113,6 +113,12 @@ border: 1px solid #999999; } +.desktop_screenshot { + float: right; + text-align: center; + margin-left: 20px; +} + .heading { padding: 0.5em; margin-top: 1em; @@ -364,6 +370,10 @@ font-size: 82%; } +.download_button_area { + padding-top: 0.5em; +} + .yearly_link { font-size: 82%; } diff --git a/static/html/download.html b/static/html/source code.html similarity index 67% rename from static/html/download.html rename to static/html/source code.html index a419087..8d20970 100644 --- a/static/html/download.html +++ b/static/html/source code.html @@ -1,15 +1,16 @@ --First of all: You don't need to download any software if you just want to +First of all: You don't need to download any source code if you just want to make a wiki! For that, simply -try the demo, or -sign up for a free account. +try the demo, +download Luminotes Desktop, or +sign up for a free account online.
-But if you do want to run Luminotes on your own server, here is the -necessary software: +But if you do want to run Luminotes on your own server or run Luminotes +Desktop on Linux, here is the necessary software:
It is licensed under the terms of the GNU GPL. To use -this software, you'll need a Linux machine with Python and PostgreSQL. More -details, including installation instructions, can be found within the included -INSTALL file. +href="http://www.gnu.org/copyleft/gpl.html" target="_top">GNU GPL. +Installation instructions can be found within the included INSTALL file.
@@ -29,10 +28,10 @@ If you have any problems or questions, please let me know. See my contact info for details.
--The download link above is the most recent stable release of Luminotes server. +The download link above is the most recent stable release of Luminotes. If you're interested in getting your hands on the development version of Luminotes, then you should use the Luminotes Mercurial source @@ -46,7 +45,7 @@ browse the source code online:
I should emphasize that this is the development version of Luminotes. This means it's intended for developers and likely contains untested or -unfinished features. If you want to run a production server, download the +unfinished features. If you want to run a production version, download the stable release above rather than using the development version.
diff --git a/static/images/download.png b/static/images/download.png new file mode 100644 index 0000000..17d2dd7 Binary files /dev/null and b/static/images/download.png differ diff --git a/static/images/download.xcf b/static/images/download.xcf new file mode 100644 index 0000000..e94f0bc Binary files /dev/null and b/static/images/download.xcf differ diff --git a/static/images/download_button.png b/static/images/download_button.png new file mode 100644 index 0000000..817855a Binary files /dev/null and b/static/images/download_button.png differ diff --git a/static/images/installer_screenshot.png b/static/images/installer_screenshot.png new file mode 100644 index 0000000..f0a1a9c Binary files /dev/null and b/static/images/installer_screenshot.png differ diff --git a/static/images/installer_screenshot.xcf b/static/images/installer_screenshot.xcf new file mode 100644 index 0000000..b09037a Binary files /dev/null and b/static/images/installer_screenshot.xcf differ diff --git a/tools/initdb.py b/tools/initdb.py index a3fd48c..070cf80 100644 --- a/tools/initdb.py +++ b/tools/initdb.py @@ -17,7 +17,7 @@ class Initializer( object ): ( u"meet the team.html", False ), ( u"contact info.html", False ), ( u"login.html", False ), - ( u"download.html", False ), + ( u"source code.html", False ), ( u"password reset.html", False ), ( u"advanced browser features.html", False ), ( u"supported browsers.html", False ), diff --git a/tools/updatedb.py b/tools/updatedb.py index ba601fc..6291862 100755 --- a/tools/updatedb.py +++ b/tools/updatedb.py @@ -18,7 +18,7 @@ class Updater( object ): ( u"meet the team.html", False ), ( u"contact info.html", False ), ( u"login.html", False ), - ( u"download.html", False ), + ( u"source code.html", False ), ( u"password reset.html", False ), ( u"advanced browser features.html", False ), ( u"supported browsers.html", False ), diff --git a/view/Download_page.py b/view/Download_page.py new file mode 100644 index 0000000..39d7f06 --- /dev/null +++ b/view/Download_page.py @@ -0,0 +1,286 @@ +from Product_page import Product_page +from Tags import Div, H1, Img, A, P, Table, Th, Tr, Td, Li, Span, I, Br, Ul, Li, Script, H4, B + + +class Download_page( Product_page ): + def __init__( self, user, notebooks, first_notebook, login_url, logout_url, rate_plan, groups, download_button ): + MEGABYTE = 1024 * 1024 + + Product_page.__init__( + self, + user, + first_notebook, + login_url, + logout_url, + u"download", # note title + + Script( type = u"text/javascript", src = u"/static/js/MochiKit.js" ), + + Div( + Div( + H1( + Img( + src = u"/static/images/download.png", + width = u"181", height = u"41", + alt = u"download", + ), + ), + P( + """ + Install Luminotes on your computer. 60-day money-back guarantee. + """, + class_ = u"upgrade_subtitle", + ), + Div( + Div( + Img( src = u"/static/images/installer_screenshot.png", width = u"350", height = u"273" ), + class_ = u"desktop_screenshot", + ), + P( + Table( + Tr( + Th( u" " ), + Th( + u"Luminotes Desktop", + Div( + download_button, + class_ = u"download_button_area", + ), + class_ = u"plan_name", + ) + ), + Tr( + Td( + A( u"Unlimited storage space", href = u"#", onclick = u"toggleElementClass( 'undisplayed', 'storage_description' ); return false;" ), + class_ = u"feature_name", + ), + Td( + Img( src = u"/static/images/check.png", width = u"22", height = u"22" ), + ), + ), + Tr( + Td( + Ul( + Li( u"More space for your wiki notes." ), + Li( u"More space for your documents and files." ), + ), + colspan = u"2", + id = u"storage_description", + class_ = u"feature_description undisplayed", + ), + ), + Tr( + Td( + A( u"Unlimited wiki notebooks", href = u"#", onclick = u"toggleElementClass( 'undisplayed', 'notebooks_description' ); return false;" ), + class_ = u"feature_name", + ), + Td( + Img( src = u"/static/images/check.png", width = u"22", height = u"22" ), + ), + ), + Tr( + Td( + Ul( + Li( u"Create a unique notebook for each subject." ), + Li( u"Keep work and personal notebooks separate." ), + ), + colspan = u"2", + id = u"notebooks_description", + class_ = u"feature_description undisplayed", + ), + ), + Tr( + Td( + A( u"Friendly email support", href = u"#", onclick = u"toggleElementClass( 'undisplayed', 'support_description' ); return false;" ), + class_ = u"feature_name", + ), + Td( + Img( src = u"/static/images/check.png", width = u"22", height = u"22" ), + ), + ), + Tr( + Td( + Ul( + Li( u"Fast email responses to your support questions. From a real live human." ), + Li( u"No waiting on hold with a call center." ), + ), + colspan = u"2", + id = u"support_description", + class_ = u"feature_description undisplayed", + ), + ), + Tr( + Td( + A( u"Notes stored on your own computer", href = u"#", onclick = u"toggleElementClass( 'undisplayed', 'local_storage' ); return false;" ), + class_ = u"feature_name", + ), + Td( + Img( src = u"/static/images/check.png", width = u"22", height = u"22" ), + ), + ), + Tr( + Td( + Ul( + Li( u"All of your notes are stored privately on your own computer." ), + Li( u"A future release will support optional online syncing." ), + ), + colspan = u"2", + id = u"local_storage", + class_ = u"feature_description undisplayed", + ), + ), + Tr( + Td( + A( u"Works without an internet connection", href = u"#", onclick = u"toggleElementClass( 'undisplayed', 'works_offline' ); return false;" ), + class_ = u"feature_name", + ), + Td( + Img( src = u"/static/images/check.png", width = u"22", height = u"22" ), + ), + ), + Tr( + Td( + Ul( + Li( u"Take notes in meetings, in class, or while on the go." ), + Li( u"Runs in a web browser, but no internet connection is needed." ), + ), + colspan = u"2", + id = u"works_offline", + class_ = u"feature_description undisplayed", + ), + ), + border = u"1", + id = u"upgrade_table", + ), + class_ = u"upgrade_table_area", + ), + class_ = u"wide_center_area", + ), + + class_ = u"upgrade_area", + ), + + Div( + Div( + H4( u"What operating systems are supported?", class_ = u"upgrade_question" ), + P( + u""" + Luminotes Desktop currently supports Windows XP, and Windows Vista. Future + releases will support Mac OS X as well. And Linux users should get the + """, + A( u"source code", href = "/source_code" ), + "directly.", + class_ = u"upgrade_text", + ), + P( + u""" + If Luminotes Desktop does not support your operating system currently, or you just + don't want to install anything on your computer, you can still use Luminotes + online! Simply + """, + A( u"sign up", href = "/pricing" ), + """ + for an online Luminotes account. With the online version of Luminotes, there's + nothing to download or install. + """, + class_ = u"upgrade_text", + ), + H4( u"How many users are supported?", class_ = u"upgrade_question" ), + P( + u""" + Luminotes Desktop is designed for individual note taking. If you're interested + in sharing and collaboration, take a look at + """, + A( u"the online version of Luminotes", href = "/pricing" ), + """ + for those features. + """, + class_ = u"upgrade_text", + ), + H4( u"Is my wiki private?", class_ = u"upgrade_question" ), + P( + u""" + Absolutely. With Luminotes Desktop, your notes are stored locally on your own + computer, not on the web. But if you do want to access your wiki both locally + and online, a future release will include optional online synchronization. + There is also a complete + """, + A( u"Luminotes privacy policy", href = "/privacy" ), + u""" + so please check that out if you're interested in how Luminotes + protects your privacy. + """, + class_ = u"upgrade_text", + ), + H4( u"Are upgrades included?", class_ = u"upgrade_question" ), + P( + """ + When you purchase Luminotes Desktop, you automatically get full access to all future + upgrades. + """, + class_ = u"upgrade_text", + ), + H4( u"What forms of payment do you accept?", class_ = u"upgrade_question" ), + P( + """ + When you click the "Buy Now" button above, you'll be presented with a simple checkout + page. You can purchase Luminotes Desktop with either a credit card or PayPal. It's + fast and secure. You do not need a PayPal account to make the purchase. + """, + class_ = u"upgrade_text", + ), + P( + """ + After you fill out the payment information, you will be able to download Luminotes + Desktop and start taking notes right away. + """, + class_ = u"upgrade_text", + ), + H4( u"What is your refund policy?", class_ = u"upgrade_question" ), + P( + """ + It's this simple: Luminotes Desktop comes with a 60-day money-back guarantee. No questions asked. + """, + class_ = u"upgrade_text", + ), + H4( u"What happens to my wiki if I stop using Luminotes?", class_ = u"upgrade_question" ), + P( + """ + There is no lock-in with Luminotes. You can export your entire wiki whenever you like. + """, + class_ = u"upgrade_text", + ), + class_= u"wide_center_area", + ), + + P( + Table( + Tr( + Th( + u"Luminotes Desktop", + Div( + download_button, + class_ = u"download_button_area", + ), + class_ = u"plan_name", + ) + ), + id = u"upgrade_table_small", + ), + class_= u"upgrade_table_area", + ), + + Div( + P( + Span( u"Have a question before you buy?", class_ = u"hook_action_question" ), Br(), + A( u"Contact support", href = u"/contact_info", class_ = u"hook_action" ), + class_ = u"hook_action_area", + separator = u"", + ), + class_ = u"center_area", + ), + + class_ = u"wide_center_area", + ), + ), + ) diff --git a/view/Front_page.py b/view/Front_page.py index be38229..7905428 100644 --- a/view/Front_page.py +++ b/view/Front_page.py @@ -47,11 +47,10 @@ class Front_page( Product_page ): ), P( A( u"Take a tour", href = u"/tour", class_ = u"hook_action" ), u", ", - A( u"Try the demo", href = u"/users/demo", class_ = u"hook_action" ), u", ", + A( u"Try the demo", href = u"/users/demo", class_ = u"hook_action" ), u", ", Br(), + A( u"Download", href = u"/download", class_ = u"hook_action" ), u", ", Span( u" or ", class_ = u"hook_action_or" ), A( u"Sign up", href = u"/pricing", class_ = u"hook_action" ), - Br(), - Span( u"Sign up in seconds. For free.", class_ = u"hook_action_detail" ), class_ = u"hook_action_area", separator = u"", ), @@ -349,7 +348,8 @@ class Front_page( Product_page ): P( Span( u"Sound interesting?", class_ = u"hook_action_question" ), Br(), A( u"Take a tour", href = u"/tour", class_ = u"hook_action" ), u", ", - A( u"Try the demo", href = u"/users/demo", class_ = u"hook_action" ), u", ", + A( u"Try the demo", href = u"/users/demo", class_ = u"hook_action" ), u", ", Br(), + A( u"Download", href = u"/download", class_ = u"hook_action" ), u", ", Span( u" or ", class_ = u"hook_action_or" ), A( u"Sign up", href = u"/pricing", class_ = u"hook_action" ), class_ = u"hook_action_area", diff --git a/view/Header.py b/view/Header.py index e2e31c9..c9b11a2 100644 --- a/view/Header.py +++ b/view/Header.py @@ -34,8 +34,10 @@ class Header( Div ): Div( ( note_title == u"home" ) and title_image or A( title_image, href = u"/" ), ( login_url and user.username == u"anonymous" ) and Div( - ( note_title == u"pricing" ) and Span( u"sign up for free", class_ = u"bold_link" ) or \ - A( u"sign up for free", href = u"/pricing", class_ = u"bold_link" ), u" | ", + ( note_title == u"download" ) and Span( u"download", class_ = u"bold_link" ) or \ + A( u"download", href = u"/download", class_ = u"bold_link" ), u" | ", + ( note_title == u"pricing" ) and Span( u"sign up", class_ = u"bold_link" ) or \ + A( u"sign up", href = u"/pricing", class_ = u"bold_link" ), u" | ", A( u"login", href = login_url, @@ -62,6 +64,14 @@ class Header( Div ): ), " | ", ) or None, + ( note_title == u"download" ) and Span( u"download", class_ = u"bold_link" ) or \ + A( + u"download", + href = u"/download", + title = u"Download Luminotes to run on your own computer.", + class_ = u"bold_link", + ), + " | ", user.username and Span( A( u"upgrade", @@ -71,11 +81,11 @@ class Header( Div ): ), " | ", ) or Span( - ( note_title == u"pricing" ) and Span( u"sign up for free", class_ = u"bold_link" ) or \ + ( note_title == u"pricing" ) and Span( u"sign up", class_ = u"bold_link" ) or \ A( - u"sign up for free", + u"sign up", href = u"/pricing", - title = u"Sign up for a real Luminotes account.", + title = u"Sign up for an online Luminotes account.", class_ = u"bold_link", ), " | ", diff --git a/view/Link_area.py b/view/Link_area.py index c62890c..6d0e65b 100644 --- a/view/Link_area.py +++ b/view/Link_area.py @@ -1,4 +1,4 @@ -from Tags import Div, P, Span, H4, A, Strong, Img, Input +from Tags import Div, P, Span, H4, A, Strong, Img, Input, Br from Rounded_div import Rounded_div from Search_form import Search_form @@ -186,7 +186,10 @@ class Link_area( Div ): ), ( user.username is None and notebook_path != "/" ) and P( - A( u"Sign up for free", href = u"/pricing", class_ = u"hook_action" ), + 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, diff --git a/view/Product_page.py b/view/Product_page.py index 4f4fde0..6ef05b2 100644 --- a/view/Product_page.py +++ b/view/Product_page.py @@ -23,9 +23,9 @@ class Product_page( Page ): Div( Div( u"Copyright ©2008 Luminotes", u" | ", - A( u"download", href = u"/download" ), u" | ", A( u"contact", href = u"/contact_info" ), u" | ", A( u"support", href = u"/support" ), u" | ", + A( u"source code", href = u"/source_code" ), u" | ", A( u"team", href = u"/meet_the_team" ), u" | ", A( u"blog", href = u"/blog" ), u" | ", A( u"privacy", href = u"/privacy" ), diff --git a/view/Tour_page.py b/view/Tour_page.py index 7ccd8ca..f2cfbaa 100644 --- a/view/Tour_page.py +++ b/view/Tour_page.py @@ -106,9 +106,10 @@ class Tour_page( Product_page ): Div( P( Span( u"Like what you've seen so far?", class_ = u"hook_action_question" ), Br(), - A( u"Try the demo", href = u"/users/demo", class_ = u"hook_action" ), + A( u"Try the demo", href = u"/users/demo", class_ = u"hook_action" ), u", ", + A( u"Download", href = u"/download", class_ = u"hook_action" ), u", ", Span( u" or ", class_ = u"hook_action_or" ), - A( u"Sign up for free", href = u"/pricing", class_ = u"hook_action" ), + A( u"Sign up", href = u"/pricing", class_ = u"hook_action" ), class_ = u"hook_action_area", separator = u"", ), diff --git a/view/Upgrade_page.py b/view/Upgrade_page.py index 1042260..da0b271 100644 --- a/view/Upgrade_page.py +++ b/view/Upgrade_page.py @@ -245,6 +245,16 @@ class Upgrade_page( Product_page ): """, class_ = u"upgrade_text", ), + H4( u"Do you have a desktop version I can download?", class_ = u"upgrade_question" ), + P( + u""" + Yes! If you want to download Luminotes and take notes locally instead of on the web, + check out + """, + A( u"Luminotes Desktop", href = "/download" ), ".", + separator = u"", + class_ = u"upgrade_text", + ), H4( u"Is my wiki private?", class_ = u"upgrade_question" ), P( u"""