refactor: timedelta - filter recent BbbStatus objects

This commit is contained in:
Daniel Langbein 2021-03-02 15:00:20 +01:00
parent 1e5b44f2c9
commit d240d4e82f
3 changed files with 20 additions and 15 deletions

View File

@ -2,7 +2,8 @@ from functools import total_ordering
from typing import List from typing import List
from pathlib import Path from pathlib import Path
from xml.etree import ElementTree from xml.etree import ElementTree
from datetime import datetime from datetime import datetime, timedelta
import logging import logging
from langfingaz import loadData from langfingaz import loadData
@ -142,8 +143,9 @@ def parseMeetingsData(dataStr: str) -> List[Meeting]:
return [Meeting(xml_meeting) for xml_meeting in xml_meetings.iter('meeting')] return [Meeting(xml_meeting) for xml_meeting in xml_meetings.iter('meeting')]
def readBbbStatiFromDir(dataDir: Path = fileUtil.getDataDir()) -> List[BbbStatus]: def readBbbStatiFromDir(dataDir: Path = fileUtil.getDataDir(), delta: timedelta = None) -> List[BbbStatus]:
""" """
:arg delta: (optional) Only return BbbStatus objects in the time-range now-delta and now. Example: timedelta(days=28)
:return: List of BbbStatus objects, sorted by date :return: List of BbbStatus objects, sorted by date
""" """
@ -155,9 +157,21 @@ def readBbbStatiFromDir(dataDir: Path = fileUtil.getDataDir()) -> List[BbbStatus
dataStr, t = loadData.loadData(file) dataStr, t = loadData.loadData(file)
meetings: List[Meeting] = parseMeetingsData(dataStr) meetings: List[Meeting] = parseMeetingsData(dataStr)
bbbStati.append(BbbStatus(meetings, t)) bbbStati.append(BbbStatus(meetings, t))
if (len(bbbStati) < 1): if (len(bbbStati) < 1):
print("No bbbStatus objects were found in data directory: " + str(dataDir)) print("No bbbStatus objects were found in data directory: " + str(dataDir))
return []
# sort by date # sort by date
return sorted(bbbStati, key=BbbStatus.getKey) bbbStati = sorted(bbbStati, key=BbbStatus.getKey)
if delta is not None and len(bbbStati) > 1:
# filter: take only bbbStatus objects of the last month (4 weeks)
#
# start: datetime = bbbStati[0].pointOfTime
# end: datetime = bbbStati[-1].pointOfTime
# delta: timedelta = end-start
end: datetime = bbbStati[-1].pointOfTime
monthBeforeEnd: datetime = end - delta
bbbStati = [bbbStatus for bbbStatus in bbbStati if bbbStatus.pointOfTime >= monthBeforeEnd]
return bbbStati

View File

@ -22,19 +22,10 @@ def plotMeetings(dataDir: Path = fileUtil.getDataDir()):
plot BBB meetings of the last month plot BBB meetings of the last month
""" """
bbbStati: List[BbbStatus] = parseMeetings.readBbbStatiFromDir(dataDir) bbbStati: List[BbbStatus] = parseMeetings.readBbbStatiFromDir(dataDir=dataDir, delta=timedelta(days=28))
if len(bbbStati) < 1: if len(bbbStati) < 1:
return return
# filter: take only bbbStatus objects of the last month (4 weeks)
#
# start: datetime = bbbStati[0].pointOfTime
# end: datetime = bbbStati[-1].pointOfTime
# delta: timedelta = end-start
end: datetime = bbbStati[-1].pointOfTime
monthBeforeEnd: datetime = end - timedelta(days=28)
bbbStati = [bbbStatus for bbbStatus in bbbStati if bbbStatus.pointOfTime >= monthBeforeEnd]
image: Path = doPlotMeetings(bbbStati) image: Path = doPlotMeetings(bbbStati)
print("saved image at " + str(image)) print("saved image at " + str(image))

View File

@ -27,7 +27,7 @@ def getModerators(dataDir: Path = fileUtil.getDataDir()) -> Dict[parseMeetings.U
:return: Dict[User, count-how-often-as-moderator] sorted by User.fullName :return: Dict[User, count-how-often-as-moderator] sorted by User.fullName
""" """
bbbStati: List[BbbStatus] = parseMeetings.readBbbStatiFromDir(dataDir) bbbStati: List[BbbStatus] = parseMeetings.readBbbStatiFromDir(dataDir=dataDir, delta=timedelta(days=28))
if len(bbbStati) < 1: if len(bbbStati) < 1:
return {} return {}