'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
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
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
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')
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
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
{% endif %}
</p>
{% if media.tags %}
- <p>
- {{ ' '.join(media.tags) }}
- </p>
+ {% include "mediagoblin/utils/tags.html" %}
{% endif %}
</div>
{% else %}
--- /dev/null
+{#
+# 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 %}
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,
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'
"""
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(