#summary List of views helper parameters and their role in the system.
#labels Importance-Useful,Contents-Draft

= Parameters =

Parameters are usually system-wide and they contain information for handling redirects, templates, sidebar entries, url patterns, dynamic fields & forms, and more in views. Parameters related methods are defined in *soc.views.helper.params*:

  * *constructParams(params)* receives a dictionary type argument with predefined parameters. _constructParams_ defines the default values (_newParams_) for all or most of the parameters and then it merges them with _params_. If defined, values in _params_ are going to override any values in _newParameters_. Some default values are shown below, for a complete list see this method.
  * *getDynaFields(fields)* Retrieves the fields for the Dynaform class
  * *getEditForm(params, base_form)* Retrieves the form used on the edit page
  * *getAdminForm(base_form)* 
  * *getKeyFieldsPattern(params)* Retrieves the pattern for the keyfields
  * *getPattern(params)*
  * *getScopePattern(params)*


== Redirects ==

  * *edit_redirect* defines the url pattern for redirection to the edit page. It is used on public pages, for example document's public page for generating the "Edit this document" link.
  * *missing_redirect* defines the url pattern for redirection to the page that should be displayed if the entity is missing.
  * *delete_redirect* defines the url pattern for redirection after deleting an entity.
  * *cancel_redirect* defines the URL when the cancel button is pressed on the edit page
  * *public_redirect*  defines the URL for redirecting to the entities Public page
  
== Url patterns ==

  * *link_id_arg_pattern*
  * *link_id_pattern_core*
  * *scope_path_pattern*
  * *sans_link_id_pattern*
  * *no_edit* if defined the default edit url pattern will not be included in _django_patterns_defaults_
  * *no_delete* if defined the default delete url pattern will not be included in _django_patterns_defaults_
  * *no_create_raw* if defined the URL pattern for creation without any keyfields is not included
  * *no_list_raw* if defined the URL pattern for the list page without keyfields is not included
  * *no_show* if defined the default public page url pattern will not be included in _django_patterns_defaults_
  * *no_admin* if defined the default admin url pattern will not be included in _django_patterns_defaults_
  * *sans_link_id_create* 
  * *sans_link_id_list*
  * *sans_link_id_public_list*
  * *django_patterns* if defined they are going to be the only url patterns used for a specific view.
  * *extra_django_patterns* this is where you should define any additional django patterns to be used with _django_patterns_default_. They are omited if _django_patterns_ is defined.
  * *django_patterns_default* are the default django url patterns and they will be used if _django_patterns_ isn't defined. They are dynamicaly constructed in _constructParams_.
  * *no_create_with_scope* The URL pattern for the create page with a given scope is not included
  * *no_create_with_key_fields* The URL pattern for the create page with all the key fields is no included
  * *key_fields_pattern* pattern for the keyfields of an entity


== Sidebar ==

Sidebar entries are defined as a three-element tuple (url, text, access_type ?). Sidebar related methods are in *soc.views.helper.sidebar*.

  * *sidebar* is used instead of _sidebar_default_ if defined.
  * *sidebar_grouping* is used to indicate to which sidebar group _sidebar_ or _sidebar_defaults_ entries belong to.
  * *sidebar_defaults* are the default sidebar entries.
  * *sidebar_additional* are additional sidebar entries.

== Templates and messages ==

Templates parameters are paths to django template files with soc/app/soc/temlates being the root.

  * *public_template* is used in the entity's public page (show)
  * *export_template* is used in the entity's export page
  * *edit_template* is used in the entity's edit page
  * *admin_template* is used in the entity's admin page
  * *list_template* is used in the entity's list page
  * *list_main* is the list layout django template for the list page ?
  * *error_public* is used for showing errors in the public page ?
  * *error_export* is used for showing errors in the export page.? It defaults to _error_public_.
  * *error_edit* is used for showing errors in the edit page. ? It defaults to _error_public_. 

== Strings ==

Some strings are used system-wide so they are defined in the parameters.

  * *save_msg* is used on the create page when saving or deleting an entity. It holds two values where the first one is used to indicate a succesfull entity creation, for example 'Document saved' and the other one is used to indicate that an entity couldn't be deleted for example 'Cannot delete document'.
  * *no_lists_msg*
  * *list_description* is the message used when showing the list page, for example 'List of documents'.
  * *name* is the name of the entity.
  * *name_short* is the short name of the entity, which defaults to _name_.
  * *name_plural* is the plural name of the entity, which defaults to _name_+'s'.
  * *module_package* is the module package name, which defaults to 'soc.views.models'
  * *module_name* is the module name. 
  * *url_name* is the module name used in the url. Defaults to _module_name_.
  * *document_prefix*
  * *list_msg* Default message used on the lists page
  
== Exporting ==

Data of some entities can be exported and these parameters are used to define that process.

  * *export_template* see Templates
  * *error_export* see Templates
  * *export_content_type* holds the mime content type of the exported data. If defined default url pattern for export will be added to _django_patterns_default_ (see Url patterns).
  * *export_extension* defines the export file extension. If not predefined it defaults to '.txt'.
  * *csv_fieldnames* if the export content type is text/csv this parameter is used to indicate the field names.

== Javascript modules ==

  * *js_uses_all*
  * *js_uses_edit*
  * *js_uses_list*
  * *js_uses_show*
  
== Needs to be sorted and defined ==

  * *rights* The rights instance this View uses for checking access
  * *logic* The Logic instance this View uses
  * *pickable*
  * *list_params* Defines the mapping of params entry to an entry that is used in generating lists
  * *submit_msg_param_name* Name of the parameter appended to URL when a form is submitted to show the saved message.
  * *edit_params*
  * *cannot_delete_params*
  * *dynabase*
  * *references*
  * *create_dynainclude*
  * *create_dynaexclude* Form fields to exclude from the create/edit form per default
  * *create_dynaproperties* Properties for the Create form
  * *edit_dynaproperties* Properties for the Edit form
  * *create_form* Form used on the default Create page for this View
  * *edit_form* Form used on the default Edit page for this View
  * *admin_form* Admin Form