diff options
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 |
commit | 3fcd45377c58b3427d134218b1976c764be3558f (patch) | |
tree | f6f3654ace92dcfb28673a4bfca1ebaded140897 | |
parent | 5492bfeaec636bac5a734dea1d988460abcc0ce3 (diff) | |
download | Ishtar-3fcd45377c58b3427d134218b1976c764be3558f.tar.bz2 Ishtar-3fcd45377c58b3427d134218b1976c764be3558f.zip |
Get a previous historized item by REST request (refs #349)
-rw-r--r-- | ishtar/furnitures/models.py | 35 | ||||
-rw-r--r-- | ishtar/furnitures/tests.py | 22 | ||||
-rw-r--r-- | ishtar/furnitures/views.py | 17 |
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: |