You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.8 KiB
138 lines
3.8 KiB
import colander |
|
import deform |
|
|
|
from ordr2.models import Role |
|
|
|
from . import CSRFSchema |
|
from .helpers import ( |
|
deferred_unique_email_validator, |
|
deferred_unique_username_validator, |
|
deferred_password_validator |
|
) |
|
|
|
|
|
ROLES = [(role.name, role.value.capitalize()) for role in Role] |
|
|
|
# schema for user registration |
|
|
|
class RegistrationSchema(CSRFSchema): |
|
''' new user registration ''' |
|
|
|
user_name = colander.SchemaNode( |
|
colander.String(), |
|
widget=deform.widget.TextInputWidget( |
|
template='textinput_disabled.pt' |
|
), |
|
description='automagically generated for you', |
|
validator = deferred_unique_username_validator, |
|
) |
|
first_name = colander.SchemaNode( |
|
colander.String() |
|
) |
|
last_name = colander.SchemaNode( |
|
colander.String() |
|
) |
|
email = colander.SchemaNode( |
|
colander.String(), |
|
validator=deferred_unique_email_validator |
|
) |
|
password = colander.SchemaNode( |
|
colander.String(), |
|
widget=deform.widget.CheckedPasswordWidget() |
|
) |
|
|
|
@classmethod |
|
def as_form(cls, request, **override): |
|
settings = { |
|
'buttons': ('Create Account', 'Cancel'), |
|
'css_class': 'form-horizontal registration' |
|
} |
|
settings.update(override) |
|
return super().as_form(request, **settings) |
|
|
|
|
|
# schema for user settings |
|
|
|
class UserSchema(CSRFSchema): |
|
''' user settings schema ''' |
|
|
|
user_name = colander.SchemaNode( |
|
colander.String(), |
|
widget=deform.widget.TextInputWidget( |
|
template='textinput_disabled.pt' |
|
), |
|
) |
|
first_name = colander.SchemaNode( |
|
colander.String() |
|
) |
|
last_name = colander.SchemaNode( |
|
colander.String() |
|
) |
|
email = colander.SchemaNode( |
|
colander.String(), |
|
validator=deferred_unique_email_validator |
|
) |
|
role = colander.SchemaNode( |
|
colander.String(), |
|
widget=deform.widget.SelectWidget(values=ROLES) |
|
) |
|
|
|
@classmethod |
|
def as_form(cls, request, **override): |
|
settings = { |
|
'buttons': ('Save changes', 'Cancel'), |
|
'css_class': 'form-horizontal', |
|
} |
|
settings.update(override) |
|
return super().as_form(request, **settings) |
|
|
|
|
|
class ChangePasswordSchema(CSRFSchema): |
|
''' change password of an account ''' |
|
|
|
new_password = colander.SchemaNode( |
|
colander.String(), |
|
widget=deform.widget.CheckedPasswordWidget(), |
|
missing='' |
|
) |
|
|
|
@classmethod |
|
def as_form(cls, request, **override): |
|
settings = { |
|
'buttons': ('Change Password', 'Cancel'), |
|
'css_class': 'form-horizontal' |
|
} |
|
settings.update(override) |
|
return super().as_form(request, **settings) |
|
|
|
|
|
class ConfirmSettingsSchema(CSRFSchema): |
|
''' confirm changes with current password ''' |
|
|
|
current_password = colander.SchemaNode( |
|
colander.String(), |
|
widget=deform.widget.PasswordWidget(), |
|
description='Enter your current password to confirm changes', |
|
validator=deferred_password_validator |
|
) |
|
|
|
|
|
class SettingsSchema(CSRFSchema): |
|
general = UserSchema() |
|
change_password = ChangePasswordSchema() |
|
confirm_changes = ConfirmSettingsSchema() |
|
|
|
@classmethod |
|
def as_form(cls, request, **override): |
|
settings = { |
|
'buttons': ('Save Settings', 'Cancel'), |
|
'css_class': 'form-horizontal user-settings' |
|
} |
|
settings.update(override) |
|
form = super().as_form(request, **settings) |
|
# disable the role field for user settings |
|
form['general']['role'].widget.template='select_disabled.pt' |
|
form['general']['role'].widget=deform.widget.TextInputWidget( |
|
template='textinput_disabled.pt' |
|
) |
|
return form
|
|
|