diff options
| -rw-r--r-- | archaeological_context_records/tests.py | 123 | ||||
| -rw-r--r-- | archaeological_finds/tests.py | 83 | ||||
| -rw-r--r-- | archaeological_operations/models.py | 135 | ||||
| -rw-r--r-- | archaeological_operations/tests.py | 163 | ||||
| -rw-r--r-- | ishtar_common/static/js/ishtar-map.js | 173 | ||||
| -rw-r--r-- | ishtar_common/tests.py | 181 | ||||
| -rw-r--r-- | ishtar_common/views_item.py | 2 | 
7 files changed, 79 insertions, 781 deletions
diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index acebda49b..21d3550c5 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -65,15 +65,11 @@ from ishtar_common.tests import (      COMMON_FIXTURES,      WAREHOUSE_FIXTURES,      SearchText, -    SeleniumTests,  )  from archaeological_operations.serializers import operation_serialization  from archaeological_context_records import views, serializers -if settings.SELENIUM_TEST: -    from selenium.webdriver.support.wait import WebDriverWait -  class ImportContextRecordTest(ImportTest, TestCase):      fixtures = CONTEXT_RECORD_TOWNS_FIXTURES @@ -1513,122 +1509,3 @@ class GraphGenerationTest(ContextRecordInit, TestCase):          self.assertNotIn('"CR 2D"', content) -@tag("ui") -class SeleniumTestsContextRecords(SeleniumTests): -    fixtures = CONTEXT_RECORD_FIXTURES - -    def _test_cr(self, xpath, slug_pk, geojsons): -        self.wait_and_click(xpath) -        label = self.label_from_internal_id(slug_pk) - -        base = copy.deepcopy(geojsons[label]["get_polys"]) - -        get_poly_id = "get-poly-for-" + slug_pk -        get_poly_label_id = "get-poly-label-for-" + slug_pk -        disp_bf_id = "disp-bf-for-" + slug_pk - -        cr_polys = geojsons[label]["get_polys"] -        bf_labels_polys = cr_polys["properties"].pop("base-finds") -        bf_polys = { -            "type": "FeatureCollection", -            "features": [ -                geojsons[bf_label]["get_polys"] for bf_label in bf_labels_polys -            ], -        } - -        cr_pts = geojsons[label]["get_pts"] -        bf_labels_pts = cr_pts["properties"].pop("base-finds") -        bf_pts = { -            "type": "FeatureCollection", -            "features": [geojsons[bf_label]["get_pts"] for bf_label in bf_labels_pts], -        } - -        WebDriverWait(self.selenium, self.waiting_time).until( -            lambda driver: driver.find_element_by_xpath( -                '//dl[@class="col-12"]/dt[text()="Display geo items" or text()="Afficher les éléments"]' -            ) -        ) -        dd = '//dl[@class="col-12"]/dd' -        self.selenium.find_element_by_xpath( -            dd + '/fieldset/label[@for="' + disp_bf_id + '"]' -        ) -        disp_bf = self.selenium.find_element_by_xpath( -            dd + '/fieldset/input[@id="' + disp_bf_id + '"]' -        ) -        self.assertFalse(disp_bf.is_selected()) -        select_get_poly = dd + '/select[@id="' + get_poly_id + '"]' -        get_poly_label = dd + '/label[@id="' + get_poly_label_id + '"]' -        self.assertNotInDOM(select_get_poly) -        self.assertNotInDOM(get_poly_label) -        self.assertMap(base, slug_pk) - -        # context record specific - -        # click on "Base finds" -        self.selenium.execute_script( -            "return initialize_test_map(arguments[0])", slug_pk -        ) -        self.scroll(disp_bf) -        disp_bf.click() -        select_get_poly = dd + '/select[@id="' + get_poly_id + '"]' -        get_poly = self.selenium.find_element_by_xpath(select_get_poly) -        get_poly.click() -        self.selenium.find_element_by_xpath( -            select_get_poly + '/option[@value="polygons"]' -        ).click() - -        bf_geoms = [bf_polys, {"type": "FeatureCollection", "features": []}] -        self.assertTrue(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(base, slug_pk, bf_geoms) - -        get_poly = self.selenium.find_element_by_xpath(select_get_poly) -        get_poly.click() -        self.selenium.find_element_by_xpath( -            select_get_poly + '/option[@value="points"]' -        ).click() -        bf_geoms = [bf_pts, {"type": "FeatureCollection", "features": []}] -        self.assertTrue(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(base, slug_pk, bf_geoms) - -        # Click on "None" -        self.selenium.execute_script( -            "return initialize_test_map(arguments[0])", slug_pk -        ) -        disp_bf.click() -        self.assertFalse(disp_bf.is_selected()) -        self.assertNotInDOM(select_get_poly) -        self.assertNotInDOM(get_poly_label) -        self.assertMap(base, slug_pk) - -    def test_geo_items(self): -        if not settings.SELENIUM_TEST: -            return -        geojsons = self.default_geojson() -        # from operation -        self.access_from_dropdown("operation") -        for ope_pk, ope_xpath in self.pks_and_details_from_table("operation"): -            self.access_from_dropdown("operation") -            self.wait_and_click(ope_xpath) -            self.selenium.find_element_by_xpath( -                '//ul[@role="tablist"]/li/a[contains(@id, "cr-tab")][contains(@id, "operation-' -                + str(ope_pk) -                + '")]' -            ).click() -            for pk, xpath in self.pks_and_details_from_table( -                "contextrecord", "operation" -            ): -                slug_pk = "contextrecord-" + str(pk) -                self._test_cr(xpath, slug_pk, copy.deepcopy(geojsons)) -        # from search bar -        self.access_from_dropdown("record") -        from_table = self.pks_and_details_from_table("contextrecord") -        for pk, xpath in from_table: -            self.access_from_dropdown("record") -            slug_pk = "contextrecord-" + str(pk) -            self._test_cr(xpath, slug_pk, copy.deepcopy(geojsons)) -        # from bottom table, multiple displays -        for pk, xpath in from_table: -            slug_pk = "contextrecord-" + str(pk) -            self._test_cr(xpath, slug_pk, copy.deepcopy(geojsons)) diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 3fd7d56e2..16e4b3304 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -95,7 +95,6 @@ from ishtar_common.tests import (      COMMON_FIXTURES,      GenericSerializationTest,      SearchText, -    SeleniumTests,  )  from archaeological_operations.tests import ImportTest, create_operation  from archaeological_context_records.tests import ContextRecordInit @@ -2904,85 +2903,3 @@ class TemplateTest(FindInit, TestCase):                  os.remove(tpl) -@tag("ui") -class SeleniumTestsBaseFinds(SeleniumTests): -    fixtures = FIND_FIXTURES - -    def _test_bf(self, xpath, slug_pk, geojsons): -        self.wait_and_click(xpath) -        label = self.label_from_internal_id(slug_pk) - -        bf_base = geojsons[label]["get_polys"] -        self.assertMap(bf_base, slug_pk) - -        title = '//dl[@class="col-12"]/dt[text()="Display geo items" or text()="Afficher les éléments"]' -        dd = '//dl[@class="col-12"]/dd' -        disp = dd + '/input[@name="checkbox-geo-items"]' -        get_poly = dd + '/select[@name="get-poly-geo-items"]' -        self.assertNotInDOM(title) -        self.assertNotInDOM(disp) -        self.assertNotInDOM(get_poly) - -    def test_geo_items(self): -        if not settings.SELENIUM_TEST: -            return -        geojsons = self.default_geojson() -        # from operation -        self.access_from_dropdown("operation") -        for ope_pk, ope_xpath in self.pks_and_details_from_table("operation"): -            self.access_from_dropdown("operation") -            self.wait_and_click(ope_xpath) -            self.selenium.find_element_by_xpath( -                '//ul[@role="tablist"]/li/a[contains(@id, "finds-tab")][contains(@id, "operation-' -                + str(ope_pk) -                + '")]' -            ).click() -            for pk, xpath in self.pks_and_details_from_table("find", "operation"): -                slug_pk = "find-" + str(pk) -                self._test_bf(xpath, slug_pk, copy.deepcopy(geojsons)) -        # from context record -        self.access_from_dropdown("record") -        for cr_pk, cr_xpath in self.pks_and_details_from_table("record"): -            self.access_from_dropdown("record") -            self.wait_and_click(cr_xpath) -            self.selenium.find_element_by_xpath( -                '//ul[@role="tablist"]/li/a[contains(@id, "finds-tab")][contains(@id, "contextrecord-' -                + str(cr_pk) -                + '")]' -            ).click() -            for pk, xpath in self.pks_and_details_from_table("find", "record"): -                slug_pk = "find-" + str(pk) -                self._test_bf(xpath, slug_pk, copy.deepcopy(geojsons)) -        # from context record from operation -        self.access_from_dropdown("operation") -        for ope_pk, ope_xpath in self.pks_and_details_from_table("operation"): -            self.access_from_dropdown("operation") -            self.wait_and_click(ope_xpath) -            self.selenium.find_element_by_xpath( -                '//ul[@role="tablist"]/li/a[contains(@id, "cr-tab")][contains(@id, "operation-' -                + str(ope_pk) -                + '")]' -            ).click() -            for cr_pk, cr_xpath in self.pks_and_details_from_table( -                "record", "operation" -            ): -                self.wait_and_click(cr_xpath) -                self.selenium.find_element_by_xpath( -                    '//ul[@role="tablist"]/li/a[contains(@id, "finds-tab")][contains(@id, "contextrecord-' -                    + str(cr_pk) -                    + '")]' -                ).click() -                for pk, xpath in self.pks_and_details_from_table("find", "record"): -                    slug_pk = "find-" + str(pk) -                    self._test_bf(xpath, slug_pk, copy.deepcopy(geojsons)) -        # from search bar -        self.access_from_dropdown("find") -        from_table = self.pks_and_details_from_table("find") -        for pk, xpath in from_table: -            self.access_from_dropdown("find") -            slug_pk = "find-" + str(pk) -            self._test_bf(xpath, slug_pk, copy.deepcopy(geojsons)) -        # from bottom table, multiple displays -        for pk, xpath in from_table: -            slug_pk = "find-" + str(pk) -            self._test_bf(xpath, slug_pk, copy.deepcopy(geojsons)) diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 69f8d4fdc..69b24fecd 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -30,6 +30,7 @@ from django.contrib.gis.db import models  from django.contrib.gis.db.models.aggregates import Union  from django.contrib.gis.db.models.functions import Centroid  from django.contrib.postgres.indexes import GinIndex +from django.contrib.sites.models import Site  from django.db import IntegrityError, transaction  from django.db.models import Q, Count, Sum, Max, Avg  from django.db.models.signals import post_save, m2m_changed, post_delete @@ -1729,92 +1730,88 @@ class Operation(          q = self.towns.filter(limit__isnull=False).annotate(poly=Union("limit")).all()          if not q.count():              return None -        return q.all()[0].poly, self._meta.verbose_namea - -    """ -    def _get_child_geodata(self, query, cr_list, collection_context_records_id, -                           current_geodata): -        childs = [] -        for cr in query.exclude(id__in=cr_list).values( -                "main_geodata", "id").distinct().all(): -            childs.append(cr["id"]) -            geodata_id = cr["main_geodata"] -            if geodata_id not in collection_context_records_id \ -                    and geodata_id not in current_geodata: -                collection_context_records_id.append(geodata_id) -        cr_list += childs -        return childs -    """ - -    def get_geo_items(self, rounded=True): -        dct = super(Operation, self).get_geo_items(rounded=rounded) -        ContextRecord = apps.get_model( -            "archaeological_context_records", "ContextRecord" -        ) - -        q = self.context_record.filter(main_geodata__isnull=False) - -        """ -        included = q.filter( -            right_relations__relation_type__txt_idx='is_included') -        q_upper = q.exclude(id__in=set(included.values_list("id", flat=True))) -        cr_list = [] - -        childs = self._get_child_geodata( -            q_upper, cr_list, collection_context_records_id, -            current_geodata) -        while childs: -            new_childs = [] -            for child_id in childs: -                q_lower = q.filter( -                    right_relations__relation_type__txt_idx='is_included', -                    right_relations__right_record_id=child_id -                ) -                new_childs += self._get_child_geodata( -                    q_lower, cr_list, collection_context_records_id, -                    current_geodata) -            childs = new_childs - +        return q.all()[0].poly, self._meta.verbose_name -         -        """ -        collection_context_records_id = [] -        current_geodata = self.geodata.values_list("id", flat=True) +    def _get_geo_item_list(self, q, current_geodata, url, precision, rounded): +        collection_id = [] +        items_id = []          q = q.values("main_geodata", "id") -        for cr in q.distinct().all(): -            geodata_id = cr["main_geodata"] -            if geodata_id not in collection_context_records_id \ -                    and geodata_id not in current_geodata: -                collection_context_records_id.append(geodata_id) - -        collection_context_records = [] -        for cr_id in collection_context_records_id: -            geo = json.loads(GeoVectorData.objects.get(pk=cr_id).geojson) +        for item in q.distinct().all(): +            geodata_id = item["main_geodata"] +            if geodata_id not in current_geodata: +                collection_id.append(geodata_id) +                items_id.append(item["id"]) +                current_geodata.append(geodata_id) + +        collection = [] +        for idx in range(len(collection_id)): +            geo = json.loads(GeoVectorData.objects.get(pk=collection_id[idx]).geojson)              geo_type = geo.get("type", None) +            url_geo = url.format(items_id[idx])              if geo_type == "FeatureCollection": -                collection_context_records += geo["features"] +                for feat in geo["features"]: +                    if "properties" in feat: +                        feat["properties"]["url"] = url_geo +                collection += geo["features"]              elif geo_type: -                collection_context_records.append(geo) +                if "properties" in geo: +                    geo["properties"]["url"] = url_geo +                collection.append(geo) -        profile = get_current_profile() -        precision = profile.point_precision          if not precision and rounded: -            precision = 5 -        if precision is not None: -            r = re.compile(r"(\d+)\.(\d{6})(\d*)") -            for feat in collection_context_records: -                geom_type = feat["geometry"].get("type", None) -                if geom_type == "Point": +            precision = 6 +        r = re.compile(r"(\d+)\.(\d{6})(\d*)") +        new_collection = [] +        for feat in collection: +            geom_type = feat["geometry"].get("type", None) +            if geom_type == "Point": +                if precision is not None:                      feat["geometry"]["coordinates"] = [                          round(feat["geometry"]["coordinates"][0], precision),                          round(feat["geometry"]["coordinates"][1], precision),                      ] +                if not (-90 <= feat["geometry"]["coordinates"][1] <= 90) or not ( +                        -180 <= feat["geometry"]["coordinates"][0] <= 180): +                    # probably a bad projection +                    continue +            new_collection.append(feat) +        return new_collection + + +    def get_geo_items(self, rounded=True): +        dct = super(Operation, self).get_geo_items(rounded=rounded) +        site = Site.objects.get_current() +        scheme = "https" if settings.ISHTAR_SECURE else "http" +        base_url = scheme + "://" + site.domain + +        profile = get_current_profile() +        precision = profile.point_precision + +        current_geodata = list(self.geodata.values_list("id", flat=True)) + +        q = self.context_record.filter(main_geodata__isnull=False) +        url = base_url + "/show-contextrecord/{}/" +        collection_context_records = self._get_geo_item_list( +            q, current_geodata, url, precision, rounded +        ) + +        BaseFind = apps.get_model("archaeological_finds", "BaseFind") +        q = BaseFind.objects.filter(context_record__operation_id=self.pk, +                                    main_geodata__isnull=False) +        url = base_url + "/show-basefind/{}/" +        collection_finds = self._get_geo_item_list( +            q, current_geodata, url, precision, rounded +        )          dct["context-records"] = {              "type": "FeatureCollection",              "features": collection_context_records,          } +        dct["finds"] = { +            "type": "FeatureCollection", +            "features": collection_finds, +        }          return dct      def context_record_relations_q(self): diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 2521651ae..bfe8e3b11 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -109,13 +109,9 @@ from ishtar_common.tests import (      GenericSerializationTest,      WAREHOUSE_FIXTURES,      SearchText, -    SeleniumTests,  )  from ishtar_common.serializers import restore_serialized -if settings.SELENIUM_TEST: -    from selenium.webdriver.support.wait import WebDriverWait -  class FileInit(object):      def login_as_superuser(self): @@ -4483,165 +4479,6 @@ class DocumentQATest(OperationInitTest, TestCase):          ) -@tag("ui") -class SeleniumTestsOperations(SeleniumTests): -    fixtures = OPERATION_FIXTURES - -    def _test_operation(self, xpath, slug_pk, geojsons): -        self.wait_and_click(xpath) -        label = self.label_from_internal_id(slug_pk) - -        get_poly_id = "get-poly-for-" + slug_pk -        get_poly_label_id = "get-poly-label-for-" + slug_pk -        disp_cr_id = "disp-cr-for-" + slug_pk -        disp_bf_id = "disp-bf-for-" + slug_pk - -        ope_polys = geojsons[label]["get_polys"] -        cr_labels_polys = ope_polys["properties"].pop("context-records") -        bf_labels_polys = ope_polys["properties"].pop("base-finds") -        cr_polys = {"type": "FeatureCollection", "features": []} -        for cr_label in cr_labels_polys: -            geojsons[cr_label]["get_polys"]["properties"] = None -            cr_polys["features"].append(geojsons[cr_label]["get_polys"]) -        bf_polys = { -            "type": "FeatureCollection", -            "features": [ -                geojsons[bf_label]["get_polys"] for bf_label in bf_labels_polys -            ], -        } - -        ope_pts = geojsons[label]["get_pts"] -        cr_labels_pts = ope_pts["properties"].pop("context-records") -        cr_pts = {"type": "FeatureCollection", "features": []} -        for cr_label in cr_labels_pts: -            geojsons[cr_label]["get_pts"]["properties"] = None -            cr_pts["features"].append(geojsons[cr_label]["get_pts"]) -        bf_labels_pts = ope_pts["properties"].pop("base-finds") -        bf_pts = { -            "type": "FeatureCollection", -            "features": [geojsons[bf_label]["get_pts"] for bf_label in bf_labels_pts], -        } - -        ope_base = geojsons[label]["get_polys"] - -        WebDriverWait(self.selenium, self.waiting_time).until( -            lambda driver: driver.find_element_by_xpath( -                '//dl[@class="col-12"]/dt[@id="display-geo-items-for-' + slug_pk + '"]' -            ) -        ) -        dd = '//dl[@class="col-12"]/dd' -        self.selenium.find_element_by_xpath( -            dd + '/fieldset/label[@for="' + disp_cr_id + '"]' -        ) -        disp_cr = self.selenium.find_element_by_xpath( -            dd + '/fieldset/input[@id="' + disp_cr_id + '"]' -        ) -        self.selenium.find_element_by_xpath( -            dd + '/fieldset/label[@for="' + disp_bf_id + '"]' -        ) -        disp_bf = self.selenium.find_element_by_xpath( -            dd + '/fieldset/input[@id="' + disp_bf_id + '"]' -        ) -        self.assertFalse(disp_cr.is_selected()) -        self.assertFalse(disp_bf.is_selected()) -        select_get_poly = dd + '/select[@id="' + get_poly_id + '"]' -        get_poly_label = dd + '/label[@id="' + get_poly_label_id + '"]' -        self.assertNotInDOM(select_get_poly) -        self.assertNotInDOM(get_poly_label) -        self.assertMap(ope_base, slug_pk) - -        # click on "Context records" -        self.selenium.execute_script("initialize_test_map(arguments[0])", slug_pk) -        self.scroll(disp_cr) -        disp_cr.click() - -        cr_geoms = [{"type": "FeatureCollection", "features": []}, cr_polys] -        self.assertTrue(disp_cr.is_selected()) -        self.assertFalse(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(ope_base, slug_pk, cr_geoms) - -        get_poly = self.selenium.find_element_by_xpath(select_get_poly) -        get_poly.click() -        self.selenium.find_element_by_xpath( -            select_get_poly + '/option[@value="points"]' -        ).click() -        cr_geoms = [{"type": "FeatureCollection", "features": []}, cr_pts] -        self.assertTrue(disp_cr.is_selected()) -        self.assertFalse(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(ope_base, slug_pk, cr_geoms) - -        # Click on everything -        self.selenium.execute_script("initialize_test_map(arguments[0])", slug_pk) -        disp_bf.click() -        every_geoms = [bf_pts, cr_pts] -        self.assertTrue(disp_cr.is_selected()) -        self.assertTrue(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(ope_base, slug_pk, every_geoms) - -        self.selenium.execute_script("initialize_test_map(arguments[0])", slug_pk) -        get_poly.click() -        self.selenium.find_element_by_xpath( -            select_get_poly + '/option[@value="polygons"]' -        ).click() -        every_geoms = [bf_polys, cr_polys] -        self.assertTrue(disp_cr.is_selected()) -        self.assertTrue(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(ope_base, slug_pk, every_geoms) - -        # click on "Base finds" -        self.selenium.execute_script("initialize_test_map(arguments[0])", slug_pk) -        self.scroll(disp_cr) -        disp_cr.click() - -        bf_geoms = [bf_polys, {"type": "FeatureCollection", "features": []}] -        self.assertFalse(disp_cr.is_selected()) -        self.assertTrue(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(ope_base, slug_pk, bf_geoms) - -        select_get_poly = dd + '/select[@id="' + get_poly_id + '"]' -        get_poly = self.selenium.find_element_by_xpath(select_get_poly) -        get_poly.click() -        self.selenium.find_element_by_xpath( -            select_get_poly + '/option[@value="points"]' -        ).click() -        bf_geoms = [bf_pts, {"type": "FeatureCollection", "features": []}] -        self.assertFalse(disp_cr.is_selected()) -        self.assertTrue(disp_bf.is_selected()) -        self.selenium.find_element_by_xpath(get_poly_label) -        self.assertMap(ope_base, slug_pk, bf_geoms) - -        # Click on "None" -        self.selenium.execute_script("initialize_test_map(arguments[0])", slug_pk) -        disp_bf.click() -        self.assertFalse(disp_cr.is_selected()) -        self.assertFalse(disp_bf.is_selected()) -        self.assertNotInDOM(select_get_poly) -        self.assertNotInDOM(get_poly_label) -        self.assertMap(ope_base, slug_pk) - -    def test_geo_items(self): -        if not settings.SELENIUM_TEST: -            return -        geojsons = self.default_geojson() -        slug = "operation" -        self.access_from_dropdown(slug) -        from_table = self.pks_and_details_from_table(slug) -        for pk, xpath in from_table: -            self.access_from_dropdown(slug) -            slug_pk = slug + "-" + str(pk) -            self._test_operation(xpath, slug_pk, copy.deepcopy(geojsons)) -        # display both at the same time -        self.access_from_dropdown(slug) -        for pk, xpath in from_table: -            slug_pk = slug + "-" + str(pk) -            self._test_operation(xpath, slug_pk, copy.deepcopy(geojsons)) - -  class ApiTest(OperationInitTest, APITestCase):      fixtures = FILE_FIXTURES diff --git a/ishtar_common/static/js/ishtar-map.js b/ishtar_common/static/js/ishtar-map.js index ae591db08..8ffe399d6 100644 --- a/ishtar_common/static/js/ishtar-map.js +++ b/ishtar_common/static/js/ishtar-map.js @@ -529,6 +529,9 @@ var open_map_window = function(map_id){  var complete_list_label = "complete list..."; +var map_display_base_url_start = "<a class='display_details' href='#' onclick='load_window(\""; +var map_display_base_url_end = "\")'><i class='fa fa-info-circle' aria-hidden='true'></i></a>"; +  var _display_items = function(map_id, features, offset_x, offset_y){      // console.log("display_items");      var feature = features[0]; @@ -549,7 +552,10 @@ var _display_items = function(map_id, features, offset_x, offset_y){          if (link_template[map_id]){              link = link_template[map_id].replace("<pk>", properties["id"]);          } -        var txt = "<li>" + link + " " + properties['name'] + "</li>"; +        if ("url" in properties){ +            link = map_display_base_url_start + properties["url"] + map_display_base_url_end; +        } +        var txt = "<li>" + link + " " + properties["name"] + "</li>";          window_content += txt;          if (idx_feat < 5){              popup_content += txt; @@ -728,8 +734,7 @@ var display_points = function(map_id, points, first_init){      if (!cluster_source[map_id]){          enable_clustering(map_id);      } else { -        cluster_source[map_id].getSource().clear(); -        cluster_source[map_id].getSource().refresh(); +        reinit_clustering(map_id);      }      cluster_source[map_id].getSource().addFeatures(point_features[map_id]);      if (first_init && points.features && points.features.length){ @@ -761,160 +766,6 @@ var display_lines_and_polys = function(map_id, lines_and_polys, first_init){      }  }; -var display_geo_items = function(map_id, base_url, slug, pk, -                              disp_cr, disp_bf, get_poly) { -    let url = base_url; -    if (slug === "operation") { -        url += "?operation_pk="; -    } -    else { -        url += "?context_record_pk="; -    } -    url += pk; - -    httpRequest = new XMLHttpRequest(); -    if (!httpRequest) { return; } -    httpRequest.onreadystatechange = function() { -        if (httpRequest.readyState === XMLHttpRequest.DONE) { -            if (httpRequest.status === 200) { -                const geo_items = to_geo_items(JSON.parse(httpRequest.responseText), slug, disp_cr, disp_bf) -                if (current_test) { -                    geo_items_features[map_id] = []; -                } -                let bfs = null; -                let crs = null; -                if (get_poly) { -                    bfs = display_associated_polys(map_id, geo_items['base-finds'], 'basefind'); -                    crs = display_associated_polys(map_id, geo_items['context-records'], 'contextrecord'); -                } else { -                    bfs = display_associated_points(map_id, geo_items['base-finds'], 'basefind'); -                    crs = display_associated_points(map_id, geo_items['context-records'], 'contextrecord'); -                } -                if (current_test) { -                    geo_items_features[map_id].push(bfs) -                    geo_items_features[map_id].push(crs) -                    $("#http-geo-items-ready-"+slug+"-"+pk).show(); -                } -            } else { return; } -        } -    }; -    httpRequest.open('GET', url, true); -    httpRequest.send(); -}; - -var to_geo_items = function (obj, slug, disp_cr, disp_bf) { -    const objects = {'context-records': {'features': [], 'type': 'FeatureCollection'}, -    'base-finds': {'features': [], 'type': 'FeatureCollection'}}; -    if (slug === "operation") { -        const crs = obj['properties']['context-records']; -        for (const cr of crs['features']) { -            if (disp_bf) { -                for (const bf of cr['properties']['base-finds']['features']) { -                    objects['base-finds']['features'].push(bf) -                } -            } -            delete cr['properties']; -            if (disp_cr) { -                objects['context-records']['features'].push(cr) -            } -        } -    } -    else { -        for (const bf of obj['properties']['base-finds']['features']) { -            objects['base-finds']['features'].push(bf) -        } -    } -    return objects; -} - -var display_associated_polys = function (map_id, polys, slug) { -    const _vector_features = geojson_format.readFeatures(polys); -    const _vector_source = new ol.source.Vector(); -    _vector_source.addFeatures(_vector_features); -    let style = get_associated_base_find_style; -    if (slug === 'contextrecord') { -        style = get_associated_context_record_style; -    } -    const _vector_layer = new ol.layer.Vector({ -        source: _vector_source, -        style: style -    }); -    map[map_id].addLayer(_vector_layer); -    return _vector_features -} - -var get_associated_base_find_style = function (feature) { -    return new ol.style.Style({ -        stroke: new ol.style.Stroke({ -            color: 'rgba(0, 0, 0, 1)', -            width: 2 -        }), -        fill: new ol.style.Fill({ -            color: 'rgba(O, O, O, 0.2)' -        }) -    }); -}; - -var get_associated_context_record_style = function (feature) { -    return new ol.style.Style({ -        stroke: new ol.style.Stroke({ -            color: 'rgba(255, 255, 255, 1)', -            width: 2 -        }), -        fill: new ol.style.Fill({ -            color: 'rgba(255, 255, 255, 0.2)' -        }), -        radius: 10 -    }); -}; - -var display_associated_points = function (map_id, points, slug) { -    const _point_features = geojson_format.readFeatures(points); -    const _cluster_source = new ol.source.Cluster({ -        distance: 40, -        source: new ol.source.Vector() -    }); -    _cluster_source.getSource().addFeatures(_point_features); -    // TODO: create own style -    const style = cluster_get_style; -    const _cluster_layer = new ol.layer.Vector({ -        name: 'Cluster', -        source: _cluster_source, -        style: style -    }); -    map[map_id].addLayer(_cluster_layer); -    return _point_features; -} - -var get_features_by_id = function (id) { -    let base_features = null -    if (vector_features[id] == null) { -        base_features = geojson_format.writeFeaturesObject(point_features[id], {decimals: 5}); -    } else { -        base_features = geojson_format.writeFeaturesObject(vector_features[id], {decimals: 5}); -    } -    const geo_items_feats = []; -    if (geo_items_features && id in geo_items_features) { -        for (const features of geo_items_features[id]) { -            geo_items_feats.push(geojson_format.writeFeaturesObject(features, {decimals: 5})); -        } -    } -    return [base_features, geo_items_feats]; -} - -var base_features_type = function (id) { -    if (vector_features[id] == null) { -        if (point_features[id] == null) { -            return 'both null'; -        } -        else { return 'Point'; } -    } -    if (point_features[id] == null) { -        return 'MultiPolygon'; -    } -    else { return 'Point and MultiPolygon' } -} -  var _geo_points = new Array();  var _geo_other = new Array(); @@ -948,10 +799,10 @@ const _refresh_map_finds = function(idx) {      }  } -const refresh_map_finds_crs = function(url, attrs, idx, crs_check, find_check) { +const refresh_map_finds_crs = function(url, attrs, idx, crs_check, finds_check) {      if (idx in _point_list_finds){          if (crs_check) _refresh_map_crs(idx); -        if (find_check) _refresh_map_finds(idx); +        if (finds_check) _refresh_map_finds(idx);          return;      }      _point_list_crs[idx] = new Array(); @@ -1011,9 +862,9 @@ const refresh_map = function(idx, geodata_list, url, attrs) {          }      }      if (url && attrs){ -        let find_check = $("#map-ol-" + idx + "-finds").prop('checked'); +        let finds_check = $("#map-ol-" + idx + "-finds").prop('checked');          let crs_check = $("#map-ol-" + idx + "-crs").prop('checked'); -        refresh_map_finds_crs(url, attrs, idx, crs_check, find_check); +        refresh_map_finds_crs(url, attrs, idx, crs_check, finds_check);      }  } diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 25d4d8e85..a7cc8361c 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -90,12 +90,6 @@ from ishtar_common import utils_secretary  from django.contrib.staticfiles.testing import StaticLiveServerTestCase -if settings.SELENIUM_TEST: -    from selenium.webdriver.firefox.webdriver import WebDriver -    from selenium.webdriver.support.wait import WebDriverWait -    from selenium.webdriver.common.by import By -    from selenium.webdriver.support import expected_conditions as EC -  COMMON_FIXTURES = [      settings.ROOT_PATH + "../fixtures/initial_data-auth-fr.json", @@ -3369,178 +3363,3 @@ class TemplateGenerationTest(TestCase):                  filtr = doc.get_filter(template, filter_re)                  for key in expected_keys:                      self.assertIn(key, filtr) - - -@tag("ui") -class SeleniumTests(StaticLiveServerTestCase): -    @classmethod -    def setUpClass(cls): -        if not settings.SELENIUM_TEST: -            sys.stdout.write("UI test not activated. Set SELENIUM_TEST to True.") -            return -        super().setUpClass() -        cls.waiting_time = 20 -        cls.selenium = WebDriver() -        cls.selenium.implicitly_wait(cls.waiting_time) - -    @classmethod -    def tearDownClass(cls): -        if not settings.SELENIUM_TEST: -            return -        cls.selenium.quit() -        super().tearDownClass() - -    def setUp(self): -        if not settings.SELENIUM_TEST: -            return - -        # profile -        profile = models.get_current_profile() -        profile.mapping = True -        profile.files = True -        profile.context_record = True -        profile.find = True -        profile.warehouse = True -        profile.experimental_feature = True -        profile.save() - -        # login -        self.username, self.password, self.user = create_superuser() -        self.selenium.get("%s%s" % (self.live_server_url, "/accounts/login/")) -        WebDriverWait(self.selenium, self.waiting_time).until( -            lambda driver: driver.find_element_by_name("username") -        ) -        username_input = self.selenium.find_element_by_name("username") -        username_input.send_keys(self.username) -        password_input = self.selenium.find_element_by_name("password") -        password_input.send_keys(self.password) -        self.selenium.find_element_by_xpath( -            '//button[@type="submit"][@class="btn btn-primary"]' -        ).click() - -    def setUpDefaultGeoItems(self): -        if not settings.SELENIUM_TEST: -            return -        return GeomaticTest.setUpDefaultGeoItems(self.user) - -    def default_geojson(self): -        geoms, pks = self.setUpDefaultGeoItems() -        return GeomaticTest.geojson_geo_items(geoms, pks) - -    def scroll(self, element): -        self.selenium.execute_script( -            "var viewPortHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);" -            + "var elementTop = arguments[0].getBoundingClientRect().top;" -            + "window.scrollBy(0, elementTop-(viewPortHeight/2));", -            element, -        ) - -    def wait_and_click(self, xpath): -        WebDriverWait(self.selenium, self.waiting_time).until( -            EC.visibility_of_element_located((By.XPATH, xpath)) -        ) -        el = self.selenium.find_element_by_xpath(xpath) -        self.scroll(el) -        el.click() - -    def access_from_dropdown(self, slug): -        if slug == "contextrecord": -            slug = "record" -        if slug == "basefind": -            slug = "find" -        self.wait_and_click( -            '//a[@class="nav-link dropdown-toggle"][@id="dropdown-menu-main"]' -        ) -        self.selenium.find_element_by_xpath( -            '//div[@class="dropdown-menu show"]/a[@href="/' + slug + '_search/"]' -        ).click() - -    def pks_and_details_from_table(self, slug, source=None): -        res = [] -        xpath = "//table" -        keywords = ["find", "record", "operation"] -        for key in keywords: -            if key in slug or (source and key in source): -                xpath += '[contains(@id, "' + key + '")]' -            else: -                xpath += '[not(contains(@id, "' + key + '"))]' -        xpath += ( -            '/tbody/tr/td/a[@class="display_details"][@href="#"][contains(@onclick, "' -            + slug -            + '")]' -        ) -        for el in self.selenium.find_elements_by_xpath(xpath): -            pk = int(re.findall(r"\d+", el.get_attribute("onclick"))[-1]) -            res.append([pk, xpath + '[contains(@onclick, "' + str(pk) + '")]']) -        return res - -    def label_from_internal_id(self, slug_pk): -        xpath = '//div[contains(@id, "' -        if slug_pk[:3] == "ope": -            xpath += slug_pk + '")]' + "/div" * 5 -        elif slug_pk[:7] == "context": -            xpath += slug_pk + '")]' + "/div" * 3 -        else: -            xpath += slug_pk[4:] + '")]' -        xpath += '/p/small[@title="ID interne" or @title="Internal ID"]' -        WebDriverWait(self.selenium, self.waiting_time).until( -            EC.visibility_of_element_located((By.XPATH, xpath)) -        ) -        label = self.selenium.find_element_by_xpath(xpath).text -        if slug_pk[:3] == "ope": -            if label == "2": -                label = "Poly" -            else: -                label = "Pt" -        elif slug_pk[:7] == "context": -            label = label[1:] -        else: -            label = label.split("-") -            label = label[2] -        return label - -    def assertNotInDOM(self, xpath): -        self.selenium.implicitly_wait(self.waiting_time / 10) -        try: -            WebDriverWait(self.selenium, self.waiting_time / 10).until( -                EC.visibility_of_element_located((By.XPATH, xpath)) -            ) -            found = True -        except: -            found = False -        self.selenium.implicitly_wait(self.waiting_time) -        self.assertFalse(found) - -    def assertMap(self, dic_base, slug_pk, features_collecs=None): -        dic_base = {"type": "FeatureCollection", "features": [dic_base]} -        mapid = None -        t = time() -        while not mapid and time() - t < self.waiting_time: -            mapdivs = self.selenium.find_elements_by_class_name("window-map") -            for mapdiv in mapdivs: -                if slug_pk in mapdiv.get_attribute("id"): -                    mapid = mapdiv.get_attribute("id") -                    break -        self.assertIsNotNone(mapid, "Timeout, no mapid found") -        id = int(re.search(r"\d+$", mapid).group()) -        # TODO: use the map and not the map_features in the js function -        if features_collecs: -            WebDriverWait(self.selenium, self.waiting_time).until( -                EC.visibility_of_element_located( -                    (By.ID, "http-geo-items-ready-" + slug_pk) -                ) -            ) -        base_features, geo_items_feats = self.selenium.execute_script( -            "return get_features_by_id(arguments[0])", mapid -        ) -        base_features["features"][0]["properties"].pop("name") -        base_features_type = self.selenium.execute_script( -            "return base_features_type(arguments[0])", mapid -        ) -        dic_base["features"][0]["properties"] = {"id": id} -        self.assertEqual( -            base_features_type, dic_base["features"][0]["geometry"]["type"] -        ) -        self.assertEqual(base_features, dic_base) -        if features_collecs: -            self.assertEqual(geo_items_feats, features_collecs) diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py index b1a7e397d..d06613b19 100644 --- a/ishtar_common/views_item.py +++ b/ishtar_common/views_item.py @@ -360,7 +360,7 @@ def show_item(model, name, extra_dct=None, model_for_perms=None):              date = dct.pop("date")          dct["sheet_id"] = f"{name}-{pk}"          dct["window_id"] = f"{name}-{pk}-{datetime.datetime.now().strftime('%M%s')}" -        if pk.startswith("source-"): +        if str(pk).startswith("source-"):              return show_source_item(request, pk, model, name, dct, extra_dct)          try:              item = q.get(pk=pk)  | 
