from django.db.models import get_model

Category = get_model('catalogue', 'category')


def create_from_sequence(bits):
    """
    Create categories from an iterable
    """
    if len(bits) == 1:
        # Get or create root node
        try:
            root = Category.objects.get(depth=1, name=bits[0])
        except Category.DoesNotExist:
            root = Category.add_root(name=bits[0])
        return [root]
    else:
        parents = create_from_sequence(bits[:-1])
        try:
            child = parents[-1].get_children().get(name=bits[-1])
        except Category.DoesNotExist:
            child = parents[-1].add_child(name=bits[-1])
        parents.append(child)
        return parents


def create_from_breadcrumbs(breadcrumb_str, separator='>'):
    """
    Create categories from a breadcrumb string
    """
    category_names = [x.strip() for x in breadcrumb_str.split(separator)]
    categories = create_from_sequence(category_names)
    return categories[-1]

from django.db.models import get_model

Category = get_model('catalogue', 'category')


def create_from_sequence(bits):
    """
    Create categories from an iterable
    """
    if len(bits) == 1:
        # Get or create root node
        name = bits[0]
        try:
            # Category names should be unique at the depth=1
            root = Category.objects.get(depth=1, name=name)
        except Category.DoesNotExist:
            root = Category.add_root(name=name)
        except Category.MultipleObjectsReturned:
            raise ValueError((
                "There are more than one categories with name "
                "%s at depth=1") % name)
        return [root]
    else:
        parents = create_from_sequence(bits[:-1])
        parent, name = parents[-1], bits[-1]
        try:
            child = parent.get_children().get(name=name)
        except Category.DoesNotExist:
            child = parent.add_child(name=name)
        except Category.MultipleObjectsReturned:
            raise ValueError((
                "There are more than one categories with name "
                "%s which are children of %s") % (name, parent))
        parents.append(child)
        return parents


def create_from_breadcrumbs(breadcrumb_str, separator='>'):
    """
    Create categories from a breadcrumb string
    """
    category_names = [x.strip() for x in breadcrumb_str.split(separator)]
    categories = create_from_sequence(category_names)
    return categories[-1]

Rework category creation from breadcrumbs
Rework category creation from breadcrumbs

We now handle MultipleObjectsReturned exceptions, which are possible as
we are looking up based on non-unique filters.

  from django.db.models import get_model
  
  Category = get_model('catalogue', 'category')
  
  
  def create_from_sequence(bits):
      """
      Create categories from an iterable
      """
      if len(bits) == 1:
          # Get or create root node
+         name = bits[0]
          try:
+             # Category names should be unique at the depth=1
-             root = Category.objects.get(depth=1, name=bits[0])
+             root = Category.objects.get(depth=1, name=name)
          except Category.DoesNotExist:
-             root = Category.add_root(name=bits[0])
+             root = Category.add_root(name=name)
+         except Category.MultipleObjectsReturned:
+             raise ValueError((
+                 "There are more than one categories with name "
+                 "%s at depth=1") % name)
          return [root]
      else:
          parents = create_from_sequence(bits[:-1])
+         parent, name = parents[-1], bits[-1]
          try:
-             child = parents[-1].get_children().get(name=bits[-1])
+             child = parent.get_children().get(name=name)
          except Category.DoesNotExist:
-             child = parents[-1].add_child(name=bits[-1])
+             child = parent.add_child(name=name)
+         except Category.MultipleObjectsReturned:
+             raise ValueError((
+                 "There are more than one categories with name "
+                 "%s which are children of %s") % (name, parent))
          parents.append(child)
          return parents
  
  
  def create_from_breadcrumbs(breadcrumb_str, separator='>'):
      """
      Create categories from a breadcrumb string
      """
      category_names = [x.strip() for x in breadcrumb_str.split(separator)]
      categories = create_from_sequence(category_names)
      return categories[-1]
  
Rework category creation from breadcrumbs
## Code Before:
from django.db.models import get_model

Category = get_model('catalogue', 'category')


def create_from_sequence(bits):
    """
    Create categories from an iterable
    """
    if len(bits) == 1:
        # Get or create root node
        try:
            root = Category.objects.get(depth=1, name=bits[0])
        except Category.DoesNotExist:
            root = Category.add_root(name=bits[0])
        return [root]
    else:
        parents = create_from_sequence(bits[:-1])
        try:
            child = parents[-1].get_children().get(name=bits[-1])
        except Category.DoesNotExist:
            child = parents[-1].add_child(name=bits[-1])
        parents.append(child)
        return parents


def create_from_breadcrumbs(breadcrumb_str, separator='>'):
    """
    Create categories from a breadcrumb string
    """
    category_names = [x.strip() for x in breadcrumb_str.split(separator)]
    categories = create_from_sequence(category_names)
    return categories[-1]

## Instruction:
Rework category creation from breadcrumbs
## Code After:
from django.db.models import get_model

Category = get_model('catalogue', 'category')


def create_from_sequence(bits):
    """
    Create categories from an iterable
    """
    if len(bits) == 1:
        # Get or create root node
        name = bits[0]
        try:
            # Category names should be unique at the depth=1
            root = Category.objects.get(depth=1, name=name)
        except Category.DoesNotExist:
            root = Category.add_root(name=name)
        except Category.MultipleObjectsReturned:
            raise ValueError((
                "There are more than one categories with name "
                "%s at depth=1") % name)
        return [root]
    else:
        parents = create_from_sequence(bits[:-1])
        parent, name = parents[-1], bits[-1]
        try:
            child = parent.get_children().get(name=name)
        except Category.DoesNotExist:
            child = parent.add_child(name=name)
        except Category.MultipleObjectsReturned:
            raise ValueError((
                "There are more than one categories with name "
                "%s which are children of %s") % (name, parent))
        parents.append(child)
        return parents


def create_from_breadcrumbs(breadcrumb_str, separator='>'):
    """
    Create categories from a breadcrumb string
    """
    category_names = [x.strip() for x in breadcrumb_str.split(separator)]
    categories = create_from_sequence(category_names)
    return categories[-1]
