django-reversion saves revisions correctly in shell, but not in views -
i'm facing issue reverse of django reversion not save revisions made in shell
versions being used:
django: v1.3.1 django-reversion: v1.5.7 i wrote class can used save/discard changes made model:
import reversion, datetime class execute: model = none delete_ids = [] def __init__(self, model): self.model = model if not reversion.is_registered(model): reversion.register(model) def update(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m= self.model.objects.get(pk=id) if len(reversion.get_for_object(m)) == 1: # update newly inserted element reversion.get_for_object(m).delete() # reversion list 1 long. reversion.create_revision(): m=n m.save() else: # update existing element. reversion list @ least 2 long if len(reversion.get_for_object(m)) == 0: # add self first revision. reversion.create_revision(): m.save() reversion.create_revision(): # add updates m=n m.save() def insert(self, n): reversion.create_revision(): n.pk = none n.save() return n.pk def delete(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m=self.model.objects.get(pk=id) reversion.create_revision(): m.save() delete_ids.append(id) m.delete() def discard(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m=self.model.objects.get(pk=id) rev=reversion.get_for_object(m) if len(rev) == 0: return if len(rev) == 1: #insert operation, delete m.delete() else: #update operation, revert rev[len(rev)-1].revert() rev.delete() if len(reversion.get_deleted(self.model).filter(object_id=id)) > 0: reversion.get_deleted(self.model).get(object_id=id).revert() def save(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m=self.model.objects.get(pk=id) m.save() reversion.get_for_object(m).delete() if len(reversion.get_deleted(self.model).filter(object_id=id)) > 0: reversion.get_deleted(self.model).get(object_id=id).delete() i use follows:
> my_execute=execute(mymodel) m=mymodel.objects.get(pk=id) > > --modify in m-- > my_execute.update(tm) > > --modify else in m-- > my_execute.update(tm) > > --modify else in m-- > my_execute.update(tm) > > my_execute.discard(tm) <-- revert m original > or > my_execute.save(tm) <-- save new modifications this works when run these via shell, inconsistent when running through post requests in views.
on debugging, found out when running in shell, every time registered model doing "save()", see list "reversion.get_for_object(m)" adding new revision expected. when run same through django view, list not updated expected, seems happen when end of view code reached.
eg: when update existing model, expect see 2 entries like:
>>> reversion.get_for_object(tm) [] >>> tm_execute.update(tm) >>> reversion.get_for_object(tm) [<version: qge__power sequencing fix__726__lalitb>, <version: qge__power sequencing fix__726__lalitb>] >>> however when same using views:
from collabgrid.testmatrix.models import testmatrix, testcaseinfo, product django.http import httpresponse django.utils import simplejson import json, pdb, datetime, reversion class execute: model = none delete_ids = [] def __init__(self, model): self.model = model if not reversion.is_registered(model): reversion.register(model) def update(self, n): id = n.pk; if len(self.model.objects.filter(pk=id)) > 0: m= self.model.objects.get(pk=id) if len(reversion.get_for_object(m)) == 1: # update newly inserted element reversion.get_for_object(m).delete() # reversion list 1 long. reversion.create_revision(): m=n m.save() else: # update existing element. reversion list @ least 2 long if len(reversion.get_for_object(m)) == 0: # add self first revision. reversion.create_revision(): m.save() reversion.create_revision(): # add updates m=n m.save() def insert(self, n): reversion.create_revision(): n.pk = none n.save() return n.pk def delete(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m=self.model.objects.get(pk=id) reversion.create_revision(): m.save() delete_ids.append(id) m.delete() def discard(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m=self.model.objects.get(pk=id) rev=reversion.get_for_object(m) if len(rev) == 0: return if len(rev) == 1: #insert operation, delete m.delete() else: #update operation, revert rev[len(rev)-1].revert() rev.delete() if len(reversion.get_deleted(self.model).filter(object_id=id)) > 0: reversion.get_deleted(self.model).get(object_id=id).revert() def save(self, n): id = n.pk if len(self.model.objects.filter(pk=id)) > 0: m=self.model.objects.get(pk=id) m.save() reversion.get_for_object(m).delete() if len(reversion.get_deleted(self.model).filter(object_id=id)) > 0: reversion.get_deleted(self.model).get(object_id=id).delete() tm_execute=execute(testmatrix) def update_sub_col(request): print request if request.method == 'post': ret = request.post tm_data = json.loads(request.post['tm_data']) t in tm_data: if(len(testmatrix.objects.filter(pk=t['id'])) > 0): tm = testmatrix.objects.get(pk=t['id']) if tm.os != t['sub_col']: tm.os = t['sub_col'] print "before: ", reversion.get_for_object(tm) # list returns empty [] tm_execute.update(tm) print "after: ",reversion.get_for_object(tm) # list returns empty [] # subsequent read has 1 # revision entry. json_response = { 'ret': 'success' } return httpresponse(simplejson.dumps(json_response),mimetype='application/javascript') i see list 1 long on subsequent reads:
[<version: qge__power sequencing fix__726__lalitb>] at point model commits modifications , there no way revert them back. not sure why difference since i'm using same code in both cases.
i used pdb check revision list contents after
with reversion.create_revision(): m.save() and empty when walked through update function when run via views, correctly showing revision entries when debugged through shell prompt.
turns out mixing , matching revision creation mechanisms biting me (although docs otherwise).
i using following techniques:
1) middleware:
- django.middleware.transaction.transactionmiddleware
- reversion.middleware.revisionmiddleware
2) context manager
- reversion.create_revision() context manager
i removed middleware settings , resorted context manager , working expected across shell ajax/views.
edit: turns out i'm doing right thing. removing revision middleware way go finer grain control per thread.
Comments
Post a Comment