def _initBottle(self):

        # read project configuration templates
        with open(os.path.abspath(
                os.path.join(self.staticDir,
                             'templates/projectLandingPage.html')),
                  'r',
                  encoding='utf-8') as f:
            self.projLandPage_template = SimpleTemplate(f.read())

        with open(os.path.abspath(
                os.path.join(self.staticDir,
                             'templates/projectConfiguration.html')),
                  'r',
                  encoding='utf-8') as f:
            self.projConf_template = SimpleTemplate(f.read())

        self.panelTemplates = {}
        panelNames = os.listdir(
            os.path.join(self.staticDir, 'templates/panels'))
        for pn in panelNames:
            pnName, ext = os.path.splitext(pn)
            if ext.lower().startswith('.htm'):
                with open(os.path.join(self.staticDir, 'templates/panels', pn),
                          'r',
                          encoding='utf-8') as f:
                    self.panelTemplates[pnName] = SimpleTemplate(f.read())

        @self.app.route('/<project>/config/static/<filename:re:.*>')
        def send_static(project, filename):
            return static_file(filename, root=self.staticDir)

        @self.app.route('/<project>/config/panels/<panel>')
        def send_static_panel(project, panel):
            if self.loginCheck(project=project, admin=True):
                try:
                    return self.panelTemplates[panel].render(
                        version=AIDE_VERSION, project=project)
                except:
                    abort(404, 'not found')
            else:
                abort(401, 'forbidden')

        @self.app.route('/<project>')
        @self.app.route('/<project>/')
        def send_project_overview(project):

            # get project data (and check if project exists)
            try:
                projectData = self.middleware.getProjectInfo(
                    project,
                    ['name', 'description', 'interface_enabled', 'demomode'])
                if projectData is None:
                    return self.__redirect()
            except:
                return self.__redirect()

            if not self.loginCheck(project=project, extend_session=True):
                return self.__redirect(True, project)

            # render overview template
            try:
                username = html.escape(request.get_cookie('username'))
            except:
                username = ''

            return self.projLandPage_template.render(
                version=AIDE_VERSION,
                projectShortname=project,
                projectTitle=projectData['name'],
                projectDescription=projectData['description'],
                username=username)

        @self.app.route('/<project>/configuration')
        def send_project_config_page(project):

            #TODO
            if not self.loginCheck():
                return redirect('/')

            # get project data (and check if project exists)
            projectData = self.middleware.getProjectInfo(
                project,
                ['name', 'description', 'interface_enabled', 'demomode'])
            if projectData is None:
                return self.__redirect()

            if not self.loginCheck(project=project, extend_session=True):
                return redirect('/')

            if not self.loginCheck(
                    project=project, admin=True, extend_session=True):
                return redirect('/' + project + '/interface')

            # render configuration template
            try:
                username = html.escape(request.get_cookie('username'))
            except:
                username = ''

            return self.projConf_template.render(
                version=AIDE_VERSION,
                projectShortname=project,
                projectTitle=projectData['name'],
                username=username)

        @self.app.get('/<project>/getPlatformInfo')
        @self.app.post('/<project>/getPlatformInfo')
        def get_platform_info(project):
            if not self.loginCheck(project, admin=True):
                abort(401, 'forbidden')
            try:
                # parse subset of configuration parameters (if provided)
                try:
                    data = request.json
                    params = data['parameters']
                except:
                    params = None

                projData = self.middleware.getPlatformInfo(project, params)
                return {'settings': projData}
            except:
                abort(400, 'bad request')

        @self.app.get('/<project>/getProjectImmutables')
        @self.app.post('/<project>/getProjectImmutables')
        def get_project_immutables(project):
            if not self.loginCheck(project, admin=True):
                abort(401, 'forbidden')
            return {
                'immutables': self.middleware.getProjectImmutables(project)
            }

        @self.app.get('/<project>/getConfig')
        @self.app.post('/<project>/getConfig')
        def get_project_configuration(project):
            if not self.loginCheck(project=project, admin=True):
                abort(401, 'forbidden')
            try:
                # parse subset of configuration parameters (if provided)
                try:
                    data = request.json
                    params = data['parameters']
                except:
                    params = None

                projData = self.middleware.getProjectInfo(project, params)
                return {'settings': projData}
            except:
                abort(400, 'bad request')

        @self.app.post('/<project>/saveProjectConfiguration')
        def save_project_configuration(project):
            if not self.loginCheck(project=project, admin=True):
                abort(401, 'forbidden')
            try:
                settings = request.json
                isValid = self.middleware.updateProjectSettings(
                    project, settings)
                if isValid:
                    return {'success': isValid}
                else:
                    abort(400, 'bad request')
            except:
                abort(400, 'bad request')

        @self.app.post('/<project>/saveClassDefinitions')
        def save_class_definitions(project):
            if not self.loginCheck(project=project, admin=True):
                abort(401, 'forbidden')
            try:
                params = request.json
                classdef = params['classes']
                removeMissing = (params['remove_missing']
                                 if 'remove_missing' in params else False)
                if isinstance(classdef, str):
                    # re-parse JSON (might happen in case of single quotes)
                    classdef = json.loads(classdef)
                success = self.middleware.updateClassDefinitions(
                    project, classdef, removeMissing)
                if success:
                    return {'success': success}
                else:
                    abort(400, 'bad request')
            except Exception as e:
                abort(400, str(e))

        @self.app.post('/<project>/renewSecretToken')
        def renew_secret_token(project):
            if not self.loginCheck(project=project, admin=True):
                abort(401, 'forbidden')
            try:
                newToken = self.middleware.renewSecretToken(project)
                return {'secret_token': newToken}
            except:
                abort(400, 'bad request')

        @self.app.get('/<project>/getUsers')
        def get_project_users(project):
            if not self.loginCheck(project=project, admin=True):
                abort(401, 'forbidden')

            users = self.middleware.getProjectUsers(project)
            return {'users': users}

        @self.app.get('/<project>/getPermissions')
        def get_project_permissions(project):
            permissions = {
                'can_view': False,
                'can_label': False,
                'is_admin': False
            }

            # project-specific permissions
            config = self.middleware.getProjectInfo(project)
            if config['demomode']:
                permissions['can_view'] = True
                permissions['can_label'] = config['interface_enabled']
            isPublic = config['ispublic']
            if not isPublic and not self.loginCheck(project=project):
                # pretend project does not exist (TODO: suboptimal solution; does not properly hide project from view)
                abort(404, 'not found')

            # user-specific permissions
            userPrivileges = self.loginCheck(project=project, return_all=True)
            if userPrivileges['logged_in']:
                permissions['can_view'] = (
                    config['demomode'] or isPublic
                    or userPrivileges['project']['enrolled'])
                permissions['can_label'] = config['interface_enabled'] and (
                    config['demomode']
                    or userPrivileges['project']['enrolled'])
                permissions['is_admin'] = userPrivileges['project']['isAdmin']

            return {'permissions': permissions}

        ''' Project creation '''
        with open(os.path.abspath(
                os.path.join(
                    'modules/ProjectAdministration/static/templates/newProject.html'
                )),
                  'r',
                  encoding='utf-8') as f:
            self.newProject_template = SimpleTemplate(f.read())

        @self.app.route('/newProject')
        def new_project_page():
            if not self.loginCheck():
                return redirect('/')
            # if not self.loginCheck(canCreateProjects=True):
            #     abort(401, 'forbidden')
            username = html.escape(request.get_cookie('username'))
            return self.newProject_template.render(version=AIDE_VERSION,
                                                   username=username)

        @self.app.post('/createProject')
        def create_project():
            if not self.loginCheck(canCreateProjects=True):
                abort(401, 'forbidden')

            success = False
            try:
                username = html.escape(request.get_cookie('username'))

                # check provided properties
                projSettings = request.json
                success = self.middleware.createProject(username, projSettings)

            except Exception as e:
                abort(400, str(e))

            if success:
                return {'success': True}
            else:
                abort(500, 'An unknown error occurred.')

        @self.app.get('/verifyProjectName')
        def check_project_name_valid():
            if not self.loginCheck(canCreateProjects=True):
                abort(401, 'forbidden')

            try:
                projName = html.escape(request.query['name'])
                if len(projName):
                    available = self.middleware.getProjectNameAvailable(
                        projName)
                else:
                    available = False
                return {'available': available}

            except:
                abort(400, 'bad request')

        @self.app.get('/verifyProjectShort')
        def check_project_shortname_valid():
            if not self.loginCheck(canCreateProjects=True):
                abort(401, 'forbidden')

            try:
                projName = html.escape(request.query['shorthand'])
                if len(projName):
                    available = self.middleware.getProjectShortNameAvailable(
                        projName)
                else:
                    available = False
                return {'available': available}

            except:
                abort(400, 'bad request')
Ejemplo n.º 2
0
 def test_unicode(self):
     """ Templates: Unicode variables """
     t = SimpleTemplate('start {{var}} end').render(var=u'äöü')
     self.assertEqual(u'start äöü end', ''.join(t))
Ejemplo n.º 3
0
 def test_import(self):
     """ Templates: import statement"""
     t = '%from base64 import b64encode\nstart {{b64encode(var.encode("ascii") if hasattr(var, "encode") else var)}} end'
     t = SimpleTemplate(t).render(var='var')
     self.assertEqual(u'start dmFy end', ''.join(t))
Ejemplo n.º 4
0
 def test_winbreaks(self):
     """ Templates: Test windows line breaks """
     t = SimpleTemplate('%var+=1\r\n{{var}}\r\n')
     t = t.render(var=5)
     self.assertEqual(u'6\r\n', ''.join(t))
Ejemplo n.º 5
0
 def test_commentonly(self):
     """ Templates: Commentd should behave like code-lines (e.g. flush text-lines) """
     t = SimpleTemplate('...\n%#test\n...')
     self.failIfEqual('#test', t.code.splitlines()[0])
Ejemplo n.º 6
0
def template(name, **kw):
    # http://bottlepy.org/docs/dev/stpl.html
    path = os.path.join(TEMPLATE_FOLDER, name)
    with open(path) as f:
        template = SimpleTemplate(f.read())
    return template.render(api=api, **kw)
Ejemplo n.º 7
0
def render_template_text_env(text, **environment):
    """Render the template in the given environment."""
    from bottle import SimpleTemplate
    r = SimpleTemplate(text).render(**environment)
    return r
Ejemplo n.º 8
0
 def test_include(self):
     """ Templates: Include statements"""
     t = SimpleTemplate(name='stpl_include', lookup=['./views/'])
     self.assertEqual(u'before\nstart var end\nafter\n',
                      t.render(var='var'))
Ejemplo n.º 9
0
 def test_rebase(self):
     """ Templates: %rebase and method passing """
     t = SimpleTemplate(name='stpl_t2main', lookup=['./views/'])
     result = u'+base+\n+main+\n!1234!\n+include+\n-main-\n+include+\n-base-\n'
     self.assertEqual(result, t.render(content='1234'))
Ejemplo n.º 10
0
 def test_escaped_codelines(self):
     t = SimpleTemplate('%% test')
     self.assertEqual(u'% test', t.render())
     t = SimpleTemplate('%%% test')
     self.assertEqual(u'%% test', t.render())
Ejemplo n.º 11
0
 def test_nonobreak(self):
     """ Templates: Escaped nobreak statements"""
     t = SimpleTemplate("start\\\\\n\\\\\n%pass\nend")
     self.assertEqual(u'start\\\\\nend', t.render())
Ejemplo n.º 12
0
 def test_onelineblocks(self):
     """ Templates: one line code blocks """
     t = SimpleTemplate(
         "start\n%a=''\n%for i in l: a += str(i)\n{{a}}\nend")
     self.assertEqual(u'start\n123\nend', t.render(l=[1, 2, 3]))
     self.assertEqual(u'start\n\nend', t.render(l=[]))
Ejemplo n.º 13
0
sesStatTableTemplate = SimpleTemplate("""
% from ptracker_lib.helpers import format_datetime, unixtime2datetime
<div class="container">
    <div class="row page-header">
        <div class="col-md-6"><img src="/img/banner.png" title="Logo Track" class="ACimg">
        </div>
        <div class="col-md-6">
            <form class="form-horizontal collapse-group" role="form">
                <div class="form-group">
                    <label for="trackname" class="col-md-4 control-label">Track</label>
                    <div class="col-md-8">
                        <select id="trackname" name="trackname" class="multiselect form-control">
                              % for d in tracks:
                              %   t = d['track']
                              %   uit = d['uitrack']
                              %   if t == currtrack:
                              %     s = "selected"
                              %   else:
                              %     s = ""
                              %   end
                                <option {{!s}} value="{{t}}">{{uit}}</option>
                              % end
                        </select>
                    </div>
                    <label for="session_type" class="col-md-4 control-label">Type</label>
                    <div class="col-md-8">
                        <select id="session_type" name="session_type" class="form-control multiselect" multiple="multiple">
                            <option {{"selected" if "Practice" in session_types else ""}} value="Practice">Practice</option>
                            <option {{"selected" if "Qualify" in session_types else ""}} value="Qualify">Qualify</option>
                            <option {{"selected" if "Race" in session_types else ""}} value="Race">Race</option>
                        </select>
                    </div>
                </div>
%options_detailed = num_players > 0 or num_laps > 0 or datespan[0] != "" or datespan[1] != ""
                <div class="form-group collapse {{!"in" if options_detailed else ""}}" id="filterCollapse">
                    <div class="row">
                        <label for="num_players" class="col-md-4 control-label">Number of Players</label>
                        <div class="col-md-8">
                            <select id="num_players" name="num_players" class="form-control multiselect">
                                <option {{"selected" if num_players == 0 else ""}} value="0">any</option>
% for i in range(1,25):
                                <option {{"selected" if num_players == i else ""}} value="{{i}}">{{"%d or more" % i}}</option>
% end
                            </select>
                        </div>
                    </div>
                    <div class="row">
                        <label for="num_laps" class="col-md-4 control-label">Number of Laps</label>
                        <div class="col-md-8">
                            <select id="num_laps" name="num_laps" class="form-control multiselect">
                                <option {{"selected" if num_laps == 0 else ""}} value="0">any</option>
% for i in range(1,50):
                                <option {{"selected" if num_laps == i else ""}} value="{{i}}">{{"%d or more" % i}}</option>
% end
                            </select>
                        </div>
                    </div>
                    <div class="row">
                        <label for="datespan" class="col-md-4 control-label">Date</label>
                        <div id="datespan" class="col-md-8">
                            <div class="form-group row">
                                <label for="dateStart" class="col-md-2 control-label">From</label>
                                <div class="col-md-4">
                                    <input id="dateStart" class="datepicker form-control" data-date-format="yyyy-mm-dd" value="{{!datespan[0]}}" />
                                </div>
                                <label for="dateStop" class="col-md-2 control-label">To</label>
                                <div class="col-md-4">
                                    <input id="dateStop" class="datepicker form-control" data-date-format="yyyy-mm-dd" value="{{!datespan[1]}}" />
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="form-group">
<script>
function toggleCollapse(e, self) {
    var $e = $(e);
    var $collapse = $e.closest('.collapse-group').find('.collapse');
    var $self = $(self);
    console.log("toggleCollapse: " + $($self[0]).text());
    if( $($self[0]).text() == "+" )
    {
        $($self[0]).text("-");
        $collapse.collapse('show');
    } else
    {
        $($self[0]).text("+");
        $collapse.collapse('hide');
    }
}
</script>
                    <div class="col-md-offset-2 col-md-2">
                        <a class="form-control btn btn-info"
                           role="button"
                           onclick="toggleCollapse(getElementById('filterCollapse'), this)"
                           href="#">{{!"-" if options_detailed else "+"}}</a>
                    </div>
                    <div class="col-md-offset-0 col-md-4">
<script>
function ms_to_string(ms)
{
    res = '';
    for(var i=0; i < ms.length; i++) {
        if (ms.options[i].selected) {
            if (res != '') {
                res = res + ",";
            }
            res = res + ms.options[i].value
        }
    }
    return res;
}
function applySelections() {
    var track = document.getElementById("trackname").value;
    var startDate = document.getElementById("dateStart").value;
    var stopDate = document.getElementById("dateStop").value;
    var session_types = ms_to_string(document.getElementById("session_type"));
    var num_players = document.getElementById("num_players").value
    var num_laps = document.getElementById("num_laps").value
    window.location='sessionstat?track='+track+'&start='+startDate+'&stop='+stopDate+'&session_types='+session_types+'&num_players='+num_players+'&num_laps='+num_laps;
}
</script>
                        <a class="form-control btn btn-primary"
                           role="button"
                           onclick="applySelections()"
                           href="#">Show selected</a>
                    </div>
                    <div class="col-md-offset-0 col-md-4">
                        <a class="form-control btn btn-primary" href="sessionstat" role="button">Show all</a>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div class="row"><div class="col-md-12">
        <table class="table table-striped table-condensed table-bordered table-hover">
            <thead>
            <tr>
                <th>Track</th>
                <th>Type</th>
                <th>First</th>
                <th>Second</th>
                <th>Third</th>
                <th>Number of drivers</th>
                <th>Date</th>
            </tr>
            </thead>
            <tbody>
% for i,r in enumerate(sesStatRes):
            <tr class="clickableRow" href="sessiondetails?sessionid={{"%d" % r['id']}}#">
                <td>{{r['uitrack']}}</td>
                <td>{{r['type']}}</td>
                <td>{{"" if r['podium'][0] is None else r['podium'][0]}}</td>
                <td>{{"" if r['podium'][1] is None else r['podium'][1]}}</td>
                <td>{{"" if r['podium'][2] is None else r['podium'][2]}}</td>
                <td>{{r['numPlayers']}}</td>
                <td>
% ts = r.get('timeStamp', None)
% if ts is None:
%     ts = "-"
% else:
%     ts = format_datetime(unixtime2datetime(ts))
% end
                    {{ts}}
                </td>
            </tr>
% end
            </tbody>
        </table>
    </div></div>
</div>
""")
Ejemplo n.º 14
0
conn = sqlite3.connect('submissions.db')
c = conn.cursor()
c.execute(
    'CREATE TABLE IF NOT EXISTS submits (name text, suite text, filename text, result text)'
)
c.execute(
    'CREATE TABLE IF NOT EXISTS failure_message (submit_id integer, message text)'
)
c.execute(
    'CREATE TABLE IF NOT EXISTS sub_stats (submit_id integer, method text, path_edges_found integer, path_edges_missed integer, path_edges_extra integer, path_edges_dupes integer, leaks_found integer, leaks_missed integer, leaks_extra integer)'
)
conn.commit()
conn.close()

with open('demo.tpl') as f:
    tpl = SimpleTemplate(f.read())

with open('submits.tpl') as f:
    submits_tpl = SimpleTemplate(f.read())

with open('submit.tpl') as f:
    submit_tpl = SimpleTemplate(f.read())


@route('/')
def index(session):
    logged_in = session.get('username') is not None
    return tpl.render(error='',
                      logged_in=logged_in,
                      username=session.get('username'))
Ejemplo n.º 15
0
lapStatTableTemplate = SimpleTemplate("""
%from http_templates.tmpl_helpers import car_tmpl
%from stracker_lib import config
%from ptracker_lib.helpers import *
%
% alltyres = [("(SS)","Slicks Supersoft"),
%             ("(S)" ,"Slicks Soft"),
%             ("(M)" ,"Slicks Medium"),
%             ("(H)" ,"Slicks Hard"),
%             ("(SH)","Slicks Superhard"),
%             ("(ST)","Street"),
%             ("(SV)","Street Vintage"),
%             ("(SM)","Semislicks"),
%             ("(HR)","Hypercar Road"),
%             ("(I)" ,"Intermediate"),
%             ("(V)" ,"Vintage"),
%             ("(E)" ,"Eco")]
%
<script>
function toggleCollapse(e, self) {
    var $e = $(e);
    var $collapse = $e.closest('.collapse-group').find('.collapse');
    var $self = $(self);
    if( $($self[0]).text() == "+" )
    {
        $($self[0]).text("-");
        $collapse.collapse('show');
    } else
    {
        $($self[0]).text("+");
        $collapse.collapse('hide');
    }
}

function ms_to_string(ms)
{
    res = '';
    for(var i=0; i < ms.length; i++) {
        if (ms.options[i].selected) {
            if (res != '') {
                res = res + ",";
            }
            res = res + ms.options[i].value
        }
    }
    return res;
}

function ms_count(ms)
{
    res = 0;
    for(var i=0; i < ms.length; i++) {
        if (ms.options[i].selected) {
            res = res + 1;
        }
    }
    return res;
}

function applySelections() {
    var track = document.getElementById("trackname").value;
    var ranking = document.getElementById("ranking").value;
    var ms_cars = document.getElementById("cars");
    var ms_valid = document.getElementById("valid");
    var ms_tyres = document.getElementById("tyres");
    var ms_servers = document.getElementById("servers");
    var ms_groups = document.getElementById("groups");
    var server = "";
% if len(servers) > 1:
    if( (ms_count(ms_servers) < {{!len(servers)}}) && (ms_servers.length > 0) )
    {
        server = "&currservers=" + ms_to_string(ms_servers);
    }
% end
    var valid = ms_to_string(ms_valid);
    var cars = ms_to_string(ms_cars);
    var date_from = document.getElementById("dateStart").value;
    var date_to = document.getElementById("dateStop").value;
    var tyres = ms_to_string(ms_tyres);
    var groups = ms_to_string(ms_groups);
    if (ms_count(ms_tyres) < {{len(alltyres)}} ) {
        tyres = '&tyres='+tyres;
    } else
    {
        tyres = '';
    }
    if (ms_count(ms_groups) > 0) {
        groups = '&groups='+groups;
    } else
    {
        groups = '';
    }
    if (ranking != '0')
    {
        ranking = '&ranking='+ranking;
    } else
    {
        ranking = '';
    }
    window.location='lapstat?track='+track+'&cars='+cars+'&valid='+valid+'&date_from='+date_from+'&date_to='+date_to+tyres+server+groups+ranking;
}
</script>

<div class="container">
  <div class="page-header">
    <div class="row">
        <div class="col-md-6">
            <img src="/img/banner.png" title="Logo Track" class="ACimg">
        </div>
        <div class="col-md-6">
            <form class="form-horizontal collapse-group" role="form">
                <!-- *********** standard filters ************* -->
                <div class="form-group">
                    <label for="trackname" class="col-md-2 control-label">Track</label>
                    <div class="col-md-10">
                        <select id="trackname" name="trackname" class="multiselect form-control">
% for d in tracks:
%   t = d['track']
%   tui = d['uitrack']
%   if t == currtrack:
%     s = "selected"
%   else:
%     s = ""
%   end
                            <option {{!s}} value="{{t}}">{{tui}}</option>
% end
                        </select>
                    </div>
                    <label for="cars" class="col-md-2 control-label">Cars</label>
                    <div class="col-md-10">
                        <select id="cars" name="cars" class="form-control multiselect" multiple="multiple">
% for d in cars:
%   c = d['car']
%   uic = d['uicar']
%   if c in currcars:
%     s = "selected"
%   else:
%     s = ""
%   end
                            <option {{!s}} value="{{c}}">{{uic}}</option>
% end
                        </select>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div class="row">
        <!-- *********** detailed filters ************* -->
        <div class="col-md-12 collapse-group" id="filterCollapse">
            <div class="col-md-6">
                <form class="form-horizontal" role="form">
%options_detailed = not date_from[0] is None or not date_to[0] is None or valid != set([1,2]) or (not tyres is None and len(tyres) < len(alltyres)) or ranking != 0 or currgroups != []
                    <div class="form-group collapse {{!"in" if options_detailed else ""}}">
                        <div class="row">
                            <label for="valid" class="col-md-2 control-label">Valid</label>
                            <div class="col-md-10">
                                <select id="valid" name="valid" class="form-control multiselect" multiple="multiple">
                                    <option {{!"selected" if 1 in valid else ""}} value="1">valid</option>
                                    <option {{!"selected" if 2 in valid else ""}} value="2">unknown</option>
                                    <option {{!"selected" if 0 in valid else ""}} value="0">invalid</option>
                                </select>
                            </div>
                        </div>
                        <div class="row">
                            <label for="tyres" class="col-md-2 control-label">Tyres</label>
                            <div class="col-md-10">
                                <select id="tyres" name="tyres" class="form-control multiselect" multiple="multiple">
% for t in alltyres:
                                    <option {{!"selected" if tyres is None or t[0] in tyres else ""}} value="{{!t[0]}}">{{t[1]}}</option>
% end
                                </select>
                            </div>
                        </div>
                        <div class="row">
                            <label for="datespan" class="col-md-2 control-label">Date</label>
                            <div id="datespan" class="col-md-10">
                                <div class="form-group row">
                                    <label for="dateStart" class="col-md-2 control-label">From</label>
                                    <div class="col-md-3">
                                        <input id="dateStart" class="datepicker form-control" data-date-format="yyyy-mm-dd" value="{{date_from[1]}}" />
                                    </div>
                                    <label for="dateStop" class="col-md-2 control-label">To</label>
                                    <div class="col-md-3">
                                        <input id="dateStop" class="datepicker form-control" data-date-format="yyyy-mm-dd" value="{{date_to[1]}}" />
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
            <div class="col-md-6">
                <form class="form-horizontal" role="form">
                    <div class="form-group collapse {{!"in" if options_detailed else ""}}">
% if len(servers) > 1:
                        <div class="row">
                            <label for="servers" class="col-md-2 control-label">Servers</label>
                            <div class="col-md-10">
                                <select id="servers" name="servers" class="form-control multiselect" multiple="multiple">
% for s in servers:
                                    <option {{!"selected" if currservers is None or s in currservers else ""}} value="{{!s}}">{{s}}</option>
% end
                                </select>
                            </div>
                        </div>
% end
                        <div class="row">
                            <label for="ranking" class="col-md-2 control-label">Ranking</label>
                            <div class="col-md-10">
                                <select id="ranking" name="ranking" class="form-control multiselect">
                                    <option {{!"selected" if not ranking else ""}} value="0">Multiple cars and multiple drivers</option>
                                    <option {{!"selected" if ranking in [1,True] else ""}} value="1">One entry per driver</option>
                                    <option {{!"selected" if ranking == 2 else ""}} value="2">One entry per car</option>
                                </select>
                            </div>
                        </div>
                        <div class="row">
                            <label for="groups" class="col-md-2 control-label">Groups</label>
                            <div class="col-md-10">
                                <select id="groups" name="groups" class="form-control multiselect" multiple="multiple">
% for s in sorted(groups, key=lambda x: x['groupid']):
                                    <option {{!"selected" if not currgroups is None and s['groupid'] in currgroups else ""}} value="{{s['groupid']}}">{{s['name']}}</option>
% end
                                </select>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-6 col-md-offset-6">
            <form class="form-horizontal collapse-group" role="form">
                <!-- *********** buttons ************* -->
                <div class="form-group form-group">
                    <div class="col-md-offset-0 col-md-2">
                        <a class="form-control btn btn-info"
                           role="button"
                           onclick="toggleCollapse(getElementById('filterCollapse'), this)"
                           href="#">{{!"-" if options_detailed else "+"}}</a>
                    </div>
                    <div class="col-md-offset-0 col-md-5">
                        <a class="form-control btn btn-primary"
                           role="button"
                           onclick="applySelections()"
                           href="#">Show selected</a>
                    </div>
                    <div class="col-md-offset-0 col-md-5">
% if len(servers) <= 1:
                        <a class="form-control btn btn-primary" href="lapstat" role="button">Show last combo</a>
% else:
%   import urllib.parse
                        <div class="btn-group">
                            <button type="button" class="form-control btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                                Show last combo <span class="caret"></span>
                            </button>
                            <ul class="dropdown-menu">
%   for s in servers:
                                <li><a href="lapstat?currservers={{!urllib.parse.quote(s)}}" role="button">Server {{s}}</a>
%   end
                            </ul>
                        </div>
% end
                    </div>
                </div>
            </form>
        </div>
    </div>
    </div>
     <!-- <div class="row">
            <div class="col-md-12">
                <table class="table table-striped table-condensed table-bordered table-hover">
                    <thead>
                        <tr>
                            <th>Car</th>
                            <th>Valid Laps Completed</th>
                        </tr>
                     </thead>
                     <tbody>
                        <!-- loop through the cars -->
                        TODO - steps to get this working
                        1. output list of cars on server (use currcars?)
                        2. output number of valid laps for each car (total only, no dates involved)
                        3. implement date (show cars since xx/yy/zzzz)
                        4. show only the active cars
                        5. show invalid laps also (for shits and giggles)
                     </tbody>
                </table>
            </div>
      </div> -->
    <div class="row"><div class="col-md-12">
        <table class="table table-striped table-condensed table-bordered table-hover">
            <thead>
            <tr>
                <th>Pos</th>
                <th>Driver</th>
                <th>Car</th>
                <th>Best lap</th>
                <th>Gap to 1st</th>
% from ptracker_lib.helpers import isProMode, format_time_ms, format_datetime, unixtime2datetime, format_vel, format_temp
% for i in range(count):
                <th>{{'S%d' % (i+1)}}</th>
% end
%
% def collisions(r):
%     cEnv = r.get('collenv', None)
%     cCar = r.get('collcar', None)
%     if cEnv is None or cCar is None: res = '-'
%     else: res = str(cEnv+cCar)
%     end
%     res = res + "("
%     if cCar is None: res += "-"
%     else: res += str(cCar)
%     end
%     res += ")"
%     return res
% end
%
% def temps(r):
%     tAmb = r.get('tempAmbient', None)
%     tTrack = r.get('tempTrack', None)
%     res = '-' if tAmb is None else (format_temp(tAmb))
%     res += "/"
%     res += '-' if tTrack is None else (format_temp(tTrack))
%     return res
% end
%
% def format_tyre(r):
%     if r is None:
%        return "-"
%     end
%     import re
%     s = re.sub(r'.*\((.*)\)', r'\\1', r)
%     s = '?' if s == r else s
%     return s
% end
%
% add_columns = config.config.HTTP_CONFIG.lap_times_add_columns.split("+")
% add_columns_disp = {
%   'valid' : ('Valid', lambda r: ['no','yes','-'][r['valid']]),
%   'aids' : ('Aids', None),
%   'laps' : ('Laps', lambda r: r['numLaps']),
%   'date' : ('Date', lambda r: '-' if r.get('timeStamp', None) is None else format_datetime(unixtime2datetime(r.get('timeStamp', None)))),
%   'grip' : ('Grip', lambda r: '-' if r.get('grip', None) is None else "%.1f%%" % (r['grip']*100.)),
%   'cuts' : ('Cuts', lambda r: '-' if r.get('cuts', None) is None else r['cuts']),
%   'collisions' : ('Crashes (car/car)', lambda r: collisions(r)),
%   'tyres' : ('Tyres', lambda r: format_tyre(r.get('tyres', None))),
%   'temps' : ('Amb./Track', lambda r: temps(r)),
%   'ballast': ('Ballast', lambda r: "-" if r.get('ballast', None) is None else "%.1f kg" % r['ballast'] ),
%   'vmax': ('vMax', lambda r: "-" if r.get('maxSpeed', None) is None else format_vel(r['maxSpeed'])),
% }
% for c in add_columns:
                <th>{{add_columns_disp[c][0]}}</th>
% end
            </tr>
            </thead>
            <tbody>
% for i,r in enumerate(lapStatRes):
%   if r['bestServerLap']:
%       c = 'class="bestLap" '
%   else:
%       c = ''
%   end
            <tr class='clickableRow' href="lapdetails?lapid={{"%d" % r['id']}}#">
                <td {{!c}}>{{"%d." % r['pos']}}</td>
                <td {{!c}}>{{r['name']}}</td>
                <td {{!c}}>
                    {{!car_tmpl.render(car=r['car'], uicar=r['uicar'])}}
                </td>
                <td {{!c}}>{{format_time_ms(r['lapTime'], False)}}</td>
                <td {{!c}}>{{format_time_ms(r['gapToBest'], True)}}</td>
% for si in range(count):
    % if r['sectors'][si] == bestSectors[si]:
    %   c = 'class="bestSector" '
    % else:
    %   c = ''
    % end
    % if r['sectors'][si] is None:
    %   s = "-"
    % else:
    %   s = format_time_ms(r['sectors'][si], False)
    % end
                <td {{!c}}>{{s}}</td>
% end
%
% def adaptClassBool(x, r, hasFacSetting=False):
%     v = r.get(x, None)
%     if v is None:
%          v = "unknown"
%     else:
%          if hasFacSetting:
%              v = ["off", "factory", "on", "unknown"][v+1]
%          else:
%              v = ["off", "on", "unknown"][v]
%          end
%     end
%     return v
% end
%
% for c in add_columns:
%   if add_columns_disp[c][1]:
                <td>{{add_columns_disp[c][1](r)}}</td>
%   else:
                <td><div>
                    <a class="aids autoclutch {{adaptClassBool('autoClutch', r)}}" title="Automatic clutch {{adaptClassBool('autoClutch', r)}}"></a>
                    <a class="aids abs {{adaptClassBool('abs', r, True)}}" title="ABS {{adaptClassBool('abs', r, True)}}"></a>
                    <a class="aids autobrake {{adaptClassBool('autoBrake', r)}}" title="Automatic brake {{adaptClassBool('autoBrake', r)}}"></a>
                    <a class="aids autogearbox {{adaptClassBool('autoShift', r)}}" title="Automatic gearbox {{adaptClassBool('autoShift', r)}}"></a>
                    <a class="aids blip {{adaptClassBool('autoBlib', r)}}" title="Automatic throttle blip {{adaptClassBool('autoBlib', r)}}"></a>
                    <a class="aids idealline {{adaptClassBool('idealLine', r)}}" title="Ideal racing line {{adaptClassBool('idealLine', r)}}"></a>
                    <a class="aids tc {{adaptClassBool('tractionControl', r, True)}}" title="Traction control {{adaptClassBool('tractionControl', r, True)}}"></a>
                </div></td>
%   end
% end
            </tr>
% end
            </tbody>
        </table>
    </div></div>
</div>
""")
Ejemplo n.º 16
0
 def test_noescape(self):
     t = SimpleTemplate('<{{!var}}>')
     self.assertEqual(u'<b>', t.render(var='b'))
     self.assertEqual(u'<<&>>', t.render(var='<&>'))
Ejemplo n.º 17
0
playersTemplate = SimpleTemplate("""
% from ptracker_lib.helpers import isProMode, format_time_s, format_time_ms, format_datetime, unixtime2datetime
<div class="container">
    <div class="row page-header">
        <div class="col-md-6"><img src="/img/banner.png" title="Logo Track" class="ACimg"></div>
        <div class="col-md-6">
% if features['banlist'] and features['admin'] and caller == "banlist":
            <div class="panel panel-info">
                <div class="panel-heading">Note</div>
                <div class="panel-body">
                    To add a driver to the banlist, go to the <a href="players">Drivers</a> section,
                    click on the driver to ban and choose the ban duration.
                </div>
            </div>
            <br>
% end
            <form class="form-inline" role="form" onsubmit="applySelections(); return false;">
                <div class="form-group">
                    <label for="search_pattern" class="col-md-2 control-label"><span class="glyphicon glyphicon-search"></span></label>
                    <input type="search" id="search_pattern" class="col-md-2 form-control" placeholder="Search" {{!'value="%s"' % search_pattern if not search_pattern in [None,""] else ""}}/>
<script>
function applySelections() {
    var sp = document.getElementById("search_pattern").value;
    var address = 'players?search_pattern='+sp;
    console.log(address);
    window.location.href = address;
}
</script>
                    <div class="col-md-2">
                        <button type="button" class="form-control btn btn-primary" onclick="applySelections()">Show</button>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <table class="table table-striped table-condensed table-bordered table-hover">
                <thead>
                    <tr>
                        <th>Driver name</th>
                        <th>Online</th>
% if features['admin']:
                        <th>Steam GUID</th>
%    if features['banlist']:
                        <th>Ban count</th>
                        <th>Banned until</th>
%    end
                        <th>Whitelisted</th>
% end
                        <th>Last seen</th>
                    </tr>
                </thead>
                <tbody>
% for i,r in enumerate(res['players']):
                    <tr class='clickableRow' href="playerdetails?pid={{"%d" % r['playerId']}}#">
                        <td>{{r['name']}}</td>
                        <td>{{'@' + r['isOnline'] if not r['isOnline'] is None else '-'}}</td>
% if features['admin']:
                        <td>{{r['guid']}}</td>
%    if features['banlist']:
                        <td>{{r['banCount'] if not r['banCount'] is None else '-'}}</td>
                        <td>{{format_datetime(unixtime2datetime(r['bannedUntil']),onlyDate=True) if not r['bannedUntil'] is None else '-'}}</td>
%    end
                        <td>{{"yes" if r['whitelisted'] else "no"}}</td>
% end
                        <td>{{format_datetime(unixtime2datetime(r['lastSeen'])) if not r['lastSeen'] is None else '-'}}</td>
                    </tr>
% end
                </tbody>
            </table>
        </div>
    </div>
</div>
""")
Ejemplo n.º 18
0
 def test_elsebug(self):
     ''' Whirespace between block keyword and colon is allowed '''
     t = SimpleTemplate("%if 1:\nyes\n%else:\nno\n%end\n")
     self.assertEqual(u"yes\n", t.render())
     t = SimpleTemplate("%if 1:\nyes\n%else     :\nno\n%end\n")
     self.assertEqual(u"yes\n", t.render())
Ejemplo n.º 19
0
chatlogTemplate = SimpleTemplate("""
<div class="container">
    <div class="row page-header">
        <div class="col-md-6"><img src="/img/banner.png" title="Logo Track" class="ACimg"></div>
        <div class="col-md-6">
            <form class="form-horizontal collapse-group" role="form">
                <div class="form-group">
% if len(servers) > 1:
                    <label for="servers" class="col-md-2 control-label">Server</label>
                    <div class="col-md-10">
                        <select id="server" name="server" class="form-control multiselect">
%   for s in servers:
                            <option {{!"selected" if s == server else ""}} value="{{s}}">{{s}}</option>
%   end
                        </select>
                    </div>
% end
                    <label for="date_from" class="col-md-2 control-label">From</label>
                    <div class="col-md-3">
                        <input name="date_from" id="date_from" class="datepicker form-control" data-date-format="yyyy-mm-dd" value="{{date_from if not date_from is None else ''}}" />
                    </div>
                    <label for="date_to" class="col-md-2 control-label">To</label>
                    <div class="col-md-3">
                        <input name="date_to" id="date_to" class="datepicker form-control" data-date-format="yyyy-mm-dd" value="{{date_to if not date_to is None else ''}}" />
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-4 col-md-offset-2">
                        <button class="form-control btn btn-sm btn-primary">
                            Submit
                        </button>
                    </div>
                    <div class="col-md-4 col-md-offset-2">
                        <button class="form-control btn btn-sm btn-primary" onClick="window.history.back()">
                            Back
                        </button>
                    </div>
                </div>
            </form>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <table class="table table-responsive table-hover table-striped table-condensed">
                <thead>
                    <tr><th class="col-sm-2 text-right">Timestamp</th><th class="col-sm-2 text-center">Name</th><th class="col-sm-8">Chat message</th></tr>
                </thead>
                <tbody">
% from ptracker_lib.helpers import *
% for msg in messages:
%    ts = unixtime2datetime(msg['timestamp'])
%    ts = format_datetime(ts)
                    <tr><td class="text-right">{{ts}}</td><td class="text-right"><a href="playerdetails?pid={{"%d" % msg['playerid']}}#">{{msg['name']}}:</a></td><td>{{msg['content']}}</td></tr>
% end
                </tbody>
            </table>
        </div>
    </div>
</div>
""")
Ejemplo n.º 20
0
 def test_commentbug(self):
     ''' A "#" sign within an string is not a comment '''
     t = SimpleTemplate("%if '#':\nyes\n%end\n")
     self.assertEqual(u"yes\n", t.render())
Ejemplo n.º 21
0
 def test_error(self):
     """ Templates: Exceptions"""
     self.assertRaises(SyntaxError, SimpleTemplate, '%for badsyntax')
     self.assertRaises(IndexError, SimpleTemplate('{{i[5]}}').render, i=[0])
Ejemplo n.º 22
0
 def test_multiline(self):
     ''' Block statements with non-terminating newlines '''
     t = SimpleTemplate("%if 1\\\n%and 1:\nyes\n%end\n")
     self.assertEqual(u"yes\n", t.render())
Ejemplo n.º 23
0
 def test_file(self):
     """ Templates: Parse file"""
     t = SimpleTemplate(name='./views/stpl_simple.tpl').render(var='var')
     self.assertEqual(u'start var end\n', ''.join(t))
Ejemplo n.º 24
0
 def test_newline_in_parameterlist(self):
     ''' Block statements with non-terminating newlines in list '''
     t = SimpleTemplate("%a=[1,\n%2]\n{{len(a)}}")
     self.assertEqual(u"2", t.render())
Ejemplo n.º 25
0
 def test_name(self):
     """ Templates: Lookup by name """
     t = SimpleTemplate(name='stpl_simple',
                        lookup=['./views/']).render(var='var')
     self.assertEqual(u'start var end\n', ''.join(t))
Ejemplo n.º 26
0
def _render_index_html(spec_url, validator_url=None):
    return SimpleTemplate(SWAGGER_UI_INDEX_TEMPLATE).render(
        spec_url=spec_url,
        validator_url=json_dumps(validator_url)
    )
Ejemplo n.º 27
0
 def test_unicode_code(self):
     """ Templates: utf8 code in file"""
     t = SimpleTemplate(name='./views/stpl_unicode.tpl').render(var='äöü')
     self.assertEqual(u'start ñç äöü end\n', ''.join(t))
Ejemplo n.º 28
0
def write_end_of_section(scenario):

    all_ok = all(map(lambda x: x.passed, scenario.steps))
    filter_passed = sum(map(lambda x: 1 if x.passed else 0, scenario.steps))
    percentage_ok = (float(filter_passed) / len(scenario.steps) *
                     100.0) if scenario.steps else 100.0
    time_total = timedelta_total_seconds(datetime.datetime.now() -
                                         world.time_before) if all_ok else None
    index_page = 'index%d.html' % world.idscenario
    tags = scenario.tags

    # we have to add the steps that haven't been included
    write_printscreen(world, world.full_printscreen)

    # we have to add en explanation "why" the scenario has failed
    if not all_ok:
        # we cannot rely on "passed" because it seems that the exception is sometimes attached to
        #  another step
        failures = filter(
            lambda x: x.why,
            (scenario.background.steps if scenario.background else []) +
            scenario.steps)
        # Don't ask me why, Lettuce sometimes doesn't give any step when the failure heppens when executing the last step...
        #  We don't want to crash a second time because the "real" error message would be hidden
        exception_failure = failures[0].why.exception if failures else None

        msg_error = unicode(exception_failure).encode(
            'ascii', 'ignore') + ' (' + str(type(exception_failure)) + ')'

        write_errorscreen(world, msg_error)

    shoud_work = 'fails' not in scenario.tags
    if shoud_work != all_ok:
        world.failure_found = True

    # is this success/failure normal according to us?
    #   (if tag @fails => a failure is normal, otherwise it's not normal)
    # We then have to update the "ok/ko" flag in the meta file
    #  and color in red or not the line

    world.scenarios.append(
        (all_ok, scenario.name, percentage_ok, time_total, index_page, tags,
         scenario.described_at.file.replace('features/', '').replace(
             '.feature', '.meta_feature')))

    path_html = os.path.join(OUTPUT_DIR, index_page)

    path_tpl = get_absolute_path(os.path.join(TEMPLATES_DIR, "scenario.tpl"))
    with open(path_tpl, 'r') as f:
        content = ''.join(f.xreadlines())

        mytemplate = SimpleTemplate(content)
        _, filename = os.path.split(scenario.described_at.file)
        content = mytemplate.render(printscreens=world.printscreen_to_display,
                                    scenario=scenario,
                                    filename=filename)

        output_index_file = open(path_html, 'w')
        output_index_file.write(content.encode('ascii', 'ignore'))
        output_index_file.close()

    world.printscreen_to_display = []

    world.idscenario += 1
Ejemplo n.º 29
0
 def test_escape(self):
     t = SimpleTemplate('<{{var}}>')
     self.assertEqual(u'<b>', ''.join(t.render(var='b')))
     self.assertEqual(u'<&lt;&amp;&gt;>', ''.join(t.render(var='<&>')))
Ejemplo n.º 30
0
from bottle import route, run, SimpleTemplate, static_file, request, BaseRequest
import sqlite3
import json
import os
import math

html = open("./templ/index.html", 'r').read()
tpl = SimpleTemplate(html)  # for all pages
# record on one page
lim = 12
BaseRequest.MEMFILE_MAX = 1024 * 1024  # 403 error
DB = 'db.db'


def readDB():
    conn = sqlite3.connect(DB)
    c = conn.cursor()

    # All record
    record = c.execute('SELECT * FROM record ORDER BY id').fetchall()
    conn.close()
    # Split tags
    r = []
    for el in record:
        e = []
        e.append(int(el[0]))
        e.append(el[1])
        e.append(el[2])
        e.append(el[3])
        e.append(el[4])
        e.append([i.strip() for i in el[5].split(',')])