Skip to content

Commit

Permalink
Added a command to import categories from a file
Browse files Browse the repository at this point in the history
  • Loading branch information
Corey Oordt committed Aug 27, 2009
1 parent 38979d4 commit 413e756
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
Empty file.
Empty file.
83 changes: 83 additions & 0 deletions categories/management/commands/import_categories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
from django.core.management.base import BaseCommand, CommandError
from categories.models import Category
from django.template.defaultfilters import slugify

class Command(BaseCommand):
"""Import category trees from a file."""

help = "Imports category tree(s) from a file. Sub categories must be indented by the same multiple of spaces or tabs."
args = "file_path [file_path ...]"

def get_indent(self, string):
"""
Look through the string and count the spaces
"""
indent_amt = 0

if string[0] == '\t':
return '\t'
for char in string:
if char == ' ':
indent_amt += 1
else:
return ' ' * indent_amt


def make_category(self, string, parent=None, order=1):
"""
Make and save a category object from a string
"""
return Category.objects.create(
name=string.strip(),
slug=slugify(string.strip()),
parent=parent,
order=order
)

def parse_lines(self, lines):
"""
Do the work of parsing each line
"""
indent = ''
level = 0

if lines[0][0] == ' ' or lines[0][0] == '\t':
raise CommandError("The first line in the file cannot start with a space or tab.")

# This keeps track of the current parents at a given level
current_parents = {0: None}

for line in lines:
print line
if len(line) == 0:
continue
if line[0] == ' ' or line[0] == '\t':
if indent == '':
indent = self.get_indent(line)
elif not line[0] in indent:
raise CommandError("You can't mix spaces and tabs for indents")
level = line.count(indent)
current_parents[level] = self.make_category(line, parent=current_parents[level-1])
print current_parents
else:
# We are back to a zero level, so reset the whole thing
current_parents = {0: self.make_category(line)}
print current_parents
print Category.objects.all()

def handle(self, *file_paths, **options):
"""
Handle the basic import
"""
import os

for file_path in file_paths:
if not os.path.isfile(file_path):
print "File %s not found." % filename
continue
f = file(file_path, 'r')
data = f.readlines()
f.close()

self.parse_lines(data)

0 comments on commit 413e756

Please sign in to comment.