Index: WAeUP_SRP/base/skins/waeup_upload/uploads_form.pt
===================================================================
--- WAeUP_SRP/base/skins/waeup_upload/uploads_form.pt	(revision 3277)
+++ WAeUP_SRP/base/skins/waeup_upload/uploads_form.pt	(revision 3277)
@@ -0,0 +1,109 @@
+<metal:html tal:define="info options/info;
+            portal_status_message options/psm;
+            ds options/ds;
+            mode options/mode;
+            rendered options/rendered;"
+            >
+  <metal:body use-macro="here/main_template/macros/master">
+    <metal:block fill-slot="header">
+      <a href=""
+         tal:attributes="href string:${here/academicsParent}">
+        <img tal:attributes="src string:${here/portal_url}/arrow_up.gif"/>
+        Up one level
+      </a>
+      <h3 tal:content="here/title_or_id" />
+      <div tal:condition="python:0" tal:content="info/container_path"/>
+      <br />
+    </metal:block>
+    <metal:main fill-slot="main">
+      <form action="" method="post" enctype="multipart/form-data" class="group">
+        <span tal:replace="structure rendered" />
+        <input type="submit" name="upload" value="upload"
+               class="destructive" />
+      </form>
+      <form action="" method="post" class="group"
+            tal:attributes="action info/action"
+            tal:define="rows python: info['items'];"
+            >
+        <table tal:condition="python: 1" class="contentListing" width="100%" summary="content layout" id="folder_content">      
+          <tr>
+            <th></th>
+            <th>Filename</th>
+            <th>Schema</th>
+            <th>Uploaded by</th>
+            <th>Upload Date</th>
+            <th>Message</th>
+            <th>Invalid Keys</th>
+          </tr>            
+          <tr tal:repeat="row rows"
+            tal:attributes="class python:test(repeat['row'].even(), 'even ajaxtd', 'odd ajaxtd')">
+            <td align="left" valign="middle" style="width: 5px;">
+              <input type="checkbox" name="ids:list" value="" id="" class="noborder"
+                     tal:define="id row/id"
+                     tal:attributes="value id;
+                     id python:'cb_' + id;
+                     checked python:id in info['choosen_ids'];" 
+                     />
+            </td>
+            <td tal:condition="nothing"> <a href="view" tal:attributes="href string:${row/url}"> <span tal:content="row/id" /></a>  </td>
+            <td tal:content="row/id" ></td>
+            <td>
+              <select name="import_layout:record" tal:attributes="name string:${row/id}.import_layout:record">
+                <option tal:repeat="option python: context.portal_vocabularies.import_names.items()"
+                        tal:attributes="value python: option[0];
+                        selected python: option[0] == row['import_layout']" 
+                        tal:content="python:option[1]" />
+              </select>
+            </td>
+            <td tal:content="row/uploaded_by" ></td>
+            <td tal:content="row/upload_date" ></td>
+            <td tal:content="row/msg" ></td>
+            <td>
+              <span tal:repeat="key row/invalid_keys">
+                <span tal:replace="key" />
+                <select tal:attributes="name string:${row/id}|${key}.valid_key:record">
+                  <option tal:repeat="new row/valid_keys"
+                          tal:attributes="value new"
+                          tal:content="new" />
+                </select>
+              </span>
+            </td>
+            <td tal:condition="nothing"> 
+            <a href="edit" tal:attributes="href string:${row/url}/external_edit_form"
+                target="edit"
+                onclick="javascript:window.open('','edit','width=600, height=700, directories=no, toolbar=no, location=no, menubar=no, scrollbars=yes, status=no, resizable=no, dependent=no')">
+                [edit]
+                </a> 
+            </td>
+
+          </tr>
+        </table>
+        <table width="100%" cellspacing="0" cellpadding="2"
+               summary="contents of the folder"
+               class="folderButtons">
+          <tr>
+            <td align="left" valign="top" rowspan="3"></td>
+            <td align="left" valign="top">
+                <input tal:condition="nothing" type="button" value="button_select_all" class="context"
+                       onclick="someJavaScriptFunctionThatWillBeReplaced"
+                       i18n:attributes="value"
+                       tal:attributes="onclick python:'toggleSelect(this, \'%s\', \'%s\')'
+                       % (cpsmcat('button_select_all'), cpsmcat('button_deselect_all'))"
+                       />
+                <input type="submit" name="edit" value="edit"
+                       class="destructive" i18n:attributes="value"
+                       />
+                <input type="submit" name="folder_delete:method" value="button_delete"
+                       class="destructive" i18n:attributes="value"
+                       tal:attributes="onclick python:'return window.confirm(\'%s\')' %
+                       (cpsmcat('description_confirm_delete'), )" 
+                       />
+            </td>
+          </tr>
+        </table>
+      </form>
+    </metal:main>
+    
+    <metal:sub fill-slot="sub"/>
+  </metal:body>
+</metal:html>
Index: WAeUP_SRP/base/skins/waeup_upload/uploads_index.py
===================================================================
--- WAeUP_SRP/base/skins/waeup_upload/uploads_index.py	(revision 3277)
+++ WAeUP_SRP/base/skins/waeup_upload/uploads_index.py	(revision 3277)
@@ -0,0 +1,107 @@
+## Script (Python) "getUploadsInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=student=None
+##title=
+##
+# $Id:getUploadsInfo.py 486 2006-09-06 10:09:39Z joachim $
+"""
+return Info about the Uploads
+"""
+import DateTime
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+request = context.REQUEST
+
+wf = context.portal_workflow
+mtool = context.portal_membership
+member = mtool.getAuthenticatedMember()
+
+path_info = request.get('PATH_INFO').split('/')
+
+info = {}
+info['action'] = "%s" % context.absolute_url()
+info['choosen_ids'] = request.get('ids',[])
+info['doc'] = context.getContent()
+
+items = []
+edit = request.form.has_key('edit')
+ids = request.get('ids',[])
+#set_trace()
+if edit and ids:
+    for id in ids:
+        doc = getattr(context, "%s.csv" % id).getContent()
+        doc.edit(mapping = request.form[id])
+        msg, invalid_keys = doc['checkKeys']()
+        new_keys = []
+        for key in invalid_keys:
+            id_key = "%s|%s" % (id,key)
+            if request.form.has_key(id_key):
+                new_keys += (key,request.form.get(id_key)['valid_key']),
+        if new_keys:
+            doc.editHeadline(new_keys)
+        request.RESPONSE.redirect(context.absolute_url())    
+        
+for id,upload in context.objectItems():
+    row = {}
+    doc = upload.getContent()
+    row['valid_keys'] = doc['getKeys']()
+    row['id'] = id.replace('.csv','')
+    row['title'] = doc.filename
+    row['url'] = upload.absolute_url()
+    row['msg'], row['invalid_keys'] = doc['checkKeys']()
+    row['filename'] = doc.filename 
+    row['import_layout'] = doc.import_layout
+    row['upload_date'] =  doc.upload_date.strftime("%d/%m/%y %H:%M:%S")
+    row['uploaded_by'] = doc.uploaded_by
+    items.append(row)
+items.sort()
+info['items'] = items
+
+validate = "upload" in request.keys()
+mode = "edit"
+res,psm,ds = context.portal_layouts.renderLayout(layout_id = 'upload',
+                             schema_id = 'upload',
+                             layout_mode = mode,
+                             context=context,
+                             mapping=validate and request,
+                             ob= {},
+                             commit = True,
+                            )
+if psm == 'invalid':
+    return context.uploads_form(rendered = res,
+                                 psm = "Please correct your input!",
+                                 mode = mode,
+                                 ds = ds,
+                                 info = info,
+                                )
+elif psm == '':
+    return context.uploads_form(rendered = res,
+                                        psm = psm,
+                                        ds = ds,
+                                        mode = mode,
+                                        info = info,
+                                       )
+elif psm == 'valid':
+    pass
+filename = ds['upload_file'].filename
+
+if filename not in context.objectIds():
+    context.invokeFactory('Upload',filename)
+    upload = getattr(context,filename)
+    d = {}
+    d['filename'] = d['id'] = filename 
+    d['upload_date'] =  DateTime.DateTime()
+    d['import_layout'] = ds.get('import_layout','')
+    d['uploaded_by'] = str(member)
+    d['url'] = upload.absolute_url()
+    upload.getContent().edit(mapping=d)
+    #info['items'].append(d)
+request.RESPONSE.redirect(context.absolute_url())    
+
Index: WAeUP_SRP/base/skins/waeup_upload/widget_uploadfile_render.pt
===================================================================
--- WAeUP_SRP/base/skins/waeup_upload/widget_uploadfile_render.pt	(revision 3277)
+++ WAeUP_SRP/base/skins/waeup_upload/widget_uploadfile_render.pt	(revision 3277)
@@ -0,0 +1,99 @@
+<tal:block define="mode options/mode;
+  id here/getWidgetId;
+  current_filename options/current_filename;
+  empty_file options/empty_file;
+  session_file options/session_file|nothing;
+  mimetype options/mimetype;
+  size options/size;
+  content_url options/content_url;
+  last_modified options/last_modified;
+  content_url_nocache string:${content_url}?nocache=${last_modified};
+  ">
+
+  <tal:block condition="python: mode == 'view' and not empty_file">
+    <metal:block define-macro="file_view">
+      <a tal:condition="mimetype"
+        tal:attributes="
+        href content_url_nocache;
+        onClick string:return openLinkInPopup('${content_url_nocache}');
+        ">
+        <img tal:replace="structure python:here.getImgTag(mimetype.icon_path,
+          title=mimetype.name())" /></a>
+      <a class="strong"
+        tal:attributes="href content_url_nocache">
+        <tal:block replace="current_filename" /></a>
+      <span tal:condition="size" class="note"
+        tal:define="str_size python:here.getHumanReadableSize(size);">
+        <tal:block content="str_size"/>
+      </span>
+    </metal:block>
+  </tal:block>
+
+  <tal:block condition="python: mode == 'edit'">
+
+    <metal:block define-macro="file_size_max_view">
+      <tal:block define="size_max python:here.size_max;
+                         str_sizeMax python:here.getHumanReadableSize(size_max)"
+        condition="python:size_max > 0">
+
+        <p i18n:translate="">
+          cpsschemas_size_max
+          <tal:block i18n:name="size_max" content="str_sizeMax"/>
+        </p>
+      </tal:block>
+    </metal:block>
+
+    <metal:block define-macro="file_edit">
+
+      <ul class="fileChoice"
+          tal:define="name here/getHtmlWidgetId;
+                      radio_name string:${name}_choice;"
+                      >
+      <li>
+        <metal:block define-slot="keep_file" tal:condition="nothing">
+          <input type="radio" class="noborder" name="." value="keep"
+                 checked="checked"
+                 tal:attributes="name radio_name;
+                 id string:${radio_name}_keep;"
+                 />
+          <label i18n:translate="cpsschemas_label_file_none"
+                 tal:condition="empty_file"
+                 tal:attributes="for string:${radio_name}_keep">None</label>
+          <label i18n:translate="cpsschemas_label_file_keep"
+                 tal:condition="not:empty_file"
+                 tal:attributes="for string:${radio_name}_keep">Keep</label>
+        </metal:block>
+      </li>
+      <metal:block define-slot="edit_file_action" />
+      <li>
+        <metal:block define-slot="change_file">
+          <input type="hidden" class="noborder"  name="." value="change"
+                 tal:attributes="name radio_name;
+                 id string:${radio_name}_change" 
+                 />
+          <label i18n:translate="cpsschemas_label_file_change"
+                 tal:attributes="for string:${radio_name}_change">Change</label>
+          <input type="file" name="." size="24"
+                 tal:attributes="name name;
+                 onclick string:document.getElementById('${radio_name}_change').checked='checked'" 
+                 />
+        </metal:block>
+      </li>
+      </ul>
+    </metal:block>
+
+    <metal:block define-macro="file_title_edit" tal:condition="nothing">
+      <p tal:define="name here/getHtmlWidgetId;
+                     title_name string:${name}_filename;">
+        <span i18n:translate="cpsschemas_label_filename">
+          Filename
+        </span>
+        <input style="margin-left: 5px" type="text" size="30" maxlength="80"
+               tal:attributes="name title_name;
+                               value current_filename" />
+      </p>
+    </metal:block>
+
+  </tal:block>
+
+</tal:block>
