raises tag length error in form context instead of in message queue
authorCaleb Forbes Davis V <caldavis@gmail.com>
Thu, 21 Jul 2011 04:54:32 +0000 (23:54 -0500)
committerCaleb Forbes Davis V <caldavis@gmail.com>
Thu, 21 Jul 2011 05:02:57 +0000 (00:02 -0500)
mediagoblin/edit/forms.py
mediagoblin/edit/views.py
mediagoblin/submit/forms.py
mediagoblin/util.py

index 21c8509afec8eb1214c1b51afdaf09ad8cf1a2b3..e7a86bba295493f448cb15581bb52ef24e186d5c 100644 (file)
@@ -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',
index df0a0d52b6aa0dc0a62c7f22e625270952448d5d..b3d239e1e00b50d50f52ceecbd25b8b42ec506e8 100644 (file)
@@ -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",
index 0e0fd08694929a53150b6614092a3e352346b276..1a5a7f4efd273ddc7c44b1e1308e4f29c775b592 100644 (file)
@@ -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])
index 44e642586694d9cae34050633aa48ad74d0151e1..a84e07c4c9da03b8840c1436566081481379a7d4 100644 (file)
@@ -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):