def proccess_change_page_layout(self, pageid, newlayoutid): """ Cambia el diseño de una página, a los modulos existentes en esa página se les asigna el panel correspondiente al nuevo layout. Si hay un panel con el mismo nombre se le pone ese, si no se le pone el 'contentpane' que es el unico panel obligatorio. Parametros ---------- page_id: id de la página a la cual le cambiamos el layout newlayoutid: El id de la tabla layout correspondiente al nuevo layout """ db = self.db options = self.options obj_page = db.pages[pageid] if (str(obj_page.layoutsrc) != newlayoutid): modulesinpage = db(db.pagemodules.pageid == pageid).select() for mip in modulesinpage: current_layout_mip_name = db_packages.Packages( ).get_panename_byid(mip.panename) nuevolayout = int(options['plugin_layout_default']) if newlayoutid: nuevolayout = int(newlayoutid) #hay un panel que se llama igual en el nuevo diseño? if db_packages.Packages().existe_panename( current_layout_mip_name, nuevolayout): #Si lo hay, se mueve ahí newpane = db_packages.Packages( ).get_idpanename_from_name_and_layout( current_layout_mip_name, nuevolayout) db(db.pagemodules.id == mip.id).update( panename=newpane) else: #search a common name 'contentpane' or 'toppane' must be in skin newpane = db_packages.Packages( ).get_idpanename_from_name_and_layout( 'contentpane', nuevolayout) if newpane == -1: newpane = db_packages.Packages( ).get_idpanename_from_name_and_layout( 'toppane', nuevolayout) db(db.pagemodules.id == mip.id).update( panename=newpane) return
def edit_pagemodule(self, pagemoduleid): """ Editar pagemodule a partir del pagemoduleid""" db = self.db clPyPages = self.clPyPages deletable = False pagemodulerecord = db.pagemodules[pagemoduleid] #Filtrar los paneles según el layout que tiene la pagina obj_page = db.pages[pagemodulerecord.pageid] layouts_id_default = int( db_options.Options().get_option('plugin_layout_default')) container_id_default = int( db_options.Options().get_option('plugin_container_default')) try: layouts_id = obj_page.layoutsrc except: layouts_id = layouts_id_default if layouts_id == None: layouts_id = layouts_id_default panes = db_packages.Packages().get_panesfromlayoutid(layouts_id, True) #limitar la lista de paneles para que solo se muestren los correspondientes al layout que está usando isinset_list = [] for p in panes: item_panes = ((p['id']), p['panename']) isinset_list.append(item_panes) db.pagemodules.panename.requires = IS_IN_SET(isinset_list) db.pagemodules.pageid.requires = IS_IN_SET( clPyPages.get_pages_hierarchical()) form = SQLFORM(db.pagemodules, pagemoduleid, showid=True, deletable=deletable) return form
def define_tables(self): T = self.T db = self.db signature = db_pynuke.PyNuke().def_fields_signature() querypages = (db.pages.tree_id == 1) & (db.pages.id > 1) dict_containers = db_packages.Packages().get_layouts_available(2) db.define_table( 'pagemodules', Field('moduleid', db.modules, label=T('module'), readable=False, writable=False), Field('moduletitle', 'string', label=T('Module title'), comment=T("Title for the module")), Field('moduleorder', 'integer', label=T('order')), Field('alignment', requires=IS_EMPTY_OR( IS_IN_SET([T('Left'), T('Center'), T('Right')]))), Field('pageid', db.pages, requires=IS_IN_DB(db(querypages), db.pages.id, '%(name)s'), label=T('Page'), represent=lambda id, row: A(db.pages(id).name, _href= '%s' % db_pages.Pages.Navigation( ).friendly_url_to_page(id))), #Field('pageid',db.pages,requires=IS_IN_SET(db_pages.Pages.WebForms().get_pages_hierarchical()) ,label=T('Page')), Field('color', 'string', label=T('color')), Field('border', 'string', label=T('border')), Field('iconfile', 'upload', label=T('Icon File')), Field('panename', db.layouts_panes, label=T('Pane')), Field('cachetime', 'integer', readable=False, writable=False, label=T('Cache time')), Field('visibility', 'integer', readable=False, writable=False, label=T('Visibility')), Field('containersrc', db.layouts, requires=IS_EMPTY_OR(IS_IN_SET(dict_containers)), label=T('container')), Field('displaytitle', 'boolean', default=True, label=T('Display Title')), Field('displayprint', 'boolean', default=False, readable=False, writable=False, label=T('Display Print')), Field('displaysyndicate', 'boolean', default=False, readable=False, writable=False, label=T('Display Syndicate')), Field('iswebslice', 'boolean', default=False, readable=False, writable=False, label=T('Is Web Slice')), Field('webslicetitle', 'string', readable=False, writable=False, label=T('Web Slice Title')), Field('websliceexpirydate', 'datetime', readable=False, writable=False, label=T('Web Slice expiry date')), Field('webslicettl', 'integer', readable=False, writable=False, label=T('Web Slice ttl')), Field('isdeleted', 'boolean', label=T('Is Deleted'), readable=False, writable=False), Field('cachemethod', 'string', readable=False, writable=False, label=T('Cache Method')), Field('header', 'text', label=T('Module header')), Field('footer', 'text', label=T('Module footer')), Field('culturecode', 'string', label=T('Culture code'), readable=False, writable=False), Field('uniqueid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, readable=False, writable=False), Field('versionguid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, readable=False, writable=False), Field('defaultlanguageguid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, readable=False, writable=False), Field('localizedversionguid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, readable=False, writable=False), signature, format='%(moduletitle)s', plural='pagemodules', singular='pagemodule', ) db.define_table( 'modulesettings', Field('pagemoduleid', db.pagemodules, label=T('pagemoduleid'), readable=False, writable=False), Field('settingname', 'string', label=T('Setting Name'), writable=False), Field('settingvalue', 'string', label=T('Setting Value')), signature, format='%(settingname)s', plural='Setting', singular='Settings', ) return
def define_tables(self): T = self.T db = self.db request = self.request signature = db_pynuke.PyNuke().def_fields_signature() dict_layouts = db_packages.Packages().get_layouts_available() dict_containers = db_packages.Packages().get_layouts_available(2) dict_result = { 'pages': [ Field('node_type'), Field( 'name', 'string', length=50, required=True, notnull=True, label=T("Name"), comment= T("Name of the page. This text is displayed in the menu system." )), Field( 'title', 'string', length=255, label=T("Title"), comment= T("Enter a title for this page. The inserted text is displayed in the title of the browser window." )), Field( 'slug', 'string', requires=IS_SLUG(), label=T("Friendly URL"), comment=T("You can enter a custom URL for the page.")), Field('description', 'text', label=T("Description"), comment=T("Enter a description for this page")), Field( 'keywords', 'text', label=T("Keywords"), comment= T("Enter some keywords for this page (separated by commas). These keywords are used by some internet search engines like Google to help index your site's pages." )), Field( 'isvisible', 'boolean', default=True, label=T("Page Visible"), comment= T("You can choose to include or exclude this page from the main menu. If the page is not included in the menu, you can link it using its URL.." )), Field( 'sectionheadervisible', 'boolean', label=T("Section Header Visible"), default=True, comment= T("In some designs there is a area marked as section header, with this check you can select if this area is visible or not" )), Field("a", 'string', label="Application"), Field("c", 'string', label="Controller"), Field("f", 'string', label="Function"), Field("args", 'string', label="Arguments"), Field("sortable", 'integer', writable=False, readable=False), Field('iconfile', 'upload', length=100), Field( 'signature', 'boolean', ), Field( 'disablelink', 'boolean', label=T("Disabled"), comment= T("If the page is disabled it cannot be clicked in any navigation menu. This option is used to provide place-holders for child menu items." )), Field('isdeleted', 'boolean', writable=False, readable=False), Field( 'url', 'string', length=255, writable=True, readable=True, comment= T("If you would like this page to behave as a navigation link to another resource, you can specify the Link URL value here. Please note that this field is optional." ), label=T("Link URL")), Field( 'layoutsrc', db.layouts, label=T("Layout"), comment=T( "The selected skin will be applied to this page."), requires=IS_EMPTY_OR(IS_IN_SET(dict_layouts)), length=255), Field('viewsrc', 'string', length=255), Field( 'containersrc', db.layouts, label=T("Container"), comment= T("The selected container will be applied by default to all modules on this page without container specified." ), requires=IS_EMPTY_OR(IS_IN_SET(dict_containers)), length=255), Field('pagepath', 'string', length=255, writable=False, readable=False), Field( 'startdate', 'datetime', label=T("Start date"), comment= T("Enter the start date for displaying this page. You may use the Calendar to pick a date." )), Field( 'enddate', 'datetime', label=T("End date"), comment= T("Enter the end date for displaying this page. You may use the Calendar to pick a date." )), Field('refreshinterval', 'integer', writable=False, readable=False), Field( 'pageheadtext', 'text', label=T("Page header tags"), comment= T('Enter any tags (i.e. META tags) that should be rendered in the "HEAD" tag of the HTML for this page.' )), Field( 'pagefootertext', 'text', label=T("Page footer tags"), comment= T('Enter any text that should be rendered in the footer for this page.' )), Field( 'issecure', 'boolean', label=T("Secure"), comment= T("Specify whether or not this page should be forced to use a secure connection (SSL)." )), Field('permanentredirect', 'boolean', writable=False, readable=False), Field( 'sitemappriority', 'double', label=T("Site Map Priority"), comment= T("Enter the desired priority (between 0 and 1.0). This helps determine how this page is ranked in Google with respect to other pages on your site (0.5 is the default)." ), default=0.5, required=True, represent=lambda value, row: DIV('%.1f' % ( 0.5 if value == None else value)), ), Field('iconfilelarge', 'upload', length=255), Field('culturecode', 'string', writable=False, readable=False, length=10), Field('contentitemid', 'integer', writable=False, readable=False), Field('uniqueid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, writable=False, readable=False), Field('versionguid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, writable=False, readable=False), Field('defaultlanguageguid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, writable=False, readable=False), Field('localizedversionguid', length=64, default=lambda: str(uuid.uuid4()), notnull=True, writable=False, readable=False), signature, ], } def make_slug(r): db = self.db value = IS_SLUG()(r.name)[0] return value return dict_result
def insert_modules_visibles_all_pages(self, pageid): """ Crea una instancia de cada módulo marcado "Visible en todas las paginas" en la página que se le pase Parametros ---------- page_id: id del registro de la tabla db.pages a editar can_delete: especifica si en el formulario se va a incluir el checkbox delete """ db = self.db modules_all_pages = db(db.modules.allpages == True).select() settings = self.settings objpage = db.pages[pageid] for mod_ap in modules_all_pages: query = (db.pagemodules.moduleid == mod_ap.id) query = query & ((db.pagemodules.isdeleted == False) | (db.pagemodules.isdeleted == None)) first_pagemodule = db(query).select( orderby=db.pagemodules.id).first() tmp_namepane = db_packages.Packages().get_panename_byid( first_pagemodule.panename) tmp_layout = objpage.layoutsrc or settings.plugin_layout_default if db_packages.Packages().existe_panename(tmp_namepane, tmp_layout): idpane = db_packages.Packages( ).get_idpanename_from_name_and_layout(tmp_namepane, tmp_layout) else: idpane = db_packages.Packages( ).get_idpanename_from_name_and_layout("contentpane", tmp_layout) new_pagemoduleid = db.pagemodules.insert( moduleid=mod_ap.id, moduletitle=first_pagemodule.moduletitle, moduleorder=first_pagemodule.moduleorder, alignment=first_pagemodule.alignment, pageid=pageid, color=first_pagemodule.color, iconfile=first_pagemodule.iconfile, panename=idpane, cachetime=first_pagemodule.cachetime, visibility=first_pagemodule.visibility, containersrc=first_pagemodule.containersrc, displaytitle=first_pagemodule.displaytitle, displayprint=first_pagemodule.displayprint, displaysyndicate=first_pagemodule.displaysyndicate, iswebslice=first_pagemodule.iswebslice, webslicetitle=first_pagemodule.webslicetitle, websliceexpirydate=first_pagemodule.websliceexpirydate, webslicettl=first_pagemodule.webslicettl, isdeleted=first_pagemodule.isdeleted, cachemethod=first_pagemodule.cachemethod, header=first_pagemodule.header, footer=first_pagemodule.footer, culturecode=first_pagemodule.culturecode, uniqueid=first_pagemodule.uniqueid, ) settings_to_duplicate = db(db.modulesettings.pagemoduleid == first_pagemodule.id).select() for setting in settings_to_duplicate: db.modulesettings.insert(pagemoduleid=new_pagemoduleid, settingname=setting.settingname, settingvalue=setting.settingvalue) db.commit()
def copy_pagemodule_all_pages(self, moduleid, pagemoduleid, sourcepageid, copypagesettings=True): """ Copia el modulo especificado en todas las páginas, agregando registros en pagemodules para cada página excepto para la pagina "fuente" que es de donde viene el módulo Parametros ---------- moduleid: id de la tabla modules pagemoduleid: id de la table pagemodules del módulo que se va a a copiar en todas las paginas sourcepageid: página origen donde está el modulo. Ahí no se copiará copypagesettings: True if you want to copy the page settings too Return -------- Nothing... """ db = self.db settings = self.settings obj_module_to_duplicate = db.pagemodules[pagemoduleid] tpages = db.pages pages = db((tpages.isdeleted == False) | (tpages.isdeleted == None) & (tpages.id != sourcepageid) & (tpages.tree_id == 1) & (tpages.level > 0)).select() for p in pages: panename_orig = db_packages.Packages().get_panename_byid( obj_module_to_duplicate.panename) pane_dest = db_packages.Packages( ).get_idpanename_from_name_and_layout( panename_orig, p.layoutsrc or settings.plugin_layout_default) new_pagemoduleid = db.pagemodules.insert( pageid=p.id, moduleid=moduleid, moduletitle=obj_module_to_duplicate.moduletitle, moduleorder=obj_module_to_duplicate.moduleorder, alignment=obj_module_to_duplicate.alignment, color=obj_module_to_duplicate.color, border=obj_module_to_duplicate.color, iconfile=obj_module_to_duplicate.iconfile, panename=pane_dest, cachetime=obj_module_to_duplicate.cachetime, visibility=obj_module_to_duplicate.visibility, containersrc=obj_module_to_duplicate.containersrc, displaytitle=obj_module_to_duplicate.displaytitle, displayprint=obj_module_to_duplicate.displayprint, displaysyndicate=obj_module_to_duplicate.displaysyndicate, cachemethod=obj_module_to_duplicate.cachemethod, header=obj_module_to_duplicate.header, footer=obj_module_to_duplicate.footer, culturecode=obj_module_to_duplicate.culturecode, ) #optionally copy settings ... if copypagesettings: settings_to_duplicate = db( db.modulesettings.pagemoduleid == pagemoduleid).select() for setting in settings_to_duplicate: db.modulesettings.insert(pagemoduleid=new_pagemoduleid, settingname=setting.settingname, settingvalue=setting.settingvalue) return
def form_settings(self): ''' Opciones generales del sitio ''' db = self.db T = self.T auth = self.auth settings = self.settings clPyPages = self.clPyPages ckeditor = CKEditor(db) #leer los valores actuales de configuracion para asignar por defecto options, dict_default_helps = self.read_sitesettings() #options = self.get_all_options() #dict_default_helps = self.default_dicthelps() #querystartpage = (db.pages.tree_id == 1) & (db.pages.id > 1) usersadmins = db_security.PNSecurity().get_users_from_role(1) dictusers = {} for u in usersadmins: value = str(u.id) + " - " + u.email if "username" in u: value += " - " + u.username dictusers[u.id] = value enabled_change_user = False if auth.user_id == int(settings.portal_admin): enabled_change_user = True dict_layouts = db_packages.Packages().get_layouts_available() dict_containers = db_packages.Packages().get_layouts_available(2) list_pags = clPyPages.get_pages_hierarchical() result = SQLFORM.factory(Field('plugin_layout_default', db.layouts, requires=IS_IN_SET(dict_layouts), label=T('Layout'), default=options['plugin_layout_default'], comment=dict_default_helps['plugin_layout_default']), Field('plugin_container_default', db.layouts, requires=IS_IN_SET(dict_containers), label=T('Container'), default=options['plugin_container_default'], comment=dict_default_helps['plugin_container_default']), Field('portal_admin','string',label=T('Portal Administrator'),requires=IS_IN_SET(dictusers),default=options['portal_admin'],comment=dict_default_helps['portal_admin'], writable=enabled_change_user), Field('img_logo','string',label=T('Image Logo'),default=options['img_logo'],comment=dict_default_helps['img_logo']), Field('link_logo','string',label=T('Link Logo'),default=options['link_logo'],comment=dict_default_helps['link_logo']), Field('site_title','string',label=T('Title'),default=options['site_title'],comment=dict_default_helps['site_title']), Field('site_description','string',label=T('Description'),default=options['site_description'],comment=dict_default_helps['site_description']), Field('bootstrap_brand','string',label=T('Bootstrap brand'),default=options['bootstrap_brand'],comment=dict_default_helps['bootstrap_brand']), Field('author','string',label=T('Author'),default=options['author'],comment=dict_default_helps['author']), Field('keywords','text',label=T('Keywords'),default=options['keywords'],comment=dict_default_helps['keywords']), Field('generator','string',label=T('Generator'),default=options['generator'],comment=dict_default_helps['generator']), Field('copyright','string',label=T('Copyright'),default=options['copyright'],comment=dict_default_helps['copyright']), Field('startpageid',db.pages,label=T('Start Page'),requires=IS_IN_SET(list_pags, zero='', multiple=False),default=options['startpageid'],comment=dict_default_helps['startpageid']), Field('gmt_offset','string',label=T('GMT offset'),readable=False, writable=False,default=options['gmt_offset'],comment=dict_default_helps['gmt_offset']), Field('google_meta','string',label=T('google_meta'),default=options['google_meta'],writable=False, readable=False,comment=dict_default_helps['google_meta']), Field('google_analytics_id','string',label=T('Google Analytics id'),default=options['google_analytics_id'],comment=dict_default_helps['google_analytics_id']), Field('migrate','boolean',label=T('Migrate'),default=db_pynuke.PyNuke.Utils().str2bool(options['migrate']),comment=dict_default_helps['migrate']), Field('mail_settings_server','string',label=T('Mail settings server'),default=options['mail_settings_server'],comment=dict_default_helps['mail_settings_server']), Field('mail_settings_sender','string',label=T('Mail settings sender'),default=options['mail_settings_sender'],comment=dict_default_helps['mail_settings_sender']), Field('mail_settings_allmessageswithcopyto','string',label=T('All messages with copy to'),default=options['mail_settings_allmessageswithcopyto'],comment=dict_default_helps['mail_settings_allmessageswithcopyto']), Field('mail_settings_TLS','boolean',label=T('Use TLS'),default=db_pynuke.PyNuke.Utils().str2bool(options['mail_settings_TLS']),comment=dict_default_helps['mail_settings_TLS']), Field('mail_settings_SSL','boolean',label=T('Use SSL'),default=db_pynuke.PyNuke.Utils().str2bool(options['mail_settings_SSL']),comment=dict_default_helps['mail_settings_SSL']), Field('mail_settings_login','string',label=T('Mail login'),default=options['mail_settings_login'],comment=dict_default_helps['mail_settings_login']), Field('mail_settings_logging','boolean',label=T('Simulate sending messages'),default=db_pynuke.PyNuke.Utils().str2bool(options['mail_settings_logging']),comment=dict_default_helps['mail_settings_logging']), Field('mail_maximo_num_envios_x_sendqueue','string',label=T('Max messages x sendqueue proccess'),default=options['mail_maximo_num_envios_x_sendqueue'],comment=dict_default_helps['mail_maximo_num_envios_x_sendqueue']), Field('registration_type', 'string', requires=IS_IN_SET({'private':T('Private'), 'public':T('Public'), 'verified':T('Verified'), 'public-verified':T('Public-Verified'), 'none':T('None'), }), label=T('Registration type'), default=options['registration_type'].lower(), comment=dict_default_helps['registration_type']), Field('message_onregister','boolean',label=T('Send mail to portal admin when user registered'),default=db_pynuke.PyNuke.Utils().str2bool(options['message_onregister']),comment=dict_default_helps['message_onregister']), Field('message_onvalidation','boolean',label=T('Send mail to portal admin when a user validates the mail address'),default=db_pynuke.PyNuke.Utils().str2bool(options['message_onvalidation']),comment=dict_default_helps['message_onvalidation']), Field('use_mail_as_username','boolean',label=T('use mail as username'),default=db_pynuke.PyNuke.Utils().str2bool(options['use_mail_as_username']),comment=dict_default_helps['use_mail_as_username']), Field('reset_password_requires_verification','boolean',label=T('reset_password_requires_verification'),default=db_pynuke.PyNuke.Utils().str2bool(options['site_description']),comment=dict_default_helps['reset_password_requires_verification']), Field('LevelLogging','string',label=T('Level Logging'),default=options['LevelLogging'],comment=dict_default_helps['LevelLogging']), Field('force_SSL','boolean',label=T('Force SSL'),default=db_pynuke.PyNuke.Utils().str2bool(options['force_SSL']),comment=dict_default_helps['force_SSL']), Field('auth_require_recaptcha','boolean',label=T('Auth Login requires recaptcha'),default=db_pynuke.PyNuke.Utils().str2bool(options['auth_require_recaptcha']),comment=dict_default_helps['auth_require_recaptcha']), Field('auth_register_require_recaptcha','boolean',label=T('Auth Register requires recaptcha'),default=db_pynuke.PyNuke.Utils().str2bool(options['auth_register_require_recaptcha']),comment=dict_default_helps['auth_register_require_recaptcha']), Field('auth_retrieve_username_require_recaptcha','boolean',label=T('Retrieve username requires recaptcha'),default=db_pynuke.PyNuke.Utils().str2bool(options['auth_retrieve_username_require_recaptcha']),comment=dict_default_helps['auth_retrieve_username_require_recaptcha']), Field('auth_retrieve_password_require_recaptcha','boolean',label=T('Retrieve password requires recaptcha'),default=db_pynuke.PyNuke.Utils().str2bool(options['auth_retrieve_password_require_recaptcha']),comment=dict_default_helps['auth_retrieve_password_require_recaptcha']), Field('recaptcha_publickey','string',label=T('Recaptcha publickey'),default=options['recaptcha_publickey'],comment=dict_default_helps['recaptcha_publickey']), Field('recaptcha_privatekey','string',label=T('Recaptcha privatekey'),default=options['recaptcha_privatekey'],comment=dict_default_helps['recaptcha_privatekey']), Field('recaptcha_options','string',label=T('Recaptcha options'),default=options['recaptcha_options'],comment=dict_default_helps['recaptcha_options']), Field('compress_css_files','boolean', label=T('Compress CSS Files'), default=db_pynuke.PyNuke.Utils().str2bool(options['compress_css_files']) , comment=dict_default_helps['compress_css_files']), Field('compress_js_files','boolean',label=T('Compress JS Files'),default=db_pynuke.PyNuke.Utils().str2bool(options['compress_js_files']) ,comment=dict_default_helps['compress_js_files']), Field('use_janrain','boolean',label=T('Use janrain'),default=db_pynuke.PyNuke.Utils().str2bool(options['use_janrain']),comment=dict_default_helps['use_janrain']), Field('redirectafterlogin',db.pages,label=T('Redirect after login'),requires=IS_IN_SET(list_pags, zero='', multiple=False),default=options['redirectafterlogin'],comment=dict_default_helps['redirectafterlogin']), Field('redirectafterregister',db.pages,label=T('Redirect after register'),requires=IS_IN_SET(list_pags, zero='', multiple=False),default=options['redirectafterregister'],comment=dict_default_helps['redirectafterregister']), Field('redirectafterlogout',db.pages,label=T('Redirect after logout'),requires=IS_IN_SET(list_pags, zero='', multiple=False),default=options['redirectafterlogout'],comment=dict_default_helps['redirectafterlogout']), Field('cssclass_icon_edit','string',label=T('CSS Icon Edit'),default=options['cssclass_icon_edit'],comment=dict_default_helps['cssclass_icon_edit']), Field('cssclass_icon_return','string',label=T('CSS Icon Return'),default=options['cssclass_icon_return'],comment=dict_default_helps['cssclass_icon_return']), Field('cssclass_icon_remove','string',label=T('CSS Icon Remove'),default=options['cssclass_icon_remove'],comment=dict_default_helps['cssclass_icon_remove']), Field('cssclass_button_small','string',label=T('CSS Button small'),default=options['cssclass_button_small'],comment=dict_default_helps['cssclass_button_small']), Field('cssclass_button_extrasmall','string',label=T('CSS Button extrasmall'),default=options['cssclass_button_extrasmall'],comment=dict_default_helps['cssclass_button_extrasmall']), Field('cssclass_button_warning','string',label=T('CSS Button warning'),default=options['cssclass_button_warning'],comment=dict_default_helps['cssclass_button_warning']), Field('cssclass_button_danger','string',label=T('CSS Button danger'),default=options['cssclass_button_danger'],comment=dict_default_helps['cssclass_button_danger']), #por cada campo boolean (checkbox) agregar abajo su equivalente oculto con el valor 'F' #Esto es por que los checkboxes si no están seleccionados no se envían. Al poner el campo oculto #con el mismo nombre, cogerá este si el checkbox no está seleccionado. #http://stackoverflow.com/questions/476426/submit-an-html-form-with-empty-checkboxes hidden=dict(migrate='False', mail_settings_TLS='False', mail_settings_SSL='False', mail_settings_logging='False', reset_password_requires_verification='False', force_SSL='False', auth_require_recaptcha='False', use_janrain='False', use_mail_as_username='******', message_onregister='False', message_onvalidation='False', compress_css_files='False', compress_js_files='False', auth_register_require_recaptcha='False', auth_retrieve_username_require_recaptcha='False', auth_retrieve_password_require_recaptcha='False' ) ) return result