From 5b67afeec4196071a9e381daacfc8cf267610867 Mon Sep 17 00:00:00 2001 From: MG Date: Mon, 18 Jun 2018 23:54:43 +0200 Subject: [PATCH] Implement univis key --- roofis2/roomservice/models.py | 170 ++++++++++-------- .../roomservice/utils/migrate_data_rooms.py | 169 +++++++++++++++++ 2 files changed, 269 insertions(+), 70 deletions(-) create mode 100644 roofis2/roomservice/utils/migrate_data_rooms.py diff --git a/roofis2/roomservice/models.py b/roofis2/roomservice/models.py index 6ff2ec7..54f4ec6 100644 --- a/roofis2/roomservice/models.py +++ b/roofis2/roomservice/models.py @@ -3,19 +3,12 @@ from django.contrib.auth.models import User # Create your models here. -class Location(models.Model): - name = models.CharField(max_length=16) - - def __str__(self): - return '{}'.format(self.name) - - class Building(models.Model): - name = models.CharField(max_length=16) - location = models.ForeignKey(Location, on_delete=models.CASCADE) + key = models.CharField(max_length=8, unique=True) + address = models.CharField(max_length=32) def __str__(self): - return '{}'.format(self.name) + return '{}'.format(self.key) class RoomType(models.Model): @@ -25,85 +18,122 @@ class RoomType(models.Model): return '{}'.format(self.type) -class BookingGroup(models.Model): - name = models.CharField(max_length=64) - - def __str__(self): - return '{}'.format(self.name) - - +# +# +# class BookingGroup(models.Model): +# name = models.CharField(max_length=64) +# +# def __str__(self): +# return '{}'.format(self.name) +# +# class Staff(models.Model): - booking_group = models.ManyToManyField(BookingGroup) - # username = personal_id + # booking_group = models.ManyToManyField(BookingGroup) + # username = ba - Nummer user = models.OneToOneField(User, on_delete=models.CASCADE) def __str__(self): - return '{}'.format(self.user.username) + return '{} {}'.format(self.user.first_name, self.user.last_name) -class Room(models.Model): - building = models.ForeignKey('Building', on_delete=models.CASCADE) - room_number = models.CharField(max_length=16) - capacity = models.IntegerField() - seating = models.BooleanField() - barrier_free = models.BooleanField() - cooling = models.BooleanField() - room_type = models.ForeignKey(RoomType, on_delete=models.PROTECT) - floor = models.SmallIntegerField() - admin = models.ForeignKey(BookingGroup, on_delete=models.SET_DEFAULT, default=1) - service_staff = models.ForeignKey(Staff, on_delete=models.PROTECT) +class OrgUnit(models.Model): + title = models.CharField(max_length=32) def __str__(self): - return '{} - {}'.format(self.building.name, self.room_number) + return '{}'.format(self.title) class Equipment(models.Model): + univis_id = models.CharField(max_length=8) name = models.CharField(max_length=32) def __str__(self): - return '{}'.format(self.name) + return '{}'.format(self.univis_id) -class NumEquipment(models.Model): - room = models.ForeignKey(Room, on_delete=models.CASCADE) - equipment = models.ForeignKey(Equipment, on_delete=models.CASCADE) - count = models.SmallIntegerField() +class Room(models.Model): + building = models.ForeignKey('Building', on_delete=models.CASCADE, null=True, blank=True) + room_number = models.CharField(max_length=16) + capacity = models.IntegerField(null=True, blank=True) + floor = models.SmallIntegerField(null=True, blank=True) + univis_id = models.IntegerField(unique=True) + univis_key = models.CharField(unique=True, max_length=64) + room_type = models.ForeignKey(RoomType, on_delete=models.PROTECT, null=True, blank=True) + # TODO: extract equipment + description = models.CharField(max_length=64, null=True, blank=True) + equipment = models.ManyToManyField(Equipment) + + orgname = models.ForeignKey(OrgUnit, on_delete=models.PROTECT, related_name='orgname', null=True, blank=True) + orgunits = models.ManyToManyField(OrgUnit) + + # seating = models.BooleanField() + # barrier_free = models.BooleanField() + # cooling = models.BooleanField() + + # admin = models.ForeignKey(BookingGroup, on_delete=models.SET_DEFAULT, default=1) + # service_staff = models.ForeignKey(Staff, on_delete=models.PROTECT) def __str__(self): - return '{} - {} - {}'.format(self.room.room_number, self.equipment.name, self.count) + if self.building == None: + return '{}/{}'.format(None, self.room_number) + else: + return '{}/{} - {}'.format(self.building.key, self.room_number, self.orgname) -class Booking(models.Model): - DAY = 0 - WEEK = 1 - EVERY_TWO_WEEKS = 2 - MONTH = 3 +# +# class NumEquipment(models.Model): +# room = models.ForeignKey(Room, on_delete=models.CASCADE) +# equipment = models.ForeignKey(Equipment, on_delete=models.CASCADE) +# count = models.SmallIntegerField() +# +# def __str__(self): +# return '{} - {} - {}'.format(self.room.room_number, self.equipment.name, self.count) +# +class Exclude_Term(models.Model): + date = models.DateField() - TYPE_CHOICES = ((DAY, 'DAY'), (WEEK, 'WEEK'), (EVERY_TWO_WEEKS, 'EVERY_TWO_WEEKS'), (MONTH, 'MONTH')) - room = models.ForeignKey(Room, on_delete=models.CASCADE) - staff = models.ForeignKey(Staff, on_delete=models.CASCADE) - start_date = models.DateField() - end_date = models.DateField() - start_time = models.TimeField() - end_time = models.TimeField() - intervall = models.IntegerField(choices=TYPE_CHOICES) +# class Lecture_Term(models.Model): +# room = models.ForeignKey(Room, on_delete=models.CASCADE) +# start_date = models.DateField() +# end_date = models.DateField() +# start_time = models.TimeField() +# end_time = models.TimeField() +# repeat_intervall = models.IntegerField() +# excludes = models.ManyToManyField(Exclude_Term) +# # TODO: Help please +# exclude_vacation = models.BooleanField() - def __str__(self): - return '{} - {} - {}'.format(self.room.room_number, self.start_date.strftime('%Y - %m - %d'), - self.end_date.strftime('%Y - %m - %d')) - - -class AccessPoint(models.Model): - mac_address = models.CharField(max_length=12) - rooms = models.ManyToManyField(Room) - - def __str__(self): - return '{}'.format(self.mac_address) - - -class Favorite(models.Model): - staff = models.ForeignKey(Staff, on_delete=models.CASCADE) - room = models.ForeignKey(Room, on_delete=models.CASCADE) - - def __str__(self): - return '{} - {}'.format(self.staff.user.username, self.room.room_number) +# class Booking(models.Model): +# DAY = 0 +# WEEK = 1 +# EVERY_TWO_WEEKS = 2 +# MONTH = 3 +# +# TYPE_CHOICES = ((DAY, 'DAY'), (WEEK, 'WEEK'), (EVERY_TWO_WEEKS, 'EVERY_TWO_WEEKS'), (MONTH, 'MONTH')) +# room = models.ForeignKey(Room, on_delete=models.CASCADE) +# staff = models.ForeignKey(Staff, on_delete=models.CASCADE) +# start_date = models.DateField() +# end_date = models.DateField() +# start_time = models.TimeField() +# end_time = models.TimeField() +# intervall = models.IntegerField(choices=TYPE_CHOICES) +# +# def __str__(self): +# return '{} - {} - {}'.format(self.room.room_number, self.start_date.strftime('%Y - %m - %d'), +# self.end_date.strftime('%Y - %m - %d')) +# +# +# class AccessPoint(models.Model): +# mac_address = models.CharField(max_length=12) +# rooms = models.ManyToManyField(Room) +# +# def __str__(self): +# return '{}'.format(self.mac_address) +# +# +# class Favorite(models.Model): +# staff = models.ForeignKey(Staff, on_delete=models.CASCADE) +# room = models.ForeignKey(Room, on_delete=models.CASCADE) +# +# def __str__(self): +# return '{} - {}'.format(self.staff.user.username, self.room.room_number) diff --git a/roofis2/roomservice/utils/migrate_data_rooms.py b/roofis2/roomservice/utils/migrate_data_rooms.py new file mode 100644 index 0000000..16082c7 --- /dev/null +++ b/roofis2/roomservice/utils/migrate_data_rooms.py @@ -0,0 +1,169 @@ +import json +from pprint import pprint +from django.db.utils import IntegrityError + +from roomservice.models import Room, Building, RoomType, OrgUnit, Equipment +from .parser import univis_rooms_parser +from .parser import univis_lectures_parser +import ast + +import logging + +logger = logging.getLogger(__name__) + +# CONFIG Fakultaet +FAKULTAET_GuK = "Fakult%E4t%20Geistes-%20und%20Kulturwissenschaften" +FAKULTAET_SoWi = "Fakult%E4t%20Sozial-%20und%20Wirtschaftswissenschaften" +FAKULTAET_HuWi = "Fakult%E4t%20Humanwissenschaften" +FAKULTAET_WIAI = "Fakult%E4t%20Wirtschaftsinformatik" + +# CONFIG Locations +RZ = "http://univis.uni-bamberg.de/prg?search=rooms&name=rz&show=xml" +WEBEREI = "http://univis.uni-bamberg.de/prg?search=rooms&name=we&show=xml" +FEKI = "http://univis.uni-bamberg.de/prg?search=rooms&name=f&show=xml" +MARKUSHAUS = "http://univis.uni-bamberg.de/prg?search=rooms&name=m&show=xml" +UNIVERSITAET = "http://univis.uni-bamberg.de/prg?search=rooms&name=u&show=xml" +KAPUZINERSTR = "http://univis.uni-bamberg.de/prg?search=rooms&name=k&show=xml" +ZWINGER = "http://univis.uni-bamberg.de/prg?search=rooms&name=z&show=xml" +AULA = "http://univis.uni-bamberg.de/prg?search=rooms&name=a&show=xml" + + +# CONFIG ROOMS +def univis_rooms(fakultaet): + return "http://univis.uni-bamberg.de/prg?search=rooms&department=" + fakultaet + "&show=xml" + + +# CONFIG LECTURES +def univis_lectures(fakultaet): + return "http://univis.uni-bamberg.de/prg?search=lectures&department=" + fakultaet + "&show=exml" + + +def univis_rooms_loc(kuerzel): + return "http://univis.uni-bamberg.de/prg?search=rooms&name=" + kuerzel + "&show=xml" + + +def getJsonFromFile(path): + with open(path, "r") as file: + return json.load(file) + + +def writeUnivisRoomDataInDB(rooms): + for room in rooms: + try: + building = None + if 'address' in room and 'buildingkey' in room: + building_address = room['address'] + building_key = room['buildingkey'] + building, _ = Building.objects.get_or_create(key=building_key, address=building_address) + + short = str(room['short']).split(sep='/')[-1] + univis_id = room['id'] + univis_key = room['@key'] + + capacity = None + if 'size' in room: + capacity = room['size'] + + floor = None + if 'floor' in room: + floor = room['floor'] + + room_type = None + if 'name' in room: + room_type, _ = RoomType.objects.get_or_create(type=room['name']) + + description = None + if 'description' in room: + description = room['description'] + + orgname = None + if 'orgname' in room: + orgname, _ = OrgUnit.objects.get_or_create(title=room['orgname']) + + room_db_obj, _ = Room.objects.update_or_create(building=building, + room_number=short, + capacity=capacity, + floor=floor, + univis_id=univis_id, + univis_key=univis_key, + room_type=room_type, + description=description, + orgname=orgname) + + equipment_options = Equipment.objects.all() + for equipment in equipment_options: + univis_id = equipment.univis_id.lower() + if univis_id in room and room[univis_id] == 'ja': + room_db_obj.equipment.add(equipment) + + orgunits = None + if 'orgunits' in room: + for orgunit in room['orgunits']: + if len(orgunit) > 0: + for orgunit in str(room['orgunits']['orgunit']).strip("[]").split(','): + cleaned_orgunit = orgunit.strip().strip("'").strip("'") + orgunit, _ = OrgUnit.objects.get_or_create(title=cleaned_orgunit) + room_db_obj.orgunits.add(orgunit) + + # TODO: Check xml syntax #orgunit problem + pass + else: + orgunit, _ = OrgUnit.objects.get_or_create(title=orgunit) + room_db_obj.orgunits.add(orgunit) + + # room_db_obj.save() + logger.info('ROOM: {}'.format(room_db_obj.room_number)) + + + except IntegrityError as err: + logger.warning(err) + logger.warning('Room already exists') + + +def delete(): + rooms = Room.objects.all() + logger.info("Deleted following Rooms:") + for room in rooms: + logger.info("Room: {name}".format( + name=room.short) + ) + room.delete() + + +def main(): + # get food jsons + logger.info("\nStart:\nRoom: {}\nOrgunits: {}\nBuildings: {}\nRoomTypes: {}" + .format(Room.objects.count(), + OrgUnit.objects.count(), + Building.objects.count(), + RoomType.objects.count())) + + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_GuK))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_SoWi))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_HuWi))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms(FAKULTAET_WIAI))) + writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("k"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("z"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("u"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("w"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("f"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("r"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("h"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("l"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("m"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("o"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("p"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("v"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("w"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("d"))) + # writeUnivisRoomDataInDB(univis_rooms_parser.parsePage(univis_rooms_loc("x"))) + + logger.info("\nFinished:\nRoom: {}\nOrgunits: {}\nBuildings: {}\nRoomTypes: {}" + .format(Room.objects.count(), + OrgUnit.objects.count(), + Building.objects.count(), + RoomType.objects.count())) + + +if __name__ == '__main__': + main()