File tree Expand file tree Collapse file tree 3 files changed +46
-9
lines changed
Expand file tree Collapse file tree 3 files changed +46
-9
lines changed Original file line number Diff line number Diff line change 33
44Taken from default classes in aw-webui
55"""
6+ import logging
7+ import random
8+ from typing import (
9+ Any ,
10+ Dict ,
11+ List ,
12+ Tuple ,
13+ )
614
7- from typing import List , Dict , Any , Tuple
15+ import aw_client
16+
17+ logger = logging .getLogger (__name__ )
818
919CategoryId = List [str ]
1020CategorySpec = Dict [str , Any ]
5262 {"type" : "regex" , "regex" : "Gmail|Thunderbird|mutt|alpine" },
5363 ),
5464]
65+
66+
67+ def get_classes () -> List [Tuple [List [str ], dict ]]:
68+ """
69+ Get classes from server-side settings.
70+ Might throw a 404 if not set yet, in which case we use the default classes as a fallback.
71+ """
72+ awc = aw_client .ActivityWatchClient (f"get-setting-{ random .randint (0 , 10000 )} " )
73+ try :
74+ classes = awc .get_setting ("classes" )
75+ except Exception :
76+ logger .warning (
77+ "Failed to get classes from server, using default classes as fallback"
78+ )
79+ return default_classes
80+ # map into list of tuples
81+ return [(v ["name" ], v ["rule" ]) for v in classes ]
Original file line number Diff line number Diff line change @@ -341,12 +341,11 @@ def query(
341341 # Settings
342342 #
343343
344- def get_setting (self , key = None ) -> dict :
345- # TODO: explicitly fetch key from server, instead of fetching all settings
346- settings = self ._get ("settings" ).json ()
344+ def get_setting (self , key : Optional [str ] = None ) -> dict :
347345 if key :
348- return settings .get (key , None )
349- return settings
346+ return self ._get (f"settings/{ key } " ).json ()
347+ else :
348+ return self ._get ("settings" ).json ()
350349
351350 def set_setting (self , key : str , value : str ) -> None :
352351 self ._post (f"settings/{ key } " , value )
Original file line number Diff line number Diff line change 33
44Most of these are from: https://github.com/ActivityWatch/aw-webui/blob/master/src/queries.ts
55"""
6-
6+ import dataclasses
77import json
88import re
9- import dataclasses
109from dataclasses import dataclass , field
1110from datetime import datetime , timedelta , timezone
11+ from typing import (
12+ List ,
13+ Optional ,
14+ Tuple ,
15+ Union ,
16+ )
1217
13- from typing import List , Union , Tuple , Optional
1418from typing_extensions import TypeGuard
1519
1620import aw_client
1721
22+ from .classes import get_classes
23+
1824
1925class EnhancedJSONEncoder (json .JSONEncoder ):
2026 """For encoding dataclasses into JSON"""
@@ -75,6 +81,11 @@ def isAndroidParams(params: QueryParams) -> TypeGuard[AndroidQueryParams]:
7581
7682
7783def canonicalEvents (params : Union [DesktopQueryParams , AndroidQueryParams ]) -> str :
84+ if not params .classes :
85+ # if categories not explicitly set,
86+ # get categories from server settings
87+ params .classes = get_classes ()
88+
7889 # Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unnecessary escaping)
7990 classes_str = json .dumps (params .classes , cls = EnhancedJSONEncoder )
8091 classes_str = re .sub (r"\\\\" , r"\\" , classes_str )
You can’t perform that action at this time.
0 commit comments