From: Caleb Forbes Davis V Date: Thu, 21 Jul 2011 04:54:32 +0000 (-0500) Subject: raises tag length error in form context instead of in message queue X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=909371cdceace162af880c275b9e6e70488e3029;p=mediagoblin.git raises tag length error in form context instead of in message queue --- diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py index 21c8509a..e7a86bba 100644 --- a/mediagoblin/edit/forms.py +++ b/mediagoblin/edit/forms.py @@ -16,6 +16,7 @@ import wtforms +from mediagoblin.util import tag_length_validator, TOO_LONG_TAG_WARNING class EditForm(wtforms.Form): @@ -25,7 +26,9 @@ class EditForm(wtforms.Form): slug = wtforms.TextField( 'Slug') description = wtforms.TextAreaField('Description of this work') - tags = wtforms.TextField('Tags') + tags = wtforms.TextField( + 'Tags', + [tag_length_validator]) class EditProfileForm(wtforms.Form): bio = wtforms.TextAreaField('Bio', diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index df0a0d52..b3d239e1 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -55,6 +55,7 @@ def edit_media(request, media): else: media['title'] = request.POST['title'] media['description'] = request.POST.get('description') + media['tags'] = convert_to_tag_list(request.POST.get('tags')) md = markdown.Markdown( safe_mode = 'escape') @@ -63,9 +64,6 @@ def edit_media(request, media): media['description'])) media['slug'] = request.POST['slug'] - - # Process the user's folksonomy "tags" - media['tags'] = convert_to_tag_list(request) media.save() return redirect(request, "mediagoblin.user_pages.media_home", diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py index 0e0fd086..1a5a7f4e 100644 --- a/mediagoblin/submit/forms.py +++ b/mediagoblin/submit/forms.py @@ -16,6 +16,7 @@ import wtforms +from mediagoblin.util import tag_length_validator, TOO_LONG_TAG_WARNING class SubmitStartForm(wtforms.Form): @@ -24,4 +25,6 @@ class SubmitStartForm(wtforms.Form): [wtforms.validators.Length(min=0, max=500)]) description = wtforms.TextAreaField('Description of this work') file = wtforms.FileField('File') - tags = wtforms.TextField('Tags') + tags = wtforms.TextField( + 'Tags', + [tag_length_validator]) diff --git a/mediagoblin/util.py b/mediagoblin/util.py index 44e64258..a84e07c4 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -24,6 +24,7 @@ import urllib from math import ceil from string import strip import copy +import wtforms from babel.localedata import exists import jinja2 @@ -374,14 +375,13 @@ TAGS_DELIMITER = u' ' TAGS_CASE_SENSITIVE = False TAGS_MAX_LENGTH = 50 -def convert_to_tag_list(request): +def convert_to_tag_list(tag_string): """ - Filter input from any "tags" field in the session, + Filter input from incoming string containing user tags, Strips trailing, leading, and internal whitespace, and also converts the "tags" text into an array of tags """ - tag_string = request.POST.get('tags') taglist = [] if tag_string: @@ -394,17 +394,6 @@ def convert_to_tag_list(request): # Do not permit duplicate tags if tag.strip() and tag not in taglist: - # Enforce maximum tag length - if len(tag) > TAGS_MAX_LENGTH: - tag = tag[:TAGS_MAX_LENGTH] + u'...' - messages.add_message( - request, messages.WARNING, \ - u'Tag truncated to ' + unicode(TAGS_MAX_LENGTH) + \ - u' characters.') - messages.add_message( - request, messages.INFO, \ - u'Why the long tag? Seriously.') - if TAGS_CASE_SENSITIVE: taglist.append(tag.strip()) else: @@ -412,6 +401,24 @@ def convert_to_tag_list(request): return taglist +TOO_LONG_TAG_WARNING = \ + u'Tags must be shorter than %s characters. Tags that are too long: %s' + +def tag_length_validator(form, field): + """ + Make sure tags do not exceed the maximum tag length. + """ + tags = convert_to_tag_list(field.data) + too_long_tags = [ + tag for tag in tags + if len(tag) > TAGS_MAX_LENGTH] + + if too_long_tags: + raise wtforms.ValidationError( + TOO_LONG_TAG_WARNING % ( + TAGS_MAX_LENGTH, ', '.join(too_long_tags))) + + MARKDOWN_INSTANCE = markdown.Markdown(safe_mode='escape') def cleaned_markdown_conversion(text):