This repository has been archived on 2019-10-13. You can view files and clone it, but cannot push or open issues or pull requests.

148 lines
6.0 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'])
except IntegrityError:
# print("Location %s already exists." % event['location'])
pass
try:
event_obj, new = Event.objects.get_or_create(date=datetime.strptime(date['date'], "%d.%m.%Y"),
title=event['title'])
if new:
event_obj.category = event['category']
event_obj.link = event['link']
event_obj.time = datetime.strptime(str(event['time']).split()[1], "%H:%M")
event_obj.locations.add(Location.objects.get(name=event['location']))
event_obj.save()
Event.objects.filter(title="").delete()
else:
print("Event %s already exists. Start Update" % str(event_obj.title))
event_obj.category = event['category']
event_obj.link = event['link']
event_obj.time = datetime.strptime(str(event['time']).split()[1], "%H:%M")
event_obj.locations.add(Location.objects.get(name=event['location']))
event_obj.save()
except IntegrityError:
# ignored
pass
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 write_out_db_objects():
pprint("Event: " + str(Event.objects.count()))
pprint("Location: " + str(Location.objects.count()))
def main():
print("Aktueller Stand:")
write_out_db_objects()
# 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())
print("Neuer Stand:")
write_out_db_objects()
if __name__ == '__main__':
main()