Пример #1
0
 def render_string(self, filename, **kwargs):
     '''
         Override render_string to use mako template.
         Like tornado render_string method, this method also
         pass request handler environment to template engine
     '''
     try:
         # if not self.is_mobile:
         #     template = self.LOOK_UP.get_template(filename)
         # else:
         #     template = self.LOOK_UP_MOBILE.get_template(filename)
         template = self.LOOK_UP.get_template(filename)
         env_kwargs = dict(
             handler=self,
             request=self.request,
             locale=self.locale,
             _=self.locale.translate,
             static_url=self.static_url,
             xsrf_form_html=self.xsrf_form_html,
             reverse_url=self.application.reverse_url,
             agent=self.agent,
         )
         env_kwargs.update(kwargs)
         return template.render(**env_kwargs)
     except:
         from mako.exceptions import RichTraceback
         tb = RichTraceback()
         for (module_name, line_no, function_name, line) in tb.traceback:
             print('File:{}, Line:{} in {}'.format(module_name, line_no,
                                                   function_name))
             print(line)
         access_log.error('Render {} failed, {}:{}'.format(
             filename, tb.error.__class__.__name__, tb.error),
                          exc_info=True)
         raise HTTPError(500, 'Render page failed')
Пример #2
0
    def render_to_string(self, template=False, values={}):
        """ Automatically convert's a template BFORM_TYPE to a named type 
        if it exists in BFORM_TN """
        if not self.templates.has_key(template):
            # Messy hack for py 2.4
            if type(template) == type(1):
                template = "t%d" % template
            try:
                log.debug("render_to_string translating template %s" %
                          template)
                self.templates[template] = self.lookup.get_template(
                    "%s.mako" % bform.BFORM_TN[int(template[1:])])
            except:
                self.templates[template] = self.lookup.get_template(template)

        if type(values) != type({}):
            raise ValueError(
                "render_to_string called with bad arguments (bad dict)")

        rendered_template = ""
        try:
            rendered_template = self.templates[template].render_unicode(
                state=self.state, **values)
        except:
            log.exception(exceptions.text_error_template().render())
            traceback = RichTraceback()
            for (filename, lineno, function, line) in traceback.traceback:
                print "File %s, line %s, in %s" % (filename, lineno, function)
                print line, "\n"
            print "%s: %s" % (str(
                traceback.error.__class__.__name__), traceback.error)
            rendered_template = "Error: See log\n"
            raise

        return rendered_template
Пример #3
0
    def render(self, template_name, **kwargs):
        """ Redefine the render """

        t = self.lookup.get_template(template_name)

        args = dict(
            handler=self,
            request=self.request,
            current_user=self.current_user,
            locale=self.locale,
            _=self.locale.translate,
            static_url=self.static_url,
            xsrf_form_html=self.xsrf_form_html,
            xsrf_cookie=self.xsrf_cookie,
            reverse_url=self.application.reverse_url,
            LANGUAGES=self.settings['LANGUAGES'],
            STATIC_URL=self.settings['STATIC_URL'],
            THEME_URL=self.settings['THEME_URL'],
            THEME=self.settings['THEME'],
            theme_url=self.theme_url,

            #method
            htime=htime,
            ftime=ftime,
            has_permission=self.has_permission,
            show_error=show_error,
            b2s=b2s,
        )

        args.update(kwargs)

        # We can define keyword in views with initialize()
        if hasattr(self, 'view_kwargs'):
            args.update(self.view_kwargs)

        # TODO: more readable bug track
        # http://docs.makotemplates.org/en/latest/usage.html#handling-exceptions
        try:
            html = t.render(**args)
        except:
            traceback = RichTraceback()
            html = u'''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" href="/static/css/mako.css" />
    <title>LuoYun Mako Template System Trac Info</title>
  </head>
  <body>
    <h1>LuoYun Mako Template System Trac Info</h1>
    <pre>'''
            for (filename, lineno, function, line) in traceback.traceback:
                html += "File %s, line %s, in %s" % (filename, lineno,
                                                     function)
                html += "%s\n" % line
            html += "%s: %s" % (str(
                traceback.error.__class__.__name__), traceback.error)
            html += "</pre></body></html>"
        self.finish(html)
Пример #4
0
 def render(self, *args, **kwargs):
     self.context['makoStartTime'] = time.time()
     context = self.context
     context.update(kwargs)
     # noinspection PyBroadException
     try:
         if self.test_exception:
             raise Exception('This is a test Exception')
         return self.template.render_unicode(*args, **context)
     except Exception as error:
         logger.info(f'A mako error occurred: {error}')
         context['title'] = '500'
         context['header'] = _('Mako Error')
         context['backtrace'] = RichTraceback(error=error)
         lookup = TemplateLookup(
             directories=[
                 os.path.join(settings.PROG_DIR,
                              "gui/" + settings.GUI_NAME + "/views/")
             ],
             strict_undefined=settings.BRANCH
             and settings.BRANCH != 'master',
             format_exceptions=True,
         )
         return lookup.get_template('500.mako').render_unicode(
             *args, **context)
Пример #5
0
def render_page(page_info, use_local_sources=False):
    try:
        if use_local_sources:
            package_file = open(page_info.datafile)
            package_dict = json.loads(package_file.read())
        else:
            package_dict = requests.get(url_stem + page_info.datafile).json()
    except:
        sys.stderr.write("Error reading package JSON info from \"%s\".\n" %
                         page_info.datafile)
        raise

    package_dict["generated"] = make_friendlier_datetime(
        package_dict["generated"])

    page_template = get_mako_template(page_info.template)

    # Exception code from: https://docs.makotemplates.org/en/latest/usage.html#handling-exceptions
    try:
        with open(page_info.output, "w") as f:
            f.write(postproc(page_template.render(p=package_dict)))
    except:
        traceback = RichTraceback()
        for (filename, lineno, function, line) in traceback.traceback:
            print("File %s, line %s, in %s" % (filename, lineno, function))
            print(line, "\n")
        print("%s: %s" %
              (str(traceback.error.__class__.__name__), traceback.error))
        raise
Пример #6
0
    def tcpip(self, interface=None, essid=None, channel=None):
        # Define this variable in case wireless configuration information is
        # passed into this method.
        iwconfigs = ''

        # Test to see if the interface argument has been passed.  If it hasn't
        # then this method is being called from Gateways.wireless(), so
        # populate it from the class attribute variable.
        if interface is None:
            interface = self.interface

        # If an ESSID and channel were passed to this method, store them in
        # class attributes.
        if essid:
            self.essid = essid
            iwconfigs = '<p>Wireless network configuration:</p>\n'
            iwconfigs = iwconfigs + '<p>ESSID: ' + essid + '</p>\n'
        if channel:
            self.channel = channel
            iwconfigs = iwconfigs + '<p>Channel: ' + channel + '</p>\n'

        # Run the "Are you sure?" page through the template interpeter.
        try:
            page = templatelookup.get_template("/gateways/confirm.html")
            return page.render(title = "Enable gateway?",
                               purpose_of_page = "Confirm gateway mode.",
                               interface = interface, iwconfigs = iwconfigs)
        except:
            traceback = RichTraceback()
            for (filename, lineno, function, line) in traceback.traceback:
                print "\n"
                print "Error in file %s\n\tline %s\n\tfunction %s" % (filename, lineno, function)
                print "Execution died on line %s\n" % line
                print "%s: %s" % (str(traceback.error.__class__.__name__),
                    traceback.error)
Пример #7
0
    def tmpl_out(self, tmpl_fname, **kwargs):
        """
        templating shortcut, populated with the default app attributes
        """
        # pass the app object
        kwargs['app'] = self
        # production flag
        kwargs['prod'] = (cherrypy.config['server.environment']
                          == 'production')

        tmpl = self.tmpl_lookup.get_template(tmpl_fname)

        # Render the template
        # If an exception occurs, render an error page showing the traceback
        try:
            return tmpl.render(**kwargs)
        except:
            traceback_string = "<h1>IPOL template rendering error</h1>"
            traceback_string += "<h2>Template: %s</h2>" % tmpl_fname
            traceback_string += "<h2>kwargs: %s</h2>" % kwargs
            traceback = RichTraceback()
            for (filename, lineno, function, line) in traceback.traceback:
                traceback_string += \
                    "File <b>%s</b>, line <b>%d</b>, in <b>%s</b><br>" % \
                    (filename, lineno, function)
                traceback_string += line + "<br><br>"
            traceback_string += "%s: %s" % \
                (str(traceback.error.__class__.__name__), \
                traceback.error) + "<br>"
            return traceback_string
Пример #8
0
def lineage_report(template, command, time, today, data, report_stem, lineage,
                   flight_figure, import_report, raw_data_csv):
    mytemplate = Template(filename=template)
    buf = StringIO()

    import_data = parse_import_data(import_report)
    raw_data = parse_raw_data(raw_data_csv)

    ctx = Context(buf,
                  command=command,
                  timestamp=time,
                  date=today,
                  version=__version__,
                  summary_data=data,
                  lineage_data=[lineage],
                  flight_figure=flight_figure,
                  import_report=import_data,
                  raw_data=raw_data)

    try:
        mytemplate.render_context(ctx)
    except:
        traceback = RichTraceback()
        for (filename, lineno, function, line) in traceback.traceback:
            print("File %s, line %s, in %s" % (filename, lineno, function))
            print(line, "\n")
        print("%s: %s" %
              (str(traceback.error.__class__.__name__), traceback.error))

    with open(f"{report_stem}_{lineage}.html", "w") as fw:
        fw.write(buf.getvalue())
Пример #9
0
def render_template(destination, **kwargs):
    """ Renders the Mako template, and writes output file to the specified destination.

    Args:
        destination (Path): Location of the output file.
        **kwargs (dict): Variables to be used in the Mako template.

    Raises:
        ERROR: Error log containing information about the line where the exception occurred.
        Exception: Re-raised Exception coming from Mako template.
    """
    destination.parent.mkdir(parents=True, exist_ok=True)
    with open(str(destination), 'w', newline='\n',
              encoding='utf-8') as rst_file:
        template = Template(filename=str(TEMPLATE_FILE),
                            output_encoding='utf-8',
                            input_encoding='utf-8')
        try:
            template.render_context(Context(rst_file, **kwargs))
        except Exception as exc:
            traceback = RichTraceback()
            logging.error(
                "Exception raised in Mako template, which will be re-raised after logging line info:"
            )
            logging.error("File %s, line %s, in %s: %r",
                          *traceback.traceback[-1])
            raise exc
Пример #10
0
 def render(self, *args, **kwargs):
     self.context["makoStartTime"] = time.time()
     context = self.context
     context.update(kwargs)
     # noinspection PyBroadException
     try:
         if self.test_exception:
             raise Exception("This is a test Exception")
         return self.template.render_unicode(*args, **context)
     except Exception as error:
         logger.info(f"A mako error occurred: {error}")
         context["title"] = "500"
         context["header"] = _("Mako Error")
         context["backtrace"] = RichTraceback(error=error)
         lookup = TemplateLookup(
             directories=[
                 os.path.join(settings.PROG_DIR,
                              "gui/" + settings.GUI_NAME + "/views/")
             ],
             strict_undefined=settings.BRANCH
             and settings.BRANCH != "master",
             format_exceptions=True,
         )
         return lookup.get_template("500.mako").render_unicode(
             *args, **context)
Пример #11
0
    def render_string(self, template_path, **kwargs):
        namespace = dict(
            handler=self,
            request=self.request,
            current_user=self.current_user,
            # locale=self.locale,
            # _=self.locale.translate,
            # pgettext=self.locale.pgettext,
            static_url=self.static_url,
            xsrf_form_html=self.xsrf_form_html,
            reverse_url=self.reverse_url,
            # custom
            s=lambda x: u"\"{0}\"".format(x),
        )

        # 如果标题未设置,设置一个默认值
        if self.title:
            namespace['title'] = self.title
        else:
            namespace['title'] = settings.DEFAULT_HTML_TITLE

        namespace.update(self.data)
        namespace.update(kwargs)

        try:
            html = self.application.template_lookup.get_template(
                template_path).render(**namespace)
        except:
            html = self.application.template_lookup.get_template(
                'mako_failed.html').render(traceback=RichTraceback())

        return html
Пример #12
0
    def render(self, *args, **kwargs):
        """
        Render the Page template
        """
        for key in self.arguments:
            if key not in kwargs:
                kwargs[key] = self.arguments[key]

        kwargs['makoStartTime'] = time.time()
        try:
            return self.template.render_unicode(*args, **kwargs)
        except Exception:
            kwargs['title'] = '500'
            kwargs['header'] = 'Mako Error'
            kwargs['backtrace'] = RichTraceback()
            for (filename, lineno, function,
                 _) in kwargs['backtrace'].traceback:
                logger.log(
                    u'File {name}, line {line}, in {func}'.format(
                        name=filename, line=lineno, func=function),
                    logger.DEBUG)
            logger.log(u'{name}: {error}'.format(
                name=kwargs['backtrace'].error.__class__.__name__,
                error=kwargs['backtrace'].error))
            return get_lookup().get_template('500.mako').render_unicode(
                *args, **kwargs)
Пример #13
0
    def addtomesh(self, interface=None):
        # Store the name of the network interface and whether or not it's
        # enabled in the object's attributes.  Right now only the Babel
        # protocol is supported, so that's hardcoded for the moment (but it
        # could change in later releases).
        self.interface = interface
        self.protocol = 'babel'
        self.enabled = 'no'

        # Render the HTML page.
        try:
            page = templatelookup.get_template("/mesh/addtomesh.html")
            return page.render(title="Byzantium Node Mesh Configuration",
                               purpose_of_page="Enable Mesh Interfaces",
                               interface=self.interface,
                               protocol=self.protocol)
        except:
            traceback = RichTraceback()
            for (filename, lineno, function, line) in traceback.traceback:
                print "\n"
                print "Error in file %s\n\tline %s\n\tfunction %s" % (
                    filename, lineno, function)
                print "Execution died on line %s\n" % line
                print "%s: %s" % (str(
                    traceback.error.__class__.__name__), traceback.error)
Пример #14
0
 def get_populated_label(self, delivery, sender, address, option, kwargs):
     zpl_file = self._service
     if self._specific_label:
         # in this case, you must use a really specific label
         # (some 'commerçant' use case)
         zpl_file += '_' + self._specific_label
     zpl_file += '.mako'
     zpl_file_path = os.path.join(os.path.dirname(__file__), 'report',
                                  zpl_file)
     with open(zpl_file_path, 'r') as opened_file:
         file_content = opened_file.read()
         self.validate_mako(file_content, delivery, sender, address, option,
                            kwargs)
         try:
             #print 'd', delivery, '\na', address, '\ns', sender, '\no', kwargs
             zpl = Template(file_content).render(d=delivery,
                                                 s=sender,
                                                 a=address,
                                                 o=option,
                                                 **kwargs)
             content = zpl.encode(encoding=CODING, errors=ERROR_BEHAVIOR)
             if self._test_name:
                 self._record_unit_test_datas(content, delivery, sender,
                                              address, option, kwargs)
         except:
             traceback = RichTraceback()
             self.extract_mako_error(traceback, zpl_file)
         return content
Пример #15
0
def __unitTestTraceback():
    from mako.exceptions import RichTraceback
    traceback = RichTraceback()
    print "\n\n-------------START TRACEBACK-------------\n"
    for (filename, lineno, function, line) in traceback.traceback:
        print "File %s, line %s, in %s" % (filename, lineno, function)
        print line
    print "%s: %s" % (str(traceback.error.__class__.__name__), traceback.error)
    print "\n\n-------------END TRACEBACK---------------\n"
Пример #16
0
    def render(self, context=None, request=None):
        """
        Render the template with a given context. Here we're adding
        some context variables that are required for all templates in
        the system like the statix url and the CSRF tokens, etc.

        :param context: It must be a dict if provided
        :param request: It must be a django.http.HttpRequest if provided
        :return: A rendered template
        """
        if context is None:
            context = {}

        context['static'] = static
        context['url'] = self.get_reverse_url()

        if request is not None:
            # As Django doesn't have a global request object,
            # it's useful to put it in the context.
            context['request'] = request
            # Passing the CSRF token is mandatory.
            context['csrf_input'] = csrf_input_lazy(request)
            context['csrf_token'] = csrf_token_lazy(request)

        try:
            return self.template.render(**context)
        except Exception as e:
            traceback = RichTraceback()

            source = traceback.source
            if not source:
                # There's no template source lines then raise
                raise e

            source = source.split('\n')
            line = traceback.lineno
            top = max(0, line - 4)
            bottom = min(len(source), line + 5)
            source_lines = [(i + 1, source[i]) for i in range(top, bottom)]

            e.template_debug = {
                'name': traceback.records[5][4],
                'message': '{}: {}'.format(traceback.errorname,
                                           traceback.message),
                'source_lines': source_lines,
                'line': line,
                'during': source_lines[line - top - 1][1],
                'total': bottom - top,
                'bottom': bottom,
                'top': top + 1,
                # mako's RichTraceback doesn't return column number
                'before': '',
                'after': '',
            }

            raise e
Пример #17
0
def try_generate_page(file_name):
    try:
        page = content.get_template(file_name)
        with codecs.open('/'.join([OUTPUT_FOLDER, file_name]),
                         encoding=FILE_ENCODING,
                         mode='w') as output_file:
            output_file.write(page.render_unicode())
        print "*** Successfully generated page: %s" % (file_name)
    except:
        traceback = RichTraceback()
        print_traceback(traceback)
Пример #18
0
    def wireless(self, interface=None):
        # Store the name of the network interface chosen by the user in the
        # object's attribute set and then generate the name of the client
        # interface.
        self.mesh_interface = interface
        self.client_interface = interface + ':1'

        # Default settings for /network/wireless.html page.
        channel = 3
        essid = 'Byzantium'

        # This is a hidden class attribute setting, used for sanity checking
        # later in the configuration process.
        self.frequency = frequencies[channel - 1]

        # Set up the warning in case the interface is already configured.
        warning = ''

        # If a network interface is marked as configured in the database, pull
        # its settings and insert them into the page rather than displaying the
        # defaults.
        connection = sqlite3.connect(self.netconfdb)
        cursor = connection.cursor()
        template = (interface, )
        cursor.execute(
            "SELECT enabled, channel, essid FROM wireless WHERE mesh_interface=?;",
            template)
        result = cursor.fetchall()
        if result and (result[0][0] == 'yes'):
            channel = result[0][1]
            essid = result[0][2]
            warning = '<p>WARNING: This interface is already configured!  Changing it now will break the local mesh!  You can hit cancel now without changing anything!</p>'
        connection.close()

        # The forms in the HTML template do everything here, as well.  This
        # method only accepts input for use later.
        try:
            page = templatelookup.get_template("/network/wireless.html")
            return page.render(
                title="Configure wireless for Byzantium node.",
                purpose_of_page="Set wireless network parameters.",
                warning=warning,
                interface=self.mesh_interface,
                channel=channel,
                essid=essid)
        except:
            traceback = RichTraceback()
            for (filename, lineno, function, line) in traceback.traceback:
                print "\n"
                print "Error in file %s\n\tline %s\n\tfunction %s" % (
                    filename, lineno, function)
                print "Execution died on line %s\n" % line
                print "%s: %s" % (str(
                    traceback.error.__class__.__name__), traceback.error)
Пример #19
0
def write_template_to_string(template_filename, **kwargs):
    try:
        template = Template(filename=template_filename)
        # Split + Join fixes line-endings for whatever platform you are using
        return '\n'.join(template.render(**kwargs).splitlines())
    except:
        traceback = RichTraceback()
        for (filename, lineno, function, line) in traceback.traceback:
            print("File %s, line %s, in %s" % (filename, lineno, function))
            print(line, "\n")
        print("%s: %s" % (str(traceback.error.__class__.__name__), traceback.error))
Пример #20
0
 def render(self, renderJobs=None):
     """ Does the render. 
     It goes threw the renderJobs and renders all.
     """
     if renderJobs is not None:
         self.renderJobs = renderJobs
         
     for k, job in self.renderJobs['jobs'].items():
         try:
             #
             # Render the file. Note, that the output of folowing codes is
             #  syntatically/semantically correct but hard to  read. So post process needed.
             #
             logging.info("  Start rendering jobs, named: '%s' ...", k)
             
             # fetch render template
             mylookup = TemplateLookup(directories=[resourcepath])
             mytemplate = mylookup.get_template(job['templateFile'])
             # DO the RENDER
             generated_code = mytemplate.render(
                     lic=MIT_LICENSE,
                     commondata = self.renderJobs['common'],
                     renderdata = job['renderdata']
                     )
             
             #
             # Beautifier
             # Make more readable the output file.
             #
             
             logging.info("  Start beautifier ...")
             # Fetch beautifier parameters:
             indentUnit=self.renderJobs['common']['indentUnit']
             beautifierFunc = job['beautifierFunc']
             method_to_call = getattr(sys.modules[__name__], beautifierFunc)
             # BEAUTIFY:
             generated_code = method_to_call(generated_code, indentUnit=indentUnit)
             
             # save file:
             outdir=self.db['configuration']['hdl']['rtlPath']
             os.makedirs(outdir, exist_ok=True)
             filename =  job['outFilename']
             outfile = os.path.abspath(os.path.join(outdir, filename))
             logging.info("  Saving file to %s ...", outfile)
             with open(outfile, 'w',  newline='\n') as f:
                 f.write('\n'.join(generated_code))
         except:
             traceback = RichTraceback()
             for (filename, lineno, function, line) in traceback.traceback:
                 print("File %s, line %s, in %s" % (filename, lineno, function))
                 print(line, "\n")
             print("%s: %s" % (str(traceback.error.__class__.__name__), traceback.error))
Пример #21
0
 def apply_template(self, source):
     if self.template_encoding != 'ascii':
         source = unicode(source, self.template_encoding)
     try:
         return self.template.render(jsliteral=jsliteral, source=source)
     except Exception, err:
         traceback = RichTraceback()
         for (filename, lineno, function, line) in traceback.traceback:
             print "File %s, line %s, in %s" % (filename, lineno, function)
             print line, "\n"
         print "%s: %s" % (str(traceback.error.__class__.__name__), traceback.error)
         print
         raise err
Пример #22
0
def generate_template(template_name,
                      template_params,
                      dest_file,
                      in_zip_file=False):
    try:
        module_name = template_params['metadata'].config['module_name']
        lookup = TemplateLookup(directories=[
            'build/templates', 'src/{0}/templates'.format(module_name)
        ])
        template = Template(filename=template_name, lookup=lookup)
        rendered_template = template.render(
            template_parameters=template_params)

    except Exception:
        # Because mako expands into python, we catch all errors, not just MakoException.
        # Ideally, we'd use text_error_template, but it sucks.  html_error_template,
        # however, is useful.  Unfortunately emitting html isn't acceptable.  So we
        # re-implement using mako.exceptions.RichTraceback here.
        tback = RichTraceback(traceback=None)
        line = tback.lineno
        lines = tback.source.split('\n')

        # The underlying error.
        logging.error("\n%s: %s\n" %
                      (str(tback.error.__class__.__name__), str(tback.error)))
        logging.error("Offending Template: %s\n" % template_name)

        # Show a source listing of the template, with offending line marked.
        for index in range(max(0, line - 4), min(len(lines), line + 5)):
            if index + 1 == line:
                logging.error(">> %#08d: %s" % (index + 1, lines[index]))
            else:
                logging.error("   %08d: %s" % (index + 1, lines[index]))

        logging.error("\nTraceback (most recent call last):")
        for (filename, lineno, function, line) in tback.reverse_traceback:
            logging.error("   File %s, line %d, in %s\n     %s" %
                          (filename, lineno, function, line))

        logging.error("\n")
        sys.exit(1)

    logging.debug(rendered_template)
    if sys.version_info.major < 3:
        file_handle_public = codecs.open(dest_file, mode="w", encoding='utf-8')
        file_handle_public.write(rendered_template)
        file_handle_public.close()
    else:
        file_handle_public = open(dest_file, 'wb')
        file_handle_public.write(bytes(rendered_template, "UTF-8"))
        file_handle_public.close()
Пример #23
0
    def __call__(self, path, target, url_target, **options):
        target = os.path.splitext(target)[0] + '.html'

        with codecs.open(path, "r", "utf8") as f:
            content = f.read() + _FOOTER % {'cnd': self.config['cnd']}
            doctree = publish_doctree(content)

        title = doctree.children[0].astext()
        target = os.path.splitext(target)[0] + '.html'
        paths = target.split('/')
        is_article = len(paths) > 2

        paragraphs = [
            '<p>%s</p>' % _tree(text, url_target, title, self.config)
            for text in doctree.children[1:]
        ]

        # loading sections
        doc_sections = get_document_index(url_target,
                                          title).get('sections', [])
        mytemplate = Template(filename=self.config['generic'],
                              lookup=self.lookup)

        body = u'\n'.join(paragraphs)
        #body = body.replace(u'--', u'—')
        if is_article:
            index(url_target, title, 'body', body)

        logger.info('Generating %r' % target)

        with codecs.open(target, 'w', encoding='utf8') as f:
            try:
                f.write(
                    mytemplate.render(body=body,
                                      title=title,
                                      doc_sections=doc_sections,
                                      **options))
            except Exception:
                traceback = RichTraceback()
                for filename, lineno, function, line in traceback.traceback:
                    print "File %s, line %s, in %s" % (filename, lineno,
                                                       function)
                    print line, "\n"
                raise

        paths = target.split('/')
        if is_article:
            index(url_target, title, 'volume', paths[1])

        save_index(self.config['metadata'])
Пример #24
0
 def render(self, *args, **kwargs):
     self.context['makoStartTime'] = time.time()
     context = self.context
     context.update(kwargs)
     # noinspection PyBroadException
     try:
         return self.template.render_unicode(*args, **context)
     except Exception as error:
         print(error)
         context['title'] = '500'
         context['header'] = _('Mako Error')
         context['backtrace'] = RichTraceback()
         return get_lookup().get_template('500.mako').render_unicode(
             *args, **context)
Пример #25
0
    def render(self, *args, **kwargs):
        for key in self.arguments:
            if key not in kwargs:
                kwargs[key] = self.arguments[key]

        kwargs['makoStartTime'] = time.time()
        # noinspection PyBroadException
        try:
            return self.template.render_unicode(*args, **kwargs)
        except Exception:
            kwargs['title'] = '500'
            kwargs['header'] = _('Mako Error')
            kwargs['backtrace'] = RichTraceback()
            return get_lookup().get_template('500.mako').render_unicode(*args, **kwargs)
Пример #26
0
    def render(self, template_name=None, return_string=False, **kwargs):
        """ Redefine the render """

        if not template_name:
            template_name = self.template_path

        t = self.lookup.get_template(template_name)

        args = dict(
            handler=self,
            request=self.request,
            current_user=self.current_user,
            locale=self.locale,
            _=self.locale.translate,
            static_url=self.static_url,
            xsrf_form_html=self.xsrf_form_html,
            xsrf_cookie=self.xsrf_cookie,
            reverse_url=self.application.reverse_url,
            LANGUAGES=self.settings['LANGUAGES'],
            STATIC_URL=self.settings['STATIC_URL'],
            THEME_URL=self.settings['THEME_URL'],
            THEME=self.settings['THEME'],
            theme_url=self.theme_url,

            #method
            htime=htime,
            ftime=ftime,
            has_permission=self.has_permission,
            show_error=show_error,
            b2s=b2s,
            title=self.title,
        )

        args.update(kwargs)

        # We can set keyword with initialize() or prepare()
        args.update(self.prepare_kwargs)

        # TODO: more readable bug track
        # http://docs.makotemplates.org/en/latest/usage.html#handling-exceptions
        try:
            html = t.render(**args)
        except:
            traceback = RichTraceback()
            t = self.lookup.get_template('mako_failed.html')
            html = t.render(traceback=traceback)

        if return_string: return html

        self.finish(html)
Пример #27
0
    def __call__(self, path, target, url_target, **options):
        target = os.path.splitext(target)[0] + '.html'
        mytemplate = Template(filename=path, lookup=self.lookup)
        logger.info('Generating %r' % target)

        with codecs.open(target, 'w', encoding='utf8') as f:
            try:
                f.write(mytemplate.render(**options))
            except Exception:
                traceback = RichTraceback()
                for filename, lineno, function, line in traceback.traceback:
                    print "File %s, line %s, in %s" % (filename, lineno,
                                                       function)
                    print line, "\n"
                raise
Пример #28
0
    def render(self, context=None, request=None):
        """
        Render the template with a given context. Here we're adding
        some context variables that are required for all templates in
        the system like the statix url and the CSRF tokens, etc.

        :param context: It must be a dict if provided
        :param request: It must be a django.http.HttpRequest if provided
        :return: A rendered template
        """
        if context is None:
            context = {}

        for processor in self.engine.template_context_processors:
            context.update(processor(request))

        try:
            return self.template.render(**context)
        except Exception as e:
            traceback = RichTraceback()

            source = traceback.source
            if not source:
                # There's no template source lines then raise
                raise e

            source = source.split('\n')
            line = traceback.lineno
            top = max(0, line - 4)
            bottom = min(len(source), line + 5)
            source_lines = [(i + 1, source[i]) for i in range(top, bottom)]

            e.template_debug = {
                'name': traceback.records[5][4],
                'message': '{}: {}'.format(traceback.errorname,
                                           traceback.message),
                'source_lines': source_lines,
                'line': line,
                'during': source_lines[line - top - 1][1],
                'total': bottom - top,
                'bottom': bottom,
                'top': top + 1,
                # mako's RichTraceback doesn't return column number
                'before': '',
                'after': '',
            }

            raise e
Пример #29
0
def render_template(template, **data):
    ctx = context(**data)
    buf = ctx._buffer_stack[0]

    try:
        template.render_context(ctx)
        out = buf.getvalue()
        return out
    except:
        from mako.exceptions import RichTraceback
        traceback = RichTraceback()
        for (filename, lineno, function, line) in traceback.traceback:
            print "File %s, line %s, in %s" % (filename, lineno, function)
            print line
        print "%s: %s" % (str(
            traceback.error.__class__.__name__), traceback.error)
Пример #30
0
 def serve_template(self, template_name, **kwargs):
     try:
         if self.template_exists(template_name):
             template = self._template_exists_cache[template_name]
             return template.render(**kwargs)
         else:
             lookup = self._get_template_lookup()
             template = lookup.get_template(template_name)
             return template.render(**kwargs)
     except:
         traceback = RichTraceback()
         for (filename, lineno, function, line) in traceback.traceback:
             print("File %s, line %s, in %s" % (filename, lineno, function))
             print(line, "\n")
         print("%s: %s" %
               (str(traceback.error.__class__.__name__), traceback.error))