diff options
Diffstat (limited to 'ishtar')
| -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:  | 
