102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
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()
|