Simple declarative web forms using FormEncode and WebHelpers
Project description
Simple declarative web forms using FormEncode and WebHelpers
==============================================
Status: **Early Development, Unstable, Unpublished**.
Python Version: **2.7** (please contribute to `FormEncode Project`_ in order to make it 3.x compatible).
Installation
--------------
.. code-block:: bash
pip install pyramid_webforms
Example
-------------
Consider the following pyramid project structure:
.. code-block:: plain
my_pyramid_app/
modules/
signin/
__init__.py
forms.py
validators.py
views.py
__init__.py
templates/
signin.mako
__init__.py
Let's define a sign-in form, its fields, and validators.
.. code-block:: python
# my_pyramid_app/modules/signin/forms.py
from pyramid_webforms import Form
from my_pyramid_app.i18n import _
from . import validators
login_or_email = {
'type': 'text',
'title': _('Login or Email'),
'tip': _('Please enter your login or email that was used during your registration.'),
'size': 30,
'maxlength': 50,
'validator': validators.UserLoginOrEmail
}
password = {
'type': 'password',
'title': _('Password'),
'tip': _('A password can contain any character of any alphabet (minimum is 1, maximum is 64 characters). '
'For reliability we recommend using non-trivial and long passwords. Note that the case of '
'the letters matters.'),
'size': 30,
'maxlength': 64,
'validator': validators.UserPassword,
'value': '',
}
remember_me = {
'type': 'checkbox',
'title': _('Remember me'),
'tip': _('Set this checkbox if you want your current browser to keep '
'your session for further visits.'),
'selected': False,
'validator': validators.RememberUserSession
}
class SignInForm(Form):
# form attributes and metadata
_id_ = 'signin-form'
_submit_text_ = _('Sign in')
_alternate_url_ = {'name': 'support.account_access'}
_alternate_text_ = _("I cannot access my account")
_fieldsets_ = [
[['login_email', 'password', 'remember_me']]
]
# form fields
login_email = login_or_email
password = password
remember_me = remember_me
.. code-block:: python
# my_pyramid_app/modules/signin/validators.py
import re
import formencode
# logins are 3-16 characters long
USERLOGINS = re.compile('[A-Za-z0-9][-A-Za-z0-9]{1,14}[A-Za-z0-9]', re.IGNORECASE)
RememberUserSession = formencode.validators.Bool
class UserLogin(formencode.validators.Regex):
not_empty = True
strip = True
regex = USERLOGINS
class UserEmail(formencode.validators.Email):
not_empty = True
strip = True
max = 50
def _to_python(self, email, state):
email = super(UserEmail, self)._to_python(email, state)
return email.lower()
class UserLoginOrEmail(UserLogin):
def _to_python(self, value, state):
if '@' in value:
validator = UserEmail
else:
validator = UserLogin
value = validator.to_python(value, state)
return value
def validate_python(self, value, state):
pass
class UserPassword(formencode.validators.UnicodeString):
not_empty = True
max = 64
Now we can use our form in pyramid view callables.
.. code-block:: python
# my_pyramid_app/modules/signin/views.py
from pyramid.view import view_config
from .forms import SignInForm
class SignInView(object):
@view_config(route_name='session.signin', renderer='templates/signin.mako')
def signin_form(self):
request = self.request
if request.POST:
try:
form = SignInForm.validate(request)
except SignInForm.Invalid as error:
# redirect or error handling
pass
else:
# sign in user using form data
pass
return {'signin_form': forms.SignInForm()}
.. code-block:: mako
## my_pyramid_app/templates/signin.mako
${signin_form(request)}
Here are the key conceptual points:
- form fields are defined with plain dictionaries;
- the fields can be reused by any other module;
- each field record contains an assigned FormEncode-based validator;
- a form is defined with the simple declarative interface.
Configuration options
-----------------------
+---------------------------------------+------------+----------------------------------------------------------+
| Key | Type | Default |
+=======================================+============+==========================================================+
| pyramid_webforms.submit_tpl | str | pyramid_webforms:templates/submit_alternate.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.submit_alternate_tpl | str | pyramid_webforms:templates/submit_alternate.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.form_tpl | str | pyramid_webforms:templates/form.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.fieldset_tpl | str | pyramid_webforms:templates/fieldset.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.field_tpl | str | pyramid_webforms:templates/field.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.tooltip_tpl | str | pyramid_webforms:templates/tooltip.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.form_error_tpl | str | pyramid_webforms:templates/form_error.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.field_error_tpl | str | pyramid_webforms:templates/field_error.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
See also
============
- `FormEncode Project`_
- `WebHelpers Project`_
.. _FormEncode Project: https://github.com/formencode/formencode
.. _WebHelpers Project: http://sluggo.scrapping.cc/python/WebHelpers/index.html
==============================================
Status: **Early Development, Unstable, Unpublished**.
Python Version: **2.7** (please contribute to `FormEncode Project`_ in order to make it 3.x compatible).
Installation
--------------
.. code-block:: bash
pip install pyramid_webforms
Example
-------------
Consider the following pyramid project structure:
.. code-block:: plain
my_pyramid_app/
modules/
signin/
__init__.py
forms.py
validators.py
views.py
__init__.py
templates/
signin.mako
__init__.py
Let's define a sign-in form, its fields, and validators.
.. code-block:: python
# my_pyramid_app/modules/signin/forms.py
from pyramid_webforms import Form
from my_pyramid_app.i18n import _
from . import validators
login_or_email = {
'type': 'text',
'title': _('Login or Email'),
'tip': _('Please enter your login or email that was used during your registration.'),
'size': 30,
'maxlength': 50,
'validator': validators.UserLoginOrEmail
}
password = {
'type': 'password',
'title': _('Password'),
'tip': _('A password can contain any character of any alphabet (minimum is 1, maximum is 64 characters). '
'For reliability we recommend using non-trivial and long passwords. Note that the case of '
'the letters matters.'),
'size': 30,
'maxlength': 64,
'validator': validators.UserPassword,
'value': '',
}
remember_me = {
'type': 'checkbox',
'title': _('Remember me'),
'tip': _('Set this checkbox if you want your current browser to keep '
'your session for further visits.'),
'selected': False,
'validator': validators.RememberUserSession
}
class SignInForm(Form):
# form attributes and metadata
_id_ = 'signin-form'
_submit_text_ = _('Sign in')
_alternate_url_ = {'name': 'support.account_access'}
_alternate_text_ = _("I cannot access my account")
_fieldsets_ = [
[['login_email', 'password', 'remember_me']]
]
# form fields
login_email = login_or_email
password = password
remember_me = remember_me
.. code-block:: python
# my_pyramid_app/modules/signin/validators.py
import re
import formencode
# logins are 3-16 characters long
USERLOGINS = re.compile('[A-Za-z0-9][-A-Za-z0-9]{1,14}[A-Za-z0-9]', re.IGNORECASE)
RememberUserSession = formencode.validators.Bool
class UserLogin(formencode.validators.Regex):
not_empty = True
strip = True
regex = USERLOGINS
class UserEmail(formencode.validators.Email):
not_empty = True
strip = True
max = 50
def _to_python(self, email, state):
email = super(UserEmail, self)._to_python(email, state)
return email.lower()
class UserLoginOrEmail(UserLogin):
def _to_python(self, value, state):
if '@' in value:
validator = UserEmail
else:
validator = UserLogin
value = validator.to_python(value, state)
return value
def validate_python(self, value, state):
pass
class UserPassword(formencode.validators.UnicodeString):
not_empty = True
max = 64
Now we can use our form in pyramid view callables.
.. code-block:: python
# my_pyramid_app/modules/signin/views.py
from pyramid.view import view_config
from .forms import SignInForm
class SignInView(object):
@view_config(route_name='session.signin', renderer='templates/signin.mako')
def signin_form(self):
request = self.request
if request.POST:
try:
form = SignInForm.validate(request)
except SignInForm.Invalid as error:
# redirect or error handling
pass
else:
# sign in user using form data
pass
return {'signin_form': forms.SignInForm()}
.. code-block:: mako
## my_pyramid_app/templates/signin.mako
${signin_form(request)}
Here are the key conceptual points:
- form fields are defined with plain dictionaries;
- the fields can be reused by any other module;
- each field record contains an assigned FormEncode-based validator;
- a form is defined with the simple declarative interface.
Configuration options
-----------------------
+---------------------------------------+------------+----------------------------------------------------------+
| Key | Type | Default |
+=======================================+============+==========================================================+
| pyramid_webforms.submit_tpl | str | pyramid_webforms:templates/submit_alternate.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.submit_alternate_tpl | str | pyramid_webforms:templates/submit_alternate.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.form_tpl | str | pyramid_webforms:templates/form.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.fieldset_tpl | str | pyramid_webforms:templates/fieldset.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.field_tpl | str | pyramid_webforms:templates/field.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.tooltip_tpl | str | pyramid_webforms:templates/tooltip.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.form_error_tpl | str | pyramid_webforms:templates/form_error.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
| pyramid_webforms.field_error_tpl | str | pyramid_webforms:templates/field_error.p_wf_mako |
+---------------------------------------+------------+----------------------------------------------------------+
See also
============
- `FormEncode Project`_
- `WebHelpers Project`_
.. _FormEncode Project: https://github.com/formencode/formencode
.. _WebHelpers Project: http://sluggo.scrapping.cc/python/WebHelpers/index.html
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pyramid_webforms-0.0.2.tar.gz
(13.6 kB
view details)
Built Distribution
pyramid_webforms-0.0.2-py2.7.egg
(19.9 kB
view details)
File details
Details for the file pyramid_webforms-0.0.2.tar.gz
.
File metadata
- Download URL: pyramid_webforms-0.0.2.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 21fd81ae404405e970194fdb8e6fae6277ab7caf8a24b231df6318f379962130 |
|
MD5 | 2b087a9b26b9e808e94bf55df37c9723 |
|
BLAKE2b-256 | eb1f77999192a5bdd261b09692c28c96d686ba9a599c284816819aee0b5d2f1c |
File details
Details for the file pyramid_webforms-0.0.2-py2.7.egg
.
File metadata
- Download URL: pyramid_webforms-0.0.2-py2.7.egg
- Upload date:
- Size: 19.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 78d911842700f54ae4b13f6e611042781e63d6f6410ed9bc616f5fb711a49e42 |
|
MD5 | 459d0e56f7f7425c331a0737978094a5 |
|
BLAKE2b-256 | 1c31b068b6fb1a06f86ac4e0ae493648190e08d13781f80489184e92b5d0fb04 |