예제 #1
0
    def edit(self, key, **data):
        """Display an edit form for a record"""
        c = self.collection
        user = c.user

        user.authorize('update', c)

        record = locate(c, key)
        if record:
            user.authorize('read', record)
            user.authorize('update', record)

            c.fields.initialize(record)
            c.fields.update(data)
            form = form_for(c.fields, ButtonField('Save', cancel=record.url))

            if c.verbose:
                msg = '%s edited %s %s' % (
                    user.link,
                    c.link,
                    record.link,
                )
                log_activity(msg)

            return page(form, title=c.item_title)
        else:
            return page('%s missing' % key)
예제 #2
0
파일: app.py 프로젝트: RyanLainchbury/zoom
    def index(self, q=None):
        def serializable(i):
            _, v = i
            try:
                json.dumps(v)
                return True
            except TypeError:
                return False

        request = self.request

        links = link_to('hello', '/hello')
        tpl = links + '<pre>{}</pre>'
        request_values = dict(filter(serializable, request.__dict__.items()))
        values = dict(
            request_values,
            data=request.data,
            a_url=url_for('howdy', name='Joe Smith'),
            a_rooted_url=url_for('/howdy', name='Joe Smith'),
        )

        actions = 'New',

        return page(tpl.format(json.dumps(values, indent=4)),
                    title='System Info',
                    actions=actions,
                    search=request.data.get('q', ''),
                    subtitle='this is the subtitle')

        return page('overview', title='my page')
예제 #3
0
def process_reset_request(token, form):

    if not valid_token(token):
        return page(load_content('expired.md'))

    tokens = get_tokens()
    rec = tokens.first(token=token)
    if rec:
        user = context.site.users.first(email=rec.email)
        if user:
            filler = dict(
                username=user.username,
                first_name=user.first_name,
            )
            if context.user.is_admin:
                form.update(
                    dict(
                        new_password='******',
                        confirm='somenewpassword',
                    )
                )
            content = load_content('reset.md', **filler) + form.edit()
            return page(content)
        else:
            # no user by that email!
            error('invalid request')
            return redirect_to('/')
    else:
        error('invalid reset request')
        return redirect_to('/')
예제 #4
0
def display_errors(request, handler, *rest):
    """Display errors for developers

    """
    try:
        return handler(request, *rest)

    except zoom.exceptions.ThemeTemplateMissingException:
        return zoom.response.HTMLResponse(
            zoom.templates.template_missing
        )

    except Exception as e:
        msg = traceback.format_exc()
        logger = logging.getLogger(__name__)
        logger.error(msg)

        as_api = request.env.get('HTTP_ACCEPT', '') == 'application/json'
        error_status = '500 Internal Server Error'

        if not (hasattr(zoom.system, 'user') and zoom.system.user.is_admin):
            if as_api:
                return JSONResponse(
                    dict(status=error_status), status=error_status)
            content = zoom.tools.load_template(
                'friendly_error', zoom.templates.friendly_error)
            return page(content, status=500).render(request)

        content = """
        <h2>Exception</h2>
        {}

        <h2>Request</h2>
        <pre>{}</pre>
        """.format(
            html.pre(msg),
            str(request),
        )

        if as_api:
            return JSONResponse(
                dict(
                    message=str(e),
                    status=error_status,
                ),
                status=error_status
            )

        return page(
            content,
            title='Application Error',
            status='500 Internal Server Error'
        ).render(request)
예제 #5
0
파일: parts.py 프로젝트: sean-hayes/zoom
 def index(self):
     content = Component(
         markdown("""
     Parts
     ====
     * <div class="component-pink">component styles makes this pink</div>
     * <div class="component-green">component css makes this green</div>
     * <div class="component-chocolate">component libs makes this chocolate</div>
     * <div class="component-magenta">component js makes this magenta</div>
     * <div class="component-coral">component head makes this coral</div>
     * <div class="component-tomato">component tail makes this tomato</div>
     * <div class="page-slategray">page styles makes this slategray</div>
     * <div class="page-red">page css makes this red</div>
     * <div class="page-purple">page libs makes this purple</div>
     * <div class="page-cyan">page js makes this cyan</div>
     * <div class="page-navy">page head makes this navy</div>
     * <div class="page-olive">page tail makes this olive</div>
     """),
         styles=['/sample/parts/mystyle'],
         css=".component-green {color: green}",
         libs=['/sample/parts/mylib'],
         js='$(".component-magenta").css("color", "magenta")',
         head='<style>.component-coral {color: coral}</style>',
         tail=
         '<script>$(".component-tomato").css("color", "tomato")</script>',
     )
     return page(
         content,
         styles=['/sample/parts/pagestyle'],
         css='.page-red {color: red}',
         libs=['/sample/parts/pagelib'],
         js='$(".page-cyan").css("color", "cyan")',
         head='<style>.page-navy {color: navy}</style>',
         tail='<script>$(".page-olive").css("color", "olive")</script>',
     )
예제 #6
0
 def index(self, **kwargs):
     """show the settings form"""
     values = self.settings.load()
     values.update(kwargs)
     self.form.initialize(values)
     content = self.form.edit()
     return page(content, title='Settings')
예제 #7
0
파일: index.py 프로젝트: zodman/ZoomFoundry
    def entry(self, key):
        def fmt(item):
            name, value = item
            return name, zoom.html.pre(value)

        entries = zoom.table_of('log')
        entry = list(entries.first(id=key).items())

        visible = lambda a: not a[0].startswith('_')

        content = zoom.html.table(map(fmt, filter(visible, entry)))
        css = """
        .content table {
            width: 80%;
            vertical-align: top;
        }
        .content table td:nth-child(1) {
            width: 30%;
        }
        .content table td {
            padding: 5px;
            line-height: 20px;
        }
        .content table pre {
            padding: 0px;
            background: 0;
            border: none;
            line-height: 20px;
            margin: 0;
        }
        """
        return page(content, title='Log Entry', css=css)
예제 #8
0
파일: index.py 프로젝트: sean-hayes/zoom
    def index(self, email=None, submit_button=None):

        if context.user.is_admin:
            form.update(dict(email='*****@*****.**'))

        content = load_content('index.md') + form.edit()
        return page(content)
예제 #9
0
파일: index.py 프로젝트: robinsax/zoom
    def table(self, name, limit='6'):
        db = self.model.site.db
        items = RecordStore(db, MyModel, name=name)
        if len(items) == 1:
            footer_name = 'record'
        else:
            footer_name = 'records'
        footer = len(items) and '%s %s' % (len(items), footer_name) or ''

        # If there is an id column we will use it to select the last N items,
        # otherwise we'll just select the whole thing and then take what we
        # want from the list.
        columns = db.get_column_names(name)
        limit = int(limit)
        data = 'id' in columns and items[-limit:] or list(items)[-limit:]

        content = browse(data, footer=footer, title='Sample Data')

        if name in db.get_tables():
            content += browse(db('describe ' + name), title='Structure')

        if name in db.get_tables():
            content += browse(db('show index from ' + name), title='Index')

        database = db.database.name
        if database:
            content += browse(db(
                'show table status in {} where name=%s'.format(database),
                name),
                              title='Metadata')

        return page(content, title='Record: ' + name)
예제 #10
0
def not_found(request):
    """return a 404 page for site"""
    logger = logging.getLogger(__name__)
    logger.debug('responding with 404 for {!r}'.format(request.path))
    response = page(zoom.templates.page_not_found).render(request)
    response.status = '404 Not Found'
    return response
예제 #11
0
파일: index.py 프로젝트: zodman/ZoomFoundry
 def environment(self):
     return page(zoom.Component(
         h.h2('Zoom'),
         zoom.html.table([
             ('Version', zoom.__version__ + ' Community Edition'),
             ('Installed Path', zoom.tools.zoompath()),
         ]),
         h.h2('Python'),
         zoom.html.table([
             ('sys.version', sys.version),
             ('sys.path', '<br>'.join(sys.path)),
         ]),
         h.h2('Operating System'),
         zoom.html.table([
             ('Name', os.name),
             ('PATH', '<br>'.join(os.environ.get('PATH').split(':')))
         ]),
         h.h2('Platform'),
         zoom.html.table([('Node', platform.node()),
                          ('System', platform.system()),
                          ('Machine', platform.machine()),
                          ('Archtitecture',
                           ' '.join(platform.architecture()))]),
         h.h2('Variables'),
         zoom.html.table(list(os.environ.items())),
         css="""
                 .content table { width: 100%; }
                 .content table td { vertical-align: top; width: 70%; }
                 .content table td:first-child { width: 25%; }
             """),
                 title='Environment')
예제 #12
0
 def index(self):
     footer = '{} records'.format(len(self.data))
     content = component(
         browse(self.data, title="Browse", footer=footer),
         #browse(self.data, title="Table", footer=footer),
     )
     return page(content, title='Tables')
예제 #13
0
파일: index.py 프로젝트: robinsax/zoom
 def environment(self):
     return page(
         zoom.Component(
             h.h2('Python'),
             zoom.tags.table([
                 ('Version', sys.version),
                 ('PYTHONPATH', '<br>'.join(sys.path)),
                 ('PATH', '<br>'.join(os.environ.get('PATH').split(':')))
             ]),
             h.h2('Operating System'),
             zoom.tags.table([
                 ('Name', os.name),
                 ('PYTHONPATH', '<br>'.join(sys.path)),
                 ('PATH', '<br>'.join(os.environ.get('PATH').split(':')))
             ]),
             h.h2('Platform'),
             zoom.tags.table([
                 ('Node', platform.node()),
                 ('System', platform.system()),
                 ('Machine', platform.machine()),
                 ('Archtitecture', ' '.join(platform.architecture()))
             ]),
             h.h2('Variables'),
             zoom.tags.table(
                 list(os.environ.items())
             ),
             css = """
                 .content table { width: 100%; }
                 .content table td { vertical-align: top; }
             """
         ),
         title='Environment'
     )
예제 #14
0
파일: mail.py 프로젝트: RyanLainchbury/zoom
 def compose(self):
     # print(context.site)
     return page(content='Send mail as "{} &lt;{}&gt;"<br><br>{}'.format(
         context.site.mail_from_name,
         context.site.mail_from_addr,
         mail_form.edit(),
     ), title='Send Mail')
예제 #15
0
파일: index.py 프로젝트: zodman/ZoomFoundry
    def requests(self, show_all=False):
        def fmt(rec):
            entry = (link_to(str(rec[0]), '/admin/entry/' + str(rec[0])), )
            user = (zoom.helpers.who(rec[4]), )
            link = (zoom.link_to(rec[2]), )
            return entry + (rec[1], ) + link + rec[3:4] + user + rec[5:]

        path_filter = '' if show_all else 'and path not like "%%\\/\\_%%"'
        db = self.model.site.db
        data = db(
            """
            select
                id, app, path, status, user_id, address, login, timestamp, elapsed
            from log
            where status in ('C', 'I', 'W')
            and server = %s
            {}
            order by id desc
            limit 100""".format(path_filter), zoom.system.request.host)
        labels = 'id', 'app', 'path', 'status', 'user', 'address', 'login', 'timestamp', 'elapsed'
        data = list(map(fmt, data))
        actions = () if show_all else ('Show All', )
        return page(zoom.browse(data, labels=labels),
                    title='Requests',
                    actions=actions)
예제 #16
0
def display_errors(request, handler, *rest):
    """Display errors for developers

    >>> request = zoom.request.build('http://localhost')
    >>> request.app = zoom.utils.Bunch(theme='default', templates_paths=[])
    >>> request.host = 'localhost'
    >>> request.site = zoom.sites.Site()
    >>> request.site.theme = 'default'
    >>> request.site.request = request
    >>> zoom.system.request = request
    >>> zoom.system.site = request.site
    >>> zoom.system.user = request.site.users.first(username='******')
    >>> zoom.system.user.is_admin = True
    >>> def throw(request):
    ...     raise Exception('ouch!')
    >>> response = display_errors(request, throw)
    >>> isinstance(response, HTMLResponse)
    True
    >>> zoom.system.user.is_admin = False
    >>> response = display_errors(request, throw)
    >>> isinstance(response, HTMLResponse)
    True
    """
    try:
        return handler(request, *rest)
    except Exception:
        msg = traceback.format_exc()
        logger = logging.getLogger(__name__)
        logger.error(msg)

        if not (hasattr(zoom.system, 'user') and zoom.system.user.is_admin):
            content = zoom.tools.load_template('friendly_error',
                                               zoom.templates.friendly_error)
            return page(content).render(request)

        content = """
        <h2>Exception</h2>
        {}

        <h2>Request</h2>
        <pre>{}</pre>
        """.format(
            html.pre(msg),
            str(request),
        )

        return page(content, title='Application Error').render(request)
예제 #17
0
 def entity(self, name):
     items = EntityStore(self.model.site.db, MyModel, kind=name)
     if len(items) == 1:
         footer_name = 'record'
     else:
         footer_name = 'records'
     footer = len(items) and '%s %s' % (len(items), footer_name) or ''
     return page(browse(items, footer=footer), title='Entity: ' + name)
예제 #18
0
파일: alerts.py 프로젝트: sean-hayes/zoom
 def stdout(self):
     print('Here is some stdout output!')
     msg = """
     stdout output
     <br><br>
     <a href="<dz:parent_path>">Go Back</a>
     """
     return page(msg, title='Stdout')
예제 #19
0
파일: fields.py 프로젝트: sean-hayes/zoom
 def edit(self, key=None, *a, **k):
     site = self.model.site
     # path = os.path.join(site.data_path, 'buckets')
     # bucket = Bucket(path)
     form1.update(sample)
     form1.update(k)
     content = form1.edit()
     return page(content, actions=actions, title='Edit Mode')
예제 #20
0
    def show_error(self, key):
        db = self.model.site.db
        log_entry = db('select * from log where id=%s', key).first()

        content = '<br><br>'.join(map(str, log_entry)).replace(
            '\n', '<br>'
        )
        return page(content, title='Log Entry')
예제 #21
0
 def new(self, *args, **kwargs):
     """Return a New Item form"""
     c = self.collection
     c.user.authorize('create', c)
     if kwargs:
         c.fields.validate(kwargs)
     form = form_for(c.fields, ButtonField('Create', cancel=c.url))
     return page(form, title='New '+c.item_title)
예제 #22
0
 def audit(self):
     db = self.model.site.db
     log_data = db("""
         select *
         from audit_log
         order by timestamp desc
         limit 100""")
     return page(browse(log_data), title='Activity')
예제 #23
0
파일: index.py 프로젝트: zodman/ZoomFoundry
 def log(self):
     """view system log"""
     save_logging = self.model.site.logging
     try:
         content = callback(self._system_log)
     finally:
         self.model.site.logging = save_logging
     return page(content, title='System Log')
예제 #24
0
 def activity(self):
     db = self.model.site.db
     log_data = db("""
         select *
         from log
         where status in ('A')
         order by timestamp desc, id desc
         limit 100""")
     return page(browse(log_data), title='Activity')
예제 #25
0
 def requests(self):
     db = self.model.site.db
     log_data = db("""
         select *
         from log
         where status in ('C', 'I')
         order by timestamp desc
         limit 100""")
     return page(browse(log_data), title='Requests')
예제 #26
0
 def configuration(self):
     items = zoom.packages.get_registered_packages()
     packages = '<dt>combined</dt><dd>{}</dd>'.format(
         zoom.html.pre(json.dumps(items, indent=4, sort_keys=True)))
     return page(
         load_content('configuration.md').format(
             request=self.model,
             packages=packages,
         ))
예제 #27
0
파일: index.py 프로젝트: sean-hayes/zoom
 def show(self, path=None):
     template = 'default'
     if path == None or path == 'content/index.html':
         path = ''
         template = 'index'
     else:
         path = '/'.join(path.split('/')[1:])
     content = load_page(path)
     if content:
         return page(content, template=template)
예제 #28
0
파일: index.py 프로젝트: zodman/ZoomFoundry
 def entity(self, name, limit=20):
     items = EntityStore(self.model.site.db, MyModel, kind=name)
     limit = int(limit)
     count = len(items)
     if count == 1:
         footer_name = 'record'
     else:
         footer_name = 'records'
     footer = count and '%s %s' % (count, footer_name) or ''
     if count > limit:
         items = items[-limit:]  # most recent 100
     return page(browse(items, footer=footer), title='Entity: ' + name)
예제 #29
0
    def queue(self, name):
        items = self.model.site.queues.topic(name, -1)
        items = [(n, repr(x)) for n, x in enumerate(items)]

        if len(items) == 1:
            footer_name = 'message'
        else:
            footer_name = 'messages'
        footer = len(items) and '%s %s' % (len(items), footer_name) or ''
        return page(browse(items,
                           labels=('Position', 'Message'),
                           footer=footer),
                    title='Topic: ' + name)
예제 #30
0
파일: alerts.py 프로젝트: sean-hayes/zoom
    def index(self):
        content = markdown("""
        Alerts
        ====
        * [Success](alerts/success)
        * [Warning](alerts/warning)
        * [Error](alerts/error)
        * [Random](alerts/random)

        Developer
        ====
        * [Stdout](alerts/stdout)
        """)
        return page(content)
예제 #31
0
 def index(self, *a, **k):
     username = k.get('username', '')
     user = self.model.user
     referrer_url = k.get('referrer')
     if referrer_url:
         referrer = html.hidden(
             id="referrer",
             name="referrer",
             value=referrer_url,
         )
     else:
         referrer = ''
     form = LoginForm(username=username, user=user, referrer=referrer)
     return page(form)