/kai/model/forms.py

https://bitbucket.org/bbangert/kai/ · Python · 170 lines · 139 code · 31 blank · 0 comment · 0 complexity · 2f1ec7ef4eca003457ee61c27bbdba0c MD5 · raw file

  1. from formencode import All, Schema
  2. from formencode.validators import FieldsMatch, UnicodeString, OneOf, Email
  3. from tw2 import forms
  4. import pytz
  5. from kai.lib.highlight import langdict
  6. from kai.model.validators import ExistingSnippetTitle, ExistingEmail, UniqueDisplayname, UniqueEmail, ValidLogin, ValidPassword
  7. class FilteringSchema(Schema):
  8. filter_extra_fields = False
  9. allow_extra_fields = True
  10. ignore_key_missing = False
  11. class AutoComplete(forms.TextField):
  12. template = 'mako:kai.model.widgets.autocomplete'
  13. class SecureToken(forms.HiddenField):
  14. template = 'mako:kai.model.widgets.secure'
  15. class BotsAreLame(forms.HiddenField):
  16. template = 'mako:kai.model.widgets.notabot'
  17. class CommentForm(forms.TableForm):
  18. comment = forms.TextArea(
  19. id = 'comment_form_comment',
  20. label='Comment',
  21. validator = UnicodeString(not_empty=True))
  22. preview = forms.Button(
  23. id='preview',
  24. label='',
  25. value='Preview')
  26. comment_form = CommentForm()
  27. class SnippetForm(forms.TableForm):
  28. title = forms.TextField(
  29. validator = ExistingSnippetTitle(not_empty=True))
  30. description = forms.TextArea(
  31. help_text = "ONE paragraph summarizing the snippet. NO FORMATTING IS APPLIED",
  32. validator = UnicodeString())
  33. content = forms.TextArea(
  34. id = 'snippet_form_content',
  35. name = 'content',
  36. help_text = "The full content of the snippet. Restructured Text formatting is used.",
  37. validator = UnicodeString(not_empty=True))
  38. tags = AutoComplete(
  39. validator = UnicodeString())
  40. preview = forms.Button(
  41. id='preview',
  42. label='',
  43. value='Preview')
  44. snippet_form = SnippetForm()
  45. class PastebinForm(forms.TableForm):
  46. title = forms.TextField(
  47. validator = UnicodeString(not_empty=True))
  48. language = forms.SingleSelectField(
  49. options = sorted(langdict.items(), cmp=lambda x,y: cmp(x[1], y[1])),
  50. validator = OneOf(langdict.keys(), not_empty=True))
  51. code = forms.TextArea(
  52. validator = UnicodeString(not_empty=True))
  53. tags = AutoComplete(
  54. validator = UnicodeString(not_empty=False))
  55. notabot = BotsAreLame(
  56. validator = UnicodeString(not_empty=True),
  57. value = 'most_likely')
  58. pastebin_form = PastebinForm()
  59. class NewArticleForm(forms.TableForm):
  60. css_class = 'new_article'
  61. title = forms.TextField(
  62. css_class = 'textfield',
  63. validator = UnicodeString(not_empty=True))
  64. summary = forms.TextField(
  65. css_class = 'textfield',
  66. validator = UnicodeString())
  67. body = forms.TextArea(
  68. rows = 15,
  69. validator = UnicodeString(not_empty=True))
  70. publish_date = forms.CalendarDateTimePicker()
  71. preview = forms.Button(id='Preview', label='', value='Preview')
  72. new_article_form = NewArticleForm()
  73. class ChangePasswordForm(forms.TableForm):
  74. password = forms.PasswordField(
  75. validator = ValidPassword(not_empty=True))
  76. confirm_password = forms.PasswordField(
  77. validator = ValidPassword(not_empty=True))
  78. authentication_token = SecureToken()
  79. class child(forms.TableLayout):
  80. validator = FilteringSchema(
  81. chained_validators=[FieldsMatch('password', 'confirm_password')],
  82. msgs=dict(childerror=''))
  83. change_password_form = ChangePasswordForm()
  84. class ForgotPasswordForm(forms.TableForm):
  85. email_address = forms.TextField(
  86. label_text = 'Email',
  87. validator = ExistingEmail(not_empty=True))
  88. authentication_token = SecureToken()
  89. forgot_password_form = ForgotPasswordForm()
  90. class LoginForm(forms.TableForm):
  91. email_address = forms.TextField(
  92. validator = Email(not_empty=True))
  93. password = forms.PasswordField(
  94. validator = UnicodeString(not_empty=True))
  95. authentication_token = SecureToken()
  96. class child(forms.TableLayout):
  97. validator = FilteringSchema(
  98. chained_validators=[ValidLogin(email='email_address', password='password')],
  99. msgs=dict(childerror=''))
  100. submit = forms.SubmitButton(css_class='submit', value='Login')
  101. login_form = LoginForm()
  102. class OpenIDLogin(forms.TableForm):
  103. openid_identifier = forms.TextField(
  104. label_text="OpenID Identifier",
  105. validator = UnicodeString(not_empty=True))
  106. authentication_token = SecureToken()
  107. submit = forms.SubmitButton(css_class='submit', value='Login')
  108. openid_login_form = OpenIDLogin()
  109. class OpenIDRegistrationForm(forms.TableForm):
  110. displayname = forms.TextField(
  111. label_text = "Display Name",
  112. help_text = "Name that will appear when posting/commenting",
  113. validator = All(UnicodeString(not_empty=True), UniqueDisplayname()))
  114. email_address = forms.TextField(
  115. validator = All(Email(not_empty=True), UniqueEmail()))
  116. timezone = forms.SingleSelectField(
  117. options = pytz.common_timezones,
  118. validator = OneOf(pytz.common_timezones, not_empty=True))
  119. openid_registration_form = OpenIDRegistrationForm()
  120. class RegistrationForm(forms.TableForm):
  121. displayname = forms.TextField(
  122. label_text = "Display Name",
  123. help_text = "Name that will appear when posting/commenting",
  124. validator = All(UnicodeString(not_empty=True), UniqueDisplayname()))
  125. email_address = forms.TextField(
  126. validator = All(Email(not_empty=True), UniqueEmail()))
  127. timezone = forms.SingleSelectField(
  128. options = pytz.common_timezones,
  129. validator = OneOf(pytz.common_timezones, not_empty=True))
  130. password = forms.PasswordField(
  131. validator = ValidPassword(not_empty=True))
  132. confirm_password = forms.PasswordField(
  133. validator = ValidPassword(not_empty=True))
  134. authentication_token = SecureToken()
  135. class child(forms.TableLayout):
  136. validator = FilteringSchema(
  137. chained_validators=[FieldsMatch('password', 'confirm_password')],
  138. msgs=dict(childerror=''))
  139. registration_form = RegistrationForm()