160 lines
4.8 KiB
Python
160 lines
4.8 KiB
Python
import sqlite3
|
|
|
|
from abcex import Abcex
|
|
from params import Params
|
|
|
|
|
|
class Model:
|
|
def __init__(self):
|
|
self.conn = sqlite3.connect('ztm.db')
|
|
self.conn.row_factory = sqlite3.Row
|
|
self.abcex = Abcex()
|
|
|
|
self.params = Params()
|
|
|
|
def get_tasks_by_tag(self, tag_name):
|
|
query = '''
|
|
SELECT t.* FROM task t
|
|
LEFT JOIN tag_task tgt ON t.id = tgt.task_id
|
|
LEFT JOIN tag tg ON tg.id = tgt.tag_id
|
|
WHERE tg.name = ?
|
|
'''
|
|
|
|
return self.conn.execute(query, tag_name)
|
|
|
|
def get_all_tasks(self, done=False, active=False):
|
|
done_query = ''
|
|
if done or self.params.get('done'):
|
|
done_query = 'AND t.done = 1'
|
|
|
|
active_query = ''
|
|
if active or self.params.get('active'):
|
|
active_query = 'AND t.active = 1'
|
|
|
|
query = '''
|
|
SELECT t.*, GROUP_CONCAT(g.name, ' ') AS tag_names FROM task t
|
|
LEFT JOIN tag_task tt ON tt.task_id = t.id
|
|
LEFT JOIN tag g ON g.id = tt.tag_id
|
|
WHERE 1 %s %s
|
|
GROUP BY t.id
|
|
''' % (done_query, active_query)
|
|
|
|
return self.conn.execute(query)
|
|
|
|
def create_task_draft(self, description):
|
|
query = '''
|
|
INSERT INTO task
|
|
(description, created_at)
|
|
VALUES
|
|
(?, DATETIME('now'))
|
|
'''
|
|
cursor = self.conn.cursor()
|
|
cursor.execute(query, (description,))
|
|
task_id = cursor.lastrowid
|
|
|
|
aid = self.abcex.encode(task_id)
|
|
cursor.execute('UPDATE task SET aid=? WHERE id=?', (aid, task_id))
|
|
|
|
self.conn.commit()
|
|
|
|
return aid
|
|
|
|
def get_task(self, aid):
|
|
query = 'SELECT t.* FROM task t WHERE t.aid = ?'
|
|
cursor = self.conn.cursor()
|
|
results = cursor.execute(query, (aid,))
|
|
task = dict(results.fetchone())
|
|
|
|
tquery = '''
|
|
SELECT t.* from tag t
|
|
LEFT JOIN tag_task tt ON t.id = tt.tag_id
|
|
WHERE tt.task_id = ?
|
|
'''
|
|
tags = cursor.execute(tquery, (task['id'],))
|
|
task['tags'] = [t for t in tags]
|
|
task['tag_names'] = [t['name'] for t in tags]
|
|
|
|
return task
|
|
|
|
def get_tags_not_in_task(self, task_id):
|
|
query = '''
|
|
SELECT t.* from tag t
|
|
WHERE t.id NOT IN (
|
|
SELECT t2.id from tag t2
|
|
LEFT JOIN tag_task tt ON t2.id = tt.tag_id
|
|
WHERE tt.task_id = ?
|
|
)
|
|
'''
|
|
cursor = self.conn.cursor()
|
|
return cursor.execute(query, (task_id,))
|
|
|
|
def save_content(self, aid, content):
|
|
cursor = self.conn.cursor()
|
|
cursor.execute('UPDATE task SET content=? WHERE aid=?', (content, aid))
|
|
self.conn.commit()
|
|
|
|
def toggle_long_term(self, aid):
|
|
cursor = self.conn.cursor()
|
|
cursor.execute('UPDATE task SET long_term=NOT long_term WHERE aid=?', (aid))
|
|
self.conn.commit()
|
|
|
|
def toggle_active(self, aid):
|
|
cursor = self.conn.cursor()
|
|
cursor.execute('UPDATE task SET active=NOT active WHERE aid=?', (aid))
|
|
self.conn.commit()
|
|
|
|
def toggle_done(self, aid):
|
|
cursor = self.conn.cursor()
|
|
cursor.execute('UPDATE task SET done=NOT done, finished_at=DATETIME(\'now\'), active=0 WHERE aid=?', (aid,))
|
|
self.conn.commit()
|
|
|
|
def create_tag(self, name):
|
|
query = 'INSERT INTO tag (name) VALUES (?)'
|
|
cursor = self.conn.cursor()
|
|
cursor.execute(query, (name,))
|
|
self.conn.commit()
|
|
|
|
return cursor.lastrowid
|
|
|
|
def get_all_tags(self):
|
|
query = 'SELECT t.* FROM tag t'
|
|
|
|
return self.conn.execute(query)
|
|
|
|
def get_tag(self, tid):
|
|
query = 'SELECT t.* FROM tag t WHERE t.id = ?'
|
|
cursor = self.conn.cursor()
|
|
results = cursor.execute(query, (tid,))
|
|
|
|
return results.fetchone()
|
|
|
|
def get_tag_by_name(self, name):
|
|
query = 'SELECT t.* FROM tag t WHERE t.name = ?'
|
|
cursor = self.conn.cursor()
|
|
results = cursor.execute(query, (name,))
|
|
|
|
return results.fetchone()
|
|
|
|
def remove_tag_by_name(self, name):
|
|
query = 'DELETE FROM tag WHERE name = ?'
|
|
cursor = self.conn.cursor()
|
|
cursor.execute(query, (name,))
|
|
self.conn.commit()
|
|
|
|
def link_tags_to_task(self, task_id, tag_names):
|
|
query = 'INSERT INTO tag_task (task_id, tag_id) VALUES (?, ?)'
|
|
cursor = self.conn.cursor()
|
|
for name in tag_names:
|
|
tag = self.get_tag_by_name(name)
|
|
cursor.execute(query, (task_id, tag['id']))
|
|
|
|
self.conn.commit()
|
|
|
|
def unlink_tags_from_task(self, task_id, tag_names):
|
|
query = 'DELETE FROM tag_task WHERE task_id = ? AND tag_id = ?'
|
|
cursor = self.conn.cursor()
|
|
for name in tag_names:
|
|
tag = self.get_tag_by_name(name)
|
|
cursor.execute(query, (task_id, tag['id']))
|
|
|
|
self.conn.commit()
|