# HG changeset patch # User ymh # Date 1394820668 -3600 # Node ID c5e29ad9c0aa101635479686051d0f5b4c071010 # Parent 60d60d7cae2cf96e5ffcb792c1b9bc5652b8f4de add command to export contributions diff -r 60d60d7cae2c -r c5e29ad9c0aa .settings/org.eclipse.core.resources.prefs --- a/.settings/org.eclipse.core.resources.prefs Mon Feb 10 18:06:51 2014 +0100 +++ b/.settings/org.eclipse.core.resources.prefs Fri Mar 14 19:11:08 2014 +0100 @@ -33,6 +33,8 @@ encoding//src/jocondelab/forms.py=utf-8 encoding//src/jocondelab/management/__init__.py=utf-8 encoding//src/jocondelab/management/commands/__init__.py=utf-8 +encoding//src/jocondelab/management/commands/export_contributions.py=utf-8 +encoding//src/jocondelab/management/commands/export_csv.py=utf-8 encoding//src/jocondelab/management/commands/export_term_links.py=utf-8 encoding//src/jocondelab/management/commands/import_countries.py=utf-8 encoding//src/jocondelab/management/commands/import_csv.py=utf-8 diff -r 60d60d7cae2c -r c5e29ad9c0aa src/jocondelab/management/commands/export_contributions.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jocondelab/management/commands/export_contributions.py Fri Mar 14 19:11:08 2014 +0100 @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +# +# Copyright Institut de Recherche et d'Innovation © 2014 +# +# contact@iri.centrepompidou.fr +# +# Ce code a été développé pour un premier usage dans JocondeLab, projet du +# ministère de la culture et de la communication visant à expérimenter la +# recherche sémantique dans la base Joconde +# (http://jocondelab.iri-research.org/). +# +# Ce logiciel est régi par la licence CeCILL-C soumise au droit français et +# respectant les principes de diffusion des logiciels libres. Vous pouvez +# utiliser, modifier et/ou redistribuer ce programme sous les conditions +# de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA +# sur le site "http://www.cecill.info". +# +# En contrepartie de l'accessibilité au code source et des droits de copie, +# de modification et de redistribution accordés par cette licence, il n'est +# offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +# seule une responsabilité restreinte pèse sur l'auteur du programme, le +# titulaire des droits patrimoniaux et les concédants successifs. +# +# A cet égard l'attention de l'utilisateur est attirée sur les risques +# associés au chargement, à l'utilisation, à la modification et/ou au +# développement et à la reproduction du logiciel par l'utilisateur étant +# donné sa spécificité de logiciel libre, qui peut le rendre complexe à +# manipuler et qui le réserve donc à des développeurs et des professionnels +# avertis possédant des connaissances informatiques approfondies. Les +# utilisateurs sont donc invités à charger et tester l'adéquation du +# logiciel à leurs besoins dans des conditions permettant d'assurer la +# sécurité de leurs systèmes et ou de leurs données et, plus généralement, +# à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. +# +# Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +# pris connaissance de la licence CeCILL-C, et que vous en avez accepté les +# termes. +# + + +import logging + +from django.db.models.fields.related import ForeignKey + +from jocondelab.models import Contribution +from jocondelab.management.commands.export_csv import ExportCsvCommand +from jocondelab.models.contribution import ContributedFields + + +logger = logging.getLogger(__name__) + + +query_fields = [ + "term__dbpedia_uri", "term__dbpedia_language", + "thesaurus__label", + "notice__ref", "notice__repr", + "contribution_count", +] + +fields = query_fields + [ + "term__dbpedia_uri__label" +] + + +class Command(ExportCsvCommand): + + help = "Export jocondelab term link" + + + def get_fields(self): + return fields + + def get_query(self): + return Contribution.objects.all().select_related(*[field.name for field in Contribution._meta.fields if isinstance(field, ForeignKey)]).order_by('notice__ref').values_list(*query_fields) # @UndefinedVariable + + def process_row(self, r): + q = list(ContributedFields.objects.filter(dbpedia_uri=r[0], language_code='fr')) + label = "" + if q: + label = q[0].label + return tuple(list(r) + [ label ]) + + def get_row_message(self, r): + return "Exporting contribution %s" % repr(r[0]) # @IgnorePep8 + diff -r 60d60d7cae2c -r c5e29ad9c0aa src/jocondelab/management/commands/export_csv.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jocondelab/management/commands/export_csv.py Fri Mar 14 19:11:08 2014 +0100 @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +# +# Copyright Institut de Recherche et d'Innovation © 2014 +# +# contact@iri.centrepompidou.fr +# +# Ce code a été développé pour un premier usage dans JocondeLab, projet du +# ministère de la culture et de la communication visant à expérimenter la +# recherche sémantique dans la base Joconde +# (http://jocondelab.iri-research.org/). +# +# Ce logiciel est régi par la licence CeCILL-C soumise au droit français et +# respectant les principes de diffusion des logiciels libres. Vous pouvez +# utiliser, modifier et/ou redistribuer ce programme sous les conditions +# de la licence CeCILL-C telle que diffusée par le CEA, le CNRS et l'INRIA +# sur le site "http://www.cecill.info". +# +# En contrepartie de l'accessibilité au code source et des droits de copie, +# de modification et de redistribution accordés par cette licence, il n'est +# offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, +# seule une responsabilité restreinte pèse sur l'auteur du programme, le +# titulaire des droits patrimoniaux et les concédants successifs. +# +# A cet égard l'attention de l'utilisateur est attirée sur les risques +# associés au chargement, à l'utilisation, à la modification et/ou au +# développement et à la reproduction du logiciel par l'utilisateur étant +# donné sa spécificité de logiciel libre, qui peut le rendre complexe à +# manipuler et qui le réserve donc à des développeurs et des professionnels +# avertis possédant des connaissances informatiques approfondies. Les +# utilisateurs sont donc invités à charger et tester l'adéquation du +# logiciel à leurs besoins dans des conditions permettant d'assurer la +# sécurité de leurs systèmes et ou de leurs données et, plus généralement, +# à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. +# +# Le fait que vous puissiez accéder à cet en-tête signifie que vous avez +# pris connaissance de la licence CeCILL-C, et que vous en avez accepté les +# termes. +# + + +import bz2 +import csv +import gzip +import logging +from optparse import make_option + +from django.core.management import BaseCommand +from django.core.management.base import CommandError + +from core.utils import show_progress + + +logger = logging.getLogger(__name__) + + + +class ExportCsvCommand(BaseCommand): + args = "file_path..." + + help = "Export jocondelab term link" + + option_list = BaseCommand.option_list + ( + make_option('-l', '--limit', + dest='limit', + type='int', + default=-1, + help='number of term to export. -1 is all (default)' + ), + make_option('-s', '--skip', + dest='skip', + type='int', + default=0, + help='number of term to skip before export. default 0.' + ), + make_option('-b', '--batch', + dest='batch', + type='int', + default=100, + help='query batch default 100.' + ), + make_option('-j', '--bzip2', + dest='bzip2', + action='store_true', + default=False, + help='bz2 compress' + ), + make_option('-z', '--gzip', + dest='gzip', + action='store_true', + default=False, + help='gzip compress' + ), + make_option('--newline', + dest='newline', + action='store_true', + default=False, + help='show progress with newlines' + ), + ) + + def get_fields(self): + raise NotImplementedError() + + def get_query(self): + raise NotImplementedError() + + def process_row(self, r): + raise NotImplementedError + + def get_row_message(self, r): + raise NotImplementedError + + def handle(self, *args, **options): + + if len(args) != 1: + raise CommandError("This command takes exactly one argument") + + filepath = args[0] + + bzip2 = options.get('bzip2', False) + gzip_opt = options.get('gzip', False) + + if bzip2 and not filepath.endswith(".bz2"): + filepath += ".bz2" + elif gzip_opt and not filepath.endswith(".gz"): + filepath += ".gz" + + limit = options.get("limit", -1) + skip = options.get("skip", 0) + batch = options.get("batch", 100) + newline = options.get("newline", False) + + qs = self.get_query() + + if limit >= 0: + qs = qs[skip:skip + limit] + else: + qs = qs[skip:] + + open_method = None + open_args = [] + + if bzip2: + open_method = bz2.BZ2File + open_args = [filepath, 'wb', 9] + elif gzip_opt: + open_method = gzip.GzipFile + open_args = [filepath, 'wb', 9] + else: + #open_method = codecs.open + open_method = open + #open_args = [filepath, 'wb', "utf-8"] + open_args = [filepath, 'wb'] + + total_records = qs.count() + + print("Total term to export : %d" % total_records) + progress_writer = None + + with open_method(*open_args) as dest_file: + + writer = csv.writer(dest_file, dialect=csv.excel_tab) + writer.writerow(self.get_fields()) + + for n in range((total_records / batch) + 1): + for i, r in enumerate(qs[n * batch:((n + 1) * batch)]): + progress_writer = show_progress(i + (n * batch) + 1, + total_records, + self.get_row_message(r), # @IgnorePep8 + 40, + writer=progress_writer, + newline=newline) + r = self.process_row(r) + encoded_row = [s.encode("utf-8") if isinstance(s, basestring) else s for s in r] + writer.writerow(encoded_row) diff -r 60d60d7cae2c -r c5e29ad9c0aa src/jocondelab/management/commands/export_term_links.py --- a/src/jocondelab/management/commands/export_term_links.py Mon Feb 10 18:06:51 2014 +0100 +++ b/src/jocondelab/management/commands/export_term_links.py Fri Mar 14 19:11:08 2014 +0100 @@ -38,19 +38,12 @@ # -import bz2 -import codecs -import gzip import logging -from optparse import make_option -import csv -from django.core.management import BaseCommand -from django.core.management.base import CommandError from django.db.models.fields.related import ForeignKey -from core.utils import show_progress from core.models.term import Term +from jocondelab.management.commands.export_csv import ExportCsvCommand logger = logging.getLogger(__name__) @@ -64,106 +57,20 @@ "wikipedia_edition" ] -class Command(BaseCommand): - args = "file_path..." - +class Command(ExportCsvCommand): + help = "Export jocondelab term link" - option_list = BaseCommand.option_list + ( - make_option('-l', '--limit', - dest='limit', - type='int', - default=-1, - help='number of term to export. -1 is all (default)' - ), - make_option('-s', '--skip', - dest='skip', - type='int', - default=0, - help='number of term to skip before export. default 0.' - ), - make_option('-b', '--batch', - dest='batch', - type='int', - default=100, - help='query batch default 100.' - ), - make_option('-j', '--bzip2', - dest='bzip2', - action='store_true', - default=False, - help='bz2 compress' - ), - make_option('-z', '--gzip', - dest='gzip', - action='store_true', - default=False, - help='gzip compress' - ), - make_option('--newline', - dest='newline', - action='store_true', - default=False, - help='show progress with newlines' - ), - ) - - def handle(self, *args, **options): - - if len(args) != 1: - raise CommandError("This command takes exactly one argument") - - filepath = args[0] - - bzip2 = options.get('bzip2', False) - gzip_opt = options.get('gzip', False) + + def get_fields(self): + return fields - if bzip2 and not filepath.endswith(".bz2"): - filepath += ".bz2" - elif gzip_opt and not filepath.endswith(".gz"): - filepath += ".gz" - - limit = options.get("limit", -1) - skip = options.get("skip", 0) - batch = options.get("batch", 100) - newline = options.get("newline", False) - - qs = Term.objects.all().select_related(*[field.name for field in Term._meta.fields if isinstance(field, ForeignKey)]).order_by('uri').values_list(*fields) # @UndefinedVariable - - if limit >= 0: - qs = qs[skip:skip + limit] - else: - qs = qs[skip:] - - open_method = None - open_args = [] + def get_query(self): + return Term.objects.all().select_related(*[field.name for field in Term._meta.fields if isinstance(field, ForeignKey)]).order_by('uri').values_list(*fields) # @UndefinedVariable + + def process_row(self, r): + return r + + def get_row_message(self, r): + return "Exporting term %s" % r[0] # @IgnorePep8 - if bzip2: - open_method = bz2.BZ2File - open_args = [filepath, 'wb', 9] - elif gzip_opt: - open_method = gzip.GzipFile - open_args = [filepath, 'wb', 9] - else: - open_method = codecs.open - open_args = [filepath, 'wb', "utf-8"] - - total_records = qs.count() - - print("Total term to export : %d" % total_records) - progress_writer = None - - with open_method(*open_args) as dest_file: - - writer = csv.writer(dest_file, dialect=csv.excel_tab) - writer.writerow(fields) - - for n in range((total_records / batch) + 1): - for i, r in enumerate(qs[n * batch:((n + 1) * batch)]): - progress_writer = show_progress(i + (n * batch) + 1, - total_records, - "Exporting term %s" % r[0], # @IgnorePep8 - 40, - writer=progress_writer, - newline=newline) - writer.writerow([s.encode("utf-8") if isinstance(s, basestring) else s for s in r])