from uuid import uuid1 from api import StandardNotesAPI class ItemManager: items = {} def map_items(self, response_items, metadata_only=False): DATA_KEYS = ['content', 'enc_item_key', 'auth_hash'] for response_item in response_items: uuid = response_item['uuid'] if response_item['deleted']: if uuid in self.items: del self.items[uuid] continue response_item['dirty'] = False if uuid not in self.items: self.items[uuid] = {} for key, value in response_item.items(): if metadata_only and key in DATA_KEYS: continue self.items[uuid][key] = value def sync_items(self): dirty_items = [item for uuid, item in self.items.items() if item['dirty']] # remove keys (note: this removes them from self.items as well) for item in dirty_items: item.pop('dirty', None) item.pop('updated_at', None) response = self.sn_api.sync(dirty_items) self.map_items(response['response_items']) self.map_items(response['saved_items'], metadata_only=True) def get_notes(self): notes = {} sorted_items = sorted( self.items.items(), key=lambda x: x[1]['created_at']) for uuid, item in sorted_items: if item['content_type'] == 'Note': note = item['content'] text = note['text'] # Add a new line so it outputs pretty if not text.endswith('\n'): text += '\n'; text = text.encode() # convert to binary data # remove title duplicates by adding a number to the end count = 0 while True: title = note['title'] + ('' if not count else ' ' + str(count + 1)) if title in notes: count += 1 else: break notes[title] = dict( text=text, created=item['created_at'], modified=item.get('updated_at', item['created_at']), uuid=item['uuid']) return notes def touch_note(self, uuid): item = self.items[uuid] item['dirty'] = True def write_note(self, uuid, text): item = self.items[uuid] item['content']['text'] = text.decode() # convert back to string item['dirty'] = True def create_note(self, name, time): uuid = str(uuid1()) content = dict(title=name, text='', references=[]) self.items[uuid] = dict(content_type='Note', dirty=True, auth_hash=None, uuid=uuid, created_at=time, updated_at=time, enc_item_key='', content=content) def rename_note(self, uuid, new_note_name): item = self.items[uuid] item['content']['title'] = new_note_name item['dirty'] = True def delete_note(self, uuid): item = self.items[uuid] item['deleted'] = True item['dirty'] = True def __init__(self, sn_api): self.sn_api = sn_api self.sync_items()