changes tags to a list of dicts in the db, adding tag slugs
authorCaleb Forbes Davis V <caldavis@gmail.com>
Wed, 27 Jul 2011 19:42:09 +0000 (14:42 -0500)
committerCaleb Forbes Davis V <caldavis@gmail.com>
Wed, 27 Jul 2011 19:51:57 +0000 (14:51 -0500)
- adds a function to convert the tag list of dicts to a text string
  properly delimited for loading into forms
- tag string conversion function updated to generate list of dicts
- updates all mentions of the conversion of the string to the tags db
  object
- adds a tags template utility and updates the media template accordingly

mediagoblin/db/models.py
mediagoblin/edit/views.py
mediagoblin/submit/views.py
mediagoblin/templates/mediagoblin/user_pages/media.html
mediagoblin/templates/mediagoblin/utils/tags.html [new file with mode: 0644]
mediagoblin/util.py

index 279cb9f2bfe5c286698eb38307badec9dd012ebc..8fcbb208b4b1dc970a23842cda4f33972c9024fb 100644 (file)
@@ -82,7 +82,7 @@ class MediaEntry(Document):
         'media_type': unicode,
         'media_data': dict, # extra data relevant to this media_type
         'plugin_data': dict, # plugins can dump stuff here.
-        'tags': [unicode],
+        'tags': [dict],
         'state': unicode,
 
         # For now let's assume there can only be one main file queued
index 3193bfa348a40b372225df3dbec35cbc3378b0ca..e4ebe8d797ee47b4f963edbe811c124765c28ca1 100644 (file)
@@ -21,7 +21,8 @@ from string import split
 from mediagoblin import messages
 from mediagoblin import mg_globals
 from mediagoblin.util import (
-    render_to_response, redirect, clean_html, convert_to_tag_list)
+    render_to_response, redirect, clean_html, convert_to_tag_list_of_dicts,
+    media_tags_as_string)
 from mediagoblin.edit import forms
 from mediagoblin.edit.lib import may_edit_media
 from mediagoblin.decorators import require_active_login, get_user_media_entry
@@ -39,7 +40,7 @@ def edit_media(request, media):
         title = media['title'],
         slug = media['slug'],
         description = media['description'],
-        tags = mg_globals.app_config['tags_delimiter'].join(media['tags']))
+        tags = media_tags_as_string(media['tags']))
 
     if request.method == 'POST' and form.validate():
         # Make sure there isn't already a MediaEntry with such a slug
@@ -55,7 +56,8 @@ 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'))
+            media['tags'] = convert_to_tag_list_of_dicts(
+                                   request.POST.get('tags'))
             
             md = markdown.Markdown(
                 safe_mode = 'escape')
index edde44004cdc5697782bd7d26e688ebe388f8c95..c5ac8c6207c5341a81acab6dffdd4a4094c6e9f8 100644 (file)
@@ -22,7 +22,7 @@ from werkzeug.utils import secure_filename
 
 from mediagoblin.util import (
     render_to_response, redirect, cleaned_markdown_conversion, \
-    convert_to_tag_list)
+    convert_to_tag_list_of_dicts)
 from mediagoblin.decorators import require_active_login
 from mediagoblin.submit import forms as submit_forms, security
 from mediagoblin.process_media import process_media_initial
@@ -62,7 +62,8 @@ def submit_start(request):
             entry['uploader'] = request.user['_id']
 
             # Process the user's folksonomy "tags"
-            entry['tags'] = convert_to_tag_list(request.POST.get('tags'))
+            entry['tags'] = convert_to_tag_list_of_dicts(
+                                request.POST.get('tags'))
 
             # Save, just so we can get the entry id for the sake of using
             # it to generate the file path
index 47d5db35acd30be49b4a012f37b77dead5628929..8dd42115acb672ffa644c55843745016c362b306 100644 (file)
         {% endif %}
       </p>
       {% if media.tags %}
-        <p>
-          {{ ' '.join(media.tags) }}
-        </p>
+        {% include "mediagoblin/utils/tags.html" %}
       {% endif %}
     </div>
   {% else %}
diff --git a/mediagoblin/templates/mediagoblin/utils/tags.html b/mediagoblin/templates/mediagoblin/utils/tags.html
new file mode 100644 (file)
index 0000000..94c4cf6
--- /dev/null
@@ -0,0 +1,25 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#}
+
+{% block tags_content -%}
+  <ul class="mediaentry_tags">
+    {% for tag in media.tags %}
+      <li class="tag">{{ tag['name'] }}</li>
+    {% endfor %}
+  </ul>
+{% endblock %}
index 8bb90acf77c5c4875c724c576533a7923199a786..ab72b5c8af03e416e80e0ea0f1561eb73f434871 100644 (file)
@@ -371,7 +371,7 @@ def clean_html(html):
     return HTML_CLEANER.clean_html(html)
 
 
-def convert_to_tag_list(tag_string):
+def convert_to_tag_list_of_dicts(tag_string):
     """
     Filter input from incoming string containing user tags,
 
@@ -389,15 +389,29 @@ def convert_to_tag_list(tag_string):
                                        mg_globals.app_config['tags_delimiter']):
 
             # Do not permit duplicate tags
-            if tag.strip() and tag not in taglist:
+            if tag.strip() and tag.strip() not in taglist:
 
                 if mg_globals.app_config['tags_case_sensitive']:
-                    taglist.append(tag.strip())
+                    taglist.append({'name': tag.strip(),
+                                    'slug': slugify(tag.strip())})
                 else:
-                    taglist.append(tag.strip().lower())
+                    taglist.append({'name': tag.strip().lower(),
+                                    'slug': slugify(tag.strip().lower())})
     return taglist
 
 
+def media_tags_as_string(media_entry_tags):
+    """
+    Generate a string from a media item's tags, stored as a list of dicts
+
+    This is the opposite of convert_to_tag_list_of_dicts
+    """
+    media_tag_string = ''
+    if media_entry_tags:
+        media_tag_string = mg_globals.app_config['tags_delimiter'].join(
+                                      [tag['name'] for tag in media_entry_tags])
+    return media_tag_string
+
 TOO_LONG_TAG_WARNING = \
     u'Tags must be shorter than %s characters.  Tags that are too long: %s'
 
@@ -405,10 +419,10 @@ def tag_length_validator(form, field):
     """
     Make sure tags do not exceed the maximum tag length.
     """
-    tags = convert_to_tag_list(field.data)
+    tags = convert_to_tag_list_of_dicts(field.data)
     too_long_tags = [
-        tag for tag in tags
-        if len(tag) > mg_globals.app_config['tags_max_length']]
+        tag['name'] for tag in tags
+        if len(tag['name']) > mg_globals.app_config['tags_max_length']]
 
     if too_long_tags:
         raise wtforms.ValidationError(