diff --git a/controller/Notebooks.py b/controller/Notebooks.py
index 7506ab0..f6fdf80 100644
--- a/controller/Notebooks.py
+++ b/controller/Notebooks.py
@@ -313,22 +313,40 @@ class Notebooks( object ):
self.__database.load( note_id, self.__scheduler.thread )
note = ( yield Scheduler.SLEEP )
- # if the note is already in the database, load it and update it
- if note and note in notebook.notes:
- # check whether the provided note contents have been changed since the previous revision
- self.__database.load( note_id, self.__scheduler.thread, previous_revision )
- old_note = ( yield Scheduler.SLEEP )
-
+ # check whether the provided note contents have been changed since the previous revision
+ def update_note( current_notebook, old_note ):
# the note hasn't been changed, so bail without updating it
if contents == old_note.contents:
- previous_revision = note.revision
new_revision = None
# the note has changed, so update it
else:
- previous_revision = note.revision
notebook.update_note( note, contents )
new_revision = note.revision
- # the note is not already in the database, so create it
+
+ return new_revision
+
+ # if the note is already in the given notebook, load it and update it
+ if note and note in notebook.notes:
+ self.__database.load( note_id, self.__scheduler.thread, previous_revision )
+ old_note = ( yield Scheduler.SLEEP )
+
+ previous_revision = note.revision
+ new_revision = update_note( notebook, old_note )
+
+ # the note is not already in the given notebook, so look for it in the trash
+ elif note and notebook.trash and note in notebook.trash.notes:
+ self.__database.load( note_id, self.__scheduler.thread, previous_revision )
+ old_note = ( yield Scheduler.SLEEP )
+
+ # undelete the note, putting it back in the given notebook
+ previous_revision = note.revision
+ notebook.trash.remove_note( note )
+ note.deleted_from = None
+ notebook.add_note( note )
+
+ new_revision = update_note( notebook, old_note )
+
+ # otherwise, create a new note
else:
previous_revision = None
note = Note( note_id, contents )
diff --git a/controller/test/Test_notebooks.py b/controller/test/Test_notebooks.py
index 7e2b084..b11dbc1 100644
--- a/controller/test/Test_notebooks.py
+++ b/controller/test/Test_notebooks.py
@@ -302,7 +302,7 @@ class Test_notebooks( Test_controller ):
def test_save_note( self, startup = False ):
self.login()
- # save over an existing note supplying new contents and a new title
+ # save over an existing note, supplying new contents and a new title
previous_revision = self.note.revision
new_note_contents = u"
new title
new blah"
result = self.http_post( "/notebooks/save_note/", dict(
@@ -361,10 +361,70 @@ class Test_notebooks( Test_controller ):
def test_save_startup_note_without_login( self ):
self.test_save_note_without_login( startup = True )
+ def test_save_deleted_note( self ):
+ self.login()
+
+ result = self.http_post( "/notebooks/delete_note/", dict(
+ notebook_id = self.notebook.object_id,
+ note_id = self.note.object_id,
+ ), session_id = self.session_id )
+
+ # save over a deleted note, supplying new contents and a new title. this should cause the note
+ # to be automatically undeleted
+ previous_revision = self.note.revision
+ new_note_contents = u"new title
new blah"
+ result = self.http_post( "/notebooks/save_note/", dict(
+ notebook_id = self.notebook.object_id,
+ note_id = self.note.object_id,
+ contents = new_note_contents,
+ startup = False,
+ previous_revision = previous_revision,
+ ), session_id = self.session_id )
+
+ assert result[ "new_revision" ] and result[ "new_revision" ] != previous_revision
+ assert result[ "previous_revision" ] == previous_revision
+
+ # make sure the old title can no longer be loaded
+ result = self.http_post( "/notebooks/load_note_by_title/", dict(
+ notebook_id = self.notebook.object_id,
+ note_title = "my title",
+ ), session_id = self.session_id )
+
+ assert result[ "note" ] == None
+
+ # make sure the new title is now loadable from the notebook
+ result = self.http_post( "/notebooks/load_note_by_title/", dict(
+ notebook_id = self.notebook.object_id,
+ note_title = "new title",
+ ), session_id = self.session_id )
+
+ note = result[ "note" ]
+
+ assert note.object_id == self.note.object_id
+ assert note.title == self.note.title
+ assert note.contents == self.note.contents
+ assert note.deleted_from == None
+
+ # make sure the old title can no longer be loaded from the trash
+ result = self.http_post( "/notebooks/load_note_by_title/", dict(
+ notebook_id = self.notebook.trash.object_id,
+ note_title = "my title",
+ ), session_id = self.session_id )
+
+ assert result[ "note" ] == None
+
+ # make sure the new title is not loadable from the trash either
+ result = self.http_post( "/notebooks/load_note_by_title/", dict(
+ notebook_id = self.notebook.trash.object_id,
+ note_title = "new title",
+ ), session_id = self.session_id )
+
+ assert result[ "note" ] == None
+
def test_save_unchanged_note( self, startup = False ):
self.login()
- # save over an existing note supplying new contents and a new title
+ # save over an existing note, supplying new contents and a new title
previous_revision = self.note.revision
new_note_contents = u"new title
new blah"
self.http_post( "/notebooks/save_note/", dict(
@@ -401,6 +461,60 @@ class Test_notebooks( Test_controller ):
assert note.contents == self.note.contents
assert note.revision == previous_revision
+ def test_save_unchanged_deleted_note( self, startup = False ):
+ self.login()
+
+ result = self.http_post( "/notebooks/delete_note/", dict(
+ notebook_id = self.notebook.object_id,
+ note_id = self.note.object_id,
+ ), session_id = self.session_id )
+
+ # save over an existing deleted note, supplying new contents and a new title
+ previous_revision = self.note.revision
+ new_note_contents = u"new title
new blah"
+ self.http_post( "/notebooks/save_note/", dict(
+ notebook_id = self.notebook.object_id,
+ note_id = self.note.object_id,
+ contents = new_note_contents,
+ startup = startup,
+ previous_revision = previous_revision,
+ ), session_id = self.session_id )
+
+ # now attempt to save over that note again without changing the contents
+ previous_revision = self.note.revision
+ result = self.http_post( "/notebooks/save_note/", dict(
+ notebook_id = self.notebook.object_id,
+ note_id = self.note.object_id,
+ contents = new_note_contents,
+ startup = startup,
+ previous_revision = previous_revision,
+ ), session_id = self.session_id )
+
+ # assert that the note wasn't actually updated the second time
+ assert result[ "new_revision" ] == None
+ assert result[ "previous_revision" ] == previous_revision
+
+ result = self.http_post( "/notebooks/load_note_by_title/", dict(
+ notebook_id = self.notebook.object_id,
+ note_title = "new title",
+ ), session_id = self.session_id )
+
+ note = result[ "note" ]
+
+ assert note.object_id == self.note.object_id
+ assert note.title == self.note.title
+ assert note.contents == self.note.contents
+ assert note.revision == previous_revision
+ assert note.deleted_from == None
+
+ # make sure the note is not loadable from the trash
+ result = self.http_post( "/notebooks/load_note_by_title/", dict(
+ notebook_id = self.notebook.trash.object_id,
+ note_title = "new title",
+ ), session_id = self.session_id )
+
+ assert result[ "note" ] == None
+
def test_save_unchanged_note_with_startup_change( self, startup = False ):
self.login()