From cf946934a4d16fc227aa5ae908c73c57e7ba6dc6 Mon Sep 17 00:00:00 2001 From: heather Date: Thu, 26 May 2011 21:40:48 -0400 Subject: clean up and add conference rooms --- lib/d2/app/model/generate_svg_text.py | 8 +- lib/d2/bin/d2_svg_processor.py | 163 ++++++++++++++++++++-------------- 2 files changed, 100 insertions(+), 71 deletions(-) mode change 100644 => 100755 lib/d2/bin/d2_svg_processor.py diff --git a/lib/d2/app/model/generate_svg_text.py b/lib/d2/app/model/generate_svg_text.py index 0c917ab..c56784a 100644 --- a/lib/d2/app/model/generate_svg_text.py +++ b/lib/d2/app/model/generate_svg_text.py @@ -53,12 +53,14 @@ class Svg(object): FONT_COLOR = {u'Person': 'blue', u'Conference Room': 'green', u'Work Area': 'cyan', - u'Empty': 'red'} + u'Empty': 'red', + u'Restroom': 'coral'} - FONT_SIZE = {u'Person': '6', + FONT_SIZE = { u'Person': '6', u'Conference Room': '6', u'Work Area': '6', - u'Empty': '6'} + u'Empty': '6', + u'Restroom': '6'} def __init__(self): self.svgText = SvgText() diff --git a/lib/d2/bin/d2_svg_processor.py b/lib/d2/bin/d2_svg_processor.py old mode 100644 new mode 100755 index d3d7815..cd645e2 --- a/lib/d2/bin/d2_svg_processor.py +++ b/lib/d2/bin/d2_svg_processor.py @@ -79,12 +79,23 @@ NAME_CORRECTIONS = {u'Deb Smith': u'Deborah Smith', u'Sally Babcock': u'Sally Schriner', u'Brian Staneck': u'Brian Stanek'} +# data from Marc's spreadsheet and conference spreadsheet +# floor_plan_by_ntwk_id has the structure of +# {room_name: {ntwk_id} (name, net_jack1, net_jack2)} floor_plan_by_ntwk_id = {} +# data from Marc's spreadsheet and conference spreadsheet +# floor_plan_by_name has the structure of +# {room_name: {name}: ntwk_id} floor_plan_by_name = {} +# every plot has a ntwk_number associated with it +# ntwk_number_data has the structure of +# {room_name: {ntwk_id: {x: x, y:y, plot_id:plot_id}}} ntwk_number_data = {} +# manually_added_plot store the coords +# {room_name: {ntwk_id: (x, y)}} manually_added_plot = {} NTWK_ID_PATTERN = re.compile("([A-Z]+)(\d+)") @@ -199,7 +210,7 @@ class ParseFloorPlanConferenceRoomXLS(object): MULTIPLE_NTWK_ID_IN_ONE_ROOM_ERROR = "Data Error: floor plan xls has "\ "multiple records for ntwk_id {0} in room {1}" - MULTIPLE_NAME_IN_ONE_ROOM_ERROR = "Warning: floor plan xls has "\ + MULTIPLE_NAME_IN_ONE_ROOM_WARNING = "Warning: floor plan xls has "\ "multiple records for name {0} in room {1}" def __init__(self): @@ -241,7 +252,7 @@ class ParseFloorPlanConferenceRoomXLS(object): if name.lower() in floor_plan_by_name[room_name]: self._log_obj.error( - self.MULTIPLE_NAME_IN_ONE_ROOM_ERROR.format( + self.MULTIPLE_NAME_IN_ONE_ROOM_WARNING.format( name.lower(), room_name)) else: @@ -383,7 +394,7 @@ class PopulateTables(object): "network label in same room: {0}, {1}" NO_CLOSEBY_NTWK_ID_ERROR = "Data Error: cannot find closest_ntwk_id "\ "in room_name: {0}, x: {1} y: {2}, current name shown {3}" - NO_AREA_INFO_ERROR = "Data Error: cannot find area info for {0} {1}" + NO_AREA_INFO_WARNING = "Warning: cannot find area info for {0} {1}" NO_OCCUPANT_DETAIL = "Data Error: cannot find {0} in occupant_detail" @@ -479,10 +490,8 @@ class PopulateTables(object): plot_id) def _add_manually_added_plots(self): - #TODO: manually added plots need to be in svg as well for (room_name, info) in manually_added_plot.items(): for (ntwk_id, xy_info) in info.items(): - print ntwk_id, xy_info.abs_x, xy_info.abs_y plot_id = self._add_to_tables(xy_info.abs_x, xy_info.abs_y, ntwk_id) @@ -665,59 +674,78 @@ class PopulateTables(object): view_box_xmin, view_box_ymin, view_box_height) - if approx_room_name == '3D13A1': - room_name = self._determine_3D1_or_3A1(abs_x) - else: - room_name = approx_room_name - - if room_name: #ignore cubes in btw rooms - closest_ntwk_id = self._get_closest_ntwk_id( - room_name, - abs_x, - abs_y) - if el.attrib['id'] == "AREA_ID-6": - print "closest_ntwk_id: ", closest_ntwk_id, room_name - - if not closest_ntwk_id: - print "looking for XXX{0}XXX".format(current_name_shown.lower()) - # try to find ntwk_id using floor_plan_by_name - if current_name_shown.lower() in \ - floor_plan_by_name[room_name]: - closest_ntwk_id = floor_plan_by_name[ - room_name][ - current_name_shown.lower()] - print "USE floor_plan_by_name ", closest_ntwk_id - else: - # try to trim "conference room" for match - conf_room_name = current_name_shown.lower()\ - .replace(" conference room", "") - print "looking for XXX{0}XXX".format(conf_room_name) - if conf_room_name in \ - floor_plan_by_name[room_name]: - closest_ntwk_id = floor_plan_by_name[ - room_name][ + self._process_info_given_x_y(approx_room_name, + current_name_shown, + abs_x, + abs_y) + + def _process_info_given_x_y(self, approx_room_name, current_name_shown, + abs_x, abs_y): + if approx_room_name == '3D13A1': + room_name = self._determine_3D1_or_3A1(abs_x) + else: + room_name = approx_room_name + + if room_name: #ignore cubes in btw rooms + closest_ntwk_id = self._find_closest_ntwk_id(room_name, + abs_x, abs_y, current_name_shown) + if closest_ntwk_id: + self._find_area_info(room_name, + closest_ntwk_id, + current_name_shown, + abs_x, + abs_y) + else: + self._log_obj.error( + self.NO_CLOSEBY_NTWK_ID_ERROR.format(room_name, + abs_x, + abs_y, + current_name_shown)) + + + def _find_area_info(self, room_name, closest_ntwk_id, current_name_shown, + abs_x, abs_y): + plot_id = ntwk_number_data[room_name][closest_ntwk_id]['plot_id'] + self._add_label_coord(plot_id, abs_x, abs_y) + + # try to find it in the spreadsheet + info = self._get_area_info(room_name, closest_ntwk_id) + + if info: + self._add_ntwk_jacks(plot_id, info) + occupant_id = self._find_occupant_id(info.name) + if occupant_id: + self._add_to_forge(plot_id, occupant_id) + + else: + self._log_obj.error(self.NO_AREA_INFO_WARNING.format(room_name, + closest_ntwk_id)) + # no cube info found in spreadsheet, + # try occupant current_name_shown as occupant + occupant_id = self._find_occupant_id(current_name_shown) + if occupant_id: + self._add_to_forge(plot_id, occupant_id) + + + + def _find_closest_ntwk_id(self, room_name, abs_x, abs_y, current_name_shown): + # first brute force to try to find it + closest_ntwk_id = self._get_closest_ntwk_id(room_name, abs_x, abs_y) + + # try to find ntwk_id using floor_plan_by_name + if not closest_ntwk_id: + if current_name_shown.lower() in floor_plan_by_name[room_name]: + closest_ntwk_id = floor_plan_by_name[room_name + ][current_name_shown.lower()] + else: + # try to trim "conference room" for a match + conf_room_name = current_name_shown.lower()\ + .replace(" conference room", "") + if conf_room_name in floor_plan_by_name[room_name]: + closest_ntwk_id = floor_plan_by_name[room_name][ conf_room_name] - print "USE floor_plan_by_name ", closest_ntwk_id - if not closest_ntwk_id: - self._log_obj.error( - self.NO_CLOSEBY_NTWK_ID_ERROR.format( - room_name, - abs_x, - abs_y, - current_name_shown)) - else: - info = self._get_area_info(room_name, - closest_ntwk_id) - if info: - plot_id = ntwk_number_data[room_name]\ - [closest_ntwk_id]\ - ['plot_id'] - self._add_ntwk_jacks(plot_id, info) - self._add_label_coord(plot_id, abs_x, abs_y) - occupant_id = self._find_occupant_id(info) - if occupant_id: - self._add_to_forge(plot_id, occupant_id) + return closest_ntwk_id def _create_tables(self): for name in reversed(self.TABLES): @@ -823,10 +851,6 @@ class PopulateTables(object): if normalized_id_IDF in floor_plan_by_ntwk_id[room_name]: info = floor_plan_by_ntwk_id[room_name][ normalized_id_IDF] - else: - self._log_obj.error(self.NO_AREA_INFO_ERROR.format( - room_name, - ntwk_id)) return info def _get_first_last_name(self, s): @@ -840,15 +864,15 @@ class PopulateTables(object): last_name = s[first_space_idx+1:] return (first_name.lower().strip(), last_name.lower().strip()) - def _find_occupant_id(self, info): + def _find_occupant_id(self, name): occupant_id = None - if info.name == "Open": + if name == "Open": empty = self._db.session.query(Occupant).filter( "occupant_type_id=:occupant_type_id").params( occupant_type_id=self._static.occupant_type.empty).first() occupant_id = empty.id else: - (first_name, last_name) = self._get_first_last_name(info.name) + (first_name, last_name) = self._get_first_last_name(name) records = self._detail_adapter.fetch_detail_by_type_data( self._static.detail_type.last_name, last_name) @@ -865,12 +889,12 @@ class PopulateTables(object): # last resort try to do a search if not occupant_id: - detail = self._search_adapter.search(info.name) - if len(detail) == 1: - occupant_id = detail[0].occupant_id + records = self._search_adapter.search(unicode(name)) + if records: + occupant_id = records[0].occupant_id if not occupant_id: - self._log_obj.error(self.NO_OCCUPANT_DETAIL.format(info.name)) + self._log_obj.error(self.NO_OCCUPANT_DETAIL.format(name)) return occupant_id @@ -911,6 +935,8 @@ class PopulateTables(object): output_ntwk_id_fileobj: output_ntwk_id_fileobj.write(self._get_ntwk_id_svg()) + #TODO: eventually we need to generate ntwk_id_svg dynamically + #self._get_ntwk_id_svg() self._get_name_label_svg() class Util(object): @@ -948,8 +974,9 @@ class Util(object): class Process(object): def __init__(self): + # structure svg finalized, no longer need to create structure SVG + # CreateStructureSVG(), self._chain = [ - CreateStructureSVG(), ParseFloorPlanConferenceRoomXLS(), PopulateTables(), ] -- cgit v1.2.3