Exemplo n.º 1
0
 def self_link(name, p):
     d = dict(page=p + 1)
     if order: d['order'] = order
     if request.vars.keywords: d['keywords'] = request.vars.keywords
     return A(name, _href=url(vars=d), _class=trap_class())
Exemplo n.º 2
0
 def test_Adata(self):
     self.assertEqual(
         A('<>', data=dict(abc='<def?asd>', cde='standard'), _a='1',
           _b='2').xml(),
         b'<a a="1" b="2" data-abc="&lt;def?asd&gt;" data-cde="standard">&lt;&gt;</a>'
     )
Exemplo n.º 3
0
    def grid(
        query,
        fields=None,
        field_id=None,
        left=None,
        join=None,  #!
        orderby=None,
        groupby=None,
        groupfields=None,  #!
        having=None,  #!
        headers={},
        searchable=False,  #True,
        sortable=True,
        paginate=20,
        pagename="page",  #!
        deletable=False,  #! True,
        editable=True,
        details=False,  #! True,
        selectable=None,
        create=False,  #!True,
        csv=False,  #!True,
        links=None,
        links_in_grid=True,
        upload='<default>',
        args=[],
        user_signature=False,  #!True,
        maxtextlengths={},
        maxtextlength=20,
        onvalidation=None,
        oncreate=None,
        onupdate=None,
        ondelete=None,
        sorter_icons=(XML('&#x2191;'), XML('&#x2193;')),
        ui='web2py',
        showbuttontext=True,
        _class="web2py_grid",
        formname='web2py_grid',
        search_widget='default',
        ignore_rw=False,
        formstyle='table3cols',
        exportclasses=None,
        formargs={},
        createargs={},
        editargs={},
        viewargs={},
    ):

        # jQuery UI ThemeRoller classes (empty if ui is disabled)
        if ui == 'jquery-ui':
            ui = dict(
                widget='ui-widget',
                header='ui-widget-header',
                content='ui-widget-content',
                default='ui-state-default',
                cornerall='ui-corner-all',
                cornertop='ui-corner-top',
                cornerbottom='ui-corner-bottom',
                button='ui-button-text-icon-primary',
                buttontext='ui-button-text',
                buttonadd='ui-icon ui-icon-plusthick',
                buttonback='ui-icon ui-icon-arrowreturnthick-1-w',
                buttonexport='ui-icon ui-icon-transferthick-e-w',
                buttondelete='ui-icon ui-icon-trash',
                buttonedit='ui-icon ui-icon-pencil',
                buttontable='ui-icon ui-icon-triangle-1-e',
                buttonview='ui-icon ui-icon-zoomin',
            )
        elif ui == 'web2py':
            ui = dict(
                widget='',
                header='',
                content='',
                default='',
                cornerall='',
                cornertop='',
                cornerbottom='',
                button='button btn',
                buttontext='buttontext button',
                buttonadd='icon plus icon-plus',
                buttonback='icon leftarrow icon-arrow-left',
                buttonexport='icon downarrow icon-download',
                buttondelete='icon trash icon-trash',
                buttonedit='icon pen icon-pencil',
                buttontable='icon rightarrow icon-arrow-right',
                buttonview='icon magnifier icon-zoom-in',
            )
        elif not isinstance(ui, dict):
            raise RuntimeError, 'SQLFORM.grid ui argument must be a dictionary'

        db = query._db
        T = current.T
        request = current.request
        session = current.session
        response = current.response
        wenabled = (not user_signature or (session.auth and session.auth.user))
        create = wenabled and create
        editable = wenabled and editable
        deletable = wenabled and deletable

        def url(**b):
            b['args'] = args + b.get('args', [])
            b['hash_vars'] = False
            b['user_signature'] = user_signature
            return URL(**b)

        def url2(**b):
            b['args'] = request.args + b.get('args', [])
            b['hash_vars'] = False
            b['user_signature'] = user_signature
            return URL(**b)

        referrer = session.get('_web2py_grid_referrer_' + formname, url())
        # if not user_signature every action is accessible
        # else forbid access unless
        # - url is based url
        # - url has valid signature (vars are not signed, only path_info)
        # = url does not contain 'create','delete','edit' (readonly)
        if user_signature:
            if not ('/'.join(str(a) for a in args) == '/'.join(request.args)
                    #              or
                    #              URL.verify(request,user_signature=user_signature,
                    #                         hash_vars=False)
                    or not ('create' in request.args or 'delete'
                            in request.args or 'edit' in request.args)):
                session.flash = T('not authorized')
                redirect(referrer)

        def gridbutton(buttonclass='buttonadd',
                       buttontext='Add',
                       buttonurl=url(args=[]),
                       callback=None,
                       delete=None,
                       trap=True):
            if showbuttontext:
                if callback:
                    return A(SPAN(_class=ui.get(buttonclass)),
                             SPAN(T(buttontext),
                                  _title=buttontext,
                                  _class=ui.get('buttontext')),
                             callback=callback,
                             delete=delete,
                             _class=trap_class(ui.get('button'), trap))
                else:
                    return A(SPAN(_class=ui.get(buttonclass)),
                             SPAN(T(buttontext),
                                  _title=buttontext,
                                  _class=ui.get('buttontext')),
                             _href=buttonurl,
                             _class=trap_class(ui.get('button'), trap))
            else:
                if callback:
                    return A(SPAN(_class=ui.get(buttonclass)),
                             callback=callback,
                             delete=delete,
                             _title=buttontext,
                             _class=trap_class(ui.get('buttontext'), trap))
                else:
                    return A(SPAN(_class=ui.get(buttonclass)),
                             _href=buttonurl,
                             _title=buttontext,
                             _class=trap_class(ui.get('buttontext'), trap))

        dbset = db(query)
        tablenames = db._adapter.tables(dbset.query)
        #if left!=None: tablenames+=db._adapter.tables(left)

        if left != None:
            if isinstance(left, list):
                for _left in left:
                    tablenames = tablenames + db._adapter.tables(_left)
            else:
                tablenames = tablenames + db._adapter.tables(left)
        if join != None:
            if isinstance(join, list):
                for _join in join:
                    tablenames = tablenames + db._adapter.tables(_join)
            else:
                tablenames = tablenames + db._adapter.tables(join)

        tables = [db[tablename] for tablename in tablenames]
        if not fields:
            fields = reduce(lambda a, b: a + b,
                            [[field for field in table] for table in tables])
        if not field_id:
            field_id = tables[0]._id
        columns = [str(field) for field in fields \
                       if field._tablename in tablenames]

        if not str(field_id) in [str(f) for f in fields]:
            fields.append(field_id)
        table = field_id.table
        tablename = table._tablename
        if upload == '<default>':
            upload = lambda filename: url(args=['download', filename])
            if len(request.args) > 1 and request.args[-2] == 'download':
                stream = response.download(request, db)
                raise HTTP(200, stream, **response.headers)

        def buttons(edit=False, view=False, record=None):
            buttons = DIV(
                gridbutton('buttonback', 'Back', referrer),
                _class='form_header row_buttons %(header)s %(cornertop)s' % ui)
            if edit and (not callable(edit) or edit(record)):
                args = ['edit', table._tablename, request.args[-1]]
                buttons.append(gridbutton('buttonedit', 'Edit',
                                          url(args=args)))
            if view:
                args = ['view', table._tablename, request.args[-1]]
                buttons.append(gridbutton('buttonview', 'View',
                                          url(args=args)))
            if record and links:
                for link in links:
                    if isinstance(link, dict):
                        buttons.append(link['body'](record))
                    elif link(record):
                        buttons.append(link(record))
            return buttons

        formfooter = DIV(
            _class='form_footer row_buttons %(header)s %(cornerbottom)s' % ui)

        create_form = update_form = view_form = search_form = None
        sqlformargs = dict(formargs)

        if create and len(request.args) > 1 and request.args[-2] == 'new':
            table = db[request.args[-1]]
            sqlformargs.update(createargs)
            create_form = SQLFORM(table,
                                  ignore_rw=ignore_rw,
                                  formstyle=formstyle,
                                  _class='web2py_form',
                                  **sqlformargs)
            create_form.process(formname=formname,
                                next=referrer,
                                onvalidation=onvalidation,
                                onsuccess=oncreate)
            res = DIV(buttons(), create_form, formfooter, _class=_class)
            res.create_form = create_form
            res.update_form = update_form
            res.view_form = view_form
            res.search_form = search_form
            return res

        elif details and len(request.args) > 2 and request.args[-3] == 'view':
            table = db[request.args[-2]]
            record = table(request.args[-1]) or redirect(URL('error'))
            sqlformargs.update(viewargs)
            view_form = SQLFORM(table,
                                record,
                                upload=upload,
                                ignore_rw=ignore_rw,
                                formstyle=formstyle,
                                readonly=True,
                                _class='web2py_form',
                                **sqlformargs)
            res = DIV(buttons(edit=editable, record=record),
                      view_form,
                      formfooter,
                      _class=_class)
            res.create_form = create_form
            res.update_form = update_form
            res.view_form = view_form
            res.search_form = search_form
            return res
#      elif editable and len(request.args)>2 and request.args[-3]=='edit':
#          table = db[request.args[-2]]
#          record = table(request.args[-1]) or redirect(URL('error'))
#          sqlformargs.update(editargs)
#          update_form = SQLFORM(table, record, upload=upload, ignore_rw=ignore_rw,
#                              formstyle=formstyle, deletable=deletable,
#                              _class='web2py_form',
#                              submit_button=T('Submit'),
#                              delete_label=T('Check to delete'),
#                              **sqlformargs)
#          update_form.process(formname=formname,
#                            onvalidation=onvalidation,
#                            onsuccess=onupdate,
#                            next=referrer)
#          res = DIV(buttons(view=details, record=record),
#                    update_form, formfooter, _class=_class)
#          res.create_form = create_form
#          res.update_form = update_form
#          res.view_form = view_form
#          res.search_form = search_form
#          return res
        elif deletable and len(
                request.args) > 2 and request.args[-3] == 'delete':
            table = db[request.args[-2]]
            if ondelete:
                ondelete(table, request.args[-1])
            ret = db(table[table._id.name] == request.args[-1]).delete()
            return ret

        exportManager = dict(
            csv_with_hidden_cols=(ExporterCSV,'CSV (hidden cols)'),
            csv=(ExporterCSV,'CSV'),
            xml=(ExporterXML, 'XML'),
            html=(ExporterHTML, 'HTML'),
            tsv_with_hidden_cols=\
                (ExporterTSV,'TSV (Excel compatible, hidden cols)'),
            tsv=(ExporterTSV, 'TSV (Excel compatible)'))
        if not exportclasses is None:
            exportManager.update(exportclasses)

        export_type = request.vars._export_type
        if export_type:
            order = request.vars.order or ''
            if sortable:
                if order and not order == 'None':
                    if order[:1] == '~':
                        sign, rorder = '~', order[1:]
                    else:
                        sign, rorder = '', order
                    tablename, fieldname = rorder.split('.', 1)
                    orderby = db[tablename][fieldname]
                    if sign == '~':
                        orderby = ~orderby

            table_fields = [f for f in fields if f._tablename in tablenames]
            if export_type in ('csv_with_hidden_cols', 'tsv_with_hidden_cols'):
                if request.vars.keywords:
                    try:
                        dbset = dbset(
                            SQLFORM.build_query(
                                fields, request.vars.get('keywords', '')))
                        rows = dbset.select(cacheable=True)
                    except Exception:
                        response.flash = T('Internal Error')
                        rows = []
                else:
                    rows = dbset.select(cacheable=True)
            else:
                rows = dbset.select(left=left,
                                    orderby=orderby,
                                    cacheable=True * columns)

            if export_type in exportManager:
                value = exportManager[export_type]
                clazz = value[0] if hasattr(value, '__getitem__') else value
                oExp = clazz(rows)
                filename = '.'.join(('rows', oExp.file_ext))
                response.headers['Content-Type'] = oExp.content_type
                response.headers['Content-Disposition'] = \
                    'attachment;filename='+filename+';'
                raise HTTP(200, oExp.export(), **response.headers)

        elif request.vars.records and not isinstance(request.vars.records,
                                                     list):
            request.vars.records = [request.vars.records]
        elif not request.vars.records:
            request.vars.records = []

        session['_web2py_grid_referrer_' + formname] = url2(vars=request.vars)
        console = DIV(_class='web2py_console %(header)s %(cornertop)s' % ui)
        error = None

        search_actions = DIV(_class='web2py_search_actions')
        if create:
            search_actions.append(
                gridbutton(buttonclass='buttonadd',
                           buttontext=T('Add'),
                           buttonurl=url(args=['new', tablename])))
            console.append(search_actions)

#      if create:
#          add = gridbutton(
#                  buttonclass='buttonadd',
#                  buttontext='Add',
#                  buttonurl=url(args=['new',tablename]))
#          if not searchable:
#              console.append(add)
        else:
            add = ''

        if searchable:
            sfields = reduce(lambda a, b: a + b,
                             [[f for f in t if f.readable] for t in tables])
            if isinstance(search_widget, dict):
                search_widget = search_widget[tablename]
            if search_widget == 'default':
                search_menu = SQLFORM.search_menu(sfields)
                search_widget = lambda sfield, url: CAT(
                    add,
                    FORM(INPUT(
                        _name='keywords',
                        _value=request.vars.keywords,
                        _id='web2py_keywords',
                        _onfocus=
                        "jQuery('#w2p_query_fields').change();jQuery('#w2p_query_panel').slideDown();"
                    ),
                         INPUT(
                             _type='submit', _value=T('Search'), _class="btn"),
                         INPUT(_type='submit',
                               _value=T('Clear'),
                               _class="btn",
                               _onclick="jQuery('#web2py_keywords').val('');"),
                         _method="GET",
                         _action=url), search_menu)
            form = search_widget and search_widget(sfields, url()) or ''
            console.append(form)
            keywords = request.vars.get('keywords', '')
            try:
                if callable(searchable):
                    subquery = searchable(sfields, keywords)
                else:
                    subquery = SQLFORM.build_query(sfields, keywords)
            except RuntimeError:
                subquery = None
                error = T('Invalid query')
        else:
            subquery = None

        if subquery:
            dbset = dbset(subquery)
        try:
            if groupby:
                nrows = len(
                    dbset.select(*groupfields,
                                 join=join,
                                 left=left,
                                 groupby=groupby,
                                 having=having,
                                 cacheable=True))
            elif left or join:
                nrows = dbset.select('count(*)',
                                     join=join,
                                     left=left,
                                     cacheable=True).first()['count(*)']

#          if left or groupby:
#              c = 'count(*)'
#              nrows = dbset.select(c,left=left,cacheable=True,
#                                   groupby=groupby).first()[c]
            else:
                nrows = dbset.count()
        except:
            nrows = 0
            error = T('Unsupported query')

        order = request.vars.order or ''
        if sortable:
            if order and not order == 'None':
                if groupby:
                    if str(groupby[0]).find(order) > -1:
                        tablename, fieldname = order.split('~')[-1].split(
                            '.', 1)
                        sort_field = db[tablename][fieldname]
                        exception = sort_field.type in ('date', 'datetime',
                                                        'time')
                        if exception:
                            orderby = (order[:1] == '~'
                                       and sort_field) or ~sort_field
                        else:
                            orderby = (order[:1] == '~'
                                       and ~sort_field) or sort_field
                    else:
                        tablename, fieldname = order.split('~')[-1].split(
                            '.', 1)
                        gfields = str(groupfields[0]).split(",")
                        for gfield in gfields:
                            if len(gfield.split(" AS ")) > 1:
                                if gfield.split(" AS ")[1] == fieldname:
                                    if str(gfield.split(" AS ")[0]).find(
                                            "SUM") > -1:
                                        sort_field = db[tablename][
                                            fieldname].sum()
                                    elif str(gfield.split(" AS ")[0]).find(
                                            "COUNT") > -1:
                                        sort_field = db[tablename][
                                            fieldname].count()
                                    elif str(gfield.split(" AS ")[0]).find(
                                            "MIN") > -1:
                                        sort_field = db[tablename][
                                            fieldname].min()
                                    elif str(gfield.split(" AS ")[0]).find(
                                            "MAX") > -1:
                                        sort_field = db[tablename][
                                            fieldname].max()
                                    elif str(gfield.split(" AS ")[0]).find(
                                            "LENGTH") > -1:
                                        sort_field = db[tablename][
                                            fieldname].len()
                                    else:
                                        break
                                    orderby = (order[:1] == '~'
                                               and ~sort_field) or sort_field
                                    break
                else:
                    tablename, fieldname = order.split('~')[-1].split('.', 1)
                    sort_field = db[tablename][fieldname]
                    exception = sort_field.type in ('date', 'datetime', 'time')
                    if exception:
                        orderby = (order[:1] == '~'
                                   and sort_field) or ~sort_field
                    else:
                        orderby = (order[:1] == '~'
                                   and ~sort_field) or sort_field

        head = TR(_class=ui.get('header'))
        if selectable:
            head.append(TH(_class=ui.get('default')))
        for field in fields:
            if columns and not str(field) in columns: continue
            if not field.readable: continue
            key = str(field)
            header = headers.get(
                str(field),
                hasattr(field, 'label') and field.label or key)
            if sortable:
                if key == order:
                    key, marker = '~' + order, sorter_icons[0]
                elif key == order[1:]:
                    marker = sorter_icons[1]
                else:
                    marker = ''
                header = A(
                    header,
                    marker,
                    _href=url(vars=dict(keywords=request.vars.keywords or '',
                                        order=key)),
                    _class=trap_class())
            head.append(TH(header, _class=ui.get('default')))

        if links and links_in_grid:
            for link in links:
                if isinstance(link, dict):
                    head.append(TH(link['header'], _class=ui.get('default')))

        # Include extra column for buttons if needed.
        include_buttons_column = (
            details or editable or deletable
            or (links and links_in_grid
                and not all([isinstance(link, dict) for link in links])))
        if include_buttons_column:
            head.insert(0, TH(_class=ui.get('default', '')))
            #  head.append(TH(_class=ui.get('default')))

        paginator = UL()
        if paginate and paginate < nrows:
            npages, reminder = divmod(nrows, paginate)
            if reminder: npages += 1
            try:
                page = int(request.vars.page or 1) - 1
            except ValueError:
                page = 0
            limitby = (paginate * page, paginate * (page + 1))

            def self_link(name, p):
                d = dict(page=p + 1)
                if order: d['order'] = order
                if request.vars.keywords: d['keywords'] = request.vars.keywords
                return A(name, _href=url(vars=d), _class=trap_class())

            NPAGES = 5  # window is 2*NPAGES
            if page > NPAGES + 1:
                paginator.append(LI(self_link('<<', 0)))
            if page > NPAGES:
                paginator.append(LI(self_link('<', page - 1)))
            pages = range(max(0, page - NPAGES), min(page + NPAGES, npages))
            for p in pages:
                if p == page:
                    paginator.append(
                        LI(A(p + 1, _onclick='return false'),
                           _class=trap_class('current')))
                else:
                    paginator.append(LI(self_link(p + 1, p)))
            if page < npages - NPAGES:
                paginator.append(LI(self_link('>', page + 1)))
            if page < npages - NPAGES - 1:
                paginator.append(LI(self_link('>>', npages - 1)))
        else:
            limitby = None

        try:
            table_fields = [f for f in fields if f._tablename in tablenames]
            if groupby:
                rows = dbset.select(*groupfields,
                                    join=join,
                                    left=left,
                                    groupby=groupby,
                                    having=having,
                                    orderby=orderby,
                                    limitby=limitby,
                                    cacheable=True)
            else:
                rows = dbset.select(join=join,
                                    left=left,
                                    orderby=orderby,
                                    limitby=limitby,
                                    cacheable=True,
                                    *table_fields)


#          rows = dbset.select(left=left,orderby=orderby,
#                              groupby=groupby,limitby=limitby,
#                              cacheable=True,*table_fields)

        except SyntaxError:
            rows = None
            error = T("Query Not Supported")
        if nrows:
            message = error or T('%(nrows)s records found') % dict(nrows=nrows)
            console.append(DIV(message, _class='web2py_counter'))

        if rows:
            htmltable = TABLE(THEAD(head))
            tbody = TBODY()
            numrec = 0
            for row in rows:
                if numrec % 2 == 0:
                    classtr = 'even'
                else:
                    classtr = 'odd'
                numrec += 1
                id = row[field_id]  #@ReservedAssignment
                if id:
                    rid = id
                    if callable(rid):  ### can this ever be callable?
                        rid = rid(row)
                    tr = TR(_id=rid, _class='%s %s' % (classtr, 'with_id'))
                else:
                    tr = TR(_class=classtr)
                if selectable:
                    tr.append(
                        INPUT(_type="checkbox",
                              _name="records",
                              _value=id,
                              value=request.vars.records))
                for field in fields:
                    if not str(field) in columns: continue
                    if not field.readable: continue
                    if field.type == 'blob': continue
                    value = row[field]
                    maxlength = maxtextlengths.get(str(field), maxtextlength)
                    if field.represent:
                        try:
                            value = field.represent(value, row)
                        except Exception:
                            try:
                                value = field.represent(
                                    value, row[field._tablename])
                            except Exception:
                                pass
                    elif field.type == 'boolean':
                        value = INPUT(_type="checkbox",
                                      _checked=value,
                                      _disabled=True)
                    elif field.type == 'upload':
                        if value:
                            if callable(upload):
                                value = A(current.T('file'),
                                          _href=upload(value))
                            elif upload:
                                value = A(current.T('file'),
                                          _href='%s/%s' % (upload, value))
                        else:
                            value = ''
                    if isinstance(value, str):
                        value = truncate_string(value, maxlength)
                    elif not isinstance(value, DIV):
                        value = field.formatter(value)
                    if not include_buttons_column:
                        tr.append(TD(value, _style="padding:10px;"))
                    else:
                        tr.append(TD(value))
                row_buttons = TD(_class='row_buttons')
                if links and links_in_grid:
                    for link in links:
                        if isinstance(link, dict):
                            tr.append(TD(link['body'](row)))
                        else:
                            if link(row):
                                row_buttons.append(link(row))
                if include_buttons_column:
                    if details and (not callable(details) or details(row)):
                        row_buttons.append(
                            gridbutton('buttonview', 'View',
                                       url(args=['view', tablename, id])))
                    if editable and (not callable(editable) or editable(row)):
                        row_buttons.append(
                            gridbutton('buttonedit', 'Edit',
                                       url(args=['edit', tablename, id])))
                    if deletable and (not callable(deletable)
                                      or deletable(row)):
                        row_buttons.append(
                            gridbutton(
                                'buttondelete',
                                'Delete',
                                callback=url(args=['delete', tablename, id]),
                                delete='tr'))
                    #tr.append(row_buttons)
                    tr.insert(0, row_buttons)
                tbody.append(tr)
            htmltable.append(tbody)
            htmltable = DIV(htmltable, _style='width:100%;overflow-x:auto')
            if selectable:
                htmltable = FORM(htmltable, INPUT(_type="submit"))
                if htmltable.process(formname=formname).accepted:  #
                    htmltable.vars.records = htmltable.vars.records or []
                    htmltable.vars.records = htmltable.vars.records if type(
                        htmltable.vars.records) == list else [
                            htmltable.vars.records
                        ]
                    records = [int(r) for r in htmltable.vars.records]
                    selectable(records)
                    redirect(referrer)
        else:
            htmltable = DIV(current.T('No records found'))

        if csv and nrows:
            export_links = []
            for k, v in sorted(exportManager.items()):
                label = v[1] if hasattr(v, "__getitem__") else k
                link = url2(vars=dict(order=request.vars.order or '',
                                      _export_type=k,
                                      keywords=request.vars.keywords or ''))
                export_links.append(A(T(label), _href=link))
            export_menu = \
                DIV(T('Export:'),_class="w2p_export_menu",*export_links)
        else:
            export_menu = None

        res = DIV(console,
                  DIV(htmltable, _class="web2py_table"),
                  _class='%s %s' % (_class, ui.get('widget')))
        if paginator.components:
            res.append(
                DIV(paginator,
                    _class="web2py_paginator %(header)s %(cornerbottom)s" %
                    ui))
        if export_menu: res.append(export_menu)
        res.create_form = create_form
        res.update_form = update_form
        res.view_form = view_form
        res.search_form = search_form
        return res
Exemplo n.º 4
0
 def toolbar(self):
     from gluon.html import DIV, SCRIPT, BEAUTIFY, TAG, A
     BUTTON = TAG.button
     admin = URL("admin",
                 "default",
                 "design",
                 extension='html',
                 args=current.request.application)
     from gluon.dal import DAL
     dbstats = []
     dbtables = {}
     infos = DAL.get_instances()
     for k, v in infos.iteritems():
         dbstats.append(
             TABLE(*[
                 TR(PRE(row[0]), '%.2fms' % (row[1] * 1000))
                 for row in v['dbstats']
             ]))
         dbtables[k] = dict(defined=v['dbtables']['defined']
                            or '[no defined tables]',
                            lazy=v['dbtables']['lazy']
                            or '[no lazy tables]')
     u = web2py_uuid()
     backtotop = A('Back to top', _href="#totop-%s" % u)
     # Convert lazy request.vars from property to Storage so they
     # will be displayed in the toolbar.
     request = copy.copy(current.request)
     request.update(vars=current.request.vars,
                    get_vars=current.request.get_vars,
                    post_vars=current.request.post_vars)
     return DIV(BUTTON('design', _onclick="document.location='%s'" % admin),
                BUTTON('request',
                       _onclick="jQuery('#request-%s').slideToggle()" % u),
                BUTTON('response',
                       _onclick="jQuery('#response-%s').slideToggle()" % u),
                BUTTON('session',
                       _onclick="jQuery('#session-%s').slideToggle()" % u),
                BUTTON('db tables',
                       _onclick="jQuery('#db-tables-%s').slideToggle()" %
                       u),
                BUTTON('db stats',
                       _onclick="jQuery('#db-stats-%s').slideToggle()" % u),
                DIV(BEAUTIFY(request),
                    backtotop,
                    _class="w2p-toolbar-hidden",
                    _id="request-%s" % u),
                DIV(BEAUTIFY(current.session),
                    backtotop,
                    _class="w2p-toolbar-hidden",
                    _id="session-%s" % u),
                DIV(BEAUTIFY(current.response),
                    backtotop,
                    _class="w2p-toolbar-hidden",
                    _id="response-%s" % u),
                DIV(BEAUTIFY(dbtables),
                    backtotop,
                    _class="w2p-toolbar-hidden",
                    _id="db-tables-%s" % u),
                DIV(BEAUTIFY(dbstats),
                    backtotop,
                    _class="w2p-toolbar-hidden",
                    _id="db-stats-%s" % u),
                SCRIPT("jQuery('.w2p-toolbar-hidden').hide()"),
                _id="totop-%s" % u)
Exemplo n.º 5
0
    def test_A(self):
        self.assertEqual(
            A('<>', _a='1', _b='2').xml(), b'<a a="1" b="2">&lt;&gt;</a>')
        self.assertEqual(
            A('a', cid='b').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_method="GET" data-w2p_target="b">a</a>'
        )
        self.assertEqual(
            A('a', callback='b', _id='c').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_method="POST" href="b" id="c">a</a>'
        )
        # Callback with no id trigger web2py_uuid() call
        from gluon.html import web2pyHTMLParser
        #a = A('a', callback='b').xml()

        #for tag in web2pyHTMLParser(a).tree.elements('a'):
        #    uuid_generated = tag.attributes['_id']
        #self.assertEqual(a,
        #                 b'<a data-w2p_disable_with="default" data-w2p_method="POST" href="b" id="{id}">a</a>'.format(id=uuid_generated))
        self.assertEqual(
            A('a', delete='tr').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_remove="tr">a</a>')
        self.assertEqual(
            A('a', _id='b', target='<self>').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_target="b" id="b">a</a>'
        )
        self.assertEqual(
            A('a', component='b').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_method="GET" href="b">a</a>'
        )
        self.assertEqual(
            A('a', _id='b', callback='c', noconfirm=True).xml(),
            b'<a data-w2p_disable_with="default" data-w2p_method="POST" href="c" id="b">a</a>'
        )
        self.assertEqual(
            A('a', cid='b').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_method="GET" data-w2p_target="b">a</a>'
        )
        self.assertEqual(
            A('a', cid='b', _disable_with='processing...').xml(),
            b'<a data-w2p_disable_with="processing..." data-w2p_method="GET" data-w2p_target="b">a</a>'
        )
        self.assertEqual(
            A('a', callback='b', delete='tr', noconfirm=True, _id='c').xml(),
            b'<a data-w2p_disable_with="default" data-w2p_method="POST" data-w2p_remove="tr" href="b" id="c">a</a>'
        )
        self.assertEqual(
            A('a', callback='b', delete='tr', confirm='Are you sure?',
              _id='c').xml(),
            b'<a data-w2p_confirm="Are you sure?" data-w2p_disable_with="default" data-w2p_method="POST" data-w2p_remove="tr" href="b" id="c">a</a>'
        )
Exemplo n.º 6
0
    def render(self):
        """ Render """

        response = current.response
        T = current.T

        return '''
        <!DOCTYPE html>
        <html lang="en">
        <head>
        <meta charset="utf-8">
        <title>%(title)s</title>
        <style type="text/css">
        body {
            margin: 0;
            padding: 0;
            background: #fff;
            font-family: Arial,Helvetica,sans-serif;
            color: #444;
        }
        #wrapper {
            margin: 0 auto;
            padding: 0;
        }
        #page {
            width: 500px;
            margin: 0 auto;
            padding: 40px;
        }
        #warning {
            -webkit-border-radius: 5px;
            -moz-border-radius: 5px;
            border-radius: 5px;
            width: 350px
            padding: 20px;
            background-color: #fff;
            border: 1px solid #d0cfc2;
            }
        .title {
            font-size: 20px;
            font-weight: bold;
            }
        .content {
            padding: 20px;
            }
        .description {
            font-size: 16px;
            }
        </style>
        </head>
        <body>
        <div id="wrapper">
        <div id="page">
        <div id="warning">
            %(image)s
            <div class="content">
            <div class="title"> %(title)s </div>
            <div class="description">%(message)s <p>%(index)s</p> </div>
            <div style="clear: both; float: none;"></div>
            </div>
        </div>
        </div>
        </div>
        </body>
        </html>
        ''' % {
            'title':
            self.body,
            'image':
            IMG(_src=URL('static',
                         'plugins/prettyexception/images/warning.png'),
                _alt="Warning",
                _style="float: left; padding: 5px;").xml(),
            'message':
            self.body,
            'index':
            A(T('Back to the index page'), _href=URL('default',
                                                     'index')).xml()
        }
Exemplo n.º 7
0
def pagination(request, curr_host):
    # Pagination! Send it the db, request and current host record, get back
    # a dictionary to put into the view.
    # TODO: Remove db, request and session for current.globalenv

    db = current.globalenv['db']
    cache = current.globalenv['cache']
    session = current.globalenv['session']

    from gluon.html import OPTION, SELECT, FORM, A, INPUT, SCRIPT

    hostlist = []
    hostprev = "#"
    hostnext = "#"
    hostselected = 0
    hostnextstyle = hostprevstyle = ""
    hostprevtitle = hostnexttitle = ""
    hostindex = 1
    # Create more filters here
    if request.vars.filterconfirmed is not None:
        session.hostfilterconfirmed = request.vars.filterconfirmed

    if session.hostfilterconfirmed == 'Unconfirmed [H]osts':
        query = (db.t_hosts)
    else:
        query = (db.t_hosts.f_confirmed == False)

    if session.hostfilter:
        hostfilter = session.hostfilter[0]
        if hostfilter is not None:
            if hostfilter[0] == "userid":
                query &= (db.t_hosts.f_engineer == hostfilter[1])
            elif hostfilter[0] == "assetgroup":
                query &= (db.t_hosts.f_asset_group.contains(hostfilter[1]))
            elif hostfilter[0] == "range":
                query &= (db.t_hosts.f_ipv4.contains(hostfilter[1]))

    for h_rec in db(query).select():
        hostlist.append(OPTION(host_title_maker(h_rec), _value=h_rec.id))
        if hostselected != 0 and hostnext == "#":
            hostnext = h_rec.id
            hostnexttitle = "Go to " + host_title_maker(h_rec)
        if h_rec.id == curr_host.id:
            hostselected = hostindex
        if hostselected == 0:
            hostprev = h_rec.id
            hostprevtitle = "Go to " + host_title_maker(h_rec)
        hostindex = hostindex + 1

    if hostprev == "#":
        hostprevstyle = "display:none"
    if hostnext == "#":
        hostnextstyle = "display:none"

    pagination = {}
    pagination['previous'] = A("(p)",
                               _id="prevhostlink",
                               _class="button",
                               _href=hostprev,
                               _style=hostprevstyle,
                               _title=hostprevtitle)
    pagination['next'] = A("(n)",
                           _id="nexthostlink",
                           _class="button",
                           _href=hostnext,
                           _style=hostnextstyle,
                           _title=hostnexttitle)
    pagination['form'] = FORM(
        SELECT(hostlist,
               value=request.args(0),
               _class="chosen-select",
               _id="host_select",
               _name="host_select",
               _onchange="window.location.href=$('#host_select').val()",
               **{'_data-placeholder': 'Choose a host'}),
        SCRIPT('$("#host_select").select2({width: "80%"});'),
    )
    pagination['host_number'] = "( %d/%d )" % (hostselected, len(hostlist))

    return pagination
Exemplo n.º 8
0
    def apply_method(self, r, **attr):
        """
            Entry point for REST API

            @param r: the request (S3Request)
            @param attr: REST controller parameters
        """

        if r.record and r.representation in ("html", "aadata"):

            T = current.T
            db = current.db
            s3db = current.s3db

            auth = current.auth
            is_admin = auth.s3_has_role("ADMIN")
            accessible = auth.s3_accessible_query

            # Profile widgets
            profile_widgets = []
            add_widget = profile_widgets.append

            dt_row_actions = self.dt_row_actions
            from s3 import FS

            # Organisations
            widget = {
                "label":
                T("My Organizations"),
                "icon":
                "organisation",
                "insert":
                False,
                "tablename":
                "org_organisation",
                "type":
                "datatable",
                "actions":
                dt_row_actions("org", "organisation"),
                "list_fields": [
                    "name",
                    (T("Type"),
                     "organisation_organisation_type.organisation_type_id"),
                    "phone",
                    (T("Email"), "email.value"),
                    "website",
                ],
            }
            if not is_admin:
                otable = s3db.org_organisation
                rows = db(accessible("update",
                                     "org_organisation")).select(otable.id)
                organisation_ids = [row.id for row in rows]
                widget["filter"] = FS("id").belongs(organisation_ids)
            add_widget(widget)

            # Facilities
            widget = {
                "label":
                T("My Facilities"),
                "icon":
                "facility",
                "insert":
                False,
                "tablename":
                "org_facility",
                "type":
                "datatable",
                "actions":
                dt_row_actions("org", "facility"),
                "list_fields": [
                    "name",
                    "code",
                    "site_facility_type.facility_type_id",
                    "organisation_id",
                    "location_id",
                ],
            }
            if not is_admin:
                ftable = s3db.org_facility
                rows = db(accessible("update",
                                     "org_facility")).select(ftable.id)
                facility_ids = [row.id for row in rows]
                widget["filter"] = FS("id").belongs(facility_ids)
            add_widget(widget)

            # Networks (only if user can update any records)
            widget_filter = None
            if not is_admin:
                gtable = s3db.org_group
                rows = db(accessible("update", "org_group")).select(gtable.id)
                group_ids = [row.id for row in rows]
                if group_ids:
                    widget_filter = FS("id").belongs(group_ids)
            if is_admin or widget_filter:
                widget = {
                    "label": T("My Networks"),
                    "icon": "org-network",
                    "insert": False,
                    "tablename": "org_group",
                    "filter": widget_filter,
                    "type": "datatable",
                    "actions": dt_row_actions("org", "group"),
                }
                add_widget(widget)

            # Groups (only if user can update any records)
            widget_filter = None
            if not is_admin:
                gtable = s3db.pr_group
                rows = db(accessible("update", "pr_group")).select(gtable.id)
                group_ids = [row.id for row in rows]
                if group_ids:
                    widget_filter = FS("id").belongs(group_ids)
            if is_admin or widget_filter:
                widget = {
                    "label":
                    T("My Groups"),
                    "icon":
                    "group",
                    "insert":
                    False,
                    "tablename":
                    "pr_group",
                    "filter":
                    widget_filter,
                    "type":
                    "datatable",
                    "actions":
                    dt_row_actions("hrm", "group"),
                    "list_fields": [
                        (T("Network"), "group_team.org_group_id"),
                        "name",
                        "description",
                        (T("Chairperson"), "chairperson"),
                    ],
                }
                add_widget(widget)

            # CMS Content
            from gluon.html import A, DIV, H2, TAG
            item = None
            title = T("Dashboard")
            if current.deployment_settings.has_module("cms"):
                name = "Dashboard"
                ctable = s3db.cms_post
                query = (ctable.name == name) & (ctable.deleted != True)
                row = db(query).select(ctable.id,
                                       ctable.title,
                                       ctable.body,
                                       limitby=(0, 1)).first()
                get_vars = {
                    "page": name,
                    "url": URL(args="dashboard", vars={}),
                }
                if row:
                    title = row.title
                    if is_admin:
                        item = DIV(
                            XML(row.body),
                            DIV(
                                A(
                                    T("Edit"),
                                    _href=URL(
                                        c="cms",
                                        f="post",
                                        args=[row.id, "update"],
                                        vars=get_vars,
                                    ),
                                    _class="action-btn",
                                ),
                                _class="cms-edit",
                            ),
                        )
                    else:
                        item = DIV(XML(row.body))
                elif is_admin:
                    item = DIV(
                        DIV(
                            A(
                                T("Edit"),
                                _href=URL(
                                    c="cms",
                                    f="post",
                                    args="create",
                                    vars=get_vars,
                                ),
                                _class="action-btn",
                            ),
                            _class="cms-edit",
                        ))

            # Rheader
            if r.representation == "html":
                profile_header = DIV(
                    DIV(
                        DIV(A(
                            T("Personal Profile"),
                            _href=URL(c="default", f="person"),
                            _class="action-btn",
                        ),
                            _class="dashboard-links right",
                            _style="padding:0.5rem 0;"),
                        H2(title),
                        _class="medium-6 columns end",
                    ),
                    _class="row",
                )
                if item:
                    # Append CMS content
                    profile_header = TAG[""](
                        profile_header,
                        DIV(
                            DIV(
                                item,
                                _class="medium-12 columns",
                            ),
                            _class="row",
                        ),
                    )
            else:
                profile_header = None

            # Configure profile
            tablename = r.tablename
            s3db.configure(
                tablename,
                profile_cols=2,
                profile_header=profile_header,
                profile_widgets=profile_widgets,
            )

            # Render profile
            from s3 import S3Profile
            profile = S3Profile()
            profile.tablename = tablename
            profile.request = r
            output = profile.profile(r, **attr)

            if r.representation == "html":
                output["title"] = \
                current.response.title = T("Personal Dashboard")
            return output
        else:
            raise HTTP(501, current.ERROR.BAD_METHOD)
Exemplo n.º 9
0
    def rdrt_member_profile_header(r):
        """ Custom profile header to allow update of RDRT roster status """

        record = r.record
        if not record:
            return ""

        person_id = record.person_id
        from s3 import s3_fullname, s3_avatar_represent
        name = s3_fullname(person_id)

        table = r.table

        # Organisation
        comments = table.organisation_id.represent(record.organisation_id)

        from s3 import s3_unicode
        from gluon.html import A, DIV, H2, LABEL, P, SPAN

        # Add job title if present
        job_title_id = record.job_title_id
        if job_title_id:
            comments = (SPAN("%s, " % \
                             s3_unicode(table.job_title_id.represent(job_title_id))),
                             comments)

        # Determine the current roster membership status (active/inactive)
        atable = current.s3db.deploy_application
        status = atable.active
        query = atable.human_resource_id == r.id
        row = current.db(query).select(atable.id,
                                       atable.active,
                                       limitby=(0, 1)).first()
        if row:
            active = 1 if row.active else 0
            status_id = row.id
            roster_status = status.represent(row.active)
        else:
            active = None
            status_id = None
            roster_status = current.messages.UNKNOWN_OPT

        if status_id and \
           current.auth.s3_has_permission("update",
                                          "deploy_application",
                                          record_id=status_id):
            # Make inline-editable
            roster_status = A(roster_status,
                              data = {"status": active},
                              _id = "rdrt-roster-status",
                              _title = T("Click to edit"),
                              )
            s3 = current.response.s3
            script = "/%s/static/themes/IFRC/js/rdrt.js" % r.application
            if script not in s3.scripts:
                s3.scripts.append(script)
            script = '''$.rdrtStatus('%(url)s','%(active)s','%(inactive)s','%(submit)s')'''
            from gluon import URL
            options = {"url": URL(c="deploy", f="application",
                                  args=["%s.s3json" % status_id]),
                       "active": status.represent(True),
                       "inactive": status.represent(False),
                       "submit": T("Save"),
                       }
            s3.jquery_ready.append(script % options)
        else:
            # Read-only
            roster_status = SPAN(roster_status)

        # Render profile header
        return DIV(A(s3_avatar_represent(person_id,
                                         tablename="pr_person",
                                         _class="media-object",
                                         ),
                     _class="pull-left",
                     ),
                   H2(name),
                   P(comments),
                   DIV(LABEL(status.label + ": "), roster_status),
                   _class="profile-header",
                   )
Exemplo n.º 10
0
    def __call__(self):

        request = current.request
        response = current.response
        s3 = response.s3
        settings = current.deployment_settings

        if request.env.request_method == "POST":
            # Processs Form
            vars = request.post_vars
            result = current.msg.send_email(
                to=settings.get_mail_approver(),
                subject=vars.subject,
                message=vars.message,
                reply_to=vars.address,
            )
            if result:
                response.confirmation = "Thankyou for your message - we'll be in touch shortly"

        T = current.T

        # Allow editing of page content from browser using CMS module
        if settings.has_module("cms"):
            ADMIN = current.auth.get_system_roles().ADMIN in \
                    current.session.s3.roles
            s3db = current.s3db
            table = s3db.cms_post
            ltable = s3db.cms_post_module
            module = "default"
            resource = "contact"
            query = (ltable.module == module) & \
                    ((ltable.resource == None) | \
                     (ltable.resource == resource)) & \
                    (ltable.post_id == table.id) & \
                    (table.deleted != True)
            item = current.db(query).select(table.id,
                                            table.body,
                                            limitby=(0, 1)).first()
            if item:
                if ADMIN:
                    item = DIV(
                        XML(item.body), BR(),
                        A(T("Edit"),
                          _href=URL(c="cms",
                                    f="post",
                                    args=[item.id, "update"]),
                          _class="action-btn"))
                else:
                    item = DIV(XML(item.body))
            elif ADMIN:
                if s3.crud.formstyle == "bootstrap":
                    _class = "btn"
                else:
                    _class = "action-btn"
                item = A(T("Edit"),
                         _href=URL(c="cms",
                                   f="post",
                                   args="create",
                                   vars={
                                       "module": module,
                                       "resource": resource
                                   }),
                         _class="%s cms-edit" % _class)
            else:
                item = ""
        else:
            item = ""

        form = FORM(TABLE(
            TR(LABEL("Your name:", SPAN(" *", _class="req"), _for="name")),
            TR(INPUT(_name="name", _type="text", _size=62, _maxlength="255")),
            TR(
                LABEL("Your e-mail address:",
                      SPAN(" *", _class="req"),
                      _for="address")),
            TR(INPUT(_name="address", _type="text", _size=62,
                     _maxlength="255")),
            TR(LABEL("Subject:", SPAN(" *", _class="req"), _for="subject")),
            TR(INPUT(_name="subject", _type="text", _size=62,
                     _maxlength="255")),
            TR(LABEL("Message:", SPAN(" *", _class="req"), _for="name")),
            TR(TEXTAREA(_name="message", _class="resizable", _rows=5,
                        _cols=62)),
            TR(INPUT(_type="submit", _value="Send e-mail")),
        ),
                    _id="mailform")

        if s3.cdn:
            if s3.debug:
                s3.scripts.append(
                    "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.js"
                )
            else:
                s3.scripts.append(
                    "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js"
                )

        else:
            if s3.debug:
                s3.scripts.append("/%s/static/scripts/jquery.validate.js" %
                                  request.application)
            else:
                s3.scripts.append("/%s/static/scripts/jquery.validate.min.js" %
                                  request.application)

        # @ToDo: Move to static with i18n
        s3.jquery_ready.append('''$('#mailform').validate({
 errorClass:'req',
 rules:{
  name:{
   required:true
  },
  subject:{
   required:true
  },
  message:{
   required:true
  },
  name:{
   required:true
  },
  address: {
   required:true,
   email:true
  }
 },
 messages:{
  name:"Enter your name",
  subject:"Enter a subject",
  message:"Enter a message",
  address:{
   required:"Please enter a valid email address",
   email:"Please enter a valid email address"
  }
 },
 errorPlacement:function(error,element){
  error.appendTo(element.parents('tr').prev().children())
 },
 submitHandler:function(form){
  form.submit()
 }
})''')
        # @ToDo: Move to static
        s3.jquery_ready.append(
            '''$('textarea.resizable:not(.textarea-processed)').each(function() {
    // Avoid non-processed teasers.
    if ($(this).is(('textarea.teaser:not(.teaser-processed)'))) {
        return false;
    }
    var textarea = $(this).addClass('textarea-processed'), staticOffset = null;
    // When wrapping the text area, work around an IE margin bug. See:
    // http://jaspan.com/ie-inherited-margin-bug-form-elements-and-haslayout
    $(this).wrap('<div class="resizable-textarea"><span></span></div>')
    .parent().append($('<div class="grippie"></div>').mousedown(startDrag));
    var grippie = $('div.grippie', $(this).parent())[0];
    grippie.style.marginRight = (grippie.offsetWidth - $(this)[0].offsetWidth) +'px';
    function startDrag(e) {
        staticOffset = textarea.height() - e.pageY;
        textarea.css('opacity', 0.25);
        $(document).mousemove(performDrag).mouseup(endDrag);
        return false;
    }
    function performDrag(e) {
        textarea.height(Math.max(32, staticOffset + e.pageY) + 'px');
        return false;
    }
    function endDrag(e) {
        $(document).unbind("mousemove", performDrag).unbind("mouseup", endDrag);
        textarea.css('opacity', 1);
    }
});''')

        response.title = "Contact | NYC:Prepared"
        self._view(THEME, "contact.html")
        return dict(
            form=form,
            item=item,
        )
Exemplo n.º 11
0
    def __call__(self):

        output = {}

        T = current.T
        s3 = current.response.s3

        auth = current.auth
        settings = current.deployment_settings
        roles = current.session.s3.roles
        system_roles = auth.get_system_roles()

        # Allow editing of page content from browser using CMS module
        if settings.has_module("cms"):
            ADMIN = system_roles.ADMIN in roles
            s3db = current.s3db
            table = s3db.cms_post
            ltable = s3db.cms_post_module
            module = "default"
            resource = "index"
            query = (ltable.module == module) & \
                    ((ltable.resource == None) | \
                     (ltable.resource == resource)) & \
                    (ltable.post_id == table.id) & \
                    (table.deleted != True)
            item = current.db(query).select(table.id,
                                            table.body,
                                            limitby=(0, 1)).first()
            if item:
                if ADMIN:
                    item = DIV(
                        XML(item.body), BR(),
                        A(current.T("Edit"),
                          _href=URL(c="cms",
                                    f="post",
                                    args=[item.id, "update"]),
                          _class="action-btn"))
                else:
                    item = DIV(XML(item.body))
            elif ADMIN:
                if s3.crud.formstyle == "bootstrap":
                    _class = "btn"
                else:
                    _class = "action-btn"
                item = A(T("Edit"),
                         _href=URL(c="cms",
                                   f="post",
                                   args="create",
                                   vars={
                                       "module": module,
                                       "resource": resource
                                   }),
                         _class="%s cms-edit" % _class)
            else:
                item = ""
        else:
            item = ""
        output["item"] = item

        # Login/Registration forms
        self_registration = settings.get_security_self_registration()
        registered = False
        login_form = None
        login_div = None
        register_form = None
        register_div = None

        # Check logged in and permissions
        if system_roles.AUTHENTICATED not in roles:

            login_buttons = DIV(A(T("Login"),
                                  _id="show-login",
                                  _class="tiny secondary button"),
                                _id="login-buttons")
            # @ToDo: Move JS to static
            script = '''
$('#show-intro').click(function(e){
 e.preventDefault()
 $('#intro').slideDown(400, function() {
   $('#login_box').hide()
 });
})
$('#show-login').click(function(e){
 e.preventDefault()
 $('#login_form').show()
 $('#register_form').hide()
 $('#login_box').show()
 $('#intro').slideUp()
})'''
            s3.jquery_ready.append(script)

            # This user isn't yet logged-in
            if current.request.cookies.has_key("registered"):
                # This browser has logged-in before
                registered = True

            if self_registration is True:
                # Provide a Registration box on front page
                login_buttons.append(
                    A(
                        T("Register"),
                        _id="show-register",
                        _class="tiny secondary button",
                        # @ToDo: Move to CSS
                        _style="margin-left:5px"))
                script = '''
$('#show-register').click(function(e){
 e.preventDefault()
 $('#login_form').hide()
 $('#register_form').show()
 $('#login_box').show()
 $('#intro').slideUp()
})'''
                s3.jquery_ready.append(script)

                register_form = auth.register()
                register_div = DIV(H3(T("Register")),
                                   P(XML(T("If you would like to help, then please %(sign_up_now)s") % \
                                            dict(sign_up_now=B(T("sign-up now"))))))

                register_script = '''
$('#register-btn').click(function(e){
 e.preventDefault()
 $('#register_form').show()
 $('#login_form').hide()
})
$('#login-btn').click(function(e){
 e.preventDefault()
 $('#register_form').hide()
 $('#login_form').show()
})'''
                s3.jquery_ready.append(register_script)

            # Provide a login box on front page
            auth.messages.submit_button = T("Login")
            login_form = auth.login(inline=True)
            login_div = DIV(H3(T("Login")),
                            P(XML(T("Registered users can %(login)s to access the system") % \
                                  dict(login=B(T("login"))))))

        else:
            login_buttons = ""

        output["login_buttons"] = login_buttons
        output["self_registration"] = self_registration
        output["registered"] = registered
        output["login_div"] = login_div
        output["login_form"] = login_form
        output["register_div"] = register_div
        output["register_form"] = register_form

        output["items"] = network()()

        self._view(THEME, "index.html")
        return output
Exemplo n.º 12
0
def pagination_services(request, curr_service):
    # Pagination! Send it the db, request and current host record, get back
    # a dictionary to put into the view.

    db = current.globalenv['db']
    #cache = current.globalenv['cache']

    from gluon.html import OPTION, SELECT, FORM, A
    from skaldship.general import host_title_maker

    servicelist = []
    serviceprev = "#"
    servicenext = "#"
    serviceselected = 0
    servicenextstyle = serviceprevstyle = ""
    serviceprevtitle = servicenexttitle = ""
    serviceindex = 1
    servicecount = 0
    query = db.t_services.f_hosts_id == db.t_hosts.id
    """
    # Create more filters here
    if request.vars.filterconfirmed is not None:
        session.servicefilterconfirmed=request.vars.filterconfirmed

    if session.servicefilterconfirmed == 'Unconfirmed [H]osts':
        query=db.t_services
    else:
        query=db.t_services.f_confirmed==False

    """
    for h_rec in db(query).select(orderby=db.t_hosts.id):
        hostrecord = h_rec.t_hosts
        servicelist.append(
            OPTION(host_title_maker(hostrecord) + " - " +
                   service_title_maker(h_rec.t_services),
                   _value=h_rec.t_services.id))
        if serviceselected != 0 and servicenext == "#":
            servicenext = h_rec.t_services.id
            servicenexttitle = "Go to " + host_title_maker(
                hostrecord) + " - " + service_title_maker(h_rec.t_services)
        if h_rec.t_services.id == curr_service.id:
            serviceselected = serviceindex
        if serviceselected == 0:
            serviceprev = h_rec.t_services.id
            serviceprevtitle = "Go to " + host_title_maker(
                hostrecord) + " - " + service_title_maker(h_rec.t_services)
        if h_rec.t_services.f_hosts_id == curr_service.f_hosts_id:
            serviceindex += 1
            servicecount += 1

    if serviceprev == "#":
        serviceprevstyle = "display:none"
    if servicenext == "#":
        servicenextstyle = "display:none"

    pagination = {}
    pagination['form'] = FORM(
        A("<<(p)",
          _id="prevservicelink",
          _class="button",
          _href=serviceprev,
          _style=serviceprevstyle,
          _title=serviceprevtitle),
        "    ",
        SELECT(servicelist,
               value=request.args(0),
               _class="autowidth",
               _id="service_select",
               _name="service_select",
               _onchange="window.location.href=$('#service_select').val()"),
        "  ",
        A("(n)>>",
          _id="nextservicelink",
          _class="button",
          _href=servicenext,
          _style=servicenextstyle,
          _title=servicenexttitle),
        _method='get')

    pagination['service_number'] = "( %d/%d )" % (serviceselected,
                                                  servicecount)

    return pagination
Exemplo n.º 13
0
         INPUT(_type='text',
               _name='username',
               requires=IS_NOT_EMPTY(),
               _width="75%"), LABEL("Password", _width="25%"),
         INPUT(_type='password',
               _name='password',
               requires=IS_NOT_EMPTY(),
               _width="75%"), LABEL("Options:", _width="25%"),
         INPUT(_type='checkbox', _name='rememberme', _width="10%"),
         LABEL("Remember me", _width="65%"), LABEL("", _width="25%"),
         INPUT(_type='checkbox', _name='superuser', _width="10%"),
         LABEL("Log in as root", _width="65%"),
         CENTER(
             INPUT(_type='submit', _name='login', _value="Login"),
             BR(),
             A("lost password", _href="saraza"),
             " | ",
             A("register", _href="saraza"),
         ))
 elif '--form' in sys.argv:
     form = FORM(
         "hola2!",
         BR(),
         LABEL("hola1", _width="25%"),
         INPUT(_type='text',
               _name='myvar',
               requires=IS_NOT_EMPTY(),
               _width="75%"),
         LABEL("hola2", _width="25%"),
         INPUT(_type='text',
               _name='myvar',
Exemplo n.º 14
0
    def __call__(self):

        output = {}

        T = current.T
        request = current.request
        response = current.response
        s3 = response.s3

        # Check logged in and permissions
        auth = current.auth
        settings = current.deployment_settings
        roles = current.session.s3.roles
        system_roles = auth.get_system_roles()
        AUTHENTICATED = system_roles.AUTHENTICATED

        # Login/Registration forms
        self_registration = current.deployment_settings.get_security_registration_visible(
        )
        registered = False
        login_form = None
        login_div = None
        register_form = None
        register_div = None

        # Contact Form
        request_email = settings.get_frontpage("request_email")
        if request_email:
            from s3dal import Field
            from gluon.validators import IS_NOT_EMPTY
            from gluon.sqlhtml import SQLFORM
            fields = [
                Field(
                    "name",
                    label="Your name",
                    requires=IS_NOT_EMPTY(),
                ),
                Field(
                    "address",
                    label="Your e-mail address",
                    requires=IS_NOT_EMPTY(),
                ),
                Field(
                    "subject",
                    label="Subject",
                    requires=IS_NOT_EMPTY(),
                ),
                Field(
                    "message",
                    "text",
                    label="Message",
                    requires=IS_NOT_EMPTY(),
                ),
            ]
            from s3 import s3_mark_required
            labels, required = s3_mark_required(fields)
            s3.has_required = required

            response.form_label_separator = ""
            contact_form = SQLFORM.factory(
                formstyle=settings.get_ui_formstyle(),
                submit_button=T("Submit"),
                labels=labels,
                separator="",
                table_name="contact",  # Dummy table name
                _id="mailform",
                *fields)

            if contact_form.accepts(request.post_vars,
                                    current.session,
                                    formname="contact_form",
                                    keepvalues=False,
                                    hideerror=False):
                # Processs Contact Form
                form_vars = contact_form.vars
                sender = "%s <%s>" % (form_vars.name, form_vars.address)
                result = current.msg.send_email(
                    to=request_email,
                    sender=sender,
                    subject=form_vars.subject,
                    message=form_vars.message,
                    reply_to=form_vars.address,
                )
                if result:
                    response.confirmation = "Thank you for your message - we'll be in touch shortly"
            if s3.cdn:
                if s3.debug:
                    s3.scripts.append(
                        "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.js"
                    )
                else:
                    s3.scripts.append(
                        "http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js"
                    )
            else:
                if s3.debug:
                    s3.scripts.append("/%s/static/scripts/jquery.validate.js" %
                                      request.application)
                else:
                    s3.scripts.append(
                        "/%s/static/scripts/jquery.validate.min.js" %
                        request.application)
            validation_script = '''
$('#mailform').validate({
 errorClass:'req',
 rules:{
  name:{
   required:true
  },
  address: {
   required:true,
   email:true
  },
  subject:{
   required:true
  },
  message:{
   required:true
  }
 },
 messages:{
  name:"Enter your name",
  subject:"Enter a subject",
  message:"Enter a message",
  address:{
   required:"Please enter a valid email address",
   email:"Please enter a valid email address"
  }
 },
 errorPlacement:function(error,element){
  error.appendTo(element.parents('div.controls'))
 },
 submitHandler:function(form){
  form.submit()
 }
})'''
            s3.jquery_ready.append(validation_script)

        else:
            contact_form = ""

        if AUTHENTICATED not in roles:

            login_buttons = DIV(A(T("Login"),
                                  _id="show-login",
                                  _class="tiny secondary button"),
                                _id="login-buttons")
            script = '''
$('#show-mailform').click(function(e){
 e.preventDefault()
 $('#intro').slideDown(400, function() {
   $('#login_box').hide()
 });
})
$('#show-login').click(function(e){
 e.preventDefault()
 $('#login_form').show()
 $('#register_form').hide()
 $('#login_box').show()
 $('#intro').slideUp()
})'''
            s3.jquery_ready.append(script)

            # This user isn't yet logged-in
            if "registered" in request.cookies:
                # This browser has logged-in before
                registered = True

            if self_registration is True:
                # Provide a Registration box on front page
                login_buttons.append(
                    A(T("Register"),
                      _id="show-register",
                      _class="tiny secondary button",
                      _style="margin-left:5px"))
                script = '''
$('#show-register').click(function(e){
 e.preventDefault()
 $('#login_form').hide()
 $('#register_form').show()
 $('#login_box').show()
 $('#intro').slideUp()
})'''
                s3.jquery_ready.append(script)

                register_form = auth.register()
                register_div = DIV(
                    H3(T("Register")),
                    P(
                        XML(
                            T("If you would like to help, then please <b>sign up now</b>"
                              ))))
                register_script = '''
$('#register-btn').click(function(e){
 e.preventDefault()
 $('#register_form').show()
 $('#login_form').hide()
})
$('#login-btn').click(function(e){
 e.preventDefault()
 $('#register_form').hide()
 $('#login_form').show()
})'''
                s3.jquery_ready.append(register_script)

            # Provide a login box on front page
            auth.messages.submit_button = T("Login")
            login_form = auth.login(inline=True)
            login_div = DIV(
                H3(T("Login")),
                P(
                    XML(
                        T("Registered users can <b>login</b> to access the system"
                          ))))
        else:
            login_buttons = ""

        output["login_buttons"] = login_buttons
        output["self_registration"] = self_registration
        output["registered"] = registered
        output["login_div"] = login_div
        output["login_form"] = login_form
        output["register_div"] = register_div
        output["register_form"] = register_form
        output["contact_form"] = contact_form

        # Slick slider
        if s3.debug:
            s3.scripts.append("/%s/static/scripts/slick.js" %
                              request.application)
        else:
            s3.scripts.append("/%s/static/scripts/slick.min.js" %
                              request.application)
        script = '''
$(document).ready(function(){
 $('#title-image').slick({
  autoplay:true,
  autoplaySpeed:5000,
  speed:1000,
  fade:true,
  cssEase:'linear'
 });
});'''
        s3.jquery_ready.append(script)

        s3.stylesheets.append("../themes/%s/homepage.css" % THEME)
        self._view(THEME, "index.html")

        return output