TestCenter Reference
ChangeSet.py
Go to the documentation of this file.
1 #
2 # Copyright 2009, MeVis Medical Solutions AG
3 #
4 # The user may use this file in accordance with the license agreement provided with
5 # the Software or, alternatively, in accordance with the terms contained in a
6 # written agreement between the user and MeVis Medical Solutions AG.
7 #
8 # For further information use the contact form at https://www.mevislab.de/contact
9 #
10 
11 from builtins import object
12 from builtins import str
13 
15 
16 # -- system imports ----------------------------------------------------------------------------{{{-
17 import os
18 import sys
19 import traceback
20 # ----------------------------------------------------------------------------------------------}}}-
21 
22 # -- local imports -----------------------------------------------------------------------------{{{-
23 import mevis
24 # ----------------------------------------------------------------------------------------------}}}-
25 
26 # -- class ChangeSet ---------------------------------------------------------------------------{{{-
27 
35 class ChangeSet (object):
36  # -- member variables ------------------------------------------------------------------------{{{-
37 
38  __changeDict = None
39 
40  __changeStack = None
41 
42  __ctx = None
43  # --------------------------------------------------------------------------------------------}}}-
44 
45  # -- def __init__ ----------------------------------------------------------------------------{{{-
46 
48  def __init__ (self, context):
49  self.__changeDict__changeDict = {}
50  self.__changeStack__changeStack = []
51  self.__ctx__ctx = context
52  self.__enableAutoRevert__enableAutoRevert = True
53  # --------------------------------------------------------------------------------------------}}}-
54 
55  # -- def __del__ -----------------------------------------------------------------------------{{{-
56 
58  def __del__ (self):
59  self.autoRevertautoRevert()
60  # --------------------------------------------------------------------------------------------}}}-
61 
62  # -- def _logInfo ----------------------------------------------------------------------------{{{-
63  def _logInfo (self, message):
64  mevis.MLAB.log(message)
65  # --------------------------------------------------------------------------------------------}}}-
66 
67  # -- def _logError ---------------------------------------------------------------------------{{{-
68  def _logError (self, message):
69  mevis.MLAB.logError(message)
70  # --------------------------------------------------------------------------------------------}}}-
71 
72  # -- def setFieldValue -----------------------------------------------------------------------{{{-
73 
80  def setFieldValue (self, fieldName, fieldValue, verbose=False):
81  retVal = True
82  field = self.__ctx__ctx.field(fieldName)
83  if not field:
84  if verbose:
85  self._logError_logError("Field (%s) not found in the used context!" % (fieldName))
86  retVal = False
87  else:
88  fieldType = field.type
89  if (fieldType in ('Trigger')) or fieldValue is None:
90  if verbose:
91  self._logInfo_logInfo("Touched field %s" % (fieldName))
92  field.touch()
93  else:
94  # Store old field value.
95  oldFieldValue = getFieldValue(field)
96  if fieldName not in self.__changeDict__changeDict:
97  self.__changeDict__changeDict[fieldName] = oldFieldValue
98  self.__changeStack__changeStack.append(fieldName)
99  self.__changeDict__changeDict.setdefault(fieldName, oldFieldValue)
100  setFieldValue(field, fieldValue)
101  if verbose:
102  self._logInfo_logInfo("Set field %s to value %s" % (fieldName, fieldValue))
103  return retVal
104  # --------------------------------------------------------------------------------------------}}}-
105 
106  # -- def addField ----------------------------------------------------------------------------{{{-
107 
112  def addField (self, fieldName, verbose=False):
113  field = self.__ctx__ctx.field(fieldName)
114  if not field:
115  if verbose:
116  self._logError_logError("Field (%s) not found in the used context!" % (fieldName))
117  return False
118  self.__changeDict__changeDict.setdefault(fieldName, getFieldValue(field))
119  return True
120  # --------------------------------------------------------------------------------------------}}}-
121 
122  # -- def autoRevert --------------------------------------------------------------------------{{{-
123 
124  def autoRevert (self):
125  if self.__enableAutoRevert__enableAutoRevert and self.__ctx__ctx: # the module might not exist anymore, so check
126  self.revertrevert()
127  # --------------------------------------------------------------------------------------------}}}-
128 
129  # -- def revert ------------------------------------------------------------------------------{{{-
130 
131  def revert (self):
132  # For each changed field restore the original value.
133  while len(self.__changeStack__changeStack) > 0:
134  fieldName = self.__changeStack__changeStack.pop(-1)
135  field = self.__ctx__ctx.field(fieldName)
136  setFieldValue(field, self.__changeDict__changeDict[fieldName])
137  self.__changeDict__changeDict = {}
138  # --------------------------------------------------------------------------------------------}}}-
139 
140  def enableAutoRevert (self, enable ):
141  # Enable/disable revert on destruction. Can be disabled for debugging purposes (to leave the
142  # network state as it was on error occurrence).
143  self.__enableAutoRevert__enableAutoRevert = enable
144  # --------------------------------------------------------------------------------------------}}}-
145 # ----------------------------------------------------------------------------------------------}}}-
146 
147 def getFieldValue(field):
148  if 'Vector6' in field.type:
149  return field.stringValue()
150  elif 'MLBase' in field.type:
151  return field.object()
152  else:
153  return field.value
154 
155 def setFieldValue(field, fieldValue):
156  if 'Vector6' in field.type:
157  if isinstance(fieldValue, (str, bytes)):
158  field.setStringValue(fieldValue)
159  else:
160  field.setVectorValue(fieldValue)
161  elif 'MLBase' in field.type:
162  field.setObject(fieldValue)
163  else:
164  field.value = fieldValue
Class to handle field changes and make them revertable.
Definition: ChangeSet.py:35
def revert(self)
Revert all changes made.
Definition: ChangeSet.py:131
def _logError(self, message)
Definition: ChangeSet.py:68
def __init__(self, context)
The default constructor.
Definition: ChangeSet.py:48
def enableAutoRevert(self, enable)
Definition: ChangeSet.py:140
def _logInfo(self, message)
Definition: ChangeSet.py:63
def __del__(self)
The default destructor.
Definition: ChangeSet.py:58
def addField(self, fieldName, verbose=False)
Add a field and its value without setting it.
Definition: ChangeSet.py:112
def autoRevert(self)
Revert all changes made if auto-revert is enabled.
Definition: ChangeSet.py:124
def setFieldValue(self, fieldName, fieldValue, verbose=False)
Set the value of a field.
Definition: ChangeSet.py:80
def getFieldValue(field)
Definition: ChangeSet.py:147
def setFieldValue(field, fieldValue)
Definition: ChangeSet.py:155