129 lines
5.3 KiB
Python
129 lines
5.3 KiB
Python
import json
|
|
from datetime import datetime
|
|
from datetime import timedelta
|
|
from pprint import pprint
|
|
from django.db.utils import IntegrityError
|
|
from apps.events.utils.parser import univis_eventpage_parser
|
|
from apps.events.utils.parser import fekide_eventpage_parser
|
|
|
|
from apps.events.models import Event, Location
|
|
|
|
UNIVIS_CATEGORY = 'Univis'
|
|
|
|
# CONFIG
|
|
UNIVIS_RPG_GuK = "http://univis.uni-bamberg.de/prg?search=events&department=Fakult%E4t%20Geistes-%20und%20Kulturwissenschaften&show=xml"
|
|
UNIVIS_RPG_SoWi = "http://univis.uni-bamberg.de/prg?search=events&department=Fakult%E4t%20Sozial-%20und%20Wirtschaftswissenschaften&show=xml"
|
|
UNIVIS_RPG_HuWi = "http://univis.uni-bamberg.de/prg?search=events&department=Fakult%E4t%20Humanwissenschaften&show=xml"
|
|
UNIVIS_RPG_WIAI = "http://univis.uni-bamberg.de/prg?search=events&department=Fakult%E4t%20Wirtschaftsinformatik&show=xml"
|
|
|
|
|
|
def writeFekideDataInDB(data):
|
|
for date in data['dates']:
|
|
for event in date['events']:
|
|
try:
|
|
Location.objects.create(name=event['location'])
|
|
event_obj = Event.objects.create()
|
|
event_obj.save()
|
|
event_obj.date = datetime.strptime(date['date'], "%d.%m.%Y")
|
|
event_obj.category = event['category']
|
|
event_obj.link = event['link']
|
|
event_obj.time = datetime.strptime(str(event['time']).split()[1], "%H:%M")
|
|
event_obj.title = event['title']
|
|
event_obj.locations.add(Location.objects.get(name=event['location']))
|
|
event_obj.save()
|
|
Event.objects.filter(title="").delete()
|
|
except IntegrityError:
|
|
# ignored
|
|
break
|
|
|
|
|
|
def deleteUnivisObjects():
|
|
Event.objects.filter(category=UNIVIS_CATEGORY).delete()
|
|
Location.objects.all().delete()
|
|
|
|
|
|
def writeUnivisDataInDB(events, rooms, persons):
|
|
writeUnivisLocationsInDB(rooms)
|
|
writeUnivisEventsInDB(events)
|
|
|
|
|
|
def writeUnivisLocationsInDB(rooms):
|
|
for room in rooms:
|
|
if '@key' in room and 'short' in room:
|
|
try:
|
|
Location.objects.create(key=room['@key'], name=room['short'])
|
|
except IntegrityError:
|
|
print("Possible Duplicate! Start DB refresh")
|
|
try:
|
|
Location.objects.get(name=room['short']).key = room['@key']
|
|
except Exception as harderr:
|
|
print("Failed to refresh object" + harderr.args)
|
|
except Exception as err:
|
|
print(err.args)
|
|
|
|
|
|
def getLocationIDs(event):
|
|
rooms = []
|
|
if not isinstance(event['rooms']['room'], list):
|
|
rooms.append(event['rooms']['room']['UnivISRef']['@key'])
|
|
else:
|
|
for room_item in event['rooms']['room']:
|
|
rooms.append(room_item['UnivISRef']['@key'])
|
|
return rooms
|
|
|
|
|
|
def writeUnivisEventsInDB(events: list):
|
|
for event in events:
|
|
if 'calendar' in event and not event['calendar'] == 'nein' and 'internal' in event and event[
|
|
'internal'] == 'nein' and 'startdate' in event and 'enddate' in event:
|
|
startdate = datetime.strptime(event['startdate'], "%Y-%m-%d")
|
|
enddate = datetime.strptime(event['enddate'], "%Y-%m-%d")
|
|
if (startdate + timedelta(1)) >= enddate:
|
|
|
|
if 'title' in event and 'rooms' in event and 'starttime' in event:
|
|
# TODO: Add Description in
|
|
# TODO: Is there a better way to add Objects in DB?
|
|
event_obj = Event()
|
|
event_obj.save()
|
|
event_obj.title = event['title']
|
|
locations = getLocationIDs(event)
|
|
for location in locations:
|
|
event_obj.locations.add(Location.objects.get(key=location))
|
|
event_obj.time = event['starttime']
|
|
event_obj.date = event['startdate']
|
|
# TODO: Better Category handling
|
|
event_obj.category = UNIVIS_CATEGORY
|
|
if 'presenter' in event:
|
|
event_obj.presenter = event['presenter']
|
|
if 'orgname' in event:
|
|
event_obj.orgname = event['orgname']
|
|
try:
|
|
event_obj.save()
|
|
except IntegrityError:
|
|
# TODO: Update DB Object if duplicate detected
|
|
print("Found Duplicate!")
|
|
except Exception as err:
|
|
print(err.args)
|
|
Event.objects.filter(title="").delete()
|
|
|
|
|
|
def main():
|
|
deleteUnivisObjects()
|
|
events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_HuWi)
|
|
writeUnivisDataInDB(events, rooms, persons)
|
|
events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_SoWi)
|
|
writeUnivisDataInDB(events, rooms, persons)
|
|
events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_GuK)
|
|
writeUnivisDataInDB(events, rooms, persons)
|
|
events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_WIAI)
|
|
writeUnivisDataInDB(events, rooms, persons)
|
|
|
|
writeFekideDataInDB(fekide_eventpage_parser.parsePage())
|
|
|
|
pprint("Event: " + str(Event.objects.count()))
|
|
pprint("Location: " + str(Location.objects.count()))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|