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)
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')
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'))
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'))
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)
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'))
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')
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)
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)
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')
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')
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)
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)
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)
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)
def index(self): actions = ['Compose'] site = zoom.system.request.site mail_settings = ' '.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)
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)
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')
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)
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')
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)
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)
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')
def index(self): actions = ['Compose'] content = '<h2>Waiting</h2>' + browse(get_mail_store(context.site)) return page(content, title='Mail', actions=actions)
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)