now rooms, recorders and recorder models get initialized in DB
This commit is contained in:
@@ -4,18 +4,27 @@
|
||||
# Copyright (c) 2019. Tobias Kurze
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
from json import dumps
|
||||
from pprint import pprint
|
||||
|
||||
from sqlalchemy import and_
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
|
||||
from backend import db
|
||||
from backend.models.recorder_model import RecorderModel, RecorderCommand
|
||||
from backend.models import Room
|
||||
from backend.models.recorder_model import RecorderModel, RecorderCommand, Recorder
|
||||
from backend.recorder_adapters import get_defined_recorder_adapters
|
||||
from backend.tools.helpers import calculate_md5_checksum
|
||||
|
||||
KNOWN_RECORDERS = {re.compile(r'(?P<name>SMP)[\s]*(?P<number>[\d]+)[\s]*.?[\s]*(?P<options>[\S]*)'): 'SMP',
|
||||
re.compile(
|
||||
r'(?P<name>LectureRecorder X2|LectureRecorder|VGADVI Recorder|DVI Broadcaster DL|DVIRecorderDL)'): 'Epiphan'}
|
||||
|
||||
|
||||
def create_recorder_commands_for_recorder_adapter(command_definitions: dict, recorder_model: RecorderModel):
|
||||
existing_recorder_commands = RecorderCommand.query.filter(
|
||||
@@ -46,24 +55,96 @@ def create_recorder_commands_for_recorder_adapter(command_definitions: dict, rec
|
||||
def update_recorder_models_database():
|
||||
r_as = get_defined_recorder_adapters()
|
||||
for r_a in r_as:
|
||||
r_m = RecorderModel.get_by_adapter_id(r_a["id"])
|
||||
model_checksum = calculate_md5_checksum(dumps(r_a["commands"]))
|
||||
if r_m is None:
|
||||
r_m = RecorderModel(record_adapter_id=r_a["id"], model_name=r_a["name"], checksum=model_checksum,
|
||||
requires_user=r_a.get('requires_user', None),
|
||||
requires_password=r_a.get('requires_password', None))
|
||||
db.session.add(r_m)
|
||||
db.session.flush()
|
||||
db.session.refresh(r_m)
|
||||
else:
|
||||
if not model_checksum == r_m.checksum:
|
||||
r_m.model_name = r_a["name"]
|
||||
r_m.last_time_modified = datetime.utcnow()
|
||||
r_m.checksum = model_checksum
|
||||
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
|
||||
try:
|
||||
r_m = RecorderModel.get_by_adapter_id(r_a["id"])
|
||||
model_checksum = calculate_md5_checksum(dumps(r_a["commands"]))
|
||||
if r_m is None:
|
||||
r_m = RecorderModel(record_adapter_id=r_a["id"], model_name=r_a["name"], checksum=model_checksum,
|
||||
**r_a.get('class', {}).get_recorder_params())
|
||||
db.session.add(r_m)
|
||||
db.session.flush()
|
||||
db.session.refresh(r_m)
|
||||
else:
|
||||
if not r_m.model_name == r_a["name"]:
|
||||
r_m.model_name = r_a["name"]
|
||||
r_m.last_time_modified = datetime.utcnow()
|
||||
if not model_checksum == r_m.checksum:
|
||||
r_m.last_time_modified = datetime.utcnow()
|
||||
r_m.checksum = model_checksum
|
||||
r_m.last_checksum_change = datetime.utcnow()
|
||||
create_recorder_commands_for_recorder_adapter(r_a["commands"], r_m)
|
||||
except IntegrityError as e:
|
||||
db.session.rollback()
|
||||
db.session.commit()
|
||||
|
||||
|
||||
def get_recorder_room(rec: dict) -> Room():
|
||||
rooms = Room.get_by_building_number(rec.get('building', None))
|
||||
if rooms.count() <= 1:
|
||||
return rooms.first()
|
||||
room_name = rec.get('room')
|
||||
for room in rooms:
|
||||
if all([r_n in room.name for r_n in room_name.split()]):
|
||||
return room
|
||||
|
||||
|
||||
def create_default_recorders():
|
||||
models = RecorderModel.get_all()
|
||||
for m in models:
|
||||
print(m)
|
||||
|
||||
f = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, 'models', 'initial_recorders.json'))
|
||||
with open(f, 'r') as json_file:
|
||||
recorders = json.load(json_file)['recorders']
|
||||
for r in recorders:
|
||||
type = r.get('type')
|
||||
firmware_version = r.get('firmware_version', None)
|
||||
room_rec_name = r.get('name')
|
||||
username = r.get('username', None)
|
||||
password = r.get('password', None)
|
||||
mac = r.get('mac', None)
|
||||
ip4 = r.get('ip', None)
|
||||
additional_camera = r.get('additional_camera', False)
|
||||
description = r.get('description', '')
|
||||
for k_r in KNOWN_RECORDERS:
|
||||
if match := k_r.search(type):
|
||||
name = match.groupdict().get('name')
|
||||
model_number = match.groupdict().get('number', None)
|
||||
|
||||
options = match.groupdict().get('options', None)
|
||||
|
||||
if model_number is not None:
|
||||
model_name = name + model_number[:-1] # just get prefix (remove last digit)
|
||||
else:
|
||||
model_name = KNOWN_RECORDERS[k_r]
|
||||
rec_model = RecorderModel.get_where_adapter_id_contains(model_name)
|
||||
|
||||
rec = Recorder(name=room_rec_name + " Recorder", model_name=model_name, recorder_model=rec_model,
|
||||
username=username, password=password, firmware_version=firmware_version)
|
||||
rec.mac = mac
|
||||
rec.ip = ip4
|
||||
rec.additional_camera_connected = additional_camera
|
||||
rec.additional_note = description
|
||||
|
||||
rec.room = get_recorder_room(r)
|
||||
print(rec)
|
||||
|
||||
db.session.add(rec)
|
||||
db.session.flush()
|
||||
db.session.refresh(rec)
|
||||
|
||||
print(recorders)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
db.create_all()
|
||||
update_recorder_models_database()
|
||||
recorders = Recorder.get_all()
|
||||
for r in recorders:
|
||||
print("{}: {}".format(r, r.room))
|
||||
# db.drop_all()
|
||||
# db.create_all()
|
||||
# update_recorder_models_database()
|
||||
# create_default_recorders()
|
||||
# db.session.commit()
|
||||
|
||||
# print(get_recorder_room({"room": "Grosser Hörsaal Bauingenieure", "building": "10.50"}))
|
||||
# print(get_recorder_room({"room": "Grosser Hörsaal Bauingenieure", "building": "30.95"}))
|
||||
|
||||
@@ -57,4 +57,4 @@ def scrape_rooms():
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
scrape_rooms()
|
||||
pprint(scrape_rooms())
|
||||
|
||||
Reference in New Issue
Block a user