== Python == - Slow start - http://openbookproject.net/thinkcs/python/english2e/ - Quick start - http://diveintopython.org/ - v.Quick start! - Indentation matters (use 4 spaces instead of Tabs) - OOP - everything is an object == Web2Py == * http://mdp.cti.depaul.edu/examples/static/cookbook.pdf * http://mdp.cti.depaul.edu/examples/static/web2py_cheatsheet.pdf This is an MVC environment (like Rails). === Model === Defines databases in: {{{/models/module.py}}} (equivalent of {{{inst/mysql-dbcreate.sql}}}) The Models are loaded 1st within Web2Py processing, before the controllers. So you can import any global modules/set any global variables here. The Models are imported in alphabetical order, so we load the files which other modules depend on 1st, hence naming them with an underscore: {{{_db.py}}}, {{{_gis.py}}} === Controller === Python functions in {{{/controllers/module.py}}} e.g. {{{ def list_records(): list=t2.itemize(table) return dict (list=list) }}} === View === HTML/Javascript templates in {{{/views/module/function.html}}} * these are normal HTML/JS files with the ability to add in Python code (e.g. variables) surrounded by brackets: {{ interpreted python here }} * there should be an .html file available for each function in the module (name normally being the same as the function) * these normally inherit from {{{views/layout.html}}} which also includes the Javascript from {{{views/web2py_ajax_t2.html}}} * if there is no view defined then a default view will be displayed, which will show the values of all the data it can see, but not be formatted nicely CSS/Javascript files are stored in {{{/static}}} (equivalent of {{{www/res}}}) == T2 == This plugin is used for [wiki:DeveloperGuidelinesAuthenticationAccess AAA] & simplified [wiki:DeveloperGuidelinesCreateReadUpdateDelete CRUD] (inc Conflict Detection) * http://mdp.cti.depaul.edu/examples/static/t2.pdf We extend the T2 class in {{{modules/sahana.py}}} === Conflict Detection === Sahana is a multi-user system so there is a potential for multiple users to be editing the same record at once. Add this field to each table which needs protecting (in {{{models/db.py}}}): {{{ SQLField('modified_on','datetime'), # Used by T2 to do edit conflict-detection }}} This field is also used in [wiki:DeveloperGuidelinesDatabaseSynchronization Database Synchronization] == Sahana3 Framework == These are the bits that we use on top of Web2Py to give the Sahana look & feel: Populate the side navigation Menus by adding this to each controller: {{{ module='module' # Current Module (for sidebar title) module_name=db(db.module.name==module).select()[0].name_nice # List Modules (from which to build Menu of Modules) modules=db(db.module.enabled=='Yes').select(db.module.ALL,orderby=db.module.menu_priority) # List Options (from which to build Menu for this Module) options=db(db['%s_menu_option' % module].enabled=='Yes').select(db['%s_menu_option' % module].ALL,orderby=db['%s_menu_option' % module].priority) }}} Each function needs to return these values to the view: return dict(module_name=module_name,modules=modules,options=options) List output can be made more functional by adding this to your table definitions in models/db.py: {{{db.table.represent=lambda table: A(table.display_field,_href=t2.action('display_table',table.id))}}} Form labels can be set in a translatable manner using: {{{db.table.field.label=T("label")}}} Form field can be made to use a TEXTAREA by marking the field as being type 'text': {{{SQLField('field','text'),}}} Form field can be made to use a SELECT dropdown by setting the field as a lookup to another table...linked to the 'uuid' field to allow [wiki:DeveloperGuidelinesDatabaseSynchronization Database Synchronization], but displaying a more user-friendly field (such as 'name'): {{{ SQLField('field',length=64), db.table.field.requires=IS_NULL_OR(IS_IN_DB(db,'othertable.uuid','othertable.name')) }}} Form field being required can be marked using: {{{db.table.field.comment=SPAN("*",_class="req")}}} Help for a form field can be set using: {{{A(SPAN("[Help]"),_class="popupLink",_id="tooltip",_title=T("Help Title|This is what this field is for."))}}} === Options fields === Sahana2 has a generic 'field_options' table for storing Options fields. Sahana3 uses a separate table for each lookup list. == How to add a new Module? == DeveloperGuidelinesNewModule == Using Bzr == DeveloperGuidelinesBzr == Tips == DeveloperGuidelinesTips ---- === Translations of this page === * [wiki:DeveloperGuidelinesDE Deutsch]