Index: formmaker.py
===================================================================
--- formmaker.py	(revision 2229)
+++ formmaker.py	(working copy)
@@ -39,24 +39,29 @@
 
 def column_widget_generic_col(column):
     parms = column_parms(column)
+    if column.notNone:
+        parms['validator'] = validators.NotEmpty()
     return widgets.TextField(**parms)
 column_widget_generic_col = column_widget.when(
         "isinstance(column, col.SOCol)")(column_widget_generic_col)
 
 def column_widget_int_col(column):
     parms = column_parms(column)
-    return widgets.TextField(validator=validators.Int(), **parms)
+    parms['validator'] = validators.Int(not_empty=column.notNone)
+    return widgets.TextField(**parms)
 column_widget_int_col = column_widget.when(
         "isinstance(column, col.SOIntCol)")(column_widget_int_col)
 
 def column_widget_float_col(column):
     parms = column_parms(column)
-    return widgets.TextField(validator=validators.Number(), **parms)
+    parms['validator'] = validators.Number(not_empty=column.notNone)
+    return widgets.TextField(**parms)
 column_widget_int_col = column_widget.when(
         "isinstance(column, (col.SOFloatCol))")(column_widget_float_col)
-    
+
 def column_widget_string_col(column):
     parms = column_parms(column)
+    parms['validator'] = validators.String(not_empty=column.notNone)
     if column.length:
         return widgets.TextField(**parms)
     else:
@@ -67,25 +72,32 @@
 def column_widget_enum_col(column):
     params = column_parms(column)
     params['options'] = [(value, value) for value in column.enumValues ]
+    # currently EnumCols cannot be null
     params['validator'] = validators.OneOf(column.enumValues)
     return widgets.SingleSelectField(**params)
 column_widget_enum_col = column_widget.when(
         "isinstance(column,col.SOEnumCol)")(column_widget_enum_col)
-        
+
 def column_widget_date_col(column):
     parms = column_parms(column)
+    # overide DatePicker validator as may be notNone
+    parms['validator'] = validators.DateConverter(not_empty=column.notNone)
     return widgets.CalendarDatePicker(**parms)
 column_widget_date_col = column_widget.when(
         "isinstance(column,col.SODateCol)")(column_widget_date_col)
 
 def column_widget_datetime_col(column):
     parms = column_parms(column)
+    # overide DateTimePicker validator as may be notNone
+    parms['validator'] = validators.DateTimeConverter(not_empty=column.notNone)
     return widgets.CalendarDateTimePicker(**parms)
 column_widget_date_col = column_widget.when(
         "isinstance(column,col.SODateTimeCol)")(column_widget_datetime_col)
 
 def column_boolean(column):
     parms = column_parms(column)
+    # overide CheckBox validator as may be notNone
+    parms['validator'] = validators.Bool(not_empty=column.notNone)
     return widgets.CheckBox(**parms)
 column_boolean = column_widget.when("isinstance(column, col.SOBoolCol)")(column_boolean)
 
@@ -96,10 +108,14 @@
     items = fkey_class.select()
     # make options a callable to retrieve fresh data 
     # every time the widget is rendered
-    parms['options'] = lambda: [(None, '')] + [(item.id, unicode(item)) for item in items]
+    if column.notNone:
+        parms['options'] = lambda: [(item.id, unicode(item)) for item in items]
+    else:
+        parms['options'] = lambda: [(None, '')] + [(item.id, unicode(item)) for item in items]
     return DataSelectField(**parms)
 column_widget_fkey_col = column_widget.when(
         "isinstance(column,col.SOKeyCol)")(column_widget_fkey_col)
+
 def join_widget(join):
     pass
 join_widget = dispatch.generic()(join_widget)
@@ -123,10 +139,10 @@
 join_widget_related_col = join_widget.when(
         "isinstance(join,joins.SORelatedJoin)")(join_widget_related_join)
 
-
 def fields_for(sqlclass, fields=None):
     sqlclass_columns = so_columns(sqlclass)
-    sqlclass_joins = so_joins(sqlclass)
+    sqlclass_joins = dict((j.joinMethodName, j) for j in so_joins(sqlclass))
+
     if fields:
         columnlist = fields
     elif hasattr(sqlclass, "form_order"):
@@ -136,15 +152,13 @@
     widgetlist = []
     for column in columnlist:
         widget = None
-        if sqlclass_columns.has_key(column):
+        if column in sqlclass_columns:
             widget = column_widget(sqlclass_columns[column])
-        elif sqlclass_columns.has_key(column + 'ID'): #key column
+        elif column + 'ID' in sqlclass_columns: #key column
             widget = column_widget(sqlclass_columns[column + 'ID'])
-        else:
-            for join in sqlclass_joins:
-                if join.joinMethodName == column:
-                    widget = join_widget(join)
-                    break
+        elif column in sqlclass_joins:
+            widget = join_widget(sqlclass_joins[column])
+
         if not widget:
             raise Exception, "Join or column %r not found in class %r" % (column, sqlclass.__name__)
         widgetlist.append(widget)

