def execute(my): my.buffer = cStringIO.StringIO() try: try: # clear the main container for this thread Container.create() # clear the buffer WebContainer.clear_buffer() # initialize the web environment object and register it adapter = my.get_adapter() WebContainer.set_web(adapter) # get the display my._get_display() except SetupException, e: '''Display setup exception in the interface''' print "Setup exception: ", e.__str__() DbContainer.rollback_all() ExceptionLog.log(e) my.writeln("<h3>Tactic Setup Error</h3>" ) my.writeln("<pre>" ) my.writeln(e.__str__() ) my.writeln("</pre>" ) except DatabaseException, e: from tactic.ui.startup import DbConfigPanelWdg config_wdg = DbConfigPanelWdg() my.writeln("<pre>") my.writeln(config_wdg.get_buffer_display()) my.writeln("</pre>")
def get_display(self): web = WebContainer.get_web() # get the request uri request_uri = web.get_env("REQUEST_URI") security = WebContainer.get_security() groups = security.get_groups() # go through each group and find a redirect. Take the first one for group in groups: # find out if the person user has a redirect which confines them # to a particular address redirect = group.get_value("redirect_url") # prevent mistaken infinte loops redirect = redirect.strip() if not redirect: continue if request_uri.find(redirect) == -1: # draw the actual page html = Html() html.writeln('<HEAD>') html.writeln('<META HTTP-EQUIV="Refresh" CONTENT="0; URL=%s"' % redirect) html.writeln('</HEAD>') return html return None
def handle_guest_security(self, security): # skip storing current security since it failed Site.set_site("default", store_security=False) try: WebContainer.set_security(security) security.login_as_guest() ticket_key = security.get_ticket_key() web = WebContainer.get_web() web.set_cookie("login_ticket", ticket_key) access_manager = security.get_access_manager() xml = Xml() xml.read_string(''' <rules> <rule column="login" value="{$LOGIN}" search_type="sthpw/login" access="deny" op="!=" group="search_filter"/> </rules> ''') access_manager.add_xml_rules(xml) finally: Site.pop_site(pop_security=False)
def get_display(self): profile_flag = False if profile_flag: BaseAppServer.profile.object = self if os.name == 'nt': path = "C:/sthpw/profile" else: path = "/tmp/sthpw/temp/profile" profile.run( "from pyasm.web.app_server import BaseAppServer; BaseAppServer.profile()", path) p = pstats.Stats(path) p.sort_stats('cumulative').print_stats(30) print("*" * 30) p.sort_stats('time').print_stats(30) else: self.execute() value = WebContainer.get_buffer().getvalue() WebContainer.clear_buffer() return value
def _get_display(my): WebContainer.set_security(FakeSecurity()) page = my.get_page_widget() # create some singletons and store in container cmd_delegator = WebContainer.get_cmd_delegator() # add the event container event_container = WebContainer.get_event_container() from pyasm.widget import TopWdg, BottomWdg top = TopWdg() bottom = BottomWdg() page = my.get_page_widget() web = WebContainer.get_web() from widget import Widget widget = Widget() widget.add(top) widget.add(page) # widget.add( my.get_form_wdg() ) widget.add(bottom) # widget.add(warning_report) widget.add(cmd_delegator) # create a web app and run it through the pipeline from web_app import WebApp web_app = WebApp() return web_app.get_display(widget)
def get_display(my): web = WebContainer.get_web() # get the request uri request_uri = web.get_env("REQUEST_URI") security = WebContainer.get_security() groups = security.get_groups() # go through each group and find a redirect. Take the first one for group in groups: # find out if the person user has a redirect which confines them # to a particular address redirect = group.get_value("redirect_url") # prevent mistaken infinte loops redirect = redirect.strip() if not redirect: continue if request_uri.find(redirect) == -1: # draw the actual page html = Html() html.writeln('<HEAD>') html.writeln('<META HTTP-EQUIV="Refresh" CONTENT="0; URL=%s"' % redirect) html.writeln('</HEAD>') return html return None
def _get_display(my): WebContainer.set_security(FakeSecurity()) page = my.get_page_widget() # create some singletons and store in container cmd_delegator = WebContainer.get_cmd_delegator() # add the event container event_container = WebContainer.get_event_container() from pyasm.widget import TopWdg, BottomWdg top = TopWdg() bottom = BottomWdg() page = my.get_page_widget() web = WebContainer.get_web() from widget import Widget widget = Widget() widget.add(top) widget.add(page) #widget.add( my.get_form_wdg() ) widget.add(bottom) #widget.add(warning_report) widget.add(cmd_delegator) # create a web app and run it through the pipeline from web_app import WebApp web_app = WebApp() return web_app.get_display(widget)
def handle_security(my, security): # set the seucrity object WebContainer.set_security(security) # see if there is an override web = WebContainer.get_web() ticket_key = web.get_form_value("login_ticket") # attempt to login in with a ticket if not ticket_key: ticket_key = web.get_cookie("login_ticket") # We can define another place to look at ticket values and use # that. ie: Drupal session key session_key = Config.get_value("security", "session_key") login = web.get_form_value("login") password = web.get_form_value("password") if session_key: ticket_key = web.get_cookie(session_key) if ticket_key: security.login_with_session(ticket_key, add_access_rules=False) elif login and password: if login == "guest": pass else: from pyasm.widget import WebLoginCmd login_cmd = WebLoginCmd() login_cmd.execute() ticket_key = security.get_ticket_key() # clear the password web.set_form_value('password','') elif ticket_key: security.login_with_ticket(ticket_key, add_access_rules=False) if not security.is_logged_in(): reset_password = web.get_form_value("reset_password") == 'true' if reset_password: from tactic.ui.widget import ResetPasswordCmd reset_cmd = ResetPasswordCmd(reset=True) try: reset_cmd.execute() except TacticException, e: print "Reset failed. %s" %e.__str__() else: from pyasm.widget import WebLoginCmd login_cmd = WebLoginCmd() login_cmd.execute() ticket_key = security.get_ticket_key()
def gradient(my, palette_key, modifier=0, range=-20, reverse=False, default=None): if modifier == None: modifier = 0 if range == None: range = -20 from web_container import WebContainer web = WebContainer.get_web() palette = Palette.get() if web.is_IE(): color = my.color(palette_key, (modifier+range)/2, default=default) return color else: if not reverse: color1 = my.color(palette_key, modifier, default=default) color2 = my.color(palette_key, modifier+range, default=default) else: color2 = my.color(palette_key, modifier, default=default) color1 = my.color(palette_key, modifier+range, default=default) if web.get_browser() == 'Mozilla': return "-moz-linear-gradient(top, %s, %s)" % (color1, color2) else: return "-webkit-gradient(linear, 0%% 0%%, 0%% 100%%, from(%s), to(%s))" % (color1, color2)
def get_content(my, request_type): web = WebContainer.get_web() # NOTE: is this needed anymore? if request_type in ["upload", "dynamic_file"]: print "DEPRECATED: dynamic file in app_server.py" widget = Widget() page = my.get_page_widget() widget.add(page) return widget # find hash of url my.custom_url = None if my.hash: hash = "/".join(my.hash) hash = "/%s" % hash from tactic.ui.panel import HashPanelWdg my.custom_url = HashPanelWdg.get_url_from_hash(hash) if my.custom_url: content_type = my.custom_url.get_value("content_type", no_exception=True) # TODO: we may want to handle this differently for content types # other that text/html return my.get_application_wdg()
def _get_display(my): # set up the security object from pyasm.security import Security, Sudo from pyasm.biz import Project from pyasm.web import WebContainer web = WebContainer.get_web() # guest mode # allow_guest = Config.get_value("security", "allow_guest") if allow_guest == 'true': allow_guest = True else: allow_guest = False site_obj = Site.get() site_allow_guest = site_obj.allow_guest() if site_allow_guest != None: allow_guest = site_allow_guest security = Security() try: security = my.handle_security(security) is_logged_in = security.is_logged_in() except Exception, e: print "AppServer Exception: ", e return my.handle_not_logged_in()
def get_skin(my): # DEPRECATED: replaced by palettes # TODO: prod setting shouldn't be in prod!!! from pyasm.prod.biz import ProdSetting web = WebContainer.get_web() skin = web.get_form_value("skin") # look at users preferences if not skin: skin = PrefSetting.get_value_by_key("skin") # if skin isn't found in user preference settings then look for it # in the projects/config XML file ... if not skin: skin = Config.get_value("look", "skin") if not skin: skin = "dark" # MMS-TACTIC ... allow for 'MMS' skin to be returned for use in overriding some colors (MMS is a copy of # 'dark' skin) if skin == 'MMS': return 'MMS' return "dark"
def start_basic_tasks(self, scheduler): # close all extraneous database connections 15 minutes class DatabaseCloseTask(SchedulerTask): def execute(self): #print "Closing all connections" DbContainer.close_all_global_connections() task = DatabaseCloseTask() interval = 15 * 60 scheduler.add_interval_task(task, interval=interval, mode='threaded', delay=60) # Kill cherrypy every interval. This overcomes some of the memory # problems with long running Python processes. In order to # use this properly, it is essential that a load balancer with # proper failover is used # class KillTacticTask(SchedulerTask): def execute(self): # wait until KillThread is premitted while GlobalContainer.get("KillThreadCmd:allow") == "false": print "Kill locked ... waiting 5 seconds" time.sleep(5) continue import cherrypy print print "Stopping TACTIC ..." print print " ... stopping Schduler" scheduler = Scheduler.get() scheduler.stop() print " ... stopping Cherrypy" cherrypy.engine.stop() cherrypy.engine.exit() print " ... closing DB connections" DbContainer.close_all_global_connections() print " ... kill current process" Common.kill() print "Done." from web_container import WebContainer if not WebContainer.is_dev_mode(): task = KillTacticTask() config_delay = Config.get_value("services", "process_time_alive") if config_delay: import random # put in a randomizer so that not all processes die at once delay = int(config_delay) offset = random.random() * delay - delay / 2 delay += offset seconds = int(delay * 60) print "Process will exit in [%s] seconds" % seconds scheduler.add_single_task(task, mode='sequential', delay=seconds)
def get_gradient(my, palette_key, modifier=0, range=-20, reverse=False, default=None,angle=180): from palette import Palette from web_container import WebContainer web = WebContainer.get_web() palette = Palette.get() if web.is_IE(): color = palette.color(palette_key, (modifier+range)/2, default=default) return color else: if not reverse: color1 = palette.color(palette_key, modifier, default=default) color2 = palette.color(palette_key, modifier+range, default=default) else: color2 = palette.color(palette_key, modifier, default=default) color1 = palette.color(palette_key, modifier+range, default=default) """ if web.get_browser() == 'Mozilla': gradient = "-moz-linear-gradient(top, %s, %s)" % (color1, color2) else: gradient = "-webkit-gradient(linear, 0%% 0%%, 0%% 100%%, from(%s), to(%s))" % (color1, color2) """ gradient = "linear-gradient(%sdeg, %s, %s)" % (angle, color1, color2) return gradient
def get_display(my): html = None url = WebContainer.get_web().get_request_url().to_string() # check the url security security = WebContainer.get_security() if not security.check_access("url", url, "view"): html = Html() # should probably just use this widget instead of redirecting redirect = "/tactic/Error403" html.writeln("<script>document.location = '%s'</script>" % redirect) return html
def start_basic_tasks(self, scheduler): # close all extraneous database connections 15 minutes class DatabaseCloseTask(SchedulerTask): def execute(self): #print "Closing all connections" DbContainer.close_all_global_connections() task = DatabaseCloseTask() interval = 15*60 scheduler.add_interval_task(task, interval=interval, mode='threaded', delay=60) # Kill cherrypy every interval. This overcomes some of the memory # problems with long running Python processes. In order to # use this properly, it is essential that a load balancer with # proper failover is used # class KillTacticTask(SchedulerTask): def execute(self): # wait until KillThread is premitted while GlobalContainer.get("KillThreadCmd:allow") == "false": print "Kill locked ... waiting 5 seconds" time.sleep(5) continue import cherrypy print print "Stopping TACTIC ..." print print " ... stopping Schduler" scheduler = Scheduler.get() scheduler.stop() print " ... stopping Cherrypy" cherrypy.engine.stop() cherrypy.engine.exit() print " ... closing DB connections" DbContainer.close_all_global_connections() print " ... kill current process" Common.kill() print "Done." from web_container import WebContainer if not WebContainer.is_dev_mode(): task = KillTacticTask() config_delay = Config.get_value("services", "process_time_alive") if config_delay: import random # put in a randomizer so that not all processes die at once delay = int(config_delay) offset = random.random()*delay - delay/2 delay += offset seconds = int(delay * 60) print "Process will exit in [%s] seconds" % seconds scheduler.add_single_task(task, mode='sequential', delay=seconds)
def set_max_width(my, use_css=False): if use_css: if WebContainer.get_web().is_IE(): my.add_style("width", "95%") else: my.add_style("width", "100%") else: # dynamic resizing doesn't work with css setting with %. my.set_attr("width", "100%")
def handle_guest_security(my, security): WebContainer.set_security(security) security.login_as_guest() ticket_key = security.get_ticket_key() web = WebContainer.get_web() web.set_cookie("login_ticket", ticket_key) access_manager = security.get_access_manager() xml = Xml() xml.read_string(''' <rules> <rule column="login" value="{$LOGIN}" search_type="sthpw/login" access="deny" op="!=" group="search_filter"/> </rules> ''') access_manager.add_xml_rules(xml)
def get_display(my): profile_flag = False if profile_flag: BaseAppServer.profile.object = my if os.name == 'nt': path = "C:/sthpw/profile" else: path = "/tmp/sthpw/temp/profile" profile.run( "from pyasm.web.app_server import BaseAppServer; BaseAppServer.profile()", path) p = pstats.Stats(path) p.sort_stats('cumulative').print_stats(30) print "*"*30 p.sort_stats('time').print_stats(30) else: my.execute() value = WebContainer.get_buffer().getvalue() WebContainer.clear_buffer() return value
def handle_not_logged_in(my, allow_change_admin=True): site_obj = Site.get() site_obj.set_site("default") DbResource.clear_cache() from pyasm.widget import WebLoginWdg, BottomWdg from tactic.ui.app import TitleTopWdg from pyasm.biz import Project from tactic.ui.panel import HashPanelWdg web = WebContainer.get_web() widget = Widget() top = TitleTopWdg() widget.add(top) body = top.get_body() body.add_gradient("background", "background", 5, -20) body.add_color("color", "color") reset_request = web.get_form_value('reset_request') =='true' if reset_request: from tactic.ui.widget import ResetPasswordWdg top.add(ResetPasswordWdg()) else: reset_msg = web.get_form_value('reset_msg') if reset_msg: web.set_form_value(WebLoginWdg.LOGIN_MSG, reset_msg) sudo = Sudo() try: # get the project from the url because we are still # in the admin project at this stage current_project = web.get_context_name() try: if current_project != "default": project = Project.get_by_code(current_project) assert project except Exception, e: web_wdg = None else:
def _get_display(my): # set up the security object from pyasm.security import Security, Sudo from pyasm.biz import Project from pyasm.web import WebContainer web = WebContainer.get_web() security = Security() try: security = my.handle_security(security) is_logged_in = security.is_logged_in() except Exception, e: site_obj = Site.get() return my.handle_not_logged_in()
def set_round_corners(my, size=5, corners=[]): browser = WebContainer.get_web().get_browser() if browser == "Mozilla": for corner in corners: if corner in ["TL"]: my.add_style("-moz-border-radius-topleft: %spx" % size) my.add_style("border-top-left-radius: %spx" % size) elif corner in ["TR"]: my.add_style("-moz-border-radius-topright: %spx" % size) my.add_style("border-top-right-radius: %spx" % size) elif corner in ["BL"]: my.add_style("-moz-border-radius-bottomleft: %spx" % size) my.add_style("border-bottom-left-radius: %spx" % size) elif corner in ["BR"]: my.add_style("-moz-border-radius-bottomright: %spx" % size) my.add_style("border-bottom-right-radius: %spx" % size) if not corners: my.add_style("-moz-border-radius: %spx" % size) my.add_style("border-radius: %spx" % size) elif browser in ["Webkit", "Qt"]: for corner in corners: if corner in ["TL"]: my.add_style("border-top-left-radius: %spx" % size) elif corner in ["TR"]: my.add_style("border-top-right-radius: %spx" % size) elif corner in ["BL"]: my.add_style("border-bottom-left-radius: %spx" % size) elif corner in ["BR"]: my.add_style("border-bottom-right-radius: %spx" % size) if not corners: my.add_style("border-radius: %spx" % size) elif browser == "IE": if not corners: corners = ["TL", "TR", "BL", "BR"] for corner in corners: if corner in ["TL"]: my.add_style("border-top-left-radius: %spx" % size) elif corner in ["TR"]: my.add_style("border-top-right-radius: %spx" % size) elif corner in ["BL"]: my.add_style("border-bottom-left-radius: %spx" % size) elif corner in ["BR"]: my.add_style("border-bottom-right-radius: %spx" % size)
def handle_not_logged_in(my, allow_change_admin=True): site_obj = Site.get() site_obj.set_site("default") DbResource.clear_cache() from pyasm.widget import WebLoginWdg, BottomWdg from tactic.ui.app import TitleTopWdg from pyasm.biz import Project from tactic.ui.panel import HashPanelWdg web = WebContainer.get_web() widget = Widget() top = TitleTopWdg() widget.add(top) body = top.get_body() body.add_gradient("background", "background", 5, -20) body.add_color("color", "color") reset_request = web.get_form_value('reset_request') == 'true' if reset_request: from tactic.ui.widget import ResetPasswordWdg top.add(ResetPasswordWdg()) else: reset_msg = web.get_form_value('reset_msg') if reset_msg: web.set_form_value(WebLoginWdg.LOGIN_MSG, reset_msg) web_wdg = None #sudo = Sudo() try: # get the project from the url because we are still # in the admin project at this stage current_project = web.get_context_name() try: if current_project != "default": project = Project.get_by_code(current_project) assert project except Exception, e: pass else:
def set_round_corners(my, size=5, corners=[]): browser = WebContainer.get_web().get_browser() if browser == 'Mozilla': for corner in corners: if corner in ['TL']: my.add_style("-moz-border-radius-topleft: %spx" % size) my.add_style("border-top-left-radius: %spx" % size) elif corner in ['TR']: my.add_style("-moz-border-radius-topright: %spx" % size) my.add_style("border-top-right-radius: %spx" % size) elif corner in ['BL']: my.add_style("-moz-border-radius-bottomleft: %spx" % size) my.add_style("border-bottom-left-radius: %spx" % size) elif corner in ['BR']: my.add_style("-moz-border-radius-bottomright: %spx" % size) my.add_style("border-bottom-right-radius: %spx" % size) if not corners: my.add_style("-moz-border-radius: %spx" % size) my.add_style("border-radius: %spx" % size) elif browser in ['Webkit','Qt']: for corner in corners: if corner in ['TL']: my.add_style("border-top-left-radius: %spx" % size) elif corner in ['TR']: my.add_style("border-top-right-radius: %spx" % size) elif corner in ['BL']: my.add_style("border-bottom-left-radius: %spx" % size) elif corner in ['BR']: my.add_style("border-bottom-right-radius: %spx" % size) if not corners: my.add_style("border-radius: %spx" % size) elif browser == 'IE': if not corners: corners = ['TL','TR','BL','BR'] for corner in corners: if corner in ['TL']: my.add_style("border-top-left-radius: %spx" % size) elif corner in ['TR']: my.add_style("border-top-right-radius: %spx" % size) elif corner in ['BL']: my.add_style("border-bottom-left-radius: %spx" % size) elif corner in ['BR']: my.add_style("border-bottom-right-radius: %spx" % size)
def get_form_wdg(self): web = WebContainer.get_web() from pyasm.web import Table table = Table() keys = web.get_form_keys() keys.sort() for key in keys: # skipping the upload data if not key: continue pat = re.compile(r'(\|files|\|images|\|snapshot|\|submission|\|publish_icon|\|publish_main)$') if pat.search(key): continue table.add_row() field = web.get_form_values(key) table.add_cell(key) table.add_cell(str(field)) return table
def set_box_shadow(my, value="0px 0px 15px", color=None): if not color: color = my.get_color("shadow") if not color: theme = my.get_theme() if theme == "dark": color = "#000000" else: color = "rgba(0,0,0,0.4)" browser = WebContainer.get_web().get_browser() if browser == 'Mozilla': my.add_style("-moz-box-shadow: %s %s" % (value, color)) # This is needed for Mozilla 13 my.add_style("box-shadow: %s %s" % (value, color)) elif browser in ['Webkit', 'Qt']: my.add_style("-webkit-box-shadow: %s %s" % (value, color)) else: my.add_style("box-shadow: %s %s" % (value, color))
def get_form_wdg(my): web = WebContainer.get_web() from pyasm.web import Table table = Table() keys = web.get_form_keys() keys.sort() for key in keys: # skipping the upload data if not key: continue pat = re.compile( r'(\|files|\|images|\|snapshot|\|submission|\|publish_icon|\|publish_main)$' ) if pat.search(key): continue table.add_row() field = web.get_form_values(key) table.add_cell(key) table.add_cell(str(field)) return table
def execute(my): my.buffer = cStringIO.StringIO() try: # clear the main containers Container.create() # clear the buffer WebContainer.clear_buffer() # initialize the web environment object and register it adapter = my.get_adapter() WebContainer.set_web(adapter) # get the display my._get_display() finally: WebContainer.get_buffer().write(my.buffer.getvalue())
return my.writeln("<pre>") my.writeln("An Error has occurred. Please see your Tactic Administrator<br/>") my.writeln( "Error Message: %s" % log.get_value("message") ) my.writeln("Error Id: %s" % log.get_id() ) my.writeln( log.get_value("stack_trace") ) my.writeln("</pre>") finally: # ensure that database connections are always closed DbContainer.close_all() # clear the container Container.delete() WebContainer.get_buffer().write( my.buffer.getvalue() ) def handle_not_logged_in(my, allow_change_admin=True): site_obj = Site.get() site_obj.set_site("default") DbResource.clear_cache() from pyasm.widget import WebLoginWdg, BottomWdg from tactic.ui.app import TitleTopWdg
def get_display(my): '''override the get display function of Widget. This is the function that actually draws the html element to the buffer''' html = WebContainer.get_buffer() buffer = html.get_buffer() buffer.write("<%s" % my.type) attrs = [] if my.attrs: for x,y in my.attrs.items(): if type(x) == types.UnicodeType: x = Common.process_unicode_string(x) if type(y) == types.UnicodeType: y = Common.process_unicode_string(y) attrs.append( ' %s="%s"' % (x,y) ) attr = " ".join( attrs ) """ attr = " ".join( [' %s="%s"' % (x,y) for x,y in my.attrs.items()] ) if type(attr) == types.UnicodeType: attr = Common.process_unicode_string(attr) """ buffer.write(attr) attr = None # now process behaviors and, if there are any, construct the SPT_BVR_LIST attribute and write it out. # also add the SPT_BVR class to the element if it does have behaviors. if my.behaviors: my.add_class('SPT_BVR') bvr_str_list = [ ' SPT_BVR_LIST="[' ] bvr_type_list = [ ' SPT_BVR_TYPE_LIST="[' ] #for c in range(len(my.behaviors)): for c, behavior in enumerate(my.behaviors): if c: bvr_str_list.append(',') bvr_type_list.append(',') bvr_spec_str = HtmlElement.get_json_string(behavior) # NOTE: this is to make the HTML be XML compliant #bvr_spec_str = bvr_spec_str.replace("<", "<") #bvr_spec_str = bvr_spec_str.replace(">", ">") #bvr_spec_str = bvr_spec_str.replace("&", "&") bvr_str_list.append( bvr_spec_str ) bvr_info = { 'type': behavior.get("type"), } if behavior.get("_handoff_"): bvr_info['_handoff_'] = behavior.get("_handoff_") bvr_info_str = HtmlElement.get_json_string(bvr_info) bvr_type_list.append( bvr_info_str ) bvr_str_list.append( ']"' ) bvr_type_list.append( ']"' ) buffer.write( "".join( bvr_str_list ) ) buffer.write( "".join( bvr_type_list ) ) bvr_str_list = None bvr_type_list = None # handle the style if my.styles: styles = [] for name, value in my.styles.items(): styles.append( "%s: %s" % (name,value) ) buffer.write( " style='%s'" % ";".join(styles) ) styles = None # handle relay styles if my.relay_styles: for relay_style in my.relay_styles: my.add(relay_style) # handle the class if my.classes: classes = my.classes.keys() buffer.write(" class='%s'" % " ".join(classes)) classes = None # handle events if my.events: for key in my.events.keys(): functions = my.events.get(key) function = "javascript:%s" % ";".join(functions) buffer.write( ' %s="%s"' % (key,function) ) functions = None self_close = False if my.type in ["img", "br"] or (my.type == "input" and not my.widgets): self_close = True else: buffer.write(">") super(HtmlElement,my).get_display() # add the closing tag if self_close: buffer.write(" />") elif my.type == "span": buffer.write("</%s>" % my.type) elif my.type != 'br': #buffer.write("</%s>\n" % my.type) buffer.write("</%s>" % my.type) my.clear()
def add_event_caller(my, event, event_name): '''calls a registered event which in turn calls all of its listeners''' event_container = WebContainer.get_event_container() function = event_container.get_event_caller(event_name) my.add_event(event, function)
def _get_display(self): web = WebContainer.get_web() web.set_form_value("ajax", "true") return super(WidgetAppServer, self)._get_display()
def handle_security(my, security, allow_guest=False): # set the seucrity object WebContainer.set_security(security) # see if there is an override web = WebContainer.get_web() ticket_key = web.get_form_value("login_ticket") # attempt to login in with a ticket if not ticket_key: ticket_key = web.get_cookie("login_ticket") # We can define another place to look at ticket values and use # that. ie: Drupal session key session_key = Config.get_value("security", "session_key") login = web.get_form_value("login") password = web.get_form_value("password") site_obj = Site.get() path_info = site_obj.get_request_path_info() if path_info: site = path_info['site'] if site == "default": site = web.get_form_value("site") if not site: site = "default" else: site = web.get_form_value("site") if session_key: ticket_key = web.get_cookie(session_key) if ticket_key: security.login_with_session(ticket_key, add_access_rules=False) elif login and password: # get the site for this user login_site = site_obj.get_by_login(login) if login_site: site = login_site if site: site_obj.set_site(site) if login == "guest": pass else: login_cmd = WebLoginCmd() login_cmd.execute() ticket_key = security.get_ticket_key() elif ticket_key: if site: site_obj.set_site(site) login = security.login_with_ticket(ticket_key, add_access_rules=False, allow_guest=allow_guest) if not security.is_logged_in(): reset_password = web.get_form_value("reset_password") == 'true' if reset_password: from tactic.ui.widget import ResetPasswordCmd reset_cmd = ResetPasswordCmd(reset=True) try: reset_cmd.execute() except TacticException, e: print "Reset failed. %s" % e.__str__() # FIXME: not sure why this is here??? """
def set_scale(my, scale): browser = WebContainer.get_web().get_browser() if browser == 'Mozilla': my.add_style("-moz-transform", "scale(%s)" % scale) elif browser == 'Webkit': my.add_style("-webkit-transform", "scale(%s)" % scale)
return my.writeln("<pre>") my.writeln("An Error has occurred. Please see your Tactic Administrator<br/>") my.writeln( "Error Message: %s" % log.get_value("message") ) my.writeln("Error Id: %s" % log.get_id() ) my.writeln( log.get_value("stack_trace") ) my.writeln("</pre>") finally: # ensure that database connections are always closed DbContainer.close_all() # clear the container Container.delete() WebContainer.get_buffer().write( my.buffer.getvalue() ) def handle_not_logged_in(my, allow_change_admin=True): from pyasm.widget import WebLoginWdg, BottomWdg from tactic.ui.app import TitleTopWdg from pyasm.biz import Project from tactic.ui.panel import HashPanelWdg web = WebContainer.get_web() widget = Widget()
def _get_display(my): # set up the security object from pyasm.security import Security, Sudo from pyasm.biz import Project from pyasm.web import WebContainer web = WebContainer.get_web() security = Security() security = my.handle_security(security) is_logged_in = security.is_logged_in() # guest mode # allow_guest = Config.get_value("security", "allow_guest") if allow_guest == 'true': allow_guest = True else: allow_guest = False guest_mode = Config.get_value("security", "guest_mode") if not guest_mode: guest_mode = 'restricted' #allow_guest = True #guest_mode = "full" # if not logged in, then log in as guest if not is_logged_in: if not allow_guest: return my.handle_not_logged_in() else: # login as guest security = Security() my.handle_guest_security(security) # for here on, the user is logged in login_name = Environment.get_user_name() # check if the user has permission to see this project project = web.get_context_name() if project == 'default': override_default = Config.get_value("install", "default_project") if override_default: project = override_default if project != 'default': security_version = get_security_version() if security_version == 1: default = "view" access = security.check_access("project", project, "view", default="view") else: default = "deny" key = { "code": project } key2 = { "code": "*" } #keys = [key] keys = [key, key2] access = security.check_access("project", keys, "allow", default=default) else: # you always have access to the default project access = True access = True if not access: if login_name == "guest": from pyasm.widget import WebLoginWdg msg = web.get_form_value(WebLoginWdg.LOGIN_MSG) if not msg: msg = "User [%s] is not allowed to see this project [%s]" % (login_name, project) web.set_form_value(WebLoginWdg.LOGIN_MSG, msg) return my.handle_not_logged_in(allow_change_admin=False) else: from pyasm.widget import WebLicenseWdg, BottomWdg, Error403Wdg widget = Widget() top = my.get_top_wdg() widget.add( top ) widget.add( Error403Wdg() ) widget.add( BottomWdg() ) widget.get_display() return if login_name == 'guest' and guest_mode == "full": # some extra security for guest users guest_url_allow = Config.get_value("security", "guest_url_allow") if guest_url_allow: items = guest_url_allow.split("|") allowed = False if my.hash: url = my.hash[0] else: url = "index" for item in items: item = item.strip("/") if item == url: allowed = True break if not allowed: return my.handle_not_logged_in() # some extra precautions in guest mode if login_name == 'guest' and guest_mode != "full": # show a restricted guest mode from pyasm.widget import WebLoginWdg, BottomWdg from tactic.ui.app import TitleTopWdg from pyasm.biz import Project from tactic.ui.panel import HashPanelWdg web = WebContainer.get_web() widget = Widget() top = TitleTopWdg() widget.add(top) body = top.get_body() body.add_gradient("background", "background", 5, -20) body.add_color("color", "color") # get the project from the url because we are still # in the admin project at this stage current_project = web.get_context_name() try: if current_project != "default": project = Project.get_by_code(current_project) assert project except Exception, e: web_wdg = None else: if not current_project or current_project == "default": current_project = Config.get_value("install", "default_project") if current_project and current_project != "default": Project.set_project(current_project) web_wdg = HashPanelWdg.get_widget_from_hash("/guest", return_none=True) if web_wdg: web_wdg = web_wdg.get_buffer_display() top.add(web_wdg) else: web_wdg = None if not web_wdg: msg = "No widget for Guest defined" web.set_form_value(WebLoginWdg.LOGIN_MSG, msg) top.add(WebLoginWdg() ) # create a web app and run it through the pipeline web_app = WebApp() web_app.get_display(widget) return
class BaseAppServer(Base): '''The base application server class that handles the top level processing of a given page. Different applications will derive off of this class to implement how the resulting html will go to the server''' ONLOAD_EVENT = "body_onload" if PROFILE: profile.object = None def __init__(my): my.top = None my.hash = None super(BaseAppServer,my).__init__() def writeln(my, string): my.buffer.write(string) def get_display(my): profile_flag = False if profile_flag: BaseAppServer.profile.object = my if os.name == 'nt': path = "C:/sthpw/profile" else: path = "/tmp/sthpw/temp/profile" profile.run( "from pyasm.web.app_server import BaseAppServer; BaseAppServer.profile()", path) p = pstats.Stats(path) p.sort_stats('cumulative').print_stats(30) print "*"*30 p.sort_stats('time').print_stats(30) else: my.execute() value = WebContainer.get_buffer().getvalue() WebContainer.clear_buffer() return value def profile(): my = BaseAppServer.profile.object my.execute() profile = staticmethod(profile) def execute(my): my.buffer = cStringIO.StringIO() try: try: # clear the main container for this thread Container.create() # clear the buffer WebContainer.clear_buffer() # initialize the web environment object and register it adapter = my.get_adapter() WebContainer.set_web(adapter) # get the display my._get_display() except SetupException, e: '''Display setup exception in the interface''' print "Setup exception: ", e.__str__() DbContainer.rollback_all() ExceptionLog.log(e) my.writeln("<h3>Tactic Setup Error</h3>" ) my.writeln("<pre>" ) my.writeln(e.__str__() ) my.writeln("</pre>" ) except DatabaseException, e: from tactic.ui.startup import DbConfigPanelWdg config_wdg = DbConfigPanelWdg() my.writeln("<pre>") my.writeln(config_wdg.get_buffer_display()) my.writeln("</pre>") except Exception, e: stack_trace = ExceptionLog.get_stack_trace(e) print stack_trace my.writeln("<pre>") my.writeln(stack_trace) my.writeln("</pre>") # it is possible that the security object was not set security = Environment.get_security() if not security: security = Security() WebContainer.set_security(security) log = None # ensure that database connections are rolled back try: DbContainer.rollback_all() except Exception, e2: print "Error: Could not rollback: ", e2.__str__() my.writeln("Error: Could not rollback: '%s'" % e2.__str__() ) stack_trace = ExceptionLog.get_stack_trace(e2) print stack_trace my.writeln("<pre>") my.writeln(stack_trace) my.writeln("</pre>") raise e
def init_web_container(my): # add the event container, initialization only event_container = EventContainer() WebContainer.set_event_container( event_container )
def add_onload_script(script): ''' this does not work on Login screen''' event = WebContainer.get_event_container() event.add_listener(BaseAppServer.ONLOAD_EVENT, script)