remove categories; not sure about summaries rn
This commit is contained in:
parent
3c422f363a
commit
855d9ee0f8
@ -40,7 +40,7 @@ def generate_needed_tasks():
|
||||
to_create.append(
|
||||
{
|
||||
"text": g.template.format(next=next),
|
||||
"category": "recurring",
|
||||
"project": "recurring",
|
||||
"due": next,
|
||||
}
|
||||
)
|
||||
|
@ -6,11 +6,6 @@ from ..db import db, Task, Category, SavedSearch
|
||||
from .. import config
|
||||
|
||||
|
||||
def category_lookup(category):
|
||||
if category:
|
||||
category, _ = Category.get_or_create(name=category)
|
||||
return category.id
|
||||
|
||||
|
||||
def get_task(item_id: int) -> Task:
|
||||
return Task.get_by_id(item_id)
|
||||
@ -18,19 +13,18 @@ def get_task(item_id: int) -> Task:
|
||||
|
||||
def add_task(
|
||||
text: str,
|
||||
category: str,
|
||||
status: str,
|
||||
due: datetime | None = None,
|
||||
type: str = "",
|
||||
project: str = "",
|
||||
) -> Task:
|
||||
"""
|
||||
Add a new task to the database.
|
||||
Returns the created task instance.
|
||||
"""
|
||||
with db.atomic():
|
||||
category_id = category_lookup(category)
|
||||
task = Task.create(
|
||||
text=text, type=type, status=status, due=due, category_id=category_id
|
||||
text=text, type=type, status=status, due=due, project=project
|
||||
)
|
||||
return task
|
||||
|
||||
@ -40,8 +34,6 @@ def update_task(
|
||||
**kwargs,
|
||||
) -> Task:
|
||||
with db.atomic():
|
||||
if category := kwargs.pop("category", None):
|
||||
kwargs["category_id"] = category_lookup(category)
|
||||
query = Task.update(kwargs).where(Task.id == item_id)
|
||||
query.execute()
|
||||
task = Task.get_by_id(item_id)
|
||||
@ -82,18 +74,18 @@ def _parse_sort_string(sort_string, status_order):
|
||||
|
||||
def get_tasks(
|
||||
search_text: str | None = None,
|
||||
category: int | None = None,
|
||||
statuses: tuple[str] | None = None,
|
||||
projects: tuple[str] | None = None,
|
||||
sort: str = "",
|
||||
) -> list[Task]:
|
||||
query = Task.select().where(~Task.deleted)
|
||||
|
||||
if search_text:
|
||||
query = query.where(fn.Lower(Task.text).contains(search_text.lower()))
|
||||
if category:
|
||||
query = query.where(Task.category == Category.get(name=category))
|
||||
if statuses:
|
||||
query = query.where(Task.status.in_(statuses))
|
||||
if projects:
|
||||
query = query.where(Task.project.in_(projects))
|
||||
|
||||
sort_expressions = _parse_sort_string(sort, statuses)
|
||||
query = query.order_by(*sort_expressions)
|
||||
|
11
src/tt/db.py
11
src/tt/db.py
@ -26,18 +26,11 @@ class BaseModel(Model):
|
||||
database = db
|
||||
|
||||
|
||||
class Category(BaseModel):
|
||||
name = CharField(unique=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Task(BaseModel):
|
||||
text = TextField()
|
||||
status = CharField()
|
||||
due = DateTimeField(null=True)
|
||||
category = ForeignKeyField(Category, backref="tasks", null=True)
|
||||
type = CharField()
|
||||
project = CharField()
|
||||
created_at = DateTimeField(default=datetime.now)
|
||||
@ -112,7 +105,5 @@ class TaskGenerator(BaseModel):
|
||||
|
||||
def initialize_db():
|
||||
db.connect()
|
||||
db.create_tables([Category, Task, SavedSearch, TaskGenerator])
|
||||
if not Category.select().exists():
|
||||
Category.create(name="default")
|
||||
db.create_tables([Task, SavedSearch, TaskGenerator])
|
||||
db.close()
|
||||
|
@ -1,43 +0,0 @@
|
||||
import csv
|
||||
from datetime import datetime
|
||||
from tt.db import initialize_db, Task, Category
|
||||
from tt.config import STATUSES
|
||||
|
||||
|
||||
def import_tasks_from_csv(filename: str):
|
||||
initialize_db()
|
||||
|
||||
with open(filename, "r") as f:
|
||||
reader = csv.DictReader(f)
|
||||
|
||||
for row in reader:
|
||||
# Parse the due date if it exists and isn't empty
|
||||
due_date = None
|
||||
if row["due"] and row["due"].strip():
|
||||
try:
|
||||
due_date = datetime.strptime(row["due"].strip(), "%Y-%m-%d")
|
||||
except ValueError:
|
||||
print(f"Warning: Couldn't parse '{row['due']}', skipping due date")
|
||||
|
||||
# Validate status
|
||||
status = row["status"].lower() if row["status"] else "zero"
|
||||
if status not in STATUSES:
|
||||
print(f"Warning: Invalid status '{status}', defaulting to 'zero'")
|
||||
status = "zero"
|
||||
|
||||
category_id = None
|
||||
if row["category"].strip():
|
||||
category_name = row["category"].strip()
|
||||
category, _ = Category.get_or_create(
|
||||
name=category_name, defaults={"description": None}
|
||||
)
|
||||
category_id = category.id
|
||||
|
||||
Task.create(
|
||||
text=row["task"],
|
||||
type=row["type"],
|
||||
status=status,
|
||||
due=due_date,
|
||||
category_id=category_id,
|
||||
)
|
||||
print(f"Imported task: {row['task']}")
|
@ -71,7 +71,7 @@ class TT(TableEditor):
|
||||
def refresh_items(self):
|
||||
items = get_tasks(
|
||||
self.search_query,
|
||||
category=self.filters.get("category"),
|
||||
projects=self.filters.get("project", "").split(","),
|
||||
statuses=self.filters.get("status", "").split(",")
|
||||
if "status" in self.filters
|
||||
else None,
|
||||
|
@ -7,10 +7,10 @@ import subprocess
|
||||
|
||||
def filter_to_string(filters, search_query):
|
||||
pieces = []
|
||||
category = filters.get("category")
|
||||
project = filters.get("project")
|
||||
status = filters.get("status")
|
||||
if category:
|
||||
pieces += [f" category:{category}"]
|
||||
if project:
|
||||
pieces += [f" project:{project}"]
|
||||
if status:
|
||||
pieces += [f" status:{status}"]
|
||||
if search_query:
|
||||
|
Loading…
Reference in New Issue
Block a user