예제 #1
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)
예제 #2
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')
예제 #3
0
def activity_panel(db):

    host = zoom.system.request.host

    data = db(
        """
    select
        log.id,
        users.username,
        log.address,
        log.path,
        log.timestamp,
        log.elapsed
    from log left join users on log.user_id = users.id
    where server = %s and path not like "%%\\/\\_%%"
    and log.status = 'C'
    order by timestamp desc
    limit 15
    """, host)

    rows = []
    for rec in data:
        row = [
            link_to(str(rec[0]), '/admin/entry/' + str(rec[0])),
            link_to_user(rec[1]),
            rec[2],
            rec[3],
            how_long_ago(rec[4]),
            rec[4],
            rec[5],
        ]
        rows.append(row)

    labels = 'id', 'user', 'address', 'path', 'when', 'timestamp', 'elapsed'
    return browse(rows, labels=labels, title=link_to_page('Requests'))
예제 #4
0
def users_panel(db):

    host = zoom.system.request.host

    data = db(
        """
    select
        users.username,
        max(log.timestamp) as timestamp,
        count(*) as requests
    from log, users
        where log.user_id = users.id
        and timestamp >= %s
        and server = %s
        and path not like "%%\\/\\_%%"
    group by users.username
    order by timestamp desc
    limit 10
    """,
        today() - datetime.timedelta(days=14), host)

    rows = []
    for rec in data:
        row = [
            link_to_user(rec[0]),
            how_long_ago(rec[1]),
            rec[2],
        ]
        rows.append(row)

    labels = 'user', 'last seen', 'requests'
    return browse(rows, labels=labels, title=link_to_page('Users'))
예제 #5
0
def log_data(db, status, n, limit, q):
    """retreive log data"""

    host = zoom.system.request.host

    statuses = tuple(status)
    offset = int(n) * int(limit)
    cmd = """
        select
            id,
            status,
            user_id,
            address,
            app,
            path,
            timestamp,
            elapsed
        from log
        where status in %s and server = %s
        order by id desc
        limit {limit}
        offset {offset}
        """.format(limit=int(limit), offset=offset, statuses=statuses)
    data = db(cmd, statuses, host)
    data = [[
        link_to(str(item[0]), '/admin/entry/' + str(item[0])),
        item[1],
        zoom.helpers.who(item[2]),
    ] + list(item[3:]) for item in data if q in repr(item)]
    labels = ('id', 'status', 'user', 'address', 'app', 'path', 'timestamp',
              'elapsed')
    return browse(data, labels=labels)
예제 #6
0
def error_panel(db):

    host = zoom.system.request.host

    data = db(
        """
        select
            log.id,
            username,
            path,
            timestamp
        from log left join users on log.user_id = users.id
        where log.status in ("E") and timestamp>=%s
        and server = %s
        order by log.id desc
        limit 10
        """, today(), host)

    rows = []
    for rec in data:
        row = [
            link_to(str(rec[0]), '/admin/entry/' + str(rec[0])),
            link_to_user(rec[1]),
            rec[2],
            how_long_ago(rec[3]),
        ]
        rows.append(row)

    labels = 'id', 'user', 'path', 'when'
    return browse(rows, labels=labels, title=link_to_page('Errors'))
예제 #7
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')
예제 #8
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)
예제 #9
0
    def index(self):
        site = self.model
        db = site.db

        cmd = 'select id, username, email, phone from users limit 10'
        data = browse(db(cmd)) + \
            '<br>or in sortable form:' + browse(db(cmd), sortable=True)

        content = load_content(
            'sample.md',
            data=data,
            name='a name',
            form1=my_form.edit(),
            form2=my_form.show(),
            form3=small_form.edit(),
        )
        return page(content)
예제 #10
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')
예제 #11
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')
예제 #12
0
 def _system_log(self):
     self.model.site.logging = False
     db = self.model.site.db
     data = db("""
         select
             id, app, path, status, address, elapsed, message
         from log
         order by id desc limit 50
         """)
     return browse(data)
예제 #13
0
    def index(self, q=''):
        db = self.model.site.db

        users = sorted(Users(db).find(status='A'), key=lambda a: a.name)
        groups = db('select * from groups')
        members = db('select * from members')
        subgroups = db('select * from subgroups')

        content = Component(
            index_metrics_view(db),
            IndexPageLayoutView(
                feed1=Component(
                    PanelView(title='Users', content=browse(users)),
                    PanelView(title='Groups', content=browse(groups)),
                ),
                feed2=PanelView(title='Memberships', content=browse(members)),
                feed3=PanelView(title='Subgroups', content=browse(subgroups)),
            ),
        )
        return page(content, title='Overview', subtitle='Raw dump of main tables', search=q)
예제 #14
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)
예제 #15
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)
예제 #16
0
파일: mail.py 프로젝트: JW709/zoom
 def index(self):
     actions = ['Compose']
     site = zoom.system.request.site
     mail_settings = '&nbsp;&nbsp;'.join([
         '%s: %s' % (k, v) for k, v in dict(
             host=site.smtp_host,
             user=site.smtp_user,
             port=site.smtp_port,
             passwd=('*' * (len(site.smtp_passwd) - 2)) + site.smtp_passwd[-2:],
         ).items() if v
     ])
     content = mail_settings + '<h2>Waiting</h2>' + browse(get_mail_store(context.site))
     return zoom.page(content, title='Mail', actions=actions)
예제 #17
0
    def table(self, name, limit='50'):
        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 first 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]

        return page(browse(data, footer=footer), title='Record: ' + name)
예제 #18
0
    def audit(self):
        """view audit log"""
        def fmt(rec):
            user = (zoom.helpers.who(rec[2]), )
            when = (zoom.helpers.when(rec[-1]), )
            return rec[0:2] + user + rec[3:-1] + when

        db = self.model.site.db
        data = list(
            map(
                fmt,
                db("""
            select
                *
            from audit_log
            order by id desc
            limit 100""")))

        labels = 'ID', 'App', 'By Whom', 'Activity', 'Subject 1', 'Subject 2', 'When'
        return page(browse(data, labels=labels), title='Activity')
예제 #19
0
    def index(self, q='', *args, **kwargs):
        """collection landing page"""
        def matches(item, search_text):
            """match a search by field values"""
            terms = search_text and search_text.split()
            fields.update(item)
            v = repr(fields.display_value()).lower()
            return terms and not any(t.lower() not in v for t in terms)

        c = self.collection
        user = c.user
        fields = c.fields

        if c.request.route[-1:] == ['index']:
            return redirect_to('/' + '/'.join(c.request.route[:-1]), **kwargs)

        actions = user.can('create', c) and ['New'] or []

        authorized = (i for i in c.store if user.can('read', i))
        matching = (i for i in authorized if not q or matches(i, q))
        filtered = c.filter and filter(c.filter, matching) or matching
        items = sorted(filtered, key=c.order)

        if q:
            msg = '%s searched %s with %r (%d found)' % (user.link, c.link, q,
                                                         len(items))
            log_activity(msg)

        if len(items) != 1:
            footer_name = c.title
        else:
            footer_name = c.item_name
        footer = '%s %s' % (len(items), footer_name.lower())

        content = browse([c.model(i) for i in items],
                         labels=c.labels,
                         columns=c.columns,
                         fields=c.fields,
                         footer=footer)

        return page(content, title=c.title, actions=actions, search=q)
예제 #20
0
 def errors(self, n=0, limit=50):
     offset = int(n) * int(limit)
     db = self.model.site.db
     log_data = db("""
         select
             id,
             user_id,
             address,
             app,
             path,
             timestamp,
             elapsed
         from log
         where status='E'
         order by timestamp desc
         limit {limit}
         offset {offset}""".format(**locals()))
     labels = 'id', 'user', 'address', 'app', 'path', 'timestamp', 'elapsed'
     data = [
         [link_to(str(item[0]), '/admin/show_error/' + str(item[0]))] + list(item[1:])
         for item in log_data
     ]
     return page(browse(data, labels=labels), title='Errors')
예제 #21
0
    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]), )
            return entry + rec[1: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(browse(data, labels=labels),
                    title='Requests',
                    actions=actions)
예제 #22
0
    def index(self, q='', *args, **kwargs):
        """collection landing page"""

        def get_recent(number):
            cmd = """
                select row_id, max(value) as newest
                from attributes
                where kind = %s and attribute in ("created", "updated")
                group by row_id
                order by newest desc
                limit %s
            """
            ids = [id for id, _ in c.store.db(cmd, c.store.kind, number)]
            return c.store.get(ids)

        c = self.collection
        user = c.user

        if c.request.route[-1:] == ['index']:
            return redirect_to('/'+'/'.join(c.request.route[:-1]), **kwargs)

        actions = user.can('create', c) and ['New'] or []

        logger = logging.getLogger(__name__)
        if q:
            title = 'Selected ' + c.title
            records = c.search_engine(c).search(q)
        else:
            many_records = bool(len(c.store) > 50)
            logger.debug('many records: %r', many_records)
            if many_records and not kwargs.get('all'):
                title = 'Most Recently Updated ' + c.title
                records = get_recent(15)
                actions.append(('Show All', 'clients?all=1'))
            else:
                title = c.title
                records = c.store

        authorized = (i for i in records if user.can('read', i))
        filtered = c.filter and filter(c.filter, authorized) or authorized
        items = sorted(filtered, key=c.order)
        num_items = len(items)

        if num_items != 1:
            footer_name = c.title.lower()
        else:
            footer_name = c.item_title.lower()

        if q:
            msg = '%s searched %s with %r (%d found)' % (
                user.link, c.link, q, num_items
            )
            log_activity(msg)
            footer = '{:,} {} found in search of {:,} {}'.format(
                num_items,
                footer_name,
                len(c.store),
                c.title.lower(),
            )
        else:
            if many_records:
                footer = '{:,} {} shown of {:,} {}'.format(
                    num_items,
                    footer_name,
                    len(c.store),
                    c.title.lower(),
                )
            else:
                footer = '%s %s' % (len(items), footer_name)

        content = browse(
            [c.model(i) for i in items],
            labels=c.get_labels(),
            columns=c.get_columns(),
            fields=c.fields,
            footer=footer
        )

        return page(content, title=title, actions=actions, search=q)
예제 #23
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')
예제 #24
0
파일: mail.py 프로젝트: sean-hayes/zoom
 def index(self):
     actions = ['Compose']
     content = '<h2>Waiting</h2>' + browse(get_mail_store(context.site))
     return page(content, title='Mail', actions=actions)
예제 #25
0
    def index(self, q='', *args, **kwargs):
        """collection landing page"""

        c = self.collection
        user = c.user

        if c.request.route[-1:] == ['index']:
            return redirect_to('/' + '/'.join(c.request.route[:-1]), **kwargs)

        actions = user.can('create', c) and ['New'] or []

        logger = logging.getLogger(__name__)
        if q:
            title = 'Selected ' + c.title
            records = c.search(q)
        else:
            has_many_records = c.has_many_records
            logger.debug('has many records: %r', has_many_records)
            if has_many_records and not kwargs.get('all'):
                title = 'Most Recently Updated ' + c.title
                records = self._get_recent(15)
                actions.append(('Show All', c.url + '?all=1'))
            else:
                title = c.title
                records = c.store

        authorized = (i for i in records if user.can('read', i))
        filtered = c.filter and filter(c.filter, authorized) or authorized
        items = sorted(filtered, key=c.order)
        items = c.sorter and c.sorter(items) or items
        num_items = len(items)

        if num_items != 1:
            footer_name = c.title.lower()
        else:
            footer_name = c.item_title.lower()

        if q:
            msg = '%s searched %s with %r (%d found)' % (user.link, c.link, q,
                                                         num_items)
            log_activity(msg)
            footer = '{:,} {} found in search of {:,} {}'.format(
                num_items,
                footer_name,
                len(c.store),
                c.title.lower(),
            )
        else:
            if has_many_records:
                footer = '{:,} {} shown of {:,} {}'.format(
                    num_items,
                    footer_name,
                    len(c.store),
                    c.title.lower(),
                )
            else:
                footer = '%s %s' % (len(items), footer_name)

        content = browse([c.model(i) for i in items],
                         labels=c.get_labels(),
                         columns=c.get_columns(),
                         fields=c.fields,
                         footer=footer)

        return page(content, title=title, actions=actions, search=q)