Skip to content

Commit

Permalink
[gtasks] Fix synchronization of due dates, notes
Browse files Browse the repository at this point in the history
  • Loading branch information
bergercookie committed Dec 22, 2023
1 parent 13dde2c commit 69af6af
Show file tree
Hide file tree
Showing 6 changed files with 33 additions and 48 deletions.
1 change: 0 additions & 1 deletion syncall/caldav/caldav_side.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ class CaldavSide(SyncSide):
]

_date_keys = ["end", "start", "last-modified"]
_date_format = "%Y-%m-%d"

def __init__(self, client: caldav.DAVClient, calendar_name: str) -> None:
super().__init__(name="caldav", fullname="Caldav")
Expand Down
1 change: 0 additions & 1 deletion syncall/google/gcal_side.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ class GCalSide(GoogleSide):
]

_date_keys = ["end", "start", "updated"]
_date_format = "%Y-%m-%d"

def __init__(
self,
Expand Down
39 changes: 20 additions & 19 deletions syncall/google/gtasks_side.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,14 @@ class GTasksSide(GoogleSide):
ID_KEY = "id"
TITLE_KEY = "title"
LAST_MODIFICATION_KEY = "updated"
# don't put the "due" key for comparison
# due key holds the date but not the time that the use has set from the UI so we cannot
# really use it for bi-synchronization.
#
# https://stackoverflow.com/questions/65956873/google-task-api-due-field
_identical_comparison_keys = ["title", "notes", "status"]

_date_keys = ["due", "updated"]
_date_format = "%Y-%m-%d"
_date_keys = ["updated"]

def __init__(
self,
Expand Down Expand Up @@ -212,27 +216,24 @@ def last_modification_key(cls) -> str:
return cls.LAST_MODIFICATION_KEY

@staticmethod
def get_task_due_time(item: dict) -> datetime.datetime:
"""
Return the datetime on which task is due in datetime format.
def _parse_dt_or_none(item: GTasksItem, field: str) -> Optional[datetime.datetime]:
"""Return the datetime on which task was completed in datetime format."""
if (dt := item.get(field)) is not None:
dt_dt = GTasksSide.parse_datetime(dt)
assert isinstance(dt_dt, datetime.datetime)
return dt_dt
else:
return None

"""
dt = GTasksSide.parse_datetime(item["due"])
return dt
@staticmethod
def get_task_due_time(item: GTasksItem) -> Optional[datetime.datetime]:
"""Return the datetime on which task is due in datetime format."""
return GTasksSide._parse_dt_or_none(item=item, field="due")

@staticmethod
def get_task_completed_time(item: GTasksItem) -> Optional[datetime.datetime]:
"""
Return the datetime on which task was completed in datetime format.
"""
if (completed_time := item.get("completed")) is not None:
dt = GTasksSide.parse_datetime(completed_time)

assert isinstance(dt, datetime.datetime)
return dt
else:
return None
"""Return the datetime on which task was completed in datetime format."""
return GTasksSide._parse_dt_or_none(item=item, field="completed")

@staticmethod
def format_datetime(dt: datetime.datetime) -> str:
Expand Down
1 change: 0 additions & 1 deletion syncall/scripts/tw_gtasks_sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,6 @@ def convert_B_to_A(*args, **kargs):
return convert_tw_to_gtask(
*args,
**kargs,
prefer_scheduled_date=prefer_scheduled_date,
)

convert_B_to_A.__doc__ = convert_tw_to_gtask.__doc__
Expand Down
37 changes: 12 additions & 25 deletions syncall/tw_gtasks_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

def convert_tw_to_gtask(
tw_item: Item,
prefer_scheduled_date: bool = False,
) -> Item:
"""TW -> GTasks conversion."""
assert all(
Expand All @@ -17,32 +16,15 @@ def convert_tw_to_gtask(

gtasks_item = {}

# Title
# title
gtasks_item["title"] = tw_item["description"]

# Status
# status
gtasks_item["status"] = "needsAction" if tw_item["status"] == "pending" else "completed"

# Notes
# notes
if annotations_str := get_tw_annotations_as_str(tw_item):
gtasks_item["notes"] = annotations_str
date_keys = ["scheduled", "due"] if prefer_scheduled_date else ["due", "scheduled"]

# handle dates ---------------------------------------------------------------------------
# walk through the date_keys using the first of them that's present in the item at hand.
# - if 'scheduled' date is prefered we set task due date to scheduled
# - if 'due' date is present we set task due date to it
# - otherwise we don't set due date at all
for date_key in date_keys:
if date_key in tw_item.keys():
logger.trace(
f'Using "{date_key}" date for {tw_item["uuid"]} for setting the due date of'
" the task"
)
gtasks_item["due"] = GTasksSide.format_datetime(
GTasksSide.parse_datetime(tw_item[date_key])
)
break

# update time
if "modified" in tw_item.keys():
Expand Down Expand Up @@ -103,13 +85,18 @@ def convert_gtask_to_tw(
else:
date_key = "due"

end_time = GTasksSide.get_task_completed_time(gtasks_item)
tw_item[date_key] = end_time
# due/scheduled date
due_date = GTasksSide.get_task_due_time(gtasks_item)
if due_date is not None:
tw_item[date_key] = due_date

# end date
end_date = GTasksSide.get_task_completed_time(gtasks_item)
if end_date is not None:
tw_item["end"] = end_date

# update time
if "updated" in gtasks_item.keys():
tw_item["modified"] = GTasksSide.parse_datetime(gtasks_item["updated"])

# NOTE(kisseliov): consider adding custom UDAs for Google Tasks to handle positions and
# hierarchy
return tw_item
2 changes: 1 addition & 1 deletion syncall/tw_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def extract_tw_fields_from_string(s: str) -> Tuple[Sequence[str], str, Optional[
uuid = None

# strip whitespaces, empty lines
lines = [line.strip() for line in s.split("\n") if line][1:]
lines = [line.strip() for line in s.split("\n") if line][0:]
i = 0
for i, line in enumerate(lines):
parts = line.split(":", maxsplit=1)
Expand Down

0 comments on commit 69af6af

Please sign in to comment.