diff options
author | Caleb Forbes Davis V <caldavis@gmail.com> | 2011-07-27 14:42:09 -0500 |
---|---|---|
committer | Caleb Forbes Davis V <caldavis@gmail.com> | 2011-07-27 14:51:57 -0500 |
commit | 0712a06dc6d6b05cb78d4b10af12c051e8f765e3 (patch) | |
tree | 16feba97f0589fdf1c2811c23340f4a002a1ae47 | |
parent | 97e4498c10c803c9d239011d4c48efef52673ec3 (diff) | |
download | mediagoblin-0712a06dc6d6b05cb78d4b10af12c051e8f765e3.tar.lz mediagoblin-0712a06dc6d6b05cb78d4b10af12c051e8f765e3.tar.xz mediagoblin-0712a06dc6d6b05cb78d4b10af12c051e8f765e3.zip |
changes tags to a list of dicts in the db, adding tag slugs
- 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
-rw-r--r-- | mediagoblin/db/models.py | 2 | ||||
-rw-r--r-- | mediagoblin/edit/views.py | 8 | ||||
-rw-r--r-- | mediagoblin/submit/views.py | 5 | ||||
-rw-r--r-- | mediagoblin/templates/mediagoblin/user_pages/media.html | 4 | ||||
-rw-r--r-- | mediagoblin/templates/mediagoblin/utils/tags.html | 25 | ||||
-rw-r--r-- | mediagoblin/util.py | 28 |
6 files changed, 56 insertions, 16 deletions
diff --git a/mediagoblin/db/models.py b/mediagoblin/db/models.py index 279cb9f2..8fcbb208 100644 --- a/mediagoblin/db/models.py +++ b/mediagoblin/db/models.py @@ -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 diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py index 3193bfa3..e4ebe8d7 100644 --- a/mediagoblin/edit/views.py +++ b/mediagoblin/edit/views.py @@ -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') diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py index edde4400..c5ac8c62 100644 --- a/mediagoblin/submit/views.py +++ b/mediagoblin/submit/views.py @@ -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 diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html index 47d5db35..8dd42115 100644 --- a/mediagoblin/templates/mediagoblin/user_pages/media.html +++ b/mediagoblin/templates/mediagoblin/user_pages/media.html @@ -111,9 +111,7 @@ {% 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 index 00000000..94c4cf69 --- /dev/null +++ b/mediagoblin/templates/mediagoblin/utils/tags.html @@ -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 %} diff --git a/mediagoblin/util.py b/mediagoblin/util.py index 8bb90acf..ab72b5c8 100644 --- a/mediagoblin/util.py +++ b/mediagoblin/util.py @@ -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( |