def removeEntry(self, uidAuthor, idSchedGroup, fCascade = False, fCommit = False): """ Deletes a scheduling group. """ # # Input validation and retrival of current data. # if idSchedGroup == 1: raise TMExceptionBase('Cannot remove the default scheduling group (id 1).'); oData = SchedGroupDataEx().initFromDbWithId(self._oDb, idSchedGroup); # # We use cascade a little different here... We don't actually delete # associated testboxes or testgroups. # if len(oData.aoTestBoxes) > 0: if fCascade is not True: # Complain about there being associated testboxes. asTestBoxes = ['%s (#%d)' % (oTestBox.sName, oTestBox.idTestBox) for oTestBox in oData.aoTestBoxes]; raise TMExceptionBase('Scheduling group #%d is associated with one or more test boxes: %s' % (idSchedGroup, ', '.join(asTestBoxes),)); else: # Reassign testboxes to scheduling group #1 (the default group). oTbLogic = TestBoxLogic(self._oDb); for oTestBox in oData.aoTestBoxes: oTbCopy = TestBoxData().initFromOther(oTestBox); oTbCopy.idSchedGroup = 1; oTbLogic.editEntry(oTbCopy, uidAuthor, fCommit = False); oData = SchedGroupDataEx().initFromDbWithId(self._oDb, idSchedGroup); if len(oData.aoTestBoxes) != 0: raise TMExceptionBase('More testboxes was added to the scheduling group as we were trying to delete it.'); # # Remove the group and all member records. # for oMember in oData.aoMembers: self._removeSchedGroupMember(uidAuthor, oMember); self._oDb.execute('UPDATE SchedGroupMembers\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idSchedGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idSchedGroup,)); (tsCur, tsCurMinusOne) = self._oDb.getCurrentTimestamps(); if oData.tsEffective != tsCur and oData.tsEffective != tsCurMinusOne: self._historizeEntry(idSchedGroup, tsCurMinusOne); self._readdEntry(uidAuthor, oData, tsCurMinusOne); self._historizeEntry(idSchedGroup); self._oDb.execute('UPDATE SchedGroups\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idSchedGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idSchedGroup,)) self._oDb.maybeCommit(fCommit) return True;
def removeEntry(self, uidAuthor, idSchedGroup, fCascade = False, fCommit = False): """ Deletes a scheduling group. """ # # Input validation and retrival of current data. # if idSchedGroup == 1: raise TMRowInUse('Cannot remove the default scheduling group (id 1).'); oData = SchedGroupDataEx().initFromDbWithId(self._oDb, idSchedGroup); # # We use cascade a little different here... We don't actually delete # associated testboxes or testgroups. # if oData.aoTestBoxes: if fCascade is not True: # Complain about there being associated testboxes. asTestBoxes = ['%s (#%d)' % (oTestBox.sName, oTestBox.idTestBox) for oTestBox in oData.aoTestBoxes]; raise TMRowInUse('Scheduling group #%d is associated with one or more test boxes: %s' % (idSchedGroup, ', '.join(asTestBoxes),)); else: # Reassign testboxes to scheduling group #1 (the default group). oTbLogic = TestBoxLogic(self._oDb); for oTestBox in oData.aoTestBoxes: oTbCopy = TestBoxData().initFromOther(oTestBox); oTbCopy.idSchedGroup = 1; oTbLogic.editEntry(oTbCopy, uidAuthor, fCommit = False); oData = SchedGroupDataEx().initFromDbWithId(self._oDb, idSchedGroup); if oData.aoTestBoxes: raise TMRowInUse('More testboxes was added to the scheduling group as we were trying to delete it.'); # # Remove the group and all member records. # for oMember in oData.aoMembers: self._removeSchedGroupMember(uidAuthor, oMember); self._oDb.execute('UPDATE SchedGroupMembers\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idSchedGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idSchedGroup,)); (tsCur, tsCurMinusOne) = self._oDb.getCurrentTimestamps(); if oData.tsEffective != tsCur and oData.tsEffective != tsCurMinusOne: self._historizeEntry(idSchedGroup, tsCurMinusOne); self._readdEntry(uidAuthor, oData, tsCurMinusOne); self._historizeEntry(idSchedGroup); self._oDb.execute('UPDATE SchedGroups\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idSchedGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idSchedGroup,)) self._oDb.maybeCommit(fCommit) return True;
def _actionTestBoxListPost(self): """Actions on a list of testboxes.""" # Parameters. aidTestBoxes = self.getListOfIntParams(TestBoxData.ksParam_idTestBox, iMin = 1, aiDefaults = []); sListAction = self.getStringParam(self.ksParamListAction); if sListAction in [asDesc[0] for asDesc in WuiTestBoxList.kasTestBoxActionDescs]: idAction = None; else: asActionPrefixes = [ 'setgroup-', ]; i = 0; while i < len(asActionPrefixes) and not sListAction.startswith(asActionPrefixes[i]): i += 1; if i >= len(asActionPrefixes): raise WuiException('Parameter "%s" has an invalid value: "%s"' % (self.ksParamListAction, sListAction,)); idAction = sListAction[len(asActionPrefixes[i]):]; if not idAction.isdigit(): raise WuiException('Parameter "%s" has an invalid value: "%s"' % (self.ksParamListAction, sListAction,)); idAction = int(idAction); sListAction = sListAction[:len(asActionPrefixes[i]) - 1]; self._checkForUnknownParameters(); # Take action. if sListAction is 'none': pass; else: oLogic = TestBoxLogic(self._oDb); aoTestBoxes = [] for idTestBox in aidTestBoxes: aoTestBoxes.append(TestBoxData().initFromDbWithId(self._oDb, idTestBox)); if sListAction in [ 'enable', 'disable' ]: fEnable = sListAction == 'enable'; for oTestBox in aoTestBoxes: if oTestBox.fEnabled != fEnable: oTestBox.fEnabled = fEnable; oLogic.editEntry(oTestBox, self._oCurUser.uid, fCommit = False); elif sListAction == 'setgroup': for oTestBox in aoTestBoxes: if oTestBox.idSchedGroup != idAction: oTestBox.idSchedGroup = idAction; oLogic.editEntry(oTestBox, self._oCurUser.uid, fCommit = False); else: for oTestBox in aoTestBoxes: if oTestBox.enmPendingCmd != sListAction: oTestBox.enmPendingCmd = sListAction; oLogic.editEntry(oTestBox, self._oCurUser.uid, fCommit = False); self._oDb.commit(); # Re-display the list. self._sPageTitle = None; self._sPageBody = None; self._sRedirectTo = self._sActionUrlBase + self.ksActionTestBoxList; return True;