def instrumenttype_pre_save(sender, instance, *args, **kwargs): try: prev = InstrumentType.objects.get(pk=instance.pk) if prev.category_id != instance.category_id: instance.ordering = get_default_ordering(InstrumentType, instance.category_id) except InstrumentType.DoesNotExist: pass
def test_change_new_category(self): type = InstrumentType.objects.all()[18] category = InstrumentCategory.objects.create(name='temp category') expected_ordering = get_default_ordering(InstrumentType, category.pk) url = reverse('instrumenttype_update', args=(type.category.slug, type.pk)) response = self.client.post(url, { 'name': type.name, 'category': category.pk, 'ordering': type.ordering, }) self.assertEqual(response.status_code, 302) new_type = InstrumentType.objects.get(pk=type.pk) self.assertEqual(new_type.name, type.name) self.assertEqual(new_type.category, category) self.assertEqual(new_type.ordering, expected_ordering) self.assertEqual(new_type.ordering, 1)
def post(self, request, *args, **kwargs): pka = kwargs.get('pka') pkb = kwargs.get('pkb') parent_field = None if pka is None or pkb is None: return HttpResponse(status=400) try: obja = self.model._default_manager.get(pk=pka) objb = self.model._default_manager.get(pk=pkb) \ if pkb != "-1" else None except self.model.DoesNotExist: raise Http404 moving_down = objb is None or obja.ordering < objb.ordering conditions = ['gt', 'lt'] if moving_down else ['lt', 'gte'] offset = -1 if moving_down else 1 filters = { 'ordering__%s' % conditions.pop(0): obja.ordering } if objb is not None: filters['ordering__%s' % conditions.pop(0)] = objb.ordering if hasattr(obja, 'parent_model'): parent_field = '%s' % obja.parent_model[0] filters[parent_field] = getattr(obja, parent_field) self.model._default_manager.filter(**filters)\ .update(ordering=F('ordering') + offset) target_ordering = objb.ordering - 1 if objb is not None \ else get_default_ordering( self.model, filters.get(parent_field)) if not moving_down: target_ordering += 1 self.model._default_manager.filter(pk=obja.pk)\ .update(ordering=target_ordering) return HttpResponse(status=200)
def clean_ordering(self): ordering = self.cleaned_data.get('ordering') category = self.cleaned_data.get('category_id') if ordering <= 0: # default value (new model instance) ordering = get_default_ordering(InstrumentType, category) return ordering