witten
/
luminotes
Archived
1
0
Fork 0

No longer sending quite as much data in response to /users/current requests.

Now the client has to explicitly request the inclusion of startup notes.

Also no longer including startup notes or revision lists with every single
serialized Notebook.
This commit is contained in:
Dan Helfman 2007-08-27 22:37:22 +00:00
parent bbc3f11914
commit fd175aa85d
8 changed files with 89 additions and 22 deletions

View File

@ -123,6 +123,7 @@ class Notebooks( object ):
yield dict(
notebook = notebook,
startup_notes = notebook.startup_notes,
note = note,
)

View File

@ -5,7 +5,7 @@ from model.Notebook import Notebook
from model.Note import Note
from Scheduler import Scheduler
from Expose import expose
from Validate import validate, Valid_string, Validation_error
from Validate import validate, Valid_string, Valid_bool, Validation_error
from Database import Valid_id
from Updater import update_client, wait_for_update
from Expire import strongly_expire
@ -259,13 +259,16 @@ class Users( object ):
@async
@update_client
@validate(
include_startup_notes = Valid_bool(),
user_id = Valid_id( none_okay = True ),
)
def current( self, user_id ):
def current( self, include_startup_notes, user_id ):
"""
Return information on the currently logged-in user. If not logged in, default to the anonymous
user.
@type include_startup_notes: bool
@param include_startup_notes: True to return startup notes for the first notebook
@type user_id: unicode
@param user_id: id of current logged-in user (if any), determined by @grab_user_id
@rtype: json dict
@ -295,6 +298,7 @@ class Users( object ):
yield dict(
user = user,
notebooks = notebooks,
startup_notes = include_startup_notes and len( notebooks ) > 0 and notebooks[ 0 ].startup_notes or [],
http_url = self.__http_url,
)

View File

@ -93,10 +93,11 @@ class Test_notebooks( Test_controller ):
)
notebook = result[ "notebook" ]
startup_notes = result[ "startup_notes" ]
assert notebook.object_id == self.notebook.object_id
assert len( notebook.startup_notes ) == 1
assert notebook.startup_notes[ 0 ] == self.note
assert len( startup_notes ) == 1
assert startup_notes[ 0 ] == self.note
def test_contents_with_note( self ):
self.login()
@ -107,10 +108,11 @@ class Test_notebooks( Test_controller ):
)
notebook = result[ "notebook" ]
startup_notes = result[ "startup_notes" ]
assert notebook.object_id == self.notebook.object_id
assert len( notebook.startup_notes ) == 1
assert notebook.startup_notes[ 0 ] == self.note
assert len( startup_notes ) == 1
assert startup_notes[ 0 ] == self.note
note = result[ "note" ]
@ -129,10 +131,11 @@ class Test_notebooks( Test_controller ):
)
notebook = result[ "notebook" ]
startup_notes = result[ "startup_notes" ]
assert notebook.object_id == self.notebook.object_id
assert len( notebook.startup_notes ) == 1
assert notebook.startup_notes[ 0 ] == self.note
assert len( startup_notes ) == 1
assert startup_notes[ 0 ] == self.note
note = result[ "note" ]

View File

@ -3,6 +3,7 @@ from Test_controller import Test_controller
from controller.Scheduler import Scheduler
from model.User import User
from model.Notebook import Notebook
from model.Note import Note
class Test_users( Test_controller ):
@ -36,6 +37,10 @@ class Test_users( Test_controller ):
self.database.next_id( self.scheduler.thread )
self.anon_notebook = Notebook( ( yield Scheduler.SLEEP ), u"anon notebook" )
self.database.next_id( self.scheduler.thread )
self.startup_note = Note( ( yield Scheduler.SLEEP ), u"contents go here" )
self.anon_notebook.add_note( self.startup_note )
self.anon_notebook.add_startup_note( self.startup_note )
self.database.next_id( self.scheduler.thread )
self.user = User( ( yield Scheduler.SLEEP ), self.username, self.password, self.email_address, self.notebooks )
@ -57,7 +62,7 @@ class Test_users( Test_controller ):
assert result[ u"redirect" ].startswith( u"/notebooks/" )
assert result[ u"authenticated" ]
def test_current_after_signup( self ):
def test_current_after_signup( self, include_startup_notes = False ):
result = self.http_post( "/users/signup", dict(
username = self.new_username,
password = self.new_password,
@ -69,7 +74,10 @@ class Test_users( Test_controller ):
new_notebook_id = result[ u"redirect" ].split( u"/notebooks/" )[ -1 ]
result = self.http_get( "/users/current", session_id = session_id )
result = self.http_get(
"/users/current?include_startup_notes=%s" % include_startup_notes,
session_id = session_id,
)
assert result[ u"user" ].username == self.new_username
notebooks = result[ u"notebooks" ]
@ -83,6 +91,16 @@ class Test_users( Test_controller ):
assert len( notebook.notes ) == 1
assert len( notebook.startup_notes ) == 1
startup_notes = result[ "startup_notes" ]
if include_startup_notes:
assert len( startup_notes ) == 1
assert startup_notes[ 0 ] == self.startup_note
else:
assert startup_notes == []
def test_current_with_startup_notes_after_signup( self ):
self.test_current_after_signup( include_startup_notes = True )
def test_signup_with_different_passwords( self ):
result = self.http_post( "/users/signup", dict(
username = self.new_username,
@ -130,7 +148,7 @@ class Test_users( Test_controller ):
assert result[ u"redirect" ] == self.settings[ u"global" ].get( u"luminotes.http_url" ) + u"/"
assert result[ u"deauthenticated" ]
def test_current_after_login( self ):
def test_current_after_login( self, include_startup_notes = False ):
result = self.http_post( "/users/login", dict(
username = self.username,
password = self.password,
@ -138,15 +156,40 @@ class Test_users( Test_controller ):
) )
session_id = result[ u"session_id" ]
result = self.http_get( "/users/current", session_id = session_id )
result = self.http_get(
"/users/current?include_startup_notes=%s" % include_startup_notes,
session_id = session_id,
)
assert result[ u"user" ] == self.user
assert result[ u"notebooks" ] == [ self.anon_notebook ] + self.notebooks
assert result[ u"http_url" ] == self.settings[ u"global" ].get( u"luminotes.http_url" )
def test_current_without_login( self ):
result = self.http_get( "/users/current" )
startup_notes = result[ "startup_notes" ]
if include_startup_notes:
assert len( startup_notes ) == 1
assert startup_notes[ 0 ] == self.startup_note
else:
assert startup_notes == []
def test_current_with_startup_notes_after_login( self ):
self.test_current_after_login( include_startup_notes = True )
def test_current_without_login( self, include_startup_notes = False ):
result = self.http_get(
"/users/current?include_startup_notes=%s" % include_startup_notes,
)
assert result[ u"user" ].username == "anonymous"
assert result[ u"notebooks" ] == [ self.anon_notebook ]
assert result[ u"http_url" ] == self.settings[ u"global" ].get( u"luminotes.http_url" )
startup_notes = result[ "startup_notes" ]
if include_startup_notes:
assert len( startup_notes ) == 1
assert startup_notes[ 0 ] == self.startup_note
else:
assert startup_notes == []
def test_current_with_startup_notes_without_login( self ):
self.test_current_without_login( include_startup_notes = True )

View File

@ -162,10 +162,14 @@ class Notebook( Persistent ):
def to_dict( self ):
d = Persistent.to_dict( self )
# as an optimization, don't include the revisions list because it's not
# currently used anywhere for Notebook objects
del d[ "revisions_list" ]
d.update( dict(
name = self.__name,
trash = self.__trash,
startup_notes = copy( self.startup_notes ),
read_write = True,
) )

View File

@ -59,3 +59,6 @@ class Test_note( object ):
assert d.get( "contents" ) == self.contents
assert d.get( "title" ) == self.title
assert d.get( "deleted_from" ) == None
assert d.get( "object_id" ) == self.note.object_id
assert d.get( "revision" )
assert d.get( "revisions_list" )

View File

@ -158,8 +158,10 @@ class Test_notebook( object ):
assert d.get( "name" ) == self.name
assert d.get( "trash" ) == self.trash
assert d.get( "startup_notes" ) == []
assert d.get( "read_write" ) == True
assert d.get( "object_id" ) == self.notebook.object_id
assert d.get( "revision" )
assert d.get( "revisions_list" ) == None
def test_to_dict_with_startup_notes( self ):
self.notebook.add_note( self.note )
@ -169,5 +171,7 @@ class Test_notebook( object ):
assert d.get( "name" ) == self.name
assert d.get( "trash" ) == self.trash
assert d.get( "startup_notes" ) == [ self.note ]
assert d.get( "read_write" ) == True
assert d.get( "object_id" ) == self.notebook.object_id
assert d.get( "revision" )
assert d.get( "revisions_list" ) == None

View File

@ -25,10 +25,15 @@ function Wiki() {
},
function( result ) { self.populate( result ); }
);
var include_startup_notes = false;
} else {
var include_startup_notes = true;
}
// get info on the current user (logged-in or anonymous)
this.invoker.invoke( "/users/current", "GET", null,
this.invoker.invoke( "/users/current", "GET", {
"include_startup_notes": include_startup_notes
},
function( result ) { self.display_user( result ); }
);
}
@ -41,7 +46,7 @@ Wiki.prototype.display_user = function ( result ) {
// if no notebook id was requested, then just display the user's default notebook
if ( !this.notebook_id ) {
this.notebook_id = result.notebooks[ 0 ].object_id;
this.populate( { "notebook" : result.notebooks[ 0 ] } );
this.populate( { "notebook" : result.notebooks[ 0 ], "startup_notes": result.startup_notes } );
}
if ( result.user.username == "anonymous" )
@ -130,8 +135,8 @@ Wiki.prototype.populate = function ( result ) {
// create an editor for each startup note in the received notebook, focusing the first one
var focus = true;
for ( var i in this.notebook.startup_notes ) {
var note = this.notebook.startup_notes[ i ];
for ( var i in result.startup_notes ) {
var note = result.startup_notes[ i ];
if ( !note ) continue;
this.startup_notes[ note.object_id ] = true;
@ -148,7 +153,7 @@ Wiki.prototype.populate = function ( result ) {
if ( result.note )
this.create_editor( result.note.object_id, result.note.contents, result.note.deleted_from, result.note.revisions_list, undefined, read_write, false, true );
if ( !this.notebook.trash && this.notebook.startup_notes.length == 0 && !result.note )
if ( !this.notebook.trash && result.startup_notes.length == 0 && !result.note )
this.display_message( "There are no notes here." )
}