add_dictionary.py 2.12 KB
# -*- coding: utf-8 -*-
import sys, io
from django.core.management.base import BaseCommand
from django.db.transaction import atomic

from accounts.util import bot_history
from dictionary.models import Lexeme, Vocabulary


class Command(BaseCommand):
    help = "Adds dictionary 'dictionary' to all lexemes from 'filename' (id's in first column, tab delimiter')."
    missing_args_message = 'Arguments \'filename\' and \'dictionary\' required.'
  
    def add_arguments(self, parser):
        # Positional argument
        parser.add_argument('filename', help='Filename with lexeme id\'s')
        parser.add_argument('dictionary', help='Name of dictionary')

    def handle(self, *args, **options):
        add_dict(options.get('filename'), options.get('dictionary'))

@atomic
def add_dict(filename, dictionary):
    bot_history() # ustawia historię dla użytkownika 'Kuźniobot', a jeśli takiego nie ma, to bez historii
    in_file = io.open(filename, "r", encoding='utf-8')
    try:
        dict_obj = Vocabulary.objects.get(id=dictionary)
    except:
        print >>sys.stderr, u'Nie ma słownika: {}'.format(dictionary).encode("utf-8")
        return
    for line in in_file:
        elements = line.split()
        if len(elements):
            lex_id = elements[0]
            try:
                lex_obj = Lexeme.objects.get(id=lex_id)
            except:
                print >>sys.stderr, u'Nie ma leksemu opisanego w linii: \'{}\''.format(line.strip()).encode("utf-8")
                continue
            if len(elements) > 1:  # sprawdź poprawność postaci hasłowej, jeśli została podana w pliku źródłowym
                if lex_obj.entry <> elements[1].strip():
                    print >>sys.stderr, u'Leksem o identyfikatorze: {} ma w bazie postać: \'{}\', a w pliku podanym jako argument: \'{}\''.format(elements[0], lex_obj.entry, elements[1]).encode("utf-8")
                    continue
            created = dict_obj.add_lexeme(lex_obj)
            if not created:
                print >>sys.stderr, u'Leksem opisany w linii: \'{}\' należał już do słownika: {}'.format(line.strip(), dictionary).encode("utf-8")
    in_file.close()