now using campus API

This commit is contained in:
Tobias Kurze
2020-08-11 16:39:13 +02:00
parent 160076afcf
commit 9c19708381
9 changed files with 194 additions and 127 deletions

View File

@@ -75,7 +75,7 @@ def main():
wsb = WebSocketBase()
print("running websocket...(replaces normal app.run()")
wsb.start_websocket(debug=True)
wsb.start_websocket(debug=True, host="0.0.0.0")
# print("running web app...")
# app.run(debug=True, host="0.0.0.0", threaded=True)
wsb.send_test_msg()

Binary file not shown.

View File

@@ -10,7 +10,6 @@ from sqlalchemy.exc import IntegrityError
from datetime import datetime, timedelta
from backend import db, app, login_manager
from backend.tools.scrape_rooms import scrape_rooms
metadata = MetaData()

View File

@@ -5,15 +5,15 @@ Models for lecture recorder
import json
import logging
from sqlalchemy import MetaData, CheckConstraint
from sqlalchemy import MetaData, CheckConstraint, UniqueConstraint
from sqlalchemy.exc import IntegrityError
from datetime import datetime, timedelta
from backend import db, app, login_manager
from backend.tools.scrape_rooms import scrape_rooms
from backend.tools.campus_rooms import get_campus_rooms
logger = logging.getLogger("lrc."+__name__)
logger = logging.getLogger("lrc." + __name__)
metadata = MetaData()
@@ -23,16 +23,19 @@ class Room(db.Model):
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow())
name = db.Column(db.Unicode(127), unique=False, nullable=False)
alternate_name = db.Column(db.Unicode(127), unique=False, nullable=True, default=None)
external_id = db.Column(db.String, nullable=True, unique=True)
coordinates = db.Column(db.String, nullable=True)
comment = db.Column(db.Unicode(2047), unique=False, nullable=True, default="")
number = db.Column(db.Unicode(63), unique=False, nullable=True)
number = db.Column(db.Unicode(63), unique=False, nullable=True, default=None)
building_name = db.Column(db.Unicode(63), unique=False, nullable=True)
building_number = db.Column(db.Unicode(63), unique=False, nullable=True)
building_number = db.Column(db.Unicode(63), unique=False, nullable=True, default=None)
recorder = db.relationship('Recorder', uselist=False, back_populates='room') # one-to-one relation (uselist=False)
__table_args__ = (
CheckConstraint('length(name) > 2',
name='name_min_length'),
UniqueConstraint('name', 'number', 'building_number', 'external_id'),
)
def __init__(self, **kwargs):
@@ -76,13 +79,15 @@ class Room(db.Model):
def pre_fill_table():
rooms = scrape_rooms()
logger.debug("tada")
# Room.query.delete() # drop all rooms
rooms = get_campus_rooms()
logger.debug("got {} rooms".format(len(rooms)))
db_rooms = [Room(name=room['name'], number=room['room_number'],
building_name=room['building_name'], building_number=room['building_number']) for room in
rooms]
db_rooms = [Room(name=room['name'], number=room['room_number'], alternate_name=room.get('alternate_name', None),
building_name=room['building_name'], building_number=room['building_number'],
coordinates=room.get('coordinates', None), external_id=room.get('external_id', None)
) for room in
rooms]
try:
db.session.bulk_save_objects(db_rooms)
db.session.commit()

View File

@@ -0,0 +1,55 @@
import re
from campus_api_client.campus_management_api_client import CampusManagementApiClient
from backend import Config
def get_campus_rooms():
cac = CampusManagementApiClient(user=Config.CAMPUS_MANAGEMENT_USER, pw=Config.CAMPUS_MANAGEMENT_PW)
parsed_rooms = []
count = 0
re_string = r"^(\d\d.\d\d)?\s(.*)"
re_exp = re.compile(re_string)
for r in cac.get_rooms():
name = r.get('name')
# print(f"## {r.get('name')}: {r.get('roomNo')}")
building_number = r.get('buildingNo', None)
building_name = r.get('building')
if building_number is None or building_number == '':
count += 1
# print(r)
match = re_exp.match(building_name)
if match is not None:
building_number, building_name = match.groups()
else:
try:
building_name = building_name.split(building_number)[1].strip()
building_name = None if building_name == "" else building_name
except IndexError: # ignore index error
pass
# print(f"Building No {r.get('buildingNo')}: {r.get('building')}")
# print(building_name)
# print(building_number)
if building_number is not None and building_number != "" and name.startswith(building_number):
name = name.split(building_number, 1)[1].strip()
elif building_number is not None and name.startswith(f"Geb. {building_number}"):
name = name.split(f"Geb. {building_number}", 1)[1].strip()
room = {'name': name,
'alternate_name': r.get('internalName'),
'external_id': r.get('guid'),
'room_number': r.get('roomNo'),
'building_name': building_name,
'building_number': building_number,
'coordinates': r.get('coordinates')}
parsed_rooms.append(room)
print(len(parsed_rooms))
return parsed_rooms
if __name__ == "__main__":
rooms = get_campus_rooms()
print(len(rooms))

File diff suppressed because one or more lines are too long