diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-06 20:59:42 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-10-06 20:59:42 +0200 |
commit | 1d216cca64eaaf222a8dbceca5eda361634baec7 (patch) | |
tree | 290006abad72e22489544b4e3008f12dcb449b85 | |
parent | 08a15921f11ad83595e5b3c0a7b501fa5278483f (diff) | |
download | Chimère-1d216cca64eaaf222a8dbceca5eda361634baec7.tar.bz2 Chimère-1d216cca64eaaf222a8dbceca5eda361634baec7.zip |
Export: add a command to launch export with the CLI
-rw-r--r-- | chimere/management/commands/chimere_export.py | 86 | ||||
-rw-r--r-- | chimere/models.py | 3 |
2 files changed, 88 insertions, 1 deletions
diff --git a/chimere/management/commands/chimere_export.py b/chimere/management/commands/chimere_export.py new file mode 100644 index 0000000..4e91956 --- /dev/null +++ b/chimere/management/commands/chimere_export.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import csv +import datetime, time + +from django.core.management.base import BaseCommand, CommandError +from django.core.exceptions import ObjectDoesNotExist + +from chimere import tasks +from chimere.admin import export_to_csv, export_to_kml, export_to_shapefile +from chimere.models import Category, SubCategory, Marker, Route + +EXPORTER = {'CSV':export_to_csv, + 'KML':export_to_kml, + 'SHP':export_to_shapefile} + +class Command(BaseCommand): + args = '<subcategory_id> <CSV|KML|SHP> <marker|route> <filename>' + help = "Export items from a subcategory in CSV, KML or ShapeFile" + + def handle(self, *args, **options): + subcat = None + if args and args[0]: + try: + subcat = SubCategory.objects.get(pk=int(args[0])) + except (ValueError, ObjectDoesNotExist) as e: + raise CommandError("Sub-category with ID '%s' doesn't exist." %\ + args[0]) + while not subcat: + self.stdout.write('Choose a sub-category:\n') + for cat in Category.objects.order_by('order'): + self.stdout.write('* %s\n' % cat.name) + for subcat in cat.subcategories.order_by('order').all(): + self.stdout.write(' %d - %s\n' % (subcat.pk, subcat.name)) + self.stdout.write('\nSub-category ID: ') + self.stdout.flush() + v = raw_input() + try: + subcat = SubCategory.objects.get(pk=v) + except (ValueError, ObjectDoesNotExist) as e: + subcat = None + self.stdout.write("Sub-category with ID '%s' doesn't exist.\n\n" + % v) + frmat = None + if args and args[1]: + try: + assert(args[1] in ('CSV', 'KML', 'SHP')) + except AssertionError: + raise CommandError("'%s' format is not managed." % args[1]) + frmat = args[1] + while frmat not in ('CSV', 'KML', 'SHP'): + self.stdout.write('Choose a format (CSV, KML or SHP): ') + frmat = raw_input().replace('\n', '') + exporter = EXPORTER[frmat] + cls = None + if args and args[2]: + try: + assert(args[2] in ('marker', 'route')) + except AssertionError: + raise CommandError("Exported item must be 'marker' or 'route'." + % args[1]) + if args[2] == 'marker': + cls = Marker + elif args[2] == 'route': + cls = Route + while not cls: + self.stdout.write('Choose an item type:\n 1 - marker\n 2 - route\n') + self.stdout.write('Number: ') + v = raw_input() + if v == '1': + cls = Marker + elif v == '2': + cls = Route + filename = '' + if args and args[3]: + filename = args[3] + else: + self.stdout.write('Filename: ') + filename = raw_input() + response = exporter(None, None, cls.objects.filter(categories=subcat)) + try: + with open(filename, 'w+') as fl: + fl.write(response.content) + except IOError as e: + raise CommandError(e) diff --git a/chimere/models.py b/chimere/models.py index e6d1636..3767fcb 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -147,7 +147,8 @@ class Icon(models.Model): class SubCategory(models.Model): '''Sub-category ''' - category = models.ForeignKey(Category, verbose_name=_(u"Category")) + category = models.ForeignKey(Category, verbose_name=_(u"Category"), + related_name='subcategories') name = models.CharField(_(u"Name"), max_length=150) available = models.BooleanField(_(u"Available"), default=True) submission = models.BooleanField(_(u"Available for submission"), |