Allows to manually add data changes into an object's history.
This commit is contained in:
		
							parent
							
								
									db8ad18c5f
								
							
						
					
					
						commit
						d192496c88
					
				
					 4 changed files with 44 additions and 15 deletions
				
			
		|  | @ -703,6 +703,6 @@ class ToolMixin(AbstractMixin): | ||||||
|             res = [] |             res = [] | ||||||
|             for v in validator: |             for v in validator: | ||||||
|                 text = self.translate('%s_list_%s' % (appyType['label'], v)) |                 text = self.translate('%s_list_%s' % (appyType['label'], v)) | ||||||
|                 res.append((v, self.truncate(text, 70))) |                 res.append((v, self.truncate(text, 50))) | ||||||
|         return res |         return res | ||||||
| # ------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------ | ||||||
|  |  | ||||||
|  | @ -159,6 +159,28 @@ class AbstractMixin: | ||||||
|                                   atField.widget.label_msgid) |                                   atField.widget.label_msgid) | ||||||
|         return res |         return res | ||||||
| 
 | 
 | ||||||
|  |     def addDataChange(self, changes, labels=False): | ||||||
|  |         '''This method allows to add "manually" a data change into the objet's | ||||||
|  |            history. Indeed, data changes are "automatically" recorded only when | ||||||
|  |            a HTTP form is uploaded, not if, in the code, a setter is called on | ||||||
|  |            a field. The method is also called by the method historizeData below, | ||||||
|  |            that performs "automatic" recording when a HTTP form is uploaded.''' | ||||||
|  |         # Add to the p_changes dict the field labels if they are not present | ||||||
|  |         if not labels: | ||||||
|  |             for fieldName in changes.iterkeys(): | ||||||
|  |                 appyType = self.getAppyType(fieldName) | ||||||
|  |                 changes[fieldName] = (changes[fieldName], appyType['label']) | ||||||
|  |         # Create the event to record in the history | ||||||
|  |         DateTime = self.getProductConfig().DateTime | ||||||
|  |         state = self.portal_workflow.getInfoFor(self, 'review_state') | ||||||
|  |         user = self.portal_membership.getAuthenticatedMember() | ||||||
|  |         event = {'action': '_datachange_', 'changes': changes, | ||||||
|  |                  'review_state': state, 'actor': user.id, | ||||||
|  |                  'time': DateTime(), 'comments': ''} | ||||||
|  |         # Add the event to the history | ||||||
|  |         histKey = self.workflow_history.keys()[0] | ||||||
|  |         self.workflow_history[histKey] += (event,) | ||||||
|  | 
 | ||||||
|     def historizeData(self, previousData): |     def historizeData(self, previousData): | ||||||
|         '''Records in the object history potential changes on historized fields. |         '''Records in the object history potential changes on historized fields. | ||||||
|            p_previousData contains the values, before an update, of the |            p_previousData contains the values, before an update, of the | ||||||
|  | @ -172,16 +194,7 @@ class AbstractMixin: | ||||||
|                ((prev == '') and (curr == None)): |                ((prev == '') and (curr == None)): | ||||||
|                 del previousData[fieldName] |                 del previousData[fieldName] | ||||||
|         if previousData: |         if previousData: | ||||||
|             # Create the event to add in the history |             self.addDataChange(previousData, labels=True) | ||||||
|             DateTime = self.getProductConfig().DateTime |  | ||||||
|             state = self.portal_workflow.getInfoFor(self, 'review_state') |  | ||||||
|             user = self.portal_membership.getAuthenticatedMember() |  | ||||||
|             event = {'action': '_datachange_', 'changes': previousData, |  | ||||||
|                      'review_state': state, 'actor': user.id, |  | ||||||
|                      'time': DateTime(), 'comments': ''} |  | ||||||
|             # Add the event to the history |  | ||||||
|             histKey = self.workflow_history.keys()[0] |  | ||||||
|             self.workflow_history[histKey] += (event,) |  | ||||||
| 
 | 
 | ||||||
|     def goto(self, url, addParams=False): |     def goto(self, url, addParams=False): | ||||||
|         '''Brings the user to some p_url after an action has been executed.''' |         '''Brings the user to some p_url after an action has been executed.''' | ||||||
|  | @ -670,7 +683,7 @@ class AbstractMixin: | ||||||
|     def getHistory(self, startNumber=0, reverse=True, includeInvisible=False): |     def getHistory(self, startNumber=0, reverse=True, includeInvisible=False): | ||||||
|         '''Returns the history for this object, sorted in reverse order (most |         '''Returns the history for this object, sorted in reverse order (most | ||||||
|            recent change first) if p_reverse is True.''' |            recent change first) if p_reverse is True.''' | ||||||
|         batchSize = 3 |         batchSize = 5 | ||||||
|         key = self.workflow_history.keys()[0] |         key = self.workflow_history.keys()[0] | ||||||
|         history = list(self.workflow_history[key][1:]) |         history = list(self.workflow_history[key][1:]) | ||||||
|         if not includeInvisible: |         if not includeInvisible: | ||||||
|  |  | ||||||
|  | @ -319,10 +319,16 @@ | ||||||
|             <th align="left" width="30%" tal:content="python: tool.translate('modified_field')"></th> |             <th align="left" width="30%" tal:content="python: tool.translate('modified_field')"></th> | ||||||
|             <th align="left" width="70%" tal:content="python: tool.translate('previous_value')"></th> |             <th align="left" width="70%" tal:content="python: tool.translate('previous_value')"></th> | ||||||
|           </tr> |           </tr> | ||||||
|           <tr tal:repeat="change event/changes/items"> |           <tr tal:repeat="change event/changes/items" valign="top"> | ||||||
|             <td tal:content="python: tool.translate(change[1][1])"></td> |             <td tal:content="python: tool.translate(change[1][1])"></td> | ||||||
|             <td tal:define="appyType python:contextObj.getAppyType(change[0])" |             <td tal:define="appyType python:contextObj.getAppyType(change[0]); | ||||||
|                 tal:content="python: contextObj.getAppyValue(change[0], appyType, True, change[1][0])"></td> |                             appyValue python: contextObj.getAppyValue(change[0], appyType, True, change[1][0]); | ||||||
|  |                             severalValues python: (appyType['multiplicity'][1] > 1) or (appyType['multiplicity'][1] == None)"> | ||||||
|  |               <span tal:condition="not: severalValues" tal:replace="appyValue"></span> | ||||||
|  |               <ul tal:condition="python: severalValues"> | ||||||
|  |                 <li tal:repeat="av appyValue" tal:content="av"></li> | ||||||
|  |               </ul> | ||||||
|  |             </td> | ||||||
|           </tr> |           </tr> | ||||||
|         </table> |         </table> | ||||||
|       </td> |       </td> | ||||||
|  |  | ||||||
|  | @ -324,6 +324,16 @@ class AbstractWrapper: | ||||||
|         else: |         else: | ||||||
|             return xml |             return xml | ||||||
| 
 | 
 | ||||||
|  |     def historize(self, data): | ||||||
|  |         '''This method allows to add "manually" a "data-change" event into the | ||||||
|  |            object's history. Indeed, data changes are "automatically" recorded | ||||||
|  |            only when an object is edited through the edit form, not when a | ||||||
|  |            setter is called from the code. | ||||||
|  | 
 | ||||||
|  |            p_data must be a dictionary whose keys are field names (strings) and | ||||||
|  |            whose values are the previous field values.''' | ||||||
|  |         self.o.addDataChange(data, labels=False) | ||||||
|  | 
 | ||||||
| # ------------------------------------------------------------------------------ | # ------------------------------------------------------------------------------ | ||||||
| class FileWrapper: | class FileWrapper: | ||||||
|     '''When you get, from an appy object, the value of a File attribute, you |     '''When you get, from an appy object, the value of a File attribute, you | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Gaetan Delannay
						Gaetan Delannay