Function to get weekly events

main
Bob Mottram 2020-02-22 16:00:27 +00:00
parent 4e6a8c11a5
commit 26ebd73b0e
2 changed files with 115 additions and 5 deletions

View File

@ -11,6 +11,7 @@ import time
import shutil import shutil
import datetime import datetime
import json import json
from calendar import monthrange
def removeAvatarFromCache(baseDir: str,actorStr: str) -> None: def removeAvatarFromCache(baseDir: str,actorStr: str) -> None:
"""Removes any existing avatar entries from the cache """Removes any existing avatar entries from the cache
@ -584,3 +585,17 @@ def fileLastModified(filename: str) -> str:
t = os.path.getmtime(filename) t = os.path.getmtime(filename)
modifiedTime=datetime.datetime.fromtimestamp(t) modifiedTime=datetime.datetime.fromtimestamp(t)
return modifiedTime.strftime("%Y-%m-%dT%H:%M:%SZ") return modifiedTime.strftime("%Y-%m-%dT%H:%M:%SZ")
def daysInMonth(year: int,monthNumber: int) -> int:
"""Returns the number of days in the month
"""
if monthNumber<1 or monthNumber>12:
return None
daysRange=monthrange(year, monthNumber)
return daysRange[1]
def mergeDicts(dict1: {}, dict2: {}) -> {}:
"""Merges two dictionaries
"""
res = {**dict1, **dict2}
return res

View File

@ -23,6 +23,8 @@ from pgp import getPGPpubKey
from xmpp import getXmppAddress from xmpp import getXmppAddress
from matrix import getMatrixAddress from matrix import getMatrixAddress
from donate import getDonationUrl from donate import getDonationUrl
from utils import daysInMonth
from utils import mergeDicts
from utils import updateRecentPostsCache from utils import updateRecentPostsCache
from utils import getNicknameFromActor from utils import getNicknameFromActor
from utils import getDomainFromActor from utils import getDomainFromActor
@ -3672,17 +3674,24 @@ def getCalendarEvents(baseDir: str,nickname: str,domain: str,year: int,monthNumb
return events return events
def getTodaysEvents(baseDir: str,nickname: str,domain: str,dayOfMonth=None) -> {}: def getTodaysEvents(baseDir: str,nickname: str,domain: str, \
currYear=None,currMonthNumber=None,currDayOfMonth=None) -> {}:
"""Retrieves calendar events for today """Retrieves calendar events for today
Returns a dictionary of lists containing Event and Place activities Returns a dictionary of lists containing Event and Place activities
""" """
now=datetime.now() now=datetime.now()
if not currYear:
year=now.year year=now.year
else:
year=currYear
if not currMonthNumber:
monthNumber=now.month monthNumber=now.month
if not dayOfMonth: else:
monthNumber=currMonthNumber
if not currDayOfMonth:
dayNumber=now.day dayNumber=now.day
else: else:
dayNumber=dayOfMonth dayNumber=currDayOfMonth
calendarFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/calendar/'+str(year)+'/'+str(monthNumber)+'.txt' calendarFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/calendar/'+str(year)+'/'+str(monthNumber)+'.txt'
events={} events={}
if not os.path.isfile(calendarFilename): if not os.path.isfile(calendarFilename):
@ -3743,6 +3752,92 @@ def getTodaysEvents(baseDir: str,nickname: str,domain: str,dayOfMonth=None) -> {
return events return events
def getThisWeeksEvents(baseDir: str,nickname: str,domain: str) -> {}:
"""Retrieves calendar events for this week
Returns a dictionary indexed by day number of lists containing Event and Place activities
"""
now=datetime.now()
year=now.year
monthNumber=now.month
dayNumber=now.day
calendarFilename=baseDir+'/accounts/'+nickname+'@'+domain+'/calendar/'+str(year)+'/'+str(monthNumber)+'.txt'
events={}
if not os.path.isfile(calendarFilename):
return events
calendarPostIds=[]
recreateEventsFile=False
with open(calendarFilename,'r') as eventsFile:
for postId in eventsFile:
postId=postId.replace('\n','')
postFilename=locatePost(baseDir,nickname,domain,postId)
if not postFilename:
recreateEventsFile=True
else:
postJsonObject=loadJson(postFilename)
if not postJsonObject:
continue
if not postJsonObject.get('object'):
continue
if not isinstance(postJsonObject['object'], dict):
continue
if not postJsonObject['object'].get('tag'):
continue
postEvent=[]
dayOfMonth=None
weekDayIndex=None
for tag in postJsonObject['object']['tag']:
if not tag.get('type'):
continue
if tag['type']!='Event' and tag['type']!='Place':
continue
if tag['type']=='Event':
# tag is an event
if not tag.get('startTime'):
continue
eventTime= \
datetime.strptime(tag['startTime'], \
"%Y-%m-%dT%H:%M:%S%z")
if int(eventTime.strftime("%Y"))==year and \
int(eventTime.strftime("%m"))==monthNumber and \
(int(eventTime.strftime("%d"))>=dayNumber and \
int(eventTime.strftime("%d"))<=dayNumber+6):
dayOfMonth=str(int(eventTime.strftime("%d")))
weekDayIndex=dayOfMonth-dayNumber
postEvent.append(tag)
else:
# tag is a place
postEvent.append(tag)
if postEvent and weekDayIndex:
calendarPostIds.append(postId)
if not events.get(dayOfMonth):
events[weekDayIndex]=[]
events[dayOfMonth].append(postEvent)
# if some posts have been deleted then regenerate the calendar file
if recreateEventsFile:
calendarFile=open(calendarFilename, "w")
for postId in calendarPostIds:
calendarFile.write(postId+'\n')
calendarFile.close()
lastDayOfMonth=daysInMonth(year,monthNumber)
if dayNumber+6 > lastDayOfMonth:
monthNumber+=1
if monthNumber>12:
monthNumber=1
year+=1
for d in range(1,dayNumber+6-lastDayOfMonth):
dailyEvents= \
getTodaysEvents(baseDir,nickname,domain,year,monthNumber,d)
if dailyEvents:
if dailyEvents.get(d):
newEvents={}
newEvents[d+(7-(dayNumber+6-lastDayOfMonth))]=dailyEvents[d]
events=mergeDicts(events,newEvents)
return events
def htmlCalendarDay(translate: {}, \ def htmlCalendarDay(translate: {}, \
baseDir: str,path: str, \ baseDir: str,path: str, \
year: int,monthNumber: int,dayNumber: int, year: int,monthNumber: int,dayNumber: int,