Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
bdb30bd
commit cd969c4
Showing
20 changed files
with
329 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
Empty file.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#!/usr/bin/python | ||
# -*- coding: utf-8 -*- | ||
|
||
|
||
def index(): | ||
return dict() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
#crontab |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
response.generic_patterns = ['*'] |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,233 @@ | ||
{{extend 'layout.html'}} | ||
<script><!-- | ||
jQuery(document).ready(function(){ | ||
jQuery("table.sortable tbody tr").mouseover( function() { | ||
jQuery(this).addClass("highlight"); }).mouseout( function() { | ||
jQuery(this).removeClass("highlight"); }); | ||
jQuery('table.sortable tbody tr:odd').addClass('odd'); | ||
jQuery('table.sortable tbody tr:even').addClass('even'); | ||
}); | ||
//--></script> | ||
|
||
{{if request.function=='index':}} | ||
<h1>{{=T("Available databases and tables")}}</h1> | ||
{{if not databases:}}{{=T("No databases in this application")}}{{pass}} | ||
{{for db in sorted(databases):}} | ||
{{for table in databases[db].tables:}} | ||
{{qry='%s.%s.id>0'%(db,table)}} | ||
{{tbl=databases[db][table]}} | ||
{{if hasattr(tbl,'_primarykey'):}} | ||
{{if tbl._primarykey:}} | ||
{{firstkey=tbl[tbl._primarykey[0]]}} | ||
{{if firstkey.type in ['string','text']:}} | ||
{{qry='%s.%s.%s!=""'%(db,table,firstkey.name)}} | ||
{{else:}} | ||
{{qry='%s.%s.%s>0'%(db,table,firstkey.name)}} | ||
{{pass}} | ||
{{else:}} | ||
{{qry=''}} | ||
{{pass}} | ||
{{pass}} | ||
<h2>{{=A("%s.%s" % (db,table),_href=URL('select',args=[db],vars=dict(query=qry)))}} | ||
</h2> | ||
[ {{=A(str(T('insert new'))+' '+table,_href=URL('insert',args=[db,table]))}} ] | ||
<br /><br /> | ||
{{pass}} | ||
{{pass}} | ||
|
||
{{elif request.function=='select':}} | ||
<h1>{{=XML(str(T("database %s select"))%A(request.args[0],_href=URL('index'))) }} | ||
</h1> | ||
{{if table:}} | ||
[ {{=A(str(T('insert new %s'))%table,_href=URL('insert',args=[request.args[0],table]))}} ]<br/><br/> | ||
<h2>{{=T("Rows in table")}}</h2><br/> | ||
{{else:}} | ||
<h2>{{=T("Rows selected")}}</h2><br/> | ||
{{pass}} | ||
{{=form}} | ||
<p>{{=T('The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.')}}<br/> | ||
{{=T('Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.')}}<br/> | ||
{{=T('"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN')}}</p> | ||
<br/><br/> | ||
<h3>{{=nrows}} {{=T("selected")}}</h3> | ||
{{if start>0:}}[ {{=A(T('previous 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start-100)))}} ]{{pass}} | ||
{{if stop<nrows:}}[ {{=A(T('next 100 rows'),_href=URL('select',args=request.args[0],vars=dict(start=start+100)))}} ]{{pass}} | ||
{{if rows:}} | ||
<div style="overflow: auto;" width="80%"> | ||
{{linkto=URL('update',args=request.args[0])}} | ||
{{upload=URL('download',args=request.args[0])}} | ||
{{=SQLTABLE(rows,linkto,upload,orderby=True,_class='sortable')}} | ||
</div> | ||
{{pass}} | ||
<br/><br/><h2>{{=T("Import/Export")}}</h2><br/> | ||
[ <a href="{{=URL('csv',args=request.args[0],vars=dict(query=query))}}">{{=T("export as csv file")}}</a> ] | ||
{{if table:}} | ||
{{=FORM(str(T('or import from csv file'))+" ",INPUT(_type='file',_name='csvfile'),INPUT(_type='hidden',_value=table,_name='table'),INPUT(_type='submit',_value='import'))}} | ||
{{pass}} | ||
|
||
|
||
{{elif request.function=='insert':}} | ||
<h1>{{=T("database")}} {{=A(request.args[0],_href=URL('index'))}} | ||
{{if hasattr(table,'_primarykey'):}} | ||
{{fieldname=table._primarykey[0]}} | ||
{{dbname=request.args[0]}} | ||
{{tablename=request.args[1]}} | ||
{{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} | ||
{{=T("table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} | ||
{{else:}} | ||
{{=T("table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} | ||
{{pass}} | ||
</h1> | ||
<h2>{{=T("New Record")}}</h2><br/> | ||
{{=form}} | ||
|
||
|
||
|
||
{{elif request.function=='update':}} | ||
<h1>{{=T("database")}} {{=A(request.args[0],_href=URL('index'))}} | ||
{{if hasattr(table,'_primarykey'):}} | ||
{{fieldname=request.vars.keys()[0]}} | ||
{{dbname=request.args[0]}} | ||
{{tablename=request.args[1]}} | ||
{{cond = table[fieldname].type in ['string','text'] and '!=""' or '>0'}} | ||
{{=T("table")}} {{=A(tablename,_href=URL('select',args=dbname,vars=dict(query='%s.%s.%s%s'%(dbname,tablename,fieldname,cond))))}} | ||
{{=T("record")}} {{=A('%s=%s'%request.vars.items()[0],_href=URL('update',args=request.args[:2],vars=request.vars))}} | ||
{{else:}} | ||
{{=T("table")}} {{=A(request.args[1],_href=URL('select',args=request.args[0],vars=dict(query='%s.%s.id>0'%tuple(request.args[:2]))))}} | ||
{{=T("record id")}} {{=A(request.args[2],_href=URL('update',args=request.args[:3]))}} | ||
{{pass}} | ||
</h1> | ||
<h2>{{=T("Edit current record")}}</h2><br/><br/>{{=form}} | ||
|
||
|
||
|
||
{{elif request.function=='state':}} | ||
<h1>{{=T("Internal State")}}</h1> | ||
<h2>{{=T("Current request")}}</h2> | ||
{{=BEAUTIFY(request)}} | ||
<br/><h2>{{=T("Current response")}}</h2> | ||
{{=BEAUTIFY(response)}} | ||
<br/><h2>{{=T("Current session")}}</h2> | ||
{{=BEAUTIFY(session)}} | ||
|
||
|
||
{{elif request.function == 'ccache':}} | ||
<h1>Cache</h1> | ||
<div class="wrapper"> | ||
<div class="list"> | ||
<div class="list-header"> | ||
<h2>Statistics</h2> | ||
</div> | ||
<div class="content"> | ||
<h3>Overview</h3> | ||
<p>Number of entries: <strong>{{=total['entries']}}</strong> | ||
{{if total['entries'] > 0:}} | ||
<p> | ||
Hit Ratio: | ||
<strong>{{=total['ratio']}}%</strong> | ||
(<strong>{{=total['hits']}}</strong> hits | ||
and <strong>{{=total['misses']}}</strong> misses) | ||
</p> | ||
<p> | ||
Size of cache: | ||
{{if object_stats:}} | ||
<strong>{{=total['objects']}}</strong> items, | ||
<strong>{{=total['bytes']}}</strong> bytes | ||
{{if total['bytes'] > 524287:}} | ||
(<strong>{{="%.0d" % (total['bytes'] / 1048576)}} MB</strong>) | ||
{{pass}} | ||
{{else:}} <strong>not available</strong> (requires the Python <a href="http://pypi.python.org/pypi/guppy/" target="_blank">guppy</a> library) | ||
{{pass}} | ||
</p> | ||
<p> | ||
Cache contains items up to | ||
<strong>{{="%02d" % total['oldest'][0]}}</strong> hours | ||
<strong>{{="%02d" % total['oldest'][1]}}</strong> minutes | ||
<strong>{{="%02d" % total['oldest'][2]}}</strong> seconds old. | ||
</p> | ||
{{=BUTTON(T('Cache Keys'), _onclick='jQuery("#all_keys").toggle();')}} | ||
<div class="hidden" id="all_keys"> | ||
{{=total['keys']}} | ||
</div> | ||
<br /> | ||
{{pass}} | ||
|
||
<h3>RAM</h3> | ||
<p>Number of entries: <strong>{{=ram['entries']}}</strong> | ||
{{if ram['entries'] > 0:}} | ||
<p> | ||
Hit Ratio: | ||
<strong>{{=ram['ratio']}}%</strong> | ||
(<strong>{{=ram['hits']}}</strong> hits | ||
and <strong>{{=ram['misses']}}</strong> misses) | ||
</p> | ||
<p> | ||
Size of cache: | ||
{{if object_stats:}} | ||
<strong>{{=ram['objects']}}</strong> items, | ||
<strong>{{=ram['bytes']}}</strong> bytes | ||
{{if ram['bytes'] > 524287:}} | ||
(<strong>{{=ram['bytes'] / 1048576}} MB</strong>) | ||
{{pass}} | ||
{{else:}} <strong>not available</strong> (requires the Python <a href="http://pypi.python.org/pypi/guppy/" target="_blank">guppy</a> library) | ||
{{pass}} | ||
</p> | ||
<p> | ||
RAM contains items up to | ||
<strong>{{="%02d" % ram['oldest'][0]}}</strong> hours | ||
<strong>{{="%02d" % ram['oldest'][1]}}</strong> minutes | ||
<strong>{{="%02d" % ram['oldest'][2]}}</strong> seconds old. | ||
</p> | ||
{{=BUTTON(T('RAM Cache Keys'), _onclick='jQuery("#ram_keys").toggle();')}} | ||
<div class="hidden" id="ram_keys"> | ||
{{=ram['keys']}} | ||
</div> | ||
<br /> | ||
{{pass}} | ||
|
||
<h3>DISK</h3> | ||
<p>Number of entries: <strong>{{=disk['entries']}}</strong> | ||
{{if disk['entries'] > 0:}} | ||
<p> | ||
Hit Ratio: | ||
<strong>{{=disk['ratio']}}%</strong> | ||
(<strong>{{=disk['hits']}}</strong> hits | ||
and <strong>{{=disk['misses']}}</strong> misses) | ||
</p> | ||
<p> | ||
Size of cache: | ||
{{if object_stats:}} | ||
<strong>{{=disk['objects']}}</strong> items, | ||
<strong>{{=disk['bytes']}}</strong> bytes | ||
{{if disk['bytes'] > 524287:}} | ||
(<strong>{{=disk['bytes'] / 1048576}} MB</strong>) | ||
{{pass}} | ||
{{else:}} <strong>not available</strong> (requires the Python <a href="http://pypi.python.org/pypi/guppy/" target="_blank">guppy</a> library) | ||
{{pass}} | ||
</p> | ||
<p> | ||
DISK contains items up to | ||
<strong>{{="%02d" % disk['oldest'][0]}}</strong> hours | ||
<strong>{{="%02d" % disk['oldest'][1]}}</strong> minutes | ||
<strong>{{="%02d" % disk['oldest'][2]}}</strong> seconds old. | ||
</p> | ||
{{=BUTTON(T('Disk Cache Keys'), _onclick='jQuery("#disk_keys").toggle();')}} | ||
<div class="hidden" id="disk_keys"> | ||
{{=disk['keys']}} | ||
</div> | ||
<br /> | ||
{{pass}} | ||
</div> | ||
|
||
<div class="list-header"> | ||
<h2>Manage Cache</h2> | ||
</div> | ||
<div class="content"> | ||
<p> | ||
{{=form}} | ||
</p> | ||
</div> | ||
</div> | ||
<div class="clear"></div> | ||
</div> | ||
{{pass}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
{{extend 'layout.html'}} | ||
{{""" | ||
|
||
You should not modify this file. | ||
It is used as default when a view is not provided for your controllers | ||
|
||
"""}} | ||
<h2>{{=' '.join(x.capitalize() for x in request.function.split('_'))}}</h2> | ||
{{if len(response._vars)==1:}} | ||
{{=response._vars.values()[0]}} | ||
{{elif len(response._vars)>1:}} | ||
{{=BEAUTIFY(response._vars)}} | ||
{{pass}} | ||
{{if request.is_local:}} | ||
{{=response.toolbar()}} | ||
{{pass}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{{from gluon.serializers import json}}{{=XML(json(response._vars))}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
{{ | ||
### | ||
# response._vars contains the dictionary returned by the controller action | ||
### | ||
try: | ||
from gluon.serializers import json | ||
result = "%s(%s)" % (request.vars['callback'], json(response._vars)) | ||
response.write(result, escape=False) | ||
response.headers['Content-Type'] = 'application/jsonp' | ||
except (TypeError, ValueError): | ||
raise HTTP(405, 'JSON serialization error') | ||
except ImportError: | ||
raise HTTP(405, 'JSON not available') | ||
except: | ||
raise HTTP(405, 'JSON error') | ||
}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
{{''' | ||
# License: Public Domain | ||
# Author: Iceberg at 21cn dot com | ||
|
||
With this generic.load file, you can use same function to serve two purposes. | ||
|
||
= regular action | ||
- ajax callback (when called with .load) | ||
|
||
Example modified from http://www.web2py.com/AlterEgo/default/show/252: | ||
|
||
def index(): | ||
return dict( | ||
part1='hello world', | ||
part2=LOAD(url=URL(r=request,f='auxiliary.load'),ajax=True)) | ||
|
||
def auxiliary(): | ||
form=SQLFORM.factory(Field('name')) | ||
if form.accepts(request.vars): | ||
response.flash = 'ok' | ||
return dict(message="Hello %s" % form.vars.name) | ||
return dict(form=form) | ||
|
||
Notice: | ||
|
||
- no need to set response.headers['web2py-response-flash'] | ||
- no need to return a string | ||
even if the function is called via ajax. | ||
|
||
'''}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}} |
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
{{ | ||
### | ||
# response._vars contains the dictionary returned by the controller action | ||
# for this to work the action must return something like | ||
# | ||
# dict(title=...,link=...,description=...,created_on='...',items=...) | ||
# | ||
# items is a list of dictionaries each with title, link, description, pub_date. | ||
### | ||
from gluon.serializers import rss}}{{=XML(rss(response._vars))}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
{{from gluon.serializers import xml}}{{=XML(xml(response._vars))}} |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
{{ | ||
response.files.insert(0,URL('static','js/jquery.js')) | ||
response.files.insert(1,URL('static','css/anytime.css')) | ||
response.files.insert(2,URL('static','js/anytime.js')) | ||
response.include_meta() | ||
response.include_files() | ||
}} | ||
<script type="text/javascript"><!-- | ||
// These variables are used by the web2py_ajax_init function in web2py_ajax.js (which is loaded below). | ||
var w2p_ajax_confirm_message = "{{=T('Are you sure you want to delete this object?')}}"; | ||
var w2p_ajax_date_format = "{{=T('%Y-%m-%d')}}"; | ||
var w2p_ajax_datetime_format = "{{=T('%Y-%m-%d %H:%M:%S')}}"; | ||
//--></script> | ||
<script src="{{=URL('static','js/web2py_ajax.js')}}" type="text/javascript"></script> |