From e9d2ea28d168bf593f15c25463da10624dadcbe5 Mon Sep 17 00:00:00 2001 From: Dan Helfman Date: Sat, 22 Mar 2008 04:01:21 +0000 Subject: [PATCH] Began redesign of upgrade/pricing page. --- NEWS | 3 + controller/Root.py | 51 +++--- controller/test/Test_root.py | 47 ++--- static/css/note.css | 75 -------- static/css/product.css | 134 ++++++++++++++- static/html/sign up.html | 15 +- static/images/more_collaboration.png | Bin 0 -> 3087 bytes static/images/more_collaboration.xcf | Bin 0 -> 4824 bytes static/images/more_room_to_stretch_out.png | Bin 0 -> 3356 bytes static/images/more_room_to_stretch_out.xcf | Bin 0 -> 5798 bytes static/images/sign_up.png | Bin 0 -> 3373 bytes static/images/sign_up.xcf | Bin 0 -> 4548 bytes static/images/sign_up_button.png | Bin 0 -> 2051 bytes static/images/sign_up_button.xcf | Bin 0 -> 3891 bytes static/images/subscribe_button.png | Bin 0 -> 2097 bytes static/images/subscribe_button.xcf | Bin 0 -> 3021 bytes static/images/unsubscribe_button.png | Bin 0 -> 2129 bytes static/images/unsubscribe_button.xcf | Bin 0 -> 3094 bytes static/images/upgrade.png | Bin 0 -> 3818 bytes static/images/upgrade.xcf | Bin 0 -> 4998 bytes static/images/zero_hassle.png | Bin 0 -> 2315 bytes static/images/zero_hassle.xcf | Bin 0 -> 3216 bytes view/Front_page.py | 82 +++++++-- view/Product_page.py | 12 +- view/Thanks_error_note.py | 2 +- view/Tour_page.py | 2 +- view/Upgrade_page.py | 190 +++++++++++++++++++++ view/User_area.py | 4 +- 28 files changed, 440 insertions(+), 177 deletions(-) create mode 100644 static/images/more_collaboration.png create mode 100644 static/images/more_collaboration.xcf create mode 100644 static/images/more_room_to_stretch_out.png create mode 100644 static/images/more_room_to_stretch_out.xcf create mode 100644 static/images/sign_up.png create mode 100644 static/images/sign_up.xcf create mode 100644 static/images/sign_up_button.png create mode 100644 static/images/sign_up_button.xcf create mode 100644 static/images/subscribe_button.png create mode 100644 static/images/subscribe_button.xcf create mode 100644 static/images/unsubscribe_button.png create mode 100644 static/images/unsubscribe_button.xcf create mode 100644 static/images/upgrade.png create mode 100644 static/images/upgrade.xcf create mode 100644 static/images/zero_hassle.png create mode 100644 static/images/zero_hassle.xcf create mode 100644 view/Upgrade_page.py diff --git a/NEWS b/NEWS index c26446b..b0789cf 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +1.2.18: March ??, 2008 + * Newly redesigned upgrade/pricing/signup page. + 1.2.17: March 18, 2008 * Internet Explorer expects quoted download filenames, while Firefox doesn't. So I took that into account by quoting conditionally based on the diff --git a/controller/Root.py b/controller/Root.py index 2df7657..e1dd779 100644 --- a/controller/Root.py +++ b/controller/Root.py @@ -13,8 +13,8 @@ from model.User import User 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.Notebook_rss import Notebook_rss -from view.Upgrade_note import Upgrade_note from view.Json import Json from view.Error_page import Error_page from view.Not_found_page import Not_found_page @@ -79,6 +79,8 @@ class Root( object ): if note_title in ( u"sign_up", u"login" ) and https_url and cherrypy.request.remote_addr != https_proxy_ip: if invite_id: return dict( redirect = u"%s/%s?invite_id=%s" % ( https_url, note_title, invite_id ) ) + if after_login: + return dict( redirect = u"%s/%s?after_login=%s" % ( https_url, note_title, after_login ) ) else: return dict( redirect = u"%s/%s" % ( https_url, note_title ) ) @@ -270,48 +272,35 @@ class Root( object ): return result - @expose( view = Main_page ) + @expose( view = Upgrade_page ) @strongly_expire @end_transaction @grab_user_id @validate( user_id = Valid_id( none_okay = True ), ) - def upgrade( self, user_id = None ): + def pricing( self, user_id = None ): """ - Provide the information necessary to display the Luminotes upgrade page. + Provide the information necessary to display the Luminotes pricing page. """ - anonymous = self.__database.select_one( User, User.sql_load_by_username( u"anonymous" ) ) - if anonymous: - main_notebook = self.__database.select_one( Notebook, anonymous.sql_load_notebooks( undeleted_only = True ) ) - else: - main_notebook = None - - if user_id: - user = self.__database.load( User, user_id ) - else: - user = None - - https_url = self.__settings[ u"global" ].get( u"luminotes.https_url" ) result = self.__users.current( user_id ) - result[ "notebook" ] = main_notebook - result[ "startup_notes" ] = self.__database.select_many( Note, main_notebook.sql_load_startup_notes() ) - result[ "total_notes_count" ] = self.__database.select_one( Note, main_notebook.sql_count_notes() ) - result[ "note_read_write" ] = False - result[ "notes" ] = [ Note.create( - object_id = u"upgrade", - contents = unicode( Upgrade_note( - self.__settings[ u"global" ].get( u"luminotes.rate_plans", [] ), - self.__settings[ u"global" ].get( u"luminotes.unsubscribe_button" ), - https_url, - user, - ) ), - notebook_id = main_notebook.object_id, - ) ] - result[ "invites" ] = [] + 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[ "rate_plans" ] = self.__settings[ u"global" ].get( u"luminotes.rate_plans", [] ) + result[ "unsubscribe_button" ] = self.__settings[ u"global" ].get( u"luminotes.unsubscribe_button" ) return result + @expose() + def upgrade( self ): + return dict( + redirect = u"/pricing", + ) + # TODO: move this method to controller.Notebooks, and maybe give it a more sensible name @expose( view = Json ) @end_transaction diff --git a/controller/test/Test_root.py b/controller/test/Test_root.py index c328ceb..c0a8c7e 100644 --- a/controller/test/Test_root.py +++ b/controller/test/Test_root.py @@ -326,8 +326,8 @@ class Test_root( Test_controller ): assert u"error" not in result assert result[ u"notebook" ].object_id == self.privacy_notebook.object_id - def test_upgrade( self ): - result = self.http_get( "/upgrade" ) + def test_pricing( self ): + result = self.http_get( "/pricing" ) assert result[ u"user" ].username == u"anonymous" assert len( result[ u"notebooks" ] ) == 4 @@ -341,27 +341,14 @@ class Test_root( Test_controller ): assert rate_plan[ u"name" ] == u"super" assert rate_plan[ u"storage_quota_bytes" ] == 1337 * 10 - assert result[ u"notebook" ].object_id == self.anon_notebook.object_id - assert len( result[ u"startup_notes" ] ) == 0 - assert result[ u"note_read_write" ] is False + assert result[ u"first_notebook" ] == None + assert result[ u"rate_plans" ] == self.settings[ u"global" ].get( u"luminotes.rate_plans", [] ) + assert result[ u"unsubscribe_button" ] == self.settings[ u"global" ].get( u"luminotes.unsubscribe_button" ) - assert result[ u"notes" ] - assert len( result[ u"notes" ] ) == 1 - assert result[ u"notes" ][ 0 ].title == u"upgrade your wiki" - assert result[ u"notes" ][ 0 ].notebook_id == self.anon_notebook.object_id - - contents = result[ u"notes" ][ 0 ].contents - assert u"upgrade" in contents - assert u"Super" in contents - assert u"Extra super" in contents - - # since the user is not logged in, no subscription buttons should be shown - assert u"button" not in contents - - def test_upgrade_after_login( self ): + def test_pricing_after_login( self ): self.login() - result = self.http_get( "/upgrade", session_id = self.session_id ) + result = self.http_get( "/pricing", session_id = self.session_id ) assert result[ u"user" ].username == self.username assert len( result[ u"notebooks" ] ) == 5 @@ -375,22 +362,14 @@ class Test_root( Test_controller ): assert rate_plan[ u"name" ] == u"super" assert rate_plan[ u"storage_quota_bytes" ] == 1337 * 10 - assert result[ u"notebook" ].object_id == self.anon_notebook.object_id - assert len( result[ u"startup_notes" ] ) == 0 - assert result[ u"note_read_write" ] is False + assert result[ u"first_notebook" ].object_id == self.notebook.object_id + assert result[ u"rate_plans" ] == self.settings[ u"global" ].get( u"luminotes.rate_plans", [] ) + assert result[ u"unsubscribe_button" ] == self.settings[ u"global" ].get( u"luminotes.unsubscribe_button" ) - assert result[ u"notes" ] - assert len( result[ u"notes" ] ) == 1 - assert result[ u"notes" ][ 0 ].title == u"upgrade your wiki" - assert result[ u"notes" ][ 0 ].notebook_id == self.anon_notebook.object_id + def upgrade( self ): + result = self.http_get( "/upgrade" ) - contents = result[ u"notes" ][ 0 ].contents - assert u"upgrade" in contents - assert u"Super" in contents - assert u"Extra super" in contents - - # since the user is logged in, subscription buttons should be shown - assert u"button" in contents + assert result[ u"redirect" ] == u"/pricing" def test_next_id( self ): result = self.http_get( "/next_id" ) diff --git a/static/css/note.css b/static/css/note.css index aa9a497..2f34936 100644 --- a/static/css/note.css +++ b/static/css/note.css @@ -89,81 +89,6 @@ ol li { padding-right: 1em; } -#upgrade_table_area { - text-align: center; -} - -#upgrade_login_text { - font-weight: bold; - text-align: center; -} - -#upgrade_table { - border-collapse: collapse; - border: 1px solid #999999; - margin-left: auto; - margin-right: auto; -} - -#upgrade_table th { - padding: 0.5em; -} - -#upgrade_table td { - text-align: center; - background-color: #fafafa; - padding: 0.5em; -} - -#upgrade_table .plan_name { - width: 16%; - text-align: center; - background-color: #d0e0f0; -} - -#upgrade_table .feature_name { - width: 36%; - text-align: left; - background-color: #fafafa; -} - -#upgrade_table_small { - border-collapse: collapse; - border: 1px solid #999999; - margin-left: auto; - margin-right: auto; -} - -#upgrade_table_small th { - padding: 0.5em; -} - -#upgrade_table_small td { - text-align: center; - background-color: #fafafa; - padding: 0.5em; -} - -#upgrade_table_small .plan_name { - width: 33%; - text-align: center; - background-color: #d0e0f0; -} - -.price_text { - color: #ff6600; -} - -.month_text { - padding-top: 0.5em; - font-size: 75%; -} - -.subscribe_form { - margin-top: 0.5em; - margin-bottom: 0; -} - .thumbnail_left { float: left; margin: 0.5em; diff --git a/static/css/product.css b/static/css/product.css index ea764a4..192e096 100644 --- a/static/css/product.css +++ b/static/css/product.css @@ -105,10 +105,6 @@ margin-right: 20px; } -.hook_bullet_list { - list-style-type: none; -} - .hook_action_area { background-color: #ffff99; font-weight: bold; @@ -178,6 +174,10 @@ padding-bottom: 0.5em; } +.compact_list { + line-height: 100%; +} + .quotes_area { float: right; width: 400px; @@ -207,10 +207,12 @@ } .footer { + clear: both; background-color: #b0d0ff; height: 2em; margin-left: 0; margin-right: 0; + margin-top: 1em; border-top: 1px solid #999999; } @@ -247,3 +249,127 @@ .tour_screenshot_wrapper { padding: 1em; } + +.upgrade_subtitle { + text-align: center; + font-weight: bold; + padding-bottom: 0.5em; +} + +.upgrade_text { + text-align: left; +} + +.upgrade_area { + text-align: center; + padding-top: 1em; + padding-bottom: 1em; + background-color: #ffffff; + border-bottom: 1px solid #cccccc; + margin: 0 auto; + margin-bottom: 1em; +} + +.upgrade_table_area { + text-align: center; +} + +#upgrade_table { + border-collapse: collapse; + border: 1px solid #999999; + margin-left: auto; + margin-right: auto; + margin-bottom: 1em; +} + +#upgrade_table th { + padding: 0.5em; +} + +#upgrade_table td { + text-align: center; + background-color: #fafafa; + padding: 0.5em; +} + +#upgrade_table .plan_name { + width: 16%; + text-align: center; + background-color: #d0e0f0; +} + +#upgrade_table .feature_name { + width: 36%; + text-align: left; + background-color: #fafafa; +} + +#upgrade_table_small { + clear: both; + border-collapse: collapse; + border: 1px solid #999999; + margin-left: auto; + margin-right: auto; +} + +#upgrade_table_small th { + padding: 0.5em; +} + +#upgrade_table_small td { + text-align: center; + background-color: #fafafa; + padding: 0.5em; +} + +#upgrade_table_small .plan_name { + width: 33%; + text-align: center; + background-color: #d0e0f0; +} + +.price_text { + color: #ff6600; +} + +.month_text { + padding-top: 0.5em; + font-size: 75%; +} + +.subscribe_form { + margin-top: 0.5em; + margin-bottom: 0; +} + +.sign_up_button_area { + margin-top: 0.5em; +} + +.upgrade_left_area { + width: 400px; + margin-bottom: 1em; +} + +.upgrade_right_area { + float: right; + width: 400px; + margin-left: 20px; + margin-bottom: 1em; +} + +.thumbnail_left { + float: left; + margin: 0.5em; + margin-right: 1em; + margin-bottom: 0.5em; + border: 1px solid #999999; +} + +.thumbnail_right { + float: right; + margin: 0.5em; + margin-left: 1em; + margin-bottom: 0.5em; + border: 1px solid #999999; +} diff --git a/static/html/sign up.html b/static/html/sign up.html index 9469b5f..de0d15e 100644 --- a/static/html/sign up.html +++ b/static/html/sign up.html @@ -1,20 +1,15 @@

sign up

-To get started with your own personal wiki, all you need to do is sign up for -an account. There's nothing to download or install. +There's nothing to download or install.

-If you haven't seen it already, try the -demo first! The Luminotes demo doesn't require any sort of sign up. +If you're not ready to sign up +yet, try the demo first!

-Providing your email address is completely optional. I only ask for it -in case you ever need your password reset. Your email address will absolutely -not be given out or used for spam. -

@@ -28,12 +23,12 @@ not be given out or used for spam.

-password (again)
+password (again)

-email address (optional)
+email address (optional and never shared)

diff --git a/static/images/more_collaboration.png b/static/images/more_collaboration.png new file mode 100644 index 0000000000000000000000000000000000000000..2519586aa92fbe151a9ef23bc2317d32b3a34bc8 GIT binary patch literal 3087 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 Re=N%K7$QL{fb?jte*p$aq=Nte literal 0 HcmV?d00001 diff --git a/static/images/more_room_to_stretch_out.png b/static/images/more_room_to_stretch_out.png new file mode 100644 index 0000000000000000000000000000000000000000..e64a1855a2bd4fbf2a45465717dd3cdb0466ba6d GIT binary patch literal 3356 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 literal 0 HcmV?d00001 diff --git a/static/images/more_room_to_stretch_out.xcf b/static/images/more_room_to_stretch_out.xcf new file mode 100644 index 0000000000000000000000000000000000000000..2650457d28175a6310aab201400217b1c44cc2f2 GIT binary patch literal 5798 zcmc&&eQ;FO6+dq`$tHx4$VW`5Fw2J+Miv1rQ)n9yD5w-IBtp1cH7d(kk#X21TArP&5rcBT$Ox-A^P1&q$O4 zvy_`}nKugaYw#Y@h-E##aC5Ui6hoV2uzY^R?~VEE-5Ub2CU}~XW8Y6*v=>tM5u8PK5gMN1)6!S--eqSsQ4n-#qs%mKTg@fUUyGp%0k;c_t_q3_g z)N_%_baQAjpsOzewZ`3_T@h$YbgkDH2sOH=TYI6i^B)zRKFmiu3@xv)TF{YYFVS%2l5oWDj)cR_?pW9zjYa%1Uz0n$PMM$x z6U1hWQf$@*RAScgqCq+J(wzF>ocfTQ`Y_aGE$eZiB74YV`G^yB@r&hnXAB+lx5PX_ zZ>v8d^Tg1ztEA68{ z=Gs7uKPZN1fK33NZu~vn_Y9WgrbJWK5d zvd8dWvXj%NYf(R6*KzoXH1nqjMEj)ox5Kc|={hO{>I5@%v4!~s<|pBNJ;kpxCtv*p zD=k9Pc#;eF{1I{-WIp?R7xPa9`Xp5`zqgzDA#xn&_$uZ@nET!a=5tq)>sQPj5N0ED zZ|l6}Q)xN29!t}prZOs`k2lg>=3~{&pE$qF{LBr^N8$32qh0p90;-A6B)WrnA2~_K zzU$Gi9}_u?=+qrl$NZKP^38sLdD(pCQ$&}GKBwWRy;x=~QB=<2pk!g3`AR__X08!* zl)}uf(u2&q|H+-M+01DtEf#dKpbw#+D3(DR6VZR6de)pJSoCI~&&FsQ1f~U05c4B6 z1>=bdx{WywNqe7VevD|n37*BpV)!EJTTgpLQ3a=9%v3d12x^9n+Ak|ni;0>eTb@66 z`otTL-{cT*3q2=_p@%S_pKwqi-l@fOBVI;{i2MrkR-#t(z%wD5MnkBtm5wks5>$^K*)(E&(eYgvMiI)Tu4Gw;Hr z^qAj>Yd=$tz4h&!ZUk%6V-HH-@wq@Gx09n-Lv&9SUpfe5$q6gh+&T`G)R0SyWyNu| zzLhg%MPmqU*5+hMF9E;-Pqc_cl^fhQU!?t`9=C{^j z(k;#+xOuvzq!6BU2AD6(QaGJ{Cs?}A0hiSZCl-Vk=>otlTXWjO?^#2Q$g8X z8D$F%d-B=Yuc-%_UljW;%kF$0;FL*8o2KA{T?Zc!m)it}=zc`rQ;{P8ODl4kWCe?D z)|OV33e!s}DqNVJ(kh06wKwFmR=bw;q8;xy(?s)KM*6py1JYJ+v=Og;(pGP@5t-Vm zv?`SktgKr~acyQ~$EKRWvSoHgHYlWDNrAe_aYQ!9ODH|!Fi4vCbQ)cwhP%d5UM4Q& zu6G@IWJmCM4t^1TtAlwVwIkZ;m?0_nBb9>;%)g&D3j!gc&fPgH(nmmT2Ah`>8?7&UqLPvWNz9`3Urxh+oYtfm<@lpEiTB%B=-q& znIN+{S7U`-k&9GhhBaoM6y%GA;$1+l5M*xNRY*}#mf5;u_8?gDX;Dzbgw_evOu2oM za_KM3-xQ?H;$()^rId6WX8xl9)f@nGQ*M%eFWD8**CKE-lVAsv{vGBw1*c{JXQteL zNXn&$v1s8J@DDYY$u8^S}{J%IdUJcS8a{=zPmFH1uD^K|TD$c*??MA@=cQOk@rryXyJV~^In={QhO-rcbRQP zZM3(TZAERXeVKi8&ZDw}&Wya}?i~%6k=%v%x@zyxenTwQ*vmr<;CY)9=!M-iarb2vUp-fbMr91)>4}d0A zP|$F3l2D*XKTA*}WkYzoI;V}w282wicMHy<{Aj@~5}fkK+}*O_z)bR61gQ9oKX7ut zdRCJNcu)Tg?P$=Qi3ZkP8Md)0y%qcR++V4U_Rj**awM+ACf&JVfsj9NYldXPXxte= z{h{x``}z##D1DFlQ5jUn9WCJ81W!V1+@PV?Eb&J_kKXvPa@xgu4Y0|gIG-IU>Do@| z_{U-1sBu7(`aNT7*ECckdkv~6L7Yg99N{2D$V^V(tS!Jj`#`qP4wKr$&1{XgqB3Hk zbJcy75J@ll(p+3%?VOw_CKy3NUta+-)0iw>S0hhZhfGzd)EWmLuV+4Eb$8;cOqOkn z<<4ViWjJaXN5S69@vqq)DKke@?(@o>#ll!4D!1WM^xA+CmAgRQg9AoXZh{;BV!()^ zGotwZ{1G#^TtE(e2Op3W$&>)f*$|SigXQ&&6KAXM5tRV<*pB4-kX>xdmj%T?QsN&7 z?$bNqA<0*7KCn%0J(lqi4;)w3)=Yq{GgfVpk0jqm87dV#3sK~|mpl_tL(@>q7O?L|jzQ|Lc>SwLgR?7a8!_;zIoLNhn)UcA?;M1& literal 0 HcmV?d00001 diff --git a/static/images/sign_up.png b/static/images/sign_up.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd64e2b161513bab281230f5eca783b6ddadcf5 GIT binary patch literal 3373 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 literal 0 HcmV?d00001 diff --git a/static/images/sign_up_button.png b/static/images/sign_up_button.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c7250ba960a9b2a942450aa685273c076d4611 GIT binary patch literal 2051 zcmV+e2>kbnP)J0S@$Cd5*ZCNRyMfT; z52yXj+`0F>e&?L;?{&`a3R1{wsk8Wy5+v?BC6dZXK;;`yvJ%|oAe0X_QkDsUF6cW> zaA+>>d!H5wz^s-!i<(-fZU$#5sE$ckTJi7H_j_$js!x?eYP*=CZmKb);eRzlNXL&f zl;;8_4xe1M2EvaHPCsr@FG6OxLLxmy2BPedN#P^X`FY)*@XXy0@DKE@s`=%wVT2jg@Z}oEfj=yn# zb1e^US(d@HNyFdDU~X4xL-$~SU+#T_^$l}rT0S?y=cQAf{Q2kw9{KiaG*wJtnq=5t z8ZvdrT>$ipTsIAK93%AVYovtx1bzf%HjUGxp3M&^C(Xh}9 zMsQYy-qkb6@1JWY#{o@C3lsH!dhsj=j{10Xdp%e)6u3+y0k{M#7J*m*%xgEFzrW@K z;3r>MNaNy(1!DyGNU_2*58ad~&ju-0M2b45C(U6PQs}A`0%N8krXew!04yXmOeh&5 z-jxxlqCf@UrBhur-r!7X8yJc5=pi4UT2?Hz3~2R@vFGq5di)WVR_BuK)Tk_S(7d{g zv5>*DCkAlZ6%HQjB^WhnT3X0G>nac#f`BmN{?V~quk%phTE>Nsj-OvbcA@|v34vY z!re_}Q=CXr_HXG}p*{p4jeO_~jQJosESY}$Inl#-*yJ1Q^ZDwnIjmWdgAp^?zAhJxalCeEM%zAF$Rl@`^3WGc0C@Al z&=hNkgJeaM>L)a89FJXsdT&!9zq+f0gFEJ-D)7|N-V|Pe`Jf~fKby!l4L5)hC@5bxc%o{{BU0nm3bB$mt{{#-_*ef5{}67<)Hu=kZm_H zVwT*r5C~JYtH}PIIDp|uBxBGJW;pJT^`t&#%#cScBbZo+uw);v9m?}H-W^QGH}z0$ zLTCU2oiKPZapck_=`swQkk2%z1lYU5#fryQ^6P`=*qD6+I=w(W^uGpeKGwKh{77kF z=ic*NYVG3r(^YJ&=|{A`AgAuj0an1^DQN3}?p$Cw47?6)7t_w0?RNn;G1T1#Z3h$e z0sqHwXdWVwD||e>wtWiSy*gFohS3z0lii*qcQX*MQRI%M9Wxx(=pMIIQ*ix}TWXkU z1I;z{;Vp&sy;VdsCb)Ut2>!XlE=WqxoCO4oL9T@XkOe;-JEfX zTrmbB9_Biw$t3zKvcJ5`f+gbRH001=ZPhT(ozG|Y$pw75wvYaRjf=x>8Y)NSI88?H zu5mXJ-0V6&4-kBAu|Ff}YYKd}DE#pRV^yK3Q@x<#{UD zylh?`qBnS%fBSOzr!S9zfQDtkW1G78^rBH>s@zzyM+2J|yF&t|W!dBFN>95s4AS{W zCp%xB$Ih4M0Wc>==j*FR;_HwazrVGZ{jGAXTkHLNzD@_>ogQG(P~0E3)LB-(j>w%q z?UYXMsKUEL3Ld9Lbzux8K0Id1XYw^NX2J_+ZLC`urGHFNyQ`3O3nM&v=O{4~A_ll@ z6L;XS0nV&zyN6#GRPhHD@?0iW1rzIN>s4voUBI@+AfK%bQnthud_%e_)jLwOMSw zH4juVYx4@H4h$l)vcZ+}{&@8r2kg>mnZK*F#K-Od*X)4S{EKtE_~r;gz`_bATh|n` z`IaJ7W%j@Vi0CG#F9fJ5cTkX%b^VNj-B_(HD0g*>M8?%Dor6-fRys?~IpZnnsBWSv z0#%(|kY+SRZG<2?g4yvrN>2~szEdJ8r*FCZGVkN9k=aH*sQ*KROz8}tgVFPdV1D9f hi1_fY(e(Zr{SSa=OX(XX^~?YO002ovPDHLkV1nIc>s$Z; literal 0 HcmV?d00001 diff --git a/static/images/sign_up_button.xcf b/static/images/sign_up_button.xcf new file mode 100644 index 0000000000000000000000000000000000000000..54c2d7c03655f934c74c771c322fcf6dea7c1481 GIT binary patch literal 3891 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 bPL2Ktwyxi<>H*N100000NkvXXu0mjfx_9}a literal 0 HcmV?d00001 diff --git a/static/images/subscribe_button.xcf b/static/images/subscribe_button.xcf new file mode 100644 index 0000000000000000000000000000000000000000..af0bb3e75fd5fa19cc9e83a423b0579d33a61cbf GIT binary patch literal 3021 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 Hu0mjf(_;e0 literal 0 HcmV?d00001 diff --git a/static/images/unsubscribe_button.xcf b/static/images/unsubscribe_button.xcf new file mode 100644 index 0000000000000000000000000000000000000000..964dc5b4de7426921071d92d9556e559a8b9d74b GIT binary patch literal 3094 zcmcIme@t7~6+X{4ekQ*YlBT7lGajo*gGt~G#mO@*0Twk;+Of5bqN&st*-*@hL=iYPPwQcswDt%p9g}%b>umZJ%BwLw6Z6gWCQI|rZD|`ch3AN26 z8j@s^`{FvY+d}pkG;XkwTcf?wVzU};)%J3NfOt-q>8`1FSoL;ijkVfsEvvD+obGL_ zGAnFlE{CgHpQ#MSYFnvAzcYKM(pFG%;?y>pTDrp21h4FIAGGB8)XH3EO`p(ZzLU&+@@=)>e@u^wrDsHOut1%XIcm<|`?V@yobG zzSV@W9Pg(wmg5?0U5(LUskc@Wq~zF`$uPZPS?C7ZnF^Pa!0$OMZnyoYzR=|;&ruMCE-urX=c!Rn3oU-8J@#dVQId6)^!0 zyVGh+RL!#ZOI>xwN>{m6UtaIDRNBi}Bm^lnlvoVgw0Kj;KCQ0`fRd+fr(7S48^jAk zeUY$ohBc`BHjxM<6+ZxZ%gIdG1fdO84>C;)clXRbO)e&n(RVBt;M0segcha|S&Zak zEh=O_KEue>&#q>g7Czd`$aUCA6(QzO(XHQ`r{?l`&^)X%<8zPYQmruvAgwr^l0MJp zCBs&2oZ_Gnx-yFjn2+_?STOx*6#oFZU;Jy~tv&c0G~!w_E-hfUN`c^&=zMf<;XiI- z<#+HvoZ)^e|5KU20UIB~Uugam(VoOi-R2B@0e*?eX0)nWu|R=DY*MA_%=qfIH3zUH z&J^SGYYLD)nN8SW#>4O`rj%gsR>;Cinorixz!O-hKuwrRE9l=t5Mks%p{tX0YE~jR%eEf&$08uA8R=ubyqKr5V*cZbgDsCfoIF0BjV<@Ti>u9eC}ngiNr4XG zDeX7bJ~~eYh#!okWGpVp!CX)v%^wjL z3`H!SgJ_B~nogwSMYBDR4tNb63`uk_Jd{O2aRxo8U};s>w^X!nnPD7+9?adq%s9BK zAwz{!K_o33UV^kuX+l~B4>KF#i$@nv-R$@~RmP6YFZZnjDj|S$5_a0KmiYN$r`g6r zOW9FdwX4=yuFu?A>E6Z+{+~x5^UvB!M_=OTW%M4!>Z@Qignge*Yj)(a7GDHkK^wt- zIzjChk@M$c)Q?Knz%^hr%Ji?*{R|`iD4J3BV+5I}C`QF7bE*bW;$TVg_79JkM#3On zy8hXn-FI$-G(9&vJ2w}<*)Th&nwy`Ep|NLvj+?zrCPXD{iIC2JJ|oV^(%{Wo;w>6J zxgp+=rT&kn#c5f(6r2<%L(;orfxvjc6bMUgAAU4?b@$bffH)A5yu;>U89c++#A_jtx<|(+r%Y39DQ(^F510nn z!bk){gdIm-K5jbxIS8eHxlAt}Q?9@mjocU);KpVcunZ*=ZY&xY(<&?%P>wL!3_@QXpke zF@`SHP_j=o6e86(G~`qHWWjl{PwbNgTlYEfTv+&Fdxy7!>xgu6tTxdW z5waT04Kk!1YZY5VAUyf&Gu|#!7YAV>eV?PswadjelLR@SssmPffDLLYq`021FwBBS zwO@zwg5Qrij4b*wnbmDEt5wpzR<{KsG=)bwg8nEUm63dD$t_PgO&SRe_j`W>a3|?b z__OPm-hw%9ZjnlmuIueEqnnBRS-QpFl5Y-5H~1U!Cxg;7KP`XUFHQ23a`2KAPzR#p z0WKhqotLgAUFAmQ4}ULRNxBmL;JvdRsa@9|N%Wn%&Pbcoqw9&hEnVO*$h}@^fFF?i z-;suO!x67^jlU)jpN1*TRA_R1v`2yg%|Ph=?luWP(o(2A?O4+Bg_n=)coIMy} zxwkAIf?RNss)VlIM_^Ppx^zIGgeUprL6^|S_sJKX!a4rj-ENye$)=0*E_Jm3NbsmV z(bFEz6K;J%XnC`RYvJCUX+HJhLqb#23A$geIh>Iq7D zFOi?h7HqstwwiGXysewW2w-k=?ZzzG#?berFMN;<=B@l00>%I0wolZDZQ&$ YvMGg>c=+o*T}KSFp!Ns}`>P252A?Um*8l(j literal 0 HcmV?d00001 diff --git a/static/images/upgrade.png b/static/images/upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..86f3bb7849a1017a57c5c107b44b6bbb2a57e5f8 GIT binary patch literal 3818 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 TM}+DFMJY&M+eE8Y!yf%V%IsFe literal 0 HcmV?d00001 diff --git a/static/images/upgrade.xcf b/static/images/upgrade.xcf new file mode 100644 index 0000000000000000000000000000000000000000..1e1c484c7b581a537cd843e38b7845e2f25d81ab GIT binary patch literal 4998 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 l3I!{4uh6|BD|G+sqDK literal 0 HcmV?d00001 diff --git a/static/images/zero_hassle.xcf b/static/images/zero_hassle.xcf new file mode 100644 index 0000000000000000000000000000000000000000..dbcfbe8fb8e10ee36cf5e26f44dc3db696e2ba7f GIT binary patch literal 3216 zcmc&$Yj9J?6+Tz;LpCb^AcHXmOZQ6m^gH*i zglOrX{^`!F_S>`P+jI8pIjb8p2e#@%k*FRu;|8G(qqhq{Yev^J`~=YhtM?H}N4pHY zO7&JXir(eW@4?s@!?vMFa$vwnWH2XLY+aKw!WpAazt7C{>%IMkzV^m-x5;Xgt8Na2 zV@4>JGW$dZh8E~dXR>iaHxn5nl{O+7Gnq&)sPBx%BFT6%rFXhRC>7fr*1NCmcH1Su zVzsmY)XkTmme%$E4um?C-WraWiI~2)WDCOVrG!cr8cdiOI3MXZ#OtACG@3RtWe0`* zpCV6kF;(KBns$t6#{SX_W9hym!VPyDsifW?PN%)Qtbt6fiO~ZJi(Z|=7^uDir+ z6}Yhi&jOacO05<^Y)C7mg&$Z_;YN(!-DZrTOeh}C8Y$6}yA5@UOrKlf@?1nDnoK}= zdmLvlx9F>r@xCtix3m^Yo5P0w)ruPshAZ`Aw$&Um;u7wDWR2Wb)(w6blW^P&r`0?j zPQ(V0Z~9y#5gJU(_M5|LBh+W6ygbw6nG}TobE4fln9i8dtR6uH7_w8`Oc?A zNtjIzg$9y+hTfM=ga^!scmk1|JEg-&&{XrkraK~t+`0#_jynpAr7p6zQiswTTV z8ovfR=0nLnJ9-ouu@LOi<*Z*X8)*^GA9qi+xlY;?E`z7;} z03Y3nz2{Ijv)x4ZGoQ<@zVlkTk9lGt)xOF+=A&BIoITQ9CB$2qbL{{&tZhR&pZ_!S z3i=N73-H0xPB1?JsWYE7c9wuEp*f7BS=E1K-YYv)=a?4?^B8jvrJ0`x)45s*-9R?B z*s6$!gqXmwT0nHJg39Fb>sPFU#vPPV#G8c}5aKVG_m_!?Ov~rY8HC8W9`~7FMcX`v zy$MH<6Z}}N+w<^{L~@U-;#!@!_9pX#!gproY|tI3u{=hxU+#*7E#kX%#R^a>|Gw!>F0X3AEl;`xteohL~#E(QE&bTdmKlqjm;AE zz06O*Qt>uN0{!VcqB%#AtJ5E^B-+Kr7-Cv%|Cwa(k6Mwv_V?NDK~yZQrm>~9&DU0F zo$152`HtSm#;^FXQ=#z-0UW`axAES4I%ozJ>f7pQR9i!%H3!N)LWPz^LHZimTO7{H z_=IE_#>bfV$#_7G`_+gG-Y2{5+B^#`<%2!j_ujt@hI87I)b5d<2KZEl8riP8pU$e< zCFb!t;@p+b**J@{TaFw&2ADtDjSmGu(}G+c*4!d4porx{pMc$es%1-RxkI!r2WjdEb3gfE^G_XeI|@}PQmKqBDPuQ_+YrC0rcDP9 ze=0<}0~;03Yyj1{0Q0UvspRv^RVBA!l5ZpO4Nu|Ka$*wJO*tVSl-jv~HS*X}&c#(i zn*w#C-I-{ zI_#A;%2heLh4~HmY2$_5gn(K;1mQOTlOFI$sh0U$R@9* z^5iTgv>Pwhdat~v#;7L8r|})rH3r@3=@*$l56=FTr1!fBk&B8zc(}VJ*g@jDMV^x) zzbxoOz|Z@yTfer2I@dKrDL=0#a#yD&iBm>}EAF~R1gg$QHM|r=%g|>EKpRGHcM<;9 zSBE28VyWa{!u=}tDRB+P|HqeI$v(_CtW>^~+{IU4!v^$+FP1mNAsZ4IK18f?uQ_1h L9dkRD%E$i~r8k-J literal 0 HcmV?d00001 diff --git a/view/Front_page.py b/view/Front_page.py index 2893158..6fc2c81 100644 --- a/view/Front_page.py +++ b/view/Front_page.py @@ -1,5 +1,5 @@ from Product_page import Product_page -from Tags import Div, Img, A, P, Table, Tr, Td, Li, Span, I, Br +from Tags import Div, Img, A, P, Table, Tr, Td, Li, Span, I, Br, Ul, Li class Front_page( Product_page ): @@ -49,7 +49,7 @@ class Front_page( Product_page ): 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", ", Span( u" or ", class_ = u"hook_action_or" ), - A( u"Sign up", href = u"/sign_up", class_ = u"hook_action" ), + A( u"Sign up", href = u"/pricing", class_ = u"hook_action" ), class_ = u"hook_action_area", separator = u"", ), @@ -70,6 +70,27 @@ class Front_page( Product_page ): ), ), + Div( + Div( + u'"', + Span( + u"As soon as I saw Luminotes I knew it was what I and my students needed.", + class_ = u"quote_title", + separator = u"", + ), + u""" + Clear, easy to use and beautifully simple. + """, + class_ = u"quote_text", + separator = u"", + ), + Div( + u"-Jonathan Lecun, Director, ", A( u"UK Teachers Online", href = u"http://www.ukteachersonline.co.uk/" ), + class_ = u"quote_signature" + ), + class_ = u"quote", + ), + Div( Div( u'"', @@ -94,6 +115,29 @@ class Front_page( Product_page ): class_ = u"quote", ), + Div( + Div( + u'"', + Span( + u"I'm a wiki addict, so I've tried most of them, desktop and web-based.", + class_ = u"quote_title", + separator = u"", + ), + u""" + What I like about your excellent product is the modeless editing (no edit + and save buttons). This makes Luminotes the fastest web-based wiki I have + used. + """, + class_ = u"quote_text", + separator = u"", + ), + Div( + u"-Scott Tiner", + class_ = u"quote_signature" + ), + class_ = u"quote", + ), + Div( Div( u'"', @@ -194,6 +238,17 @@ class Front_page( Product_page ): ), class_ = u"thumbnail_area", ), + P( + u"What can you do with Luminotes?", + ), + Ul( + Li( u"Plan a story" ), + Li( u"Collect recipes" ), + Li( u"Record your ideas" ), + Li( u"Keep track of your tasks" ), + Li( u"Take notes" ), + class_ = u"compact_list", + ), P( u""" Luminotes is open source / free software and licensed under the terms of the @@ -202,24 +257,23 @@ class Front_page( Product_page ): ), class_ = u"what_is_luminotes_text", ), + Div( + 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", ", + Span( u" or ", class_ = u"hook_action_or" ), + A( u"Sign up", href = u"/pricing", class_ = u"hook_action" ), + class_ = u"hook_action_area", + separator = u"", + ), + ), class_ = u"what_is_luminotes_area", ), class_ = u"wide_center_area", ), - Div( - 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", ", - Span( u" or ", class_ = u"hook_action_or" ), - A( u"Sign up", href = u"/sign_up", class_ = u"hook_action" ), - class_ = u"hook_action_area", - separator = u"", - ), - class_ = u"center_area", - ), P( Span( id = u"new_note_button_preload" ), Span( id = u"link_button_preload" ), diff --git a/view/Product_page.py b/view/Product_page.py index 790e8df..d234b9f 100644 --- a/view/Product_page.py +++ b/view/Product_page.py @@ -18,7 +18,8 @@ class Product_page( Page ): Div( ( note_title == u"home" ) and title_image or A( title_image, href = u"/" ), ( login_url and user.username == u"anonymous" ) and Div( - A( u"sign up", href = u"/sign_up", class_ = u"bold_link" ), u" | ", + ( note_title == u"pricing" ) and Span( u"pricing & sign up", class_ = u"bold_link" ) or \ + A( u"pricing & sign up", href = u"/pricing", class_ = u"bold_link" ), u" | ", A( u"login", href = login_url, @@ -39,16 +40,18 @@ class Product_page( Page ): user.username and Span( A( u"upgrade", - href = u"/upgrade", + href = u"/pricing", title = u"Upgrade your Luminotes account.", class_ = u"bold_link", ), " | ", ) or Span( + ( note_title == u"pricing" ) and Span( u"pricing & sign up", class_ = u"bold_link" ) or \ A( - u"sign up", - href = u"/sign_up", + u"pricing & sign up", + href = u"/pricing", title = u"Sign up for a real Luminotes account.", + class_ = u"bold_link", ), " | ", ) or None, @@ -64,7 +67,6 @@ class Product_page( Page ): ( note_title == u"home" ) and Span( u"home", class_ = u"bold_link" ) or A( u"home", href = u"/" ), u" | ", ( note_title == u"tour" ) and Span( u"tour", class_ = u"bold_link" ) or A( u"tour", href = u"/tour" ), u" | ", ( note_title == u"demo" ) and Span( u"demo", class_ = u"bold_link" ) or A( u"demo", href = u"/users/demo" ), u" | ", - ( note_title == u"upgrade" ) and Span( u"upgrade", class_ = u"bold_link" ) or A( u"pricing", href = u"/upgrade" ), u" | ", ( note_title == u"faq" ) and Span( u"faq", class_ = u"bold_link" ) or A( u"faq", href = u"/faq" ), u" | ", ( note_title == u"guide" ) and Span( u"guide", class_ = u"bold_link" ) or A( u"help", href = u"/guide" ), u" | ", ( note_title == u"contact" ) and Span( u"contact", class_ = u"bold_link" ) or A( u"contact", href = u"/contact_info" ), u" | ", diff --git a/view/Thanks_error_note.py b/view/Thanks_error_note.py index 5a59a52..9e85e3d 100644 --- a/view/Thanks_error_note.py +++ b/view/Thanks_error_note.py @@ -25,7 +25,7 @@ class Thanks_error_note( Span ): u""" Note: You can check the current status of your account by refreshing the """, - A( u"upgrade", href = u"/upgrade", target = "_top" ), + A( u"upgrade", href = u"/pricing", target = "_top" ), u""" page while logged in. """ diff --git a/view/Tour_page.py b/view/Tour_page.py index bd98423..37b49f9 100644 --- a/view/Tour_page.py +++ b/view/Tour_page.py @@ -74,7 +74,7 @@ class Tour_page( Product_page ): 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" ), Span( u" or ", class_ = u"hook_action_or" ), - A( u"Sign up", href = u"/sign_up", 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 new file mode 100644 index 0000000..4cc2446 --- /dev/null +++ b/view/Upgrade_page.py @@ -0,0 +1,190 @@ +from Product_page import Product_page +from Tags import Div, Img, A, P, Table, Th, Tr, Td, Li, Span, I, Br, Ul, Li + + +class Upgrade_page( Product_page ): + def __init__( self, user, notebooks, first_notebook, login_url, logout_url, rate_plan, rate_plans, unsubscribe_button ): + MEGABYTE = 1024 * 1024 + + Product_page.__init__( + self, + user, + first_notebook, + login_url, + logout_url, + u"pricing", # note title + + Div( + Div( + user and user.username not in ( None, u"anonymous" ) and Div( + Img( + src = u"/static/images/upgrade.png", + width = u"152", height = u"51", + alt = u"Upgrade", + ), + ) or Div( + Img( + src = u"/static/images/sign_up.png", + width = u"138", height = u"51", + alt = u"Sign Up", + ), + ), + P( + """ + Upgrade, downgrade, or cancel anytime. 60-day money-back guarantee. + """, + class_ = u"upgrade_subtitle", + ), + P( + Table( + self.fee_row( rate_plans, user ), + Tr( + Td( u"Included storage space", class_ = u"feature_name" ), + [ Td( + plan[ u"storage_quota_bytes" ] // MEGABYTE, " MB", + ) for plan in rate_plans ], + ), + Tr( + Td( u"Unlimited wiki notebooks", class_ = u"feature_name" ), + [ Td( + Img( src = u"/static/images/check.png", width = u"20", height = u"17" ), + ) for plan in rate_plans ], + ), + Tr( + Td( u"Friendly email support", class_ = u"feature_name" ), + [ Td( + Img( src = u"/static/images/check.png", width = u"20", height = u"17" ), + ) for plan in rate_plans ], + ), + Tr( + Td( u"Invite people to view your wiki", class_ = u"feature_name" ), + [ Td( + Img( src = u"/static/images/check.png", width = u"20", height = u"17" ), + ) for plan in rate_plans ], + ), + Tr( + Td( u"Invite people to edit your wiki", class_ = u"feature_name" ), + [ Td( + plan[ u"notebook_collaboration" ] and + Img( src = u"/static/images/check.png", width = u"20", height = u"17" ) or u" ", + ) for plan in rate_plans ], + ), + Tr( + Td( u"Wiki access control", class_ = u"feature_name" ), + [ Td( + plan[ u"notebook_collaboration" ] and + Img( src = u"/static/images/check.png", width = u"20", height = u"17" ) or u" ", + ) for plan in rate_plans ], + ), + border = u"1", + id = u"upgrade_table", + ), + class_ = u"upgrade_table_area", + ), + + user and user.username and P( + u"You're currently subscribed to Luminotes %s." % + rate_plans[ user.rate_plan ][ u"name" ].capitalize(), + ( user.rate_plan > 0 ) and unsubscribe_button or None, + ) or None, + class_ = u"upgrade_area", + ), + + Div( + Div( + Img( + src = u"/static/images/more_room_to_stretch_out.png", + width = u"280", height = u"29", + alt = u"More room to stretch out", + ), + Ul( + Li( u"More room for your wiki notes." ), + Li( u"More room for your documents and files." ), + class_ = u"upgrade_text", + ), + Img( + src = u"/static/images/zero_hassle.png", + width = u"122", height = u"29", + alt = u"Zero hassle", + ), + Ul( + Li( u"Cancel online anytime without losing access to your wiki." ), + Li( u"60-day money-back guarantee. No questions asked." ), + Li( u"No lock-in: Download your entire wiki anytime." ), + class_ = u"upgrade_text", + ), + class_= u"upgrade_right_area", + ), + + Div( + Img( + src = u"/static/images/more_collaboration.png", + width = u"204", height = u"29", + alt = u"More collaboration", + ), + P( + Ul( + Li( u"Invite specific people to collaborate on your wiki." ), + Li( u"Decide who can edit and who can only view." ), + Li( u"Invite as many people as you want. They only need free Luminotes accounts." ), + Li( u"Revoke access with a single click." ), + Li( u"Share only the notebooks you want to share. Keep the others private." ), + class_ = u"upgrade_text", + ), + ), + class_= u"upgrade_left_area", + ), + + P( + Table( + self.fee_row( rate_plans, user, include_blank = False ), + Tr( + [ Td( + plan[ u"storage_quota_bytes" ] // MEGABYTE, " MB", + ) for plan in rate_plans ], + ), + border = u"1", + id = u"upgrade_table_small", + ), + class_= u"upgrade_table_area", + ), + + Div( + P( + Span( u"Have a question before you sign up?", 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", + ), + ), + ) + + def fee_row( self, rate_plans, user, include_blank = True ): + return Tr( + include_blank and Th( u" " ) or None, + [ Th( + plan[ u"name" ].capitalize(), + plan[ u"fee" ] and Div( + Span( + u"$%s" % plan[ u"fee" ], + Span( u"/month", class_ = u"month_text" ), + class_ = u"price_text", + separator = u"", + ), + user and user.username and user.rate_plan != index and plan.get( u"button" ).strip() and plan.get( u"button" ) % user.object_id, + ) or None, + ( not user or user.username in ( u"anonymous", None ) ) and Div( + A( + Img( src = u"/static/images/sign_up_button.png", width = "76", height = "23" ), + href = u"/sign_up?plan=%s" % index, + ), + class_ = u"sign_up_button_area", + ) or None, + class_ = u"plan_name", + ) for ( index, plan ) in enumerate( rate_plans ) ], + ) diff --git a/view/User_area.py b/view/User_area.py index 5dd0cb4..90947dc 100644 --- a/view/User_area.py +++ b/view/User_area.py @@ -17,14 +17,14 @@ class User_area( Div ): user.username and Span( A( u"upgrade", - href = u"/upgrade", + href = u"/pricing", title = u"Upgrade your Luminotes account.", ), " | ", ) or Span( A( u"sign up", - href = u"/sign_up", + href = u"/pricing", title = u"Sign up for a real Luminotes account.", ), " | ",