Created a UI for editting a media's metadata. Had to add a new macro to
authortilly-Q <nattilypigeonfowl@gmail.com>
Tue, 6 May 2014 21:00:25 +0000 (17:00 -0400)
committertilly-Q <nattilypigeonfowl@gmail.com>
Tue, 6 May 2014 21:00:25 +0000 (17:00 -0400)
wtforms.html in the process.

mediagoblin/edit/forms.py
mediagoblin/edit/views.py
mediagoblin/static/css/base.css
mediagoblin/templates/mediagoblin/edit/metadata.html
mediagoblin/templates/mediagoblin/utils/metadata_table.html
mediagoblin/templates/mediagoblin/utils/wtforms.html

index 6cc7a9cb296f01d7725740eba09916177fd8e2e6..ce66526f551aefe12145c782ac912c5d3249d877 100644 (file)
@@ -124,12 +124,13 @@ class ChangeEmailForm(wtforms.Form):
             "Enter your password to prove you own this account."))
 
 class MetaDataForm(wtforms.Form):
-    identifier = wtforms.TextField(
-        _(u'Id'))
-    value = wtforms.TextField(
-        _(u'Value'))
+    identifier = wtforms.TextField('')
+    value = wtforms.TextField('')
 
 class EditMetaDataForm(wtforms.Form):
     media_metadata = wtforms.FieldList(
-        wtforms.FormField(MetaDataForm)
+        wtforms.FormField(MetaDataForm, label="")
+    )
+    context = wtforms.FieldList(
+        wtforms.FormField(MetaDataForm, label="")
     )
index e20d0eccda07afa63cab87d15a39cf7003bf3092..e3dd82abb5316c6565c2e9a40051b880a314a5df 100644 (file)
@@ -439,7 +439,22 @@ def change_email(request):
 @get_media_entry_by_id
 def edit_metadata(request, media):
     form = forms.EditMetaDataForm()
+    if media.media_metadata:
+        for row in media.media_metadata.iteritems():
+            if row[0] == "@context": continue
+            identifier = row[0]
+            # TODO Will change when we revert the metadata branch
+            value = row[1]['@value']
+            form.media_metadata.append_entry({
+                'identifier':identifier,
+                'value':value})
+        for row in media.media_metadata['@context'].iteritems():
+            identifier, value = row[0:2]
+            form.context.append_entry({
+                'identifier':identifier,
+                'value':value})
     return render_to_response(
         request,
         'mediagoblin/edit/metadata.html',
-        {'form':form})
+        {'form':form,
+         'media':media})
index 32c6c6cb87459a0ed8a2b38dc3aed82469a6398f..f0f9e3e683b8565083ae14524210ea9ebb798cab 100644 (file)
@@ -938,3 +938,17 @@ p.verifier {
     none repeat scroll 0% 0% rgb(221, 221, 221);
     padding: 1em 0px;
 }
+
+/* for the media metadata editing table */
+table.metadata_editor {
+
+    margin: 10px auto;
+    width: 800px;
+}
+
+table.metadata_editor tr td {
+    width:350px;
+}
+table.metadata_editor tr td input.form_field_input {
+    width: 300px
+}
index 3f97555e731911937d47515e5c80d18dd6972930..cbf74106af399e3ac7c7a363999f2430ff9162ed 100644 (file)
 #}
 {%- extends "mediagoblin/base.html" %}
 {% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
+{% block mediagoblin_head %}
+  <script>
+    function add_new_row(table_id, row_number, input_prefix) {
+        new_row = $('<tr>').append(
+                      $('<td>').attr(
+                      'class','form_field_input').append(
+                          $('<input>').attr('name',
+                          input_prefix + row_number + "-identifier").attr('id',
+                          input_prefix + row_number + "-identifier")
+                      )
+                  ).append(
+                      $('<td>').attr(
+                      'class','form_field_input').append(
+                          $('<input>').attr('name',
+                          input_prefix + row_number + "-value").attr('id',
+                          input_prefix + row_number + "-value")
+                      )
+                  );
+        $(table_id).append(new_row);
+    }
+    function clear_empty_rows(list_id) {
+        $('table'+list_id+' tr').each(function(row){
+            id_input = $(this).find('td').find('input');
+            value_input = $(this).find('td').next().find('input');
+            if ((value_input.attr('value') == "") && 
+                    (id_input.attr('value') == "")) {
+                $(this).remove();
+            }
+        })
+    }
 
+    $(document).ready(function(){
+        var context_lines = {{ form.context | length }};
+        var metadata_lines = {{ form.media_metadata | length }};
+        $("#add_new_metadata_row").click(function(){
+            add_new_row("#metadata_list", 
+                        metadata_lines,
+                        'media_metadata-');
+            metadata_lines += 1;
+        })
+        $("#add_new_context_row").click(function(){
+            add_new_row("#context_list", 
+                        context_lines,
+                        'context-');
+            context_lines += 1;
+        })
+        $("#clear_empty_rows").click(function(){
+            clear_empty_rows("#context_list");
+            clear_empty_rows("#metadata_list");
+        })
+    })
+  </script>
+{% endblock %}
 {% block mediagoblin_content %}
-  {{ wtforms_util.render_divs(form) }}
+  <h2>{% trans media_name=media.title -%}
+    Metadata for "{{ media_name }}"{% endtrans %}</h2>
+  <form action="" method="POST" id="metadata_form">
+<!-- This table holds all the information about the metadata's context.
+     visit http:/wwww.json-ld.org for more information. -->
+  <h3>{% trans %}Context{% endtrans %}</h3>
+  <table class="metadata_editor" id="context_list">
+    <tr>
+      <td><a class="strong highlight">
+        {% trans %}Identifier{% endtrans %}</a></td>
+      <td><a class="strong highlight">{% trans %}Value{% endtrans %}</a></td>
+    </tr>
+  {% for miniform in form.context -%}
+    {{ wtforms_util.render_table_row(miniform) }}
+  {% endfor -%}
+  </table>
+
+  <table class="metadata_editor" id="buttons_top">
+    <tr>
+      <td><input type=button value="{% trans %}Add new Row{% endtrans %}"
+        class="button_action" id="add_new_context_row" /></td>
+      <td></td>
+    </tr>
+  </table>
+
+<!-- This table holds all the information about the media entry's metadata -->
+  <h3>{% trans %}Data{% endtrans %}</h3>
+  <table class="metadata_editor" id="metadata_list" >
+    <tr>
+      <td><a class="strong highlight">
+        {% trans %}Identifier{% endtrans %}</a></td>
+      <td><a class="strong highlight">{% trans %}Value{% endtrans %}</a></td>
+    </tr>
+  {% for miniform in form.media_metadata -%}
+    {{ wtforms_util.render_table_row(miniform) }}
+  {% endfor -%}
+  </table>
+
+<!-- These are the buttons you use to control the form -->
+  <table class="metadata_editor" id="buttons_bottom">
+    <tr>
+      <td><input type=button value="{% trans %}Add new Row{% endtrans %}"
+        class="button_action" id="add_new_metadata_row" />
+      </td>
+      <td><input type=submit value="{% trans %}Update Metadata{% endtrans %}" 
+        class="button_action_highlight" /></td>
+    </tr>
+    <tr>
+      <td><input type=button value="{% trans %}Clear empty Rows{% endtrans %}"
+        class="button_action" id="clear_empty_rows" /></td>
+    </tr>
+  </table>
+  {{ csrf_token }}
+  </form>
+  
 {% endblock mediagoblin_content %}
index 2eb57af39d14289fefe441030ea86ff1cdd47c77..0c67264a1df6c6c50779c0a4f885e744bc0c179f 100644 (file)
         {%- endfor %}
       </table>
   {% endif %}
+  {% if request.user and request.user.has_privilege('admin') %}
+      <a href="{{ request.urlgen('mediagoblin.edit.metadata',
+                    user=media_entry.get_uploader.username,
+                    media_id=media_entry.id) }}">
+        {% trans %}Edit Metadata{% endtrans %}</a>
+  {% endif %}
 {%- endmacro %}
index e079274edb74af400299bf982b570d3bacef5ebb..e861b67481136b1045d1587df49eb9e6175060c3 100644 (file)
   {% endfor %}
 {%- endmacro %}
 
+{% macro render_table_row(form) %}
+  <tr>
+  {%- for field in form %}
+    <td class="form_field_input">
+      {{field}}
+      {%- if field.errors -%}
+        <br />
+        <ul class="errors">
+          {% for error in field.errors %}
+            <li>{{error}}</li>
+          {%- endfor %}
+        </ul>
+      {%- endif -%}
+    </td>
+  {%- endfor %}
+  </tr>
+{%- endmacro %}
+
 {# Render a boolean field #}
 {% macro render_bool(field) %}
   <div class="boolean">