Developer Guidelines - Basics
Table of Contents
Here are some helpful hints to get started developing in Sahana Eden.
Running Sahana Eden
cd .. # the web2py main directory python web2py.py
Or if you don't want to have to enter a password (or have issues launching the Web2Py GUI).
python web2py.py -a 1234
Wiping the Database
Out of the box Sahana Eden is set to use the SQLite database. If you want to wipe all the data, simply delete the databases/
directory, along with the sessions/
directory (this contains details about your login - which will be invalid as you'll be deleting the user account). The next time you run Sahana Eden, it will recreate the database tables.
Pre-Populating Data
Sahana Eden is able to "Pre-Populate" data so you can explore/test/develop the application with different types of data. Pre-Populate options are associated with the Templates, but they can be set in models/000_config.py
.
IFRC
is a good set of pre-populate to use (See: https://github.com/sahana/eden/tree/master/modules/templates/IFRC). It also has an admin user account: admin@example.com password: testing. To use it edit models/000_config.py
:
After:
# ============================================================================= # Over-rides to the Template may be done here
Add (or un-comment):
settings.base.prepopulate += ("IFRC", "IFRC/Train")
Pre-populate data will only be created if the database is empty, so you may need to wipe the database first. It may take a few minutes to load the data.
Debug Mode
In models/000_config.py
uncomment this line:
settings.base.debug = True
to:
- Use the non-minified CSS & JS
- See changes in
modules/s3db
files without restarting Web2Py
Running a Sahana Eden Python Shell
To open a Python Shell in the Sahana Eden Environment, where you can inspect Web2Py and Sahana Eden variables as well as access the data:
cd web2py python web2py.py -S eden -M
To have database changes be persistent (e.g. to see via Web UI), you will need to commit the transactions: db.commit()
.
Python
Indentation matters (use 4 spaces instead of Tabs)
- http://diveintopython.net
- http://openbookproject.net/thinkcs/python/english2e/
- http://software-carpentry.org
- Python v2 documentation: http://docs.python.org/ (We are currently using v2.7.)
Web2Py
This is an MVC environment (like Rails & Django.).
Web2Py can work at several different levels of abstraction.
The Sahana Eden framework (S3) is built on Web2Py's Auth/Crud classes in tools.py
(with some remnants of the older T2), however sometimes we need more control therefore need to drop down a level or two.
Can execute a controller to be able to access its functions using:
execfile("applications/eden/controllers/mycontroller.py", globals())
Web2Py can be extended through Plugins & also has a recipes site.
Javascript
- Basic Javascript tutorials
- https://developer.mozilla.org/en/learn/javascript
- http://www.w3schools.com/js/
- Although see http://w3fools.com on why you may wish to avoid them
- jQuery is used for client-side business logic (hiding fields, opening up tabs, etc):
- Tutorial 1: http://docs.jquery.com/Tutorials:How_jQuery_Works
- Tutorial 2: http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery
- Main reference: http://docs.jquery.com
- We use some plugins: http://plugins.jquery.com
- & some Widgets: http://jqueryui.com
- ExtJS is used for some advanced widgets:
- S3 includes a cross-browser debug utility (only shows up when ?debug=1):
s3_debug('message', value);
All global variables should be in the S3 namespace:
Private variables should be protected, e.g. using the Module Pattern:
- http://yuiblog.com/blog/2007/06/12/module-pattern/
- http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth
Can test out the performance of different options to achieve a task using:
Can check quality using JSLint:
XSLT
To transform XML (and CSV) files for importing and exporting data.
- Sahana Eden XSLT Documentation
- XPath: http://www.w3schools.com/xpath/default.asp
- XSLT: http://www.w3schools.com/xsl/default.asp
- lxml Tutorial
Debugging
Python
- Use the Eclipse IDE to be able to set breakpoints and inspect expressions.
- WSGI likes print statements to go to
sys.stderr
notsys.stdout
: http://code.google.com/p/modwsgi/wiki/DebuggingTechniques - use Web2Py shell: http://www.vimeo.com/879939
- use IPython for interactive exploration (on Windows, install PyReadline)
- use FirePy to see logging output to Console (to view with Firebug)
- Log to a File: http://groups.google.com/group/web2py/browse_thread/thread/e20d0bd2e542aa14
- Debug Tools: http://docs.python.org/library/debug.html
- Use Inspect to check which function called the one you're troubleshooting:
import inspect curframe = inspect.currentframe() calframe = inspect.getouterframes(curframe, 2) current.log.debug("caller name: %s" % calframe[1][3])
- Debug SQL Queries:
vi gluon/dal.py class BaseAdapter() def select(): def response(sql): if "searchphrase" in sql: current.log.debug("Query: %s" % query) current.log.debug("SQL: %s" % sql)
- Debug Views:
vi gluon/globals.py def write(self, data, escape=True): try: ...All Old Code ... except Exception, error: # Put Eclipse breakpoint on the below line exc_type, exc_value, exc_traceback = sys.exc_info() pass
- Debug SQL Queries:
- Python Debugging Techniques
- Insert these statements into your code
- Get a Python shell up to explore interactively:
import code; code.interact(locals=locals()
- Get a full stack trace:
import pdb; pdb.set_trace()
- Get a Python shell up to explore interactively:
- Insert these statements into your code
- winpdb: http://groups.google.com/group/web2py/msg/ee46125b7c93fdd4
- WingIDE: http://www.wingware.com/
- Using with Web2Py: http://www.wingware.com/doc/howtos/web2py
- Eclipse IDE
- Unicode:
- "Decode early, Unicode everywhere, Encode late": http://farmdev.com/talks/unicode/
- http://boodebr.org/main/python/all-about-python-and-unicode
- Python Design Patterns:
HTML, CSS, and Javascript
Each of the major browsers has tools available for viewing HTML page structure and form data, Javascript code, CSS. Some also support Javascript debugging, including setting breakpoints and viewing values in variables.
- Firefox: Install the Firebug plugin. Start Firebug by clicking the bug icon in the upper right. After the tools open in the lower half of the page, load the page you want to debug.
- Chrome: Open the Chrome developer tools with Chrome menu (three bar icon) -> Tools -> Developer tools.
- Internet Explorer: Open the IE developer tools with F12, or Tools (gear icon) -> F12 Developer Tools. Note that you can test behavior of pages under earlier versions of IE by setting your current IE to behave as earlier versions. In the developer tools menu bar, click Browser Mode and select the desired version.
Other tools that may be of interest:
- use Visual Event to see which events are active.
- use Venkman: http://www.mozilla.org/projects/venkman/
- use Fiddler for compressed files: http://www.yuiblog.com/blog/2008/06/27/fiddler
- http://pastebin.me (allows edits of HTML & previews)
- http://jsfiddle.net (allows edits of JS & previews)
- http://yura.thinkweb2.com/domlint/
- IE6 cheatsheet: http://www.virtuosimedia.com/tutorials/ultimate-ie6-cheatsheet-how-to-fix-25-internet-explorer-6-bugs