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()
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()
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))
def test_clean_tree_complex(self): name = tag_utils.clean_tree_name("/// one / two/ three /") self.assertEqual(name, "//// one/two/three //")
def test_clean_tree_trailing(self): name = tag_utils.clean_tree_name("one/two/three//") self.assertEqual(name, "one/two/three//")
def test_clean_tree_leading(self): name = tag_utils.clean_tree_name("/one/two/three") self.assertEqual(name, "//one/two/three")
def test_clean_tree_strip(self): name = tag_utils.clean_tree_name(" one / two / three ") self.assertEqual(name, "one/two/three")
def test_clean_tree_escape(self): name = tag_utils.clean_tree_name("one/two//dos/three") self.assertEqual(name, "one/two//dos/three")
def test_clean_tree_one(self): name = tag_utils.clean_tree_name("one") self.assertEqual(name, "one")