import datetime
|
|
|
|
# Store the next available id for all new notes
|
|
last_id = 0
|
|
|
|
|
|
class Note:
|
|
"""Represent a note in the notebook. Match against a
|
|
string in searches and store tags for each note."""
|
|
|
|
def __init__(self, memo, tags=''):
|
|
"""initialize a note with memo and optional space-separated tags.
|
|
Automatically set the note's creation date and a unique id."""
|
|
self.memo = memo
|
|
self.tags = tags
|
|
self.creation_date = datetime.date.today()
|
|
global last_id
|
|
last_id += 1
|
|
self.id = last_id
|
|
|
|
def match(self, filter):
|
|
"""Determine if this note matches the filter text.
|
|
Return True if it matches, False otherwise.
|
|
Search is case sensitive and matches both text and tags."""
|
|
return filter in self.memo or filter in self.tags
|
|
|
|
|
|
class Notebook:
|
|
"""Represent a collection of notes that can be tagged, modified and
|
|
searched."""
|
|
|
|
def __init__(self):
|
|
"""Initialize a notebook with an empty list."""
|
|
self.notes = []
|
|
|
|
def new_note(self, memo, tags=''):
|
|
"""Create a new note and add it to the list."""
|
|
self.notes.append(Note(memo, tags))
|
|
|
|
def modify_memo(self, note_id, memo):
|
|
"""Find the note with the given id and change its
|
|
memo to the given value."""
|
|
note = self._find_note(note_id)
|
|
if note:
|
|
note.memo = memo
|
|
return True
|
|
return False
|
|
|
|
def modify_tags(self, note_id, tags):
|
|
"""Find the note with the given id and change its tags
|
|
to the given value."""
|
|
note = self._find_note(note_id)
|
|
if note:
|
|
note.tags = tags
|
|
return True
|
|
return False
|
|
|
|
def search(self, filter):
|
|
"""Find all notes that match the given filter string."""
|
|
return [note for note in self.notes if note.match(filter)]
|
|
|
|
def _find_note(self, note_id):
|
|
"""Locate the note with the given id."""
|
|
for note in self.notes:
|
|
if str(note.id) == str(note_id):
|
|
return note
|
|
return None
|
|
|
|
def remove_note(self, id):
|
|
"""Remove note(s) with given id from note list"""
|
|
if self._find_note(id):
|
|
removed = []
|
|
for index, note in enumerate(self.notes):
|
|
if str(note.id) == str(id):
|
|
removed.append(self.notes.pop(index))
|
|
self._set_id()
|
|
return removed
|
|
return False
|
|
|
|
def _set_id(self):
|
|
"""set global last_id to highest id found in notebook"""
|
|
id = 1
|
|
for note in self.notes:
|
|
if note.id > id:
|
|
id = note.id
|
|
global last_id
|
|
last_id = id
|
|
|