summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@peacefrogs.net>2011-04-09 12:12:47 +0200
committerÉtienne Loks <etienne.loks@peacefrogs.net>2011-04-09 12:12:47 +0200
commit00993b14812e6cc97b1e268e986884e92523f05e (patch)
treef6f3654ace92dcfb28673a4bfca1ebaded140897
parent455ed98ff54131b206b045a8a6950cc3ac2e25f2 (diff)
downloadIshtar-00993b14812e6cc97b1e268e986884e92523f05e.tar.bz2
Ishtar-00993b14812e6cc97b1e268e986884e92523f05e.zip
Get a previous historized item by REST request (refs #349)
-rw-r--r--ishtar/furnitures/models.py35
-rw-r--r--ishtar/furnitures/tests.py22
-rw-r--r--ishtar/furnitures/views.py17
3 files changed, 65 insertions, 9 deletions
diff --git a/ishtar/furnitures/models.py b/ishtar/furnitures/models.py
index 3571256cf..2fe65b598 100644
--- a/ishtar/furnitures/models.py
+++ b/ishtar/furnitures/models.py
@@ -174,7 +174,40 @@ class BaseHistorizedItem(models.Model):
super(BaseHistorizedItem, self).save(*args, **kwargs)
return True
+ def get_previous(self, step, strict=True):
+ """
+ Get a "step" previous state of the item
+ """
+ historized = self.history.all()
+ assert len(historized) > step
+ assert not hasattr(historized, '_step')
+ item = historized[step]
+ item._step = step
+ model = self.__class__
+ for k in model._meta.get_all_field_names():
+ field = model._meta.get_field_by_name(k)[0]
+ if hasattr(field, 'rel') and field.rel:
+ if not hasattr(item, k+'_id'):
+ setattr(item, k, getattr(self, k))
+ continue
+ val = getattr(item, k+'_id')
+ if not val:
+ setattr(item, k, None)
+ continue
+ try:
+ val = field.rel.to.objects.get(pk=val)
+ setattr(item, k, val)
+ except ObjectDoesNotExist:
+ if strict:
+ raise HistoryError(u"The class %s has no pk %d" % (
+ unicode(field.rel.to), val))
+ setattr(item, k, None)
+ return item
+
def rollback(self, date):
+ """
+ Rollback to a previous state
+ """
to_del, new_item = [], None
for item in self.history.all():
to_del.append(item)
@@ -193,7 +226,7 @@ class BaseHistorizedItem(models.Model):
self.save()
except:
raise HistoryError(u"The rollback has failed.")
- # clean the non necessary steps
+ # clean the obsolete history
for historized_item in to_del:
historized_item.delete()
diff --git a/ishtar/furnitures/tests.py b/ishtar/furnitures/tests.py
index 43bbb200a..5ffca400a 100644
--- a/ishtar/furnitures/tests.py
+++ b/ishtar/furnitures/tests.py
@@ -79,8 +79,8 @@ class FileTest(TestCase):
def testRollbackFile(self):
nb_hist = self.item.history.count()
initial_values = self.item.values()
- self.item.internal_reference = u"Unité_Test"
backup_date = self.item.history.all()[0].history_date
+ self.item.internal_reference = u"Unité_Test"
self.item.save()
self.item.rollback(backup_date)
self.failUnlessEqual(self.item.history.count(), nb_hist)
@@ -89,11 +89,25 @@ class FileTest(TestCase):
self.assertTrue(k in new_values)
self.assertEqual(new_values[k], initial_values[k])
- def testGetFile(self):
+ def testRESTGetFile(self):
+ response = self.client.post('/get-file/',
+ {'numeric_reference':self.item.numeric_reference})
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content)
+ self.assertTrue('records' in data)
+ self.assertTrue(data['records'] == 1)
+
+ def testRESTGetOldFile(self):
+ initial_ref = self.item.internal_reference
+ new_ref = u"Unité_Test_old_file"
+ new_ref = initial_ref != new_ref and new_ref or new_ref + u"extra"
+ self.item.internal_reference = new_ref
+ self.item.save()
response = self.client.post('/get-file/',
- {'numeric_reference':1000})
+ {'numeric_reference':self.item.numeric_reference, 'old':1})
self.assertEqual(response.status_code, 200)
data = json.loads(response.content)
self.assertTrue('records' in data)
- self.assertTrue(data['records'] >= 1)
+ self.assertTrue(data['records'] == 1)
+ self.assertEqual(data['rows'][0]['internal_reference'], initial_ref)
diff --git a/ishtar/furnitures/views.py b/ishtar/furnitures/views.py
index 4ef1f81ea..0320ce5c9 100644
--- a/ishtar/furnitures/views.py
+++ b/ishtar/furnitures/views.py
@@ -174,13 +174,18 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
field.name + (hasattr(field, 'rel') and field.rel and '__pk' or ''))
for field in fields])
request_keys.update(extra_request_keys)
+ request_items = request.method == 'POST' and request.POST or request.GET
dct = {}
+ try:
+ old = 'old' in request_items and int(request_items['old'])
+ except ValueError:
+ return HttpResponse(None, mimetype='text/plain')
for k in request_keys:
- q = request.GET.get(k)
+ q = request_items.get(k)
if not q:
continue
dct[request_keys[k]] = q
- if not dct and 'submited' not in request.GET:
+ if not dct and 'submited' not in request_items:
if default_name in request.session and \
request.session[default_name]:
dct = {"pk":request.session[default_name]}
@@ -196,16 +201,20 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
dct[k] = dct[k] == u"2" and True or False
query = Q(**dct)
items = model.objects.filter(query)
- q = request.GET.get('sidx')
+ q = request_items.get('sidx')
# manage tables
if q and q in request_keys:
k = request_keys[q]
if k.endswith("__pk"):
k = k[:-len("__pk")] + "__label"
- q = request.GET.get('sord')
+ q = request_items.get('sord')
sign = q and q == u'desc' and "-" or ''
items = items.order_by(sign + k)
datas = []
+ if old:
+ print [item.pk for item in items]
+ items = [item.get_previous(old) for item in items]
+ print [item.pk for item in items]
for item in items:
data = [item.pk]
for k in model.TABLE_COLS: