Skip to content

Commit 57c6584

Browse files
authored
Add basic concept
1 parent e17ae25 commit 57c6584

File tree

3 files changed

+79
-3
lines changed

3 files changed

+79
-3
lines changed

scheduler.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ def start(
3535
_LOGGER.info("Starting the scheduler, with schedule: %s", self._schedule)
3636
if self._schedule is None:
3737
_LOGGER.warning("No schedule set, not starting the scheduler")
38-
self._schedule = "*/1 * * * *" # TODO: for debugging purposes
39-
# return
38+
return
4039

4140
if self._import_job:
4241
self._scheduler.remove_job(self._import_job.id)
@@ -62,6 +61,28 @@ def run_import() -> None:
6261
self._scheduler.start()
6362
_LOGGER.info("Scheduler started")
6463

64+
def set_schedule(self, schedule: str) -> None:
65+
"""Set the schedule for the import job."""
66+
self._schedule = schedule
67+
_LOGGER.info("Scheduler schedule set to: %s", self._schedule)
68+
69+
if not schedule:
70+
_LOGGER.info("Disabling the scheduler")
71+
if self._import_job:
72+
self._scheduler.remove_job(self._import_job.id)
73+
_LOGGER.info("Scheduler job removed")
74+
else:
75+
_LOGGER.warning("No import job to remove")
76+
self._import_job = None
77+
return
78+
79+
if self._import_job:
80+
self._scheduler.reschedule_job(
81+
self._import_job.id,
82+
trigger=CronTrigger.from_crontab(self._schedule),
83+
)
84+
_LOGGER.info("Scheduler job rescheduled to: %s", self._schedule)
85+
6586
def stop(self) -> None:
6687
"""Stop the scheduler."""
6788
if not self._scheduler.running:

templates/configuration.html

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,32 @@ <h5 class="modal-title" id="resetModalLabel">Confirm Reset</h5>
3232
</div>
3333
</div>
3434

35+
<div class="row">
36+
<div class="col-md-12">
37+
<h3>Scheduler</h3>
38+
<p>Set a scheduler to automatically import your transactions.</p>
39+
<hr>
40+
<form action="/set-schedule" method="post">
41+
<div class="mb-3">
42+
<label for="schedule" class="form-label">Scheduler</label>
43+
<select class="form-select" id="schedule" name="schedule">
44+
<option value="">Disabled</option>
45+
<option value="*/1 * * * *">Every minute</option>
46+
<option value="*/5 * * * *">Every 5 minutes</option>
47+
<option value="*/10 * * * *">Every 10 minutes</option>
48+
<option value="*/15 * * * *">Every 15 minutes</option>
49+
<option value="*/30 * * * *">Every 30 minutes</option>
50+
<option value="0 * * * *">Every hour</option>
51+
<option value="0 0 * * *">Every day at midnight</option>
52+
<option value="0 0 * * 0">Every week at midnight</option>
53+
</select>
54+
</div>
55+
<button type="submit" class="btn btn-primary">Save Scheduler</button>
56+
</form>
57+
</div>
58+
</div>
59+
<hr>
60+
3561
<div class="row">
3662
<div class="col-md-6">
3763
<div class="card mb-4">
@@ -107,4 +133,4 @@ <h5 class="modal-title" id="resetModalLabel">Confirm Reset</h5>
107133
</div>
108134
</div>
109135

110-
{% endblock %}
136+
{% endblock %}

truelayer2firefly.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ async def get_firefly_client() -> FireflyClient:
113113
return client
114114

115115

116+
async def get_scheduler() -> Scheduler:
117+
"""Get the scheduler from the application state."""
118+
scheduler = app.state.scheduler
119+
if not scheduler:
120+
raise RuntimeError("Scheduler is not initialized.")
121+
return scheduler
122+
123+
116124
@app.get("/", response_class=HTMLResponse)
117125
async def index(request: Request):
118126
"""Render the index page."""
@@ -365,6 +373,27 @@ async def reset_configuration(request: Request):
365373
return RedirectResponse(str(request.url_for("index")), status_code=302)
366374

367375

376+
@app.post("/set-schedule")
377+
async def set_schedule(
378+
request: Request,
379+
schedule: str = Form(...),
380+
scheduler: Scheduler = Depends(get_scheduler),
381+
) -> RedirectResponse:
382+
"""Set the import schedule."""
383+
_LOGGER.info("Setting schedule to %s", schedule)
384+
config.set("import_schedule", schedule)
385+
386+
try:
387+
scheduler.set_schedule(schedule)
388+
except Exception as e:
389+
_LOGGER.error("Error setting schedule: %s", e)
390+
return JSONResponse(
391+
status_code=500,
392+
content={"error": "Error setting schedule", "details": str(e)},
393+
)
394+
return RedirectResponse(str(request.url_for("index")), status_code=302)
395+
396+
368397
app.add_exception_handler(
369398
TrueLayer2FireflyAuthorizationError, truelayer_authorization_error_handler
370399
)

0 commit comments

Comments
 (0)