File tree 3 files changed +46
-9
lines changed
3 files changed +46
-9
lines changed Original file line number Diff line number Diff line change 3
3
4
4
Taken from default classes in aw-webui
5
5
"""
6
+ import logging
7
+ import random
8
+ from typing import (
9
+ Any ,
10
+ Dict ,
11
+ List ,
12
+ Tuple ,
13
+ )
6
14
7
- from typing import List , Dict , Any , Tuple
15
+ import aw_client
16
+
17
+ logger = logging .getLogger (__name__ )
8
18
9
19
CategoryId = List [str ]
10
20
CategorySpec = Dict [str , Any ]
52
62
{"type" : "regex" , "regex" : "Gmail|Thunderbird|mutt|alpine" },
53
63
),
54
64
]
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(
341
341
# Settings
342
342
#
343
343
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 :
347
345
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 ()
350
349
351
350
def set_setting (self , key : str , value : str ) -> None :
352
351
self ._post (f"settings/{ key } " , value )
Original file line number Diff line number Diff line change 3
3
4
4
Most of these are from: https://github.com/ActivityWatch/aw-webui/blob/master/src/queries.ts
5
5
"""
6
-
6
+ import dataclasses
7
7
import json
8
8
import re
9
- import dataclasses
10
9
from dataclasses import dataclass , field
11
10
from datetime import datetime , timedelta , timezone
11
+ from typing import (
12
+ List ,
13
+ Optional ,
14
+ Tuple ,
15
+ Union ,
16
+ )
12
17
13
- from typing import List , Union , Tuple , Optional
14
18
from typing_extensions import TypeGuard
15
19
16
20
import aw_client
17
21
22
+ from .classes import get_classes
23
+
18
24
19
25
class EnhancedJSONEncoder (json .JSONEncoder ):
20
26
"""For encoding dataclasses into JSON"""
@@ -75,6 +81,11 @@ def isAndroidParams(params: QueryParams) -> TypeGuard[AndroidQueryParams]:
75
81
76
82
77
83
def 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
+
78
89
# Needs escaping for regex patterns like '\w' to work (JSON.stringify adds extra unnecessary escaping)
79
90
classes_str = json .dumps (params .classes , cls = EnhancedJSONEncoder )
80
91
classes_str = re .sub (r"\\\\" , r"\\" , classes_str )
You can’t perform that action at this time.
0 commit comments