środa, marca 01, 2023

Kiedy skończyć pracę...

Nie znoszę pracy zdalnej ;-)

Dlatego kiedyś przyjąłem, że ponieważ w biurze chodzi się do kuchni, idzie się na obiad i takie tam to czas w pracy w biurze i w domu liczą się inaczej.

Mój sposób był taki:

  • każda godzina spotkania remote liczy się tak jak 125%, czyli 75 minut,
  • każda godzina pracy remote liczy się jak 105%, czyli 63 minuty,
  • minimalną jednostką "spotkaniową" jest 30 minut.
No i chciałem zawsze mieć tak by komputer mi przypominał kiedy powinienem skończyć ;-)

Dziś napisałem sobie w końcu skrypt, który to liczy beze mnie.

I oczywiście problemem jest jak wynik ze skryptu w Pythonie zamienić na event w kalendarzu ;-)

Ale krótki czat z ChatGPT ;-) pozwolił znaleźć rozwiązanie ;-)
Nawet na to jak wyeksportować mój skrót ;-)

Jutro będę testował ;-)
Chociaż i tak wiem, że zignoruję ten event i będę siedział do 8h...

Sam skrypt wygląda tak ;-)

import urllib.request
import icalendar
import math
import datetime
import dateutil

url = "<linkToiCalCalendar>"

# Open the URL and read the iCalendar file
response = urllib.request.urlopen(url)
ical_str = response.read().decode('utf-8')

# Parse the iCalendar file
cal = icalendar.Calendar.from_ical(ical_str)

now = datetime.datetime.now(datetime.timezone.utc)

today_9am = now.replace(hour=8, minute=0, second=0, microsecond=0) + datetime.timedelta(days=0)
endOfToday = now.replace(hour=0,minute=0,second=0,microsecond=0) + datetime.timedelta(days=1)

events = []
for component in cal.walk():
if component.name == "VEVENT":
dt = component["DTSTART"].dt
t = dt if isinstance(dt, datetime.datetime) else datetime.datetime.combine(dt,datetime.time(0,0),tzinfo=datetime.timezone.utc)
# Check if the event is recurring
if "RRULE" in component:
# Parse the RRULE property
rrule = dateutil.rrule.rrulestr(component["RRULE"].to_ical().decode(), dtstart=t)
# Generate a list of occurrences of the event within the desired time range
until=component["RRULE"]["UNTIL"][0] if component["RRULE"]["UNTIL"] else None
for occurrence in rrule.between(today_9am, endOfToday, inc=True):
if occurrence>until:
continue
et = component["DTEND"].dt
length=et-dt
events.append({"title": component["SUMMARY"], "start": occurrence,"len": length})
else:
# Add the event to the list if it's not recurring
dt = component["DTSTART"].dt
et = component["DTEND"].dt
t = dt if isinstance(dt, datetime.datetime) else datetime.datetime.combine(dt,datetime.time(0,0),tzinfo=datetime.timezone.utc)
if t > today_9am and t < endOfToday:
length=et-dt
events.append({"title": component["SUMMARY"], "start": t, "len": length})


events.sort(key=lambda x:x["start"])

# meetings which are safe to ignore
safeMeetings = set(["Blocked","Coding","Fuzzy Bug Triage"])

total_meeting_minutes=0

for event in events:
if event["title"] in safeMeetings:
continue
total_seconds = event["len"].total_seconds()
total_minutes = total_seconds // 60
total_meeting_minutes+=math.ceil(total_minutes/30)*30

scaled_total_meeting_minutes=math.ceil(total_meeting_minutes*1.25)
toUse=8*60-scaled_total_meeting_minutes
nonMeeting=math.floor(toUse/1.05)
toWork=total_meeting_minutes+nonMeeting
endWork=now.replace(hour=10+toWork//60,minute=toWork%60,second=0)
if endWork.weekday()<5:
print(endWork.strftime("%Y-%m-%d %H:%M:%S"))




Podobne postybeta
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Wpisy z Bloggera jako eventy w Google Calendar, odsłona 3 - Aplikacja ;-)
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Mistral czeka na książkę
SleepAdvisor - komórka pomaga w wyspaniu się ;-)

Brak komentarzy:

Prześlij komentarz