@@ -3,8 +3,6 @@ INSTALL.txt | |||||
Web Notes Framework Installation guide | Web Notes Framework Installation guide | ||||
Web Notes Framework (WNF) is a meta-data driven web app framework. After install, you build | |||||
and configure your application from the web browser. | |||||
WNF requires the following applications | WNF requires the following applications | ||||
@@ -30,23 +28,14 @@ WNF requires the following applications | |||||
------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||||
2. Setup defs.py | 2. Setup defs.py | ||||
The framework picks up the database details from cgi-bin/webnotes/defs.py | |||||
The framework picks up the database details from py/webnotes/defs.py | |||||
You need to edit this file and set your database name and other options | You need to edit this file and set your database name and other options | ||||
------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||||
3. Configuring Apache | 3. Configuring Apache | ||||
a. You must set Apache to execute index.cgi file, one way to do this is to add cgi handler | |||||
and add ExecCGI in the options directive. | |||||
b. You can also add couple of lines below to block Apache from rendering .py files | |||||
RewriteEngine on | |||||
RewriteRule \.py - [F] | |||||
c. Add "index.cgi" to DirectoryIndex | |||||
see conf/apache.conf | |||||
------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ||||
4. Login to application | 4. Login to application |
@@ -1 +0,0 @@ | |||||
Web Notes Framework: A web application framework with client-side and server-side libraries including metadata definition, forms, virtual pages- Ideal for developing js driven database apps. |
@@ -0,0 +1,23 @@ | |||||
## wnframework | |||||
wnframework is a full-stack web application framework that uses python/mysql on the server side. includes a tightly integrated client side library and uses many html5 featuers. | |||||
Projects: [erpnext](http://erpnext.org) | [webnotes/erpnext](https://github.com/webnotes/erpnext) | |||||
## Version | |||||
Version 2 is a radical reworking of the wnframework. This will be the current development version. For a stable version see -1.7 branches | |||||
#### Roadmap for version 2 | |||||
- lazy loading + localstorage of js libs (completed) | |||||
- refactoring of js library | |||||
- separation of the view from the model | |||||
## Librarires | |||||
wnframework uses a number of libraries in the open domain, see attribution.md (it may not be a complete list but we are working on it!) | |||||
## License | |||||
wnframework is freely available to use under the MIT License |
@@ -1,39 +0,0 @@ | |||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> | |||||
<!-- | |||||
Copyright (c) 2007 Brian Dillard and Brad Neuberg: | |||||
Brian Dillard | Project Lead | bdillard@pathf.com | http://blogs.pathf.com/agileajax/ | |||||
Brad Neuberg | Original Project Creator | http://codinginparadise.org | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files | |||||
(the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, | |||||
publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do | |||||
so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE | |||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||||
--> | |||||
<html xmlns="http://www.w3.org/1999/xhtml"> | |||||
<head> | |||||
<script language="JavaScript"> | |||||
function pageLoaded() { | |||||
window.parent.dhtmlHistory.iframeLoaded(window.location); | |||||
document.getElementById("output").innerHTML = window.location; | |||||
} | |||||
</script> | |||||
</head> | |||||
<body onload="pageLoaded();" style="width:700px;padding:2px;margin:0;"> | |||||
<p>blank.html - Needed for Internet Explorer's hidden iframe</p> | |||||
<p id="output"></p> | |||||
</body> | |||||
</html> |
@@ -1,24 +0,0 @@ | |||||
import os | |||||
# go to current directory | |||||
os.chdir(__file__[:-12]) | |||||
import webnotes.utils.backups | |||||
webnotes.utils.backups.backup_all() | |||||
# send the daily backup to the pair server | |||||
import webnotes.defs | |||||
if hasattr(webnotes.defs,'ps_host'): | |||||
import ftplib, time | |||||
ftp = ftplib.FTP(webnotes.defs.ps_host, webnotes.defs.ps_login, webnotes.defs.ps_pwd) | |||||
ftp.cwd('pair_backups') | |||||
fname = 'daily-' + time.strftime('%Y-%m-%d') + '.tar.gz' | |||||
f = open('/backups/daily/' + fname, 'rb') | |||||
ftp.storbinary('STOR ' + webnotes.defs.server_prefix + '-' + fname, f) | |||||
ftp.quit() | |||||
# delete from local pair directory | |||||
if hasattr(webnotes.defs, 'pair_dir') and len(os.listdir(webnotes.defs.pair_dir)) > 3: | |||||
delete_oldest_file(webnotes.defs.pair_dir) |
@@ -1,73 +0,0 @@ | |||||
class wnJSCompiler: | |||||
@staticmethod | |||||
def concate_files_in_dir(path,dest): | |||||
""" | |||||
Concatenates all files in a directory | |||||
""" | |||||
import os | |||||
allfiles = [] | |||||
dirname = path | |||||
l = os.listdir(path) | |||||
for i in l: | |||||
if os.path.isfile(os.path.join(dirname,i)): | |||||
allfiles.append(os.path.join(dirname,i)) | |||||
fout = open(dest,'w') | |||||
for filename in allfiles: | |||||
f = open(filename) | |||||
fout.write(f.read()) | |||||
f.close | |||||
fout.close | |||||
@staticmethod | |||||
def getsubs(path): | |||||
""" | |||||
gets all the sub directories of a directory (recursive) | |||||
""" | |||||
import os | |||||
subs = [] | |||||
for root, subd, files in os.walk(path): | |||||
for i in subd: | |||||
subs.append(os.path.join(root,i)) | |||||
return subs | |||||
@staticmethod | |||||
def compilejs(path): | |||||
""" | |||||
Compiles the js tree for ondemand import | |||||
""" | |||||
if not wnJSCompiler.is_changed(path): | |||||
return | |||||
import os | |||||
import webnotes.utils.jsnamespace as jsn | |||||
subs = wnJSCompiler.getsubs(path) | |||||
for subdir in subs: | |||||
modname = jsn.jsNamespace.getmodname(subdir) | |||||
wnJSCompiler.concate_files_in_dir(subdir,os.path.join(subdir, modname)) | |||||
wnJSCompiler.minifyjs(os.path.join(subdir, modname)) | |||||
@staticmethod | |||||
def is_changed(path): | |||||
#compare new timestamps with the ones stored in file | |||||
from webnotes.utils import jstimestamp | |||||
try: | |||||
frm_file = jstimestamp.generateTimestamp.read_ts_from_file(path) | |||||
newts = jstimestamp.generateTimestamp.gents(path) | |||||
except IOError: | |||||
return True | |||||
if frm_file == newts: | |||||
return False | |||||
else: | |||||
return True | |||||
@staticmethod | |||||
def minifyjs(modpath): | |||||
""" | |||||
Stub to minify js | |||||
""" | |||||
pass | |||||
if __name__=="__main__": | |||||
a = wnJSCompiler() | |||||
print a.compilejs('../js/wn') |
@@ -1 +0,0 @@ | |||||
{'update_date': '2011-03-18 18:12:06'} |
@@ -1,98 +0,0 @@ | |||||
#!/usr/bin/python | |||||
import cgi | |||||
import datetime | |||||
import os | |||||
try: | |||||
form = cgi.FieldStorage() | |||||
out = '' | |||||
out_buf, str_out = '', '' | |||||
jsdir='../js' | |||||
jsonout= {} | |||||
# Traceback | |||||
# --------- | |||||
def getTraceback(): | |||||
import sys, traceback, string | |||||
type, value, tb = sys.exc_info() | |||||
body = "Traceback (innermost last):\n" | |||||
list = traceback.format_tb(tb, None) \ | |||||
+ traceback.format_exception_only(type, value) | |||||
body = body + "%-20s %s" % (string.join(list[:-1], ""), list[-1]) | |||||
return body | |||||
def load_js_from_file(module_name): | |||||
global out | |||||
global jsonout | |||||
import webnotes.utils.jsnamespace as jsn | |||||
filename = jsn.jsNamespace.modname_to_filename(module_name,jsdir) | |||||
import os | |||||
try: | |||||
f = open(os.path.join(filename)) | |||||
try: | |||||
out = f.read() | |||||
finally: | |||||
f.close() | |||||
except IOError,e: | |||||
out = "Not Found: %s" % filename | |||||
jsonout[module_name]=out | |||||
def load_js_module(module_name): | |||||
global jsonout | |||||
from webnotes import defs | |||||
devmode = getattr(defs,'developer_mode') | |||||
if devmode: | |||||
import compilejs | |||||
compilejs.wnJSCompiler.compilejs(jsdir) | |||||
if module_name not in jsonout: | |||||
dependent_mods = get_dependencies(module_name) | |||||
for module in dependent_mods: | |||||
load_js_from_file(module) | |||||
load_js_from_file(module_name) | |||||
def get_dependencies(module_name): | |||||
import webnotes.utils.jsdependency as jsd | |||||
ret = jsd.jsDependencyBuilder.build_dependency(jsdir,module_name) | |||||
return ret | |||||
def compress_string(buf): | |||||
import gzip, cStringIO | |||||
zbuf = cStringIO.StringIO() | |||||
zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 5) | |||||
zfile.write(buf) | |||||
zfile.close() | |||||
return zbuf.getvalue() | |||||
compress = 0 | |||||
try: | |||||
if string.find(os.environ["HTTP_ACCEPT_ENCODING"], "gzip") != -1: | |||||
compress = 1 | |||||
except: | |||||
pass | |||||
load_js_module(form.getvalue('module')) | |||||
#load_js_module('wn.modules') | |||||
if compress and len(out)>512: | |||||
out_buf = compress_string(str_out) | |||||
print "Content-Encoding: gzip" | |||||
print "Content-Length: %d" % (len(out_buf)) | |||||
print "Content-Type: text/javascript" | |||||
# Headers end | |||||
if out_buf: | |||||
sys.stdout.write(out_buf) | |||||
elif out: | |||||
import json | |||||
print json.dumps(jsonout) | |||||
except Exception, e: | |||||
print "Content-Type: text/javascript" | |||||
print getTraceback()#.replace('\n','<br>') |
@@ -1,82 +0,0 @@ | |||||
#!/usr/bin/python | |||||
try: | |||||
import sys, os | |||||
sys.path.append(os.getcwd()+'/cgi-bin') | |||||
def getTraceback(): | |||||
import sys, traceback, string | |||||
type, value, tb = sys.exc_info() | |||||
body = "Traceback (innermost last):\n" | |||||
list = traceback.format_tb(tb, None) \ | |||||
+ traceback.format_exception_only(type, value) | |||||
body = body + "%-20s %s" % (string.join(list[:-1], ""), list[-1]) | |||||
return body | |||||
import cgi | |||||
import webnotes | |||||
import webnotes.auth | |||||
import webnotes.utils | |||||
import webnotes.utils.file_manager | |||||
import webnotes.db | |||||
import webnotes.defs | |||||
sys.path.append(webnotes.defs.modules_path) | |||||
form = cgi.FieldStorage() | |||||
webnotes.form_dict = {} | |||||
for each in form.keys(): | |||||
webnotes.form_dict[each] = form.getvalue(each) | |||||
n = form.getvalue('name') | |||||
# authenticate | |||||
webnotes.auth.HTTPRequest() | |||||
# get file | |||||
res = webnotes.utils.file_manager.get_file(n) | |||||
fname = res[0] | |||||
if hasattr(res[1], 'tostring'): | |||||
fcontent = res[1].tostring() | |||||
else: | |||||
fcontent = res[1] | |||||
if form.getvalue('thumbnail'): | |||||
tn = webnotes.utils.cint(form.getvalue('thumbnail')) | |||||
try: | |||||
from PIL import Image | |||||
import cStringIO | |||||
fobj = cStringIO.StringIO(fcontent) | |||||
image = Image.open(fobj) | |||||
image.thumbnail((tn,tn*2), Image.ANTIALIAS) | |||||
outfile = cStringIO.StringIO() | |||||
if image.mode != "RGB": | |||||
image = image.convert("RGB") | |||||
image.save(outfile, 'JPEG') | |||||
outfile.seek(0) | |||||
fcontent = outfile.read() | |||||
except: | |||||
pass | |||||
import mimetypes | |||||
print "Content-Type: %s" % (mimetypes.guess_type(fname)[0] or 'application/unknown') | |||||
print "Content-Disposition: filename="+fname.replace(' ', '_') | |||||
print "Cache-Control: max-age=3600" | |||||
print fcontent | |||||
except Exception, e: | |||||
print "Content-Type: text/html" | |||||
try: | |||||
out = {'message':'', 'exc':getTraceback().replace('\n','<br>')} | |||||
except: | |||||
out = {'exc': e} | |||||
print str(out) |
@@ -1,72 +0,0 @@ | |||||
#!/usr/bin/python | |||||
import cgi | |||||
import datetime | |||||
import os | |||||
try: | |||||
form = cgi.FieldStorage() | |||||
out = '' | |||||
out_buf, str_out = '', '' | |||||
# Traceback | |||||
# --------- | |||||
def getTraceback(): | |||||
import sys, traceback, string | |||||
type, value, tb = sys.exc_info() | |||||
body = "Traceback (innermost last):\n" | |||||
list = traceback.format_tb(tb, None) \ | |||||
+ traceback.format_exception_only(type, value) | |||||
body = body + "%-20s %s" % (string.join(list[:-1], ""), list[-1]) | |||||
return body | |||||
def load_js_file(): | |||||
global out | |||||
filename = form.getvalue('filename') | |||||
import os | |||||
try: | |||||
f = open(os.path.join('../js/', filename)) | |||||
try: | |||||
out = f.read() | |||||
finally: | |||||
f.close() | |||||
except IOError,e: | |||||
out = "Not Found: %s" % filename | |||||
def compress_string(buf): | |||||
import gzip, cStringIO | |||||
zbuf = cStringIO.StringIO() | |||||
zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 5) | |||||
zfile.write(buf) | |||||
zfile.close() | |||||
return zbuf.getvalue() | |||||
compress = 0 | |||||
try: | |||||
if string.find(os.environ["HTTP_ACCEPT_ENCODING"], "gzip") != -1: | |||||
compress = 1 | |||||
except: | |||||
pass | |||||
load_js_file() | |||||
if compress and len(out)>512: | |||||
out_buf = compress_string(str_out) | |||||
print "Content-Encoding: gzip" | |||||
print "Content-Length: %d" % (len(out_buf)) | |||||
print "Content-Type: text/javascript" | |||||
# Headers end | |||||
if out_buf: | |||||
sys.stdout.write(out_buf) | |||||
elif out: | |||||
print out | |||||
except Exception, e: | |||||
print "Content-Type: text/javascript" | |||||
print getTraceback().replace('\n','<br>') |
@@ -1,35 +0,0 @@ | |||||
#!/usr/bin/python | |||||
# -*- coding: utf-8 -*- | |||||
# Script for creating the pypi packages | |||||
# Works only for python 2.6+ | |||||
import os | |||||
try: | |||||
from setuptools import setup, find_packages | |||||
except ImportError: | |||||
import ez_setup | |||||
ez_setup.use_setuptools() | |||||
from setuptools import setup, find_packages | |||||
# Startup | |||||
appname = "webnotes-core" | |||||
appversion = "v170" | |||||
setup( | |||||
name = appname, | |||||
version = appversion, | |||||
author = "Rushabh Mehta", | |||||
namespace_packages = ["webnotes"], | |||||
packages = ["webnotes"] + [ os.path.join("webnotes", a) for a in find_packages("webnotes") ], | |||||
author_email = "rmehta@gmail.com", | |||||
description = "A meta-data based library for creating web apps in python and javascript", | |||||
license = "MIT", | |||||
keywords = "Meta-data web app framework python", | |||||
url = "http://code.google.com/p/webnotes/", | |||||
classifiers = ["License :: OSI Approved :: MIT License","Topic :: Software Development :: Libraries :: Python Modules"], | |||||
long_description = "Webnotes is a meta-data based framework for web applications in python", | |||||
) | |||||
@@ -1,425 +0,0 @@ | |||||
in_files_main = [ | |||||
'utils/rsh.compressed.js' | |||||
,'globals.js' | |||||
,'utils/datatype.js' | |||||
,'utils/browser_detect.js' | |||||
,'utils/datetime.js' | |||||
,'utils/dom.js' | |||||
,'utils/handler.js' | |||||
,'utils/msgprint.js' | |||||
,'utils/json.js' | |||||
,'utils/shortcut.js' | |||||
,'utils/printElement.js' | |||||
,'wn/widgets/dialog.js' | |||||
,'widgets/dialog.js' | |||||
,'widgets/listing.js' | |||||
,'wn/widgets/listing.js' | |||||
,'widgets/tree.js' | |||||
,'widgets/menu.js' | |||||
,'widgets/layout.js' | |||||
,'widgets/tabbedpage.js' | |||||
,'webpage/page_header.js' | |||||
,'widgets/autosuggest.js' | |||||
,'widgets/select.js' | |||||
,'widgets/tags.js' | |||||
,'widgets/export_query.js' | |||||
,'widgets/list_selector.js' | |||||
,'widgets/form/fields.js' | |||||
,'webpage/wntoolbar.js' | |||||
,'webpage/history.js' | |||||
,'webpage/search.js' | |||||
,'webpage/spinner.js' | |||||
,'webpage/freeze_page.js' | |||||
,'webpage/error_console.js' | |||||
,'webpage/about.js' | |||||
,'webpage/loaders.js' | |||||
,'webpage/uploader.js' | |||||
,'webpage/page.js' | |||||
,'webpage/docbrowser.js' | |||||
,'wn/page_layout.js' | |||||
#,'wn/widgets/doc_column_view.js' | |||||
,'wn/widgets/page_sidebar.js' | |||||
,'wn/widgets/footer.js' | |||||
#,'wn/widgets/follow.js' | |||||
,'model/local_data.js' | |||||
,'model/doclist.js' | |||||
,'webpage/body.js' | |||||
,'app.js' | |||||
,'widgets/calendar.js' | |||||
] | |||||
out_file_main = 'js/wnf.compressed.js' | |||||
#------------------------------------------------- | |||||
in_files_lite = [ | |||||
'utils/rsh.compressed.js' | |||||
,'globals.js' | |||||
,'utils/datatype.js' | |||||
,'utils/browser_detect.js' | |||||
,'utils/datetime.js' | |||||
,'utils/dom.js' | |||||
,'utils/handler.js' | |||||
,'utils/msgprint.js' | |||||
,'utils/json.js' | |||||
,'wn/widgets/dialog.js' | |||||
,'widgets/dialog.js' | |||||
,'widgets/listing.js' | |||||
,'widgets/layout.js' | |||||
,'widgets/tabbedpage.js' | |||||
,'webpage/page_header.js' | |||||
,'widgets/autosuggest.js' | |||||
,'widgets/tags.js' | |||||
,'widgets/form/fields.js' | |||||
,'webpage/history.js' | |||||
,'webpage/search.js' | |||||
,'webpage/spinner.js' | |||||
,'webpage/freeze_page.js' | |||||
,'webpage/error_console.js' | |||||
,'webpage/about.js' | |||||
,'webpage/loaders.js' | |||||
,'webpage/uploader.js' | |||||
,'webpage/page.js' | |||||
,'wn/widgets/page_sidebar.js' | |||||
,'wn/widgets/follow.js' | |||||
,'model/local_data.js' | |||||
,'model/doclist.js' | |||||
,'webpage/body.js' | |||||
,'app.js' | |||||
] | |||||
out_file_lite = 'js/wnf-lite.compressed.js' | |||||
#------------------------------------------------- | |||||
in_files_form = [ | |||||
'widgets/form/form_container.js' | |||||
,'widgets/form/form_header.js' | |||||
,'widgets/form/form.js' | |||||
,'widgets/form/form_fields.js' | |||||
,'widgets/form/grid.js' | |||||
,'widgets/form/form_grid.js' | |||||
,'widgets/form/print_format.js' | |||||
,'widgets/form/email.js' | |||||
,'widgets/form/clientscriptAPI.js' | |||||
,'widgets/form/form_comments.js' | |||||
,'wn/widgets/form/sidebar.js' | |||||
,'wn/widgets/form/comments.js' | |||||
,'wn/widgets/form/attachments.js' | |||||
] | |||||
out_file_form = 'js/form.compressed.js'; | |||||
in_files_report = [ | |||||
'widgets/report_builder/bargraph.js' | |||||
,'widgets/report_builder/report_builder.js' | |||||
,'widgets/report_builder/datatable.js' | |||||
,'widgets/report_builder/calculator.js' | |||||
] | |||||
out_file_report = 'js/report.compressed.js' | |||||
in_files_css = [ | |||||
'css/body.css', | |||||
'css/menus.css', | |||||
'css/messages.css', | |||||
'css/forms.css', | |||||
'css/grid.css', | |||||
'css/listing.css', | |||||
'css/report.css', | |||||
'css/calendar.css', | |||||
'css/autosuggest.css', | |||||
'css/dialog.css', | |||||
'css/wntoolbar.css', | |||||
'css/tabs.css', | |||||
'css/jqplot.css', | |||||
'css/bw-icons.css', | |||||
'css/sidebar.css', | |||||
'css/doc_column_view.css', | |||||
] | |||||
out_file_css = 'css/default.css' | |||||
#in_files_main += in_files_form | |||||
import os, os.path, shutil | |||||
# This code is original from jsmin by Douglas Crockford, it was translated to | |||||
# Python by Baruch Even. The original code had the following copyright and | |||||
# license. | |||||
# | |||||
# /* jsmin.c | |||||
# 2007-05-22 | |||||
# | |||||
# Copyright (c) 2002 Douglas Crockford (www.crockford.com) | |||||
# | |||||
# Permission is hereby granted, free of charge, to any person obtaining a copy of | |||||
# this software and associated documentation files (the "Software"), to deal in | |||||
# the Software without restriction, including without limitation the rights to | |||||
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies | |||||
# of the Software, and to permit persons to whom the Software is furnished to do | |||||
# so, subject to the following conditions: | |||||
# | |||||
# The above copyright notice and this permission notice shall be included in all | |||||
# copies or substantial portions of the Software. | |||||
# | |||||
# The Software shall be used for Good, not Evil. | |||||
# | |||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||||
# SOFTWARE. | |||||
# */ | |||||
from StringIO import StringIO | |||||
def jsmin(js): | |||||
ins = StringIO(js) | |||||
outs = StringIO() | |||||
JavascriptMinify().minify(ins, outs) | |||||
str = outs.getvalue() | |||||
if len(str) > 0 and str[0] == '\n': | |||||
str = str[1:] | |||||
return str | |||||
def isAlphanum(c): | |||||
"""return true if the character is a letter, digit, underscore, | |||||
dollar sign, or non-ASCII character. | |||||
""" | |||||
return ((c >= 'a' and c <= 'z') or (c >= '0' and c <= '9') or | |||||
(c >= 'A' and c <= 'Z') or c == '_' or c == '$' or c == '\\' or (c is not None and ord(c) > 126)); | |||||
class UnterminatedComment(Exception): | |||||
pass | |||||
class UnterminatedStringLiteral(Exception): | |||||
pass | |||||
class UnterminatedRegularExpression(Exception): | |||||
pass | |||||
class JavascriptMinify(object): | |||||
def _outA(self): | |||||
self.outstream.write(self.theA) | |||||
def _outB(self): | |||||
self.outstream.write(self.theB) | |||||
def _get(self): | |||||
"""return the next character from stdin. Watch out for lookahead. If | |||||
the character is a control character, translate it to a space or | |||||
linefeed. | |||||
""" | |||||
c = self.theLookahead | |||||
self.theLookahead = None | |||||
if c == None: | |||||
c = self.instream.read(1) | |||||
if c >= ' ' or c == '\n': | |||||
return c | |||||
if c == '': # EOF | |||||
return '\000' | |||||
if c == '\r': | |||||
return '\n' | |||||
return ' ' | |||||
def _peek(self): | |||||
self.theLookahead = self._get() | |||||
return self.theLookahead | |||||
def _next(self): | |||||
"""get the next character, excluding comments. peek() is used to see | |||||
if an unescaped '/' is followed by a '/' or '*'. | |||||
""" | |||||
c = self._get() | |||||
if c == '/' and self.theA != '\\': | |||||
p = self._peek() | |||||
if p == '/': | |||||
c = self._get() | |||||
while c > '\n': | |||||
c = self._get() | |||||
return c | |||||
if p == '*': | |||||
c = self._get() | |||||
while 1: | |||||
c = self._get() | |||||
if c == '*': | |||||
if self._peek() == '/': | |||||
self._get() | |||||
return ' ' | |||||
if c == '\000': | |||||
raise UnterminatedComment() | |||||
return c | |||||
def _action(self, action): | |||||
"""do something! What you do is determined by the argument: | |||||
1 Output A. Copy B to A. Get the next B. | |||||
2 Copy B to A. Get the next B. (Delete A). | |||||
3 Get the next B. (Delete B). | |||||
action treats a string as a single character. Wow! | |||||
action recognizes a regular expression if it is preceded by ( or , or =. | |||||
""" | |||||
if action <= 1: | |||||
self._outA() | |||||
if action <= 2: | |||||
self.theA = self.theB | |||||
if self.theA == "'" or self.theA == '"': | |||||
while 1: | |||||
self._outA() | |||||
self.theA = self._get() | |||||
if self.theA == self.theB: | |||||
break | |||||
if self.theA <= '\n': | |||||
raise UnterminatedStringLiteral() | |||||
if self.theA == '\\': | |||||
self._outA() | |||||
self.theA = self._get() | |||||
if action <= 3: | |||||
self.theB = self._next() | |||||
if self.theB == '/' and (self.theA == '(' or self.theA == ',' or | |||||
self.theA == '=' or self.theA == ':' or | |||||
self.theA == '[' or self.theA == '?' or | |||||
self.theA == '!' or self.theA == '&' or | |||||
self.theA == '|' or self.theA == ';' or | |||||
self.theA == '{' or self.theA == '}' or | |||||
self.theA == '\n'): | |||||
self._outA() | |||||
self._outB() | |||||
while 1: | |||||
self.theA = self._get() | |||||
if self.theA == '/': | |||||
break | |||||
elif self.theA == '\\': | |||||
self._outA() | |||||
self.theA = self._get() | |||||
elif self.theA <= '\n': | |||||
raise UnterminatedRegularExpression() | |||||
self._outA() | |||||
self.theB = self._next() | |||||
def _jsmin(self): | |||||
"""Copy the input to the output, deleting the characters which are | |||||
insignificant to JavaScript. Comments will be removed. Tabs will be | |||||
replaced with spaces. Carriage returns will be replaced with linefeeds. | |||||
Most spaces and linefeeds will be removed. | |||||
""" | |||||
self.theA = '\n' | |||||
self._action(3) | |||||
while self.theA != '\000': | |||||
if self.theA == ' ': | |||||
if isAlphanum(self.theB): | |||||
self._action(1) | |||||
else: | |||||
self._action(2) | |||||
elif self.theA == '\n': | |||||
if self.theB in ['{', '[', '(', '+', '-']: | |||||
self._action(1) | |||||
elif self.theB == ' ': | |||||
self._action(3) | |||||
else: | |||||
if isAlphanum(self.theB): | |||||
self._action(1) | |||||
else: | |||||
self._action(2) | |||||
else: | |||||
if self.theB == ' ': | |||||
if isAlphanum(self.theA): | |||||
self._action(1) | |||||
else: | |||||
self._action(3) | |||||
elif self.theB == '\n': | |||||
if self.theA in ['}', ']', ')', '+', '-', '"', '\'']: | |||||
self._action(1) | |||||
else: | |||||
if isAlphanum(self.theA): | |||||
self._action(1) | |||||
else: | |||||
self._action(3) | |||||
else: | |||||
self._action(1) | |||||
def minify(self, instream, outstream): | |||||
self.instream = instream | |||||
self.outstream = outstream | |||||
self.theA = '\n' | |||||
self.theB = None | |||||
self.theLookahead = None | |||||
self._jsmin() | |||||
self.instream.close() | |||||
def combine_css(): | |||||
global out_file_css, in_files_css | |||||
data = '' | |||||
for f in in_files_css: | |||||
fh = open(f, 'read') | |||||
data += fh.read() + '\n' | |||||
fh.close() | |||||
out_file = open(out_file_css, 'w') | |||||
out_file.write(data) | |||||
out_file.close() | |||||
def _compress(in_files, out_file, in_type='js', verbose=False, | |||||
temp_file='.temp'): | |||||
import os | |||||
temp = open(temp_file, 'w') | |||||
for f in in_files: | |||||
print f + ' | ' + str(int(os.path.getsize('js/'+f)/1024)) + 'k' | |||||
fh = open('js/' + f) | |||||
data = fh.read() + '\n' | |||||
fh.close() | |||||
temp.write(data) | |||||
#print ' + %s' % f | |||||
temp.close() | |||||
out = open(out_file, 'w') | |||||
jsm = JavascriptMinify() | |||||
jsm.minify(open(temp_file,'r'), out) | |||||
out.close() | |||||
org_size = os.path.getsize(temp_file) | |||||
new_size = os.path.getsize(out_file) | |||||
print '=> %s' % out_file | |||||
print 'Original: %.2f kB' % (org_size / 1024.0) | |||||
print 'Compressed: %.2f kB' % (new_size / 1024.0) | |||||
print 'Reduction: %.1f%%' % (float(org_size - new_size) / org_size * 100) | |||||
print '' | |||||
os.remove(temp_file) | |||||
if __name__=='__main__': | |||||
import sys | |||||
if sys.argv[1]=='main': | |||||
_compress(in_files_main, out_file_main) | |||||
elif sys.argv[1]=='lite': | |||||
_compress(in_files_lite, out_file_lite) | |||||
elif sys.argv[1]=='form': | |||||
_compress(in_files_form, out_file_form) | |||||
elif sys.argv[1]=='report': | |||||
_compress(in_files_report, out_file_report) | |||||
elif sys.argv[1]=='css': | |||||
combine_css() | |||||
else: | |||||
print 'parameter must be one of main, lite, css, form or report' | |||||
@@ -1,7 +1,7 @@ | |||||
/** general icons **/ | /** general icons **/ | ||||
.wn-icon { background: url('../images/icons/icons.png'); width: 16px; height: 16px; cursor: pointer; } | |||||
.wn-icon { background: url('lib/images/icons/icons.png'); width: 16px; height: 16px; cursor: pointer; } | |||||
.ic-2x2_grid { background-position: 0 0; } | .ic-2x2_grid { background-position: 0 0; } | ||||
.ic-3x3_grid { background-position: 0 -36px; } | .ic-3x3_grid { background-position: 0 -36px; } | ||||
.ic-3x3_grid_2 { background-position: 0 -72px; } | .ic-3x3_grid_2 { background-position: 0 -72px; } |
@@ -107,41 +107,6 @@ div.std-footer-item { | |||||
margin: 0px 13px 13px 0px; | margin: 0px 13px 13px 0px; | ||||
} | } | ||||
.shadow { | |||||
-moz-box-shadow: 0px 2px 2px #888; | |||||
-webkit-box-shadow: 0px 2px 2px #888; | |||||
box-shadow: 0px 2px 2px #888; | |||||
} | |||||
.round { | |||||
-webkit-border-radius: 5px; | |||||
-moz-border-radius: 5px; | |||||
border-radius: 5px; | |||||
} | |||||
.gradient { | |||||
background: #ededed; /* Old browsers */ | |||||
background: -moz-linear-gradient(top, #ededed 0%, #d1d1d1 47%, #b7b7b7 100%); /* FF3.6+ */ | |||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ededed), color-stop(47%,#d1d1d1), color-stop(100%,#b7b7b7)); /* Chrome,Safari4+ */ | |||||
background: -webkit-linear-gradient(top, #ededed 0%,#d1d1d1 47%,#b7b7b7 100%); /* Chrome10+,Safari5.1+ */ | |||||
background: -o-linear-gradient(top, #ededed 0%,#d1d1d1 47%,#b7b7b7 100%); /* Opera11.10+ */ | |||||
background: -ms-linear-gradient(top, #ededed 0%,#d1d1d1 47%,#b7b7b7 100%); /* IE10+ */ | |||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#b7b7b7',GradientType=0 ); /* IE6-9 */ | |||||
background: linear-gradient(top, #ededed 0%,#d1d1d1 47%,#b7b7b7 100%); /* W3C */ | |||||
} | |||||
.header-gradient { | |||||
background: #84827c; /* Old browsers */ | |||||
background: -moz-linear-gradient(top, #84827c 0%, #27211c 100%); /* FF3.6+ */ | |||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#84827c), color-stop(100%,#27211c)); /* Chrome,Safari4+ */ | |||||
background: -webkit-linear-gradient(top, #84827c 0%,#27211c 100%); /* Chrome10+,Safari5.1+ */ | |||||
background: -o-linear-gradient(top, #84827c 0%,#27211c 100%); /* Opera11.10+ */ | |||||
background: -ms-linear-gradient(top, #84827c 0%,#27211c 100%); /* IE10+ */ | |||||
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#84827c', endColorstr='#27211c',GradientType=0 ); /* IE6-9 */ | |||||
background: linear-gradient(top, #84827c 0%,#27211c 100%); /* W3C */ | |||||
color: #FFF; | |||||
} | |||||
/******** Menus - menu.js ************/ | /******** Menus - menu.js ************/ | ||||
ul.menu_toolbar { | ul.menu_toolbar { | ||||
@@ -1176,20 +1141,6 @@ div.dialog_row table td textarea { | |||||
/* Recent */ | /* Recent */ | ||||
div.recent_starred { | |||||
width: 16px; | |||||
height: 16px; | |||||
cursor: pointer; | |||||
background: url('../images/ui/star.gif'); | |||||
} | |||||
div.recent_unstarred { | |||||
width: 16px; | |||||
height: 16px; | |||||
cursor: pointer; | |||||
background: url('../images/ui/star_plain.gif'); | |||||
} | |||||
div.status_flag { | div.status_flag { | ||||
width: 8px; | width: 8px; | ||||
height: 8px; | height: 8px; | ||||
@@ -1198,21 +1149,14 @@ div.status_flag { | |||||
background-color: #EEE; | background-color: #EEE; | ||||
} | } | ||||
/* Search */ | /* Search */ | ||||
.search_table td { | .search_table td { | ||||
padding: 2px; | padding: 2px; | ||||
} | } | ||||
/*** for wn toolbar ***/ | /*** for wn toolbar ***/ | ||||
.wntoolbar-icon { background: url('../images/icons/wntoolbar-icons.png'); width: 16px; height: 16px; } | |||||
.wntoolbar-icon { background: url('lib/images/icons/wntoolbar-icons.png'); width: 16px; height: 16px; } | |||||
.sprite-home { background-position: 0 0; } | .sprite-home { background-position: 0 0; } | ||||
.sprite-new { background-position: 0 -66px; } | .sprite-new { background-position: 0 -66px; } | ||||
.sprite-pages { background-position: 0 -132px; } | .sprite-pages { background-position: 0 -132px; } | ||||
@@ -1509,7 +1453,7 @@ div.jqplot-noData-container { | |||||
/** general icons **/ | /** general icons **/ | ||||
.wn-icon { background: url('../images/icons/icons.png'); width: 16px; height: 16px; cursor: pointer; } | |||||
.wn-icon { background: url('lib/images/icons/icons.png'); width: 16px; height: 16px; cursor: pointer; } | |||||
.ic-2x2_grid { background-position: 0 0; } | .ic-2x2_grid { background-position: 0 0; } | ||||
.ic-3x3_grid { background-position: 0 -36px; } | .ic-3x3_grid { background-position: 0 -36px; } | ||||
.ic-3x3_grid_2 { background-position: 0 -72px; } | .ic-3x3_grid_2 { background-position: 0 -72px; } |
@@ -1,20 +1,6 @@ | |||||
/* Recent */ | /* Recent */ | ||||
div.recent_starred { | |||||
width: 16px; | |||||
height: 16px; | |||||
cursor: pointer; | |||||
background: url('../images/ui/star.gif'); | |||||
} | |||||
div.recent_unstarred { | |||||
width: 16px; | |||||
height: 16px; | |||||
cursor: pointer; | |||||
background: url('../images/ui/star_plain.gif'); | |||||
} | |||||
div.status_flag { | div.status_flag { | ||||
width: 8px; | width: 8px; | ||||
height: 8px; | height: 8px; | ||||
@@ -23,21 +9,14 @@ div.status_flag { | |||||
background-color: #EEE; | background-color: #EEE; | ||||
} | } | ||||
/* Search */ | /* Search */ | ||||
.search_table td { | .search_table td { | ||||
padding: 2px; | padding: 2px; | ||||
} | } | ||||
/*** for wn toolbar ***/ | /*** for wn toolbar ***/ | ||||
.wntoolbar-icon { background: url('../images/icons/wntoolbar-icons.png'); width: 16px; height: 16px; } | |||||
.wntoolbar-icon { background: url('lib/images/icons/wntoolbar-icons.png'); width: 16px; height: 16px; } | |||||
.sprite-home { background-position: 0 0; } | .sprite-home { background-position: 0 0; } | ||||
.sprite-new { background-position: 0 -66px; } | .sprite-new { background-position: 0 -66px; } | ||||
.sprite-pages { background-position: 0 -132px; } | .sprite-pages { background-position: 0 -132px; } |
@@ -1,245 +0,0 @@ | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `__DocTypeCache`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `__DocTypeCache` ( | |||||
`name` varchar(120) DEFAULT NULL, | |||||
`modified` datetime DEFAULT NULL, | |||||
`content` text | |||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `__SessionCache`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `__SessionCache` ( | |||||
`user` varchar(120) DEFAULT NULL, | |||||
`country` varchar(120) DEFAULT NULL, | |||||
`cache` longtext | |||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabDocField`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabDocField` ( | |||||
`name` varchar(120) NOT NULL, | |||||
`creation` datetime DEFAULT NULL, | |||||
`modified` datetime DEFAULT NULL, | |||||
`modified_by` varchar(40) DEFAULT NULL, | |||||
`owner` varchar(40) DEFAULT NULL, | |||||
`docstatus` int(1) DEFAULT '0', | |||||
`parent` varchar(120) DEFAULT NULL, | |||||
`parentfield` varchar(120) DEFAULT NULL, | |||||
`parenttype` varchar(120) DEFAULT NULL, | |||||
`idx` int(8) DEFAULT NULL, | |||||
`fieldname` varchar(180) DEFAULT NULL, | |||||
`label` varchar(180) DEFAULT NULL, | |||||
`oldfieldname` varchar(180) DEFAULT NULL, | |||||
`fieldtype` varchar(180) DEFAULT NULL, | |||||
`oldfieldtype` varchar(180) DEFAULT NULL, | |||||
`options` text, | |||||
`search_index` int(3) DEFAULT NULL, | |||||
`hidden` int(3) DEFAULT NULL, | |||||
`print_hide` int(3) DEFAULT NULL, | |||||
`report_hide` int(3) DEFAULT NULL, | |||||
`reqd` int(3) DEFAULT NULL, | |||||
`no_copy` int(3) DEFAULT NULL, | |||||
`allow_on_submit` int(3) DEFAULT NULL, | |||||
`trigger` varchar(180) DEFAULT NULL, | |||||
`depends_on` varchar(180) DEFAULT NULL, | |||||
`permlevel` int(3) DEFAULT NULL, | |||||
`width` varchar(180) DEFAULT NULL, | |||||
`default` text, | |||||
`description` text, | |||||
`colour` varchar(180) DEFAULT NULL, | |||||
`icon` varchar(180) DEFAULT NULL, | |||||
`in_filter` int(3) DEFAULT NULL, | |||||
PRIMARY KEY (`name`), | |||||
KEY `parent` (`parent`), | |||||
KEY `label` (`label`), | |||||
KEY `fieldtype` (`fieldtype`), | |||||
KEY `fieldname` (`fieldname`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabDocFormat`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabDocFormat` ( | |||||
`name` varchar(120) NOT NULL, | |||||
`creation` datetime DEFAULT NULL, | |||||
`modified` datetime DEFAULT NULL, | |||||
`modified_by` varchar(40) DEFAULT NULL, | |||||
`owner` varchar(40) DEFAULT NULL, | |||||
`docstatus` int(1) DEFAULT '0', | |||||
`parent` varchar(120) DEFAULT NULL, | |||||
`parentfield` varchar(120) DEFAULT NULL, | |||||
`parenttype` varchar(120) DEFAULT NULL, | |||||
`idx` int(8) DEFAULT NULL, | |||||
`format` varchar(180) DEFAULT NULL, | |||||
PRIMARY KEY (`name`), | |||||
KEY `parent` (`parent`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabDocPerm`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabDocPerm` ( | |||||
`name` varchar(120) NOT NULL, | |||||
`creation` datetime DEFAULT NULL, | |||||
`modified` datetime DEFAULT NULL, | |||||
`modified_by` varchar(40) DEFAULT NULL, | |||||
`owner` varchar(40) DEFAULT NULL, | |||||
`docstatus` int(1) DEFAULT '0', | |||||
`parent` varchar(120) DEFAULT NULL, | |||||
`parentfield` varchar(120) DEFAULT NULL, | |||||
`parenttype` varchar(120) DEFAULT NULL, | |||||
`idx` int(8) DEFAULT NULL, | |||||
`permlevel` int(11) DEFAULT NULL, | |||||
`role` varchar(180) DEFAULT NULL, | |||||
`match` varchar(180) DEFAULT NULL, | |||||
`read` int(3) DEFAULT NULL, | |||||
`write` int(3) DEFAULT NULL, | |||||
`create` int(3) DEFAULT NULL, | |||||
`submit` int(3) DEFAULT NULL, | |||||
`cancel` int(3) DEFAULT NULL, | |||||
`amend` int(3) DEFAULT NULL, | |||||
`execute` int(3) DEFAULT NULL, | |||||
PRIMARY KEY (`name`), | |||||
KEY `parent` (`parent`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabDocType`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabDocType` ( | |||||
`name` varchar(180) NOT NULL DEFAULT '', | |||||
`creation` datetime DEFAULT NULL, | |||||
`modified` datetime DEFAULT NULL, | |||||
`modified_by` varchar(40) DEFAULT NULL, | |||||
`owner` varchar(180) DEFAULT NULL, | |||||
`docstatus` int(1) DEFAULT '0', | |||||
`parent` varchar(120) DEFAULT NULL, | |||||
`parentfield` varchar(120) DEFAULT NULL, | |||||
`parenttype` varchar(120) DEFAULT NULL, | |||||
`idx` int(8) DEFAULT NULL, | |||||
`search_fields` varchar(180) DEFAULT NULL, | |||||
`issingle` int(1) DEFAULT NULL, | |||||
`istable` int(1) DEFAULT NULL, | |||||
`version` int(11) DEFAULT NULL, | |||||
`module` varchar(180) DEFAULT NULL, | |||||
`autoname` varchar(180) DEFAULT NULL, | |||||
`name_case` varchar(180) DEFAULT NULL, | |||||
`description` text, | |||||
`colour` varchar(180) DEFAULT NULL, | |||||
`read_only` int(1) DEFAULT NULL, | |||||
`in_create` int(1) DEFAULT NULL, | |||||
`show_in_menu` int(3) DEFAULT NULL, | |||||
`menu_index` int(11) DEFAULT NULL, | |||||
`parent_node` varchar(180) DEFAULT NULL, | |||||
`smallicon` varchar(180) DEFAULT NULL, | |||||
`allow_print` int(1) DEFAULT NULL, | |||||
`allow_email` int(1) DEFAULT NULL, | |||||
`allow_copy` int(1) DEFAULT NULL, | |||||
`allow_rename` int(1) DEFAULT NULL, | |||||
`hide_toolbar` int(1) DEFAULT NULL, | |||||
`hide_heading` int(1) DEFAULT NULL, | |||||
`allow_attach` int(1) DEFAULT NULL, | |||||
`use_template` int(1) DEFAULT NULL, | |||||
`max_attachments` int(11) DEFAULT NULL, | |||||
`section_style` varchar(180) DEFAULT NULL, | |||||
`client_script` text, | |||||
`client_script_core` text, | |||||
`server_code` text, | |||||
`server_code_core` text, | |||||
`server_code_compiled` text, | |||||
`client_string` text, | |||||
`server_code_error` varchar(180) DEFAULT NULL, | |||||
`print_outline` varchar(180) DEFAULT NULL, | |||||
`dt_template` text, | |||||
`is_transaction_doc` int(1) DEFAULT NULL, | |||||
`change_log` text, | |||||
`read_only_onload` int(1) DEFAULT NULL, | |||||
PRIMARY KEY (`name`), | |||||
KEY `parent` (`parent`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabSeries`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabSeries` ( | |||||
`name` varchar(40) DEFAULT NULL, | |||||
`current` int(10) DEFAULT NULL | |||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabSessions`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabSessions` ( | |||||
`user` varchar(40) DEFAULT NULL, | |||||
`sid` varchar(120) DEFAULT NULL, | |||||
`sessiondata` longtext, | |||||
`ipaddress` varchar(16) DEFAULT NULL, | |||||
`lastupdate` datetime DEFAULT NULL, | |||||
`status` varchar(20) DEFAULT NULL | |||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1; | |||||
/*!40101 SET character_set_client = @saved_cs_client */; | |||||
-- | |||||
-- | |||||
DROP TABLE IF EXISTS `tabSingles`; | |||||
/*!40101 SET @saved_cs_client = @@character_set_client */; | |||||
/*!40101 SET character_set_client = utf8 */; | |||||
CREATE TABLE `tabSingles` ( | |||||
`doctype` varchar(40) DEFAULT NULL, | |||||
`field` varchar(40) DEFAULT NULL, | |||||
`value` text, | |||||
KEY `doctype` (`doctype`) | |||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1; | |||||