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


 

-- 



Reply via email to