Thanks Joe,

I will have a better read... I had fix my issue, my customization of the
plugin introduce a couple of problem... I ends up refactoring the and only
load data when all the controlled field has to be updated "once". It fix
80% of the loading time issue the rest of the issue is user related because
they don't actualize record status.

The workaround above wasn't really necessary.

Richard

On Mon, Apr 16, 2018 at 12:37 AM, Joe Barnhart <joe.barnh...@gmail.com>
wrote:

> Actually, I borrowed Anthony's excellent idea and made a "factory" class
> for my field definitions.
>
> First I defined a factory class:
>
> class Field_Factory(object):
>     from gluon import Field
>     @staticmethod
>     def new(**kwargs):
>         default = dict(**kwargs)
>         def inner(name, **kwargs):
>             args = dict(default)
>             args.update(**kwargs)
>             if args.pop('hidden',False):
>                 args.update(dict(readable=False,writable=False))
>             req = args.get('requires', None)
>             if req and (args.get('represent',None)=='formatter'):
>                 args['represent'] = req.formatter
>             if args.pop('optional',False) and req:
>                 args['requires'] = IS_EMPTY_OR(req)
>             rend = args.pop('render',None)
>             rtn = Field(name, **args)
>             if rend:
>                 rtn.render = rend
>             return rtn
>         return inner
>
> factory = Field_Factory()
>
> Then I used it to create a bunch of field generators:
>
> phone_field = factory.new(
>     type='string', length=20,
>     requires=IS_PHONE(), optional=True,
>     widget=lambda fld,val: SQLFORM.widgets.string.widget(
>         fld, val, _type='tel', _class='form-control')
> )
>
> email_field = factory.new(
>     type='string', length=50,
>     requires=IS_EMAIL(), optional=True,
>     widget=lambda fld,val: SQLFORM.widgets.string.widget(
>         fld, val, _type='email', _class='form-control')
> )
>
> date_field = factory.new(
>     type='date',
>     requires=IS_DATE(format='%m-%d-%Y'), optional=True,
>     represent=lambda v,r: v.strftime('%m-%d-%Y'),
>     widget=lambda fld,val:SQLFORM.widgets.date.widget(
>         fld, val, _class="date form-control")
> )
>
> datetime_field = factory.new(
>     type='datetime',
>     requires=IS_DATETIME(format='%m-%d-%Y %I:%M:%S %p'), optional=True,
>     represent=lambda v,r: v.strftime('%m-%d-%Y %I:%M:%S %p'),
>     widget=lambda fld,val: SQLFORM.widgets.datetime.widget(
>         fld, val, _class="datetime form-control")
> )
>
> zipcode_field = factory.new(
>     type='string', length=10,
>     requires=IS_ZIPCODE(),
>     widget=lambda fld,val: SQLFORM.widgets.string.widget(
>         fld, val, _type="zip", _class='zipcode form-control')
> )
>
> Finally, when I use the field generators in any table definitions, I can
> further customize them and the changes are passed through.
>
> define_table('joes_table',
>     . . .
>     date_field("birth", label=T("Birth date")),
>     . . .
>
>
> It all works really well and gives me the single point of control I want.
> It requires no changes in web2py and works with current, past, and future
> versions.  And the lazy programmer in me marvels at all the code I don't
> have to type.
>
> -- Joe
>
> On Thursday, March 23, 2017 at 12:54:58 PM UTC-7, Joe Barnhart wrote:
>>
>> Here is a bit of syntactic sugar I use for creating fields with less
>> typing.  And better consistency, of course -- there always has to be a good
>> reason for my lazy keyboard-saving shortcuts!
>>
>> I have a number of fields which are for specific data types, such as
>> phone numbers.  I gather the "common" parts of the Field definition into a
>> dictionary:
>>
>> phone_fld = {'requires':IS_EMPTY_OR(IS_PHONE()),
>>              'widget':lambda fld,val: SQLFORM.widgets.string.widget(fld,
>> val,_type='tel',_class='form-control')}
>>
>> When defining the field in a table, I invoke the dictionary at the end of
>> the Field definition:
>>
>> Field("homephone","string",length=20,label=T("Home phone"),**phone_fld),
>> Field("workphone","string",length=20,label=T("Work phone"),**phone_fld),
>> Field("cellphone","string",length=20,label=T("Cell phone"),**phone_fld),
>>
>> Now the field is created exactly as I want.  I keep a list of these
>> "helpers" in a module which I can call out when creating tables.  It really
>> saves the typing and allow me to control how my fields are rendered on one
>> place instead of scattered among all the tables.
>>
>> -- Joe
>>
>> --
> Resources:
> - http://web2py.com
> - http://web2py.com/book (Documentation)
> - http://github.com/web2py/web2py (Source code)
> - https://code.google.com/p/web2py/issues/list (Report Issues)
> ---
> You received this message because you are subscribed to the Google Groups
> "web2py-users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to web2py+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to