Let me try to keep it simple .. because I don't want to pollute this thread with many tables and fields
OK ... initially everything was working OK ! I had 3 models files like the followings : 0.py, db.py & menu.py in 0.dy I had : from gluon.storage import Storage settings = Storage() settings.migrate = True settings.title = 'SoccerApp' settings.author = 'Don Clermont' settings.author_email = '[email protected]' settings.database_uri = 'mysql://msqldbuser:password@localhost:3306/dbname' settings.email_server = 'localhost' settings.email_sender = '[email protected]' settings.email_login = '[email protected]' settings.login_method = 'local' in db.py I had many tables and variables defined ( I will try to keep it short ): # -*- coding: utf-8 -*- T.current_languages=['en','en-us'] if request.vars._language: session._language=request.vars._language if session._language: T.force(session._language) if not request.env.web2py_runtime_gae: db = DAL('mysql://w2pdbuser:letme1n@localhost:3306/w2pspdb202') else: db = DAL('google:datastore') session.connect(request, response, db = db) response.generic_patterns = ['*'] if request.is_local else [] ######################################################################### from gluon.tools import Auth, Crud, Service, PluginManager, prettydate auth = Auth(db, hmac_key=Auth.get_or_create_key()) crud, service, plugins = Crud(db), Service(), PluginManager() user_lang =('French','English','Other') Canada_Provinces = ('AB - Alberta',T('BC - British Columbia'),'MB - Manitoba',T('NB - New Brunswick'),T('NL - Newfoundland and Labrador'),T('NS - Nova Scotia'),T('NT - Northwest Territories'),'NU - Nunavut','ON - Ontario',T('PE - Prince Edward Island'),'QC - Quebec','SK - Saskatchewan','YT - Yukon') group_type =(T('League'),T('Club, School or "Team Promoter"'),T('Player'),T('Coach'),T('Referee'),T('Parent or Supporting guardian'),T('Soccer worker, Volunteer or Fan'),T('OTHER (ex:Business, Health pro, Agent or Misc. other)')) defaultfoto = ( 'defaultuser.png','defaulthumb.png') defaultuserpics = { 0:IMG(_src=URL('static','images/'+ defaultfoto[0])), 1:DIV(_class='previewpic')} import re from gluon.validators import Validator class IS_CANADIAN_ZIP(Validator): regex = re.compile('^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$') def __init__(self,error_message='Invalid!'): self.error_message = error_message def __call__(self,value): value = str(value).upper() if self.regex.match(value): return value, None else: return value, self.error_message from plugin_hradio_widget import hradio_widget import os ######################################## db.define_table('auth_user', Field('first_name', type='string',length=50, label=T('First Name')), Field('last_name', type='string',length=50, label=T('Last Name')), Field('email', type='string',unique=True, label=T('E-mail')), Field('email_check', type='string',requires=IS_EQUAL_TO(request.vars.email), label=T('Re-enter E-mail')), Field('password', type='password', readable=False, label=T('Password')), Field('sex',requires=IS_IN_SET((T('male'),T('female'))),label=T('My Sex is')), Field('usertype',requires=IS_IN_SET((0,1,2,3,4,5,6,7),group_type), label=T('I am a')), Field('birth_date','date',label=T('Birth Date')), Field('Iagreeto','boolean',requires=IS_NOT_EMPTY(error_message='you must agree to this !'), label=T('I agree to the Terms of service, Privacy policy, and Codes of conduct.')), Field('full_profile','boolean',default=False,writable=False,readable=False), Field('created_on','datetime',default=request.now, label=T('Created On'),writable=False,readable=False), Field('modified_on','datetime',default=request.now, label=T('Modified On'),writable=False,readable=False, update=request.now), Field('registration_key',default='', writable=False,readable=False), Field('reset_password_key',default='', writable=False,readable=False), Field('user_adress', type='string',length=100,default=' ', label=T('Street address'),writable=True,readable=True), Field('user_city', type='string',length=30,default=' ', label=T('City'),writable=True,readable=True), Field('user_prov',default=' ',label=T('Province')), Field('user_postalcode',default=' ',label=T('Zip / Postalcode')), Field('Country',default='Canada',writable=False,readable=True,comment=T('default is Canada for now !'),label=T('Country of Residence')), Field('user_speaks',label=T('I speak'),writable=True,readable=True, requires=IS_IN_SET((0,1,2),user_lang, multiple=True), widget=SQLFORM.widgets.checkboxes.widget,default='0'), Field('more_Lang',label=T('Specify other Languages '),comment=T('Please List other languages spoken separated by a comma' )), Field('user_image','boolean',label=T('My Thumbnail or Picture')), Field('user_picture','upload',label=T('upload your picture'),uploadfolder=os.path.join(request.folder,'uploads')), Field('user_thumbnail','upload',readable=False, writable=False), Field('user_description','text',default=''), Field('user_soccerstory','text',default=''),format='%(first_name)s %(last_name)s', migrate=settings.migrate) from images import * db.auth_user.user_picture.requires = RESIZE(133, 133) db.auth_user.user_thumbnail.compute = lambda row: THUMB(row.user_picture, 32, 32) db.auth_user.first_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty) db.auth_user.last_name.requires = IS_NOT_EMPTY(error_message=auth.messages.is_empty) db.auth_user.password.requires = CRYPT(key=auth.settings.hmac_key) ## db.auth_user.user_description.requires = IS_LENGTH(minsize=0, maxsize=250) ## db.auth_user.user_soccerstory.requires = IS_LENGTH(minsize=0, maxsize=750) db.auth_user.email.requires = (IS_EMAIL(error_message=auth.messages.invalid_email), IS_NOT_IN_DB(db, db.auth_user.email)) ##db.auth_user.user_postalcode.requires = [IS_CANADIAN_ZIP(),IS_NOT_EMPTY()] ## ## ## ## auth.define_tables(migrate = settings.migrate) ## configure email mail=auth.settings.mailer mail.settings.server = 'logging' or 'smtp.gmail.com:587' mail.settings.sender = '[email protected]' mail.settings.login = 'username:password' ## configure auth policy auth.settings.registration_requires_verification = False auth.settings.registration_requires_approval = False auth.settings.reset_password_requires_verification = True auth.settings.on_failed_authentication = URL('default','user') auth.settings.login_next = URL('profile','index') mail.settings.server = settings.email_server mail.settings.sender = settings.email_sender mail.settings.login = settings.email_login db.define_table('league', Field('field1' ....), bla bla bla Field('field_Nth' ...)) db.define_table('Team_owners', Field('1field1' ....), bla bla bla Field('10th_field' ...)) db.define_table('coach', Field('field1' ....), bla bla bla Field('field_Nth' ...)) db.define_table('player', Field('field1' ....), bla bla bla Field('field_Nth' ...)) def select_datewidget(field,value): MINYEAR = 1910 MAXYEAR = 2008 import datetime now = datetime.date.today() .... bla .. bla .. bla .... bla ... return wrapper db.auth_user.birth_date.widget = select_datewidget def multiselect_widget(f,v): ... ... bla .. bla .. return wrapper Initiall every thing was going as planned ... my tables were being created, views and controllers are fine ! now .. I am moving these extra tables except the auth_user table and certain variables defined above to new files in MODELS sub directories in order to use the conditional models scheme ... and creating subfolders in /models matching controller/action names so after I have done that ! I moved the other db.define_table('table_name', Field1 to Fieldn ..... ) and certain variables declared above to other files .... and doing the same in the controller ..... and the views ... the tables in these new sub directory files don't get created ! I get the error msg : <class '_mysql_exceptions.OperationalError'> (1005, "Can't create table 'w2pspdb202.team' (errno: 150)") Version web2py™ (2, 1, 1, datetime.datetime(2012, 10, 15, 12, 44, 40), 'stable') Traceback 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Traceback (most recent call last): File "/home/www-data/w2p202/gluon/restricted.py", line 209, in restricted exec ccode in environment File "/home/www-data/w2p202/applications/soccerplug/models/adminsoccer/club.py", line 20, in <module> Field('team_supporters','list:reference auth_user')) File "/home/www-data/w2p202/gluon/dal.py", line 7085, in define_table table = self.lazy_define_table(tablename,*fields,**args) File "/home/www-data/w2p202/gluon/dal.py", line 7117, in lazy_define_table polymodel=polymodel) File "/home/www-data/w2p202/gluon/dal.py", line 920, in create_table self.create_sequence_and_triggers(query,table) File "/home/www-data/w2p202/gluon/dal.py", line 1678, in create_sequence_and_triggers self.execute(query) File "/home/www-data/w2p202/gluon/dal.py", line 1693, in execute return self.log_execute(*a, **b) File "/home/www-data/w2p202/gluon/dal.py", line 1687, in log_execute ret = self.cursor.execute(*a, **b) File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute self.errorhandler(self, exc, value) File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler raise errorclass, errorvalue OperationalError: (1005, "Can't create table 'w2pspdb202.team' (errno: 150)") the club.py file there are referring to is actually the first one and it looks like this : # coding: utf8 db.define_table('team', Field('created_by','reference auth_user'), Field('owned_by','reference team_owners'), Field('plays_in','reference soc_league'), Field('is_active','boolean'), Field('is_suspended','boolean'), Field('name','string'), Field('team_reg_id',unique=True), Field('category',requires=IS_IN_SET(soccer_cat)), Field('Class', requires=IS_IN_SET(soccer_class)), Field('Team_sex', requires=IS_IN_SET(team_sex)), Field('team_pic','upload',uploadfolder=os.path.join(request.folder,'uploads')), Field('Team_players','list:reference the_player'), Field('Team_coaches','list:reference the_coach'), Field('team_supporters','list:reference auth_user')) from images import RESIZE db.team.team_pic.requires = RESIZE(250, 250) db.define_table('the_player', Field('registered_by','reference auth_user'), Field('player', db.auth_user,requires=IS_NULL_OR(IS_IN_DB(db,'auth_user.id'))), Field('player_stats'), Field('is_active',type='boolean'), Field('on_suspension',type='boolean'), Field('player_passport_num',unique=True), Field('is_registered',type='boolean'), Field('player_height'), Field('player_weight'), Field('player_position','list:reference soccer_role_position'), Field('player_cat',label=T('Category'),requires=IS_IN_SET(soccer_cat)), Field('player_class',label=T('Class'),requires=IS_IN_SET(soccer_class)), Field('owned_by',db.team_owners,requires=IS_NULL_OR(IS_IN_DB(db,'team_owners.id'))), Field('Player_team','list:reference team')) db.define_table('the_coach', Field('registered_by','reference auth_user'), Field('coach_id', db.auth_user,requires=IS_NULL_OR(IS_IN_DB(db,'auth_user.id'))), Field('is_active',type='boolean'), Field('on_suspension',type='boolean'), Field('coach_role','list:reference coach_activity'), Field('coach_passport_num',unique=True), Field('has_credentials','list:reference soccercoach_credentials'), Field('is_with_club','list:reference team_owners'), Field('coaches_team','list:reference team'), Field('is_available','list:reference time_schedule')) so ... My concern is simple : How does the conditional models work ??? ... I want specifics .. there are a few threads that talk about it ... with no specifics ... and no examples ... I have looked through various web2py based programs like Instanpress which uses subdirectories in the MODELS but it does not tell me much ! .. are there any other examples that I can dissect ... or is there a how to somewhere ? .. or a slice ? ... please help thank you Don --

