From 32f8ab9316fdfe0c699e81f4f4b3591a60deeb87 Mon Sep 17 00:00:00 2001
From: Lubomir Bucek <lubomir.bucek@eox.at>
Date: Thu, 26 Nov 2020 14:29:52 +0100
Subject: [PATCH] registering to coverage type based on band count

---
 .bumpversion.cfg          |  2 +-
 core/registrar/backend.py | 29 +++++++++++++++++++++++++----
 core/setup.py             |  2 +-
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 801f789a..4ad935d8 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -28,7 +28,7 @@ replace = version="{new_version}"
 search = version="{current_version}"
 replace = version="{new_version}"
 
-[bumpversion:glob:registrar/setup.py]
+[bumpversion:glob:core/setup.py]
 search = version="{current_version}"
 replace = version="{new_version}"
 
diff --git a/core/registrar/backend.py b/core/registrar/backend.py
index 056017e0..a51d3dee 100644
--- a/core/registrar/backend.py
+++ b/core/registrar/backend.py
@@ -7,7 +7,9 @@ import json
 
 import django
 from django.db import transaction
+from django.db.models import Count
 from django.contrib.gis.geos import GEOSGeometry, Polygon
+from osgeo import gdal
 
 from .exceptions import RegistrationError
 from .context import Context
@@ -129,14 +131,16 @@ class EOxServerBackend(Backend):
         from eoxserver.resources.coverages.registration.registrators.gdal import GDALRegistrator
 
         # get the mapping for this particular item
-        type_mapping = self.mapping[item.product_type]
+        try:
+            type_mapping = self.mapping[item.product_type]
+        except KeyError:
+            raise RegistrationError(f'Could not find mapping for {item.product_type} in configuration')
         mapping = type_mapping.get(item.product_level) or type_mapping.get(None)
 
         if not mapping:
             raise RegistrationError(f'Could not get mapping for {item.product_type} {item.product_level}')
 
         _, metadata_file = source.get_container_and_path(item.metadata_files[0])
-        # metadata_file = '/'.join(item.metadata_files[0].split('/')[1:])
         storage = self._get_storage_from_source(source, item.path)
 
         try:
@@ -180,9 +184,26 @@ class EOxServerBackend(Backend):
                 storage + [source.get_container_and_path(raster_item)[1]]
                 for raster_item in (raster_items if isinstance(raster_items, list) else [raster_items])
             ]
-
+            if isinstance(coverage_type_name, list):
+                # determine which one to use based on number of bands
+                gdal_path_prefix = ''
+                if isinstance(source, SwiftSource):
+                    gdal_path_prefix = '/vsiswift/'
+                elif isinstance(source, S3Source):
+                    gdal_path_prefix = '/vsis3/'
+                raster_item_to_check = f'{gdal_path_prefix}{raster_items[0][0]}/{raster_items[0][1]}'
+                ds = gdal.Open(raster_item_to_check)
+                logger.debug("Raster has number of bands: '%s'" % ds.RasterCount)
+                # find covtype that has correct number of bands
+                try:
+                    coverage_model = models.CoverageType.objects \
+                        .filter(name__in=coverage_type_name) \
+                        .annotate(field_count=Count('field_types')) \
+                        .get(field_count=ds.RasterCount)
+                except models.CoverageType.DoesNotExist:
+                    raise RegistrationError(f'Coverage Band Count is different than in any of configured CoverageTypes')
+                coverage_type_name = coverage_model.name
             logger.info(f"Registering coverage{'s' if len(raster_items) > 1 else ''} {raster_items} as {coverage_type_name}")
-
             report = GDALRegistrator().register(
                 data_locations=raster_items,
                 metadata_locations=[storage + [metadata_file]],
diff --git a/core/setup.py b/core/setup.py
index 93112025..223d0ed5 100644
--- a/core/setup.py
+++ b/core/setup.py
@@ -6,7 +6,7 @@ long_description = ""
 
 setup(
     name="registrar", # Replace with your own username
-    version="1.0.0-rc.2",
+    version="1.0.0",
     author="",
     author_email="",
     description="registrar for PVS",
-- 
GitLab