Ejemplo n.º 1
0
   def test_merge_specified_rooms_from_two_floors_into_one(self):
      base_floor                    = self.floor
      base_floor["rooms"]["R002"]   = {}
      unmatched_floor   = {
         "f_id"  : "333",
         "rooms" : {
            "R001" : {
               "cat_id"     : "Pippo",
               "room_name"    : "Aula 777"
            },
            "R002" : {
               "cat_id"     : "Aula Nuova",
               "capacity"     : "22"
            },
            "R003" : {}
         }
      }

      old_r01 = base_floor["rooms"]["R001"]
      old_r02 = base_floor["rooms"]["R002"]

      DataMerger._merge_rooms_into_floor(
         base_floor,
         unmatched_floor,
         set(["R001", "R002"])
      )
      self.assertEqual(base_floor["f_id"], "1")
      self.assertTrue("R001" in base_floor["rooms"])
      self.assertTrue("R002" in base_floor["rooms"])
      self.assertFalse("R003" in base_floor["rooms"])

      r01 = base_floor["rooms"]["R001"]
      r02 = base_floor["rooms"]["R002"]

      self.assertFalse(r01 is old_r01)
      self.assertFalse(r02 is old_r02)

      # Ensure priority has been kept on a per-attribute basis
      cat_id = unmatched_floor["rooms"]["R001"]["cat_id"]
      self.assertEqual(r01["cat_id"], cat_id)
      self.assertEqual(r01["room_name"], old_r01["room_name"])
      self.assertEqual(r02["cat_id"], "Aula Nuova")
      self.assertEqual(r02["capacity"], "22")

      old_merge_room_method = DataMerger.merge_room
      DataMerger.merge_room = MagicMock()
      DataMerger._merge_rooms_into_floor(
         base_floor,
         unmatched_floor,
         set(["R001", "R002"])
      )

      self.assertEqual(DataMerger.merge_room.call_count, 2)
      DataMerger.merge_room = old_merge_room_method
Ejemplo n.º 2
0
   def test_merge_building_name(self):
      """ Merge without edilizia data """
      merged = DataMerger._merge_building_name(edilizia=None, easyroom=self.db_building["easyroom"])
      self.assertEqual(merged,"Agraria Edificio 3")

      """ Merge without easyroom data """
      merged = DataMerger._merge_building_name(edilizia=self.db_building["edilizia"], easyroom=None)
      self.assertEqual(merged, "")

      """ Merge with edilizia and easyroom data """
      merged = DataMerger._merge_building_name(edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"])
      self.assertEqual(merged,"Agraria Edificio 3")
Ejemplo n.º 3
0
   def test_merge_building_address(self):
      """ Merge without edilizia data """
      merged = DataMerger._merge_building_address(easyroom=self.db_building["easyroom"])
      self.assertEqual(merged, "Via Celoria, 2, Milano, 20133")

      """ Merge without easyroom data """
      merged = DataMerger._merge_building_address(edilizia=self.db_building["edilizia"])
      self.assertEqual(merged, "Via Celoria, 2, Milano")

      """ Merge with edilizia and easyroom data """
      merged = DataMerger._merge_building_address(edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"])
      self.assertEqual(merged, "Via Celoria, 2, Milano, 20133")
Ejemplo n.º 4
0
   def test_merge_building_l_b_id(self):
      """ Merge without edilizia data """
      merged = DataMerger._merge_building_l_b_id(easyroom=self.db_building["easyroom"])
      self.assertEqual(merged,"")

      """ Merge without easyroom data """
      merged = DataMerger._merge_building_l_b_id(edilizia=self.db_building["edilizia"])
      self.assertEqual(merged,"5703")

      """ Merge with edilizia and easyroom data """
      merged = DataMerger._merge_building_l_b_id(edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"])
      self.assertEqual(merged,"5703")
Ejemplo n.º 5
0
    def test_merge_building_l_b_id(self):
        """ Merge without edilizia data """
        merged = DataMerger._merge_building_l_b_id(easyroom=self.db_building["easyroom"])
        self.assertEqual(merged, "")

        """ Merge without easyroom data """
        merged = DataMerger._merge_building_l_b_id(edilizia=self.db_building["edilizia"])
        self.assertEqual(merged, "5703")

        """ Merge with edilizia and easyroom data """
        merged = DataMerger._merge_building_l_b_id(
            edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"]
        )
        self.assertEqual(merged, "5703")
Ejemplo n.º 6
0
    def test_merge_building_address(self):
        """ Merge without edilizia data """
        merged = DataMerger._merge_building_address(easyroom=self.db_building["easyroom"])
        self.assertEqual(merged, "Via Celoria, 2, Milano, 20133")

        """ Merge without easyroom data """
        merged = DataMerger._merge_building_address(edilizia=self.db_building["edilizia"])
        self.assertEqual(merged, "Via Celoria, 2, Milano")

        """ Merge with edilizia and easyroom data """
        merged = DataMerger._merge_building_address(
            edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"]
        )
        self.assertEqual(merged, "Via Celoria, 2, Milano, 20133")
Ejemplo n.º 7
0
    def test_merge_building_name(self):
        """ Merge without edilizia data """
        merged = DataMerger._merge_building_name(edilizia=None, easyroom=self.db_building["easyroom"])
        self.assertEqual(merged, "Agraria Edificio 3")

        """ Merge without easyroom data """
        merged = DataMerger._merge_building_name(edilizia=self.db_building["edilizia"], easyroom=None)
        self.assertEqual(merged, "")

        """ Merge with edilizia and easyroom data """
        merged = DataMerger._merge_building_name(
            edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"]
        )
        self.assertEqual(merged, "Agraria Edificio 3")
Ejemplo n.º 8
0
    def test_merge_specified_rooms_from_two_floors_into_one(self):
        base_floor = self.floor
        base_floor["rooms"]["R002"] = {}
        unmatched_floor = {
            "f_id": "333",
            "rooms": {
                "R001": {
                    "cat_id": "Pippo",
                    "room_name": "Aula 777"
                },
                "R002": {
                    "cat_id": "Aula Nuova",
                    "capacity": "22"
                },
                "R003": {}
            }
        }

        old_r01 = base_floor["rooms"]["R001"]
        old_r02 = base_floor["rooms"]["R002"]

        DataMerger._merge_rooms_into_floor(base_floor, unmatched_floor,
                                           set(["R001", "R002"]))
        self.assertEqual(base_floor["f_id"], "1")
        self.assertTrue("R001" in base_floor["rooms"])
        self.assertTrue("R002" in base_floor["rooms"])
        self.assertFalse("R003" in base_floor["rooms"])

        r01 = base_floor["rooms"]["R001"]
        r02 = base_floor["rooms"]["R002"]

        self.assertFalse(r01 is old_r01)
        self.assertFalse(r02 is old_r02)

        # Ensure priority has been kept on a per-attribute basis
        cat_id = unmatched_floor["rooms"]["R001"]["cat_id"]
        self.assertEqual(r01["cat_id"], cat_id)
        self.assertEqual(r01["room_name"], old_r01["room_name"])
        self.assertEqual(r02["cat_id"], "Aula Nuova")
        self.assertEqual(r02["capacity"], "22")

        old_merge_room_method = DataMerger.merge_room
        DataMerger.merge_room = MagicMock()
        DataMerger._merge_rooms_into_floor(base_floor, unmatched_floor,
                                           set(["R001", "R002"]))

        self.assertEqual(DataMerger.merge_room.call_count, 2)
        DataMerger.merge_room = old_merge_room_method
Ejemplo n.º 9
0
    def test_floor_copy(self):
        floor = self.floor
        copy_floor = DataMerger._floor_copy(floor)

        # Il floor restituito deve essere una copia e avere stesso f_id
        self.assertFalse(floor is copy_floor)
        self.assertEqual(floor["f_id"], copy_floor["f_id"])

        # Le stanze devono essere copie e i valori dei campi non filtrati devono
        # corrispondere
        room1 = floor["rooms"]["R001"]
        copy_room1 = copy_floor["rooms"]["R001"]
        self.assertFalse(room1 is copy_room1)
        self.assertEqual(room1["polygon"], copy_room1["polygon"])
        self.assertEqual(room1["cat_id"], copy_room1["cat_id"])
        self.assertEqual(room1["room_name"], copy_room1["room_name"])
        self.assertEqual(room1["equipments"], copy_room1["equipments"])
        self.assertEqual(room1["accessibility"], copy_room1["accessibility"])
        self.assertEqual(room1["capacity"], copy_room1["capacity"])
        self.assertTrue("pippo" not in copy_room1)
        self.assertTrue("pluto" not in copy_room1)

        # Le stanze non matchate devono essere copie e contenere i campi non
        # filtrati con i valori corrispondenti
        unidentified1 = floor["unidentified_rooms"][0]
        unidentified_copy1 = copy_floor["unidentified_rooms"][0]
        self.assertFalse(unidentified1 is unidentified_copy1)
        self.assertEqual(unidentified1["polygon"],
                         unidentified_copy1["polygon"])
        self.assertEqual(unidentified1["cat_id"], unidentified_copy1["cat_id"])
        self.assertTrue("pippo" not in unidentified_copy1)
        self.assertTrue("pluto" not in unidentified_copy1)
Ejemplo n.º 10
0
    def _update_a_building(self, building, b_dict):
        """
      Main process of updating a building with the new data contained on b_dict.

      Arguments:
      - building: a Building object on which to perform the data update
      - b_dict: a dictionary containing the new building data

      Return value: None, updates are made in place on the building object.
      """
        namespaced_attr = building.attributes_for_source(self.get_namespace())
        namespaced_attr.update(b_dict)

        self._sanitize_building(building)

        edilizia = building.get('edilizia')
        easyroom = building.get('easyroom')
        dxf = building.get('dxf')

        floors = building.get_path("merged.floors")
        building['merged'] = DataMerger.merge_building(edilizia, easyroom, dxf)

        if floors:
            building['merged']['floors'] = floors

        building.save()
Ejemplo n.º 11
0
   def test_floor_copy(self):
      floor = self.floor
      copy_floor  = DataMerger._floor_copy(floor)

      # Il floor restituito deve essere una copia e avere stesso f_id
      self.assertFalse(floor is copy_floor)
      self.assertEqual(floor["f_id"], copy_floor["f_id"])

      # Le stanze devono essere copie e i valori dei campi non filtrati devono
      # corrispondere
      room1       = floor["rooms"]["R001"]
      copy_room1  = copy_floor["rooms"]["R001"]
      self.assertFalse(room1 is copy_room1)
      self.assertEqual(room1["polygon"], copy_room1["polygon"])
      self.assertEqual(room1["cat_id"], copy_room1["cat_id"])
      self.assertEqual(room1["room_name"], copy_room1["room_name"])
      self.assertEqual(room1["equipments"], copy_room1["equipments"])
      self.assertEqual(room1["accessibility"], copy_room1["accessibility"])
      self.assertEqual(room1["capacity"], copy_room1["capacity"])
      self.assertTrue("pippo" not in copy_room1)
      self.assertTrue("pluto" not in copy_room1)

      # Le stanze non matchate devono essere copie e contenere i campi non
      # filtrati con i valori corrispondenti
      unidentified1       = floor["unidentified_rooms"][0]
      unidentified_copy1  = copy_floor["unidentified_rooms"][0]
      self.assertFalse(unidentified1 is unidentified_copy1)
      self.assertEqual(unidentified1["polygon"], unidentified_copy1["polygon"])
      self.assertEqual(unidentified1["cat_id"], unidentified_copy1["cat_id"])
      self.assertTrue("pippo" not in unidentified_copy1)
      self.assertTrue("pluto" not in unidentified_copy1)
Ejemplo n.º 12
0
   def _update_a_building(self, building, b_dict):
      """
      Main process of updating a building with the new data contained on b_dict.

      Arguments:
      - building: a Building object on which to perform the data update
      - b_dict: a dictionary containing the new building data

      Return value: None, updates are made in place on the building object.
      """
      namespaced_attr = building.attributes_for_source(self.get_namespace())
      namespaced_attr.update(b_dict)

      self._sanitize_building(building)

      edilizia = building.get('edilizia')
      easyroom = building.get('easyroom')
      dxf      = building.get('dxf')

      floors   = building.get_path("merged.floors")
      building['merged'] = DataMerger.merge_building(edilizia, easyroom, dxf)

      if floors:
         building['merged']['floors'] = floors

      building.save()
Ejemplo n.º 13
0
    def test_match_and_merge_floors_calls_match_and_merge_a_floor(self):
        # call arguments
        base_floors = [self.floor, self.floor]
        unmatched_floors = [MagicMock(), MagicMock(), MagicMock()]

        # Mock the method to be called
        old_method = DataMerger._match_and_merge_a_floor
        method_mock = MagicMock(return_value=[])
        DataMerger._match_and_merge_a_floor = method_mock

        # Call the main method
        merged_floors = DataMerger._match_and_merge_floors(
            base_floors, unmatched_floors)

        # Ensure sub-method has been called
        self.assertEqual(method_mock.call_count, 3)
        self.assertEqual(method_mock.call_args_list[0][0][1],
                         unmatched_floors[0])
        self.assertEqual(method_mock.call_args_list[1][0][1],
                         unmatched_floors[1])
        self.assertEqual(method_mock.call_args_list[2][0][1],
                         unmatched_floors[2])

        # Teardown, resetting original tested method
        DataMerger._match_and_merge_a_floor = old_method
Ejemplo n.º 14
0
   def test_match_and_merge_floors_returns_copy(self):
      base_floors = [self.floor, self.floor]

      merged_floors = DataMerger._match_and_merge_floors(base_floors, [])

      self.assertFalse(merged_floors is base_floors)
      self.assertFalse(merged_floors[0] is base_floors[0])
      self.assertFalse(merged_floors[1] is base_floors[1])
Ejemplo n.º 15
0
    def test_match_and_merge_floors_returns_copy(self):
        base_floors = [self.floor, self.floor]

        merged_floors = DataMerger._match_and_merge_floors(base_floors, [])

        self.assertFalse(merged_floors is base_floors)
        self.assertFalse(merged_floors[0] is base_floors[0])
        self.assertFalse(merged_floors[1] is base_floors[1])
Ejemplo n.º 16
0
 def before_callback(b):
    DXFRoomIdsResolver.resolve_rooms_id(b, None, "edilizia")
    # Ensure floor merging is performed AFTER DXF Room_id resolution
    merged            = b.attributes_for_source("merged")
    merged["floors"]  = DataMerger.merge_floors(
       b.get("edilizia"),
       b.get("easyroom"),
       b.get("dxf")
    )
Ejemplo n.º 17
0
 def test_coordinates_are_valid(self):
     self.assertTrue(DataMerger.coordinates_are_valid({"lat": "45.1234", "lon": "10.132"}))
     self.assertFalse(DataMerger.coordinates_are_valid({"lat": "pippo", "lon": "10.132"}))
     self.assertFalse(DataMerger.coordinates_are_valid({"lat": "pippo", "lon": "10.132"}))
     self.assertFalse(DataMerger.coordinates_are_valid({"lat": "pippo", "lon": "pluto"}))
     self.assertFalse(DataMerger.coordinates_are_valid({"lat": "pippo"}))
     self.assertFalse(DataMerger.coordinates_are_valid({"lon": "pippo"}))
     self.assertFalse(DataMerger.coordinates_are_valid({"plut": "pippo"}))
Ejemplo n.º 18
0
 def test_coordinates_are_valid(self):
    self.assertTrue(  DataMerger.coordinates_are_valid( { "lat" :  "45.1234"  , "lon" : "10.132" } ) )
    self.assertFalse( DataMerger.coordinates_are_valid( { "lat" :  "pippo"  , "lon" : "10.132" } ) )
    self.assertFalse( DataMerger.coordinates_are_valid( { "lat" :  "pippo"  , "lon" : "10.132" } ) )
    self.assertFalse( DataMerger.coordinates_are_valid( { "lat" :  "pippo"  , "lon" : "pluto" } ) )
    self.assertFalse( DataMerger.coordinates_are_valid( { "lat" :  "pippo" } ) )
    self.assertFalse( DataMerger.coordinates_are_valid( { "lon" :  "pippo" } ) )
    self.assertFalse( DataMerger.coordinates_are_valid( { "plut" :  "pippo" } ) )
Ejemplo n.º 19
0
   def test_merge_coordinates(self):
      """ Merge without easyroom data """
      coordinates = DataMerger._merge_building_coordinates(edilizia=self.db_building["edilizia"])
      self.assertEqual(coordinates,{"lat" : 45.476098, "lng" : 9.227756})

      """ Merge with edilizia and easyroom data """
      coordinates = DataMerger._merge_building_coordinates(edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"])
      self.assertEqual(coordinates,{"lat" : 45.476098, "lng" : 9.227756})

      if not DataMerger.skip_geocoding:
         """ Merge without edilizia data """
         coordinates = DataMerger._merge_building_coordinates(easyroom=self.db_building["easyroom"])
         self.assertEqual(coordinates,{"lat" : 45.476739, "lng" : 9.227256})

         """ Merge with edilizia and easyroom data ( edilizia has no coordinates ) """
         self.db_building["edilizia"].pop("lon")
         self.db_building["edilizia"].pop("lat")
         coordinates = DataMerger._merge_building_coordinates(edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"])
         self.assertEqual(coordinates,{"lat" : 45.476739, "lng" : 9.227256})
Ejemplo n.º 20
0
    def test_merge_building(self):

        """ Merge without edilizia data """
        merged = DataMerger.merge_building(easyroom=self.db_building["easyroom"])

        if not DataMerger.skip_geocoding:
            self.assertEqual(merged["coordinates"], {"type": "Point", "coordinates": [9.227256, 45.476739]})

        self.assertTrue("l_b_id" not in merged)
        self.assertTrue("building_number" not in merged)
        self.assertEqual(merged["address"], self.db_building["easyroom"]["address"])
        self.assertEqual(merged["building_name"], self.db_building["easyroom"]["building_name"])

        """ Merge without easyroom data """
        merged = DataMerger.merge_building(edilizia=self.db_building["edilizia"])

        self.assertEqual(
            merged["coordinates"],
            {
                "type": "Point",
                "coordinates": [float(self.db_building["edilizia"]["lon"]), float(self.db_building["edilizia"]["lat"])],
            },
        )
        self.assertEqual(merged["l_b_id"], self.db_building["edilizia"]["l_b_id"])
        self.assertEqual(merged["address"], "Via Celoria, 2, Milano")
        self.assertEqual(merged["building_number"], "3")
        self.assertTrue("building_name" not in merged)

        """ Merge with easyroom and edilizia data """
        merged = DataMerger.merge_building(edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"])

        self.assertEqual(merged["l_b_id"], self.db_building["edilizia"]["l_b_id"])
        self.assertEqual(merged["address"], self.db_building["easyroom"]["address"])
        self.assertEqual(merged["building_number"], "3")
        self.assertEqual(merged["building_name"], self.db_building["easyroom"]["building_name"])
        self.assertEqual(
            merged["coordinates"],
            {
                "type": "Point",
                "coordinates": [float(self.db_building["edilizia"]["lon"]), float(self.db_building["edilizia"]["lat"])],
            },
        )
Ejemplo n.º 21
0
            def before_callback(b):
                DXFRoomIdsResolver.resolve_rooms_id(b,
                                                    new_floor,
                                                    source_name=None)

                DXFRoomCatsResolver.resolve_room_categories(b, new_floor)

                # Ensure floor merging is performed AFTER DXF Room_id resolution
                merged = b.attributes_for_source("merged")
                merged["floors"] = DataMerger.merge_floors(
                    b.get("edilizia"), b.get("easyroom"), b.get("dxf"))
Ejemplo n.º 22
0
   def test_merge_building(self):

      """ Merge without edilizia data """
      merged = DataMerger.merge_building(easyroom=self.db_building["easyroom"])

      if not DataMerger.skip_geocoding:
         self.assertEqual(merged["coordinates"],{ "type": "Point", "coordinates": [9.227256, 45.476739] })

      self.assertTrue("l_b_id" not in merged)
      self.assertTrue("building_number" not in merged)
      self.assertEqual(merged["address"],self.db_building["easyroom"]["address"])
      self.assertEqual(merged["building_name"],self.db_building["easyroom"]["building_name"])

      """ Merge without easyroom data """
      merged = DataMerger.merge_building(edilizia=self.db_building["edilizia"])

      self.assertEqual(merged["coordinates"],
         { "type": "Point", "coordinates": [
            float(self.db_building["edilizia"]["lon"]),
            float(self.db_building["edilizia"]["lat"])
            ]
         })
      self.assertEqual(merged["l_b_id"], self.db_building["edilizia"]["l_b_id"])
      self.assertEqual(merged["address"],"Via Celoria, 2, Milano")
      self.assertEqual(merged["building_number"], "3")
      self.assertTrue("building_name" not in merged)


      """ Merge with easyroom and edilizia data """
      merged = DataMerger.merge_building(edilizia=self.db_building["edilizia"],easyroom=self.db_building["easyroom"])

      self.assertEqual(merged["l_b_id"], self.db_building["edilizia"]["l_b_id"])
      self.assertEqual(merged["address"], self.db_building["easyroom"]["address"])
      self.assertEqual(merged["building_number"], "3")
      self.assertEqual(merged["building_name"], self.db_building["easyroom"]["building_name"])
      self.assertEqual(merged["coordinates"],
         { "type": "Point", "coordinates": [
            float(self.db_building["edilizia"]["lon"]),
            float(self.db_building["edilizia"]["lat"])
            ]
         })
Ejemplo n.º 23
0
    def test_merge_coordinates(self):
        """ Merge without easyroom data """
        coordinates = DataMerger._merge_building_coordinates(edilizia=self.db_building["edilizia"])
        self.assertEqual(coordinates, {"lat": 45.476098, "lng": 9.227756})

        """ Merge with edilizia and easyroom data """
        coordinates = DataMerger._merge_building_coordinates(
            edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"]
        )
        self.assertEqual(coordinates, {"lat": 45.476098, "lng": 9.227756})

        if not DataMerger.skip_geocoding:
            """ Merge without edilizia data """
            coordinates = DataMerger._merge_building_coordinates(easyroom=self.db_building["easyroom"])
            self.assertEqual(coordinates, {"lat": 45.476739, "lng": 9.227256})

            """ Merge with edilizia and easyroom data ( edilizia has no coordinates ) """
            self.db_building["edilizia"].pop("lon")
            self.db_building["edilizia"].pop("lat")
            coordinates = DataMerger._merge_building_coordinates(
                edilizia=self.db_building["edilizia"], easyroom=self.db_building["easyroom"]
            )
            self.assertEqual(coordinates, {"lat": 45.476739, "lng": 9.227256})
Ejemplo n.º 24
0
   def test_match_and_merge_a_floor(self):
      base_floors = [
         {
            "room_ids"  : set(["R001", "R002", "R003"])
         },
         {
            "room_ids"  : set(["1001", "1002", "1003"])
         },
         {
            "room_ids"  : set(["2001", "2002", "2003"])
         }
      ]
      unmatched_floor = {
         "room_ids" : set(["R001", "R002", "R003", "1003", "2001", "2002", "R401"])
      }

      old_merge_room_method              = DataMerger._merge_rooms_into_floor
      DataMerger._merge_rooms_into_floor = MagicMock()

      mapping = DataMerger._match_and_merge_a_floor(base_floors, unmatched_floor)

      # verifico la correttezza del mapping restituito
      self.assertEqual(mapping[0], (set(["R001", "R002", "R003"]), base_floors[0]) )
      self.assertEqual(mapping[1], (set(["2001", "2002"]),         base_floors[2]) )
      self.assertEqual(mapping[2], (set(["1003"]),                 base_floors[1]) )

      # Controllo che il set di unmatched floor contenga solo la stanza che non
      # viene matchata
      self.assertEqual(unmatched_floor["room_ids"], set(["R401"]))

      # Controllo che merge_rooms_into_floor sia chiamato tre volte e che
      # l'ultimo parametro passato sia sempre il set di r_id matchati
      self.assertEqual(DataMerger._merge_rooms_into_floor.call_count, 3)

      merge_rooms_args = DataMerger._merge_rooms_into_floor.call_args_list
      self.assertEqual(merge_rooms_args[0][0][2], set(["R001", "R002", "R003"]))
      self.assertEqual(merge_rooms_args[1][0][2], set(["1003"]))
      self.assertEqual(merge_rooms_args[2][0][2], set(["2001", "2002"]))

      DataMerger._merge_rooms_into_floor = old_merge_room_method
Ejemplo n.º 25
0
    def test_match_and_merge_a_floor(self):
        base_floors = [{
            "room_ids": set(["R001", "R002", "R003"])
        }, {
            "room_ids": set(["1001", "1002", "1003"])
        }, {
            "room_ids": set(["2001", "2002", "2003"])
        }]
        unmatched_floor = {
            "room_ids":
            set(["R001", "R002", "R003", "1003", "2001", "2002", "R401"])
        }

        old_merge_room_method = DataMerger._merge_rooms_into_floor
        DataMerger._merge_rooms_into_floor = MagicMock()

        mapping = DataMerger._match_and_merge_a_floor(base_floors,
                                                      unmatched_floor)

        # verifico la correttezza del mapping restituito
        self.assertEqual(mapping[0],
                         (set(["R001", "R002", "R003"]), base_floors[0]))
        self.assertEqual(mapping[1], (set(["2001", "2002"]), base_floors[2]))
        self.assertEqual(mapping[2], (set(["1003"]), base_floors[1]))

        # Controllo che il set di unmatched floor contenga solo la stanza che non
        # viene matchata
        self.assertEqual(unmatched_floor["room_ids"], set(["R401"]))

        # Controllo che merge_rooms_into_floor sia chiamato tre volte e che
        # l'ultimo parametro passato sia sempre il set di r_id matchati
        self.assertEqual(DataMerger._merge_rooms_into_floor.call_count, 3)

        merge_rooms_args = DataMerger._merge_rooms_into_floor.call_args_list
        self.assertEqual(merge_rooms_args[0][0][2],
                         set(["R001", "R002", "R003"]))
        self.assertEqual(merge_rooms_args[1][0][2], set(["1003"]))
        self.assertEqual(merge_rooms_args[2][0][2], set(["2001", "2002"]))

        DataMerger._merge_rooms_into_floor = old_merge_room_method
Ejemplo n.º 26
0
   def test_match_and_merge_floors_calls_match_and_merge_a_floor(self):
      # call arguments
      base_floors                = [self.floor, self.floor]
      unmatched_floors           = [MagicMock(), MagicMock(), MagicMock()]

      # Mock the method to be called
      old_method                 = DataMerger._match_and_merge_a_floor
      method_mock                = MagicMock(return_value=[])
      DataMerger._match_and_merge_a_floor = method_mock

      # Call the main method
      merged_floors = DataMerger._match_and_merge_floors(
         base_floors,
         unmatched_floors
      )

      # Ensure sub-method has been called
      self.assertEqual(method_mock.call_count, 3)
      self.assertEqual(method_mock.call_args_list[0][0][1], unmatched_floors[0])
      self.assertEqual(method_mock.call_args_list[1][0][1], unmatched_floors[1])
      self.assertEqual(method_mock.call_args_list[2][0][1], unmatched_floors[2])

      # Teardown, resetting original tested method
      DataMerger._match_and_merge_a_floor = old_method
Ejemplo n.º 27
0
   def update_rooms(self,rooms):
      """
      Perform an update of room data on Database.

      Arguments:
      - rooms: a list of dictionaries representing a room data.

      Does not return (None).

      Example of a room retrieved from an Edilizia csv file:
      {
         'room_name' : 'Aula Seminari',
         'cat_name' : 'Aula',
         'r_id'      : 'T065',
         'b_id'      : '11010',
         'capacity'  : '52',
         'l_floor'   : 'T'
      }

      The b_id field will be used to locate the associated building on the
      database. If it is found, it will be updated with the information,
      otherwise a new building will be created.

      Note that for each building that gets updated, it's floors will be emptied
      before adding the rooms information. Hence no partial updates are possible:
      everytime this method is called, it must receive the final list of rooms
      for each updated floor.
      """
      # salviamo una data di aggiornamento comune a tutti i palazzi
      self.batch_date = datetime.now()

      # ordiniamo le stanze per edificio e per piano in modo da velocizzare l'algoritmo
      rooms.sort(key = lambda s: (s["b_id"], s["l_floor"]))

      # raggruppiamo le stanze per building_id
      rooms = groupby(rooms, key = lambda s: s["b_id"])

      # Analizziamo un building alla volta
      for (b_id, rooms) in rooms:

         # Non procedo se il b_id non è valido
         if not Building.is_valid_bid(b_id):
            Logger.error(
               "Invalid building id: \"{}\".".format(b_id),
               "Rooms discarded:",
               ", ".join(r["r_id"] for r in rooms)
            )
            continue

         building = Building.find_or_create_by_id(b_id)

         # Lavoro principale di aggiornamento
         self.replace_building_rooms(building, rooms)

         # Non sarebbe questa gia' una politica di merge? Si tratta di usare
         # info di piu' sorgenti per risolvere qualcosa di DXF, ma usiamo più
         # sorgenti! È un tipo di merge, non un DXFDataUpdater. Mi sembra nel
         # posto sbagliato questo metodo. Mi sembra che le funzionalità di
         # merge sono compito del building model.
         DXFRoomIdsResolver.resolve_rooms_id(building, None, self.get_namespace())

         # Ensure floor merging is performed AFTER DXF Room_id resolution
         merged            = building.attributes_for_source("merged")
         merged["floors"]  = DataMerger.merge_floors(
            building.get("edilizia"),
            building.get("easyroom"),
            building.get("dxf")
         )

         building.save()
Ejemplo n.º 28
0
    def update_rooms(self, rooms):
        """
      Perform an update of room data on Database.

      Arguments:
      - rooms: a list of dictionaries representing a room data.

      Does not return (None).

      Example of a room retrieved from an Edilizia csv file:
      {
         'room_name' : 'Aula Seminari',
         'cat_name' : 'Aula',
         'r_id'      : 'T065',
         'b_id'      : '11010',
         'capacity'  : '52',
         'l_floor'   : 'T'
      }

      The b_id field will be used to locate the associated building on the
      database. If it is found, it will be updated with the information,
      otherwise a new building will be created.

      Note that for each building that gets updated, it's floors will be emptied
      before adding the rooms information. Hence no partial updates are possible:
      everytime this method is called, it must receive the final list of rooms
      for each updated floor.
      """
        # salviamo una data di aggiornamento comune a tutti i palazzi
        self.batch_date = datetime.now()

        # ordiniamo le stanze per edificio e per piano in modo da velocizzare l'algoritmo
        rooms.sort(key=lambda s: (s["b_id"], s["l_floor"]))

        # raggruppiamo le stanze per building_id
        rooms = groupby(rooms, key=lambda s: s["b_id"])

        # Analizziamo un building alla volta
        for (b_id, rooms) in rooms:

            # Non procedo se il b_id non è valido
            if not Building.is_valid_bid(b_id):
                Logger.error("Invalid building id: \"{}\".".format(b_id),
                             "Rooms discarded:",
                             ", ".join(r["r_id"] for r in rooms))
                continue

            building = Building.find_or_create_by_id(b_id)

            # Lavoro principale di aggiornamento
            self.replace_building_rooms(building, rooms)

            # Non sarebbe questa gia' una politica di merge? Si tratta di usare
            # info di piu' sorgenti per risolvere qualcosa di DXF, ma usiamo più
            # sorgenti! È un tipo di merge, non un DXFDataUpdater. Mi sembra nel
            # posto sbagliato questo metodo. Mi sembra che le funzionalità di
            # merge sono compito del building model.
            DXFRoomIdsResolver.resolve_rooms_id(building, None,
                                                self.get_namespace())

            # Ensure floor merging is performed AFTER DXF Room_id resolution
            merged = building.attributes_for_source("merged")
            merged["floors"] = DataMerger.merge_floors(
                building.get("edilizia"), building.get("easyroom"),
                building.get("dxf"))

            building.save()
Ejemplo n.º 29
0
    def test_merge_room(self):

        dxf_room = {
            "cat_id": "AUL02",
            "polygon": {
                "anchor_point": [],
                "points": []
            },
            "texts": []
        }

        edil_room = {
            "room_name": "Aula 01 ed",
            "capacity": "44",
            "cat_id": "AUL01",
            "l_floor": "T"
        }

        easy_room = {
            "room_name": "Aula 01 easy",
            "cat_id": "AUL03",
            "capacity": "45",
            "accessibility": True,
            "equipments": "PC/Lavagna/Wi-fi",
            "l_floor": "T"
        }

        # Test del merge di una stanza dxf e di un edilizia
        result = DataMerger.merge_room(dxf_room, {})

        self.assertEqual(result["room_name"], "")
        self.assertEqual(result["capacity"], "")
        self.assertEqual(result["cat_id"], dxf_room["cat_id"])
        self.assertEqual(result["accessibility"], "")
        self.assertEqual(result["equipments"], [])
        self.assertEqual(result["polygon"], dxf_room["polygon"])
        self.assertFalse("texts" in result)
        self.assertFalse("l_floor" in result)

        # Test del merge di una stanza dxf e di un edilizia
        result = DataMerger.merge_room(dxf_room, edil_room)

        self.assertEqual(result["room_name"], edil_room["room_name"])
        self.assertEqual(result["capacity"], edil_room["capacity"])
        self.assertEqual(result["cat_id"], "AUL01")
        self.assertEqual(result["accessibility"], "")
        self.assertEqual(result["equipments"], [])
        self.assertEqual(result["polygon"], dxf_room["polygon"])
        self.assertFalse("texts" in result)
        self.assertFalse("l_floor" in result)

        # Test del merge di una stanza dxf e di un easyroom
        result = DataMerger.merge_room(dxf_room, easy_room)

        self.assertEqual(result["room_name"], easy_room["room_name"])
        self.assertEqual(result["capacity"], easy_room["capacity"])
        self.assertEqual(result["cat_id"], "AUL03")
        self.assertEqual(result["accessibility"], easy_room["accessibility"])
        self.assertEqual(result["equipments"],
                         easy_room["equipments"].split("/"))
        self.assertEqual(result["polygon"], dxf_room["polygon"])
        self.assertFalse("texts" in result)
        self.assertFalse("l_floor" in result)

        # Test del merge di una stanza edilizia e di un easyroom
        result = DataMerger.merge_room(edil_room, easy_room)

        self.assertEqual(result["room_name"], edil_room["room_name"])
        self.assertEqual(result["capacity"], edil_room["capacity"])
        self.assertEqual(result["cat_id"], "AUL03")
        self.assertEqual(result["accessibility"], easy_room["accessibility"])
        self.assertEqual(result["equipments"],
                         easy_room["equipments"].split("/"))
        self.assertFalse("polygon" in result)
        self.assertFalse("texts" in result)
        self.assertFalse("l_floor" in result)
Ejemplo n.º 30
0
   def test_merge_room(self):

      dxf_room = {
         "cat_id"     : "AUL02",
         "polygon"      : {
            "anchor_point" : [],
            "points"       : []
         },
         "texts"        : []
      }

      edil_room = {
         "room_name"    : "Aula 01 ed",
         "capacity"     : "44",
         "cat_id"       : "AUL01",
         "l_floor"      :"T"
      }

      easy_room = {
         "room_name"    : "Aula 01 easy",
         "cat_id"       : "AUL03",
         "capacity"     : "45",
         "accessibility": True,
         "equipments"   : "PC/Lavagna/Wi-fi",
         "l_floor"      : "T"
      }

      # Test del merge di una stanza dxf e di un edilizia
      result = DataMerger.merge_room(dxf_room, {})

      self.assertEqual(result["room_name"], "")
      self.assertEqual(result["capacity"], "")
      self.assertEqual(result["cat_id"], dxf_room["cat_id"])
      self.assertEqual(result["accessibility"], "")
      self.assertEqual(result["equipments"], [])
      self.assertEqual(result["polygon"], dxf_room["polygon"])
      self.assertFalse("texts" in result)
      self.assertFalse("l_floor" in result)

      # Test del merge di una stanza dxf e di un edilizia
      result = DataMerger.merge_room(dxf_room, edil_room)

      self.assertEqual(result["room_name"], edil_room["room_name"])
      self.assertEqual(result["capacity"], edil_room["capacity"])
      self.assertEqual(result["cat_id"], "AUL01")
      self.assertEqual(result["accessibility"], "")
      self.assertEqual(result["equipments"], [])
      self.assertEqual(result["polygon"], dxf_room["polygon"])
      self.assertFalse("texts" in result)
      self.assertFalse("l_floor" in result)

      # Test del merge di una stanza dxf e di un easyroom
      result = DataMerger.merge_room(dxf_room, easy_room)

      self.assertEqual(result["room_name"], easy_room["room_name"])
      self.assertEqual(result["capacity"], easy_room["capacity"])
      self.assertEqual(result["cat_id"], "AUL03")
      self.assertEqual(result["accessibility"], easy_room["accessibility"])
      self.assertEqual(result["equipments"], easy_room["equipments"].split("/"))
      self.assertEqual(result["polygon"], dxf_room["polygon"])
      self.assertFalse("texts" in result)
      self.assertFalse("l_floor" in result)

      # Test del merge di una stanza edilizia e di un easyroom
      result = DataMerger.merge_room(edil_room, easy_room)

      self.assertEqual(result["room_name"], edil_room["room_name"])
      self.assertEqual(result["capacity"], edil_room["capacity"])
      self.assertEqual(result["cat_id"], "AUL03")
      self.assertEqual(result["accessibility"], easy_room["accessibility"])
      self.assertEqual(result["equipments"], easy_room["equipments"].split("/"))
      self.assertFalse("polygon" in result)
      self.assertFalse("texts" in result)
      self.assertFalse("l_floor" in result)