Merge pull request #463 from JindrichPilar/timewarrior
Timewarrior module
This commit is contained in:
commit
2fec760d3d
@ -44,6 +44,8 @@ MOCK_MODULES = [
|
||||
"vlc",
|
||||
"dateutil.tz",
|
||||
"i3ipc",
|
||||
"dateutil.parser",
|
||||
"dateutil.relativedelta",
|
||||
]
|
||||
|
||||
for mod_name in MOCK_MODULES:
|
||||
|
78
i3pystatus/timewarrior.py
Normal file
78
i3pystatus/timewarrior.py
Normal file
@ -0,0 +1,78 @@
|
||||
from i3pystatus import IntervalModule
|
||||
from json import loads
|
||||
from dateutil.parser import parse
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from datetime import datetime, timezone
|
||||
import subprocess
|
||||
|
||||
|
||||
class Timewarrior(IntervalModule):
|
||||
"""
|
||||
Show current Timewarrior tracking
|
||||
Requires `json` `dateutil`
|
||||
|
||||
Formaters:
|
||||
|
||||
* `{tags}` — contains tags of current track
|
||||
* `{start}` - contains start of track
|
||||
* `{duration}` — contains time of current track
|
||||
"""
|
||||
|
||||
format = '{duration}'
|
||||
duration_format = '{years}y{months}m{days}d{hours}h{minutes}m{seconds}s'
|
||||
enable_stop = True
|
||||
enable_continue = True
|
||||
color_running = '#00FF00'
|
||||
color_stopped = '#F00000'
|
||||
on_rightclick = 'stop_or_continue'
|
||||
track = None
|
||||
|
||||
settings = (
|
||||
('format', 'format string'),
|
||||
('enable_stop', 'Allow right click to stop tracking'),
|
||||
('enable_continue', 'ALlow right click to continue tracking'),
|
||||
('color_running', '#00FF00'),
|
||||
('color_stopped', '#F00000'),
|
||||
)
|
||||
|
||||
def loadTrack(self):
|
||||
try:
|
||||
tracks_json = subprocess.check_output(['timew', 'export'])
|
||||
tracks = loads(tracks_json.decode("utf-8"))
|
||||
self.track = tracks[-1]
|
||||
|
||||
except ValueError as error:
|
||||
self.logger.exception('Decoding JSON has failed')
|
||||
raise error
|
||||
|
||||
def stop_or_continue(self):
|
||||
self.loadTrack()
|
||||
|
||||
if 'end' in self.track and self.enable_continue:
|
||||
subprocess.check_output(['timew', 'continue'])
|
||||
elif self.enable_stop:
|
||||
subprocess.check_output(['timew', 'stop'])
|
||||
|
||||
def run(self):
|
||||
self.loadTrack()
|
||||
start = parse(self.track['start'])
|
||||
end = parse(self.track['end']) if 'end' in self.track else datetime.now(timezone.utc)
|
||||
duration = relativedelta(end, start)
|
||||
|
||||
format_values = dict(
|
||||
tags=", ".join(self.track['tags'] if 'tags' in self.track else []),
|
||||
start=start,
|
||||
duration=self.duration_format.format(
|
||||
years=duration.years,
|
||||
months=duration.months,
|
||||
days=duration.days,
|
||||
hours=duration.hours,
|
||||
minutes=duration.minutes,
|
||||
seconds=duration.seconds,
|
||||
)
|
||||
)
|
||||
|
||||
self.output = {
|
||||
'full_text': self.format.format(**format_values),
|
||||
'color': self.color_stopped if 'end' in self.track else self.color_running
|
||||
}
|
Loading…
Reference in New Issue
Block a user