def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") html.add_attr("xmlns:v", 'urn:schemas-microsoft-com:vml') is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add(my.get_copyright_wdg()) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add( '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n' ) head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add( '<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>' ) # add the css styling head.add(my.get_css_wdg()) # add the title in the header try: project = Project.get() except Exception, e: print "ERROR: ", e # if the project doesn't exist, then use the admin project project = Project.get_by_code("admin")
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") html.add_attr("xmlns:v", 'urn:schemas-microsoft-com:vml') is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( my.get_copyright_wdg() ) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(my.get_css_wdg()) # add the title in the header try: project = Project.get() except Exception, e: print "ERROR: ", e # if the project doesn't exist, then use the admin project project = Project.get_by_code("admin")
def get_display(self): # self.sobjects is preferred, otherwise use # search_key. search_key = self.kwargs.get('search_key') message = None if not self.sobjects and search_key: message = Search.get_by_search_key(search_key) elif self.sobjects: message = self.sobjects[0] if not message: return DivWdg() if message.get_search_type() == 'sthpw/message': message_code = message.get_value("code") else: message_code = message.get_value("message_code") category = message.get_value("category") table = Table() table.add_row() td = table.add_cell() subscription = self.kwargs.get('subscription') show_preview = self.kwargs.get('show_preview') if show_preview in ['',None]: show_preview = True show_preview_category_list = ['sobject','chat'] if (category in show_preview_category_list and show_preview not in ['False','false',False]) or show_preview in ["True" ,"true",True]: td.add( self.get_preview_wdg(subscription, category=category, message_code=message_code )) message_value = message.get_value("message") message_login = message.get_value("login") #TODO: implement short_format even for closing html tags properly while truncating short_format = self.kwargs.get('short_format') in ['true', True] if message_value.startswith('{') and message_value.endswith('}'): #message_value = message_value.replace(r"\\", "\\"); message_value = jsonloads(message_value) # that doesn't support delete if category == "sobject": update_data = message_value.get("update_data") sobject_data = message_value.get("sobject") sobject_code = sobject_data.get('code') search_type = message_value.get("search_type") if search_type == "sthpw/note": description = "<b>Note added:</b><br/>%s" % update_data.get("note") elif search_type == "sthpw/task": description = "<b>Task modified:</b><br/>%s" % update_data.get("process") elif search_type == "sthpw/snapshot": sobject = message_value.get("sobject") description = "<b>Files checked in:</b><br/>%s" % sobject.get("process") else: display = [] if update_data: for key, val in update_data.items(): display.append('%s – %s'%(key, val)) else: if message_value.get('mode') == 'retire': display.append('Retired') base_search_type = Project.extract_base_search_type(search_type) description = DivWdg() title = DivWdg("<b>%s</b> - %s modified by %s:"%(base_search_type, sobject_code, message_login)) title.add_style('margin-bottom: 6px') content = DivWdg() content.add_style('padding-left: 2px') content.add('<br>'.join(display)) description.add(title) description.add(content) elif category == 'progress': description = DivWdg() message = message_value.get('message') message_div = DivWdg() message_div.add(message) description.add(message_div) percent = message_value.get('progress') if not percent: percent = 0.0 progress = HtmlElement('progress') progress.add_attr('value', percent) progress.add_attr('max', '100') progress.add_styles('''width: 280px; border-radius: 8px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.75) inset''') progress_size = self.kwargs.get("progress_size") if progress_size == "large": progress.add_styles("height: 16px; margin-top: 9px;") else: progress.add_styles("height: 5px; margin-top: 4px;") description.add(progress) else: message = message_value.get('message') if message: description = message else: description = message_value.get("description") else: if category == "chat": login = message.get("login") timestamp = message.get("timestamp") message_value = message.get("message") message_value = message_value.replace("\n", "<br/>") description = ''' <b>%s</b><br/> %s ''' % (login, message_value) else: description = message_value div = DivWdg() div.add(description) table.add_cell(div) return table
def get_display(my): top = my.top sources = my.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = my.kwargs.get("source_types") if not source_types: source_types = [] poster = my.kwargs.get("poster") width = my.kwargs.get("width") height = my.kwargs.get("height") preload = my.kwargs.get("preload") controls = my.kwargs.get("controls") is_test = my.kwargs.get("is_test") is_test = False if is_test in [True, 'true']: poster = "http://video-js.zencoder.com/oceans-clip.png" sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://techslides.com/demos/sample-videos/small.ogv"] video = my.video video.add_class("video-js") video.add_class("vjs-default-skin") top.add(video) my.video_id = my.kwargs.get("video_id") if not my.video_id: my.video_id = video.set_unique_id() else: video.set_attr("id", my.video_id) if my.index == 0: overlay = DivWdg() overlay.add_class('video_overlay') overlay.add_styles('background: transparent; z-index: 300; position: fixed; top: 38%; left: 12%;\ margin-left: auto; margin-right: auto; width: 75%; height: 45%' ) overlay.add_behavior({'type':'click_up', 'cbjs_action': ''' var overlay = bvr.src_el; var idx = spt.gallery.index; var video_id = spt.gallery.videos[idx]; if (!video_id) return; var player = videojs(video_id, {"nativeControlsForTouch": false}); if (player.paused()) { player.play(); //console.log("play " + video_id) } else player.pause(); ''' }) top.add(overlay) top.add_behavior( { 'type': 'load', 'index' : my.index, 'video_id': my.video_id, 'cbjs_action': ''' if (!bvr.index) bvr.index = 0; var video_id = bvr.video_id; spt.dom.load_js(["video/video.js"], function() { var player = videojs(video_id, {"nativeControlsForTouch": false}, function() { } ); //videojs(bvr.video_id).play(); }); if (spt.gallery) { spt.gallery.videos[bvr.index] = video_id; if (!spt.gallery.portrait) { var overlay = bvr.src_el.getElement('.video_overlay'); if (overlay) overlay.setStyles({'top': '4%', 'left': '5%', 'width': '90%', 'height':'87%'}); } } ''' } ) #video.add_attr("data-setup", "{}") if width: video.add_attr("width", width) if height: video.add_attr("height", height) if poster: video.add_attr("poster", poster) if not preload: preload = "none" video.add_attr("preload", preload) if not controls: controls = "true" if controls not in [False, 'false']: video.add_attr("controls", controls) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
def get_display(self): top = self.top sources = self.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = self.kwargs.get("source_types") if not source_types: source_types = [] poster = self.kwargs.get("poster") width = self.kwargs.get("width") height = self.kwargs.get("height") preload = self.kwargs.get("preload") controls = self.kwargs.get("controls") autoplay = self.kwargs.get("autoplay") video = self.video top.add(video) self.video_id = self.kwargs.get("video_id") if not self.video_id: self.video_id = video.set_unique_id() else: video.set_attr("id", self.video_id) top.add_behavior({'type': 'load', 'cbjs_action': self.get_onload_js()}) top.add_behavior({ 'type': 'load', 'video_id': self.video_id, 'cbjs_action': ''' spt.video.init_video(bvr.video_id); ''' }) if width: video.add_attr("width", width) if height: video.add_attr("height", height) else: video.add_attr("height", "auto") if poster: video.add_attr("poster", poster) if preload == None: preload = "auto" elif preload == False: preload = "none" autoplay = "false" video.add_attr("preload", preload) #video.add_attr("autoplay", autoplay) if controls: video.add_attr("controls", controls) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
def get_display(self): top = self.top sources = self.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = self.kwargs.get("source_types") if not source_types: source_types = [] poster = self.kwargs.get("poster") width = self.kwargs.get("width") height = self.kwargs.get("height") preload = self.kwargs.get("preload") controls = self.kwargs.get("controls") autoplay = self.kwargs.get("autoplay") is_test = self.kwargs.get("is_test") is_test = False if is_test in [True, 'true']: poster = "http://video-js.zencoder.com/oceans-clip.png" sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://techslides.com/demos/sample-videos/small.ogv"] video = self.video video.add_class("video-js") video.add_class("vjs-default-skin") top.add(video) self.video_id = self.kwargs.get("video_id") if not self.video_id: self.video_id = video.set_unique_id() else: video.set_attr("id", self.video_id) # FIXME: this has refereneces to the Gallery ....! if self.index == 0: overlay = DivWdg() overlay.add_class('video_overlay') overlay.add_styles( 'background: transparent; z-index: 300; position: fixed; top: 38%; left: 12%;\ margin-left: auto; margin-right: auto; width: 75%; height: 45%' ) overlay.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var overlay = bvr.src_el; var idx = spt.gallery.index; var video_id = spt.gallery.videos[idx]; if (!video_id) return; var player = videojs(video_id, {"nativeControlsForTouch": false}); if (player.paused()) { player.play(); //console.log("play " + video_id) } else player.pause(); ''' }) top.add(overlay) top.add_behavior({'type': 'load', 'cbjs_action': self.get_onload_js()}) top.add_behavior({ 'type': 'load', 'index': self.index, 'video_id': self.video_id, 'cbjs_action': ''' if (!bvr.index) bvr.index = 0; var video_id = bvr.video_id; spt.video.init_videojs(video_id); if (spt.gallery) { spt.gallery.videos[bvr.index] = video_id; if (!spt.gallery.portrait) { var overlay = bvr.src_el.getElement('.video_overlay'); if (overlay) overlay.setStyles({'top': '4%', 'left': '5%', 'width': '90%', 'height':'87%'}); } } ''' }) #video.add_attr("data-setup", "{}") if width: video.add_attr("width", width) if height: video.add_attr("height", height) if poster: video.add_attr("poster", poster) if preload == None: preload = "none" if controls == None: controls = True autoplay = False # videojs uses a json data structre data = {'preload': preload, 'controls': controls, 'autoplay': autoplay} from pyasm.common import jsondumps data_str = jsondumps(data) video.add_attr("data-setup", data_str) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
def get_display(my): top = my.top sources = my.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = my.kwargs.get("source_types") if not source_types: source_types = [] poster = my.kwargs.get("poster") width = my.kwargs.get("width") height = my.kwargs.get("height") preload = my.kwargs.get("preload") controls = my.kwargs.get("controls") autoplay = my.kwargs.get("autoplay") video = my.video top.add(video) my.video_id = my.kwargs.get("video_id") if not my.video_id: my.video_id = video.set_unique_id() else: video.set_attr("id", my.video_id) top.add_behavior( { 'type': 'load', 'cbjs_action': my.get_onload_js() } ) top.add_behavior( { 'type': 'load', 'video_id': my.video_id, 'cbjs_action': ''' spt.video.init_video(bvr.video_id); ''' } ) if width: video.add_attr("width", width) if height: video.add_attr("height", height) if poster: video.add_attr("poster", poster) if preload == None: preload = "auto" elif preload == False: preload = "none" autoplay = "false" video.add_attr("preload", preload) #video.add_attr("autoplay", autoplay) if controls: video.add_attr("controls", controls) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") html.add_attr("xmlns:v", 'urn:schemas-microsoft-com:vml') is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( my.get_copyright_wdg() ) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(my.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if project_code == 'admin': head.add("<title>TACTIC</title>\n" ) else: head.add("<title>%s</title>\n" % project_title ) # add the body body = my.body html.add( body ) # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer body.add( """ <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % ( IconWdg.get_icon_path("ERROR") ) ) # add the javascript libraries #head.add( JavascriptImportWdg() ) body.add("<form id='form' name='form' method='post' enctype='multipart/form-data'>\n") for content in my.widgets: body.add(content) body.add("</form>\n") from tactic_branding_wdg import TacticCopyrightNoticeWdg copyright = TacticCopyrightNoticeWdg() body.add(copyright) return widget
class TopWdg(Widget): def __init__(self, **kwargs): self.kwargs = kwargs super(TopWdg, self).__init__() def init(self): self.body = HtmlElement("body") Container.put("TopWdg::body", self.body) self.top = DivWdg() self.body.add(self.top) self.top.add_class("spt_top") Container.put("TopWdg::top", self.top) self.body.add_attr("ondragover", "return false;") self.body.add_attr("ondragleave", "return false;") self.body.add_attr("ondrop", "return false;") self.body.add_behavior({ 'type': 'load', 'cbjs_action': ''' var el = bvr.src_el; el.spt_window_active = true; if (document.addEventListener) { document.addEventListener("visibilitychange", function() { el.spt_window_active = ! document.hidden; } ); } else { window.onfocus = function() { bvr.src_el.spt_window_active = true; } window.onblur = function() { bvr.src_el.spt_window_active = false; } } ''' }) self.add_top_behaviors() click_div = DivWdg() self.top.add(click_div) click_div.add_behavior({ 'type': 'load', 'cbjs_action': ''' spt.body = {}; spt.body.is_active = function() { return $(document.body).spt_window_active; } spt.body.focus_elements = []; spt.body.add_focus_element = function(el) { spt.body.focus_elements.push(el); } spt.body.remove_focus_element = function(el) { var index = spt.body.focus_elements.indexOf(el); if (index != -1) { spt.body.focus_elements.splice(index, 1); } } // find all of the registered popups and close them // NOTE: logic can handle more than 1 focus element should it happen ... spt.body.hide_focus_elements = function(evt) { var mouse = evt.client; var target = evt.target; var targets = []; var count = 0; while (target) { targets.push(target); if (spt.has_class(target, 'spt_activator')) { act_el = target.dialog; if (act_el) { targets.push(act_el); break; } } // if target is an smenu, then return if (spt.has_class(target, 'SPT_SMENU')) { return; } target = target.parentNode; if (count == 100) { alert("Too many to close."); break; } } var dialog = evt.target.getParent(".MooDialog"); if (dialog) { targets.push(dialog); } // find out if any of the parents of target is the focus element for (var i = 0; i < spt.body.focus_elements.length; i++) { var el = spt.body.focus_elements[i]; var hit = false; for (var j = 0; j < targets.length; j++) { var target = targets[j]; if (target == el) { hit = true; break; } } if (hit) break; else { if ( el.isVisible() && el.on_complete ) { el.on_complete(); } else { spt.hide(el); } } } if (!hit) spt.body.focus_elements = []; } //bvr.src_el.addEvent("mousedown", spt.body.hide_focus_elements); document.body.addEvent("mousedown", spt.body.hide_focus_elements); ''' }) web = WebContainer.get_web() self.body.add_color("color", "color") #if web.is_title_page(): # self.body.add_gradient("background", "background", 0, -20) #else: # self.body.add_gradient("background", "background", 0, -15) self.body.add_color("background", "background") self.body.add_style("background-attachment: fixed !important") self.body.add_style("margin: 0px") self.body.add_style("padding: 0px") # ensure that any elements that force the default menu over any TACTIC right-click context menus has the # 'force_default_context_menu' flag reset for the next right click that occurs ... # self.body.add_event("oncontextmenu", "spt.force_default_context_menu = false;") def add_top_behaviors(self): self.body.add_relay_behavior({ 'type': 'click', 'bvr_match_class': 'tactic_popup', 'cbjs_action': ''' var view = bvr.src_el.getAttribute("view"); if (!view) { spt.alert("No view found"); } var target = bvr.src_el.getAttribute("target"); var title = bvr.src_el.getAttribute("title"); var class_name = 'tactic.ui.panel.CustomLayoutWdg'; var kwargs = { view: view, } var attributes = bvr.src_el.attributes; for (var i = 0; i < attributes.length; i++) { var name = attributes[i].name; if (name == "class") { continue; } var value = attributes[i].value; kwargs[name] = value; } spt.panel.load_popup(title, class_name, kwargs); ''' }) self.body.add_relay_behavior({ 'type': 'click', 'bvr_match_class': 'tactic_load', 'cbjs_action': ''' var view = bvr.src_el.getAttribute("view"); if (!view) { spt.alert("No view found"); } var target_class = bvr.src_el.getAttribute("target"); if (! target_class ) { target_class = "spt_content"; } if (target_class.indexOf(".") != "-1") { var parts = target_class.split("."); var top = bvr.src_el.getParent("."+parts[0]); var target = top.getElement("."+parts[1]); } else { var target = $(document.body).getElement("."+target_class); } var class_name = 'tactic.ui.panel.CustomLayoutWdg'; var kwargs = { view: view, } var attributes = bvr.src_el.attributes; for (var i = 0; i < attributes.length; i++) { var name = attributes[i].name; if (name == "class") { continue; } var value = attributes[i].value; kwargs[name] = value; } spt.panel.load(target, class_name, kwargs); var scroll = bvr.src_el.getAttribute("scroll"); if (scroll == "top") { window.scrollTo(0,0); } ''' }) self.body.add_relay_behavior({ 'type': 'click', 'bvr_match_class': 'tactic_link', 'cbjs_action': ''' var href = bvr.src_el.getAttribute("href"); if (!href) { spt.alert("No href defined for this link"); return; } var target = bvr.src_el.getAttribute("target"); if (!target) { target = "_self"; } window.open(href, target); ''' }) self.body.add_relay_behavior({ 'type': 'click', 'bvr_match_class': 'tactic_refresh', 'cbjs_action': ''' var target_class = bvr.src_el.getAttribute("target"); if (target_class.indexOf(".") != "-1") { var parts = target_class.split("."); var top = bvr.src_el.getParent("."+parts[0]); var target = top.getElement("."+parts[1]); } else { var target = $(document.body).getElement("."+target_class); } spt.panel.refresh(target); ''' }) self.body.add_relay_behavior({ 'type': 'click', 'bvr_match_class': 'tactic_new_tab', 'cbjs_action': ''' var view = bvr.src_el.getAttribute("view") var search_key = bvr.src_el.getAttribute("search_key") var expression = bvr.src_el.getAttribute("expression") var name = bvr.src_el.getAttribute("name"); var title = bvr.src_el.getAttribute("title"); if (!name) { name = title; } if (!title) { title = name; } if (!title && !name) { title = name = "Untitled"; } if (expression) { var server = TacticServerStub.get(); var sss = server.eval(expression, {search_keys: search_key, single: true}) search_key = sss.__search_key__; } spt.tab.set_main_body_tab() if (view) { var cls = "tactic.ui.panel.CustomLayoutWdg"; var kwargs = { view: view } } else if (search_key) { var cls = "tactic.ui.tools.SObjectDetailWdg"; var kwargs = { search_key: search_key } } var attributes = bvr.src_el.attributes; for (var i = 0; i < attributes.length; i++) { var attr_name = attributes[i].name; if (attr_name == "class") { continue; } var value = attributes[i].value; kwargs[attr_name] = value; } try { spt.tab.add_new(name, title, cls, kwargs); } catch(e) { spt.alert(e); } ''' }) self.body.add_relay_behavior({ 'type': 'click', 'bvr_match_class': 'tactic_submit', 'cbjs_action': ''' var command = bvr.src_el.getAttribute("command"); var kwargs = { } var server = TacticServerStub.get(); try { server.execute_cmd(command, kwargs); } catch(e) { spt.alert(e); } ''' }) self.body.add_relay_behavior({ 'type': 'mouseenter', 'bvr_match_class': 'tactic_hover', 'cbjs_action': ''' var bgcolor = bvr.src_el.getStyle("background"); bvr.src_el.setAttribute("spt_bgcolor", bgcolor); bvr.src_el.setStyle("background", "#EEE"); ''' }) self.body.add_relay_behavior({ 'type': 'mouseleave', 'bvr_match_class': 'tactic_hover', 'cbjs_action': ''' var bgcolor = bvr.src_el.getAttribute("spt_bgcolor"); if (!bgcolor) bgcolor = ""; //var bgcolor = "" bvr.src_el.setStyle("background", bgcolor); ''' }) self.body.set_unique_id() self.body.add_smart_style("tactic_load", "cursor", "pointer") # check version of the database project = Project.get() version = project.get_value("last_version_update") release = Environment.get_release_version() #if version < release: # FIXME: can't do this ... TACTIC cannot be running when the database # is upgrading. if False: try: from pyasm.security import Site site = Site.get_site() install_dir = Environment.get_install_dir() cmd = '''python "%s/src/bin/upgrade_db.py" -f -s "%s" --quiet --yes &''' % ( install_dir, site) print("cmd: ", cmd) os.system(cmd) pass except Exception as e: print("WARNING: ", e) def get_body(self): return self.body def get_top(self): return self.top def get_display(self): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add(self.get_copyright_wdg()) widget.add(html) # handle redirect request_url = web.get_request_url().get_info().path if request_url in ["/tactic/Index", "/Index", "/"]: # if we have the root path name, provide the ability for the site to # redirect from pyasm.security import Site site_obj = Site.get() redirect = site_obj.get_site_redirect() if redirect: widget.add( '''<meta http-equiv="refresh" content="0; url=%s">''' % redirect) return widget # create the header head = HtmlElement("head") html.add(head) head.add( '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n' ) head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add( '<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>' ) # add the css styling head.add(self.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if web.is_admin_page(): is_admin = " - Admin" else: is_admin = "" if project_code == 'admin': head.add("<title>TACTIC Site Admin</title>\n") else: head.add("<title>%s%s</title>\n" % (project_title, is_admin)) # add the javascript libraries head.add(JavascriptImportWdg()) # add the body body = self.body html.add(body) body.add_event('onload', 'spt.onload_startup(this)') top = self.top # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer top.add(""" <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % (IconWdg.get_icon_path("ERROR"))) # add the content content_div = DivWdg() top.add(content_div) Container.put("TopWdg::content", content_div) # add a dummy button for global behaviors from tactic.ui.widget import ButtonNewWdg, IconButtonWdg ButtonNewWdg(title="DUMMY", icon=IconWdg.FILM) IconButtonWdg(title="DUMMY", icon=IconWdg.FILM) # NOTE: it does not need to be in the DOM. Just needs to be # instantiated #content_div.add(button) if self.widgets: content_wdg = self.get_widget('content') else: content_wdg = Widget() self.add(content_wdg) content_div.add(content_wdg) # add a calendar wdg from tactic.ui.widget import CalendarWdg cal_wdg = CalendarWdg(css_class='spt_calendar_template_top') cal_wdg.top.add_style('display: none') content_div.add(cal_wdg) if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg branding = TacticCopyrightNoticeWdg(show_license_info=True) top.add(branding) # add the admin bar security = Environment.get_security() if not web.is_admin_page() and security.check_access( "builtin", "view_site_admin", "allow"): div = DivWdg() top.add(div) top.add_style("padding-top: 21px") div.add_class("spt_admin_bar") # home icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: left") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Home", icon="BS_HOME") icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' window.location.href="/"; ''' }) div.add_style("height: 15px") div.add_style("padding: 3px 0px 3px 15px") #div.add_style("margin-bottom: -5px") div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.7") div.add_style("width: 100%") #div.add_gradient("background", "background2", 20, 10) div.add_style("background-color", "#000") div.add_style("color", "#FFF") div.add_style("z-index", "1000") div.add_class("hand") div.set_box_shadow("0px 5px 5px") # remove icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Remove Admin Bar", icon="BS_REMOVE") icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var parent = bvr.src_el.getParent(".spt_admin_bar"); bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(parent); ''' }) # sign-out icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 5px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Sign Out", icon="BS_LOG_OUT") icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var ok = function(){ var server = TacticServerStub.get(); server.execute_cmd("SignOutCmd", {login: bvr.login} ); window.location.href="/"; } spt.confirm("Are you sure you wish to sign out?", ok ) ''' }) div.add("<b>ADMIN >></b>") div.add_behavior({ 'type': 'listen', 'event_name': 'close_admin_bar', 'cbjs_action': ''' bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(bvr.src_el); ''' }) div.add_behavior({ 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.85) //new Fx.Tween(bvr.src_el).start('height', "30px"); ''' }) div.add_behavior({ 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.7) //new Fx.Tween(bvr.src_el).start('height', "15px"); ''' }) project_code = Project.get_project_code() site_root = web.get_site_root() div.add_behavior({ 'type': 'click_up', 'site_root': site_root, 'project_code': project_code, 'cbjs_action': ''' var url = "/"+bvr.site_root+"/"+bvr.project_code+"/admin/link/_startup"; window.open(url); ''' }) # Add the script editor listener load_div = DivWdg() top.add(load_div) load_div.add_behavior({ 'type': 'listen', 'event_name': 'show_script_editor', 'cbjs_action': ''' var js_popup_id = "TACTIC Script Editor"; var js_popup = $(js_popup_id); if( js_popup ) { spt.popup.toggle_display( js_popup_id, false ); } else { spt.panel.load_popup(js_popup_id, "tactic.ui.app.ShelfEditWdg", {}, {"load_once": true} ); } ''' }) # deal with the palette defined in /index which can override the palette if self.kwargs.get("hash") == (): key = "index" search = Search("config/url") search.add_filter("url", "/%s/%%" % key, "like") search.add_filter("url", "/%s" % key) search.add_where("or") url = search.get_sobject() if url: xml = url.get_xml_value("widget") palette_key = xml.get_value("element/@palette") # look up palette the expression for index from pyasm.web import Palette palette = Palette.get() palette.set_palette(palette_key) colors = palette.get_colors() colors = jsondumps(colors) script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_colors(%s); env.set_palette('%s'); ''' % (colors, palette_key)) top.add(script) env = Environment.get() client_handoff_dir = env.get_client_handoff_dir(include_ticket=False, no_exception=True) client_asset_dir = env.get_client_repo_dir() login = Environment.get_login() user_name = login.get_value("login") user_id = login.get_id() login_groups = Environment.get_group_names() from pyasm.security import Site site = Site.get_site() kiosk_mode = Config.get_value("look", "kiosk_mode") if not kiosk_mode: kiosk_mode = 'false' # add environment information script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_site('%s'); env.set_project('%s'); env.set_user('%s'); env.set_user_id('%s'); var login_groups = '%s'.split('|'); env.set_login_groups(login_groups); env.set_client_handoff_dir('%s'); env.set_client_repo_dir('%s'); env.set_kiosk_mode('%s'); ''' % (site, Project.get_project_code(), user_name, user_id, '|'.join(login_groups), client_handoff_dir, client_asset_dir, kiosk_mode)) top.add(script) # add a global container for commonly used widgets div = DivWdg() top.add(div) div.set_id("global_container") # add in the app busy widget # find out if there is an override for this search = Search("config/url") search.add_filter("url", "/app_busy") url = search.get_sobject() if url: busy_div = DivWdg() div.add(busy_div) busy_div.add_class("SPT_PUW") busy_div.add_styles( "display: none; position: absolute; z-index: 1000") busy_div.add_class("app_busy_msg_block") busy_div.add_style("width: 300px") busy_div.add_style("height: 100px") busy_div.add_style("padding: 20px") busy_div.add_color("background", "background3") busy_div.add_border() busy_div.set_box_shadow() busy_div.set_round_corners(20) busy_div.set_attr("id", "app_busy_msg_block") # put the custom url here title_wdg = DivWdg() busy_div.add(title_wdg) title_wdg.add_style("font-size: 20px") title_wdg.add_class("spt_app_busy_title") busy_div.add("<hr/>") msg_div = DivWdg() busy_div.add(msg_div) msg_div.add_class("spt_app_busy_msg") else: from page_header_wdg import AppBusyWdg div.add(AppBusyWdg()) # popup parent popup = DivWdg() popup.set_id("popup") div.add(popup) # create another general popup popup_div = DivWdg() popup_div.set_id("popup_container") popup_div.add_class("spt_panel") popup = PopupWdg(id="popup_template", destroy_on_close=True) popup_div.add(popup) div.add(popup_div) inner_html_div = DivWdg() inner_html_div.set_id("inner_html") div.add(inner_html_div) # add in a global color from tactic.ui.input import ColorWdg color = ColorWdg() div.add(color) # add in a global notify wdg from notify_wdg import NotifyWdg widget.add(NotifyWdg()) from tactic.ui.app import DynamicUpdateWdg widget.add(DynamicUpdateWdg()) return widget def get_copyright_wdg(self): widget = Widget() # add the copyright information widget.add("<!-- -->\n") widget.add( "<!-- Copyright (c) 2005-2014, Southpaw Technology - All Rights Reserved -->\n" ) widget.add("<!-- -->\n") return widget def get_css_wdg(self): widget = Widget() web = WebContainer.get_web() context_url = web.get_context_url().to_string() skin = web.get_skin() version = Environment.get_release_version() # Bootstrap use_bootstrap = True if use_bootstrap: Container.append_seq( "Page:css", "%s/spt_js/bootstrap/css/bootstrap.min.css?ver=%s" % (context_url, version)) # add the color wheel css Container.append_seq( "Page:css", "%s/spt_js/mooRainbow/Assets/mooRainbow.css" % context_url) Container.append_seq( "Page:css", "%s/spt_js/mooDialog/css/MooDialog.css" % context_url) Container.append_seq( "Page:css", "%s/spt_js/mooScrollable/Scrollable.css" % context_url) # first load context css Container.append_seq("Page:css", "%s/style/layout.css" % context_url) # TEST Container.append_seq("Page:css", "%s/spt_js/video/video-js.css" % context_url) # get all of the registered css file css_files = Container.get_seq("Page:css") for css_file in css_files: widget.add( '<link rel="stylesheet" href="%s" type="text/css" />\n' % css_file) # custom js files to include includes = Config.get_value("install", "include_css") includes = includes.split(",") for include in includes: include = include.strip() if include: print("include: ", include) widget.add( '<link rel="stylesheet" href="%s" type="text/css" />\n' % include) return widget
def get_display(my): # my.sobjects is preferred, otherwise use # search_key. search_key = my.kwargs.get('search_key') if not my.sobjects and search_key: message = Search.get_by_search_key(search_key) elif my.sobjects: message = my.sobjects[0] if message.get_search_type() == 'sthpw/message': message_code = message.get_value("code") else: message_code = message.get_value("message_code") category = message.get_value("category") table = Table() table.add_row() td = table.add_cell() subscription = my.kwargs.get('subscription') show_preview = my.kwargs.get('show_preview') if show_preview in ['',None]: show_preview = True show_preview_category_list = ['sobject','chat'] if (category in show_preview_category_list and show_preview not in ['False','false',False]) or show_preview in ["True" ,"true",True]: td.add( my.get_preview_wdg(subscription, category=category, message_code=message_code )) message_value = message.get_value("message") message_login = message.get_value("login") #TODO: implement short_format even for closing html tags properly while truncating short_format = my.kwargs.get('short_format') in ['true', True] if message_value.startswith('{') and message_value.endswith('}'): #message_value = message_value.replace(r"\\", "\\"); message_value = jsonloads(message_value) # that doesn't support delete if category == "sobject": update_data = message_value.get("update_data") sobject_data = message_value.get("sobject") sobject_code = sobject_data.get('code') search_type = message_value.get("search_type") if search_type == "sthpw/note": description = "<b>Note added:</b><br/>%s" % update_data.get("note") elif search_type == "sthpw/task": description = "<b>Task modified:</b><br/>%s" % update_data.get("process") elif search_type == "sthpw/snapshot": sobject = message_value.get("sobject") description = "<b>Files checked in:</b><br/>%s" % sobject.get("process") else: display = [] if update_data: for key, val in update_data.items(): display.append('%s – %s'%(key, val)) else: if message_value.get('mode') == 'retire': display.append('Retired') base_search_type = Project.extract_base_search_type(search_type) description = DivWdg() title = DivWdg("<b>%s</b> - %s modified by %s:"%(base_search_type, sobject_code, message_login)) title.add_style('margin-bottom: 6px') content = DivWdg() content.add_style('padding-left: 2px') content.add('<br>'.join(display)) description.add(title) description.add(content) elif category == 'progress': description = DivWdg() message = message_value.get('message') message_div = DivWdg() message_div.add(message) description.add(message_div) percent = message_value.get('progress') if not percent: percent = 0.0 progress = HtmlElement('progress') progress.add_attr('value', percent) progress.add_attr('max', '100') progress.add_styles('''width: 280px; border-radius: 8px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.75) inset''') progress_size = my.kwargs.get("progress_size") if progress_size == "large": progress.add_styles("height: 16px; margin-top: 9px;") else: progress.add_styles("height: 5px; margin-top: 4px;") description.add(progress) else: message = message_value.get('message') if message: description = message else: description = message_value.get("description") else: if category == "chat": login = message.get("login") timestamp = message.get("timestamp") message_value = message.get("message") message_value = message_value.replace("\n", "<br/>") description = ''' <b>%s</b><br/> %s ''' % (login, message_value) else: description = message_value div = DivWdg() div.add(description) table.add_cell(div) return table
def get_display(my): top = my.top sources = my.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = my.kwargs.get("source_types") if not source_types: source_types = [] poster = my.kwargs.get("poster") width = my.kwargs.get("width") height = my.kwargs.get("height") preload = my.kwargs.get("preload") controls = my.kwargs.get("controls") is_test = my.kwargs.get("is_test") is_test = False if is_test in [True, 'true']: poster = "http://video-js.zencoder.com/oceans-clip.png" sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://techslides.com/demos/sample-videos/small.ogv"] video = my.video video.add_class("video-js") video.add_class("vjs-default-skin") top.add(video) my.video_id = my.kwargs.get("video_id") if not my.video_id: my.video_id = video.set_unique_id() else: video.set_attr("id", my.video_id) if my.index == 0: overlay = DivWdg() overlay.add_class('video_overlay') overlay.add_styles( 'background: transparent; z-index: 300; position: fixed; top: 38%; left: 12%;\ margin-left: auto; margin-right: auto; width: 75%; height: 45%' ) overlay.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var overlay = bvr.src_el; var idx = spt.gallery.index; var video_id = spt.gallery.videos[idx]; if (!video_id) return; var player = videojs(video_id, {"nativeControlsForTouch": false}); if (player.paused()) { player.play(); //console.log("play " + video_id) } else player.pause(); ''' }) top.add(overlay) top.add_behavior({ 'type': 'load', 'index': my.index, 'video_id': my.video_id, 'cbjs_action': ''' if (!bvr.index) bvr.index = 0; var video_id = bvr.video_id; spt.dom.load_js(["video/video.js"], function() { var player = videojs(video_id, {"nativeControlsForTouch": false}, function() { } ); //videojs(bvr.video_id).play(); }); if (spt.gallery) { spt.gallery.videos[bvr.index] = video_id; if (!spt.gallery.portrait) { var overlay = bvr.src_el.getElement('.video_overlay'); if (overlay) overlay.setStyles({'top': '4%', 'left': '5%', 'width': '90%', 'height':'87%'}); } } ''' }) #video.add_attr("data-setup", "{}") if width: video.add_attr("width", width) if height: video.add_attr("height", height) if poster: video.add_attr("poster", poster) if not preload: preload = "none" video.add_attr("preload", preload) if not controls: controls = "true" if controls not in [False, 'false']: video.add_attr("controls", controls) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
def get_display(self): top = self.top sources = self.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = self.kwargs.get("source_types") if not source_types: source_types = [] poster = self.kwargs.get("poster") width = self.kwargs.get("width") height = self.kwargs.get("height") preload = self.kwargs.get("preload") controls = self.kwargs.get("controls") autoplay = self.kwargs.get("autoplay") is_test = self.kwargs.get("is_test") is_test = False if is_test in [True, 'true']: poster = "http://video-js.zencoder.com/oceans-clip.png" sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://techslides.com/demos/sample-videos/small.ogv"] video = self.video video.add_class("video-js") video.add_class("vjs-default-skin") top.add(video) self.video_id = self.kwargs.get("video_id") if not self.video_id: self.video_id = video.set_unique_id() else: video.set_attr("id", self.video_id) # FIXME: this has refereneces to the Gallery ....! if self.index == 0: overlay = DivWdg() overlay.add_class('video_overlay') overlay.add_styles('background: transparent; z-index: 300; position: fixed; top: 38%; left: 12%;\ margin-left: auto; margin-right: auto; width: 75%; height: 45%' ) overlay.add_behavior({'type':'click_up', 'cbjs_action': ''' var overlay = bvr.src_el; var idx = spt.gallery.index; var video_id = spt.gallery.videos[idx]; if (!video_id) return; var player = videojs(video_id, {"nativeControlsForTouch": false}); if (player.paused()) { player.play(); //console.log("play " + video_id) } else player.pause(); ''' }) top.add(overlay) top.add_behavior( { 'type': 'load', 'cbjs_action': self.get_onload_js() } ) top.add_behavior( { 'type': 'load', 'index' : self.index, 'video_id': self.video_id, 'cbjs_action': ''' if (!bvr.index) bvr.index = 0; var video_id = bvr.video_id; spt.video.init_videojs(video_id); if (spt.gallery) { spt.gallery.videos[bvr.index] = video_id; if (!spt.gallery.portrait) { var overlay = bvr.src_el.getElement('.video_overlay'); if (overlay) overlay.setStyles({'top': '4%', 'left': '5%', 'width': '90%', 'height':'87%'}); } } ''' } ) #video.add_attr("data-setup", "{}") if width: video.add_attr("width", width) if height: video.add_attr("height", height) if poster: video.add_attr("poster", poster) if preload == None: preload = "none" if controls == None: controls = True autoplay = False # videojs uses a json data structre data = { 'preload': preload, 'controls': controls, 'autoplay': autoplay } from pyasm.common import jsondumps data_str = jsondumps(data) video.add_attr("data-setup", data_str) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
class TopWdg(Widget): def __init__(self, **kwargs): self.kwargs = kwargs super(TopWdg, self).__init__() def init(self): self.body = HtmlElement("body") Container.put("TopWdg::body", self.body) self.top = DivWdg() self.body.add(self.top) self.top.add_class("spt_top") Container.put("TopWdg::top", self.top) self.body.add_attr("ondragover", "return false;") self.body.add_attr("ondragleave", "return false;") self.body.add_attr("ondrop", "return false;") self.body.add_behavior( { 'type': 'load', 'cbjs_action': ''' var el = bvr.src_el; el.spt_window_active = true; if (document.addEventListener) { document.addEventListener("visibilitychange", function() { el.spt_window_active = ! document.hidden; } ); } else { window.onfocus = function() { bvr.src_el.spt_window_active = true; } window.onblur = function() { bvr.src_el.spt_window_active = false; } } ''' } ) self.add_top_behaviors() click_div = DivWdg() self.top.add(click_div) click_div.add_behavior( { 'type': 'load', 'cbjs_action': ''' spt.body = {}; spt.body.is_active = function() { return $(document.body).spt_window_active; } spt.body.focus_elements = []; spt.body.add_focus_element = function(el) { spt.body.focus_elements.push(el); } spt.body.remove_focus_element = function(el) { var index = spt.body.focus_elements.indexOf(el); if (index != -1) { spt.body.focus_elements.splice(index, 1); } } // find all of the registered popups and close them // NOTE: logic can handle more than 1 focus element should it happen ... spt.body.hide_focus_elements = function(evt) { var mouse = evt.client; var target = evt.target; var targets = []; var count = 0; while (target) { targets.push(target); if (spt.has_class(target, 'spt_activator')) { act_el = target.dialog; if (act_el) { targets.push(act_el); break; } } // if target is an smenu, then return if (spt.has_class(target, 'SPT_SMENU')) { return; } target = target.parentNode; if (count == 100) { alert("Too many to close."); break; } } var dialog = evt.target.getParent(".MooDialog"); if (dialog) { targets.push(dialog); } // find out if any of the parents of target is the focus element for (var i = 0; i < spt.body.focus_elements.length; i++) { var el = spt.body.focus_elements[i]; var hit = false; for (var j = 0; j < targets.length; j++) { var target = targets[j]; if (target == el) { hit = true; break; } } if (hit) break; else { if ( el.isVisible() && el.on_complete ) { el.on_complete(); } else { spt.hide(el); } } } if (!hit) spt.body.focus_elements = []; } //bvr.src_el.addEvent("mousedown", spt.body.hide_focus_elements); document.body.addEvent("mousedown", spt.body.hide_focus_elements); ''' } ) web = WebContainer.get_web() self.body.add_color("color", "color") #if web.is_title_page(): # self.body.add_gradient("background", "background", 0, -20) #else: # self.body.add_gradient("background", "background", 0, -15) self.body.add_color("background", "background") self.body.add_style("background-attachment: fixed !important") self.body.add_style("margin: 0px") self.body.add_style("padding: 0px") # ensure that any elements that force the default menu over any TACTIC right-click context menus has the # 'force_default_context_menu' flag reset for the next right click that occurs ... # self.body.add_event( "oncontextmenu", "spt.force_default_context_menu = false;" ) def add_top_behaviors(self): self.body.add_relay_behavior( { 'type': 'click', 'bvr_match_class': 'tactic_popup', 'cbjs_action': ''' var view = bvr.src_el.getAttribute("view"); if (!view) { spt.alert("No view found"); } var target = bvr.src_el.getAttribute("target"); var title = bvr.src_el.getAttribute("title"); var class_name = 'tactic.ui.panel.CustomLayoutWdg'; var kwargs = { view: view, } var attributes = bvr.src_el.attributes; for (var i = 0; i < attributes.length; i++) { var name = attributes[i].name; if (name == "class") { continue; } var value = attributes[i].value; kwargs[name] = value; } spt.panel.load_popup(title, class_name, kwargs); ''' } ) self.body.add_relay_behavior( { 'type': 'click', 'bvr_match_class': 'tactic_load', 'cbjs_action': ''' var view = bvr.src_el.getAttribute("view"); if (!view) { spt.alert("No view found"); } var target_class = bvr.src_el.getAttribute("target"); if (! target_class ) { target_class = "spt_content"; } if (target_class.indexOf(".") != "-1") { var parts = target_class.split("."); var top = bvr.src_el.getParent("."+parts[0]); var target = top.getElement("."+parts[1]); } else { var target = $(document.body).getElement("."+target_class); } var class_name = 'tactic.ui.panel.CustomLayoutWdg'; var kwargs = { view: view, } var attributes = bvr.src_el.attributes; for (var i = 0; i < attributes.length; i++) { var name = attributes[i].name; if (name == "class") { continue; } var value = attributes[i].value; kwargs[name] = value; } spt.panel.load(target, class_name, kwargs); var scroll = bvr.src_el.getAttribute("scroll"); if (scroll == "top") { window.scrollTo(0,0); } ''' } ) self.body.add_relay_behavior( { 'type': 'click', 'bvr_match_class': 'tactic_link', 'cbjs_action': ''' var href = bvr.src_el.getAttribute("href"); if (!href) { spt.alert("No href defined for this link"); return; } var target = bvr.src_el.getAttribute("target"); if (!target) { target = "_self"; } window.open(href, target); ''' } ) self.body.add_relay_behavior( { 'type': 'click', 'bvr_match_class': 'tactic_refresh', 'cbjs_action': ''' var target_class = bvr.src_el.getAttribute("target"); if (target_class.indexOf(".") != "-1") { var parts = target_class.split("."); var top = bvr.src_el.getParent("."+parts[0]); var target = top.getElement("."+parts[1]); } else { var target = $(document.body).getElement("."+target_class); } spt.panel.refresh(target); ''' } ) self.body.add_relay_behavior( { 'type': 'click', 'bvr_match_class': 'tactic_new_tab', 'cbjs_action': ''' var view = bvr.src_el.getAttribute("view") var search_key = bvr.src_el.getAttribute("search_key") var expression = bvr.src_el.getAttribute("expression") var name = bvr.src_el.getAttribute("name"); var title = bvr.src_el.getAttribute("title"); if (!name) { name = title; } if (!title) { title = name; } if (!title && !name) { title = name = "Untitled"; } if (expression) { var server = TacticServerStub.get(); var sss = server.eval(expression, {search_keys: search_key, single: true}) search_key = sss.__search_key__; } spt.tab.set_main_body_tab() if (view) { var cls = "tactic.ui.panel.CustomLayoutWdg"; var kwargs = { view: view } } else if (search_key) { var cls = "tactic.ui.tools.SObjectDetailWdg"; var kwargs = { search_key: search_key } } var attributes = bvr.src_el.attributes; for (var i = 0; i < attributes.length; i++) { var attr_name = attributes[i].name; if (attr_name == "class") { continue; } var value = attributes[i].value; kwargs[attr_name] = value; } try { spt.tab.add_new(name, title, cls, kwargs); } catch(e) { spt.alert(e); } ''' } ) self.body.add_relay_behavior( { 'type': 'click', 'bvr_match_class': 'tactic_submit', 'cbjs_action': ''' var command = bvr.src_el.getAttribute("command"); var kwargs = { } var server = TacticServerStub.get(); try { server.execute_cmd(command, kwargs); } catch(e) { spt.alert(e); } ''' } ) self.body.add_relay_behavior( { 'type': 'mouseenter', 'bvr_match_class': 'tactic_hover', 'cbjs_action': ''' var bgcolor = bvr.src_el.getStyle("background"); bvr.src_el.setAttribute("spt_bgcolor", bgcolor); bvr.src_el.setStyle("background", "#EEE"); ''' } ) self.body.add_relay_behavior( { 'type': 'mouseleave', 'bvr_match_class': 'tactic_hover', 'cbjs_action': ''' var bgcolor = bvr.src_el.getAttribute("spt_bgcolor"); if (!bgcolor) bgcolor = ""; //var bgcolor = "" bvr.src_el.setStyle("background", bgcolor); ''' } ) self.body.set_unique_id() self.body.add_smart_style( "tactic_load", "cursor", "pointer" ) # check version of the database project = Project.get() version = project.get_value("last_version_update") release = Environment.get_release_version() #if version < release: # FIXME: can't do this ... TACTIC cannot be running when the database # is upgrading. if False: try: from pyasm.security import Site site = Site.get_site() install_dir = Environment.get_install_dir() cmd = '''python "%s/src/bin/upgrade_db.py" -f -s "%s" --quiet --yes &''' % (install_dir, site) print("cmd: ", cmd) os.system(cmd) pass except Exception as e: print("WARNING: ", e) def get_body(self): return self.body def get_top(self): return self.top def get_display(self): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( self.get_copyright_wdg() ) widget.add(html) # handle redirect request_url = web.get_request_url().get_info().path if request_url in ["/tactic/Index", "/Index", "/"]: # if we have the root path name, provide the ability for the site to # redirect from pyasm.security import Site site_obj = Site.get() redirect = site_obj.get_site_redirect() if redirect: widget.add('''<meta http-equiv="refresh" content="0; url=%s">''' % redirect) return widget # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(self.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if web.is_admin_page(): is_admin = " - Admin" else: is_admin = "" if project_code == 'admin': head.add("<title>TACTIC Site Admin</title>\n" ) else: head.add("<title>%s%s</title>\n" % (project_title, is_admin) ) # add the javascript libraries head.add( JavascriptImportWdg() ) # add the body body = self.body html.add( body ) body.add_event('onload', 'spt.onload_startup(this)') top = self.top # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer top.add( """ <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % ( IconWdg.get_icon_path("ERROR") ) ) # add the content content_div = DivWdg() top.add(content_div) Container.put("TopWdg::content", content_div) # add a dummy button for global behaviors from tactic.ui.widget import ButtonNewWdg, IconButtonWdg ButtonNewWdg(title="DUMMY", icon=IconWdg.FILM) IconButtonWdg(title="DUMMY", icon=IconWdg.FILM) # NOTE: it does not need to be in the DOM. Just needs to be # instantiated #content_div.add(button) if self.widgets: content_wdg = self.get_widget('content') else: content_wdg = Widget() self.add(content_wdg) content_div.add( content_wdg ) # add a calendar wdg from tactic.ui.widget import CalendarWdg cal_wdg = CalendarWdg(css_class='spt_calendar_template_top') cal_wdg.top.add_style('display: none') content_div.add(cal_wdg) if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg branding = TacticCopyrightNoticeWdg(show_license_info=True) top.add(branding) # add the admin bar security = Environment.get_security() if not web.is_admin_page() and security.check_access("builtin", "view_site_admin", "allow"): div = DivWdg() top.add(div) top.add_style("padding-top: 21px") div.add_class("spt_admin_bar") # home icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: left") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Home", icon="BS_HOME") icon_div.add(icon_button) icon_button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' window.location.href="/"; ''' } ) div.add_style("height: 15px") div.add_style("padding: 3px 0px 3px 15px") #div.add_style("margin-bottom: -5px") div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.7") div.add_style("width: 100%") #div.add_gradient("background", "background2", 20, 10) div.add_style("background-color", "#000") div.add_style("color", "#FFF") div.add_style("z-index", "1000") div.add_class("hand") div.set_box_shadow("0px 5px 5px") # remove icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Remove Admin Bar", icon="BS_REMOVE") icon_div.add(icon_button) icon_button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var parent = bvr.src_el.getParent(".spt_admin_bar"); bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(parent); ''' } ) # sign-out icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 5px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Sign Out", icon="BS_LOG_OUT") icon_div.add(icon_button) icon_button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var ok = function(){ var server = TacticServerStub.get(); server.execute_cmd("SignOutCmd", {login: bvr.login} ); window.location.href="/"; } spt.confirm("Are you sure you wish to sign out?", ok ) ''' } ) div.add("<b>ADMIN >></b>") div.add_behavior( { 'type': 'listen', 'event_name': 'close_admin_bar', 'cbjs_action': ''' bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(bvr.src_el); ''' } ) div.add_behavior( { 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.85) //new Fx.Tween(bvr.src_el).start('height', "30px"); ''' } ) div.add_behavior( { 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.7) //new Fx.Tween(bvr.src_el).start('height', "15px"); ''' } ) project_code = Project.get_project_code() site_root = web.get_site_root() div.add_behavior( { 'type': 'click_up', 'site_root': site_root, 'project_code': project_code, 'cbjs_action': ''' var url = "/"+bvr.site_root+"/"+bvr.project_code+"/admin/link/_startup"; window.open(url); ''' } ) # Add the script editor listener load_div = DivWdg() top.add(load_div) load_div.add_behavior( { 'type': 'listen', 'event_name': 'show_script_editor', 'cbjs_action': ''' var js_popup_id = "TACTIC Script Editor"; var js_popup = $(js_popup_id); if( js_popup ) { spt.popup.toggle_display( js_popup_id, false ); } else { spt.panel.load_popup(js_popup_id, "tactic.ui.app.ShelfEditWdg", {}, {"load_once": true} ); } '''} ) # deal with the palette defined in /index which can override the palette if self.kwargs.get("hash") == (): key = "index" search = Search("config/url") search.add_filter("url", "/%s/%%"%key, "like") search.add_filter("url", "/%s"%key) search.add_where("or") url = search.get_sobject() if url: xml = url.get_xml_value("widget") palette_key = xml.get_value("element/@palette") # look up palette the expression for index from pyasm.web import Palette palette = Palette.get() palette.set_palette(palette_key) colors = palette.get_colors() colors = jsondumps(colors) script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_colors(%s); env.set_palette('%s'); ''' % (colors, palette_key) ) top.add(script) env = Environment.get() client_handoff_dir = env.get_client_handoff_dir(include_ticket=False, no_exception=True) client_asset_dir = env.get_client_repo_dir() login = Environment.get_login() user_name = login.get_value("login") user_id = login.get_id() login_groups = Environment.get_group_names() from pyasm.security import Site site = Site.get_site() kiosk_mode = Config.get_value("look", "kiosk_mode") if not kiosk_mode: kiosk_mode = 'false' # add environment information script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_site('%s'); env.set_project('%s'); env.set_user('%s'); env.set_user_id('%s'); var login_groups = '%s'.split('|'); env.set_login_groups(login_groups); env.set_client_handoff_dir('%s'); env.set_client_repo_dir('%s'); env.set_kiosk_mode('%s'); ''' % (site, Project.get_project_code(), user_name, user_id, '|'.join(login_groups), client_handoff_dir,client_asset_dir, kiosk_mode)) top.add(script) # add a global container for commonly used widgets div = DivWdg() top.add(div) div.set_id("global_container") # add in the app busy widget # find out if there is an override for this search = Search("config/url") search.add_filter("url", "/app_busy") url = search.get_sobject() if url: busy_div = DivWdg() div.add(busy_div) busy_div.add_class( "SPT_PUW" ) busy_div.add_styles( "display: none; position: absolute; z-index: 1000" ) busy_div.add_class("app_busy_msg_block") busy_div.add_style("width: 300px") busy_div.add_style("height: 100px") busy_div.add_style("padding: 20px") busy_div.add_color("background", "background3") busy_div.add_border() busy_div.set_box_shadow() busy_div.set_round_corners(20) busy_div.set_attr("id","app_busy_msg_block") # put the custom url here title_wdg = DivWdg() busy_div.add(title_wdg) title_wdg.add_style("font-size: 20px") title_wdg.add_class("spt_app_busy_title") busy_div.add("<hr/>") msg_div = DivWdg() busy_div.add(msg_div) msg_div.add_class("spt_app_busy_msg") else: from page_header_wdg import AppBusyWdg div.add( AppBusyWdg() ) # popup parent popup = DivWdg() popup.set_id("popup") div.add(popup) # create another general popup popup_div = DivWdg() popup_div.set_id("popup_container") popup_div.add_class("spt_panel") popup = PopupWdg(id="popup_template",destroy_on_close=True) popup_div.add(popup) div.add(popup_div) inner_html_div = DivWdg() inner_html_div.set_id("inner_html") div.add(inner_html_div) # add in a global color from tactic.ui.input import ColorWdg color = ColorWdg() div.add(color) # add in a global notify wdg from notify_wdg import NotifyWdg widget.add(NotifyWdg()) from tactic.ui.app import DynamicUpdateWdg widget.add( DynamicUpdateWdg() ) return widget def get_copyright_wdg(self): widget = Widget() # add the copyright information widget.add( "<!-- -->\n") widget.add( "<!-- Copyright (c) 2005-2014, Southpaw Technology - All Rights Reserved -->\n") widget.add( "<!-- -->\n") return widget def get_css_wdg(self): widget = Widget() web = WebContainer.get_web() context_url = web.get_context_url().to_string() skin = web.get_skin() version = Environment.get_release_version() # Bootstrap use_bootstrap = True if use_bootstrap: Container.append_seq("Page:css", "%s/spt_js/bootstrap/css/bootstrap.min.css?ver=%s" % (context_url, version)) # add the color wheel css Container.append_seq("Page:css", "%s/spt_js/mooRainbow/Assets/mooRainbow.css" % context_url) Container.append_seq("Page:css", "%s/spt_js/mooDialog/css/MooDialog.css" % context_url) Container.append_seq("Page:css", "%s/spt_js/mooScrollable/Scrollable.css" % context_url) # first load context css Container.append_seq("Page:css", "%s/style/layout.css" % context_url) # TEST Container.append_seq("Page:css", "%s/spt_js/video/video-js.css" % context_url) # get all of the registered css file css_files = Container.get_seq("Page:css") for css_file in css_files: widget.add('<link rel="stylesheet" href="%s" type="text/css" />\n' % css_file ) # custom js files to include includes = Config.get_value("install", "include_css") includes = includes.split(",") for include in includes: include = include.strip() if include: print("include: ", include) widget.add('<link rel="stylesheet" href="%s" type="text/css" />\n' % include ) return widget
def get_display(self): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") html.add_attr("xmlns:v", 'urn:schemas-microsoft-com:vml') is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( self.get_copyright_wdg() ) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(self.get_css_wdg()) # add the title in the header try: project = Project.get() except Exception as e: print("ERROR: ", e) # if the project doesn't exist, then use the admin project project = Project.get_by_code("admin") project_code = project.get_code() project_title = project.get_value("title") if project_code == 'admin': head.add("<title>TACTIC</title>\n" ) else: head.add("<title>%s</title>\n" % project_title ) # add the body body = self.body html.add( body ) body.add("<form id='form' name='form' method='post' enctype='multipart/form-data'>\n") for content in self.widgets: body.add(content) body.add("</form>\n") if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg copyright = TacticCopyrightNoticeWdg() body.add(copyright) return widget
def get_display(my): top = my.top sources = my.kwargs.get("sources") if sources and isinstance(sources, basestring): sources = sources.split("|") source_types = my.kwargs.get("source_types") if not source_types: source_types = [] poster = my.kwargs.get("poster") width = my.kwargs.get("width") height = my.kwargs.get("height") preload = my.kwargs.get("preload") controls = my.kwargs.get("controls") is_test = my.kwargs.get("is_test") is_test = False if is_test in [True, 'true']: poster = "http://video-js.zencoder.com/oceans-clip.png" sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://video-js.zencoder.com/oceans-clip.mp4"] sources = ["http://techslides.com/demos/sample-videos/small.ogv"] video = my.video video.add_class("video-js") video.add_class("vjs-default-skin") top.add(video) my.video_id = my.kwargs.get("video_id") if not my.video_id: my.video_id = video.set_unique_id() else: video.set_attr("id", my.video_id) print "my.video_id: ", my.video_id video.add_behavior( { 'type': 'load', 'video_id': my.video_id, 'cbjs_action': ''' spt.dom.load_js(["video/video.js"], function() { //videojs(bvr.src_el, {}, function() { //} ); //videojs(bvr.video_id).play(); }); ''' } ) #video.add_attr("data-setup", "{}") if width: video.add_attr("width", width) if height: video.add_attr("height", height) if poster: video.add_attr("poster", poster) if not preload: preload = "none" video.add_attr("preload", preload) if not controls: controls = "true" if controls not in [False, 'false']: video.add_attr("controls", controls) for i, src in enumerate(sources): source = HtmlElement(type="source") source.add_attr("src", src) if len(source_types) > i: source_type = source_types[i] source.add_attr("type", source_type) video.add(source) #print top.get_buffer_display() return top
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add(my.get_copyright_wdg()) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add( '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n' ) head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add( '<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>' ) # add the css styling head.add(my.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if web.is_admin_page(): is_admin = " - Admin" else: is_admin = "" if project_code == 'admin': head.add("<title>TACTIC Site Admin</title>\n") else: head.add("<title>%s%s</title>\n" % (project_title, is_admin)) # add the javascript libraries head.add(JavascriptImportWdg()) # add the body body = my.body html.add(body) body.add_event('onload', 'spt.onload_startup(this)') top = my.top # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer top.add(""" <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % (IconWdg.get_icon_path("ERROR"))) # add the content content_div = DivWdg() top.add(content_div) Container.put("TopWdg::content", content_div) # add a dummy button for global behaviors from tactic.ui.widget import ButtonNewWdg, IconButtonWdg ButtonNewWdg(title="DUMMY", icon=IconWdg.FILM) IconButtonWdg(title="DUMMY", icon=IconWdg.FILM) # NOTE: it does not need to be in the DOM. Just needs to be # instantiated #content_div.add(button) if my.widgets: content_wdg = my.get_widget('content') else: content_wdg = Widget() my.add(content_wdg) content_div.add(content_wdg) # add a calendar wdg from tactic.ui.widget import CalendarWdg cal_wdg = CalendarWdg(css_class='spt_calendar_template_top') cal_wdg.top.add_style('display: none') content_div.add(cal_wdg) if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg branding = TacticCopyrightNoticeWdg(show_license_info=True) top.add(branding) # add the admin bar security = Environment.get_security() if not web.is_admin_page() and security.check_access( "builtin", "view_site_admin", "allow"): div = DivWdg() top.add(div) top.add_style("padding-top: 21px") div.add_class("spt_admin_bar") div.add_style("height: 15px") div.add_style("padding: 3px 0px 3px 15px") #div.add_style("margin-bottom: -5px") div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.7") div.add_style("width: 100%") #div.add_gradient("background", "background2", 20, 10) div.add_style("background-color", "#000") div.add_style("color", "#FFF") div.add_style("z-index", "1000") div.add_class("hand") div.set_box_shadow("0px 5px 5px") # remove icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Remove Admin Bar", icon=IconWdg.G_CLOSE) icon_div.add(icon_button) icon_button.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var parent = bvr.src_el.getParent(".spt_admin_bar"); bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(parent); ''' }) div.add("<b>ADMIN >></b>") div.add_behavior({ 'type': 'listen', 'event_name': 'close_admin_bar', 'cbjs_action': ''' bvr.src_el.getParent(".spt_top").setStyle("padding-top", "0px"); spt.behavior.destroy_element(bvr.src_el); ''' }) div.add_behavior({ 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.85) //new Fx.Tween(bvr.src_el).start('height', "30px"); ''' }) div.add_behavior({ 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.7) //new Fx.Tween(bvr.src_el).start('height', "15px"); ''' }) project_code = Project.get_project_code() div.add_behavior({ 'type': 'click_up', 'cbjs_action': ''' var url = "/tactic/%s/admin/link/_startup"; window.open(url); ''' % project_code }) # Add the script editor listener load_div = DivWdg() top.add(load_div) load_div.add_behavior({ 'type': 'listen', 'event_name': 'show_script_editor', 'cbjs_action': ''' var js_popup_id = "TACTIC Script Editor"; var js_popup = $(js_popup_id); if( js_popup ) { spt.popup.toggle_display( js_popup_id, false ); } else { spt.panel.load_popup(js_popup_id, "tactic.ui.app.ShelfEditWdg", {}, {"load_once": true} ); } ''' }) # deal with the palette defined in /index which can override the palette if my.kwargs.get("hash") == (): key = "index" search = Search("config/url") search.add_filter("url", "/%s/%%" % key, "like") search.add_filter("url", "/%s" % key) search.add_where("or") url = search.get_sobject() if url: xml = url.get_xml_value("widget") palette_key = xml.get_value("element/@palette") # look up palette the expression for index from pyasm.web import Palette palette = Palette.get() palette.set_palette(palette_key) colors = palette.get_colors() colors = jsondumps(colors) script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_colors(%s); env.set_palette('%s'); ''' % (colors, palette_key)) top.add(script) env = Environment.get() client_handoff_dir = env.get_client_handoff_dir(include_ticket=False, no_exception=True) client_asset_dir = env.get_client_repo_dir() login = Environment.get_login() user_name = login.get_value("login") user_id = login.get_id() login_groups = Environment.get_group_names() # add environment information script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_project('%s'); env.set_user('%s'); env.set_user_id('%s'); var login_groups = '%s'.split('|'); env.set_login_groups(login_groups); env.set_client_handoff_dir('%s'); env.set_client_repo_dir('%s'); ''' % (Project.get_project_code(), user_name, user_id, '|'.join(login_groups), client_handoff_dir, client_asset_dir)) top.add(script) # add a global container for commonly used widgets div = DivWdg() top.add(div) div.set_id("global_container") # add in the app busy widget # find out if there is an override for this search = Search("config/url") search.add_filter("url", "/app_busy") url = search.get_sobject() if url: busy_div = DivWdg() div.add(busy_div) busy_div.add_class("SPT_PUW") busy_div.add_styles( "display: none; position: absolute; z-index: 1000") busy_div.add_class("app_busy_msg_block") busy_div.add_style("width: 300px") busy_div.add_style("height: 100px") busy_div.add_style("padding: 20px") busy_div.add_color("background", "background3") busy_div.add_border() busy_div.set_box_shadow() busy_div.set_round_corners(20) busy_div.set_attr("id", "app_busy_msg_block") # put the custom url here title_wdg = DivWdg() busy_div.add(title_wdg) title_wdg.add_style("font-size: 20px") title_wdg.add_class("spt_app_busy_title") busy_div.add("<hr/>") msg_div = DivWdg() busy_div.add(msg_div) msg_div.add_class("spt_app_busy_msg") else: from page_header_wdg import AppBusyWdg div.add(AppBusyWdg()) # popup parent popup = DivWdg() popup.set_id("popup") div.add(popup) # create another general popup popup_div = DivWdg() popup_div.set_id("popup_container") popup_div.add_class("spt_panel") popup = PopupWdg(id="popup_template", destroy_on_close=True) popup_div.add(popup) div.add(popup_div) inner_html_div = DivWdg() inner_html_div.set_id("inner_html") div.add(inner_html_div) # add in a global color from tactic.ui.input import ColorWdg color = ColorWdg() div.add(color) # add in a global notify wdg from notify_wdg import NotifyWdg widget.add(NotifyWdg()) return widget
def get_display(my): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add( my.get_copyright_wdg() ) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n') head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add('<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>') # add the css styling head.add(my.get_css_wdg()) # add the title in the header project = Project.get() project_code = project.get_code() project_title = project.get_value("title") if web.is_admin_page(): is_admin = " - Admin" else: is_admin = "" if project_code == 'admin': head.add("<title>TACTIC Site Admin</title>\n" ) else: head.add("<title>%s%s</title>\n" % (project_title, is_admin) ) # add the javascript libraries head.add( JavascriptImportWdg() ) # add the body body = my.body html.add( body ) # Add a NOSCRIPT tag block here to provide a warning message on browsers where 'Enable JavaScript' # is not checked ... TODO: clean up and re-style to make look nicer body.add( """ <NOSCRIPT> <div style="border: 2px solid black; background-color: #FFFF99; color: black; width: 600px; height: 70px; padding: 20px;"> <img src="%s" style="border: none;" /> <b>Javascript is not enabled on your browser!</b> <p>This TACTIC powered, web-based application requires JavaScript to be enabled in order to function. In your browser's options/preferences, please make sure that the 'Enable JavaScript' option is checked on, click OK to accept the settings change, and then refresh this web page.</p> </div> </NOSCRIPT> """ % ( IconWdg.get_icon_path("ERROR") ) ) # add the content if my.widgets: content_wdg = my.get_widget('content') else: content_wdg = Widget() my.add(content_wdg) body.add( content_wdg ) body.add_event('onload', 'spt.onload_startup(this)') if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg branding = TacticCopyrightNoticeWdg(show_license_info=True) body.add(branding) # add the admin bar security = Environment.get_security() if not web.is_admin_page() and security.check_access("builtin", "view_site_admin", "allow"): div = DivWdg() body.add(div) body.add_style("padding-top: 21px") div.add_class("spt_admin_bar") div.add_style("height: 15px") div.add_style("padding: 3px 0px 3px 15px") #div.add_style("margin-bottom: -5px") div.add_style("position: fixed") div.add_style("top: 0px") div.add_style("left: 0px") div.add_style("opacity: 0.7") div.add_style("width: 100%") #div.add_gradient("background", "background2", 20, 10) div.add_style("background-color", "#000") div.add_style("color", "#FFF") div.add_style("z-index", "1000") div.add_class("hand") div.set_box_shadow("0px 5px 5px") # remove icon_div = DivWdg() div.add(icon_div) icon_div.add_style("float: right") icon_div.add_style("margin-right: 10px") icon_div.add_style("margin-top: -3px") icon_button = IconButtonWdg(title="Remove Admin Bar", icon=IconWdg.POPUP_WIN_CLOSE) icon_div.add(icon_button) icon_button.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var parent = bvr.src_el.getParent(".spt_admin_bar"); spt.behavior.destroy_element(parent); $(document.body).setStyle("padding-top", "0px"); ''' } ) div.add("<b>ADMIN >></b>") div.add_behavior( { 'type': 'listen', 'event_name': 'close_admin_bar', 'cbjs_action': ''' spt.behavior.destroy_element(bvr.src_el); $(document.body).setStyle("padding-top", "0px"); ''' } ) div.add_behavior( { 'type': 'mouseover', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.85) //new Fx.Tween(bvr.src_el).start('height', "30px"); ''' } ) div.add_behavior( { 'type': 'mouseout', 'cbjs_action': ''' bvr.src_el.setStyle("opacity", 0.7) //new Fx.Tween(bvr.src_el).start('height', "15px"); ''' } ) project_code = Project.get_project_code() div.add_behavior( { 'type': 'click_up', 'cbjs_action': ''' var url = "/tactic/%s/link/_startup"; window.open(url); ''' % project_code } ) # Add the script editor listener load_div = DivWdg() body.add(load_div) load_div.add_behavior( { 'type': 'listen', 'event_name': 'show_script_editor', 'cbjs_action': ''' var js_popup_id = "TACTIC Script Editor"; var js_popup = $(js_popup_id); if( js_popup ) { spt.popup.toggle_display( js_popup_id, false ); } else { spt.panel.load_popup(js_popup_id, "tactic.ui.app.ShelfEditWdg", {}, {"load_once": true} ); } '''} ) # deal with the palette defined in /index which can override the palette if my.kwargs.get("hash") == (): key = "index" search = Search("config/url") search.add_filter("url", "/%s/%%"%key, "like") search.add_filter("url", "/%s"%key) search.add_where("or") url = search.get_sobject() if url: xml = url.get_xml_value("widget") palette_key = xml.get_value("element/@palette") # look up palette the expression for index from pyasm.web import Palette palette = Palette.get() palette.set_palette(palette_key) colors = palette.get_colors() colors = jsondumps(colors) script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_colors(%s); env.set_palette('%s'); ''' % (colors, palette_key) ) body.add(script) env = Environment.get() client_handoff_dir = env.get_client_handoff_dir(include_ticket=False, no_exception=True) client_asset_dir = env.get_client_repo_dir() login = Environment.get_login() user_name = login.get_value("login") user_id = login.get_id() login_groups = Environment.get_group_names() # add environment information script = HtmlElement.script(''' var env = spt.Environment.get(); env.set_project('%s'); env.set_user('%s'); env.set_user_id('%s'); var login_groups = '%s'.split('|'); env.set_login_groups(login_groups); env.set_client_handoff_dir('%s'); env.set_client_repo_dir('%s'); ''' % (Project.get_project_code(), user_name, user_id, '|'.join(login_groups), client_handoff_dir,client_asset_dir)) body.add(script) # add a global container for commonly used widgets div = DivWdg() body.add(div) div.set_id("global_container") # add in the app busy widget # find out if there is an override for this search = Search("config/url") search.add_filter("url", "/app_busy") url = search.get_sobject() if url: busy_div = DivWdg() div.add(busy_div) busy_div.add_class( "SPT_PUW" ) busy_div.add_styles( "display: none; position: absolute; z-index: 1000" ) busy_div.add_class("app_busy_msg_block") busy_div.add_style("width: 300px") busy_div.add_style("height: 100px") busy_div.add_style("padding: 20px") busy_div.add_color("background", "background3") busy_div.add_border() busy_div.set_box_shadow() busy_div.set_round_corners(20) busy_div.set_attr("id","app_busy_msg_block") # put the custom url here title_wdg = DivWdg() busy_div.add(title_wdg) title_wdg.add_style("font-size: 20px") title_wdg.add_class("spt_app_busy_title") busy_div.add("<hr/>") msg_div = DivWdg() busy_div.add(msg_div) msg_div.add_class("spt_app_busy_msg") else: from page_header_wdg import AppBusyWdg div.add( AppBusyWdg() ) # popup parent popup = DivWdg() popup.set_id("popup") div.add(popup) # create another general popup popup_div = DivWdg() popup_div.set_id("popup_container") popup_div.add_class("spt_panel") popup = PopupWdg(id="popup_template",destroy_on_close=True) popup_div.add(popup) div.add(popup_div) # popup parent inner_html_div = DivWdg() inner_html_div.set_id("inner_html") div.add(inner_html_div) # add in a global color from tactic.ui.input import ColorWdg color = ColorWdg() div.add(color) # add in a global notify wdg from notify_wdg import NotifyWdg widget.add(NotifyWdg()) return widget
def get_display(self): web = WebContainer.get_web() widget = Widget() html = HtmlElement("html") html.add_attr("xmlns:v", 'urn:schemas-microsoft-com:vml') is_xhtml = False if is_xhtml: web.set_content_type("application/xhtml+xml") widget.add('''<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ''') html.add_attr("xmlns", "http://www.w3.org/1999/xhtml") #html.add_attr("xmlns:svg", "http://www.w3.org/2000/svg") # add the copyright widget.add(self.get_copyright_wdg()) widget.add(html) # create the header head = HtmlElement("head") html.add(head) head.add( '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>\n' ) head.add('<meta http-equiv="X-UA-Compatible" content="IE=edge"/>\n') # Add the tactic favicon head.add( '<link rel="shortcut icon" href="/context/favicon.ico" type="image/x-icon"/>' ) # add the css styling head.add(self.get_css_wdg()) # add the title in the header try: project = Project.get() except Exception as e: print("ERROR: ", e) # if the project doesn't exist, then use the admin project project = Project.get_by_code("admin") project_code = project.get_code() project_title = project.get_value("title") if project_code == 'admin': head.add("<title>TACTIC</title>\n") else: head.add("<title>%s</title>\n" % project_title) # add the body body = self.body html.add(body) body.add( "<form id='form' name='form' method='post' enctype='multipart/form-data'>\n" ) for content in self.widgets: body.add(content) body.add("</form>\n") if web.is_admin_page(): from tactic_branding_wdg import TacticCopyrightNoticeWdg copyright = TacticCopyrightNoticeWdg() body.add(copyright) return widget