Implement univis key

This commit is contained in:
Götz 2018-06-18 23:54:43 +02:00
parent dd9d3565ed
commit 5b67afeec4
2 changed files with 269 additions and 70 deletions

View File

@ -3,19 +3,12 @@ from django.contrib.auth.models import User
# Create your models here. # 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): class Building(models.Model):
name = models.CharField(max_length=16) key = models.CharField(max_length=8, unique=True)
location = models.ForeignKey(Location, on_delete=models.CASCADE) address = models.CharField(max_length=32)
def __str__(self): def __str__(self):
return '{}'.format(self.name) return '{}'.format(self.key)
class RoomType(models.Model): class RoomType(models.Model):
@ -25,85 +18,122 @@ class RoomType(models.Model):
return '{}'.format(self.type) return '{}'.format(self.type)
class BookingGroup(models.Model): #
name = models.CharField(max_length=64) #
# class BookingGroup(models.Model):
def __str__(self): # name = models.CharField(max_length=64)
return '{}'.format(self.name) #
# def __str__(self):
# return '{}'.format(self.name)
#
#
class Staff(models.Model): class Staff(models.Model):
booking_group = models.ManyToManyField(BookingGroup) # booking_group = models.ManyToManyField(BookingGroup)
# username = personal_id # username = ba - Nummer
user = models.OneToOneField(User, on_delete=models.CASCADE) user = models.OneToOneField(User, on_delete=models.CASCADE)
def __str__(self): def __str__(self):
return '{}'.format(self.user.username) return '{} {}'.format(self.user.first_name, self.user.last_name)
class Room(models.Model): class OrgUnit(models.Model):
building = models.ForeignKey('Building', on_delete=models.CASCADE) title = models.CharField(max_length=32)
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)
def __str__(self): def __str__(self):
return '{} - {}'.format(self.building.name, self.room_number) return '{}'.format(self.title)
class Equipment(models.Model): class Equipment(models.Model):
univis_id = models.CharField(max_length=8)
name = models.CharField(max_length=32) name = models.CharField(max_length=32)
def __str__(self): def __str__(self):
return '{}'.format(self.name) return '{}'.format(self.univis_id)
class NumEquipment(models.Model): class Room(models.Model):
room = models.ForeignKey(Room, on_delete=models.CASCADE) building = models.ForeignKey('Building', on_delete=models.CASCADE, null=True, blank=True)
equipment = models.ForeignKey(Equipment, on_delete=models.CASCADE) room_number = models.CharField(max_length=16)
count = models.SmallIntegerField() 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): 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 # class NumEquipment(models.Model):
WEEK = 1 # room = models.ForeignKey(Room, on_delete=models.CASCADE)
EVERY_TWO_WEEKS = 2 # equipment = models.ForeignKey(Equipment, on_delete=models.CASCADE)
MONTH = 3 # 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')) # class Lecture_Term(models.Model):
room = models.ForeignKey(Room, on_delete=models.CASCADE) # room = models.ForeignKey(Room, on_delete=models.CASCADE)
staff = models.ForeignKey(Staff, on_delete=models.CASCADE) # start_date = models.DateField()
start_date = models.DateField() # end_date = models.DateField()
end_date = models.DateField() # start_time = models.TimeField()
start_time = models.TimeField() # end_time = models.TimeField()
end_time = models.TimeField() # repeat_intervall = models.IntegerField()
intervall = models.IntegerField(choices=TYPE_CHOICES) # excludes = models.ManyToManyField(Exclude_Term)
# # TODO: Help please
# exclude_vacation = models.BooleanField()
def __str__(self): # class Booking(models.Model):
return '{} - {} - {}'.format(self.room.room_number, self.start_date.strftime('%Y - %m - %d'), # DAY = 0
self.end_date.strftime('%Y - %m - %d')) # WEEK = 1
# EVERY_TWO_WEEKS = 2
# MONTH = 3
class AccessPoint(models.Model): #
mac_address = models.CharField(max_length=12) # TYPE_CHOICES = ((DAY, 'DAY'), (WEEK, 'WEEK'), (EVERY_TWO_WEEKS, 'EVERY_TWO_WEEKS'), (MONTH, 'MONTH'))
rooms = models.ManyToManyField(Room) # room = models.ForeignKey(Room, on_delete=models.CASCADE)
# staff = models.ForeignKey(Staff, on_delete=models.CASCADE)
def __str__(self): # start_date = models.DateField()
return '{}'.format(self.mac_address) # end_date = models.DateField()
# start_time = models.TimeField()
# end_time = models.TimeField()
class Favorite(models.Model): # intervall = models.IntegerField(choices=TYPE_CHOICES)
staff = models.ForeignKey(Staff, on_delete=models.CASCADE) #
room = models.ForeignKey(Room, on_delete=models.CASCADE) # def __str__(self):
# return '{} - {} - {}'.format(self.room.room_number, self.start_date.strftime('%Y - %m - %d'),
def __str__(self): # self.end_date.strftime('%Y - %m - %d'))
return '{} - {}'.format(self.staff.user.username, self.room.room_number) #
#
# 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)

View File

@ -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()