script udpate regarding awaits removed from context

This commit is contained in:
Andrius Č. 2020-08-28 17:06:42 +03:00
parent e5a139c4e6
commit f68a5db293
1 changed files with 68 additions and 45 deletions

View File

@ -1,19 +1,25 @@
from System import Guid
from datetime import datetime, timedelta, time
from threading import Timer
import json
from json import dumps
import csv
import os
import clr
clr.AddReference("NLog")
from NLog import LogManager
# CONFIGURATION >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ACCESS_LEVELS = {"Breakfast": ["07:00:00", "08:00:00"],
"Lunch": ["12:01:00", "14:00:00"],
"Dinner": ["21:00:00", "22:00:00"]
ACCESS_LEVELS = {"Breakfast": ["04:30:00", "08:00:00"],
"Lunch": ["11:40:00", "14:00:00"],
"Dinner": ["17:00:00", "22:00:00"]
}
MONITORED_DOORS = ['Room']
ACCESS_LEVELS_RESET_TIME = time(hour=11, minute=2, second=0)
MONITORED_DOORS = ['CANTEEN-DOOR-L-TUR-1 Ent','CANTEEN-DOOR-L-TUR-2 Ent','CANTEEN-DOOR-R-TUR-1 Ent','CANTEEN-DOOR-R-TUR-2 Ent']
ACCESS_LEVELS_RESET_TIME = time(hour=23, minute=23, second=0)
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ACCESSGRANTED = Guid("891adc81-6991-44c2-8aa4-f7a0792f77f5")
logger = LogManager.GetCurrentClassLogger()
class AccessLevel(object):
def __init__(self, name, schedule):
@ -46,20 +52,19 @@ class DeletedAccessLevelsContainer(object):
def get_users_accessLevels(self):
result = [{"UserId": key, "AccessLevelsIds": value} for key, value in self.deletedAccessLevelsList.iteritems()]
return json.dumps(result)
return result
def add_device(self, deviceId):
if deviceId not in self.devices["ids"]:
self.devices["ids"].append(deviceId)
def add_deleted_access_level(self, userId, access_level_id, device_id):
def add_deleted_access_level(self, userId, access_level_id, device_id, currentTime):
if userId not in self.deletedAccessLevelsList:
self.deletedAccessLevelsList[userId] = []
if access_level_id not in self.deletedAccessLevelsList[userId]:
self.deletedAccessLevelsList[userId].append(access_level_id)
if device_id is not None:
fileHandler.write_file(userId, access_level_id, device_id)
fileHandler.write_file(userId, access_level_id, device_id, currentTime)
deletedAccessLevels = DeletedAccessLevelsContainer()
@ -73,42 +78,48 @@ class FileHandler(object):
with open("deletedUsers.csv", "r") as csvFile:
reader = csv.reader(csvFile, delimiter=';')
for row in reader:
self.instance.add_deleted_access_level(int(row[0]), int(row[1]), None)
self.instance.add_deleted_access_level(row[0], row[1], None, None)
if row[2] not in deletedAccessLevels.devices["ids"]:
deletedAccessLevels.add_device(int(row[2]))
csvFile.close()
print "History read success"
except Exception as e:
print e
logger.Info(str(e))
def write_file(self, userID, accessLevelId,deviceId):
with open("deletedUsers.csv", "a+") as csvFile:
writer = csv.writer(csvFile, delimiter=';', lineterminator='\n')
writer.writerow((userID, accessLevelId, deviceId))
csvFile.close()
def write_file(self, userID, accessLevelId, deviceId, currentDate):
try:
with open("deletedUsers.csv", "a+") as csvFile:
writer = csv.writer(csvFile, delimiter=';', lineterminator='\n')
writer.writerow((userID, accessLevelId, deviceId, currentDate))
csvFile.close()
except Exception as e:
logger.Warn(str(e))
accessLevelContainer = AccessLevelsContainer()
fileHandler = FileHandler(deletedAccessLevels)
def chunks(lst):
for i in xrange(0, len(lst), 100):
yield lst[i:i + 100]
def reset_access_levels():
print "Access level reset executed"
result = context.add_users_access_levels(deletedAccessLevels.get_users_accessLevels())
for item in chunks(deletedAccessLevels.get_users_accessLevels()):
result = context.add_users_access_levels(dumps(item))
if result is False:
logger.Info("Access levels restore failed for {}".format(item))
logger.Info("Access level reset executed")
if not result.Result:
print "USER access levels update FAILED"
context.synchronize_devices(dumps(deletedAccessLevels.devices))
logger.Info("Devices {} synchronization started".format(deletedAccessLevels.devices))
for device in deletedAccessLevels.devices["ids"]:
context.synchronize_device(device)
# context.synchronize_devices(json.dumps(deletedAccessLevels.devices))
print "Devices sync executed"
deletedAccessLevels.deletedAccessLevelsList.clear()
deletedAccessLevels.devices["ids"] = []
os.remove("./deletedUsers.csv")
print "Access level history file removed"
os.remove("deletedUsers.csv")
logger.Info("File 'deletedUsers.csv' deleted")
reset_scheduler()
@ -120,7 +131,7 @@ def reset_scheduler():
nextDay += timedelta(days=1)
delta_t = nextDay - currentDay
secs = delta_t.total_seconds()
print "Reset will start at ", nextDay
logger.Info("Reset will start at {}".format(nextDay))
t = Timer(secs, reset_access_levels)
t.start()
@ -131,23 +142,35 @@ def on_init():
def on_event(event):
currentDateTime = datetime.now()
currentTime = (currentDateTime.strftime("%H:%M:%S"))
accessGranted = Guid("891adc81-6991-44c2-8aa4-f7a0792f77f5")
if event.typeUid != accessGranted or (event.sourceDoorName not in MONITORED_DOORS):
print event.typeUid
if event.typeUid != ACCESSGRANTED:
return
user = context.get_user_access_levels(event.userId)
elif event.sourceDoorName not in MONITORED_DOORS:
logger.Info("Door '{}' is not set to be monitored".format(event.sourceDoorName))
return
elif event.userId == None:
logger.Info("UserId doesn't exist")
return
else:
pass
for accessLevel in accessLevelContainer.accessLevelsList:
if accessLevel.schedule[0] <= currentTime <= accessLevel.schedule[1]:
for userAccessLevel in user.Result:
if userAccessLevel.Name == accessLevel.name:
accessLevelId = userAccessLevel.AccessLevelId
deletedAccessLevel = DeletedAccessLevel(event.userId, event.deviceId, userAccessLevel)
deletedAccessLevels.add_deleted_access_level(deletedAccessLevel.userId, accessLevelId, event.deviceId)
deletedAccessLevels.add_device(event.deviceId)
result = context.delete_user_access_level(userAccessLevel.Id, event.userId)
print "User {} access level removed".format(event.userId)
userAccessLevels = context.get_user_access_levels(event.userId)
try:
for accessLevel in accessLevelContainer.accessLevelsList:
if accessLevel.schedule[0] <= currentTime <= accessLevel.schedule[1]:
for userAccessLevel in userAccessLevels:
if userAccessLevel.name == accessLevel.name:
accessLevelId = userAccessLevel.accessLevelId
deletedAccessLevel = DeletedAccessLevel(event.userId, event.deviceId, userAccessLevel)
deletedAccessLevels.add_deleted_access_level(deletedAccessLevel.userId, accessLevelId,
event.deviceId, currentTime)
deletedAccessLevels.add_device(event.deviceId)
context.delete_user_access_level(userAccessLevel.id, event.userId)
logger.Info("User {} access level removed".format(event.userId))
break
except Exception as e:
logger.Warn(str(e))
break