diff --git a/backend/metagenedb/apps/catalog/admin/function.py b/backend/metagenedb/apps/catalog/admin/function.py index ac8c885a40f3c996c025dd75d731b2601372be07..080d72febb246b08e28592763c166f54faad1074 100644 --- a/backend/metagenedb/apps/catalog/admin/function.py +++ b/backend/metagenedb/apps/catalog/admin/function.py @@ -25,7 +25,7 @@ class EggNogAdmin(admin.ModelAdmin): def get_functional_categories(self, obj): if obj.functional_categories.all(): - return ",".join([str(f) for f in obj.functional_categories.all()]) + return ", ".join([str(f) for f in obj.functional_categories.all()]) return '-' get_functional_categories.short_description = 'Functional categories' diff --git a/backend/metagenedb/apps/catalog/management/commands/create_update_eggnog.py b/backend/metagenedb/apps/catalog/management/commands/create_update_eggnog.py index 75a4d902d16b0a0b673613b5485c5481fb752c59..87f51ed079ead9a3fcafee717d6bd4d32ee50d55 100644 --- a/backend/metagenedb/apps/catalog/management/commands/create_update_eggnog.py +++ b/backend/metagenedb/apps/catalog/management/commands/create_update_eggnog.py @@ -27,12 +27,11 @@ class ImportEggNog(object): all_categories = EggNogFunctionalCategory.objects.all() if not all_categories: raise Exception("You need to create Functional categories first.") - self.functional_cat = {cat.category_id: cat for cat in all_categories} + self.functional_cat_instances = {cat.category_id: cat for cat in all_categories} - def link_functional_category(self, eggnog_dict): - cat_key = eggnog_dict.get('functional_category', 'S') - category = self.functional_cat.get(cat_key) - eggnog_dict.update({'functional_category': category}) + def add_functional_categories(self, eggnog, functional_category_keys): + for key in functional_category_keys: + eggnog.functional_categories.add(self.functional_cat_instances[key]) def load_all(self, test=False): self._build_functional_category_dict() @@ -40,8 +39,9 @@ class ImportEggNog(object): with open(self.annotation_file, "r") as file: for line in file: eggnog_dict = self.eggnog_parser.get_dict(line) - self.link_functional_category(eggnog_dict) + functional_category_keys = eggnog_dict.pop('functional_categories') # link later payload = {k: v for k, v in eggnog_dict.items() if v != ""} + eggnog = None try: eggnog = EggNog(**payload) eggnog.full_clean() @@ -66,6 +66,9 @@ class ImportEggNog(object): self.skipped_errors.append(validation_error) self.skipped_ids.append(payload.get('function_id')) self.skipped_count += 1 + if eggnog is not None: + self.add_functional_categories(eggnog, functional_category_keys) + eggnog.save() self.processed_count += 1 if self.processed_count % 1000 == 0: logger.info("%s/%s EggNog processed so far...", self.processed_count, self.total_eggnog_nb) diff --git a/backend/metagenedb/common/utils/parsers/eggnog.py b/backend/metagenedb/common/utils/parsers/eggnog.py index 31567b59d132393479cf971af1e95523344277a6..fed18047d56feacd132569f22d2c05cb4bb0d3d8 100644 --- a/backend/metagenedb/common/utils/parsers/eggnog.py +++ b/backend/metagenedb/common/utils/parsers/eggnog.py @@ -13,7 +13,7 @@ class EggNogAnnotationLineParser(object): try: elements = line.split('\t') return { - 'functional_category': list(elements[2]), + 'functional_categories': list(elements[2]), 'function_id': elements[1], 'name': elements[3].rstrip().split('.')[0], } diff --git a/backend/metagenedb/common/utils/parsers/test_eggnog.py b/backend/metagenedb/common/utils/parsers/test_eggnog.py index 5c5d5c98b57b6d772237022ad655555713b5c10c..d7c8e62c183daee5cd8fd58b86a0008d32c57c9a 100644 --- a/backend/metagenedb/common/utils/parsers/test_eggnog.py +++ b/backend/metagenedb/common/utils/parsers/test_eggnog.py @@ -10,7 +10,7 @@ class TestEggNogAnnotationLineParser(TestCase): expected_dict = { 'function_id': "28H54", 'name': "translational termination", - 'functional_category': ["K"] + 'functional_categories': ["K"] } test_dict = EggNogAnnotationLineParser.get_dict(ko_line) self.assertDictEqual(test_dict, expected_dict) @@ -20,7 +20,7 @@ class TestEggNogAnnotationLineParser(TestCase): expected_dict = { 'function_id': "28H50", 'name': "", - 'functional_category': ["S"] + 'functional_categories': ["S"] } test_dict = EggNogAnnotationLineParser.get_dict(ko_line) self.assertDictEqual(test_dict, expected_dict) @@ -30,7 +30,7 @@ class TestEggNogAnnotationLineParser(TestCase): expected_dict = { 'function_id': "28H50", 'name': "Glucose-responsive transcription factor that regulates expression of several glucose transporter (HXT) genes in response to glucose", # noqa - 'functional_category': ["S"] + 'functional_categories': ["S"] } test_dict = EggNogAnnotationLineParser.get_dict(ko_line) self.assertDictEqual(test_dict, expected_dict) @@ -40,7 +40,7 @@ class TestEggNogAnnotationLineParser(TestCase): expected_dict = { 'function_id': "28H54", 'name': "translational termination", - 'functional_category': ["K", "S"] + 'functional_categories': ["K", "S"] } test_dict = EggNogAnnotationLineParser.get_dict(ko_line) self.assertDictEqual(test_dict, expected_dict) diff --git a/backend/scripts/populate_db/import_igc_data.py b/backend/scripts/populate_db/import_igc_data.py index 3ee7450503b117888a2e08323935dc6628bd7290..a687342243569f4f877640b9e2bd3d1c0f2a6d53 100755 --- a/backend/scripts/populate_db/import_igc_data.py +++ b/backend/scripts/populate_db/import_igc_data.py @@ -5,7 +5,13 @@ import os import sys from itertools import islice -from bioapi import MetageneDBCatalogFunctionAPI, MetageneDBCatalogGeneAPI, MetageneDBCatalogTaxonomyAPI +from bioapi import ( + MetageneDBCatalogFunctionAPI, + MetageneDBCatalogGeneAPI, + MetageneDBCatalogTaxonomyAPI, + MetageneDBCatalogKeggOrthologyAPI, + MetageneDBCatalogEggNogAPI +) from requests.exceptions import HTTPError from slugify import slugify @@ -19,6 +25,8 @@ class ImportIGCGenes(object): METAGENEDB_GENE_API = MetageneDBCatalogGeneAPI METAGENEDB_TAXONOMY_API = MetageneDBCatalogTaxonomyAPI METAGENEDB_FUNCTION_API = MetageneDBCatalogFunctionAPI + METAGENEDB_KEGG_API = MetageneDBCatalogKeggOrthologyAPI + METAGENEDB_EGGNOG_API = MetageneDBCatalogEggNogAPI PHYLUM_COL = 'taxo_phylum' GENUS_COL = 'taxo_genus'