Index: /WAeUP_SRP/trunk/skins/waeup_academics/faculty_contents.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_academics/faculty_contents.pt	(revision 306)
+++ /WAeUP_SRP/trunk/skins/waeup_academics/faculty_contents.pt	(revision 306)
@@ -0,0 +1,135 @@
+<metal:html tal:define="display_change request/change_display|nothing;
+                        params here/getDisplayParams;
+                        sort_by params/sort_by;
+                        direction params/direction;
+                        format string:detail_tab;
+                        displayed python:request.get('displayed', None);
+                       ">
+
+<metal:body use-macro="here/content_lib_master/macros/master">
+
+<metal:header metal:fill-slot="header">
+  <h1 tal:content="here/title_or_id">
+    Page Title
+  </h1>
+  <div tal:condition="nothing" id="bylineFolder"
+    class="ddefault">
+    <small>
+      <span metal:use-macro="here/content_lib_byline/macros/byline">By Me</span>
+    </small>
+  </div>
+  <a href="" accesskey="V"
+     style="display:none"
+     tal:attributes="href string:${context_url}/"></a>
+  <a href="" accesskey="N"
+     style="display:none"
+     tal:attributes="href string:${context_url}/folder_factories"></a>
+  <div style="text-align: right" tal:condition="python: False and (not here.isInWorkspace() or (here.isInWorkspace() and sort_by))">
+    <form action="" method="post"
+          tal:attributes="action string:${here_url}/changeDisplayParams">
+      <p>
+      <tal:block condition="python:not here.isInWorkspace()">
+        <metal:params use-macro="here/content_lib_display_params_form/macros/display_params_form" />
+        <input type="submit" value="button_apply" class="standalone"
+             i18n:attributes="value" />
+      </tal:block>
+      <tal:block condition="python:here.isInWorkspace() and sort_by">
+        <input type="hidden" name="display_order" value="None" />
+        <input type="submit" value="label_none" class="standalone"
+             i18n:attributes="value" />
+      </tal:block>
+      </p>
+    </form>
+  </div>
+</metal:header>
+
+<metal:main fill-slot="javascript_head_slot">
+  <tal:block tal:replace="nothing">
+    XXX Deactivated for CPS 3.4.0, will be re-enabled for 3.4.1
+    <script type="text/javascript" src="prototype.js"
+      tal:attributes="src string:${base_url}prototype.js"></script>
+    <script type="text/javascript" src="effects.js"
+      tal:attributes="src string:${base_url}effects.js"></script>
+    <script type="text/javascript" src="dragdrop.js"
+      tal:attributes="src string:${base_url}dragdrop.js"></script>
+    <script type="text/javascript" src="cpsdefault.js"
+      tal:attributes="src string:${base_url}cpsdefault.js"></script>
+  </tal:block>
+</metal:main>
+
+<metal:main fill-slot="main"
+  tal:define="list_here python:checkPerm('List folder contents', here);">
+
+  <div tal:condition="not: list_here"
+    tal:define="response request/RESPONSE;url here_url;">
+    <span tal:define="redirect python: response.redirect(url)"></span>
+  </div>
+
+  <form action="" method="post" class="group"
+        tal:attributes="action here_url"
+        tal:define="no_form python:not checkPerm('Modify portal content', here);
+
+                    nav_action string:folder_contents;
+                    items python:here.getFolderContents(displayed=displayed);">
+
+    <metal:block use-macro="here/academics_content_lib_display_contents/macros/display_contents" />
+
+    <table width="100%" cellspacing="0" cellpadding="2"
+      summary="contents of the folder"
+      class="folderButtons"
+      tal:define="can_add python:checkPerm('Add portal content', here);
+                  can_del python:checkPerm('Delete objects', here);">
+      <tr>
+        <td align="left" valign="top" rowspan="3"></td>
+        <td align="left" valign="top">
+          <span tal:condition="items">
+            <input 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'))" />
+          </span>
+          <span tal:condition="python: False and can_add">
+            <input type="submit" name="folder_cut:method" value="button_cut"
+                   class="context" i18n:attributes="value"
+                   tal:condition="can_del" />
+            <input type="submit" name="folder_copy:method" value="button_copy"
+              class="context" i18n:attributes="value" />
+          </span>
+          <span tal:condition="python:False and can_add and here.cb_dataValid()">
+            <input type="submit" name="folder_paste:method" value="button_paste"
+              class="context" i18n:attributes="value" />
+          </span>
+          <span tal:condition="can_del">
+            <input type="submit" name="folder_rename_form:method"
+              class="context" value="button_rename" 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'), )" />
+          </span>
+        </td>
+      </tr>
+      <tr tal:define="isWsManager python:checkPerm('Change subobjects order',
+                                                   here);"
+          tal:condition="python:False and isWsManager and sort_by is None">
+        <td>
+          <input type="submit" value="button_move_up" class="context moveUp"
+                 i18n:attributes="value" name="moveItemsUp:method" />
+          <input type="submit" value="button_move_down" class="context moveDown"
+                 i18n:attributes="value" name="moveItemsDown:method" />
+          <input type="submit" value="button_move_top" class="context moveTop"
+                 i18n:attributes="value" name="moveItemsTop:method" />
+          <input type="submit" value="button_move_bottom"
+                 class="context moveBottom"
+                 i18n:attributes="value" name="moveItemsBottom:method" />
+        </td>
+      </tr>
+    </table>
+  </form>
+</metal:main>
+
+<metal:sub fill-slot="sub"/>
+
+</metal:body>
+</metal:html>
Index: /WAeUP_SRP/trunk/skins/waeup_academics/faculty_edit.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_academics/faculty_edit.py	(revision 306)
+++ /WAeUP_SRP/trunk/skins/waeup_academics/faculty_edit.py	(revision 306)
@@ -0,0 +1,59 @@
+## Script (Python) "cpsdocument_edit"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=REQUEST, cluster=None, cpsdocument_edit_and_view_button=None, action=None
+##title=
+##
+# $Id: cpsdocument_edit.py 33302 2006-02-22 15:57:11Z tziade $
+"""
+Called when a document form is posted.
+
+Validates data, then:
+
+ - if there's no error, updates the object and redirects to it,
+
+ - if there's an error, puts data in session and redirects to edit form.
+
+A form uid is propagated during the redirect to uniquely identify the
+form in the session.
+"""
+
+from urllib import urlencode
+from Products.CPSDocument.utils import getFormUidUrlArg
+
+# Until ajax posts directly to its own script...
+if 'ajax_edit' in REQUEST.form:
+    return context.cpsdocument_edit_ajax(REQUEST, cluster=cluster)
+
+# Check flexible controls
+context.editLayouts(REQUEST=REQUEST)
+
+# Validate the document and write it if it's valid
+# (We don't call getEditableContent here, validate does it when needed.)
+doc = context.getContent()
+is_valid, ds = doc.validate(request=REQUEST, proxy=context, cluster=cluster,
+                            use_session=True)
+
+if action is None:
+    ti = doc.getTypeInfo()
+    action = ti.queryMethodID('edit', 'cpsdocument_edit_form')
+    action = '/' + action
+
+if is_valid:
+    comments = REQUEST.get('comments')
+    context.cpsdocument_notify_modification(comments=comments)
+    if cpsdocument_edit_and_view_button is not None:
+        action = ''
+    psm = 'psm_content_changedddd'
+    args = {}
+else:
+    psm = 'psm_content_error'
+    args = getFormUidUrlArg(REQUEST)
+
+args['portal_status_message'] = psm
+#url = context.absolute_url() + action + '?' + urlencode(args)
+url = context.portal_url() + "/srp/campus/academics/"
+REQUEST.RESPONSE.redirect(url)
Index: /WAeUP_SRP/trunk/skins/waeup_academics/faculty_edit_form.pt
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_academics/faculty_edit_form.pt	(revision 306)
+++ /WAeUP_SRP/trunk/skins/waeup_academics/faculty_edit_form.pt	(revision 306)
@@ -0,0 +1,130 @@
+<tal:block define="
+    rendered_main python:here.cpsdocument_edit_render(request=request);
+    form_action string:faculty_edit;
+    creation python:False;
+    edition python:True;
+    metadata metadata|nothing;
+    ">
+<metal:block define-macro="edit_form">
+<metal:block use-macro="here/content_lib_master/macros/master">
+  <metal:block fill-slot="style_slot">
+    <link rel="Stylesheet" type="text/css" href=""
+      tal:attributes="href string:${base_url}document.css" />
+
+    <metal:block define-macro="widgets_javascript">
+    <!-- XXX this has to move to CPSSchemas -->
+    <style type="text/css"
+      tal:content="string:@import url(${base_url}calendar-win2k-1.css);"></style>
+    <script type="text/javascript" src="calendar.js"
+      tal:attributes="src string:${base_url}calendar.js"></script>
+    <script type="text/javascript" src="lang/calendar-en.js"
+      tal:define="local cpsmcat/getSelectedLanguage"
+      tal:attributes="src string:${base_url}lang/calendar-${local}.js"></script>
+    <script type="text/javascript" src="calendar-setup.js"
+      tal:attributes="src string:${base_url}calendar-setup.js"></script>
+    <script type="text/javascript" src="prototype.js"
+      tal:attributes="src string:${base_url}prototype.js"></script>
+    <script type="text/javascript" src="effects.js"
+      tal:attributes="src string:${base_url}effects.js"></script>
+    <script type="text/javascript" src="controls.js"
+      tal:attributes="src string:${base_url}controls.js"></script>
+    <script type="text/javascript" src="cpsdocument.js"
+      tal:attributes="src string:${base_url}cpsdocument.js"></script>
+    <tal:block condition="python:modules['Products.CPSUtil.integration'].isProductPresent('Products.FCKeditor')">
+      <script type="text/javascript">
+        var popup_editor_form = 'popup_fckeditor_form';
+        var width = 640;
+        var height = 520;
+      </script>
+    </tal:block>
+    <tal:block condition="python:modules['Products.CPSUtil.integration'].isProductPresent('Products.Epoz')">
+      <script type="text/javascript">
+        var popup_editor_form = 'popup_rte_form';
+        var width = 640;
+        var height = 480;
+      </script>
+    </tal:block>
+    <script type="text/javascript">
+     function popup_rte(input_id, label_edit) {
+       var args, value;
+       value = document.getElementById(input_id).value;
+       args = '?input_id='+input_id+'&amp;label_edit='+escape(label_edit);
+       str_window_features = 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,dependent=1,width=' + width + ',height=' + height;
+       popup = window.open(popup_editor_form + args, input_id, str_window_features);
+       if (!popup.opener) {
+         popup.opener = window;
+       }
+       return false;
+     }
+   </script>
+   </metal:block>
+  </metal:block>
+
+  <metal:block fill-slot="header">
+    <h1 tal:condition="creation" i18n:translate="">
+      Create a document of type
+      <tal:block i18n:name="type_name" i18n:translate=""
+            tal:define="type_name request/type_name;
+                        type_info python:here.portal_types[type_name]"
+            tal:content="type_info/Title">Type Title</tal:block>
+    </h1>
+    <h1 tal:condition="not:creation">
+      <tal:block condition="python: edition and not metadata"
+        i18n:translate="">Edit <span id="page_title" i18n:name="title"
+        tal:content="here/title_or_id">Page Title</span></tal:block>
+      <tal:block tal:condition="metadata"
+        i18n:translate="">Metadata of <span i18n:name="title" tal:content="here/title_or_id">Page Title</span></tal:block>
+    </h1>
+  </metal:block>
+
+  <metal:block fill-slot="main">
+    <form action="ACTION" method="post" id="editForm"
+          enctype="multipart/form-data" class="workflow"
+          tal:attributes="action form_action">
+      <div class="group">
+        <div class="documentFields">
+          <tal:block define="getFormUidHtml nocall:modules/Products.CPSDocument.utils/getFormUidHtml"
+                     replace="structure python:getFormUidHtml(request)"/>
+          <input type="hidden" name="type_name" value="VALUE"
+                 tal:condition="creation"
+                 tal:attributes="value request/type_name" />
+          <input type="hidden" id="button_placeholder" name="button_placeholder" value="" />
+          <div id="rendered_main" tal:content="structure rendered_main">
+            CONTENT
+          </div>
+        </div>
+
+        <tal:block condition="not:creation">
+          <div class="tooltipArea" style="visibility: hidden;"
+               id="transition_comments_help"
+               onclick="showElement(false, 'transition_comments_help')"
+               i18n:translate="help_transition_comments_modification">
+            In this field you can give the reason for the modification
+            on this document. Your comments may be used to notify other users.
+          </div>
+          <dl>
+            <dt><label for="comments"
+                       i18n:translate="transition_comments_modification"
+                       >Reason of the modification</label>
+              <button type="button" class="tooltipControl"
+                      onclick="toggleElementVisibility('transition_comments_help')"> ? </button>
+            </dt>
+            <dd>
+              <textarea name="comments" id="comments" cols="60" rows="3"
+                        tal:content="nothing">
+              </textarea>
+            </dd>
+          </dl>
+        </tal:block>
+
+        <metal:block use-macro="here/cpsdocument_edit_buttons/macros/buttons"/>
+      </div>
+    </form>
+    <div id="ajax_psm" style="display:none">
+      ajax feedback
+    </div>
+  </metal:block>
+
+</metal:block>
+</metal:block>
+</tal:block>
Index: /WAeUP_SRP/trunk/skins/waeup_custom/getContentInfo.py
===================================================================
--- /WAeUP_SRP/trunk/skins/waeup_custom/getContentInfo.py	(revision 306)
+++ /WAeUP_SRP/trunk/skins/waeup_custom/getContentInfo.py	(revision 306)
@@ -0,0 +1,321 @@
+## Script (Python) "getContentInfo"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=proxy=None, doc=None, level=0, cpsmcat=None
+##title=
+##
+# $Id: getContentInfo.py 31903 2006-01-21 23:50:55Z fguillaume $
+"""
+Return information about a content item (ie a proxy)
+
+level: 0 (default cost 1)
+  id, title, title_or_id, review_state, icon, rev, lang, type
+  time_str, creator, rpath, url
+level: 1 (cost 1.3)
+  level 0 + descr, size + doc + additional information from obj
+level: 2 (cost 4.6)
+  level 1 + states
+level: 3 (cost 7)
+  level 2 + history
+level: 4 (cost ???)
+  level 3 + archived
+"""
+
+from zLOG import LOG, DEBUG
+from Products.CMFCore.utils import getToolByName
+from AccessControl import Unauthorized
+
+# how many characters for the description
+DESCRIPTION_MAX_LENGTH = 150
+
+if cpsmcat is None:
+    cpsmcat = context.translation_service
+
+if proxy is None:
+    proxy = context
+
+wtool = getToolByName(context, 'portal_workflow')
+utool = getToolByName(context, 'portal_url')
+ptool = getToolByName(context, 'portal_proxies')
+mtool = getToolByName(context, 'portal_membership')
+portal = utool.getPortalObject()
+
+rpath = None
+if hasattr(proxy.aq_explicit, 'getRID'):
+    # this is a brain
+    # rpath is build with catalog path that include languageView selection
+
+    # FIXME: something is broken here when using virtual host monsters
+    rpath = utool.getRpathFromPath(proxy.getPath())
+
+    # change view to switch to have a sticky behaviour
+    from Products.CPSCore.utils import KEYWORD_SWITCH_LANGUAGE, \
+         KEYWORD_VIEW_LANGUAGE
+    rpath = rpath.replace(KEYWORD_VIEW_LANGUAGE, KEYWORD_SWITCH_LANGUAGE)
+    proxy = proxy.getObject()
+
+bmt = getattr(portal, 'Benchmarktimer', None)
+if bmt is not None:
+    bmt = bmt('getContentInfo for ' + proxy.getId(), level=-3)
+    bmt.setMarker('start')
+
+def getRpathTitle(rpath):
+    """Get object's title, or None if Unauthorized or nonexisting."""
+    try:
+        ob = portal.restrictedTraverse(rpath, None)
+        if ob is None:
+            return None
+        return ob.Title()
+    except Unauthorized:
+        return None
+
+
+def compute_states(no_history=0):
+    wf_vars = ['review_state', 'time']
+    docid = proxy.getDocid()
+    if docid:
+        proxies_info = ptool.getProxyInfosFromDocid(docid,
+                                                    workflow_vars=wf_vars)
+    else:
+        # Not a proxy
+        ob_info = {
+            'rpath': utool.getRpath(proxy),
+            'language_revs': {'en': 0},
+            'visible': mtool.checkPermission('View', proxy),
+            }
+        for var in wf_vars:
+            ob_info[var] = wtool.getInfoFor(proxy, var, None)
+        proxies_info = [ob_info]
+    states = []
+    for proxy_info in proxies_info:
+        # take in account only accessible proxies
+        if not proxy_info['visible']:
+            continue
+
+        lrpath = proxy_info['rpath'].split('/')
+        folder_rpath = '/'.join(lrpath[:-1])
+        folder_title = getRpathTitle(folder_rpath)
+        if not folder_title:
+            # Unauthorized
+            if len(lrpath) > 1:
+                folder_title = lrpath[-2]
+            else:
+                folder_title = '?'
+
+        proxy_info_proxy = None
+        portal_type = None
+        if proxy_info.has_key('object'):
+            proxy_info_proxy = proxy_info['object']
+            if hasattr(proxy_info_proxy, 'portal_type'):
+                portal_type = proxy_info_proxy.portal_type
+
+        d = {'rpath': folder_rpath,
+             'title': folder_title,
+             'type': portal_type,
+             'review_state': proxy_info['review_state'],
+             'rev': str(proxy_info['language_revs'].values()[0]),
+             'language': proxy_info['language_revs'].keys()[0],
+             'time': proxy_info['time'],
+             'time_str': context.getDateStr(proxy_info['time']),
+             'proxy': proxy_info_proxy,
+             }
+        d['lang'] = d['language']       # for compatibility
+        states.append(d)
+
+    history = []
+    if not no_history:
+        review_history = wtool.getFullHistoryOf(proxy)
+        if not review_history:
+            review_history = wtool.getInfoFor(proxy, 'review_history', ())
+            remove_redundant = 0
+        else:
+            remove_redundant = 1
+        for d in review_history:
+            if not (d.has_key('actor')
+                    and d.has_key('time')
+                    and d.has_key('action')):
+                continue
+            action = d['action']
+            # Internal transitions hidden from the user.
+            if action in ('unlock', 'checkout_draft_in'):
+                continue
+            # Skip redundant history (two transition when publishing).
+            if action == 'copy_submit' and remove_redundant:
+                continue
+            # Transitions involving a destination container.
+            if action in ('submit', 'copy_submit'):
+                d['has_dest'] = 1
+                dest_container = d.get('dest_container') or '?'
+                d['dest_container'] = dest_container
+                dest_title = getRpathTitle(dest_container)
+                if not dest_title:
+                    # Unauthorized
+                    dest_title = dest_container.split('/')[-1]
+                d['dest_title'] = dest_title
+            d['time_str'] = context.getDateStr(d['time'])
+            history.append(d)
+
+    def cmp_rs(a, b):
+        return -cmp(a['review_state'], b['review_state'])
+    states.sort(cmp_rs)
+
+    def cmp_date(a, b):
+        return -cmp(a['time'], b['time'])
+    history.sort(cmp_date)
+
+    return states, history
+
+def compute_archived():
+    archived = proxy.getArchivedInfos()
+    # Keep only frozen revisions.
+    archived = [d for d in archived if d['is_frozen']]
+    archived.reverse()
+    for d in archived:
+        d['time_str'] = context.getDateStr(d['modified'])
+    return archived
+
+# basic information level 0
+info = {}
+if rpath is None:
+    info['rpath'] = utool.getRpath(proxy)
+else:
+    info['rpath'] = rpath
+
+info['url'] = utool.getUrlFromRpath(info['rpath'])
+
+info['title_or_id'] = proxy.title_or_id()
+info['id'] = proxy.getId()
+try:
+    info['title'] = proxy.Title()
+except AttributeError:
+    raise AttributeError, 'invalid object: %s in %s' % (info['title_or_id'],
+                                                        info['rpath'])
+info['icon'] = proxy.getIcon(relative_to_portal=1)
+info['type'] = proxy.getPortalTypeName()
+
+if proxy.getTypeInfo() is not None:
+    info['type_l10n'] = cpsmcat(proxy.getTypeInfo().Title())
+else:
+    LOG("getContentInfo() pb getting Type Information",
+        DEBUG,
+        'Proxy :',
+        proxy)
+    info['type_l10n'] = ''
+info['review_state'] = wtool.getInfoFor(proxy, 'review_state', '')
+try:
+    info['rev'] = str(proxy.getRevision())
+    info['lang'] = proxy.getLanguage()
+except AttributeError:
+    # not a proxy
+    # FIXME: default lang should not be hardcoded
+    info['rev'] = '0'
+    info['lang'] = 'en'
+info['time'] = proxy.modified()
+
+# level 1
+if level > 0:
+    if doc is None:
+        doc = proxy.getContent()
+    info['time'] = doc.modified()
+    info['doc'] = doc
+    if hasattr(doc,"LongTitle"):
+        info['long_title'] = doc.LongTitle()
+    description = doc.Description() or ''
+    if len(description) > DESCRIPTION_MAX_LENGTH:
+        description = description[:DESCRIPTION_MAX_LENGTH] + '...'
+    info['description'] = description
+    if hasattr(doc.aq_explicit, 'get_size'):
+        try:
+            size = doc.get_size()
+        except:
+            size = 0
+
+        if size and size < 1024:
+            info['size'] = '1 K'
+        elif size > 1048576:
+            info['size'] = '%.02f M' % float(size/1048576.0)
+        elif size:
+            info['size'] = str(int(size)/1024)+' K'
+
+    if hasattr(doc.aq_explicit, 'start'):
+        if callable(doc.start):
+            start = doc.start()
+        else:
+            start = doc.start
+        if start:
+            info['start'] = start
+            info['start_str'] = context.getDateStr(start)
+
+    if hasattr(doc.aq_explicit, 'end'):
+        if callable(doc.end):
+            end = doc.end()
+        else:
+            end = doc.end
+        if end:
+            info['end'] = end
+            info['end_str'] = context.getDateStr(end)
+
+    for dc in ('Creator', 'Rights', 'Language',
+               'contributors', 'source', 'relation', 'coverage'):
+        key = dc.lower()
+        if key == 'contributors':
+            key = 'contributor'         # this is the real DC name
+        try:
+            meth = getattr(doc, dc)
+            if callable(meth):
+                value = meth()
+            else:
+                value = meth
+            if value and not same_type(value, ''):
+                value = ', '.join(value)
+            info[key] = value
+        except:
+            info[key] = ''
+
+    if hasattr(doc.aq_explicit, 'hidden_folder'):
+        info['hidden'] = doc.hidden_folder
+    else:
+        info['hidden'] = 0
+
+    if hasattr(doc.aq_explicit, 'getAdditionalContentInfo'):
+        add_info = doc.getAdditionalContentInfo(proxy)
+        info.update(add_info)
+
+    if info['review_state'] == 'published':
+        now = context.ZopeTime()
+        eff = doc.effective()
+        exp = doc.expires()
+        if now < eff:
+            info['review_state'] = 'deferred'
+            info['review_state_date'] = context.getDateStr(eff)
+        elif now > exp:
+            info['review_state'] = 'expired'
+            info['review_state_date'] = context.getDateStr(exp)
+
+# level 2
+if level == 2:
+    info['states'], ignore = compute_states(1)
+
+# level 3
+if level >= 3:
+    info['states'], info['history'] = compute_states()
+
+# level 4
+if level >= 4:
+    info['archived'] = compute_archived()
+
+info['level'] = level
+if info['time']:
+    info['time_str'] = context.getDateStr(info['time'])
+else:
+    info['time_str'] = ''
+
+
+if bmt is not None:
+    bmt.setMarker('stop')
+    bmt.saveProfile(context.REQUEST)
+
+return info
