pyvikunja 0.7__py3-none-any.whl → 0.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyvikunja/api.py +16 -0
- pyvikunja/models/enum/repeat_mode.py +2 -2
- pyvikunja/models/task.py +24 -5
- {pyvikunja-0.7.dist-info → pyvikunja-0.9.dist-info}/METADATA +1 -1
- {pyvikunja-0.7.dist-info → pyvikunja-0.9.dist-info}/RECORD +8 -8
- {pyvikunja-0.7.dist-info → pyvikunja-0.9.dist-info}/LICENSE +0 -0
- {pyvikunja-0.7.dist-info → pyvikunja-0.9.dist-info}/WHEEL +0 -0
- {pyvikunja-0.7.dist-info → pyvikunja-0.9.dist-info}/top_level.txt +0 -0
pyvikunja/api.py
CHANGED
@@ -74,6 +74,22 @@ class VikunjaAPI:
|
|
74
74
|
logger.error(f"Unexpected error occurred: {e} | URL: {url}")
|
75
75
|
return None
|
76
76
|
|
77
|
+
async def ping(self) -> bool:
|
78
|
+
"""Tests if the API key is valid by calling the /projects endpoint."""
|
79
|
+
"""Not chosen the /user endpoint here because it was always returning 401 with an API Token"""
|
80
|
+
url = f"{self.api_base_url}/projects"
|
81
|
+
|
82
|
+
try:
|
83
|
+
response = await self.client.get(url, headers=self.headers, timeout=10)
|
84
|
+
response.raise_for_status()
|
85
|
+
|
86
|
+
if response.status_code == 200:
|
87
|
+
return True
|
88
|
+
else:
|
89
|
+
raise httpx.HTTPError(f"Non-200 Response from server {response.status_code}")
|
90
|
+
except httpx.HTTPError as e:
|
91
|
+
raise e
|
92
|
+
|
77
93
|
# Projects
|
78
94
|
async def get_projects(self, page: int = 1, per_page: int = 20) -> List[Project]:
|
79
95
|
response = await self._request("GET", "/projects", params={"page": page, "per_page": per_page})
|
pyvikunja/models/task.py
CHANGED
@@ -33,6 +33,23 @@ class Task(BaseModel):
|
|
33
33
|
self.labels: List[Label] = [Label(label_data) for label_data in data.get('labels', []) or []]
|
34
34
|
self.assignees: List[User] = [User(user_data) for user_data in data.get('assignees', []) or []]
|
35
35
|
|
36
|
+
# Parse repeat_mode into an enum
|
37
|
+
self.repeat_mode: RepeatMode = self._parse_repeat_mode(data.get('repeat_mode'))
|
38
|
+
|
39
|
+
# Parse repeat_after into timedelta
|
40
|
+
self.repeat_after: Optional[timedelta] = self._parse_repeat_after(data.get('repeat_after'))
|
41
|
+
|
42
|
+
def _parse_repeat_mode(self, mode: Optional[int]) -> Optional[RepeatMode]:
|
43
|
+
"""Convert repeat_mode integer into an Enum value, defaulting to NONE."""
|
44
|
+
try:
|
45
|
+
return RepeatMode(mode) if mode is not None else None
|
46
|
+
except ValueError:
|
47
|
+
return None
|
48
|
+
|
49
|
+
def _parse_repeat_after(self, seconds: Optional[int]) -> Optional[timedelta]:
|
50
|
+
"""Convert repeat_after seconds into a timedelta."""
|
51
|
+
return timedelta(seconds=seconds) if seconds else None
|
52
|
+
|
36
53
|
async def update(self, data: Dict) -> 'Task':
|
37
54
|
# Merge self.data with the new data (data overrides keys in self.data)
|
38
55
|
combined = {**self.data, **data}
|
@@ -94,12 +111,14 @@ class Task(BaseModel):
|
|
94
111
|
iso_date = str(date.isoformat())
|
95
112
|
return await self.update({'end_date': iso_date})
|
96
113
|
|
97
|
-
async def set_repeating_interval(self, interval: timedelta, mode: RepeatMode =
|
98
|
-
|
99
|
-
total_seconds = int(
|
100
|
-
|
114
|
+
async def set_repeating_interval(self, interval: Optional[timedelta] = None, mode: Optional[RepeatMode] = None) -> 'Task':
|
115
|
+
new_interval = interval if interval else self.repeat_after
|
116
|
+
total_seconds = int(new_interval.total_seconds())
|
117
|
+
|
118
|
+
new_mode = mode if mode else self.repeat_mode
|
119
|
+
|
101
120
|
return await self.update({'repeat_after': total_seconds,
|
102
|
-
'repeat_mode':
|
121
|
+
'repeat_mode': new_mode.value})
|
103
122
|
|
104
123
|
async def delete_task(self) -> Dict:
|
105
124
|
return await self.api.delete_task(self.id)
|
@@ -1,15 +1,15 @@
|
|
1
1
|
pyvikunja/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
pyvikunja/api.py,sha256=
|
2
|
+
pyvikunja/api.py,sha256=mHPn0XPFrYNCG3ChIUnluAOP08z3YyUL_3nors9RuYU,6920
|
3
3
|
pyvikunja/models/label.py,sha256=cOOuVYDVDMmK96Ev22EDgWwXljkAonQNL4XsTMay4K4,467
|
4
4
|
pyvikunja/models/models.py,sha256=RCPsYQtcgE-W5ZmhwGDejAI76nHZ9-1X-x5GeTG4RnI,637
|
5
5
|
pyvikunja/models/project.py,sha256=viVIe3lVgbh7k05ADDds1cwzvC1vf4tT2vSNjbB7KMk,1179
|
6
|
-
pyvikunja/models/task.py,sha256=
|
6
|
+
pyvikunja/models/task.py,sha256=1dJE6XIZFciN6RS2Ml-g8pSQcEeZ4Sl6tOqP8Q2oSyw,5258
|
7
7
|
pyvikunja/models/team.py,sha256=0Z3828Cm3nNuNr1z2on63fLYAVW325_SQKi5RmqXf-I,559
|
8
8
|
pyvikunja/models/user.py,sha256=36duFNyGXKzlwqO0d6FA-C1KTCci2sIMU1IBIF-N_LM,310
|
9
|
-
pyvikunja/models/enum/repeat_mode.py,sha256=
|
9
|
+
pyvikunja/models/enum/repeat_mode.py,sha256=xkDPfYeRz342ovqro1UVBAoegpPgpZQYTnyo2sf6R7I,112
|
10
10
|
pyvikunja/models/enum/task_priority.py,sha256=aVz1HEofIqwUkXG0vYm58n_vLNbgqtbvHuQ5K-YQqA0,119
|
11
|
-
pyvikunja-0.
|
12
|
-
pyvikunja-0.
|
13
|
-
pyvikunja-0.
|
14
|
-
pyvikunja-0.
|
15
|
-
pyvikunja-0.
|
11
|
+
pyvikunja-0.9.dist-info/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
12
|
+
pyvikunja-0.9.dist-info/METADATA,sha256=v2nKiz8SJH9WWBgfyFrQB0up59Y_4WvAwBTSTx5CVHc,187
|
13
|
+
pyvikunja-0.9.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
14
|
+
pyvikunja-0.9.dist-info/top_level.txt,sha256=WVV9zgxUBuWOkUY1t_U7zI0paWWTVelKYB4vjsiKsks,10
|
15
|
+
pyvikunja-0.9.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|