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.
2018-04-01 17:35:55 +02:00

137 lines
5.4 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
import logging
logger = logging.getLogger(__name__)
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']:
location, _ = Location.objects.get_or_create(name=event['location'])
location.save()
event_obj, _ = Event.objects.get_or_create(date=datetime.strptime(date['date'], "%d.%m.%Y"),
title=event['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()
logger.info('CREATED - Event: {}'.format(event_obj.title))
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, _ = Location.objects.get_or_create(key=room['@key'], name=room['short'])
location.key = room['@key']
location.name = room['short']
location.save()
logger.info('CREATE - Location: {}'.format(location.name))
except Exception as err:
logger.critical(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()
logger.info(event_obj.title)
except IntegrityError:
# TODO: Update DB Object if duplicate detected
logger.info("Found Duplicate!")
except Exception as err:
logger.exception(err.args)
Event.objects.filter(title="").delete()
def write_out_db_objects():
return "\n\tEvent: {event}\n\tLocation: {location}".format(
event=Event.objects.count(),
location=Location.objects.count(),
)
def main():
logger.info("Aktueller Stand:")
write_out_db_objects()
# deleteUnivisObjects()
# events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_HuWi)
# writeUnivisRoomDataInDB(events, rooms, persons)
# events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_SoWi)
# writeUnivisRoomDataInDB(events, rooms, persons)
# events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_GuK)
# writeUnivisRoomDataInDB(events, rooms, persons)
# events, rooms, persons = univis_eventpage_parser.parsePage(UNIVIS_RPG_WIAI)
# writeUnivisRoomDataInDB(events, rooms, persons)
writeFekideDataInDB(fekide_eventpage_parser.parsePage())
logger.info("Neuer Stand:")
write_out_db_objects()
if __name__ == '__main__':
main()