Exemplo n.º 1
0
    def save(self, *args, **kwargs):
        """
        Set the parent and path cache
        """
        # Make sure name is valid
        self.name = utils.clean_tree_name(self.name)

        # Find the parent, or create it if missing
        parts = utils.split_tree_name(self.name)
        old_parent = self.parent
        if len(parts) > 1:
            self.parent, created = self.__class__.objects.get_or_create(
                name=utils.join_tree_name(parts[:-1]))
        else:
            self.parent = None

        # Update other cache fields
        self.label = parts[-1]
        self.level = len(parts)

        # Save - super .save() method will set the path using _get_path()
        super(BaseTagTreeModel, self).save(*args, **kwargs)

        # If name has changed...
        if self._name != self.name:
            # Update child names
            for child in self.children.all():
                child.name = utils.join_tree_name(parts + [child.label])
                child.save()
            self._name = self.name

            # Notify parent that it may now be empty
            if old_parent:
                old_parent.update_count()
Exemplo n.º 2
0
    def save(self, *args, **kwargs):
        """
        Set the parent and path cache
        """
        # Make sure name is valid
        self.name = utils.clean_tree_name(self.name)

        # Find the parent, or create it if missing
        parts = utils.split_tree_name(self.name)
        old_parent = self.parent
        if len(parts) > 1:
            self.parent, created = self.__class__.objects.get_or_create(
                name=utils.join_tree_name(parts[:-1])
            )
        else:
            self.parent = None

        # Update other cache fields
        self.label = parts[-1]
        self.level = len(parts)

        # Save - super .save() method will set the path using _get_path()
        super(BaseTagTreeModel, self).save(*args, **kwargs)

        # If name has changed...
        if self._name != self.name:
            # Update child names
            for child in self.children.all():
                child.name = utils.join_tree_name(parts + [child.label])
                child.save()
            self._name = self.name

            # Notify parent that it may now be empty
            if old_parent:
                old_parent.update_count()
Exemplo n.º 3
0
    def validate_types(self, data):
        self.event_types_ids = []
        is_valid = True
        names = [
            name.strip() for name in self.initial_data['types'].split(',')
        ]
        names = list(set(names))
        names_to_create = []
        for name in names:
            clean_name = clean_tree_name(name)

            if clean_name != name:
                is_valid = False

            elif clean_name:

                obj = EventType.objects.filter(
                    Q(label=clean_name) | Q(name=clean_name)).first()
                if obj:
                    self.event_types_ids.append(obj.id)
                    self.event_types_ids += list(
                        obj.get_ancestors().values_list('id', flat=True))
                # create if not exist
                else:
                    parts = split_tree_name(clean_name)
                    if EventType.objects.filter(
                            label=parts[0],
                            level=1):  # ok -> '天災/颱風/自訂', error -> '颱風/自訂'
                        if len(parts) == 1:
                            clean_name = '其他/' + clean_name  # make '自訂' -> '其他/自訂'
                        names_to_create.append(clean_name)
                    else:
                        is_valid = False

        if not is_valid:
            raise ValidationError(
                _('This value does not match the required pattern'))

        for name in names_to_create:
            obj = EventType.objects.create(name=name)
            self.event_types_ids.append(obj.id)
            self.event_types_ids += list(obj.get_ancestors().values_list(
                'id', flat=True))
Exemplo n.º 4
0
 def test_clean_tree_complex(self):
     name = tag_utils.clean_tree_name("/// one / two/ three /")
     self.assertEqual(name, "//// one/two/three //")
Exemplo n.º 5
0
 def test_clean_tree_trailing(self):
     name = tag_utils.clean_tree_name("one/two/three//")
     self.assertEqual(name, "one/two/three//")
Exemplo n.º 6
0
 def test_clean_tree_leading(self):
     name = tag_utils.clean_tree_name("/one/two/three")
     self.assertEqual(name, "//one/two/three")
Exemplo n.º 7
0
 def test_clean_tree_strip(self):
     name = tag_utils.clean_tree_name("  one  /  two  /  three  ")
     self.assertEqual(name, "one/two/three")
Exemplo n.º 8
0
 def test_clean_tree_escape(self):
     name = tag_utils.clean_tree_name("one/two//dos/three")
     self.assertEqual(name, "one/two//dos/three")
Exemplo n.º 9
0
 def test_clean_tree_one(self):
     name = tag_utils.clean_tree_name("one")
     self.assertEqual(name, "one")