def main(): flash("Getting user list...") users = Users() userList = users.getAllUsers() notificationsManager = NotificationsManager() for user in userList: flash("Looking for " + str(user.uuid) + ":" + user.username + " notifications...") notificationList = notificationsManager.getNotifications(userUuid = str(user.uuid), username = user.username, automaticallySetAsRead = False) if len(notificationList["notifications"]): recipientUuid = notificationList["notifications"][0]["recipientUuid"] messageText = "" for notification in notificationList["notifications"]: messageText += notification["messageSubject"] + " (" + notification["sendTimestamp"] + ")" + "\n" messageText += "----------------------------------------------------" + "\n" messageText += notification["messageText"] + "\n" messageText += "\n\n\n" messageSubject = "[BUILDING RULES] - Notifications report" flash("Sending report to " + str(user.uuid) + ":" + user.username + ":" + user.email) notificationsManager.sendNotificationByEmail(recipientUuid = recipientUuid, messageSubject = messageSubject, messageText = messageText)
def userNotifications(username=None): if request.method == "POST": sessionKey = validateInput(request.form["sessionKey"]) userUuid = validateInput(request.form["userUuid"]) try: session = SessionManager() session.checkSessionValidity(sessionKey, userUuid) from app.backend.controller.notificationsManager import NotificationsManager notifications = NotificationsManager() return returnResult(notifications.getNotifications(username=username, userUuid=userUuid)) except Exception as e: return returnError(e)
def editRule(self, ruleId = None, priority = None, buildingName = None, groupId = None, authorUuid = None, ruleBody = None): from app.backend.model.rule import Rule oldRule = Rule(id = ruleId) oldRule.retrieve() from app.backend.model.user import User author = User(uuid = authorUuid) author.retrieve() result = self.__addOrModifyRule(ruleId = ruleId, priority = priority, buildingName = buildingName, groupId = groupId, authorUuid = authorUuid, ruleBody = ruleBody) from app.backend.controller.notificationsManager import NotificationsManager notifications = NotificationsManager() messageSubject = "Rule modified in building " + str(buildingName) + " group " + str(groupId) messageText = "The user " + str(author.username) + " edited (or tried to edit) the rule <<" + str(oldRule.getFullRepresentation()) + ">>. The new rule is <<" + str(ruleBody) + ">>" notifications.sendNotification(buildingName = buildingName, groupId = groupId, messageSubject = messageSubject, messageText = messageText) return result
def editRule(self, ruleId, priority, buildingName, roomName, editorUuid, groupId, ruleBody = None, antecedent = None, consequent = None, enabled = True): checkData(locals()) if not ruleBody: if not antecedent: raise MissingInputDataError("") if not consequent: raise MissingInputDataError("") if ruleBody and antecedent: raise TooManyInputParametersError("") if ruleBody and consequent: raise TooManyInputParametersError("") from app.backend.model.rule import Rule oldRule = Rule(id = ruleId) oldRule.retrieve() from app.backend.model.user import User author = User(uuid = oldRule.authorUuid) author.retrieve() editor = User(uuid = editorUuid) editor.retrieve() writePermission = False errorMessage = "" # If this room is not related to a room, I cannot modify it from this method if not oldRule.roomName: raise UserCredentialError("You cannot modify this group related rule.") # If this rule is not about this building if oldRule.buildingName != buildingName: raise UserCredentialError("You cannot modify the rule of another building.") if author.uuid != editor.uuid: if not groupId and not oldRule.getRoom().roomName in list(r.roomName for r in editor.getRooms()): raise UserCredentialError("You cannot modify a rule of a room you do not own.") #if oldRule.getRoom() not in editor.getRooms(): # raise UserCredentialError("You cannot modify a rule of a room you do not own.") if groupId: from app.backend.model.group import Group group = Group(buildingName = buildingName, id = groupId) group.retrieve() if not group: raise UserCredentialError("You cannot modify a rule of a room you do not own.") if not group.crossRoomsValidation: raise UserCredentialError("You cannot modify a rule you do not own.") if not group.id in list(g.id for g in editor.getGroups()): raise UserCredentialError("You cannot modify a rule belonging to a group you do not own.") if not oldRule.getRoom().roomName in list(r.roomName for r in group.getRooms()): raise UserCredentialError("You cannot modify a rule belonging to room that does not belongs to a group you do not own.") if editor.level < oldRule.getPriority(): raise UserCredentialError("You cannot modify this rule since it has a too high priority for your user level") authorUuid = editorUuid result = self.__addOrModifyRule(ruleId = ruleId, priority = priority, buildingName = buildingName, roomName = roomName, authorUuid = authorUuid, ruleBody = ruleBody, antecedent = antecedent, consequent = consequent, enabled = enabled) from app.backend.controller.notificationsManager import NotificationsManager notifications = NotificationsManager() messageSubject = "Rule modified in building " + str(buildingName) + " room " + str(roomName) messageText = "The user " + str(editor.username) + " edited (or tried to edit) the rule <<" + str(oldRule.getFullRepresentation()) + ">>. The new rule is <<" + str(ruleBody) + ">>" notifications.sendNotification(buildingName = buildingName, roomName = roomName, messageSubject = messageSubject, messageText = messageText) return result
def __addOrModifyRule(self, priority = None, buildingName = None, groupId = None, authorUuid = None, ruleBody = None, ruleId = None): checkData(locals()) import time,datetime startTimeMilliseconds = long((time.time() + 0.5) * 1000) try: antecedent = ruleBody.split("then")[0].replace("if ", "").strip() consequent = ruleBody.split("then")[1].strip() except Exception as e: raise NotWellFormedRuleError("There is a syntax error in the rule you are trying to save") from app.backend.controller.actionManager import ActionManager actionManager = ActionManager() category = actionManager.getAction(consequent).category from app.backend.model.user import User author = User(uuid = authorUuid) author.retrieve() if int(str(priority)) < 0 or int(str(priority)) > author.getMaxGroupPriority(): raise RulePriorityError("You can specify rules for groups with a priority value between 0 and " + str(author.getMaxRoomPriority()) + ". You inserted " + str(priority)) from app.backend.model.rule import Rule from app.backend.model.group import Group if not ruleId: rule = Rule(priority = priority, category = category, buildingName = buildingName, groupId = groupId, authorUuid = authorUuid, antecedent = antecedent, consequent = consequent, enabled = True) else: rule = Rule(id = ruleId) rule.retrieve() author = rule.getAuthor() rule.antecedent = antecedent rule.consequent = consequent rule.authorUuid = authorUuid editor = rule.getAuthor() if editor.level < rule.getPriority(): raise UserCredentialError("You cannot modify this rule since it has a too high priority for your user level") group = Group(buildingName = buildingName, id = groupId) group.retrieve() if not ruleId and not rule.checkIfUnique(): raise DuplicatedRuleError("The submitted rule is already been saved for the considered group.") # excludedRuleId is needed to ignore the rule that the user want to edit excludedRuleId = ruleId if ruleId else None ruleCheckErrorList = [] groupRoomList = group.getRooms() for room in groupRoomList: groupRules = group.getRules(excludedRuleId = excludedRuleId) # Checking that a priority is unique over the same category for r in groupRules: if str(r.category) == str(category) and int(r.getPriority()) == int(priority): raise AlredyAssignedPriorityError("In group " + str(groupId) + " the priority " + str(priority) + " has alredy been assigned to another rule with the same category!") temporaryRuleSet = [] temporaryRuleSet.extend(room.getRules(author = False, includeGroupsRules = True, excludedRuleId = False, excludeCrossRoomValidationRules = True)) temporaryRuleSet.extend(groupRules) temporaryRuleSet.append(rule) from app.backend.controller.rulesetChecker import RulesetChecker rulesetChecker = RulesetChecker(temporaryRuleSet) ruleCheckErrorList.extend(rulesetChecker.check()) if len(ruleCheckErrorList) == 0: if ruleId: #if i'm in edit mode rule.id = ruleId rule.setPriority(priority) # Disabling rules in all the groups rooms since they have to be validated again for room in groupRoomList: from app.backend.controller.notificationsManager import NotificationsManager notifications = NotificationsManager() messageSubject = "Group " + str(groupId) + " changed your room " + str(room.roomName) + " policy." messageText = "Some rules in group " + str(groupId) + " have been changed." notifications.sendNotification(buildingName = buildingName, roomName = room.roomName, messageSubject = messageSubject, messageText = messageText) #for r in room.getRules(includeGroupsRules = False, excludeCrossRoomValidationRules = True): # r.disable() from app.backend.commons.console import flash endTimeMilliseconds = long((time.time() + 0.5) * 1000) opTimeMilliseconds = endTimeMilliseconds - startTimeMilliseconds flash("GroupsRuleVerification [SUCCESS]: groupId = " + str(groupId) +" #rules=" + str(len(temporaryRuleSet)) + " - opTimeMilliseconds:" + str(opTimeMilliseconds)) return group.addRule(rule).getDict() else: from app.backend.commons.console import flash logMessage = "authorUuid = " + str(authorUuid) + ", " logMessage += "buildingName = " + str(buildingName) + ", " logMessage += "gropuId = " + str(groupId) + ", " logMessage += "ruleSetDescr = " + str(temporaryRuleSet) + ", " logMessage += "newRule = " + str(rule) flash("RuleValidationError: " + logMessage) endTimeMilliseconds = long((time.time() + 0.5) * 1000) opTimeMilliseconds = endTimeMilliseconds - startTimeMilliseconds flash("GroupsRuleVerification [FAILED]: groupId = " + str(groupId) +" #rules=" + str(len(temporaryRuleSet)) + " - opTimeMilliseconds:" + str(opTimeMilliseconds)) raise RuleValidationError(ruleCheckErrorList + " Error in room " + room.roomName)