Tasks printed for multiple days
This commit is contained in:
parent
618b1641ff
commit
6f5d744628
106
jobs/tasks.py
106
jobs/tasks.py
@ -13,6 +13,9 @@ except ImportError:
|
|||||||
HAS_ICAL_DEPS = False
|
HAS_ICAL_DEPS = False
|
||||||
|
|
||||||
class TasksJob(Job):
|
class TasksJob(Job):
|
||||||
|
def __init__(self):
|
||||||
|
self.days_to_print = 1
|
||||||
|
|
||||||
def get_name(self):
|
def get_name(self):
|
||||||
return "UKOLY DNE"
|
return "UKOLY DNE"
|
||||||
|
|
||||||
@ -30,6 +33,14 @@ class TasksJob(Job):
|
|||||||
f.write(url)
|
f.write(url)
|
||||||
print("URL saved.")
|
print("URL saved.")
|
||||||
|
|
||||||
|
print("-" * 30)
|
||||||
|
try:
|
||||||
|
d_input = input(f"Number of days to print [{self.days_to_print}]: ").strip()
|
||||||
|
if d_input:
|
||||||
|
self.days_to_print = int(d_input)
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
def print_body(self, p):
|
def print_body(self, p):
|
||||||
if not HAS_ICAL_DEPS:
|
if not HAS_ICAL_DEPS:
|
||||||
print("Error: Missing iCal Libraries.")
|
print("Error: Missing iCal Libraries.")
|
||||||
@ -55,54 +66,63 @@ class TasksJob(Job):
|
|||||||
# 2. Parse Calendar
|
# 2. Parse Calendar
|
||||||
cal = icalendar.Calendar.from_ical(response.content)
|
cal = icalendar.Calendar.from_ical(response.content)
|
||||||
|
|
||||||
# 3. Calculate Time Range (Today)
|
# 3. Loop over days
|
||||||
now = datetime.datetime.now().astimezone()
|
base_now = datetime.datetime.now().astimezone()
|
||||||
start_of_day = now.replace(hour=0, minute=0, second=0, microsecond=0)
|
|
||||||
end_of_day = now.replace(hour=23, minute=59, second=59, microsecond=0)
|
|
||||||
|
|
||||||
# 4. Expand Recurring Events
|
for i in range(self.days_to_print):
|
||||||
# This library handles RRULEs (e.g. "Every Monday") automatically
|
p.cut()
|
||||||
events = recurring_ical_events.of(cal).between(start_of_day, end_of_day)
|
|
||||||
|
|
||||||
# 5. Sort by start time
|
target_date = base_now + datetime.timedelta(days=i)
|
||||||
# Helper to get sortable time
|
|
||||||
def get_start_time(e):
|
|
||||||
dt = e.get('DTSTART').dt
|
|
||||||
# If it's a date object (all day), convert to datetime for sorting
|
|
||||||
if not isinstance(dt, datetime.datetime):
|
|
||||||
return datetime.datetime.combine(dt, datetime.time.min).replace(tzinfo=now.tzinfo)
|
|
||||||
return dt
|
|
||||||
|
|
||||||
events.sort(key=get_start_time)
|
|
||||||
|
|
||||||
if not events:
|
|
||||||
p.text("Zadne ukoly pro dnesni den.\n")
|
|
||||||
else:
|
|
||||||
for event in events:
|
|
||||||
summary = str(event.get('SUMMARY', '(bez nazvu)'))
|
|
||||||
dtstart = event.get('DTSTART').dt
|
|
||||||
|
|
||||||
# Format time
|
|
||||||
if not isinstance(dtstart, datetime.datetime):
|
|
||||||
time_str = "Cely den"
|
|
||||||
else:
|
|
||||||
# Convert to local system time for display
|
|
||||||
# (If dtstart is timezone aware, astimezone(None) converts to local)
|
|
||||||
local_dt = dtstart.astimezone(now.tzinfo)
|
|
||||||
time_str = local_dt.strftime('%H:%M')
|
|
||||||
|
|
||||||
# Print Entry
|
|
||||||
p.set(bold=True)
|
|
||||||
p.text(f"{time_str} [_]")
|
|
||||||
p.set(bold=False)
|
|
||||||
p.text(f" {summary}\n")
|
|
||||||
|
|
||||||
location = event.get('LOCATION')
|
|
||||||
if location:
|
|
||||||
p.text(f" @ {str(location)}\n")
|
|
||||||
|
|
||||||
|
# Print Calendar Name
|
||||||
|
cal_name = cal.get('X-WR-CALNAME')
|
||||||
|
if cal_name:
|
||||||
|
p.set(align='center', bold=True)
|
||||||
|
p.text(f"{str(cal_name)}\n")
|
||||||
|
days_cz = ["Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"]
|
||||||
|
p.text(f"{days_cz[target_date.weekday()]} {target_date.strftime('%d.%m.%Y')}\n")
|
||||||
|
p.set(align='left', bold=False)
|
||||||
p.text("-" * 32 + "\n")
|
p.text("-" * 32 + "\n")
|
||||||
|
|
||||||
|
start_of_day = target_date.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
end_of_day = target_date.replace(hour=23, minute=59, second=59, microsecond=0)
|
||||||
|
|
||||||
|
# 4. Expand Recurring Events
|
||||||
|
events = recurring_ical_events.of(cal).between(start_of_day, end_of_day)
|
||||||
|
|
||||||
|
# 5. Sort by start time
|
||||||
|
def get_start_time(e):
|
||||||
|
dt = e.get('DTSTART').dt
|
||||||
|
if not isinstance(dt, datetime.datetime):
|
||||||
|
return datetime.datetime.combine(dt, datetime.time.min).replace(tzinfo=base_now.tzinfo)
|
||||||
|
return dt
|
||||||
|
|
||||||
|
events.sort(key=get_start_time)
|
||||||
|
|
||||||
|
if not events:
|
||||||
|
p.text("Zadne ukoly.\n")
|
||||||
|
else:
|
||||||
|
for event in events:
|
||||||
|
summary = str(event.get('SUMMARY', '(bez nazvu)'))
|
||||||
|
dtstart = event.get('DTSTART').dt
|
||||||
|
|
||||||
|
if not isinstance(dtstart, datetime.datetime):
|
||||||
|
time_str = "Cely den"
|
||||||
|
else:
|
||||||
|
local_dt = dtstart.astimezone(base_now.tzinfo)
|
||||||
|
time_str = local_dt.strftime('%H:%M')
|
||||||
|
|
||||||
|
p.set(bold=True)
|
||||||
|
p.text(f"{time_str} [_]")
|
||||||
|
p.set(bold=False)
|
||||||
|
p.text(f" {summary}\n")
|
||||||
|
|
||||||
|
location = event.get('LOCATION')
|
||||||
|
if location:
|
||||||
|
p.text(f" @ {str(location)}\n")
|
||||||
|
|
||||||
|
p.text("-" * 32 + "\n")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error: {e}")
|
print(f"Error: {e}")
|
||||||
p.text(f"Error: {e}\n")
|
p.text(f"Error: {e}\n")
|
||||||
|
|||||||
@ -1,17 +1,23 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import time
|
import time
|
||||||
|
import argparse
|
||||||
from print_server import get_printer
|
from print_server import get_printer
|
||||||
from jobs.tasks import TasksJob
|
from jobs.tasks import TasksJob
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description="Print daily tasks schedule.")
|
||||||
|
parser.add_argument("--days", type=int, default=1, help="Number of days to print (default: 1)")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
print("Initializing printer...")
|
print("Initializing printer...")
|
||||||
p = get_printer()
|
p = get_printer()
|
||||||
if not p:
|
if not p:
|
||||||
print("Failed to connect to printer.")
|
print("Failed to connect to printer.")
|
||||||
return
|
return
|
||||||
|
|
||||||
print("Fetching and printing tasks...")
|
print(f"Fetching and printing tasks for {args.days} day(s)...")
|
||||||
job = TasksJob()
|
job = TasksJob()
|
||||||
|
job.days_to_print = args.days
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Run the job
|
# Run the job
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user