[gen] Added the possibility to span widgets on several columns on the search screen (param Field.scolspan).
This commit is contained in:
		
							parent
							
								
									3f75d14e92
								
							
						
					
					
						commit
						0dae8b1888
					
				
					 9 changed files with 79 additions and 56 deletions
				
			
		| 
						 | 
					@ -379,7 +379,7 @@ class Type:
 | 
				
			||||||
                 layouts, move, indexed, searchable, specificReadPermission,
 | 
					                 layouts, move, indexed, searchable, specificReadPermission,
 | 
				
			||||||
                 specificWritePermission, width, height, maxChars, colspan,
 | 
					                 specificWritePermission, width, height, maxChars, colspan,
 | 
				
			||||||
                 master, masterValue, focus, historized, sync, mapping, label,
 | 
					                 master, masterValue, focus, historized, sync, mapping, label,
 | 
				
			||||||
                 defaultForSearch):
 | 
					                 sdefault, scolspan):
 | 
				
			||||||
        # The validator restricts which values may be defined. It can be an
 | 
					        # The validator restricts which values may be defined. It can be an
 | 
				
			||||||
        # interval (1,None), a list of string values ['choice1', 'choice2'],
 | 
					        # interval (1,None), a list of string values ['choice1', 'choice2'],
 | 
				
			||||||
        # a regular expression, a custom function, a Selection instance, etc.
 | 
					        # a regular expression, a custom function, a Selection instance, etc.
 | 
				
			||||||
| 
						 | 
					@ -473,10 +473,12 @@ class Type:
 | 
				
			||||||
        # prefix and another name. If you want to specify a new name only, and
 | 
					        # prefix and another name. If you want to specify a new name only, and
 | 
				
			||||||
        # not a prefix, write (None, newName).
 | 
					        # not a prefix, write (None, newName).
 | 
				
			||||||
        self.label = label
 | 
					        self.label = label
 | 
				
			||||||
        # When you specify a default value "for search", on a search screen, in
 | 
					        # When you specify a default value "for search" (= "sdefault"), on a
 | 
				
			||||||
        # the search field corresponding to this field, this default value will
 | 
					        # search screen, in the search field corresponding to this field, this
 | 
				
			||||||
        # be present.
 | 
					        # default value will be present.
 | 
				
			||||||
        self.defaultForSearch = defaultForSearch
 | 
					        self.sdefault = sdefault
 | 
				
			||||||
 | 
					        # Colspan for rendering the search widget corresponding to this field.
 | 
				
			||||||
 | 
					        self.scolspan = scolspan
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def init(self, name, klass, appName):
 | 
					    def init(self, name, klass, appName):
 | 
				
			||||||
        '''When the application server starts, this secondary constructor is
 | 
					        '''When the application server starts, this secondary constructor is
 | 
				
			||||||
| 
						 | 
					@ -952,12 +954,12 @@ class Integer(Type):
 | 
				
			||||||
                 specificWritePermission=False, width=6, height=None,
 | 
					                 specificWritePermission=False, width=6, height=None,
 | 
				
			||||||
                 maxChars=13, colspan=1, master=None, masterValue=None,
 | 
					                 maxChars=13, colspan=1, master=None, masterValue=None,
 | 
				
			||||||
                 focus=False, historized=False, mapping=None, label=None,
 | 
					                 focus=False, historized=False, mapping=None, label=None,
 | 
				
			||||||
                 defaultForSearch=('','')):
 | 
					                 sdefault=('',''), scolspan=1):
 | 
				
			||||||
        Type.__init__(self, validator, multiplicity, default, show, page, group,
 | 
					        Type.__init__(self, validator, multiplicity, default, show, page, group,
 | 
				
			||||||
                      layouts, move, indexed, searchable,specificReadPermission,
 | 
					                      layouts, move, indexed, searchable,specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, maxChars, colspan,
 | 
					                      specificWritePermission, width, height, maxChars, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
        self.pythonType = long
 | 
					        self.pythonType = long
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def validateValue(self, obj, value):
 | 
					    def validateValue(self, obj, value):
 | 
				
			||||||
| 
						 | 
					@ -982,7 +984,7 @@ class Float(Type):
 | 
				
			||||||
                 specificWritePermission=False, width=6, height=None,
 | 
					                 specificWritePermission=False, width=6, height=None,
 | 
				
			||||||
                 maxChars=13, colspan=1, master=None, masterValue=None,
 | 
					                 maxChars=13, colspan=1, master=None, masterValue=None,
 | 
				
			||||||
                 focus=False, historized=False, mapping=None, label=None,
 | 
					                 focus=False, historized=False, mapping=None, label=None,
 | 
				
			||||||
                 defaultForSearch=('',''), precision=None, sep=(',', '.'),
 | 
					                 sdefault=('',''), scolspan=1, precision=None, sep=(',', '.'),
 | 
				
			||||||
                 tsep=' '):
 | 
					                 tsep=' '):
 | 
				
			||||||
        # The precision is the number of decimal digits. This number is used
 | 
					        # The precision is the number of decimal digits. This number is used
 | 
				
			||||||
        # for rendering the float, but the internal float representation is not
 | 
					        # for rendering the float, but the internal float representation is not
 | 
				
			||||||
| 
						 | 
					@ -1004,7 +1006,7 @@ class Float(Type):
 | 
				
			||||||
                      layouts, move, indexed, False, specificReadPermission,
 | 
					                      layouts, move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, maxChars, colspan,
 | 
					                      specificWritePermission, width, height, maxChars, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
        self.pythonType = float
 | 
					        self.pythonType = float
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getFormattedValue(self, obj, value):
 | 
					    def getFormattedValue(self, obj, value):
 | 
				
			||||||
| 
						 | 
					@ -1135,9 +1137,9 @@ class String(Type):
 | 
				
			||||||
                 specificReadPermission=False, specificWritePermission=False,
 | 
					                 specificReadPermission=False, specificWritePermission=False,
 | 
				
			||||||
                 width=None, height=None, maxChars=None, colspan=1, master=None,
 | 
					                 width=None, height=None, maxChars=None, colspan=1, master=None,
 | 
				
			||||||
                 masterValue=None, focus=False, historized=False, mapping=None,
 | 
					                 masterValue=None, focus=False, historized=False, mapping=None,
 | 
				
			||||||
                 label=None, defaultForSearch='', transform='none',
 | 
					                 label=None, sdefault='', scolspan=1,
 | 
				
			||||||
                 styles=('p','h1','h2','h3','h4'), allowImageUpload=True,
 | 
					                 transform='none', styles=('p','h1','h2','h3','h4'),
 | 
				
			||||||
                 richText=False):
 | 
					                 allowImageUpload=True, richText=False):
 | 
				
			||||||
        # According to format, the widget will be different: input field,
 | 
					        # According to format, the widget will be different: input field,
 | 
				
			||||||
        # textarea, inline editor... Note that there can be only one String
 | 
					        # textarea, inline editor... Note that there can be only one String
 | 
				
			||||||
        # field of format CAPTCHA by page, because the captcha challenge is
 | 
					        # field of format CAPTCHA by page, because the captcha challenge is
 | 
				
			||||||
| 
						 | 
					@ -1164,11 +1166,11 @@ class String(Type):
 | 
				
			||||||
                      layouts, move, indexed, searchable,specificReadPermission,
 | 
					                      layouts, move, indexed, searchable,specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, maxChars, colspan,
 | 
					                      specificWritePermission, width, height, maxChars, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
        self.isSelect = self.isSelection()
 | 
					        self.isSelect = self.isSelection()
 | 
				
			||||||
        # If self.isSelect, self.defaultForSearch must be a list of value(s).
 | 
					        # If self.isSelect, self.sdefault must be a list of value(s).
 | 
				
			||||||
        if self.isSelect and not defaultForSearch:
 | 
					        if self.isSelect and not sdefault:
 | 
				
			||||||
            self.defaultForSearch = []
 | 
					            self.sdefault = []
 | 
				
			||||||
        # Default width, height and maxChars vary according to String format
 | 
					        # Default width, height and maxChars vary according to String format
 | 
				
			||||||
        if width == None:
 | 
					        if width == None:
 | 
				
			||||||
            if format == String.TEXT:  self.width  = 60
 | 
					            if format == String.TEXT:  self.width  = 60
 | 
				
			||||||
| 
						 | 
					@ -1446,12 +1448,12 @@ class Boolean(Type):
 | 
				
			||||||
                 specificWritePermission=False, width=None, height=None,
 | 
					                 specificWritePermission=False, width=None, height=None,
 | 
				
			||||||
                 maxChars=None, colspan=1, master=None, masterValue=None,
 | 
					                 maxChars=None, colspan=1, master=None, masterValue=None,
 | 
				
			||||||
                 focus=False, historized=False, mapping=None, label=None,
 | 
					                 focus=False, historized=False, mapping=None, label=None,
 | 
				
			||||||
                 defaultForSearch=False):
 | 
					                 sdefault=False, scolspan=1):
 | 
				
			||||||
        Type.__init__(self, validator, multiplicity, default, show, page, group,
 | 
					        Type.__init__(self, validator, multiplicity, default, show, page, group,
 | 
				
			||||||
                      layouts, move, indexed, searchable,specificReadPermission,
 | 
					                      layouts, move, indexed, searchable,specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
        self.pythonType = bool
 | 
					        self.pythonType = bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dLayouts = {'view': 'lf', 'edit': Table('flrv;=d', width=None)}
 | 
					    dLayouts = {'view': 'lf', 'edit': Table('flrv;=d', width=None)}
 | 
				
			||||||
| 
						 | 
					@ -1495,7 +1497,7 @@ class Date(Type):
 | 
				
			||||||
                 specificWritePermission=False, width=None, height=None,
 | 
					                 specificWritePermission=False, width=None, height=None,
 | 
				
			||||||
                 maxChars=None, colspan=1, master=None, masterValue=None,
 | 
					                 maxChars=None, colspan=1, master=None, masterValue=None,
 | 
				
			||||||
                 focus=False, historized=False, mapping=None, label=None,
 | 
					                 focus=False, historized=False, mapping=None, label=None,
 | 
				
			||||||
                 defaultForSearch=None):
 | 
					                 sdefault=None, scolspan=1):
 | 
				
			||||||
        self.format = format
 | 
					        self.format = format
 | 
				
			||||||
        self.calendar = calendar
 | 
					        self.calendar = calendar
 | 
				
			||||||
        self.startYear = startYear
 | 
					        self.startYear = startYear
 | 
				
			||||||
| 
						 | 
					@ -1507,7 +1509,7 @@ class Date(Type):
 | 
				
			||||||
                      layouts, move, indexed, searchable,specificReadPermission,
 | 
					                      layouts, move, indexed, searchable,specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getCss(self, layoutType, res):
 | 
					    def getCss(self, layoutType, res):
 | 
				
			||||||
        # CSS files are only required if the calendar must be shown.
 | 
					        # CSS files are only required if the calendar must be shown.
 | 
				
			||||||
| 
						 | 
					@ -1574,13 +1576,13 @@ class File(Type):
 | 
				
			||||||
                 specificWritePermission=False, width=None, height=None,
 | 
					                 specificWritePermission=False, width=None, height=None,
 | 
				
			||||||
                 maxChars=None, colspan=1, master=None, masterValue=None,
 | 
					                 maxChars=None, colspan=1, master=None, masterValue=None,
 | 
				
			||||||
                 focus=False, historized=False, mapping=None, label=None,
 | 
					                 focus=False, historized=False, mapping=None, label=None,
 | 
				
			||||||
                 isImage=False, defaultForSearch=''):
 | 
					                 isImage=False, sdefault='', scolspan=1):
 | 
				
			||||||
        self.isImage = isImage
 | 
					        self.isImage = isImage
 | 
				
			||||||
        Type.__init__(self, validator, multiplicity, default, show, page, group,
 | 
					        Type.__init__(self, validator, multiplicity, default, show, page, group,
 | 
				
			||||||
                      layouts, move, indexed, False, specificReadPermission,
 | 
					                      layouts, move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					    @staticmethod
 | 
				
			||||||
    def getFileObject(filePath, fileName=None, zope=False):
 | 
					    def getFileObject(filePath, fileName=None, zope=False):
 | 
				
			||||||
| 
						 | 
					@ -1735,7 +1737,7 @@ class Ref(Type):
 | 
				
			||||||
                 masterValue=None, focus=False, historized=False, mapping=None,
 | 
					                 masterValue=None, focus=False, historized=False, mapping=None,
 | 
				
			||||||
                 label=None, queryable=False, queryFields=None, queryNbCols=1,
 | 
					                 label=None, queryable=False, queryFields=None, queryNbCols=1,
 | 
				
			||||||
                 navigable=False, searchSelect=None, changeOrder=True,
 | 
					                 navigable=False, searchSelect=None, changeOrder=True,
 | 
				
			||||||
                 defaultForSearch=''):
 | 
					                 sdefault='', scolspan=1):
 | 
				
			||||||
        self.klass = klass
 | 
					        self.klass = klass
 | 
				
			||||||
        self.attribute = attribute
 | 
					        self.attribute = attribute
 | 
				
			||||||
        # May the user add new objects through this ref ?
 | 
					        # May the user add new objects through this ref ?
 | 
				
			||||||
| 
						 | 
					@ -1815,7 +1817,7 @@ class Ref(Type):
 | 
				
			||||||
                      layouts, move, indexed, False, specificReadPermission,
 | 
					                      layouts, move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, sync, mapping,
 | 
					                      master, masterValue, focus, historized, sync, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
        self.validable = self.link
 | 
					        self.validable = self.link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getDefaultLayouts(self):
 | 
					    def getDefaultLayouts(self):
 | 
				
			||||||
| 
						 | 
					@ -2078,7 +2080,7 @@ class Computed(Type):
 | 
				
			||||||
                 specificWritePermission=False, width=None, height=None,
 | 
					                 specificWritePermission=False, width=None, height=None,
 | 
				
			||||||
                 maxChars=None, colspan=1, method=None, plainText=True,
 | 
					                 maxChars=None, colspan=1, method=None, plainText=True,
 | 
				
			||||||
                 master=None, masterValue=None, focus=False, historized=False,
 | 
					                 master=None, masterValue=None, focus=False, historized=False,
 | 
				
			||||||
                 sync=True, mapping=None, label=None, defaultForSearch='',
 | 
					                 sync=True, mapping=None, label=None, sdefault='', scolspan=1,
 | 
				
			||||||
                 context={}):
 | 
					                 context={}):
 | 
				
			||||||
        # The Python method used for computing the field value
 | 
					        # The Python method used for computing the field value
 | 
				
			||||||
        self.method = method
 | 
					        self.method = method
 | 
				
			||||||
| 
						 | 
					@ -2096,7 +2098,7 @@ class Computed(Type):
 | 
				
			||||||
                      layouts, move, indexed, False, specificReadPermission,
 | 
					                      layouts, move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, sync, mapping,
 | 
					                      master, masterValue, focus, historized, sync, mapping,
 | 
				
			||||||
                      label, defaultForSearch)
 | 
					                      label, sdefault, scolspan)
 | 
				
			||||||
        self.validable = False
 | 
					        self.validable = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def callMacro(self, obj, macroPath):
 | 
					    def callMacro(self, obj, macroPath):
 | 
				
			||||||
| 
						 | 
					@ -2166,7 +2168,7 @@ class Action(Type):
 | 
				
			||||||
                      move, indexed, False, specificReadPermission,
 | 
					                      move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, False, mapping,
 | 
					                      master, masterValue, focus, historized, False, mapping,
 | 
				
			||||||
                      label, None)
 | 
					                      label, None, None)
 | 
				
			||||||
        self.validable = False
 | 
					        self.validable = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def getDefaultLayouts(self): return {'view': 'l-f', 'edit': 'lrv-f'}
 | 
					    def getDefaultLayouts(self): return {'view': 'l-f', 'edit': 'lrv-f'}
 | 
				
			||||||
| 
						 | 
					@ -2214,7 +2216,7 @@ class Info(Type):
 | 
				
			||||||
                      move, indexed, False, specificReadPermission,
 | 
					                      move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, False, mapping,
 | 
					                      master, masterValue, focus, historized, False, mapping,
 | 
				
			||||||
                      label, None)
 | 
					                      label, None, None)
 | 
				
			||||||
        self.validable = False
 | 
					        self.validable = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Pod(Type):
 | 
					class Pod(Type):
 | 
				
			||||||
| 
						 | 
					@ -2253,7 +2255,7 @@ class Pod(Type):
 | 
				
			||||||
                      move, indexed, searchable, specificReadPermission,
 | 
					                      move, indexed, searchable, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, False, mapping,
 | 
					                      master, masterValue, focus, historized, False, mapping,
 | 
				
			||||||
                      label, None)
 | 
					                      label, None, None)
 | 
				
			||||||
        self.validable = False
 | 
					        self.validable = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def isFrozen(self, obj):
 | 
					    def isFrozen(self, obj):
 | 
				
			||||||
| 
						 | 
					@ -2397,7 +2399,7 @@ class List(Type):
 | 
				
			||||||
                      layouts, move, indexed, False, specificReadPermission,
 | 
					                      layouts, move, indexed, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, historized, True, mapping,
 | 
					                      master, masterValue, focus, historized, True, mapping,
 | 
				
			||||||
                      label, None)
 | 
					                      label, None, None)
 | 
				
			||||||
        self.validable = True
 | 
					        self.validable = True
 | 
				
			||||||
        # Tuples of (names, Type instances) determining the format of every
 | 
					        # Tuples of (names, Type instances) determining the format of every
 | 
				
			||||||
        # element in the list.
 | 
					        # element in the list.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ class Calendar(Type):
 | 
				
			||||||
                      layouts, move, False, False, specificReadPermission,
 | 
					                      layouts, move, False, False, specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, False, True, mapping, label,
 | 
					                      master, masterValue, focus, False, True, mapping, label,
 | 
				
			||||||
                      None)
 | 
					                      None, None)
 | 
				
			||||||
        # eventTypes can be a "static" list or tuple of strings that identify
 | 
					        # eventTypes can be a "static" list or tuple of strings that identify
 | 
				
			||||||
        # the types of events that are supported by this calendar. It can also
 | 
					        # the types of events that are supported by this calendar. It can also
 | 
				
			||||||
        # be a method that computes such a "dynamic" list or tuple. When
 | 
					        # be a method that computes such a "dynamic" list or tuple. When
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -870,21 +870,35 @@ class ToolMixin(BaseMixin):
 | 
				
			||||||
                                          page=self.REQUEST.get('page', 'main'))
 | 
					                                          page=self.REQUEST.get('page', 'main'))
 | 
				
			||||||
        return res
 | 
					        return res
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tabularize(self, data, numberOfRows):
 | 
					    def getGroupedSearchFields(self, searchInfo):
 | 
				
			||||||
        '''This method transforms p_data, which must be a "flat" list or tuple,
 | 
					        '''This method transforms p_searchInfo['fieldDicts'], which is a "flat"
 | 
				
			||||||
           into a list of lists, where every sub-list has length p_numberOfRows.
 | 
					           list of fields, into a list of lists, where every sub-list having
 | 
				
			||||||
           This method is typically used for rendering elements in a table of
 | 
					           length p_searchInfo['nbOfColumns']. For every field, scolspan
 | 
				
			||||||
           p_numberOfRows rows.'''
 | 
					           (=colspan "for search") is taken into account.'''
 | 
				
			||||||
        res = []
 | 
					        res = []
 | 
				
			||||||
        row = []
 | 
					        row = []
 | 
				
			||||||
        for elem in data:
 | 
					        rowLength = 0
 | 
				
			||||||
            row.append(elem)
 | 
					        for field in searchInfo['fieldDicts']:
 | 
				
			||||||
            if len(row) == numberOfRows:
 | 
					            # Can I insert this field in the current row?
 | 
				
			||||||
 | 
					            remaining = searchInfo['nbOfColumns'] - rowLength
 | 
				
			||||||
 | 
					            if field['scolspan'] <= remaining:
 | 
				
			||||||
 | 
					                # Yes.
 | 
				
			||||||
 | 
					                row.append(field)
 | 
				
			||||||
 | 
					                rowLength += field['scolspan']
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                # We must put the field on a new line. Complete the current one
 | 
				
			||||||
 | 
					                # if not complete.
 | 
				
			||||||
 | 
					                while rowLength < searchInfo['nbOfColumns']:
 | 
				
			||||||
 | 
					                    row.append(None)
 | 
				
			||||||
 | 
					                    rowLength += 1
 | 
				
			||||||
                res.append(row)
 | 
					                res.append(row)
 | 
				
			||||||
                row = []
 | 
					                row = [field]
 | 
				
			||||||
 | 
					                rowLength = field['scolspan']
 | 
				
			||||||
        # Complete the last unfinished line if required.
 | 
					        # Complete the last unfinished line if required.
 | 
				
			||||||
        if row:
 | 
					        if row:
 | 
				
			||||||
            while len(row) < numberOfRows: row.append(None)
 | 
					            while rowLength < searchInfo['nbOfColumns']:
 | 
				
			||||||
 | 
					                row.append(None)
 | 
				
			||||||
 | 
					                rowLength += 1
 | 
				
			||||||
            res.append(row)
 | 
					            res.append(row)
 | 
				
			||||||
        return res
 | 
					        return res
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1171,6 +1185,9 @@ class ToolMixin(BaseMixin):
 | 
				
			||||||
        klass = self.getAppyClass(className, wrapper=True)
 | 
					        klass = self.getAppyClass(className, wrapper=True)
 | 
				
			||||||
        method = getattr(klass, name).searchSelect
 | 
					        method = getattr(klass, name).searchSelect
 | 
				
			||||||
        tool = self.appy()
 | 
					        tool = self.appy()
 | 
				
			||||||
        objects = method.__get__(tool)(tool)
 | 
					        if method.__class__.__name__ == 'function':
 | 
				
			||||||
 | 
					            objects = method(tool)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            objects = method.__get__(tool)(tool)
 | 
				
			||||||
        return [(o.uid, o) for o in objects]
 | 
					        return [(o.uid, o) for o in objects]
 | 
				
			||||||
# ------------------------------------------------------------------------------
 | 
					# ------------------------------------------------------------------------------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,7 +39,7 @@ class Ogone(Type):
 | 
				
			||||||
                      False, False,specificReadPermission,
 | 
					                      False, False,specificReadPermission,
 | 
				
			||||||
                      specificWritePermission, width, height, None, colspan,
 | 
					                      specificWritePermission, width, height, None, colspan,
 | 
				
			||||||
                      master, masterValue, focus, False, True, mapping, label,
 | 
					                      master, masterValue, focus, False, True, mapping, label,
 | 
				
			||||||
                      None)
 | 
					                      None, None)
 | 
				
			||||||
        # orderMethod must contain a method returning a dict containing info
 | 
					        # orderMethod must contain a method returning a dict containing info
 | 
				
			||||||
        # about the order. Following keys are mandatory:
 | 
					        # about the order. Following keys are mandatory:
 | 
				
			||||||
        #   * orderID   An identifier for the order. Don't use the object UID
 | 
					        #   * orderID   An identifier for the order. Don't use the object UID
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,17 +24,21 @@
 | 
				
			||||||
    <input tal:condition="refInfo" type="hidden" name="ref" tal:attributes="value refInfo"/>
 | 
					    <input tal:condition="refInfo" type="hidden" name="ref" tal:attributes="value refInfo"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <table width="100%">
 | 
					    <table width="100%">
 | 
				
			||||||
      <tr tal:repeat="searchRow python: tool.tabularize(searchInfo['fieldDicts'], searchInfo['nbOfColumns'])"
 | 
					      <tr tal:repeat="searchRow python: tool.getGroupedSearchFields(searchInfo)"
 | 
				
			||||||
          valign="top">
 | 
					          valign="top">
 | 
				
			||||||
        <td tal:repeat="widget searchRow" tal:attributes="width python:'%d%%' % (100/searchInfo['nbOfColumns'])">
 | 
					        <tal:widgets repeat="widget searchRow">
 | 
				
			||||||
          <tal:field condition="widget">
 | 
					         <td tal:define="scolspan widget/scolspan|python: 1"
 | 
				
			||||||
 | 
					             tal:attributes="width python:'%d%%' % ((100/searchInfo['nbOfColumns'])*scolspan);
 | 
				
			||||||
 | 
					                             colspan scolspan">
 | 
				
			||||||
 | 
					           <tal:field condition="widget">
 | 
				
			||||||
            <tal:show define="name widget/name;
 | 
					            <tal:show define="name widget/name;
 | 
				
			||||||
                                   widgetName python: 'w_%s' % name;
 | 
					                                   widgetName python: 'w_%s' % name;
 | 
				
			||||||
                                   macroPage python: widget['type'].lower()">
 | 
					                                   macroPage python: widget['type'].lower()">
 | 
				
			||||||
              <metal:call use-macro="python: getattr(appFolder.ui.widgets, macroPage).macros['search']"/>
 | 
					              <metal:call use-macro="python: getattr(appFolder.ui.widgets, macroPage).macros['search']"/>
 | 
				
			||||||
            </tal:show>
 | 
					            </tal:show>
 | 
				
			||||||
          </tal:field><br class="discreet"/>
 | 
					          </tal:field><br class="discreet"/>
 | 
				
			||||||
        </td>
 | 
					         </td>
 | 
				
			||||||
 | 
					        </tal:widgets>
 | 
				
			||||||
      </tr>
 | 
					      </tr>
 | 
				
			||||||
    </table>
 | 
					    </table>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,6 @@
 | 
				
			||||||
 <label tal:attributes="for widgetName" tal:content="python: _(widget['labelId'])"></label><br>  
 | 
					 <label tal:attributes="for widgetName" tal:content="python: _(widget['labelId'])"></label><br>  
 | 
				
			||||||
 <input type="text" tal:define="maxChars python: test(widget['maxChars'], widget['maxChars'], '')"
 | 
					 <input type="text" tal:define="maxChars python: test(widget['maxChars'], widget['maxChars'], '')"
 | 
				
			||||||
                    tal:attributes="name python: '%s*string' % widgetName;
 | 
					                    tal:attributes="name python: '%s*string' % widgetName;
 | 
				
			||||||
                                    maxlength maxChars;
 | 
					                                    maxlength maxChars; size widget/width;
 | 
				
			||||||
                                    value widget/defaultForSearch"/>
 | 
					                                    value widget/sdefault"/>
 | 
				
			||||||
</metal:search>
 | 
					</metal:search>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,12 +25,12 @@
 | 
				
			||||||
    <label tal:attributes="for fromName" tal:content="python: _('search_from')"></label>
 | 
					    <label tal:attributes="for fromName" tal:content="python: _('search_from')"></label>
 | 
				
			||||||
    <input type="text" size="4"
 | 
					    <input type="text" size="4"
 | 
				
			||||||
           tal:attributes="name fromName; maxlength maxChars;
 | 
					           tal:attributes="name fromName; maxlength maxChars;
 | 
				
			||||||
                           value python: widget['defaultForSearch'][0]"/>
 | 
					                           value python: widget['sdefault'][0]"/>
 | 
				
			||||||
  </tal:from>
 | 
					  </tal:from>
 | 
				
			||||||
  <tal:to define="toName python: '%s_to' % name">
 | 
					  <tal:to define="toName python: '%s_to' % name">
 | 
				
			||||||
    <label tal:attributes="for toName" tal:content="python: _('search_to')"></label>
 | 
					    <label tal:attributes="for toName" tal:content="python: _('search_to')"></label>
 | 
				
			||||||
    <input type="text" size="4"
 | 
					    <input type="text" size="4"
 | 
				
			||||||
           tal:attributes="name toName; maxlength maxChars;
 | 
					           tal:attributes="name toName; maxlength maxChars;
 | 
				
			||||||
                           value python: widget['defaultForSearch'][1]"/>
 | 
					                           value python: widget['sdefault'][1]"/>
 | 
				
			||||||
  </tal:to><br/>
 | 
					  </tal:to><br/>
 | 
				
			||||||
</metal:search>
 | 
					</metal:search>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,12 +25,12 @@
 | 
				
			||||||
    <label tal:attributes="for fromName" tal:content="python: _('search_from')"></label>
 | 
					    <label tal:attributes="for fromName" tal:content="python: _('search_from')"></label>
 | 
				
			||||||
    <input type="text" size="4"
 | 
					    <input type="text" size="4"
 | 
				
			||||||
           tal:attributes="name fromName; maxlength maxChars;
 | 
					           tal:attributes="name fromName; maxlength maxChars;
 | 
				
			||||||
                           value python: widget['defaultForSearch'][0]"/>
 | 
					                           value python: widget['sdefault'][0]"/>
 | 
				
			||||||
  </tal:from>
 | 
					  </tal:from>
 | 
				
			||||||
  <tal:to define="toName python: '%s_to' % name">
 | 
					  <tal:to define="toName python: '%s_to' % name">
 | 
				
			||||||
    <label tal:attributes="for toName" tal:content="python: _('search_to')"></label>
 | 
					    <label tal:attributes="for toName" tal:content="python: _('search_to')"></label>
 | 
				
			||||||
    <input type="text" size="4"
 | 
					    <input type="text" size="4"
 | 
				
			||||||
           tal:attributes="name toName; maxlength maxChars;
 | 
					           tal:attributes="name toName; maxlength maxChars;
 | 
				
			||||||
                           value python: widget['defaultForSearch'][1]"/>
 | 
					                           value python: widget['sdefault'][1]"/>
 | 
				
			||||||
  </tal:to><br/>
 | 
					  </tal:to><br/>
 | 
				
			||||||
</metal:search>
 | 
					</metal:search>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,9 +94,9 @@
 | 
				
			||||||
  <tal:simpleSearch condition="not: widget/isSelect">
 | 
					  <tal:simpleSearch condition="not: widget/isSelect">
 | 
				
			||||||
    <input type="text" tal:define="maxChars python: test(widget['maxChars'], widget['maxChars'], '')"
 | 
					    <input type="text" tal:define="maxChars python: test(widget['maxChars'], widget['maxChars'], '')"
 | 
				
			||||||
                       tal:attributes="name python: '%s*string-%s' % (widgetName, widget['transform']);
 | 
					                       tal:attributes="name python: '%s*string-%s' % (widgetName, widget['transform']);
 | 
				
			||||||
                                       maxlength maxChars;
 | 
					                                       maxlength maxChars; size widget/width;
 | 
				
			||||||
                                       style python: 'text-transform:%s' % widget['transform'];
 | 
					                                       style python: 'text-transform:%s' % widget['transform'];
 | 
				
			||||||
                                       value widget/defaultForSearch"/>
 | 
					                                       value widget/sdefault"/>
 | 
				
			||||||
  </tal:simpleSearch>
 | 
					  </tal:simpleSearch>
 | 
				
			||||||
  <tal:comment replace="nothing">Show a multi-selection box for fields whose
 | 
					  <tal:comment replace="nothing">Show a multi-selection box for fields whose
 | 
				
			||||||
    validator defines a list of values, with a "AND/OR" checkbox.</tal:comment>
 | 
					    validator defines a list of values, with a "AND/OR" checkbox.</tal:comment>
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,7 @@
 | 
				
			||||||
    <label tal:attributes="for andName" tal:content="python: _('search_and')"></label><br/>
 | 
					    <label tal:attributes="for andName" tal:content="python: _('search_and')"></label><br/>
 | 
				
			||||||
    </tal:operator>
 | 
					    </tal:operator>
 | 
				
			||||||
    <tal:comment replace="nothing">The list of values</tal:comment>
 | 
					    <tal:comment replace="nothing">The list of values</tal:comment>
 | 
				
			||||||
    <select tal:define="preSelected widget/defaultForSearch"
 | 
					    <select tal:define="preSelected widget/sdefault"
 | 
				
			||||||
            tal:attributes="name widgetName; size widget/height" multiple="multiple">
 | 
					            tal:attributes="name widgetName; size widget/height" multiple="multiple">
 | 
				
			||||||
      <option tal:repeat="v python:tool.getPossibleValues(name, withTranslations=True, withBlankValue=False, className=className)"
 | 
					      <option tal:repeat="v python:tool.getPossibleValues(name, withTranslations=True, withBlankValue=False, className=className)"
 | 
				
			||||||
              tal:attributes="value python:v[0]; title python: v[1];
 | 
					              tal:attributes="value python:v[0]; title python: v[1];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue