You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by ke...@apache.org on 2020/06/03 16:05:26 UTC
[allura] 04/12: [#8361] use our own UnicodeString validator to work
around problem, make sure everywhere uses it
This is an automated email from the ASF dual-hosted git repository.
kentontaylor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/allura.git
commit c0fa06111c27479566e6338bedae299f488ffa9b
Author: Dave Brondsema <da...@brondsema.net>
AuthorDate: Mon May 11 18:11:59 2020 -0400
[#8361] use our own UnicodeString validator to work around problem, make sure everywhere uses it
---
Allura/allura/controllers/site_admin.py | 8 ++--
Allura/allura/ext/admin/widgets.py | 13 +++---
Allura/allura/lib/validators.py | 22 +++++++--
Allura/allura/lib/widgets/discuss.py | 9 ++--
Allura/allura/lib/widgets/form_fields.py | 15 +++---
Allura/allura/lib/widgets/forms.py | 54 +++++++++++-----------
Allura/allura/lib/widgets/user_profile.py | 7 +--
Allura/allura/webhooks.py | 7 +--
ForgeBlog/forgeblog/main.py | 7 +--
ForgeBlog/forgeblog/widgets.py | 3 +-
ForgeChat/forgechat/main.py | 3 +-
.../forgediscussion/controllers/root.py | 3 +-
ForgeDiscussion/forgediscussion/widgets/admin.py | 6 +--
ForgeImporters/forgeimporters/base.py | 4 +-
ForgeImporters/forgeimporters/github/code.py | 4 +-
ForgeImporters/forgeimporters/github/tracker.py | 4 +-
ForgeImporters/forgeimporters/github/wiki.py | 7 ++-
ForgeShortUrl/forgeshorturl/main.py | 3 +-
ForgeTracker/forgetracker/tracker_main.py | 19 ++++----
ForgeTracker/forgetracker/widgets/admin.py | 5 +-
ForgeTracker/forgetracker/widgets/bin_form.py | 9 ++--
ForgeTracker/forgetracker/widgets/ticket_form.py | 2 +-
ForgeWiki/forgewiki/wiki_main.py | 7 +--
requirements.in | 2 +-
24 files changed, 124 insertions(+), 99 deletions(-)
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 644c9c9..4fa7ffc 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -312,7 +312,7 @@ class SiteAdminController(object):
@without_trailing_slash
@expose('jinja:allura:templates/site_admin_search.html')
- @validate(validators=dict(q=validators.UnicodeString(if_empty=None),
+ @validate(validators=dict(q=v.UnicodeString(if_empty=None),
limit=validators.Int(if_invalid=None),
page=validators.Int(if_empty=0, if_invalid=0)))
def search_projects(self, q=None, f=None, page=0, limit=None, **kw):
@@ -327,7 +327,7 @@ class SiteAdminController(object):
@without_trailing_slash
@expose('jinja:allura:templates/site_admin_search.html')
- @validate(validators=dict(q=validators.UnicodeString(if_empty=None),
+ @validate(validators=dict(q=v.UnicodeString(if_empty=None),
limit=validators.Int(if_invalid=None),
page=validators.Int(if_empty=0, if_invalid=0)))
def search_users(self, q=None, f=None, page=0, limit=None, **kw):
@@ -344,8 +344,8 @@ class SiteAdminController(object):
class DeleteProjectsController(object):
delete_form_validators = dict(
- projects=validators.UnicodeString(if_empty=None),
- reason=validators.UnicodeString(if_empty=None),
+ projects=v.UnicodeString(if_empty=None),
+ reason=v.UnicodeString(if_empty=None),
disable_users=validators.StringBool(if_empty=False))
def remove_comments(self, lines):
diff --git a/Allura/allura/ext/admin/widgets.py b/Allura/allura/ext/admin/widgets.py
index 82b3962..0eedae6 100644
--- a/Allura/allura/ext/admin/widgets.py
+++ b/Allura/allura/ext/admin/widgets.py
@@ -159,7 +159,6 @@ class FeaturesField(ew.CompoundField):
yield ew.JSLink('allura/js/jquery-ui.min.js', location='body_top_js')
yield ew.CSSLink('allura/css/smoothness/jquery-ui.min.css', compress=False) # compress will also serve from a different location, breaking image refs
-
class MetadataAdmin(ff.AdminForm):
template = 'jinja:allura.ext.admin:templates/admin_widgets/metadata_admin.html'
defaults = dict(
@@ -170,15 +169,16 @@ class MetadataAdmin(ff.AdminForm):
name = ew.InputField(field_type='text',
label='Name',
validator=formencode.All(
- fev.UnicodeString(not_empty=True, max=40),
- V.MaxBytesValidator(max=40)),
+ V.UnicodeString(not_empty=True, max=40),
+ V.MaxBytesValidator(max=40),
+ ),
attrs={'maxlength': 40,
'title': "This is the publicly viewable name of the project, and will appear on project listings. It should be what you want to see as the project title in search listing.",
'class': 'tooltip',
})
summary = ew.InputField(field_type="text", label='Short Summary',
validator=formencode.All(
- fev.UnicodeString(max=70),
+ V.UnicodeString(max=70),
V.MaxBytesValidator(max=70)),
attrs={'maxlength': 70,
'title': 'Briefly state what your project is and what it does without repeating the project name. This summary appears in Google search results beneath the project name.',
@@ -186,8 +186,9 @@ class MetadataAdmin(ff.AdminForm):
})
short_description = ew.TextArea(label='Full Description',
validator=formencode.All(
- fev.UnicodeString(max=1000),
- V.MaxBytesValidator(max=1000)),
+ V.UnicodeString(max=1000),
+ V.MaxBytesValidator(max=1000),
+ ),
attrs={
'title': 'Describe the full functionality of your project using related keywords. The first sentence has the most impact on search. Provide unique content that calls out keywords and describes the merits of your project.',
'class': 'tooltip'
diff --git a/Allura/allura/lib/validators.py b/Allura/allura/lib/validators.py
index f84ec5a..2dee7fc 100644
--- a/Allura/allura/lib/validators.py
+++ b/Allura/allura/lib/validators.py
@@ -68,6 +68,22 @@ class NonHttpUrl(URL):
''', re.I | re.VERBOSE)
+class UnicodeString(fev.UnicodeString):
+ """
+ Override UnicodeString to fix bytes handling.
+ Specifically ran into problems with its 'tooLong' check is running on bytes incorrectly and getting wrong length
+
+ Fixed elsewhere like this too:
+ https://github.com/formencode/formencode/issues/2#issuecomment-378410047
+ https://github.com/sightmachine/formencode/commit/665c9d0141dacb2dc84fb7d20ad3f8c0a5fe5e2d
+ """
+ encoding = None
+
+
+# make UnicodeString fix above work through this String alias, just like formencode aliases String
+String = UnicodeString if str is str else fev.ByteString
+
+
class Ming(fev.FancyValidator):
def __init__(self, cls, **kw):
@@ -90,7 +106,7 @@ class Ming(fev.FancyValidator):
return value._id
-class UniqueOAuthApplicationName(fev.UnicodeString):
+class UniqueOAuthApplicationName(UnicodeString):
def _to_python(self, value, state):
from allura import model as M
@@ -127,7 +143,7 @@ class MaxBytesValidator(fev.FancyValidator):
return h.really_unicode(value or '')
-class MountPointValidator(fev.UnicodeString):
+class MountPointValidator(UnicodeString):
def __init__(self, app_class,
reserved_mount_points=('feed', 'index', 'icon', '_nav.json'), **kw):
@@ -320,7 +336,7 @@ class CreateTaskSchema(fe.Schema):
class CreateSiteNotificationSchema(fe.Schema):
active = fev.StringBool(if_missing=False)
impressions = fev.Int(not_empty=True)
- content = fev.UnicodeString(not_empty=True)
+ content = UnicodeString(not_empty=True)
user_role = fev.FancyValidator(not_empty=False, if_empty=None)
page_regex = fev.FancyValidator(not_empty=False, if_empty=None)
page_tool_type = fev.FancyValidator(not_empty=False, if_empty=None)
diff --git a/Allura/allura/lib/widgets/discuss.py b/Allura/allura/lib/widgets/discuss.py
index 25919cd..9338fbb 100644
--- a/Allura/allura/lib/widgets/discuss.py
+++ b/Allura/allura/lib/widgets/discuss.py
@@ -19,14 +19,11 @@ from __future__ import unicode_literals
from __future__ import absolute_import
from formencode import validators as fev
-import json
import ew as ew_core
import ew.jinja2_ew as ew
-from tg import app_globals as g
-from tg import config
from allura.lib import utils
-from allura.lib import validators as V
+from allura.lib import validators as v
from allura.lib.widgets import form_fields as ffw
from allura.lib.widgets import forms as ff
from allura import model as M
@@ -169,7 +166,7 @@ class EditPost(ff.ForgeForm):
ew.TextField(name='subject', attrs=dict(style="width:97%")))
else:
# We are being validated
- validator = fev.UnicodeString(not_empty=True, if_missing='')
+ validator = v.UnicodeString(not_empty=True, if_missing='')
fields.append(ew.TextField(name='subject', validator=validator))
fields.append(NullValidator(name=self.att_name))
return fields
@@ -217,7 +214,7 @@ class _ThreadsTable(ew.TableField):
template = 'jinja:allura:templates/widgets/threads_table.html'
class fields(ew_core.NameList):
- _id = ew.HiddenField(validator=V.Ming(M.Thread))
+ _id = ew.HiddenField(validator=v.Ming(M.Thread))
subscription = ew.Checkbox(suppress_label=True)
subject = ffw.DisplayOnlyField(label='Topic')
url = ffw.DisplayOnlyField()
diff --git a/Allura/allura/lib/widgets/form_fields.py b/Allura/allura/lib/widgets/form_fields.py
index e02d6b8..5ef2ed0 100644
--- a/Allura/allura/lib/widgets/form_fields.py
+++ b/Allura/allura/lib/widgets/form_fields.py
@@ -30,6 +30,9 @@ import ew.jinja2_ew as ew
import six
from six.moves import range
+from allura.lib import validators as v
+
+
log = logging.getLogger(__name__)
@@ -37,7 +40,7 @@ def onready(text):
return ew.JSScript('$(function () {%s});' % text)
-class LabelList(fev.UnicodeString):
+class LabelList(v.UnicodeString):
def __init__(self, *args, **kwargs):
kwargs.setdefault('if_empty', [])
@@ -268,7 +271,7 @@ class AutoResizeTextarea(ew.TextArea):
class MarkdownEdit(ew.TextArea):
template = 'jinja:allura:templates/widgets/markdown_edit.html'
- validator = fev.UnicodeString()
+ validator = v.UnicodeString()
defaults = dict(
ew.TextArea.defaults,
name=None,
@@ -332,9 +335,9 @@ class PageList(ew_core.Widget):
@property
def url_params(self, **kw):
url_params = dict()
- for k, v in six.iteritems(request.params):
+ for k, val in six.iteritems(request.params):
if k not in ['limit', 'count', 'page']:
- url_params[k] = v
+ url_params[k] = val
return url_params
@@ -350,9 +353,9 @@ class PageSize(ew_core.Widget):
@property
def url_params(self, **kw):
url_params = dict()
- for k, v in six.iteritems(request.params):
+ for k, val in six.iteritems(request.params):
if k not in ['limit', 'count', 'page']:
- url_params[k] = v
+ url_params[k] = val
return url_params
def resources(self):
diff --git a/Allura/allura/lib/widgets/forms.py b/Allura/allura/lib/widgets/forms.py
index ab0ef32..54082ce 100644
--- a/Allura/allura/lib/widgets/forms.py
+++ b/Allura/allura/lib/widgets/forms.py
@@ -151,14 +151,14 @@ class PasswordChangeBase(ForgeForm):
required=True,
autocomplete='new-password',
),
- validator=fev.UnicodeString(
+ validator=V.UnicodeString(
not_empty=True,
min=asint(tg.config.get('auth.min_password_len', 6)),
max=asint(tg.config.get('auth.max_password_len', 30)))),
ew.PasswordField(
name='pw2',
label='New Password (again)',
- validator=fev.UnicodeString(not_empty=True),
+ validator=V.UnicodeString(not_empty=True),
attrs=dict(
required=True,
autocomplete='new-password',
@@ -185,7 +185,7 @@ class PasswordChangeForm(PasswordChangeBase):
ew.PasswordField(
name='oldpw',
label='Old Password',
- validator=fev.UnicodeString(not_empty=True),
+ validator=V.UnicodeString(not_empty=True),
attrs=dict(
required=True,
autocomplete='current-password',
@@ -200,14 +200,14 @@ class PasswordChangeForm(PasswordChangeBase):
required=True,
autocomplete='new-password',
),
- validator=fev.UnicodeString(
+ validator=V.UnicodeString(
not_empty=True,
min=asint(tg.config.get('auth.min_password_len', 6)),
max=asint(tg.config.get('auth.max_password_len', 30)))),
ew.PasswordField(
name='pw2',
label='New Password (again)',
- validator=fev.UnicodeString(not_empty=True),
+ validator=V.UnicodeString(not_empty=True),
attrs=dict(
required=True,
autocomplete='new-password',
@@ -257,7 +257,7 @@ class PersonalDataForm(ForgeForm):
for v in ['Male', 'Female', 'Unknown', 'Other']],
validator=formencode.All(
V.OneOfValidator(['Male', 'Female', 'Unknown', 'Other']),
- fev.UnicodeString(not_empty=True))),
+ V.UnicodeString(not_empty=True))),
ew.SingleSelectField(
name='country',
label='Country of residence',
@@ -271,7 +271,7 @@ class PersonalDataForm(ForgeForm):
name='city',
label='City of residence',
attrs=dict(value=None),
- validator=fev.UnicodeString(not_empty=False)),
+ validator=V.UnicodeString(not_empty=False)),
ew.SingleSelectField(
name='timezone',
label='Timezone',
@@ -364,7 +364,7 @@ class AddTelNumberForm(ForgeForm):
newnumber = ew.TextField(
label='New telephone number',
attrs={'value': ''},
- validator=fev.UnicodeString(not_empty=True))
+ validator=V.UnicodeString(not_empty=True))
def display(self, **kw):
initial_value = kw.get('initial_value', '')
@@ -394,7 +394,7 @@ class SkypeAccountForm(ForgeForm):
skypeaccount = ew.TextField(
label='Skype account',
attrs={'value': ''},
- validator=fev.UnicodeString(not_empty=False))
+ validator=V.UnicodeString(not_empty=False))
def display(self, **kw):
initial_value = kw.get('initial_value', '')
@@ -450,13 +450,13 @@ class AddSocialNetworkForm(ForgeForm):
ew.SingleSelectField(
name='socialnetwork',
label='Social network',
- validator=fev.UnicodeString(not_empty=True),
+ validator=V.UnicodeString(not_empty=True),
options=[ew.Option(py_value=name, label=name)
for name in socialnetworks]),
ew.TextField(
name='accounturl',
label='Account url',
- validator=fev.UnicodeString(not_empty=True))
+ validator=V.UnicodeString(not_empty=True))
]
@@ -501,12 +501,12 @@ class AddInactivePeriodForm(ForgeForm):
label='Start date',
validator=formencode.All(
V.DateValidator(),
- fev.UnicodeString(not_empty=True)))
+ V.UnicodeString(not_empty=True)))
enddate = ew.TextField(
label='End date',
validator=formencode.All(
V.DateValidator(),
- fev.UnicodeString(not_empty=True)))
+ V.UnicodeString(not_empty=True)))
@ew_core.core.validator
def to_python(self, kw, state):
@@ -560,17 +560,17 @@ class AddTimeSlotForm(ForgeForm):
for wd in weekdays],
validator=formencode.All(
V.OneOfValidator(weekdays),
- fev.UnicodeString(not_empty=True)))
+ V.UnicodeString(not_empty=True)))
starttime = ew.TextField(
label='Start time',
validator=formencode.All(
V.TimeValidator(),
- fev.UnicodeString(not_empty=True)))
+ V.UnicodeString(not_empty=True)))
endtime = ew.TextField(
label='End time',
validator=formencode.All(
V.TimeValidator(),
- fev.UnicodeString(not_empty=True)))
+ V.UnicodeString(not_empty=True)))
@ew_core.core.validator
def to_python(self, kw, state):
@@ -667,10 +667,10 @@ class AddTroveCategoryForm(ForgeForm):
categoryname = ew.TextField(
label="Category name",
attrs={},
- validator=fev.UnicodeString(not_empty=True))
+ validator=V.UnicodeString(not_empty=True))
shortname = ew.TextField(
label="Short name",
- validator=fev.UnicodeString(),
+ validator=V.UnicodeString(),
attrs={'placeholder': 'optional; unique identifier'})
def display(self, **kw):
@@ -693,7 +693,7 @@ class AddUserSkillForm(ForgeForm):
selected_skill = ew.HiddenField(
attrs={'value': ''},
show_errors=False,
- validator=fev.UnicodeString(not_empty=True))
+ validator=V.UnicodeString(not_empty=True))
level = ew.SingleSelectField(
label="Level of knowledge",
options=[
@@ -702,10 +702,10 @@ class AddUserSkillForm(ForgeForm):
ew.Option(py_value="high", label="Advanced level")],
validator=formencode.All(
V.OneOfValidator(['low', 'medium', 'high']),
- fev.UnicodeString(not_empty=True)))
+ V.UnicodeString(not_empty=True)))
comment = ew.TextArea(
label="Additional comments",
- validator=fev.UnicodeString(not_empty=False),
+ validator=V.UnicodeString(not_empty=False),
attrs={'rows': 5, 'cols': 30})
def display(self, **kw):
@@ -732,7 +732,7 @@ class SelectSubCategoryForm(ForgeForm):
]
self.fields['selected_category'].validator = formencode.All(
V.OneOfValidator(categories),
- fev.UnicodeString(not_empty=True))
+ V.UnicodeString(not_empty=True))
return super(ForgeForm, self).display(**kw)
@@ -790,7 +790,7 @@ class RegistrationForm(ForgeForm):
ew.TextField(
name='display_name',
label='Displayed Name',
- validator=fev.UnicodeString(not_empty=True)),
+ validator=V.UnicodeString(not_empty=True)),
username,
]
if asbool(config.get('auth.require_email_addr', False)):
@@ -803,14 +803,14 @@ class RegistrationForm(ForgeForm):
name='pw',
label='New Password',
attrs=dict(minlength=asint(tg.config.get('auth.min_password_len', 6)), maxlength=asint(tg.config.get('auth.max_password_len', 30))),
- validator=fev.UnicodeString(
+ validator=V.UnicodeString(
not_empty=True,
min=asint(tg.config.get('auth.min_password_len', 6)),
max=asint(tg.config.get('auth.max_password_len', 30)))),
ew.PasswordField(
name='pw2',
label='New Password (again)',
- validator=fev.UnicodeString(not_empty=True)),
+ validator=V.UnicodeString(not_empty=True)),
]
return fields
@@ -995,7 +995,7 @@ class NeighborhoodAddProjectForm(ForgeForm):
ew.InputField(name='project_name', label='Project Name',
field_type='text',
validator=formencode.All(
- fev.UnicodeString(not_empty=True, max=40),
+ V.UnicodeString(not_empty=True, max=40),
V.MaxBytesValidator(max=40)),
),
ew.InputField(name='project_unixname',
@@ -1175,7 +1175,7 @@ class AwardGrantForm(ForgeForm):
ew.TextArea(
name='comment',
label='Comment',
- validator=fev.UnicodeString(not_empty=False),
+ validator=V.UnicodeString(not_empty=False),
attrs={'rows': 5, 'cols': 30}),
]
diff --git a/Allura/allura/lib/widgets/user_profile.py b/Allura/allura/lib/widgets/user_profile.py
index fd2e17e..587bf45 100644
--- a/Allura/allura/lib/widgets/user_profile.py
+++ b/Allura/allura/lib/widgets/user_profile.py
@@ -25,11 +25,12 @@ import ew.jinja2_ew as ew
from jinja2 import Markup
from paste.deploy.converters import asbool
import tg
-from formencode import validators as fev
from tg import app_globals as g
from tg import request
from tg import tmpl_context as c
+
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.plugin import AuthenticationProvider
from .forms import ForgeForm
@@ -42,7 +43,7 @@ class SendMessageForm(ForgeForm):
class fields(ew_core.NameList):
subject = ew.TextField(
- validator=fev.UnicodeString(
+ validator=v.UnicodeString(
not_empty=True,
messages={'empty': "You must provide a Subject"}),
attrs=dict(
@@ -52,7 +53,7 @@ class SendMessageForm(ForgeForm):
label='Subject')
message = ew.TextArea(
- validator=fev.UnicodeString(
+ validator=v.UnicodeString(
not_empty=True,
messages={'empty': "You must provide a Message"}),
attrs=dict(
diff --git a/Allura/allura/webhooks.py b/Allura/allura/webhooks.py
index a33a71b..c41d8c0 100644
--- a/Allura/allura/webhooks.py
+++ b/Allura/allura/webhooks.py
@@ -40,6 +40,7 @@ from paste.deploy.converters import asint, aslist
from allura.app import AdminControllerMixin
from allura.controllers import BaseController
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.decorators import require_post, task
from allura.lib.utils import DateJSONEncoder
from allura import model as M
@@ -74,7 +75,7 @@ class WebhookValidator(fev.FancyValidator):
class WebhookCreateForm(schema.Schema):
url = fev.URL(not_empty=True)
- secret = fev.UnicodeString()
+ secret = v.UnicodeString()
class WebhookEditForm(WebhookCreateForm):
@@ -221,8 +222,8 @@ class WebhookRestController(BaseController):
error = getattr(e, 'error_dict', None)
if error:
_error = {}
- for k, v in six.iteritems(error):
- _error[k] = six.text_type(v)
+ for k, val in six.iteritems(error):
+ _error[k] = six.text_type(val)
return _error
error = getattr(e, 'msg', None)
if not error:
diff --git a/ForgeBlog/forgeblog/main.py b/ForgeBlog/forgeblog/main.py
index 04963f5..344a4b1 100644
--- a/ForgeBlog/forgeblog/main.py
+++ b/ForgeBlog/forgeblog/main.py
@@ -39,6 +39,7 @@ from ming.orm import session
from allura.app import Application, SitemapEntry, ConfigOption
from allura.app import DefaultAdminController
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.utils import JSONForExport
from allura.tasks import notification_tasks
from allura.lib.search import search_app
@@ -271,7 +272,7 @@ class RootController(BaseController, FeedController):
@with_trailing_slash
@expose('jinja:forgeblog:templates/blog/search.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
history=validators.StringBool(if_empty=False),
search_comments=validators.StringBool(if_empty=False),
project=validators.StringBool(if_empty=False)))
@@ -434,8 +435,8 @@ class PostController(BaseController, FeedController):
old_text = self.post.text
if attachment is not None:
self.post.add_multiple_attachments(attachment)
- for k, v in six.iteritems(kw):
- setattr(self.post, k, v)
+ for k, val in six.iteritems(kw):
+ setattr(self.post, k, val)
self.post.commit()
notification_tasks.send_usermentions_notification.post(self.post.index_id(), kw['text'], old_text)
redirect('.')
diff --git a/ForgeBlog/forgeblog/widgets.py b/ForgeBlog/forgeblog/widgets.py
index 3d52bc5..b08df34 100644
--- a/ForgeBlog/forgeblog/widgets.py
+++ b/ForgeBlog/forgeblog/widgets.py
@@ -25,6 +25,7 @@ from formencode import validators as fev
from allura.lib.widgets import form_fields as ffw
from allura.lib.widgets import forms
from allura import model as M
+from allura.lib import validators as v
class BlogPager(ffw.PageList):
@@ -39,7 +40,7 @@ class BlogPostForm(forms.ForgeForm):
def fields(self):
return ew_core.NameList([
ew.TextField(name='title',
- validator=fev.UnicodeString(not_empty=True,
+ validator=v.UnicodeString(not_empty=True,
messages={'empty': "You must provide a Title"}),
attrs=dict(placeholder='Enter your title here',
title='Enter your title here',
diff --git a/ForgeChat/forgechat/main.py b/ForgeChat/forgechat/main.py
index 8742489..e3b4765 100644
--- a/ForgeChat/forgechat/main.py
+++ b/ForgeChat/forgechat/main.py
@@ -33,6 +33,7 @@ from ming.utils import LazyProperty
# Pyforge-specific imports
from allura.app import Application, ConfigOption, SitemapEntry, DefaultAdminController
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.search import search_app
from allura.lib.decorators import require_post
from allura.lib.security import require_access
@@ -150,7 +151,7 @@ class RootController(BaseController):
@with_trailing_slash
@expose('jinja:forgechat:templates/chat/search.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
project=validators.StringBool(if_empty=False)))
def search(self, q=None, project=None, limit=None, page=0, **kw):
c.search_results = SearchResults()
diff --git a/ForgeDiscussion/forgediscussion/controllers/root.py b/ForgeDiscussion/forgediscussion/controllers/root.py
index caa7ce7..0356f30 100644
--- a/ForgeDiscussion/forgediscussion/controllers/root.py
+++ b/ForgeDiscussion/forgediscussion/controllers/root.py
@@ -36,6 +36,7 @@ import pymongo
from allura.lib.security import require_access, has_access, require_authenticated
from allura.lib.search import search_app
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.utils import AntiSpam
from allura.lib.decorators import require_post, memorable_forget
from allura.controllers import BaseController, DispatchIndex
@@ -151,7 +152,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
@with_trailing_slash
@expose('jinja:forgediscussion:templates/discussionforums/search.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
history=validators.StringBool(if_empty=False),
project=validators.StringBool(if_empty=False),
limit=validators.Int(if_empty=None, if_invalid=None),
diff --git a/ForgeDiscussion/forgediscussion/widgets/admin.py b/ForgeDiscussion/forgediscussion/widgets/admin.py
index cec8eda..6c650b4 100644
--- a/ForgeDiscussion/forgediscussion/widgets/admin.py
+++ b/ForgeDiscussion/forgediscussion/widgets/admin.py
@@ -25,7 +25,7 @@ from bson import ObjectId
import ew.jinja2_ew as ew
from allura.lib.widgets import forms as ff
-from allura.lib.widgets import form_fields as ffw
+from allura.lib import validators as v
from allura.lib import helpers as h
from forgediscussion import model as DM
@@ -66,7 +66,7 @@ class AddForum(ff.AdminForm):
fields = [
ew.HiddenField(name='app_id', label='App'),
ew.TextField(name='name', label='Name',
- validator=fev.UnicodeString()),
+ validator=v.UnicodeString()),
ew.TextField(name='shortname', label='Short Name',
validator=All(
fev.Regex(r"^[^\s\/\.]*$", not_empty=True, messages={
@@ -75,7 +75,7 @@ class AddForum(ff.AdminForm):
UniqueForumShortnameValidator())),
ew.TextField(name='parent', label='Parent Forum'),
ew.TextField(name='description', label='Description',
- validator=fev.UnicodeString()),
+ validator=v.UnicodeString()),
ew.TextField(name='monitoring_email',
label='Monitoring Email', validator=fev.Email()),
ew.Checkbox(name="members_only", label="Developer Only"),
diff --git a/ForgeImporters/forgeimporters/base.py b/ForgeImporters/forgeimporters/base.py
index 13a7a7b..ea87738 100644
--- a/ForgeImporters/forgeimporters/base.py
+++ b/ForgeImporters/forgeimporters/base.py
@@ -71,7 +71,7 @@ class ProjectImportForm(schema.Schema):
self.allow_extra_fields = True
neighborhood = fev.NotEmpty()
- project_name = fev.UnicodeString(not_empty=True, max=40)
+ project_name = v.UnicodeString(not_empty=True, max=40)
class ToolImportForm(schema.Schema):
@@ -79,7 +79,7 @@ class ToolImportForm(schema.Schema):
def __init__(self, tool_class):
super(ToolImportForm, self).__init__()
self.add_field('mount_point', v.MountPointValidator(tool_class))
- mount_label = fev.UnicodeString()
+ mount_label = v.UnicodeString()
class ImportErrorHandler(object):
diff --git a/ForgeImporters/forgeimporters/github/code.py b/ForgeImporters/forgeimporters/github/code.py
index 8a4449e..0fb06a4 100644
--- a/ForgeImporters/forgeimporters/github/code.py
+++ b/ForgeImporters/forgeimporters/github/code.py
@@ -19,7 +19,6 @@ from __future__ import unicode_literals
from __future__ import absolute_import
from tg import tmpl_context as c
from tg import app_globals as g
-from formencode import validators as fev
from tg import (
expose,
flash,
@@ -32,6 +31,7 @@ from tg.decorators import (
from allura.lib.decorators import require_post
from allura import model as M
+from allura.lib import validators as v
from forgeimporters.base import (
ToolImporter,
@@ -46,7 +46,7 @@ from forgeimporters.github import (
class GitHubRepoImportForm(ToolImportForm):
- gh_user_name = fev.UnicodeString(not_empty=True)
+ gh_user_name = v.UnicodeString(not_empty=True)
gh_project_name = GitHubProjectNameValidator()
diff --git a/ForgeImporters/forgeimporters/github/tracker.py b/ForgeImporters/forgeimporters/github/tracker.py
index b796d3c..7e55a01 100644
--- a/ForgeImporters/forgeimporters/github/tracker.py
+++ b/ForgeImporters/forgeimporters/github/tracker.py
@@ -24,7 +24,6 @@ from six.moves.urllib.error import HTTPError
import six
from io import BytesIO
-from formencode import validators as fev
from tg import (
expose,
flash,
@@ -37,6 +36,7 @@ from tg.decorators import (
from allura import model as M
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.plugin import ImportIdConverter
from allura.lib.decorators import require_post
from ming.orm import session, ThreadLocalORMSession
@@ -62,7 +62,7 @@ log = logging.getLogger(__name__)
class GitHubTrackerImportForm(ToolImportForm):
gh_project_name = GitHubProjectNameValidator()
- gh_user_name = fev.UnicodeString(not_empty=True)
+ gh_user_name = v.UnicodeString(not_empty=True)
class GitHubTrackerImportController(ToolImportController, GitHubOAuthMixin):
diff --git a/ForgeImporters/forgeimporters/github/wiki.py b/ForgeImporters/forgeimporters/github/wiki.py
index d96a3c1..3cc1ba4 100644
--- a/ForgeImporters/forgeimporters/github/wiki.py
+++ b/ForgeImporters/forgeimporters/github/wiki.py
@@ -24,14 +24,12 @@ from tempfile import mkdtemp
from shutil import rmtree
import six
-from paste.deploy.converters import aslist
from bs4 import BeautifulSoup
import git
from tg import app_globals as g
from tg import tmpl_context as c
from ming.orm import ThreadLocalORMSession
-from formencode import validators as fev
from tg import (
expose,
flash,
@@ -43,6 +41,7 @@ from tg.decorators import (
)
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib import utils
from allura.lib.plugin import ImportIdConverter
from allura.lib.decorators import (
@@ -71,8 +70,8 @@ log = logging.getLogger(__name__)
class GitHubWikiImportForm(ToolImportForm):
gh_project_name = GitHubProjectNameValidator()
- gh_user_name = fev.UnicodeString(not_empty=True)
- tool_option = fev.UnicodeString(if_missing='')
+ gh_user_name = v.UnicodeString(not_empty=True)
+ tool_option = v.UnicodeString(if_missing='')
class GitHubWikiImportController(ToolImportController, GitHubOAuthMixin):
diff --git a/ForgeShortUrl/forgeshorturl/main.py b/ForgeShortUrl/forgeshorturl/main.py
index 290b6f7..a471983 100644
--- a/ForgeShortUrl/forgeshorturl/main.py
+++ b/ForgeShortUrl/forgeshorturl/main.py
@@ -24,6 +24,7 @@ from allura.app import Application, SitemapEntry, DefaultAdminController
from allura import model as M
from allura.lib.security import require_access, has_access
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib.search import search_app
from allura.controllers import BaseController
from allura.lib.widgets import form_fields as ffw
@@ -156,7 +157,7 @@ class RootController(BaseController):
}
@expose('jinja:forgeshorturl:templates/search.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
project=validators.StringBool(if_empty=False)))
def search(self, q=None, project=None, limit=None, page=0, **kw):
c.search_results = W.search_results
diff --git a/ForgeTracker/forgetracker/tracker_main.py b/ForgeTracker/forgetracker/tracker_main.py
index 980ad5e..28c7727 100644
--- a/ForgeTracker/forgetracker/tracker_main.py
+++ b/ForgeTracker/forgetracker/tracker_main.py
@@ -47,6 +47,7 @@ from ming.utils import LazyProperty
# Pyforge-specific imports
from allura import model as M
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.lib import utils
from allura.tasks import notification_tasks
from allura.app import (
@@ -89,12 +90,12 @@ from six.moves import map
log = logging.getLogger(__name__)
search_validators = dict(
- q=validators.UnicodeString(if_empty=None),
+ q=v.UnicodeString(if_empty=None),
history=validators.StringBool(if_empty=False),
project=validators.StringBool(if_empty=False),
limit=validators.Int(if_invalid=None),
page=validators.Int(if_empty=0, if_invalid=0),
- sort=validators.UnicodeString(if_empty=None),
+ sort=v.UnicodeString(if_empty=None),
filter=V.JsonConverter(if_empty={}, if_invalid={}),
deleted=validators.StringBool(if_empty=False))
@@ -949,11 +950,11 @@ class RootController(BaseController, FeedController):
@with_trailing_slash
@expose('jinja:forgetracker:templates/tracker/mass_edit.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
filter=V.JsonConverter(if_empty={}),
limit=validators.Int(if_empty=10, if_invalid=10),
page=validators.Int(if_empty=0, if_invalid=0),
- sort=validators.UnicodeString(if_empty='ticket_num_i asc')))
+ sort=v.UnicodeString(if_empty='ticket_num_i asc')))
def edit(self, q=None, limit=None, page=None, sort=None, filter=None, **kw):
require_access(c.app, 'update')
result = TM.Ticket.paged_search(c.app.config, c.user, q, filter=filter,
@@ -977,11 +978,11 @@ class RootController(BaseController, FeedController):
@with_trailing_slash
@expose('jinja:forgetracker:templates/tracker/mass_move.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
filter=V.JsonConverter(if_empty={}),
limit=validators.Int(if_empty=10, if_invalid=10),
page=validators.Int(if_empty=0, if_invalid=0),
- sort=validators.UnicodeString(if_empty='ticket_num_i asc')))
+ sort=v.UnicodeString(if_empty='ticket_num_i asc')))
def move(self, q=None, limit=None, page=None, sort=None, filter=None, **kw):
require_access(c.app, 'admin')
result = TM.Ticket.paged_search(c.app.config, c.user, q, filter=filter,
@@ -1698,8 +1699,8 @@ class TrackerAdminController(DefaultAdminController):
@validate(W.options_admin, error_handler=options)
def set_options(self, **kw):
require_access(self.app, 'configure')
- for k, v in six.iteritems(kw):
- self.app.config.options[k] = v
+ for k, val in six.iteritems(kw):
+ self.app.config.options[k] = val
flash('Options updated')
redirect(request.referer or '/')
@@ -1937,7 +1938,7 @@ class MilestoneController(BaseController):
@validate(validators=dict(
limit=validators.Int(if_invalid=None),
page=validators.Int(if_empty=0, if_invalid=0),
- sort=validators.UnicodeString(if_empty=''),
+ sort=v.UnicodeString(if_empty=''),
filter=V.JsonConverter(if_empty={}),
deleted=validators.StringBool(if_empty=False)))
def index(self, q=None, columns=None, page=0, query=None, sort=None,
diff --git a/ForgeTracker/forgetracker/widgets/admin.py b/ForgeTracker/forgetracker/widgets/admin.py
index a36e11d..4e72838 100644
--- a/ForgeTracker/forgetracker/widgets/admin.py
+++ b/ForgeTracker/forgetracker/widgets/admin.py
@@ -20,6 +20,7 @@ from __future__ import absolute_import
import ew.jinja2_ew as ew
from formencode import validators as fev
+from allura.lib import validators as v
from allura.lib.widgets import forms as ff
from allura.lib.widgets import form_fields as ffw
@@ -61,13 +62,13 @@ class OptionsAdmin(ff.AdminForm):
ffw.MarkdownEdit(
name='TicketHelpNew',
label='Help text to display on new ticket page',
- validator=fev.String(),
+ validator=v.String(),
attrs={'style': 'width: 95%'}),
ffw.MarkdownEdit(
name='TicketHelpSearch',
label='Help text to display on ticket list pages (index page,'
' search results, milestone lists)',
- validator=fev.String(),
+ validator=v.String(),
attrs={'style': 'width: 95%'}),
]
return fields
diff --git a/ForgeTracker/forgetracker/widgets/bin_form.py b/ForgeTracker/forgetracker/widgets/bin_form.py
index a18cff2..31df17b 100644
--- a/ForgeTracker/forgetracker/widgets/bin_form.py
+++ b/ForgeTracker/forgetracker/widgets/bin_form.py
@@ -19,10 +19,9 @@ from __future__ import unicode_literals
from __future__ import absolute_import
import ew
from ew import jinja2_ew
-from allura.lib import validators as V
+from allura.lib import validators as v
from forgetracker import model
-from formencode import validators as fev
class BinForm(ew.SimpleForm):
@@ -33,12 +32,12 @@ class BinForm(ew.SimpleForm):
class hidden_fields(ew.NameList):
_id = jinja2_ew.HiddenField(
- validator=V.Ming(model.Bin), if_missing=None)
+ validator=v.Ming(model.Bin), if_missing=None)
class fields(ew.NameList):
summary = jinja2_ew.TextField(
label='Bin Name',
- validator=fev.UnicodeString(not_empty=True))
+ validator=v.UnicodeString(not_empty=True))
terms = jinja2_ew.TextField(
label='Search Terms',
- validator=fev.UnicodeString(not_empty=True))
+ validator=v.UnicodeString(not_empty=True))
diff --git a/ForgeTracker/forgetracker/widgets/ticket_form.py b/ForgeTracker/forgetracker/widgets/ticket_form.py
index f1f04e1..fa1ddd4 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_form.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_form.py
@@ -106,7 +106,7 @@ class GenericTicketForm(ew.SimpleForm):
ew.TextField(name='summary', label='Title',
attrs={'style': 'width: 425px', 'class':'memorable',
'placeholder': 'Title'},
- validator=fev.UnicodeString(
+ validator=v.UnicodeString(
not_empty=True, messages={
'empty': "You must provide a Title"})),
ffw.MarkdownEdit(label='Description', name='description',
diff --git a/ForgeWiki/forgewiki/wiki_main.py b/ForgeWiki/forgewiki/wiki_main.py
index 75f289a..d635222 100644
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -36,6 +36,7 @@ from ming.orm import session
# Pyforge-specific imports
from allura import model as M
from allura.lib import helpers as h
+from allura.lib import validators as v
from allura.app import Application, SitemapEntry, DefaultAdminController, ConfigOption
from allura.lib.search import search_app
from allura.lib.decorators import require_post, memorable_forget
@@ -402,7 +403,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
@with_trailing_slash
@expose('jinja:forgewiki:templates/wiki/search.html')
- @validate(dict(q=validators.UnicodeString(if_empty=None),
+ @validate(dict(q=v.UnicodeString(if_empty=None),
history=validators.StringBool(if_empty=False),
search_comments=validators.StringBool(if_empty=False),
project=validators.StringBool(if_empty=False)))
@@ -424,7 +425,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
@with_trailing_slash
@expose('jinja:forgewiki:templates/wiki/browse.html')
- @validate(dict(sort=validators.UnicodeString(if_empty='alpha'),
+ @validate(dict(sort=v.UnicodeString(if_empty='alpha'),
show_deleted=validators.StringBool(if_empty=False),
page=validators.Int(if_empty=0, if_invalid=0),
limit=validators.Int(if_empty=None, if_invalid=None)))
@@ -468,7 +469,7 @@ class RootController(BaseController, DispatchIndex, FeedController):
@with_trailing_slash
@expose('jinja:forgewiki:templates/wiki/browse_tags.html')
- @validate(dict(sort=validators.UnicodeString(if_empty='alpha'),
+ @validate(dict(sort=v.UnicodeString(if_empty='alpha'),
page=validators.Int(if_empty=0, if_invalid=0),
limit=validators.Int(if_empty=None, if_invalid=None)))
def browse_tags(self, sort='alpha', page=0, limit=None, **kw):
diff --git a/requirements.in b/requirements.in
index 494ce9a..cc30883 100644
--- a/requirements.in
+++ b/requirements.in
@@ -11,7 +11,7 @@ emoji
faulthandler ; python_version < "3.3"
feedgenerator
feedparser
-# FormEncode may need v2.0 to work past py3.3 or so? https://github.com/formencode/formencode/issues/140
+# FormEncode is not currently maintained :( Could go to 2.0.0a currently https://github.com/formencode/formencode/issues/140
FormEncode
GitPython==2.1.11
html5lib==1.0.1