Fixed some subtle edge cases in controller.Notebooks.load_notebook().
This commit is contained in:
parent
f1b04d6e20
commit
99bebd6c98
|
@ -736,16 +736,17 @@ class Users( object ):
|
||||||
@return: the loaded notebook if the user has access to it, None otherwise
|
@return: the loaded notebook if the user has access to it, None otherwise
|
||||||
"""
|
"""
|
||||||
anonymous = self.__database.select_one( User, User.sql_load_by_username( u"anonymous" ), use_cache = True )
|
anonymous = self.__database.select_one( User, User.sql_load_by_username( u"anonymous" ), use_cache = True )
|
||||||
notebook = self.__database.select_one( Notebook, anonymous.sql_load_notebooks( notebook_id = notebook_id ) )
|
user = user_id and self.__database.load( User, user_id ) or anonymous
|
||||||
user = None
|
notebook = None
|
||||||
|
|
||||||
if not notebook and user_id:
|
|
||||||
user = self.__database.load( User, user_id )
|
|
||||||
if not user:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
# first try loading the notebook as the given user (if any)
|
||||||
|
if user:
|
||||||
notebook = self.__database.select_one( Notebook, user.sql_load_notebooks( notebook_id = notebook_id ) )
|
notebook = self.__database.select_one( Notebook, user.sql_load_notebooks( notebook_id = notebook_id ) )
|
||||||
|
|
||||||
|
# if that doesn't work, try loading the notebook as the anonymous user
|
||||||
|
if notebook is None:
|
||||||
|
notebook = self.__database.select_one( Notebook, anonymous.sql_load_notebooks( notebook_id = notebook_id ) )
|
||||||
|
|
||||||
# if the user has no access to this notebook, bail
|
# if the user has no access to this notebook, bail
|
||||||
if notebook is None:
|
if notebook is None:
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -1065,6 +1065,19 @@ class Test_users( Test_controller ):
|
||||||
assert notebook
|
assert notebook
|
||||||
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
|
def test_load_notebook_read_write_own_notes_inherit_anonymous( self ):
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = True, owner = False, own_notes_only = True,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id, read_write = True )
|
||||||
|
|
||||||
|
assert notebook
|
||||||
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
def test_load_notebook_read_write_own_notes_anonymous( self ):
|
def test_load_notebook_read_write_own_notes_anonymous( self ):
|
||||||
self.database.execute( self.anonymous.sql_update_access(
|
self.database.execute( self.anonymous.sql_update_access(
|
||||||
self.notebooks[ 0 ].object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES, owner = False,
|
self.notebooks[ 0 ].object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES, owner = False,
|
||||||
|
@ -1113,6 +1126,18 @@ class Test_users( Test_controller ):
|
||||||
|
|
||||||
assert notebook is None
|
assert notebook is None
|
||||||
|
|
||||||
|
def test_load_notebook_owner_own_notes_inherit_anonymous( self ):
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = True, owner = False, own_notes_only = True,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id, owner = True )
|
||||||
|
|
||||||
|
assert notebook is None
|
||||||
|
|
||||||
def test_load_notebook_owner_own_notes_anonymous( self ):
|
def test_load_notebook_owner_own_notes_anonymous( self ):
|
||||||
self.database.execute( self.anonymous.sql_update_access(
|
self.database.execute( self.anonymous.sql_update_access(
|
||||||
self.notebooks[ 0 ].object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES, owner = False,
|
self.notebooks[ 0 ].object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES, owner = False,
|
||||||
|
@ -1161,6 +1186,18 @@ class Test_users( Test_controller ):
|
||||||
|
|
||||||
assert notebook is None
|
assert notebook is None
|
||||||
|
|
||||||
|
def test_load_notebook_full_own_notes_inherit_anonymous( self ):
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = True, owner = False, own_notes_only = True,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id, read_write = True, owner = True )
|
||||||
|
|
||||||
|
assert notebook is None
|
||||||
|
|
||||||
def test_load_notebook_full_own_notes_anonymous( self ):
|
def test_load_notebook_full_own_notes_anonymous( self ):
|
||||||
self.database.execute( self.anonymous.sql_update_access(
|
self.database.execute( self.anonymous.sql_update_access(
|
||||||
self.notebooks[ 0 ].object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES, owner = False,
|
self.notebooks[ 0 ].object_id, read_write = Notebook.READ_WRITE_FOR_OWN_NOTES, owner = False,
|
||||||
|
@ -1197,6 +1234,27 @@ class Test_users( Test_controller ):
|
||||||
assert notebook
|
assert notebook
|
||||||
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
|
def test_load_notebook_with_note_id_own_notes_inherit_anonymous( self ):
|
||||||
|
note = Note.create(
|
||||||
|
self.database.next_id( Note ), u"<h3>hi</h3>",
|
||||||
|
notebook_id = self.notebooks[ 0 ].object_id,
|
||||||
|
user_id = self.user.object_id,
|
||||||
|
)
|
||||||
|
self.database.save( note )
|
||||||
|
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = True, owner = False, own_notes_only = True,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id,
|
||||||
|
note_id = note.object_id )
|
||||||
|
|
||||||
|
assert notebook
|
||||||
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
def test_load_notebook_with_note_id_own_notes_anonymous( self ):
|
def test_load_notebook_with_note_id_own_notes_anonymous( self ):
|
||||||
note = Note.create(
|
note = Note.create(
|
||||||
self.database.next_id( Note ), u"<h3>hi</h3>",
|
self.database.next_id( Note ), u"<h3>hi</h3>",
|
||||||
|
@ -1289,6 +1347,23 @@ class Test_users( Test_controller ):
|
||||||
assert notebook
|
assert notebook
|
||||||
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
|
def test_load_notebook_with_stub_note_own_notes_inherit_anonymous( self ):
|
||||||
|
# don't fully create a note, but reserve an id for it
|
||||||
|
note_id = self.database.next_id( Note )
|
||||||
|
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = True, owner = False, own_notes_only = True,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id,
|
||||||
|
note_id = note_id )
|
||||||
|
|
||||||
|
assert notebook
|
||||||
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
def test_load_notebook_with_stub_note_own_notes_anonymous( self ):
|
def test_load_notebook_with_stub_note_own_notes_anonymous( self ):
|
||||||
# don't fully create a note, but reserve an id for it
|
# don't fully create a note, but reserve an id for it
|
||||||
note_id = self.database.next_id( Note )
|
note_id = self.database.next_id( Note )
|
||||||
|
@ -1353,6 +1428,27 @@ class Test_users( Test_controller ):
|
||||||
assert notebook
|
assert notebook
|
||||||
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
|
def test_load_notebook_read_write_with_note_id_inherit_anonymous( self ):
|
||||||
|
note = Note.create(
|
||||||
|
self.database.next_id( Note ), u"<h3>hi</h3>",
|
||||||
|
notebook_id = self.notebooks[ 0 ].object_id,
|
||||||
|
user_id = self.anonymous.object_id,
|
||||||
|
)
|
||||||
|
self.database.save( note )
|
||||||
|
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = True, owner = False,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id,
|
||||||
|
note_id = note.object_id )
|
||||||
|
|
||||||
|
assert notebook
|
||||||
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
def test_load_notebook_read_write_with_note_id_anonymous( self ):
|
def test_load_notebook_read_write_with_note_id_anonymous( self ):
|
||||||
note = Note.create(
|
note = Note.create(
|
||||||
self.database.next_id( Note ), u"<h3>hi</h3>",
|
self.database.next_id( Note ), u"<h3>hi</h3>",
|
||||||
|
@ -1439,6 +1535,27 @@ class Test_users( Test_controller ):
|
||||||
assert notebook
|
assert notebook
|
||||||
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
|
def test_load_notebook_read_only_with_note_id_inherit_anonymous( self ):
|
||||||
|
note = Note.create(
|
||||||
|
self.database.next_id( Note ), u"<h3>hi</h3>",
|
||||||
|
notebook_id = self.notebooks[ 0 ].object_id,
|
||||||
|
user_id = self.anonymous.object_id,
|
||||||
|
)
|
||||||
|
self.database.save( note )
|
||||||
|
|
||||||
|
self.database.execute( self.anonymous.sql_save_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id, read_write = False, owner = False,
|
||||||
|
) )
|
||||||
|
self.database.execute( self.user.sql_remove_notebook(
|
||||||
|
self.notebooks[ 0 ].object_id
|
||||||
|
) )
|
||||||
|
|
||||||
|
notebook = cherrypy.root.users.load_notebook( self.user.object_id, self.notebooks[ 0 ].object_id,
|
||||||
|
note_id = note.object_id )
|
||||||
|
|
||||||
|
assert notebook
|
||||||
|
assert notebook.object_id == self.notebooks[ 0 ].object_id
|
||||||
|
|
||||||
def test_load_notebook_read_only_with_note_id_anonymous( self ):
|
def test_load_notebook_read_only_with_note_id_anonymous( self ):
|
||||||
note = Note.create(
|
note = Note.create(
|
||||||
self.database.next_id( Note ), u"<h3>hi</h3>",
|
self.database.next_id( Note ), u"<h3>hi</h3>",
|
||||||
|
|
Reference in New Issue
Block a user