def get_display(my): my.sobject = my.get_sobject() top = DivWdg() top.add_class("spt_detail_top") top.add_color("background", "background") top.add_color("color", "color") if not my.sobject: top.add("No SObject defined for this widget") return top if my.parent: my.search_type = my.parent.get_base_search_type() my.search_key = SearchKey.get_by_sobject(my.parent) top.add_attr("spt_parent_key", my.search_key) my.pipeline_code = my.parent.get_value("pipeline_code", no_exception=True) my.full_search_type = my.parent.get_search_type() else: my.pipeline_code = my.sobject.get_value("pipeline_code", no_exception=True) my.search_type = my.sobject.get_base_search_type() my.search_key = SearchKey.get_by_sobject(my.sobject) my.full_search_type = my.sobject.get_search_type() if not my.pipeline_code: my.pipeline_code = 'default' top.add_style("text-align: left") my.set_as_panel(top) table = Table() #from tactic.ui.container import ResizableTableWdg #table = ResizableTableWdg() table.add_color("background", "background") table.add_color("color", "color") top.add(table) table.set_max_width() table.add_row() # left #td = table.add_cell(resize=False) td = table.add_cell() #td.add_style("padding: 10px") td.add_style("width: 200px") td.add_style("min-width: 200px") td.add_style("vertical-align: top") #td.add_border() #td.add_style("border-style: solid") #td.add_style("border-width: 1px 0 1px 1px") #td.add_color("border-color", "border") #td.add_color("background", "background", -10) if my.parent: code = my.parent.get_code() else: code = my.sobject.get_code() # add the tile title = DivWdg() td.add(title) title.add_gradient("background", "background3", 0, -10) title.add_style("height: 20px") title.add_style("padding: 4px") title.add_style("font-weight: bold") title.add_style("font-size: 1.4em") title.add("%s" % code) title.add_border() div = DivWdg() td.add(div) div.add_class("spt_sobject_detail_top") thumb_table = Table() div.add(thumb_table) thumb_table.add_row() thumb = ThumbWdg() # use a larger version for clearer display thumb.set_icon_type('web') # prefer to see the original image, then web thumb.set_option('image_link_order', 'main|web|.swf') thumb.set_option("detail", "false") thumb.set_option("icon_size", "100%") td = thumb_table.add_cell(thumb) td.add_style("vertical-align: top") td.add_style("width: 200px") td.add_style("padding: 20px") if my.parent: thumb.set_sobject(my.parent) else: thumb.set_sobject(my.sobject) sobject_info_wdg = my.get_sobject_info_wdg() sobject_info_wdg.add_style("width: 200px") td.add(sobject_info_wdg) if my.search_type == 'sthpw/task' and not my.parent: pass else: sobject_info_wdg = my.get_sobject_detail_wdg() td = table.add_cell() td.add(sobject_info_wdg) td.add_style("vertical-align: top") #td.add_color("background", "background", -10) td.add_style("overflow: hidden") #td.add_style("border-style: solid") #td.add_style("border-width: 1px 1px 1px 0px") #td.add_color("border-color", "border") # right td = table.add_cell() td.add_style("text-align: left") td.add_style("vertical-align: top") #td.add_color("background", "background", -10) td.add_class("spt_notes_wrapper") #td.add_border() # add the title title = DivWdg() td.add(title) title.add_gradient("background", "background3", 0, -10) title.add_style("height: 20px") title.add_style("padding: 4px") title.add_style("font-weight: bold") title.add("Notes") title.add_border() notes_div = DivWdg() td.add(notes_div) from tactic.ui.widget.discussion_wdg import DiscussionWdg discussion_wdg = DiscussionWdg(search_key=my.search_key, context_hidden=False, show_note_expand=False) notes_div.add(discussion_wdg) notes_div.add_style("min-width: 300px") notes_div.add_style("height: 200") notes_div.add_style("overflow-y: auto") notes_div.add_class("spt_resizable") # get the process if my.parent: process = my.sobject.get_value("process") else: process = '' # content tr = table.add_row() td = table.add_cell() td.add_attr("colspan", "5") #td.add_attr("colspan", "3") # create a state for tab. The tab only passes a search key # parent key search_key = SearchKey.get_by_sobject(my.sobject) parent = my.sobject.get_parent() if parent: parent_key = parent.get_search_key() else: parent_key = "" state = { 'search_key': search_key, 'parent_key': parent_key, 'process': process, } WebState.get().push(state) config_xml = my.get_config_xml() config = WidgetConfig.get(view="tab", xml=config_xml) if process: custom_view = "tab_config_%s" % process else: custom_view = "tab_config" search = Search("config/widget_config") search.add_filter("category", "TabWdg") search.add_filter("search_type", my.search_type) search.add_filter("view", custom_view) custom_config_sobj = search.get_sobject() if custom_config_sobj: custom_config_xml = custom_config_sobj.get_value("config") custom_config = WidgetConfig.get(view=custom_view, xml=custom_config_xml) config = WidgetConfigView(search_type='TabWdg', view=custom_view, configs=[custom_config, config]) #menu = my.get_extra_menu() #tab = TabWdg(config=config, state=state, extra_menu=menu) tab = TabWdg(config=config, state=state, show_add=False, show_remove=False, tab_offset=5 ) tab.add_style("margin: 0px -2px -2px -2px") td.add(tab) td.add_style("padding-top: 10px") return top
def get_group_wdg(self, prev_sobj): if not self.is_preprocessed: self.preprocess() sobject = self.get_current_sobject() ref_sobj = self.get_ref_obj(sobject) self.current_ref_sobj = ref_sobj if not ref_sobj: return "Undetermined parent: [%s]" % SearchKey.get_by_sobject(sobject) widget = DivWdg() # add add button #from tactic.ui.widget import TextBtnWdg, TextBtnSetWdg #buttons_list = [] #buttons_list.append( { # 'label': '+', 'tip': 'Add Another Item', # 'bvr': { 'cbjs_action': "spt.dg_table.add_item_cbk(evt, bvr)" } #} ) #add_btn = TextBtnSetWdg( float="right", buttons=buttons_list, # spacing=6, size='small', side_padding=0 ) #widget.add(add_btn) from tactic.ui.widget import ActionButtonWdg button = ActionButtonWdg(title='+', tip='Add Another Item', size='small') widget.add(button) button.add_style("float: right") button.add_behavior( { 'type': 'click_up', 'cbjs_action': "spt.dg_table.add_item_cbk(evt, bvr)" } ) label = "Attach" label_option = self.get_option("label") if label_option: label = label_option table = Table() table.add_color("color", "color") table.add_row() search_key = sobject.get_search_key() # add a thumbe widget thumb = ThumbWdg() thumb.set_icon_size(40) thumb.set_sobject(ref_sobj) thumb.set_option('latest_icon', 'true') table.add_cell(thumb) # add the text description name_span = DivWdg(ref_sobj.get_code()) name_span.add_style('margin-left: 20px') table.add_cell(name_span) if ref_sobj.has_value("name"): name_span.add( " - " ) name_span.add( ref_sobj.get_value("name") ) #status = ref_sobj.get_value("status", no_exception=True) #if status: # span = SpanWdg("(status:%s)" % ref_sobj.get_value("status")) # table.add_cell(span) if ref_sobj.has_value("description"): description_wdg = ExpandableTextWdg("description") description_wdg.set_max_length(200) description_wdg.set_sobject(ref_sobj) td = table.add_cell( description_wdg ) td.add_style("padding-left: 15px") # FIXME: not sure about the layout here #if ref_sobj.has_value("pipeline_code"): # pipeline_code = ref_sobj.get_value("pipeline_code") # span = SpanWdg("(pipeline:%s)" % pipeline_code ) # td = table.add_cell(span) # td.add_style("padding-left: 15px") widget.add(table) return widget
def get_display(my): my.sobject = my.get_sobject() top = DivWdg() top.add_class("spt_detail_top") top.add_color("background", "background") top.add_color("color", "color") if not my.sobject: top.add("No SObject defined for this widget") return top if my.parent: my.search_type = my.parent.get_base_search_type() my.search_key = SearchKey.get_by_sobject(my.parent) top.add_attr("spt_parent_key", my.search_key) my.pipeline_code = my.parent.get_value("pipeline_code", no_exception=True) my.full_search_type = my.parent.get_search_type() else: my.pipeline_code = my.sobject.get_value("pipeline_code", no_exception=True) my.search_type = my.sobject.get_base_search_type() my.search_key = SearchKey.get_by_sobject(my.sobject) my.full_search_type = my.sobject.get_search_type() if not my.pipeline_code: my.pipeline_code = 'default' top.add_style("text-align: left") my.set_as_panel(top) table = Table() #from tactic.ui.container import ResizableTableWdg #table = ResizableTableWdg() table.add_color("background", "background") table.add_color("color", "color") top.add(table) table.set_max_width() table.add_row() # left #td = table.add_cell(resize=False) td = table.add_cell() #td.add_style("padding: 10px") td.add_style("width: 200px") td.add_style("min-width: 200px") td.add_style("vertical-align: top") #td.add_border() #td.add_style("border-style: solid") #td.add_style("border-width: 1px 0 1px 1px") #td.add_color("border-color", "border") #td.add_color("background", "background", -10) if my.parent: code = my.parent.get_code() else: code = my.sobject.get_code() # add the tile title = DivWdg() td.add(title) title.add_gradient("background", "background3", 0, -10) title.add_style("height: 20px") title.add_style("padding: 4px") title.add_style("font-weight: bold") title.add_style("font-size: 1.4em") title.add("%s" % code) title.add_border() div = DivWdg() td.add(div) div.add_class("spt_sobject_detail_top") thumb_table = Table() div.add(thumb_table) thumb_table.add_row() thumb = ThumbWdg() # use a larger version for clearer display thumb.set_icon_type('web') # prefer to see the original image, then web thumb.set_option('image_link_order', 'main|web|icon') thumb.set_option("detail", "false") thumb.set_option("icon_size", "100%") td = thumb_table.add_cell(thumb) td.add_style("vertical-align: top") td.add_style("width: 240px") td.add_style("padding: 15px") if my.parent: thumb.set_sobject(my.parent) else: thumb.set_sobject(my.sobject) sobject_info_wdg = my.get_sobject_info_wdg() sobject_info_wdg.add_style("width: 200px") td.add(sobject_info_wdg) if my.search_type == 'sthpw/task' and not my.parent: pass else: sobject_info_wdg = my.get_sobject_detail_wdg() td = table.add_cell() td.add(sobject_info_wdg) td.add_style("vertical-align: top") td.add_style("overflow: hidden") # right td = table.add_cell() td.add_style("text-align: left") td.add_style("vertical-align: top") #td.add_color("background", "background", -10) td.add_class("spt_notes_wrapper") #td.add_border() # add the title title = DivWdg() td.add(title) title.add_gradient("background", "background3", 0, -10) title.add_style("height: 20px") title.add_style("padding: 4px") title.add_style("font-weight: bold") title.add("Notes") title.add_border() notes_div = DivWdg() td.add(notes_div) from tactic.ui.widget.discussion_wdg import DiscussionWdg discussion_wdg = DiscussionWdg(search_key=my.search_key, context_hidden=False, show_note_expand=False) notes_div.add(discussion_wdg) notes_div.add_style("min-width: 300px") notes_div.add_style("height: 200") notes_div.add_style("overflow-y: auto") notes_div.add_class("spt_resizable") # get the process if my.parent: process = my.sobject.get_value("process") else: process = '' # content tr = table.add_row() td = table.add_cell() td.add_attr("colspan", "5") #td.add_attr("colspan", "3") # create a state for tab. The tab only passes a search key # parent key search_key = SearchKey.get_by_sobject(my.sobject) parent = my.sobject.get_parent() if parent: parent_key = parent.get_search_key() else: parent_key = "" state = { 'search_key': search_key, 'parent_key': parent_key, 'process': process, } WebState.get().push(state) config_xml = my.get_config_xml() config = WidgetConfig.get(view="tab", xml=config_xml) if process: custom_view = "tab_config_%s" % process else: custom_view = "tab_config" search = Search("config/widget_config") search.add_filter("category", "TabWdg") search.add_filter("search_type", my.search_type) search.add_filter("view", custom_view) custom_config_sobj = search.get_sobject() if custom_config_sobj: custom_config_xml = custom_config_sobj.get_value("config") custom_config = WidgetConfig.get(view=custom_view, xml=custom_config_xml) config = WidgetConfigView(search_type='TabWdg', view=custom_view, configs=[custom_config, config]) #menu = my.get_extra_menu() #tab = TabWdg(config=config, state=state, extra_menu=menu) tab = TabWdg(config=config, state=state, show_add=False, show_remove=False, tab_offset=5) tab.add_style("margin: 0px -2px -2px -2px") td.add(tab) td.add_style("padding-top: 10px") return top
def get_display(self): self.search_key = self.kwargs.get("search_key") self.context = self.kwargs.get("context") assert self.search_key assert self.context top = DivWdg() self.set_as_panel(top) top.add_class("spt_review_top") table = Table() top.add(table) table.add_row() left = table.add_cell() left.add_style("vertical-align: top") button = IconButtonWdg("Visual Notes", IconWdg.EDIT) button.add_behavior( { 'type': 'click_up', 'kwargs': { 'search_key': self.search_key, 'context': self.context, }, 'cbjs_action': ''' var top = bvr.src_el.getParent(".spt_review_top"); var content = top.getElement(".spt_review_content"); spt.panel.load(content, "tactic.ui.widget.visual_notes_wdg.VisualNotesWdg", bvr.kwargs); ''' } ) left.add(button) # add a refresh button and a gear menu button = IconButtonWdg("Refresh", IconWdg.REFRESH) button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var panel = bvr.src_el.getParent(".spt_review_top"); spt.panel.refresh(panel); ''' } ) left.add(button) right = table.add_cell() right.add_style("vertical-align: top") right.add("Image Area") content_div = DivWdg() content_div.add_class("spt_review_content") content_div.add_style("padding: 5px") content_div.add_style("margin: 5px") content_div.add_style("border: solid 1px #999") content_div.add_style("min-width: 500px") content_div.add_style("min-height: 400px") content_div.add_style("height: 100%") right.add(content_div) sobject = Search.get_by_search_key(self.search_key) note_context = "%s|note" % self.context snapshots = Search.eval("@SOBJECT(sthpw/snapshot['context','=','%s'])" % note_context, [sobject]) vnotes_div = DivWdg() vnotes_div.add_style("overflow: auto") vnotes_div.add_style("width: 200px") vnotes_div.add_style("min-height: 400px") vnotes_div.add_style("max-height: 600px") vnotes_div.add_style("border: solid 1px #999") vnotes_div.add_style("padding: 5px") vnotes_div.add_style("margin: 5px") left.add(vnotes_div) if not snapshots: vnotes_div.add("<b>No review notes available</b>") notes_wdg = VisualNotesWdg(search_key=self.search_key,context=self.context) content_div.add(notes_wdg) for snapshot in snapshots: vnote_div = DivWdg() vnotes_div.add(vnote_div) file_obj = snapshot.get_file_by_type('main') if not file_obj: vnote_div.add("None found") continue rel_path = file_obj.get_value("relative_dir") file_name = file_obj.get_value("file_name") image_url = "/assets/%s/%s" % (rel_path, file_name) login = snapshot.get_value("login") date = snapshot.get_value("timestamp") import dateutil date_str = dateutil.parser.parse(date).strftime("%b %m %Y - %H:%M") login_div = DivWdg() login_div.add_style("padding: 2px") login_div.add("User: "******"<b>%s</b><br/>" % login ) login_div.add("Date: ") login_div.add( "<b>%s</b><br/>" % date_str ) vnote_div.add(login_div) from pyasm.widget import ThumbWdg thumb_div = DivWdg() thumb_div.add_style("margin-left: 10px") thumb = ThumbWdg() thumb_div.add(thumb) thumb.set_has_img_link(False) thumb.set_option("detail", "false") thumb.set_option("icon_size", "80") thumb.set_sobject(snapshot) vnote_div.add(thumb_div) #file_obj = snapshot.get_file_by_type('icon') #rel_path = file_obj.get_value("relative_dir") #file_name = file_obj.get_value("file_name") #icon_url = "/assets/%s/%s" % (rel_path, file_name) #vnote_div.add("<img src='%s'/>" % icon_url ) #vnote_div.add(snapshot.get_code() ) vnote_div.add_attr("spt_image_url", image_url ) vnote_div.add_class('hand') vnote_div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var value = bvr.src_el.innerHTML; var image_url = bvr.src_el.getAttribute("spt_image_url"); var top = bvr.src_el.getParent(".spt_review_top"); var content = top.getElement(".spt_review_content"); content.innerHTML = "<img src='"+image_url+"'/>"; ''' } ) # get the related note to this vnote #notes = vnotes_div.get_related_notes() search = Search("sthpw/note") search.add_parent_filter(sobject) notes = search.get_sobjects() #for note in notes: # vnote_div.add(note.get_value("note")) from pyasm.biz import SObjectConnection connections, related_notes = SObjectConnection.get_connected_sobjects(snapshot, direction='src') for related_note in related_notes: vnote_div.add(related_note.get_value("note") ) print "related_notes: ", related_notes vnote_div.add("<hr/>") return top
def get_group_wdg(self, prev_sobj): if not self.is_preprocessed: self.preprocess() sobject = self.get_current_sobject() ref_sobj = self.get_ref_obj(sobject) self.current_ref_sobj = ref_sobj if not ref_sobj: return "Undetermined parent: [%s]" % SearchKey.get_by_sobject( sobject) widget = DivWdg() # add add button #from tactic.ui.widget import TextBtnWdg, TextBtnSetWdg #buttons_list = [] #buttons_list.append( { # 'label': '+', 'tip': 'Add Another Item', # 'bvr': { 'cbjs_action': "spt.dg_table.add_item_cbk(evt, bvr)" } #} ) #add_btn = TextBtnSetWdg( float="right", buttons=buttons_list, # spacing=6, size='small', side_padding=0 ) #widget.add(add_btn) from tactic.ui.widget import ActionButtonWdg button = ActionButtonWdg(title='+', tip='Add Another Item', size='small') widget.add(button) button.add_style("float: right") button.add_behavior({ 'type': 'click_up', 'cbjs_action': "spt.dg_table.add_item_cbk(evt, bvr)" }) label = "Attach" label_option = self.get_option("label") if label_option: label = label_option table = Table() table.add_color("color", "color") table.add_row() search_key = sobject.get_search_key() # add a thumbe widget thumb = ThumbWdg() thumb.set_icon_size(40) thumb.set_sobject(ref_sobj) thumb.set_option('latest_icon', 'true') table.add_cell(thumb) # add the text description name_span = DivWdg(ref_sobj.get_code()) name_span.add_style('margin-left: 20px') table.add_cell(name_span) if ref_sobj.has_value("name"): name_span.add(" - ") name_span.add(ref_sobj.get_value("name")) #status = ref_sobj.get_value("status", no_exception=True) #if status: # span = SpanWdg("(status:%s)" % ref_sobj.get_value("status")) # table.add_cell(span) if ref_sobj.has_value("description"): description_wdg = ExpandableTextWdg("description") description_wdg.set_max_length(200) description_wdg.set_sobject(ref_sobj) td = table.add_cell(description_wdg) td.add_style("padding-left: 15px") # FIXME: not sure about the layout here #if ref_sobj.has_value("pipeline_code"): # pipeline_code = ref_sobj.get_value("pipeline_code") # span = SpanWdg("(pipeline:%s)" % pipeline_code ) # td = table.add_cell(span) # td.add_style("padding-left: 15px") widget.add(table) return widget
def get_display(my): div = DivWdg() sobject = my.get_sobject_from_kwargs() if not sobject: div.add("SObject not found") return div search_type_obj = sobject.get_search_type_obj() title = search_type_obj.get_title() title_wdg = DivWdg() title_wdg.add_style("font-size: 1.8em") title_wdg.add("%s: %s" % (title, sobject.get_code() ) ) div.add(title_wdg) div.add(HtmlElement.hr()) table = Table() table.set_max_width() col1 = table.add_col() col1.add_style('width: 200px') col2 = table.add_col() col2.add_style('width: 320px') col3 = table.add_col() col3.add_style('width: 400px') table.add_row() from pyasm.widget import ThumbWdg, DiscussionWdg, SObjectTaskTableElement td = table.add_cell() td.add_style("vertical-align: top") td.add_style("border-right: solid 1px") title = DivWdg() title.add_class("maq_search_bar") #x = DivWdg("[?] [x]") #x.add_style("float: right") #title.add(x) title.add("Info") td.add(title) thumb = ThumbWdg() thumb.set_sobject(sobject) thumb.set_option("detail", "false") td.add(thumb) from pyasm.prod.web import AssetInfoWdg info = AssetInfoWdg() info.thumb = thumb info.set_sobject(sobject) td.add(info) # tasks td = table.add_cell() td.add_style("vertical-align: top") td.add_style("padding-left: 5px") td.add_style("border-right: solid 1px") title = DivWdg() title.add_class("maq_search_bar") #x = DivWdg("[x]") #x.add_style("float: right") #title.add(x) title.add("Tasks") td.add(title) task_wdg = SObjectTaskTableElement() task_wdg.set_sobject(sobject) td.add(task_wdg) td.add_style('cell-padding','10') # discussion td = table.add_cell() #td.add_style("min-width: 300px") #td.add_style("width: 600px") td.add_style("vertical-align: top") td.add_style("padding-left: 5px") td.add_style("border-right: solid 1px") title = DivWdg() title.add_class("maq_search_bar") #x = DivWdg("[x]") #x.add_style("float: right") #title.add(x) title.add("Notes") td.add(title) discussion_wdg = DiscussionWdg() discussion_wdg.preprocess() discussion_wdg.set_sobject(sobject) td.add(discussion_wdg) note_panel = discussion_wdg.get_note_menu() td.add(note_panel) div.add(table) div.add(HtmlElement.hr()) div.add(HtmlElement.br(clear="all")) title_wdg = DivWdg() title_wdg.add_class("maq_search_bar") #x = DivWdg("[x]") #x.add_style("float: right") #title_wdg.add(x) #title_wdg.add_style("font-size: 1.5em") title_wdg.add("Detail" ) div.add(title_wdg) div.add(HtmlElement.br()) # TEST getting schema search_type = sobject.get_base_search_type() schema = Schema.get_by_sobject(sobject) child_types = schema.get_child_types(search_type) # add a second table table = Table() table.set_max_width() # show the snapshots for this sobject search_type = "sthpw/snapshot" search = Search(search_type) search.add_sobject_filter(sobject) search.set_limit(25) sobjects = search.get_sobjects() table.add_row() nav_td = table.add_cell() nav_td.add_style("width: 100px") nav_td.add_style("vertical-align: top") section_wdg = my.get_section_wdg(sobject) nav_td.add( section_wdg ) parent_key = SearchKey.get_by_sobject(sobject) content_wdg = ViewPanelWdg(search_type=search_type, element_name='Snapshots', \ title='Snapshots', view='table', parent_key=parent_key, do_search=True) #content_wdg.set_sobjects(sobjects) content_td = table.add_cell() content_td.set_id("sobject_relation") content_td.add_style("display: table-cell") content_td.add_style("vertical-align: top") content_td.add_style("padding-left: 10px") content_td.add(content_wdg) div.add(table) return div
def get_display(my): my.search_key = my.kwargs.get("search_key") my.context = my.kwargs.get("context") assert my.search_key assert my.context top = DivWdg() my.set_as_panel(top) top.add_class("spt_review_top") table = Table() top.add(table) table.add_row() left = table.add_cell() left.add_style("vertical-align: top") button = IconButtonWdg("Visual Notes", IconWdg.EDIT) button.add_behavior( { "type": "click_up", "kwargs": {"search_key": my.search_key, "context": my.context}, "cbjs_action": """ var top = bvr.src_el.getParent(".spt_review_top"); var content = top.getElement(".spt_review_content"); spt.panel.load(content, "tactic.ui.widget.visual_notes_wdg.VisualNotesWdg", bvr.kwargs); """, } ) left.add(button) # add a refresh button and a gear menu button = IconButtonWdg("Refresh", IconWdg.REFRESH) button.add_behavior( { "type": "click_up", "cbjs_action": """ var panel = bvr.src_el.getParent(".spt_review_top"); spt.panel.refresh(panel); """, } ) left.add(button) right = table.add_cell() right.add_style("vertical-align: top") right.add("Image Area") content_div = DivWdg() content_div.add_class("spt_review_content") content_div.add_style("padding: 5px") content_div.add_style("margin: 5px") content_div.add_style("border: solid 1px #999") content_div.add_style("min-width: 500px") content_div.add_style("min-height: 400px") content_div.add_style("height: 100%") right.add(content_div) sobject = Search.get_by_search_key(my.search_key) note_context = "%s|note" % my.context snapshots = Search.eval("@SOBJECT(sthpw/snapshot['context','=','%s'])" % note_context, [sobject]) vnotes_div = DivWdg() vnotes_div.add_style("overflow: auto") vnotes_div.add_style("width: 200px") vnotes_div.add_style("min-height: 400px") vnotes_div.add_style("max-height: 600px") vnotes_div.add_style("border: solid 1px #999") vnotes_div.add_style("padding: 5px") vnotes_div.add_style("margin: 5px") left.add(vnotes_div) if not snapshots: vnotes_div.add("<b>No review notes available</b>") notes_wdg = VisualNotesWdg(search_key=my.search_key, context=my.context) content_div.add(notes_wdg) for snapshot in snapshots: vnote_div = DivWdg() vnotes_div.add(vnote_div) file_obj = snapshot.get_file_by_type("main") if not file_obj: vnote_div.add("None found") continue rel_path = file_obj.get_value("relative_dir") file_name = file_obj.get_value("file_name") image_url = "/assets/%s/%s" % (rel_path, file_name) login = snapshot.get_value("login") date = snapshot.get_value("timestamp") import dateutil date_str = dateutil.parser.parse(date).strftime("%b %m %Y - %H:%M") login_div = DivWdg() login_div.add_style("padding: 2px") login_div.add("User: "******"<b>%s</b><br/>" % login) login_div.add("Date: ") login_div.add("<b>%s</b><br/>" % date_str) vnote_div.add(login_div) from pyasm.widget import ThumbWdg thumb_div = DivWdg() thumb_div.add_style("margin-left: 10px") thumb = ThumbWdg() thumb_div.add(thumb) thumb.set_has_img_link(False) thumb.set_option("detail", "false") thumb.set_option("icon_size", "80") thumb.set_sobject(snapshot) vnote_div.add(thumb_div) # file_obj = snapshot.get_file_by_type('icon') # rel_path = file_obj.get_value("relative_dir") # file_name = file_obj.get_value("file_name") # icon_url = "/assets/%s/%s" % (rel_path, file_name) # vnote_div.add("<img src='%s'/>" % icon_url ) # vnote_div.add(snapshot.get_code() ) vnote_div.add_attr("spt_image_url", image_url) vnote_div.add_class("hand") vnote_div.add_behavior( { "type": "click_up", "cbjs_action": """ var value = bvr.src_el.innerHTML; var image_url = bvr.src_el.getAttribute("spt_image_url"); var top = bvr.src_el.getParent(".spt_review_top"); var content = top.getElement(".spt_review_content"); content.innerHTML = "<img src='"+image_url+"'/>"; """, } ) # get the related note to this vnote # notes = vnotes_div.get_related_notes() search = Search("sthpw/note") search.add_parent_filter(sobject) notes = search.get_sobjects() # for note in notes: # vnote_div.add(note.get_value("note")) from pyasm.biz import SObjectConnection connections, related_notes = SObjectConnection.get_connected_sobjects(snapshot, direction="src") for related_note in related_notes: vnote_div.add(related_note.get_value("note")) print "related_notes: ", related_notes vnote_div.add("<hr/>") return top