|  |  | @ -0,0 +1,69 @@ | 
			
		
	
		
			
				
					|  |  |  | 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 | 
			
		
	
		
			
				
					|  |  |  |  |