From a5acdc53a1e1a3572c9d6831d79166e451220b4f Mon Sep 17 00:00:00 2001 From: Oskar Date: Wed, 13 Jan 2021 00:05:43 +0100 Subject: [PATCH] Add automatic entry deletion after a specified amount of time. --- config.ini | 3 +++ ftracker/core.py | 12 ++++++++++++ ftracker/deleter.py | 42 ++++++++++++++++++++++++++++++++++++++++++ web/view.html | 6 +++++- 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 ftracker/deleter.py diff --git a/config.ini b/config.ini index 42a6ad5..1ac2ff4 100644 --- a/config.ini +++ b/config.ini @@ -4,6 +4,9 @@ # Remove or leave empty for temporary (/tmp/ftracker-db.json) storage db_file = db.json +# Delete all information after X days (e.g. for GDPR compliance) +delete_after_days = 28 + # List of people to be allowed, in .csv format (comma, no delimiters) # Col1: First Name(s), Col2: Last Name(s), Col3 (optional): EMail # Remove or leave empty for no check diff --git a/ftracker/core.py b/ftracker/core.py index f6ba3b5..50c1db8 100644 --- a/ftracker/core.py +++ b/ftracker/core.py @@ -1,3 +1,4 @@ +import atexit import json from datetime import datetime from slugify import slugify @@ -21,6 +22,17 @@ from flask import Flask, request, redirect app = Flask(__name__, static_folder='../web') +if config['delete_after_days']: + from .deleter import Deleter + deleter = Deleter(db, int(config['delete_after_days'])) + +def shutdown(): + print('\rReceived stop signal, stopping threads...') + deleter.stop() + db.close() + +atexit.register(shutdown) + @app.route('/guidelines') def get_guidelines(): dest = config['guideline_url'] or None diff --git a/ftracker/deleter.py b/ftracker/deleter.py new file mode 100644 index 0000000..4ab7378 --- /dev/null +++ b/ftracker/deleter.py @@ -0,0 +1,42 @@ +from threading import Thread, Event +from datetime import datetime, timedelta + +from tinydb import Query + +ONE_DAY_IN_S = 24 * 60 * 60 + +class Deleter(Thread): + + def delete_old_entries(self): + + print('Clearing database of old entries...') + + td = timedelta(days=self.days) + + threshold = datetime.utcnow() - td + + iso = threshold.isoformat() + 'Z' + + Entry = Query() + self.db.remove((Entry.arrival < iso)) + + print('Deleted everything until UTC', iso) + + def __init__(self, db, days): + + self.db = db + self.days = days + + self.delete_old_entries() + + Thread.__init__(self, daemon=True) + self.stopped = Event() + self.start() + + def run(self): + + while not self.stopped.wait(ONE_DAY_IN_S): + self.delete_old_entries() + + def stop(self): + self.stopped.set() diff --git a/web/view.html b/web/view.html index ee4a482..65dea10 100644 --- a/web/view.html +++ b/web/view.html @@ -322,7 +322,11 @@ } - document.querySelector('input#end').value = localISOTimeMinutes(new Date()) + var now = new Date() + var startDate = new Date() + startDate.setDate(now.getDate() - (4*7)) + document.querySelector('input#start').value = localISOTimeMinutes(startDate) + document.querySelector('input#end').value = localISOTimeMinutes(now) var scrollbox = document.querySelector('.scroll') var timehead = document.querySelector('#timeheader')