def _run(self, file, project, codebook_name, default_language, codebook, **kargs): data = csv_as_columns(self.bound_form.get_reader()) # build code, parent pairs if "parent" in data: parents = zip(data["code"], data["parent"]) else: cols = get_indented_columns(data) parents = list(get_parents_from_columns(cols)) uuids = data["uuid"] if "uuid" in data else [None] * len(parents) # create codebook if not codebook: codebook = Codebook.objects.create(project=project, name=codebook_name) log.info("Created codebook {codebook.id} : {codebook}".format( **locals())) else: codebook.cache_labels() log.info("Updating {codebook.id} : {codebook}".format(**locals())) # create/retrieve codes codes = { code: Code.get_or_create(uuid=uuid or None) for ((code, parent), uuid) in zip(parents, uuids) } to_add = [] for code, parent in parents: instance = codes[code] parent_instance = codes[parent] if parent else None instance.add_label(default_language, code) cbc = codebook.get_codebookcode(instance) if cbc is None: to_add.append((instance, parent_instance)) else: getid = lambda c: None if c is None else c.id if getid(cbc.parent) != getid(parent_instance): cbc.parent = parent_instance cbc.save() codebook.add_codes(to_add) for col in data: if col.startswith(LABEL_PREFIX): lang = col[len(LABEL_PREFIX):].strip() if lang.startswith('-'): lang = lang[1:].strip() try: lang = int(lang) except ValueError: lang = Language.get_or_create(label=lang).id for (code, parent), label in zip(parents, data[col]): if label: codes[code].add_label(lang, label) return codebook
def _run(self, file, project, codebook_name, default_language, codebook, **kargs): data = csv_as_columns(self.bound_form.get_reader()) # build code, parent pairs if "parent" in data: parents = zip(data["code"], data["parent"]) else: cols = get_indented_columns(data) parents = list(get_parents_from_columns(cols)) uuids = data["uuid"] if "uuid" in data else [None] * len(parents) # create codebook if not codebook: codebook = Codebook.objects.create(project=project, name=codebook_name) log.info("Created codebook {codebook.id} : {codebook}".format(**locals())) else: codebook.cache_labels() log.info("Updating {codebook.id} : {codebook}".format(**locals())) # create/retrieve codes codes = {code : Code.get_or_create(uuid=uuid or None) for ((code, parent), uuid) in zip(parents, uuids)} to_add = [] for code, parent in parents: instance = codes[code] parent_instance = codes[parent] if parent else None instance.add_label(default_language, code) cbc = codebook.get_codebookcode(instance) if cbc is None: to_add.append((instance, parent_instance)) else: getid = lambda c: None if c is None else c.id if getid(cbc.parent) != getid(parent_instance): cbc.parent = parent_instance cbc.save() codebook.add_codes(to_add) for col in data: if col.startswith(LABEL_PREFIX): lang = col[len(LABEL_PREFIX):].strip() if lang.startswith('-'): lang = lang[1:].strip() try: lang = int(lang) except ValueError: lang = Language.get_or_create(label=lang).id for (code, parent), label in zip(parents, data[col]): if label: codes[code].add_label(lang, label) return codebook
def _run(self, file, project, codebook_name, **kargs): data = csv_as_columns(self.bound_form.get_reader()) # build code, parent pairs if "parent" in data: parents = zip(data["code"], data["parent"]) else: cols = get_indented_columns(data) parents = list(get_parents_from_columns(cols)) uuids = data["uuid"] if "uuid" in data else [None] * len(parents) # create objects cb = Codebook.objects.create(project=project, name=codebook_name) log.info("Created codebook {cb.id} : {cb}".format(**locals())) codes = { code: Code.get_or_create(uuid=uuid or None) for ((code, parent), uuid) in zip(parents, uuids) } to_add = [] for code, parent in parents: instance = codes[code] parent_instance = codes[parent] if parent else None to_add.append((instance, parent_instance)) if not instance.labels.all().exists(): instance.add_label(0, code) cb.add_codes(to_add) for col in data: if col.startswith(LABEL_PREFIX): lang = col[len(LABEL_PREFIX):] try: lang = int(lang) except ValueError: lang = Language.objects.get(label=lang).id for (code, parent), label in zip(parents, data[col]): if label and not codes[code].labels.filter( language_id=lang).exists(): codes[code].add_label(lang, label) return cb
def _run(self, file, project, codebook_name, **kargs): data = csv_as_columns(self.bound_form.get_reader()) # build code, parent pairs if "parent" in data: parents = zip(data["code"], data["parent"]) else: cols = get_indented_columns(data) parents = list(get_parents_from_columns(cols)) uuids = data["uuid"] if "uuid" in data else [None] * len(parents) # create objects cb = Codebook.objects.create(project=project, name=codebook_name) log.info("Created codebook {cb.id} : {cb}".format(**locals())) codes = {code : Code.get_or_create(uuid=uuid or None) for ((code, parent), uuid) in zip(parents, uuids)} to_add = [] for code, parent in parents: instance = codes[code] parent_instance = codes[parent] if parent else None to_add.append((instance, parent_instance)) if not instance.labels.all().exists(): instance.add_label(0, code) cb.add_codes(to_add) for col in data: if col.startswith(LABEL_PREFIX): lang = col[len(LABEL_PREFIX):] try: lang = int(lang) except ValueError: lang = Language.objects.get(label=lang).id for (code, parent), label in zip(parents, data[col]): if label and not codes[code].labels.filter(language_id=lang).exists(): codes[code].add_label(lang, label) return cb