From 46e0dcebf2bb55e705718c25ada954e314685cbb Mon Sep 17 00:00:00 2001 From: mdipierro Date: Tue, 10 Mar 2015 13:42:58 -0500 Subject: [PATCH] welcome3 --- applications/welcome3/ABOUT | 2 + applications/welcome3/LICENSE | 4 + applications/welcome3/__init__.py | 1 + applications/welcome3/__init__.py.bak2 | 1 + applications/welcome3/__init__.pyc | Bin 0 -> 120 bytes applications/welcome3/controllers/appadmin.py | 672 ++++++++++++++++ applications/welcome3/controllers/default.py | 71 ++ applications/welcome3/cron/crontab | 1 + applications/welcome3/cron/crontab.example | 1 + ...9d15150d7109e5f7ab36744a5b7_auth_cas.table | 108 +++ ...15150d7109e5f7ab36744a5b7_auth_event.table | 108 +++ ...15150d7109e5f7ab36744a5b7_auth_group.table | 58 ++ ...d7109e5f7ab36744a5b7_auth_membership.table | 58 ++ ...d7109e5f7ab36744a5b7_auth_permission.table | 91 +++ ...d15150d7109e5f7ab36744a5b7_auth_user.table | 137 ++++ applications/welcome3/databases/sql.log | 55 ++ .../welcome3/databases/storage.sqlite | Bin 0 -> 10240 bytes applications/welcome3/languages/cs.py | 480 ++++++++++++ applications/welcome3/languages/de.py | 199 +++++ applications/welcome3/languages/default.py | 122 +++ applications/welcome3/languages/es.py | 433 +++++++++++ applications/welcome3/languages/fr-ca.py | 195 +++++ applications/welcome3/languages/fr.py | 190 +++++ applications/welcome3/languages/hi.py | 149 ++++ applications/welcome3/languages/hu.py | 162 ++++ applications/welcome3/languages/id.py | 272 +++++++ applications/welcome3/languages/it.py | 249 ++++++ applications/welcome3/languages/my.py | 217 ++++++ applications/welcome3/languages/nl.py | 376 +++++++++ applications/welcome3/languages/pl.py | 171 +++++ applications/welcome3/languages/plural-cs.py | 20 + applications/welcome3/languages/plural-en.py | 15 + applications/welcome3/languages/plural-es.py | 8 + applications/welcome3/languages/plural-ru.py | 16 + applications/welcome3/languages/plural-uk.py | 17 + applications/welcome3/languages/pt-br.py | 176 +++++ applications/welcome3/languages/pt.py | 184 +++++ applications/welcome3/languages/ro.py | 373 +++++++++ applications/welcome3/languages/ru.py | 195 +++++ applications/welcome3/languages/sk.py | 171 +++++ applications/welcome3/languages/tr.py | 166 ++++ applications/welcome3/languages/uk.py | 227 ++++++ applications/welcome3/languages/zh-cn.py | 244 ++++++ applications/welcome3/languages/zh-tw.py | 244 ++++++ applications/welcome3/languages/zh.py | 231 ++++++ applications/welcome3/models/db.py | 89 +++ applications/welcome3/models/menu.py | 133 ++++ applications/welcome3/modules/__init__.py | 1 + applications/welcome3/modules/__init__.pyc | Bin 0 -> 128 bytes applications/welcome3/routes.example.py | 38 + applications/welcome3/routes.example.py.bak2 | 38 + applications/welcome3/static/403.html | 1 + applications/welcome3/static/404.html | 1 + applications/welcome3/static/500.html | 1 + .../static/css/bootstrap-responsive.min.css | 9 + .../welcome3/static/css/bootstrap.min.css | 5 + applications/welcome3/static/css/calendar.css | 7 + .../welcome3/static/css/web2py-bootstrap3.css | 291 +++++++ applications/welcome3/static/css/web2py.css | 313 ++++++++ .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 229 ++++++ .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes .../welcome3/static/images/facebook.png | Bin 0 -> 991 bytes .../welcome3/static/images/favicon.ico | Bin 0 -> 198 bytes .../welcome3/static/images/favicon.png | Bin 0 -> 323 bytes .../images/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../static/images/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../welcome3/static/images/gplus-32.png | Bin 0 -> 1513 bytes .../welcome3/static/images/twitter.png | Bin 0 -> 1120 bytes .../welcome3/static/js/analytics.min.js | 3 + .../welcome3/static/js/bootstrap.min.js | 6 + applications/welcome3/static/js/calendar.js | 29 + applications/welcome3/static/js/jquery.js | 4 + .../welcome3/static/js/modernizr.custom.js | 4 + .../welcome3/static/js/respond.min.js | 6 + applications/welcome3/static/js/share.js | 44 ++ .../welcome3/static/js/web2py-bootstrap3.js | 253 ++++++ applications/welcome3/static/js/web2py.js | 721 ++++++++++++++++++ applications/welcome3/views/__init__.py | 1 + applications/welcome3/views/appadmin.html | 268 +++++++ .../welcome3/views/default/index.html | 50 ++ applications/welcome3/views/default/user.html | 36 + applications/welcome3/views/generic.html | 16 + applications/welcome3/views/generic.ics | 17 + applications/welcome3/views/generic.json | 1 + applications/welcome3/views/generic.jsonp | 23 + applications/welcome3/views/generic.load | 30 + applications/welcome3/views/generic.map | 69 ++ applications/welcome3/views/generic.pdf | 11 + applications/welcome3/views/generic.rss | 10 + applications/welcome3/views/generic.xml | 1 + applications/welcome3/views/layout.html | 143 ++++ applications/welcome3/views/web2py_ajax.html | 16 + gluon/packages/dal | 2 +- 95 files changed, 9789 insertions(+), 1 deletion(-) create mode 100644 applications/welcome3/ABOUT create mode 100644 applications/welcome3/LICENSE create mode 100644 applications/welcome3/__init__.py create mode 100644 applications/welcome3/__init__.py.bak2 create mode 100644 applications/welcome3/__init__.pyc create mode 100644 applications/welcome3/controllers/appadmin.py create mode 100644 applications/welcome3/controllers/default.py create mode 100644 applications/welcome3/cron/crontab create mode 100644 applications/welcome3/cron/crontab.example create mode 100644 applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_cas.table create mode 100644 applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_event.table create mode 100644 applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_group.table create mode 100644 applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_membership.table create mode 100644 applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_permission.table create mode 100644 applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_user.table create mode 100644 applications/welcome3/databases/sql.log create mode 100644 applications/welcome3/databases/storage.sqlite create mode 100644 applications/welcome3/languages/cs.py create mode 100644 applications/welcome3/languages/de.py create mode 100644 applications/welcome3/languages/default.py create mode 100644 applications/welcome3/languages/es.py create mode 100644 applications/welcome3/languages/fr-ca.py create mode 100644 applications/welcome3/languages/fr.py create mode 100644 applications/welcome3/languages/hi.py create mode 100644 applications/welcome3/languages/hu.py create mode 100755 applications/welcome3/languages/id.py create mode 100644 applications/welcome3/languages/it.py create mode 100755 applications/welcome3/languages/my.py create mode 100644 applications/welcome3/languages/nl.py create mode 100644 applications/welcome3/languages/pl.py create mode 100644 applications/welcome3/languages/plural-cs.py create mode 100644 applications/welcome3/languages/plural-en.py create mode 100644 applications/welcome3/languages/plural-es.py create mode 100644 applications/welcome3/languages/plural-ru.py create mode 100644 applications/welcome3/languages/plural-uk.py create mode 100644 applications/welcome3/languages/pt-br.py create mode 100644 applications/welcome3/languages/pt.py create mode 100644 applications/welcome3/languages/ro.py create mode 100644 applications/welcome3/languages/ru.py create mode 100644 applications/welcome3/languages/sk.py create mode 100644 applications/welcome3/languages/tr.py create mode 100644 applications/welcome3/languages/uk.py create mode 100644 applications/welcome3/languages/zh-cn.py create mode 100644 applications/welcome3/languages/zh-tw.py create mode 100644 applications/welcome3/languages/zh.py create mode 100644 applications/welcome3/models/db.py create mode 100644 applications/welcome3/models/menu.py create mode 100644 applications/welcome3/modules/__init__.py create mode 100644 applications/welcome3/modules/__init__.pyc create mode 100644 applications/welcome3/routes.example.py create mode 100644 applications/welcome3/routes.example.py.bak2 create mode 100644 applications/welcome3/static/403.html create mode 100644 applications/welcome3/static/404.html create mode 100644 applications/welcome3/static/500.html create mode 100644 applications/welcome3/static/css/bootstrap-responsive.min.css create mode 100644 applications/welcome3/static/css/bootstrap.min.css create mode 100644 applications/welcome3/static/css/calendar.css create mode 100644 applications/welcome3/static/css/web2py-bootstrap3.css create mode 100644 applications/welcome3/static/css/web2py.css create mode 100644 applications/welcome3/static/fonts/glyphicons-halflings-regular.eot create mode 100644 applications/welcome3/static/fonts/glyphicons-halflings-regular.svg create mode 100644 applications/welcome3/static/fonts/glyphicons-halflings-regular.ttf create mode 100644 applications/welcome3/static/fonts/glyphicons-halflings-regular.woff create mode 100644 applications/welcome3/static/images/facebook.png create mode 100644 applications/welcome3/static/images/favicon.ico create mode 100644 applications/welcome3/static/images/favicon.png create mode 100644 applications/welcome3/static/images/glyphicons-halflings-white.png create mode 100644 applications/welcome3/static/images/glyphicons-halflings.png create mode 100644 applications/welcome3/static/images/gplus-32.png create mode 100644 applications/welcome3/static/images/twitter.png create mode 100644 applications/welcome3/static/js/analytics.min.js create mode 100644 applications/welcome3/static/js/bootstrap.min.js create mode 100644 applications/welcome3/static/js/calendar.js create mode 100644 applications/welcome3/static/js/jquery.js create mode 100644 applications/welcome3/static/js/modernizr.custom.js create mode 100644 applications/welcome3/static/js/respond.min.js create mode 100644 applications/welcome3/static/js/share.js create mode 100644 applications/welcome3/static/js/web2py-bootstrap3.js create mode 100644 applications/welcome3/static/js/web2py.js create mode 100644 applications/welcome3/views/__init__.py create mode 100644 applications/welcome3/views/appadmin.html create mode 100644 applications/welcome3/views/default/index.html create mode 100644 applications/welcome3/views/default/user.html create mode 100644 applications/welcome3/views/generic.html create mode 100644 applications/welcome3/views/generic.ics create mode 100644 applications/welcome3/views/generic.json create mode 100644 applications/welcome3/views/generic.jsonp create mode 100644 applications/welcome3/views/generic.load create mode 100644 applications/welcome3/views/generic.map create mode 100644 applications/welcome3/views/generic.pdf create mode 100644 applications/welcome3/views/generic.rss create mode 100644 applications/welcome3/views/generic.xml create mode 100644 applications/welcome3/views/layout.html create mode 100644 applications/welcome3/views/web2py_ajax.html diff --git a/applications/welcome3/ABOUT b/applications/welcome3/ABOUT new file mode 100644 index 00000000..184b19cb --- /dev/null +++ b/applications/welcome3/ABOUT @@ -0,0 +1,2 @@ +Write something about this app. +Developed with web2py. diff --git a/applications/welcome3/LICENSE b/applications/welcome3/LICENSE new file mode 100644 index 00000000..217b7c47 --- /dev/null +++ b/applications/welcome3/LICENSE @@ -0,0 +1,4 @@ +The web2py welcome app is licensed under public domain +(except for the css and js files that it includes, which have their own third party licenses). + +You can modify this license when you add your own code. diff --git a/applications/welcome3/__init__.py b/applications/welcome3/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/applications/welcome3/__init__.py @@ -0,0 +1 @@ + diff --git a/applications/welcome3/__init__.py.bak2 b/applications/welcome3/__init__.py.bak2 new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/applications/welcome3/__init__.py.bak2 @@ -0,0 +1 @@ + diff --git a/applications/welcome3/__init__.pyc b/applications/welcome3/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8af071a323bacb27ee14924411053ca6ffad1ab GIT binary patch literal 120 zcmZSn%*(a)_s)=H1}IzAkIB 1 and request.args[1] in db.tables: + return (db, request.args[1]) + else: + session.flash = T('invalid request') + redirect(URL('index')) + + +def get_query(request): + try: + return eval_in_global_env(request.vars.query) + except Exception: + return None + + +def query_by_table_type(tablename, db, request=request): + keyed = hasattr(db[tablename], '_primarykey') + if keyed: + firstkey = db[tablename][db[tablename]._primarykey[0]] + cond = '>0' + if firstkey.type in ['string', 'text']: + cond = '!=""' + qry = '%s.%s.%s%s' % ( + request.args[0], request.args[1], firstkey.name, cond) + else: + qry = '%s.%s.id>0' % tuple(request.args[:2]) + return qry + + +# ########################################################## +# ## list all databases and tables +# ########################################################### +def index(): + return dict(databases=databases) + + +# ########################################################## +# ## insert a new record +# ########################################################### + + +def insert(): + (db, table) = get_table(request) + form = SQLFORM(db[table], ignore_rw=ignore_rw) + if form.accepts(request.vars, session): + response.flash = T('new record inserted') + return dict(form=form, table=db[table]) + + +# ########################################################## +# ## list all records in table and insert new record +# ########################################################### + + +def download(): + import os + db = get_database(request) + return response.download(request, db) + + +def csv(): + import gluon.contenttype + response.headers['Content-Type'] = \ + gluon.contenttype.contenttype('.csv') + db = get_database(request) + query = get_query(request) + if not query: + return None + response.headers['Content-disposition'] = 'attachment; filename=%s_%s.csv'\ + % tuple(request.vars.query.split('.')[:2]) + return str(db(query, ignore_common_filters=True).select()) + + +def import_csv(table, file): + table.import_from_csv_file(file) + + +def select(): + import re + db = get_database(request) + dbname = request.args[0] + try: + is_imap = db._uri.startswith("imap://") + except (KeyError, AttributeError, TypeError): + is_imap = False + regex = re.compile('(?P\w+)\.(?P\w+)=(?P\d+)') + if len(request.args) > 1 and hasattr(db[request.args[1]], '_primarykey'): + regex = re.compile('(?P
\w+)\.(?P\w+)=(?P.+)') + if request.vars.query: + match = regex.match(request.vars.query) + if match: + request.vars.query = '%s.%s.%s==%s' % (request.args[0], + match.group('table'), match.group('field'), + match.group('value')) + else: + request.vars.query = session.last_query + query = get_query(request) + if request.vars.start: + start = int(request.vars.start) + else: + start = 0 + nrows = 0 + + step = 100 + fields = [] + + if is_imap: + step = 3 + + stop = start + step + + table = None + rows = [] + orderby = request.vars.orderby + if orderby: + orderby = dbname + '.' + orderby + if orderby == session.last_orderby: + if orderby[0] == '~': + orderby = orderby[1:] + else: + orderby = '~' + orderby + session.last_orderby = orderby + session.last_query = request.vars.query + form = FORM(TABLE(TR(T('Query:'), '', INPUT(_style='width:400px', + _name='query', _value=request.vars.query or '', + requires=IS_NOT_EMPTY( + error_message=T("Cannot be empty")))), TR(T('Update:'), + INPUT(_name='update_check', _type='checkbox', + value=False), INPUT(_style='width:400px', + _name='update_fields', _value=request.vars.update_fields + or '')), TR(T('Delete:'), INPUT(_name='delete_check', + _class='delete', _type='checkbox', value=False), ''), + TR('', '', INPUT(_type='submit', _value=T('submit')))), + _action=URL(r=request, args=request.args)) + + tb = None + if form.accepts(request.vars, formname=None): + regex = re.compile(request.args[0] + '\.(?P
\w+)\..+') + match = regex.match(form.vars.query.strip()) + if match: + table = match.group('table') + try: + nrows = db(query, ignore_common_filters=True).count() + if form.vars.update_check and form.vars.update_fields: + db(query, ignore_common_filters=True).update( + **eval_in_global_env('dict(%s)' % form.vars.update_fields)) + response.flash = T('%s %%{row} updated', nrows) + elif form.vars.delete_check: + db(query, ignore_common_filters=True).delete() + response.flash = T('%s %%{row} deleted', nrows) + nrows = db(query, ignore_common_filters=True).count() + + if is_imap: + fields = [db[table][name] for name in + ("id", "uid", "created", "to", + "sender", "subject")] + if orderby: + rows = db(query, ignore_common_filters=True).select( + *fields, limitby=(start, stop), + orderby=eval_in_global_env(orderby)) + else: + rows = db(query, ignore_common_filters=True).select( + *fields, limitby=(start, stop)) + except Exception, e: + import traceback + tb = traceback.format_exc() + (rows, nrows) = ([], 0) + response.flash = DIV(T('Invalid Query'), PRE(str(e))) + # begin handle upload csv + csv_table = table or request.vars.table + if csv_table: + formcsv = FORM(str(T('or import from csv file')) + " ", + INPUT(_type='file', _name='csvfile'), + INPUT(_type='hidden', _value=csv_table, _name='table'), + INPUT(_type='submit', _value=T('import'))) + else: + formcsv = None + if formcsv and formcsv.process().accepted: + try: + import_csv(db[request.vars.table], + request.vars.csvfile.file) + response.flash = T('data uploaded') + except Exception, e: + response.flash = DIV(T('unable to parse csv file'), PRE(str(e))) + # end handle upload csv + + return dict( + form=form, + table=table, + start=start, + stop=stop, + step=step, + nrows=nrows, + rows=rows, + query=request.vars.query, + formcsv=formcsv, + tb=tb + ) + + +# ########################################################## +# ## edit delete one record +# ########################################################### + + +def update(): + (db, table) = get_table(request) + keyed = hasattr(db[table], '_primarykey') + record = None + db[table]._common_filter = None + if keyed: + key = [f for f in request.vars if f in db[table]._primarykey] + if key: + record = db(db[table][key[0]] == request.vars[key[ + 0]]).select().first() + else: + record = db(db[table].id == request.args( + 2)).select().first() + + if not record: + qry = query_by_table_type(table, db) + session.flash = T('record does not exist') + redirect(URL('select', args=request.args[:1], + vars=dict(query=qry))) + + if keyed: + for k in db[table]._primarykey: + db[table][k].writable = False + + form = SQLFORM( + db[table], record, deletable=True, delete_label=T('Check to delete'), + ignore_rw=ignore_rw and not keyed, + linkto=URL('select', + args=request.args[:1]), upload=URL(r=request, + f='download', args=request.args[:1])) + + if form.accepts(request.vars, session): + session.flash = T('done!') + qry = query_by_table_type(table, db) + redirect(URL('select', args=request.args[:1], + vars=dict(query=qry))) + return dict(form=form, table=db[table]) + + +# ########################################################## +# ## get global variables +# ########################################################### + + +def state(): + return dict() + + +def ccache(): + if is_gae: + form = FORM( + P(TAG.BUTTON(T("Clear CACHE?"), _type="submit", _name="yes", _value="yes"))) + else: + cache.ram.initialize() + cache.disk.initialize() + + form = FORM( + P(TAG.BUTTON( + T("Clear CACHE?"), _type="submit", _name="yes", _value="yes")), + P(TAG.BUTTON( + T("Clear RAM"), _type="submit", _name="ram", _value="ram")), + P(TAG.BUTTON( + T("Clear DISK"), _type="submit", _name="disk", _value="disk")), + ) + + if form.accepts(request.vars, session): + session.flash = "" + if is_gae: + if request.vars.yes: + cache.ram.clear() + session.flash += T("Cache Cleared") + else: + clear_ram = False + clear_disk = False + if request.vars.yes: + clear_ram = clear_disk = True + if request.vars.ram: + clear_ram = True + if request.vars.disk: + clear_disk = True + if clear_ram: + cache.ram.clear() + session.flash += T("Ram Cleared") + if clear_disk: + cache.disk.clear() + session.flash += T("Disk Cleared") + redirect(URL(r=request)) + + try: + from guppy import hpy + hp = hpy() + except ImportError: + hp = False + + import shelve + import os + import copy + import time + import math + from gluon import portalocker + + ram = { + 'entries': 0, + 'bytes': 0, + 'objects': 0, + 'hits': 0, + 'misses': 0, + 'ratio': 0, + 'oldest': time.time(), + 'keys': [] + } + + disk = copy.copy(ram) + total = copy.copy(ram) + disk['keys'] = [] + total['keys'] = [] + + def GetInHMS(seconds): + hours = math.floor(seconds / 3600) + seconds -= hours * 3600 + minutes = math.floor(seconds / 60) + seconds -= minutes * 60 + seconds = math.floor(seconds) + + return (hours, minutes, seconds) + + if is_gae: + gae_stats = cache.ram.client.get_stats() + try: + gae_stats['ratio'] = ((gae_stats['hits'] * 100) / + (gae_stats['hits'] + gae_stats['misses'])) + except ZeroDivisionError: + gae_stats['ratio'] = T("?") + gae_stats['oldest'] = GetInHMS(time.time() - gae_stats['oldest_item_age']) + total.update(gae_stats) + else: + for key, value in cache.ram.storage.iteritems(): + if isinstance(value, dict): + ram['hits'] = value['hit_total'] - value['misses'] + ram['misses'] = value['misses'] + try: + ram['ratio'] = ram['hits'] * 100 / value['hit_total'] + except (KeyError, ZeroDivisionError): + ram['ratio'] = 0 + else: + if hp: + ram['bytes'] += hp.iso(value[1]).size + ram['objects'] += hp.iso(value[1]).count + ram['entries'] += 1 + if value[0] < ram['oldest']: + ram['oldest'] = value[0] + ram['keys'].append((key, GetInHMS(time.time() - value[0]))) + folder = os.path.join(request.folder,'cache') + if not os.path.exists(folder): + os.mkdir(folder) + locker = open(os.path.join(folder, 'cache.lock'), 'a') + portalocker.lock(locker, portalocker.LOCK_EX) + disk_storage = shelve.open( + os.path.join(folder, 'cache.shelve')) + try: + for key, value in disk_storage.items(): + if isinstance(value, dict): + disk['hits'] = value['hit_total'] - value['misses'] + disk['misses'] = value['misses'] + try: + disk['ratio'] = disk['hits'] * 100 / value['hit_total'] + except (KeyError, ZeroDivisionError): + disk['ratio'] = 0 + else: + if hp: + disk['bytes'] += hp.iso(value[1]).size + disk['objects'] += hp.iso(value[1]).count + disk['entries'] += 1 + if value[0] < disk['oldest']: + disk['oldest'] = value[0] + disk['keys'].append((key, GetInHMS(time.time() - value[0]))) + finally: + portalocker.unlock(locker) + locker.close() + disk_storage.close() + + total['entries'] = ram['entries'] + disk['entries'] + total['bytes'] = ram['bytes'] + disk['bytes'] + total['objects'] = ram['objects'] + disk['objects'] + total['hits'] = ram['hits'] + disk['hits'] + total['misses'] = ram['misses'] + disk['misses'] + total['keys'] = ram['keys'] + disk['keys'] + try: + total['ratio'] = total['hits'] * 100 / (total['hits'] + + total['misses']) + except (KeyError, ZeroDivisionError): + total['ratio'] = 0 + + if disk['oldest'] < ram['oldest']: + total['oldest'] = disk['oldest'] + else: + total['oldest'] = ram['oldest'] + + ram['oldest'] = GetInHMS(time.time() - ram['oldest']) + disk['oldest'] = GetInHMS(time.time() - disk['oldest']) + total['oldest'] = GetInHMS(time.time() - total['oldest']) + + def key_table(keys): + return TABLE( + TR(TD(B(T('Key'))), TD(B(T('Time in Cache (h:m:s)')))), + *[TR(TD(k[0]), TD('%02d:%02d:%02d' % k[1])) for k in keys], + **dict(_class='cache-keys', + _style="border-collapse: separate; border-spacing: .5em;")) + + if not is_gae: + ram['keys'] = key_table(ram['keys']) + disk['keys'] = key_table(disk['keys']) + total['keys'] = key_table(total['keys']) + + return dict(form=form, total=total, + ram=ram, disk=disk, object_stats=hp != False) + + +def table_template(table): + from gluon.html import TR, TD, TABLE, TAG + + def FONT(*args, **kwargs): + return TAG.font(*args, **kwargs) + + def types(field): + f_type = field.type + if not isinstance(f_type,str): + return ' ' + elif f_type == 'string': + return field.length + elif f_type == 'id': + return B('pk') + elif f_type.startswith('reference') or \ + f_type.startswith('list:reference'): + return B('fk') + else: + return ' ' + + # This is horribe HTML but the only one graphiz understands + rows = [] + cellpadding = 4 + color = "#000000" + bgcolor = "#FFFFFF" + face = "Helvetica" + face_bold = "Helvetica Bold" + border = 0 + + rows.append(TR(TD(FONT(table, _face=face_bold, _color=bgcolor), + _colspan=3, _cellpadding=cellpadding, + _align="center", _bgcolor=color))) + for row in db[table]: + rows.append(TR(TD(FONT(row.name, _color=color, _face=face_bold), + _align="left", _cellpadding=cellpadding, + _border=border), + TD(FONT(row.type, _color=color, _face=face), + _align="left", _cellpadding=cellpadding, + _border=border), + TD(FONT(types(row), _color=color, _face=face), + _align="center", _cellpadding=cellpadding, + _border=border))) + return "< %s >" % TABLE(*rows, **dict(_bgcolor=bgcolor, _border=1, + _cellborder=0, _cellspacing=0) + ).xml() + + +def bg_graph_model(): + graph = pgv.AGraph(layout='dot', directed=True, strict=False, rankdir='LR') + + subgraphs = dict() + for tablename in db.tables: + if hasattr(db[tablename],'_meta_graphmodel'): + meta_graphmodel = db[tablename]._meta_graphmodel + else: + meta_graphmodel = dict(group='Undefined', color='#ECECEC') + + group = meta_graphmodel['group'].replace(' ', '') + if not subgraphs.has_key(group): + subgraphs[group] = dict(meta=meta_graphmodel, tables=[]) + subgraphs[group]['tables'].append(tablename) + else: + subgraphs[group]['tables'].append(tablename) + + graph.add_node(tablename, name=tablename, shape='plaintext', + label=table_template(tablename)) + + for n, key in enumerate(subgraphs.iterkeys()): + graph.subgraph(nbunch=subgraphs[key]['tables'], + name='cluster%d' % n, + style='filled', + color=subgraphs[key]['meta']['color'], + label=subgraphs[key]['meta']['group']) + + for tablename in db.tables: + for field in db[tablename]: + f_type = field.type + if isinstance(f_type,str) and ( + f_type.startswith('reference') or + f_type.startswith('list:reference')): + referenced_table = f_type.split()[1].split('.')[0] + n1 = graph.get_node(tablename) + n2 = graph.get_node(referenced_table) + graph.add_edge(n1, n2, color="#4C4C4C", label='') + + graph.layout() + if not request.args: + response.headers['Content-Type'] = 'image/png' + return graph.draw(format='png', prog='dot') + else: + response.headers['Content-Disposition']='attachment;filename=graph.%s'%request.args(0) + if request.args(0) == 'dot': + return graph.string() + else: + return graph.draw(format=request.args(0), prog='dot') + +def graph_model(): + return dict(databases=databases, pgv=pgv) + +def manage(): + tables = manager_action['tables'] + if isinstance(tables[0], str): + db = manager_action.get('db', auth.db) + db = globals()[db] if isinstance(db, str) else db + tables = [db[table] for table in tables] + if request.args(0) == 'auth': + auth.table_user()._plural = T('Users') + auth.table_group()._plural = T('Roles') + auth.table_membership()._plural = T('Memberships') + auth.table_permission()._plural = T('Permissions') + if request.extension != 'load': + return dict(heading=manager_action.get('heading', + T('Manage %(action)s') % dict(action=request.args(0).replace('_', ' ').title())), + tablenames=[table._tablename for table in tables], + labels=[table._plural.title() for table in tables]) + + table = tables[request.args(1, cast=int)] + formname = '%s_grid' % table._tablename + linked_tables = orderby = None + if request.args(0) == 'auth': + auth.table_group()._id.readable = \ + auth.table_membership()._id.readable = \ + auth.table_permission()._id.readable = False + auth.table_membership().user_id.label = T('User') + auth.table_membership().group_id.label = T('Role') + auth.table_permission().group_id.label = T('Role') + auth.table_permission().name.label = T('Permission') + if table == auth.table_user(): + linked_tables=[auth.settings.table_membership_name] + elif table == auth.table_group(): + orderby = 'role' if not request.args(3) or '.group_id' not in request.args(3) else None + elif table == auth.table_permission(): + orderby = 'group_id' + kwargs = dict(user_signature=True, maxtextlength=1000, + orderby=orderby, linked_tables=linked_tables) + smartgrid_args = manager_action.get('smartgrid_args', {}) + kwargs.update(**smartgrid_args.get('DEFAULT', {})) + kwargs.update(**smartgrid_args.get(table._tablename, {})) + grid = SQLFORM.smartgrid(table, args=request.args[:2], formname=formname, **kwargs) + return grid diff --git a/applications/welcome3/controllers/default.py b/applications/welcome3/controllers/default.py new file mode 100644 index 00000000..b2f2a5dd --- /dev/null +++ b/applications/welcome3/controllers/default.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# this file is released under public domain and you can use without limitations + +######################################################################### +## This is a sample controller +## - index is the default action of any application +## - user is required for authentication and authorization +## - download is for downloading files uploaded in the db (does streaming) +## - api is an example of Hypermedia API support and access control +######################################################################### + +def index(): + """ + example action using the internationalization operator T and flash + rendered by views/default/index.html or views/generic.html + + if you need a simple wiki simply replace the two lines below with: + return auth.wiki() + """ + response.flash = T("Welcome to web2py!") + return dict(message=T('Hello World')) + + +def user(): + """ + exposes: + http://..../[app]/default/user/login + http://..../[app]/default/user/logout + http://..../[app]/default/user/register + http://..../[app]/default/user/profile + http://..../[app]/default/user/retrieve_password + http://..../[app]/default/user/change_password + http://..../[app]/default/user/manage_users (requires membership in + use @auth.requires_login() + @auth.requires_membership('group name') + @auth.requires_permission('read','table name',record_id) + to decorate functions that need access control + """ + return dict(form=auth()) + + +@cache.action() +def download(): + """ + allows downloading of uploaded files + http://..../[app]/default/download/[filename] + """ + return response.download(request, db) + + +def call(): + """ + exposes services. for example: + http://..../[app]/default/call/jsonrpc + decorate with @services.jsonrpc the functions to expose + supports xml, json, xmlrpc, jsonrpc, amfrpc, rss, csv + """ + return service() + + +@auth.requires_login() +def api(): + """ + this is example of API with access control + WEB2PY provides Hypermedia API (Collection+JSON) Experimental + """ + from gluon.contrib.hypermedia import Collection + rules = { + '': {'GET':{},'POST':{},'PUT':{},'DELETE':{}}, + } + return Collection(db).process(request,response,rules) diff --git a/applications/welcome3/cron/crontab b/applications/welcome3/cron/crontab new file mode 100644 index 00000000..6ab4ea8c --- /dev/null +++ b/applications/welcome3/cron/crontab @@ -0,0 +1 @@ +#crontab \ No newline at end of file diff --git a/applications/welcome3/cron/crontab.example b/applications/welcome3/cron/crontab.example new file mode 100644 index 00000000..6ab4ea8c --- /dev/null +++ b/applications/welcome3/cron/crontab.example @@ -0,0 +1 @@ +#crontab \ No newline at end of file diff --git a/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_cas.table b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_cas.table new file mode 100644 index 00000000..617d1e25 --- /dev/null +++ b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_cas.table @@ -0,0 +1,108 @@ +(dp1 +S'user_id' +p2 +(dp3 +S'length' +p4 +I512 +sS'unique' +p5 +I00 +sS'sortable' +p6 +I2 +sS'sql' +p7 +S'INTEGER REFERENCES auth_user (id) ON DELETE CASCADE' +p8 +sS'notnull' +p9 +I00 +sS'type' +p10 +S'reference auth_user' +p11 +ssS'service' +p12 +(dp13 +g4 +I512 +sg5 +I00 +sg6 +I4 +sg7 +S'CHAR(512)' +p14 +sg9 +I00 +sg10 +S'string' +p15 +ssS'renew' +p16 +(dp17 +g4 +I512 +sg5 +I00 +sg6 +I6 +sg7 +S'CHAR(1)' +p18 +sg9 +I00 +sg10 +S'boolean' +p19 +ssS'created_on' +p20 +(dp21 +g4 +I512 +sg5 +I00 +sg6 +I3 +sg7 +S'TIMESTAMP' +p22 +sg9 +I00 +sg10 +S'datetime' +p23 +ssS'ticket' +p24 +(dp25 +g4 +I512 +sg5 +I00 +sg6 +I5 +sg7 +S'CHAR(512)' +p26 +sg9 +I00 +sg10 +g15 +ssS'id' +p27 +(dp28 +g4 +I512 +sg5 +I00 +sg6 +I1 +sg7 +S'INTEGER PRIMARY KEY AUTOINCREMENT' +p29 +sg9 +I00 +sg10 +g27 +ss. \ No newline at end of file diff --git a/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_event.table b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_event.table new file mode 100644 index 00000000..6deb0d47 --- /dev/null +++ b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_event.table @@ -0,0 +1,108 @@ +(dp1 +S'origin' +p2 +(dp3 +S'length' +p4 +I512 +sS'unique' +p5 +I00 +sS'sortable' +p6 +I5 +sS'sql' +p7 +S'CHAR(512)' +p8 +sS'notnull' +p9 +I00 +sS'type' +p10 +S'string' +p11 +ssS'client_ip' +p12 +(dp13 +g4 +I512 +sg5 +I00 +sg6 +I3 +sg7 +S'CHAR(512)' +p14 +sg9 +I00 +sg10 +g11 +ssS'user_id' +p15 +(dp16 +g4 +I512 +sg5 +I00 +sg6 +I4 +sg7 +S'INTEGER REFERENCES auth_user (id) ON DELETE CASCADE' +p17 +sg9 +I00 +sg10 +S'reference auth_user' +p18 +ssS'description' +p19 +(dp20 +g4 +I32768 +sg5 +I00 +sg6 +I6 +sg7 +S'TEXT' +p21 +sg9 +I00 +sg10 +S'text' +p22 +ssS'time_stamp' +p23 +(dp24 +g4 +I512 +sg5 +I00 +sg6 +I2 +sg7 +S'TIMESTAMP' +p25 +sg9 +I00 +sg10 +S'datetime' +p26 +ssS'id' +p27 +(dp28 +g4 +I512 +sg5 +I00 +sg6 +I1 +sg7 +S'INTEGER PRIMARY KEY AUTOINCREMENT' +p29 +sg9 +I00 +sg10 +g27 +ss. \ No newline at end of file diff --git a/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_group.table b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_group.table new file mode 100644 index 00000000..361a56e1 --- /dev/null +++ b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_group.table @@ -0,0 +1,58 @@ +(dp1 +S'role' +p2 +(dp3 +S'length' +p4 +I512 +sS'unique' +p5 +I00 +sS'sortable' +p6 +I2 +sS'sql' +p7 +S'CHAR(512)' +p8 +sS'notnull' +p9 +I00 +sS'type' +p10 +S'string' +p11 +ssS'id' +p12 +(dp13 +g4 +I512 +sg5 +I00 +sg6 +I1 +sg7 +S'INTEGER PRIMARY KEY AUTOINCREMENT' +p14 +sg9 +I00 +sg10 +g12 +ssS'description' +p15 +(dp16 +g4 +I32768 +sg5 +I00 +sg6 +I3 +sg7 +S'TEXT' +p17 +sg9 +I00 +sg10 +S'text' +p18 +ss. \ No newline at end of file diff --git a/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_membership.table b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_membership.table new file mode 100644 index 00000000..0da473a6 --- /dev/null +++ b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_membership.table @@ -0,0 +1,58 @@ +(dp1 +S'group_id' +p2 +(dp3 +S'length' +p4 +I512 +sS'unique' +p5 +I00 +sS'sortable' +p6 +I3 +sS'sql' +p7 +S'INTEGER REFERENCES auth_group (id) ON DELETE CASCADE' +p8 +sS'notnull' +p9 +I00 +sS'type' +p10 +S'reference auth_group' +p11 +ssS'user_id' +p12 +(dp13 +g4 +I512 +sg5 +I00 +sg6 +I2 +sg7 +S'INTEGER REFERENCES auth_user (id) ON DELETE CASCADE' +p14 +sg9 +I00 +sg10 +S'reference auth_user' +p15 +ssS'id' +p16 +(dp17 +g4 +I512 +sg5 +I00 +sg6 +I1 +sg7 +S'INTEGER PRIMARY KEY AUTOINCREMENT' +p18 +sg9 +I00 +sg10 +g16 +ss. \ No newline at end of file diff --git a/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_permission.table b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_permission.table new file mode 100644 index 00000000..cbd706ed --- /dev/null +++ b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_permission.table @@ -0,0 +1,91 @@ +(dp1 +S'record_id' +p2 +(dp3 +S'length' +p4 +I512 +sS'unique' +p5 +I00 +sS'sortable' +p6 +I5 +sS'sql' +p7 +S'INTEGER' +p8 +sS'notnull' +p9 +I00 +sS'type' +p10 +S'integer' +p11 +ssS'group_id' +p12 +(dp13 +g4 +I512 +sg5 +I00 +sg6 +I2 +sg7 +S'INTEGER REFERENCES auth_group (id) ON DELETE CASCADE' +p14 +sg9 +I00 +sg10 +S'reference auth_group' +p15 +ssS'table_name' +p16 +(dp17 +g4 +I512 +sg5 +I00 +sg6 +I4 +sg7 +S'CHAR(512)' +p18 +sg9 +I00 +sg10 +S'string' +p19 +ssS'id' +p20 +(dp21 +g4 +I512 +sg5 +I00 +sg6 +I1 +sg7 +S'INTEGER PRIMARY KEY AUTOINCREMENT' +p22 +sg9 +I00 +sg10 +g20 +ssS'name' +p23 +(dp24 +g4 +I512 +sg5 +I00 +sg6 +I3 +sg7 +S'CHAR(512)' +p25 +sg9 +I00 +sg10 +g19 +ss. \ No newline at end of file diff --git a/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_user.table b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_user.table new file mode 100644 index 00000000..ad6901b8 --- /dev/null +++ b/applications/welcome3/databases/c8b669d15150d7109e5f7ab36744a5b7_auth_user.table @@ -0,0 +1,137 @@ +(dp1 +S'first_name' +p2 +(dp3 +S'length' +p4 +I128 +sS'unique' +p5 +I00 +sS'sortable' +p6 +I2 +sS'sql' +p7 +S'CHAR(128)' +p8 +sS'notnull' +p9 +I00 +sS'type' +p10 +S'string' +p11 +ssS'last_name' +p12 +(dp13 +g4 +I128 +sg5 +I00 +sg6 +I3 +sg7 +S'CHAR(128)' +p14 +sg9 +I00 +sg10 +g11 +ssS'registration_id' +p15 +(dp16 +g4 +I512 +sg5 +I00 +sg6 +I8 +sg7 +S'CHAR(512)' +p17 +sg9 +I00 +sg10 +g11 +ssS'email' +p18 +(dp19 +g4 +I512 +sg5 +I00 +sg6 +I4 +sg7 +S'CHAR(512)' +p20 +sg9 +I00 +sg10 +g11 +ssS'reset_password_key' +p21 +(dp22 +g4 +I512 +sg5 +I00 +sg6 +I7 +sg7 +S'CHAR(512)' +p23 +sg9 +I00 +sg10 +g11 +ssS'password' +p24 +(dp25 +g4 +I512 +sg5 +I00 +sg6 +I5 +sg7 +S'CHAR(512)' +p26 +sg9 +I00 +sg10 +g24 +ssS'registration_key' +p27 +(dp28 +g4 +I512 +sg5 +I00 +sg6 +I6 +sg7 +S'CHAR(512)' +p29 +sg9 +I00 +sg10 +g11 +ssS'id' +p30 +(dp31 +g4 +I512 +sg5 +I00 +sg6 +I1 +sg7 +S'INTEGER PRIMARY KEY AUTOINCREMENT' +p32 +sg9 +I00 +sg10 +g30 +ss. \ No newline at end of file diff --git a/applications/welcome3/databases/sql.log b/applications/welcome3/databases/sql.log new file mode 100644 index 00000000..27e315b8 --- /dev/null +++ b/applications/welcome3/databases/sql.log @@ -0,0 +1,55 @@ +timestamp: 2015-03-10T13:41:36.516130 +CREATE TABLE auth_user( + id INTEGER PRIMARY KEY AUTOINCREMENT, + first_name CHAR(128), + last_name CHAR(128), + email CHAR(512), + password CHAR(512), + registration_key CHAR(512), + reset_password_key CHAR(512), + registration_id CHAR(512) +); +success! +timestamp: 2015-03-10T13:41:36.519253 +CREATE TABLE auth_group( + id INTEGER PRIMARY KEY AUTOINCREMENT, + role CHAR(512), + description TEXT +); +success! +timestamp: 2015-03-10T13:41:36.521428 +CREATE TABLE auth_membership( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE, + group_id INTEGER REFERENCES auth_group (id) ON DELETE CASCADE +); +success! +timestamp: 2015-03-10T13:41:36.525124 +CREATE TABLE auth_permission( + id INTEGER PRIMARY KEY AUTOINCREMENT, + group_id INTEGER REFERENCES auth_group (id) ON DELETE CASCADE, + name CHAR(512), + table_name CHAR(512), + record_id INTEGER +); +success! +timestamp: 2015-03-10T13:41:36.529392 +CREATE TABLE auth_event( + id INTEGER PRIMARY KEY AUTOINCREMENT, + time_stamp TIMESTAMP, + client_ip CHAR(512), + user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE, + origin CHAR(512), + description TEXT +); +success! +timestamp: 2015-03-10T13:41:36.532142 +CREATE TABLE auth_cas( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE, + created_on TIMESTAMP, + service CHAR(512), + ticket CHAR(512), + renew CHAR(1) +); +success! diff --git a/applications/welcome3/databases/storage.sqlite b/applications/welcome3/databases/storage.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..667fcf873131ceda21eaf988bcb14e382819bc0f GIT binary patch literal 10240 zcmeHML2uJA6n5IIg-USY(9<*zgw$%=VM9n937vt8wHs-W*eS|Vud~*)neDEcICbN< z@*_aoupPRz2}LRsO(h&Div6DL=kIe~6uqzYagT5ekNY(6ID7$2U>M*vgaCkoxJ%+5 zU$SqGJK||fv}ZL7VC$Q?A_wPx$T1JZ;|6@6HGIK#b2K!I<&6#F>N)q0y4V}=6F0!Y z5vJ^fgo*A-%|@1kpkuw+Long2l%Tjs8`hf+dWURyVAmU#eF#6GLuh?+_UlbCy@8s} zrW!e5n7R|gZS)q|s98g;Xl3b#71FN4{U+Q+dq@PXS*@D2i=qWOv_A;{w1OHiV~J9A z^f+HEudf@UPK;d5P`FgfOygDdd7;vN7sJ|n%dWiK-l;~rZ)4_D5^~b-K?i+yO4Wm0 zL7v2++73JGinr2b_-ufCK2CJ=QyWV-D?Km3n__15@~KfQudNwhpTrO)tqP%Rz4Pi9%C0xVfdh|plbnPeW5YgeC+!q>2;@>_Sc-4y0<8$2O3b<-LOk-B| zdEs&r2tAK`K?t3C1GOBhaS);KyF^5ENto2N?k$n_Dd~`2a@n->IJzhn%d4x#6^d!_ zJ*G$y&r+HKVV#$Nd!z9w_Bd|4QZb!oP)M2Q#7}9gocO1hC*f1v!^6n9Ek5r0|9^Qt XMtUcjfkiW*^MBEd>v)=h
a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("