aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/edit
diff options
context:
space:
mode:
authortilly-Q <nattilypigeonfowl@gmail.com>2014-05-14 13:02:30 -0400
committertilly-Q <nattilypigeonfowl@gmail.com>2014-05-14 13:02:30 -0400
commitda537ed44ef855954696a18dccd832feb6e56328 (patch)
tree9eaa78895c0faeff2fb05d37e687e59fbc5f9e8f /mediagoblin/edit
parent03766fd87069cb4f1394790f81ac7b853085bf71 (diff)
parent2daf8ec00043a4cc5cd120f875a5382aca6ec7f9 (diff)
downloadmediagoblin-da537ed44ef855954696a18dccd832feb6e56328.tar.lz
mediagoblin-da537ed44ef855954696a18dccd832feb6e56328.tar.xz
mediagoblin-da537ed44ef855954696a18dccd832feb6e56328.zip
Merge branch 'metadata'
Diffstat (limited to 'mediagoblin/edit')
-rw-r--r--mediagoblin/edit/forms.py37
-rw-r--r--mediagoblin/edit/views.py34
2 files changed, 70 insertions, 1 deletions
diff --git a/mediagoblin/edit/forms.py b/mediagoblin/edit/forms.py
index 2c9b5e99..7c390a3f 100644
--- a/mediagoblin/edit/forms.py
+++ b/mediagoblin/edit/forms.py
@@ -15,10 +15,12 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import wtforms
+from jsonschema import Draft4Validator
from mediagoblin.tools.text import tag_length_validator
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
from mediagoblin.tools.licenses import licenses_as_choices
+from mediagoblin.tools.metadata import DEFAULT_SCHEMA, DEFAULT_CHECKER
from mediagoblin.auth.tools import normalize_user_or_email_field
@@ -122,3 +124,38 @@ class ChangeEmailForm(wtforms.Form):
[wtforms.validators.Required()],
description=_(
"Enter your password to prove you own this account."))
+
+class MetaDataValidator(object):
+ """
+ Custom validator which runs form data in a MetaDataForm through a jsonschema
+ validator and passes errors recieved in jsonschema to wtforms.
+
+ :param schema The json schema to validate the data against. By
+ default this uses the DEFAULT_SCHEMA from
+ mediagoblin.tools.metadata.
+ :param format_checker The FormatChecker object that limits which types
+ jsonschema can recognize. By default this uses
+ DEFAULT_CHECKER from mediagoblin.tools.metadata.
+ """
+ def __init__(self, schema=DEFAULT_SCHEMA, format_checker=DEFAULT_CHECKER):
+ self.schema = schema
+ self.format_checker = format_checker
+
+ def __call__(self, form, field):
+ metadata_dict = {field.data:form.value.data}
+ validator = Draft4Validator(self.schema,
+ format_checker=self.format_checker)
+ errors = [e.message
+ for e in validator.iter_errors(metadata_dict)]
+ if len(errors) >= 1:
+ raise wtforms.validators.ValidationError(
+ errors.pop())
+
+class MetaDataForm(wtforms.Form):
+ identifier = wtforms.TextField(_(u'Identifier'),[MetaDataValidator()])
+ value = wtforms.TextField(_(u'Value'))
+
+class EditMetaDataForm(wtforms.Form):
+ media_metadata = wtforms.FieldList(
+ wtforms.FormField(MetaDataForm, ""),
+ )
diff --git a/mediagoblin/edit/views.py b/mediagoblin/edit/views.py
index 80590875..e998d6be 100644
--- a/mediagoblin/edit/views.py
+++ b/mediagoblin/edit/views.py
@@ -17,8 +17,10 @@
from datetime import datetime
from itsdangerous import BadSignature
+from pyld import jsonld
from werkzeug.exceptions import Forbidden
from werkzeug.utils import secure_filename
+from jsonschema import ValidationError, Draft4Validator
from mediagoblin import messages
from mediagoblin import mg_globals
@@ -29,8 +31,11 @@ from mediagoblin.edit import forms
from mediagoblin.edit.lib import may_edit_media
from mediagoblin.decorators import (require_active_login, active_user_from_url,
get_media_entry_by_id, user_may_alter_collection,
- get_user_collection)
+ get_user_collection, user_has_privilege,
+ user_not_banned)
from mediagoblin.tools.crypto import get_timed_signer_url
+from mediagoblin.tools.metadata import (compact_and_validate, DEFAULT_CHECKER,
+ DEFAULT_SCHEMA)
from mediagoblin.tools.mail import email_debug_message
from mediagoblin.tools.response import (render_to_response,
redirect, redirect_obj, render_404)
@@ -432,3 +437,30 @@ def change_email(request):
'mediagoblin/edit/change_email.html',
{'form': form,
'user': user})
+
+@user_has_privilege(u'admin')
+@require_active_login
+@get_media_entry_by_id
+def edit_metadata(request, media):
+ form = forms.EditMetaDataForm(request.form)
+ if request.method == "POST" and form.validate():
+ metadata_dict = dict([(row['identifier'],row['value'])
+ for row in form.media_metadata.data])
+ json_ld_metadata = None
+ json_ld_metadata = compact_and_validate(metadata_dict)
+ media.media_metadata = json_ld_metadata
+ media.save()
+ return redirect_obj(request, media)
+
+ if len(form.media_metadata) == 0:
+ for identifier, value in media.media_metadata.iteritems():
+ if identifier == "@context": continue
+ form.media_metadata.append_entry({
+ 'identifier':identifier,
+ 'value':value})
+
+ return render_to_response(
+ request,
+ 'mediagoblin/edit/metadata.html',
+ {'form':form,
+ 'media':media})