[CMF-checkins] CVS: CMF/CMFCollector/skins/collector - collector_add_issue.py:1.1 collector_add_issue_form.pt:1.1 collector_contents.pt:1.1 collector_edit.py:1.1 collector_edit_form.pt:1.1 collector_issue_add_artifact.py:1.1 collector_issue_add_artifact_form.pt:1.1 collector_issue_add_issue.py:1.1 collector_issue_cite_comment.py:1.1 collector_issue_comment_header.py:1.1 collector_issue_contents.pt:1.1 collector_issue_edit.py:1.1 collector_issue_edit_form.py:1.1 collector_issue_followup.py:1.1 collector_issue_followup_form.pt:1.1 collector_issue_reject.py:1.1 collector_issue_up.py:1.1 collector_localrole_edit.py:1.1 collector_macros.pt:1.1 collector_transcript_view.py:1.1

Ken Manheimer klm@zope.com
Wed, 10 Oct 2001 15:14:59 -0400


Update of /cvs-repository/CMF/CMFCollector/skins/collector
In directory cvs.zope.org:/tmp/cvs-serv7316/skins/collector

Added Files:
	collector_add_issue.py collector_add_issue_form.pt 
	collector_contents.pt collector_edit.py collector_edit_form.pt 
	collector_issue_add_artifact.py 
	collector_issue_add_artifact_form.pt 
	collector_issue_add_issue.py collector_issue_cite_comment.py 
	collector_issue_comment_header.py collector_issue_contents.pt 
	collector_issue_edit.py collector_issue_edit_form.py 
	collector_issue_followup.py collector_issue_followup_form.pt 
	collector_issue_reject.py collector_issue_up.py 
	collector_localrole_edit.py collector_macros.pt 
	collector_transcript_view.py 
Log Message:
Initial baseline.

  - Content types: Collector, CollectorIssue, (virtual)
    CollectorIssueTranscript, with python and skins.  (Almost all
    skins methods are ZPT or python scripts).

  - External method install script (Extensions/InstallCollector.py).

  - Install instructions (INSTALL.txt)

  - Pending issues (TODO.txt)



=== Added File CMF/CMFCollector/skins/collector/collector_add_issue.py ===
## Script (Python) "collector_add_issue.py"
##parameters=submitter, email, title, security_related, topic, importance, classification, severity, description, reported_version, other_version_info
##title=Submit a Request

id = context.add_issue(submitter=submitter,
                       email=email,
                       title=title,
                       description=description,
                       security_related=security_related,
                       topic=topic,
                       importance=importance,
                       classification=classification,
                       severity=severity,
                       reported_version=reported_version,
                       other_version_info=other_version_info)

context.REQUEST.RESPONSE.redirect("%s/%s" % (context.absolute_url(), id))



=== Added File CMF/CMFCollector/skins/collector/collector_add_issue_form.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">

<span tal:replace="nothing">
  Template description: Form for submitting new collector issues.
</span>

<body>

<div metal:fill-slot="header">

  <div metal:use-macro="here/collector_macros/macros/collector_header">
    COLLECTOR HEADER
  </div>

</div>

<div metal:fill-slot="main">	  

  <h2> Submit New Issue </h2>
 
  <div tal:define="member python:
                          here.portal_membership.getAuthenticatedMember()">

    <form action="collector_add_issue" method="post">
      <table class="FormLayout">

       <tr valign="top">
        <th align="right"> Issue Title </th>
        <td>
         <input type="text" name="title" value="" size="40">
        </td>
        <th valign="top"> Security Related? </th>
        <td valign="top">
          <table>
            <tr>
              <td>
              <input type=hidden name="security_related:boolean" value=""/>
              <input type=checkbox name="security_related:boolean"/>
              </td>
              <td>
                <font size="-1" color="gray">
                  If checked, will <em>not</em> be publicly visible until
                  vetted. 
                </font>
              </td>
            </tr>
          </table>
        </td>
       </tr>

       <tr>
        <th valign="middle" align="right"> Submitter </th>
        <td>
         <input type="text" name="submitter" value=""
           tal:attributes="value python: getattr(member, 'full_name', '')"
                size="20">
        </td>
        <th valign="middle" align="right"> Email
        </th>
        <td>
         <input type="text" name="email" value=""
           tal:attributes="value python: getattr(member, 'email', '')"
                size="20">
        </td>
       </tr>
       <tr>
        <td> &nbsp;
        </td>
       </tr>

       <tr valign="top">
        <th align="right"> Topic </th>
        <td>
          <table>
            <tr>
              <td>
                <select name="topic">
                  <option value=""
                          tal:repeat="it here/topics"
                          tal:attributes="value it"
                          tal:content="it"></option>
                </select>
                <th align="right"> Version </th>
                <td>
                 <select name="reported_version">
                   <option value=""
                           tal:repeat="it here/versions"
                           tal:attributes="value it"
                           tal:content="it"></option>
                 </select>
                </td>
              </tr>
            </table>
        </td>
        <th align="right"> Importance </th>
        <td>
         <select name="importance">
           <option value=""
                   tal:repeat="it here/importances"
                   tal:attributes="value it"
                   tal:content="it"></option>
         </select>
        </td>
       </tr>

       <tr valign="top">
        <th align="right"> Classification </th>
        <td>
         <select name="classification">
           <option value=""
                   tal:repeat="it here/classifications"
                   tal:attributes="value it"
                   tal:content="it"></option>
         </select>
        </td>
        <th align="right"> Severity </th>
        <td>
         <select name="severity">
           <option value=""
                   tal:repeat="it here/severities"
                   tal:attributes="value it"
                   tal:content="it"></option>
         </select>
        </td>
       </tr>

       <tr valign="top">
        <th align="right"> </th>
        <td colspan=3>
          <font color="gray" size="-1">
            Provide enough pertinent details so the supporters can pinpoint
            your problem.  You'll be able to upload related files and images
            once the issue is submitted.
          </font>
        </td>

       <tr valign="top">
          <th align="right"> Description </th>
          <td colspan="3">
            <textarea name="description:text" rows="8" cols="60"></textarea>
          </td>
       </tr>

       <tr>
        <th > Other Version Info </th>
        <td>
            <textarea name="other_version_info" rows="3" cols="30"></textarea>
        </td>
        <td colspan="2">
          <font color="gray">
            <span tal:replace="here/other_versions_spiel"></span>
          </font>
        </td>
       </tr>

       <tr valign="top">
        <td> <br> </td>
        <td>
         <input type="submit" value=" Submit ">
        </td>
       </tr>

      </table>
    </form>
  </div>

</div>
</body>
</html>


=== Added File CMF/CMFCollector/skins/collector/collector_contents.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">

<span tal:replace="nothing">
  Template description: Batching view of the collector issues.
</span>

<body>

<div metal:fill-slot="header">

  <div metal:use-macro="here/collector_macros/macros/collector_header">
    COLLECTOR HEADER
  </div>

</div>

<div metal:fill-slot="main">

<!-- This is the desktop area -->
<div class="Desktop"
     tal:define="Batch python:modules['ZTUtils'].Batch;
                 pysutil modules/Products.PythonScripts.standard;
                 strmod modules/string;
                 cap nocall: strmod/capitalize;
                 DateTime nocall: modules/DateTime/DateTime;
                 BATCHSIZE python: 10;
                 TITLELEN python: 35;
                 DESCRLEN python: 120;
                 b_start python: request.get('b_start', 0);
                 items python: here.listFolderContents();
                 batch python:
                    Batch(items, BATCHSIZE, int(b_start), orphan=0);
                 prev batch/previous;
                 next batch/next|nothing;
                 last_batch python: max(int(here.length()) - BATCHSIZE, 1)">

  <form action="" METHOD="POST"
        tal:attributes="action here/absolute_url">

    <div metal:use-macro="here/collector_macros/macros/issue_batch_nav">
      ISSUE-BATCH NAVIGATION
    </div>

    <table class="FormLayout">
      <tbody tal:repeat="item batch">
        <tr valign="top">
          <td tal:define="icon item/getIcon|item/icon|nothing">
             <a href=""
                tal:attributes="href python: item.absolute_url()">
                <img src="" alt="" border="0"
                     tal:condition="icon"
                     tal:attributes="src python: here.portal_url()
                                                 + '/' + icon;
                                     alt item/Type|nothing"></a>
          </td>
          <td NOWRAP>
            <a href=""
               tal:attributes="href python: item.absolute_url()">
              <span tal:replace="item/getId">ID</span>
              <b><span tal:condition="item/Title"
                       tal:replace="python:
                                     item.Title()[:TITLELEN]
                                    + (item.Title()[TITLELEN:] and '...')">
              TITLE</span></b></a>
          <br>
            <span tal:condition="item/security_related">
              <font color="red">Security</font></span>
            <span tal:content="python: cap(item.current_status)">
            STATUS</span>
            <span tal:replace="python: '%s/%s'
                                       % (cap(item.topic),
                                          cap(item.classification))">
             TOPIC/CLASSIFICATION</span>
          </td>
          <td NOWRAP
              tal:define="numcmts python: item.comment_number;
                          plrlcmts python: (numcmts != 1) and 's' or '';
                          numarts python: len(item.objectIds())-1;
                          plrlarts python: (numarts != 1) and 's' or ''">
            <span tal:condition="numcmts">
              <span tal:replace="numcmts">NUM COMMENTS</span>
              followup<span tal:replace="plrlcmts">S?</span>
            </span>
            <span tal:condition="not: numcmts"
                  tal:replace="nothing"></span>

              <div tal:condition="numarts">
                <span tal:replace="numarts">NUM ARTIFACTS</span>
                upload<span tal:replace="plrlarts">S?</span>
              </div>
          </td>
          <td NOWRAP
              tal:define="crdate python: item.creation_date.aCommon();
                       moddate python:
                            DateTime(item.ModificationDate()).aCommon()">
            <span tal:replace="crdate">CREATEDATE</span>
            <div tal:condition="python: crdate != moddate">
              Last Mod: <span tal:replace="moddate">MODDATE</span>
            </div>
          </td>
        </tr>

        <tr tal:condition="item/description">
          <td>
          </td>
          <td colspan="6">
            <font color="gray"
                  tal:content="python: item.description[:DESCRLEN]
                               + (item.description[DESCRLEN:] and '...')">
            DESCRIPTION</font>
          </td>
        </tr>
      </tbody>
    </table>

    <div metal:use-macro="here/collector_macros/macros/issue_batch_nav">
      ISSUE-BATCH NAVIGATION
    </div>

  </form>
</div>
</div>
</body>
</html>



=== Added File CMF/CMFCollector/skins/collector/collector_edit.py ===
## Script (Python) "collector_edit.py"
##parameters=title, description, supporters, topics, classifications, importances, severities, versions, other_versions_spiel
##title=Configure Collector
 
changed = context.edit(title=title,
                       description=description,
                       supporters=supporters,
                       topics=topics,
                       classifications=classifications,
                       importances=importances,
                       severities=severities,
                       versions=versions,
                       other_versions_spiel=other_versions_spiel)

qst='?portal_status_message=Configuration+%s.' % ((changed and "changed")
                                                  or "unchanged")
 
context.REQUEST.RESPONSE.redirect(context.absolute_url() + qst )



=== Added File CMF/CMFCollector/skins/collector/collector_edit_form.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">

<span tal:replace="nothing">
  Template description: Form for configuring the collector.
</span>

<body>

<div metal:fill-slot="header">

  <div metal:use-macro="here/collector_macros/macros/collector_header">
    COLLECTOR HEADER
  </div>

</div>

<div metal:fill-slot="main">	  
<h2> Configure Collector </h2>
 
<form action="collector_edit" method="post">
<table class="FormLayout">
 
 <tr valign="top">
  <th align="right"> Title
  </th>
  <td colspan="3">
   <input type="text"
          name="title"
          value=""
     tal:attributes="value here/title"
          size="65">
  </td>
  
 <tr valign="top">
  <th align="right"> Description
  </th>
  <td colspan="3">
   <textarea name="description:text" rows="3"
             cols="50"
       tal:content="here/description">
   </textarea>
  </td>
 </tr>
  
 <tr valign="top">
  <th align="right"> Supporters
  </th>
  <td colspan="3">
<!-- If there's no 'supporters' attribute, we're creating the collector,
     so include the creator as the default set of supporters -->
   <textarea name="supporters:lines" rows="5" cols="15">
<span tal:repeat="it here/supporters" tal:replace="it"></span>
</textarea>
  </td>
 </tr>
  
 <tr valign="top">
  <th align="right"> Issue Topics
  </th>
  <td>
   <textarea name="topics:lines" rows="5" cols="15">
<span tal:repeat="it here/topics|nothing" tal:replace="it"></span></textarea>
  </td>
  <th align="right"> Issue Classifications
  </th>
  <td>
   <textarea name="classifications:lines" rows="5" cols="15">
<span tal:repeat="it here/classifications|nothing" tal:replace="it">
</span></textarea>
  </td>
 </tr>
  
 <tr valign="top">
  <th align="right"> Issue Importances
  </th>
  <td>
   <textarea name="importances:lines" rows="5" cols="15">
<span tal:repeat="it here/importances|nothing" tal:replace="it">
</span></textarea>
  </td>
  <th align="right"> Issue Severities
  </th>
  <td>
   <textarea name="severities:lines" rows="5" cols="15">
<span tal:repeat="it here/severities|nothing" tal:replace="it">
</span></textarea>
  </td>
 </tr>
  
 <tr valign="top">
  <th align="right"> Product Versions
  </th>
  <td>
   <textarea name="versions:lines" rows="5" cols="15">
<span tal:repeat="it here/versions|nothing" tal:replace="it">
</span></textarea>
  </td>
  <td colspan=2>
    <b> Other Versions Spiel </b>
    <font size="-1" color="gray"> Prompt text for new-issue form... </font>
    <br> 
   <textarea name="other_versions_spiel:text" rows="4" cols="33">
<span tal:replace="here/other_versions_spiel|nothing">
</span></textarea>
  </td>
 </tr>

 <tr valign="top">
  <td> <br> </td>
  <td>
   <input type="submit" value=" Change ">
  </td>
 </tr>
 
</table>
</form>
</div>
</body>
</html>


=== Added File CMF/CMFCollector/skins/collector/collector_issue_add_artifact.py ===
## Script (Python) "collector_issue_add_artifacts.py"
##parameters=id, type, description, file
##title=Submit a Request

from Products.PythonScripts.standard import html_quote, url_quote_plus

typeinfo = context.portal_types.getTypeInfo('Collector Issue')
artifacts = typeinfo.getActionById('artifacts')

context.add_artifact(id, type, description, file)

msg = url_quote_plus("'%s' added ..." % id)

context.REQUEST.RESPONSE.redirect("%s/%s?%s" %
                                  (context.absolute_url(), artifacts, msg))


=== Added File CMF/CMFCollector/skins/collector/collector_issue_add_artifact_form.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">

<span tal:replace="nothing">
  Template description: Form for adding issue artifacts.
</span>

<body>

<div metal:fill-slot="header">

  <div metal:use-macro="here/collector_macros/macros/issue_header">
    ISSUE HEADER
  </div>

</div>

<div metal:fill-slot="main">

  <!-- This is the desktop area -->

  <form method="POST" enctype="multipart/form-data"
        action="collector_issue_add_artifact">

    <div metal:fill-slot="content">

      <table>

        <tr>
          <td> </td>
          <th align="left"> Add Artifact </th>
        </tr>
        <tr>
          <th align="right"> Type </th>
          <td> <input type=radio name="type" value="File" checked> File
               <input type=radio name="type" value="Image"> image
        </tr>
        <tr>
          <th align="right"> Id </th>
          <td> <input type=text name="id"> </td>
        </tr>
        <tr>
          <th align="right"> Description </th>
          <td> <input type=text name="description" size="35"> </td>
        </tr>
        <tr>
          <th align="right"> File </th>
          <td> <input type=file name="file" size="35">
          </td>
        </tr>
        <tr>
          <th align="right">  </th>
          <td> <input type="submit" name="submit" value="Add Artifact">
        </tr>

      </table>

    </div>

  </form>

</div>
</body>
</html>


=== Added File CMF/CMFCollector/skins/collector/collector_issue_add_issue.py ===
## Script (Python) "collector_issue_add_issue.py"
##title=Submit a Request

typeinfo = context.portal_types.getTypeInfo('Collector')
addissue = typeinfo.getActionById('addissue')

context.REQUEST.RESPONSE.redirect("%s/%s"
                                  % (context.aq_parent.absolute_url(),
                                     addissue))



=== Added File CMF/CMFCollector/skins/collector/collector_issue_cite_comment.py ===
## Script (Python) "collector_issue_cite_comment.py"
##parameters=
##title=Redirect to issue contents with cite parameter
 
context.REQUEST.RESPONSE.redirect(context.absolute_url()
                                  + '?do_cite=1#comment')



=== Added File CMF/CMFCollector/skins/collector/collector_issue_comment_header.py ===
## Script (Python) "collector_issue_comment_header.py"
##title=Form the header for a new comment entry in an issue
##bind container=container
##bind context=context
##parameters=type

"""Return text for the header of a new comment entry in an issue."""

from DateTime import DateTime
import string
user = context.REQUEST.AUTHENTICATED_USER

if string.lower(type) == "comment":
    # We number the comments (sequence_number is incremented by add_comment)
    lead = "<hr> " + type + " #" + str(context.sequence_number)
else:
    # ... but don't number the other entries.
    lead = type

return "%s by %s on %s ==>" % (lead, str(user), DateTime().aCommon())
                                


=== Added File CMF/CMFCollector/skins/collector/collector_issue_contents.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">
<body>

<span tal:replace="nothing">
  Template description: Basic view of issue characteristics and transcript.
</span>

<div metal:fill-slot="header">

  <div metal:use-macro="here/collector_macros/macros/issue_header">

    ISSUE HEADER

  </div>

</div>

<div metal:fill-slot="main"
     tal:define="transcript here/get_transcript">

  <!-- lotsa stuff will appear here -->

  <div metal:fill-slot="content">

    <table>
      <tr>
        <th colspan="2" align="left">
           Transcript of Issue
             <span tal:replace="here/id">ID</span>
             (<em><span tal:replace="here/Title">TITLE</span></em>)
        </th>
      </tr>
      <tr>
        <td colspan="2">
          <table border="1">
            <tr> <td>
           <span tal:replace="structure
                     python: transcript.CookedBody(stx_level=3)">TRANSCRIPT
           </span>
            </td> </tr>
          </table>
        </td>
      </tr>
    </table>

  </div>

</div>

</body>
</html>


=== Added File CMF/CMFCollector/skins/collector/collector_issue_edit.py ===
## Script (Python) "collector_issue_edit.py"
##parameters=
##title=Submit a Request

REQUEST = context.REQUEST

import pdb; pdb.set_trace()

id = context.edit(comment=REQUEST.get('comment'),
                  status=REQUEST.get('status'),
                  submitter_name=REQUEST.get('submitter_name'),
                  title=REQUEST.get('title'),
                  description=REQUEST.get('description'),
                  attachments=REQUEST.get('attachments'),
                  security_related=REQUEST.get('security_related'),
                  topic=REQUEST.get('topic'),
                  importance=REQUEST.get('importance'),
                  classification=REQUEST.get('classification'),
                  severity=REQUEST.get('severity'),
                  reported_version=REQUEST.get('reported_version'),
                  other_version_info=REQUEST.get('other_version_info'))

context.REQUEST.RESPONSE.redirect("%s/collector_issue_contents"
                                  % context.absolute_url())



=== Added File CMF/CMFCollector/skins/collector/collector_issue_edit_form.py ===
## Script (Python) "collector_issue_edit_form.py"
##parameters=
##title=Redirect to issue contents with edit parameter
 
context.REQUEST.RESPONSE.redirect(context.absolute_url() + '?do_edit=1')



=== Added File CMF/CMFCollector/skins/collector/collector_issue_followup.py ===
## Script (Python) "collector_issue_followup.py"
##parameters=comment, action
##title=Submit a new comment.

context.portal_workflow.doActionFor(context,
                                    action,
                                    comment=comment)

attachments = context.REQUEST.get('attachments', [])
id = context.do_action(action, comment, attachments)

context.REQUEST.RESPONSE.redirect(context.absolute_url())


=== Added File CMF/CMFCollector/skins/collector/collector_issue_followup_form.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal"
      metal:use-macro="here/main_template/macros/master">
<body>

<span tal:replace="nothing">
  Template description: Form for entering new issue actions.
</span>

<div metal:fill-slot="header">

  <div metal:use-macro="here/collector_macros/macros/issue_header">

    ISSUE HEADER

  </div>

</div>

<div metal:fill-slot="main">

  <form method="POST" enctype="multipart/form-data"
        action="collector_issue_followup"
        tal:define="actionsd python:
                             here.portal_actions.listFilteredActionsFor(here);
                    wf_actions python:
                               [i['name'] for i in actionsd['workflow']]">

    <table>

      <tr>
        <th align="left">
          Followup
        </th>
        <td align="center">
          Click <a href="QUALIFIED" 
                   tal:attributes="href python: request.URL + '?do_cite=1'">
                here</a> for a copy of the transcript as cited text.
        </td>
      </tr>

      <tr>
        <td colspan="2">
          <strong> Action: </strong>
          <input type="radio" name="action" value="comment" CHECKED>
          Comment &nbsp;
          <span tal:repeat="action python:
                                  ['Accept', 'Resolve', 'Reject', 'Defer',
                                   'Declassify', 'Classify']">
            <input type="radio" name="action" value="VALUE"
                   tal:attributes="value action"
                   tal:condition="python: action in wf_actions"
            ><span tal:replace="action"
                   tal:condition="python: action in wf_actions">
            ACTION</span>&nbsp;
          </span>
        </td>
      </tr>

      <tr>
         <td colspan="2">
           <textarea name="comment" rows="10" cols="74" wrap="soft"
                     tal:content="python: (request.get('do_cite')
                                           and here.cited_text()) or ''">
</textarea>
        </td>
      </tr>

      <span tal:replace="nothing">
         (Comment: 'artifacts' is global in issue_header macro)
      </span>

      <tr tal:condition="artifacts">
        <td colspan="2">
          Check the artifacts whose URLs you want included in the change
          notice:
        </td>
      </tr>

      <tr tal:condition="artifacts">
        <td colspan="2">
          <span tal:repeat="item artifacts">
            <input type="checkbox" name="attachments:list" value="ID"
                   tal:attributes="value item/id">
            <a href="ITEM URL"
               tal:attributes="href python:item.absolute_url() + '/view'"
               tal:content="item/id">ITEM ID</a>&nbsp;&nbsp;
          </span>
        </td>
      </tr>

      <tr>
        <td align="center" colspan=2>
          <input type="submit" name="submit" value="Submit">
        </td>
      </tr>

    </table>

  </form>

</div>
</body>
</html>


=== Added File CMF/CMFCollector/skins/collector/collector_issue_reject.py ===
## Script (Python) "collector_issue_reject.py"
##title=Reject a collector issue

context.REQUEST.RESPONSE.redirect(context.absolute_url())



=== Added File CMF/CMFCollector/skins/collector/collector_issue_up.py ===
## Script (Python) "collector_issue_up.py"
##title=Submit a Request

context.REQUEST.RESPONSE.redirect(context.aq_parent.absolute_url())



=== Added File CMF/CMFCollector/skins/collector/collector_localrole_edit.py ===
## Script (Python) "folder_localrole_edit"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=change_type
##title=Set local roles
##
pm = context.portal_membership

if change_type == 'add':
    pm.setLocalRoles( obj=context
                    , member_ids=context.REQUEST.get('member_ids', ())
                    , member_role=context.REQUEST.get('member_role', '')
                                           )
else:
    pm.deleteLocalRoles( obj=context
                       , member_ids=context.REQUEST.get('member_ids', ())
                       )

qst='?portal_status_message=Local+Roles+changed.'

context.REQUEST.RESPONSE.redirect( context.absolute_url() + '/folder_localrole_form' + qst )


=== Added File CMF/CMFCollector/skins/collector/collector_macros.pt ===
<html xmlns:tal="http://xml.zope.org/namespaces/tal"
      xmlns:metal="http://xml.zope.org/namespaces/metal">
  <body>

    <span tal:replace="nothing">
      Comment: Collector issue macros: collector_header, issue_header.
    </span>

    <!-- This is the desktop area -->

    <div metal:define-macro="collector_header"
         tal:define="upNav python: hasattr(here.aq_parent, 'portal_url');
                     upID python: here.aq_parent.getId()">

      <table>
        <tr>
          <th align="left">
            <div class="DesktopTitle">
              <font size="+1">
                <em><span tal:replace="here/Title">Title</span></em>
                Issue Collector
              </font>
            </div>
          </th>
          <td tal:condition="upNav|nothing" align="center">
            <a href="folder_contents"
               tal:attributes="href python: here.aq_parent.absolute_url()
                                            + '/folder_contents'">
              <img src="" alt="[Link]" border="0"
                   tal:attributes="src python: here.portal_url()
                                               + '/UpFolder_icon.gif'"></a>
            &nbsp;&nbsp;
            Out to <a href="CONTAINER"
                      tal:attributes="href here/aq_parent/absolute_url"
                      tal:content="upID">Up ID</a>
          </td>
        </tr>
        <tr>
          <td colspan="2">
            <div id="DesktopDescription"
                 tal:content="here/description">DESCRIPTION</div>
          </td>
        </tr>
      </table>

    </div>

    <div metal:define-macro="issue_header"
         tal:define="crdate python: here.creation_date.aCommon();
                     DateTime nocall: modules/DateTime/DateTime;
                     moddate python:
                                DateTime(here.ModificationDate()).aCommon();
                     datesdiff python: crdate != moddate;
                     TRUNCDESCR python: 150;
                     global artifacts
                            python: [i for i in here.objectValues()
                                       if i.portal_type
                                          != 'Collector Issue Transcript']">

       <table summary="Issue Characteristics">

         <tr>
           <td colspan="4">
             <font size="+1">
               Issue <span tal:replace="here/id">ID</span> of
               <a href=""
                  tal:attributes="href python:here.aq_parent.absolute_url()">
                 <span tal:replace="container/Title">COLLECTOR TITLE</span>
               </a>
               Collector
             </font>
           </td>
         </tr>

         <tr>
           <td align="right"> Title: </td>
           <td colspan="2">
             <strong>
               <span tal:replace="here/Title">TITLE</span>
             </strong>
           </td>
           <td tal:condition="here/security_related">
             <font color="red"> Security Related </font>
           </td>
         </tr>

         <tr>
           <td align="right"> Description: </td>
           <td colspan="3">
             <font color="gray">
               <span tal:replace="python: here.description[:TRUNCDESCR]
                                          + (here.description[TRUNCDESCR+1:]
                                             and '...')">
                 DESCRIPTION
               </span>
             </font>
           </td>
         </tr>

         <tr>
           <td align="right">Topic/Class:</td>
           <td> <strong>
              <span tal:content="python: '%s/%s' % (here.topic,
                                                   here.classification)">
               TOPIC</span> </strong>
           </td>
           <td align="right">From:</td>
           <td>
              <span tal:content="here/submitter_name">NAME</span>
              (<em><span tal:content="here/submitter_id">ID</span></em>)
         </tr>

         <tr>
           <td align="right">Status:</td>
           <td>
              <code>
                <span tal:content="here/current_status">CURRENT_STATUS</span>
              </code>
           </td>
           <td align="right"> on: </td>
           <td tal:content="crdate">CREATIONDATE</td>
         </tr>

         <tr tal:condition="here/edited">

           <td tal:condition="here/comment_number"
               align="right"> Comments: </td>
           <td tal:condition="here/comment_number"
               tal:content="here/comment_number"> NUMBER </td>

           <td tal:condition="not:here/comment_number"> </td>
           <td tal:condition="not:here/comment_number"> </td>

           <td tal:condition="datesdiff" align="right">Last update:</td>
           <td tal:condition="datesdiff"
               tal:content="moddate">MODDATE</td>
         </tr>

         <tr>
           <td align="right">Version:</td>
           <td>
             <code>
               <span tal:content="here/reported_version">VERSION
               </span>
             </code>
           </td>
           <td align="right"> Other sys: </td>
           <td tal:condition="here/other_version_info"
               tal:content="here/other_version_info">OTHER_VERSION_INFO</td>
           <td tal:condition="not:here/other_version_info"> ~ </td>
        </tr>
        <tr>
          <td align="right" valign="top"> Artifacts: </td>
          <td colspan="3">
            <span tal:condition="not: artifacts"> ~ </span>
            <table tal:condition="artifacts">
              <div tal:repeat="item artifacts">
                <tr> <td>
                  <a href="ITEM URL"
                     tal:attributes="href python: item.absolute_url()
                                                  + '/view'"
                     tal:content="item/id">ITEM ID</a>
                  <font color="gray">
                    <span tal:replace="python: item.description[:45]
                                               + (item.description[46:]
                                                  and '...')">
                    DESCRIPTION</span>
                  </font>
                </td> </tr>
              </div>
            </table>
        </tr>

         <tr valign="middle">
         </tr>

       </table>

    </div>

    <div metal:define-macro="issue_batch_nav">

      <span tal:condition="nothing">
        This macros depends on a number of batch parameters being defined in
        the invoking template:
          - BATCHSIZE
          - batch
          - prev (may be undefined)
          - next (may be undefined)
          - last_batch
      </span>

      <table bgcolor="#eeeeee">

        <tr>
          <td align="right" width="10%">
           <strong>
            <span tal:condition="prev">
              <a href="FIRST BATCH"
                 tal:attributes="href here/absolute_url">
              &lt;&lt; </a>
            </span>
           </strong>
          </td>

          <th align="center" width="30%">
            <span tal:condition="prev">
              <a href="PREVIOUS BATCH"
                tal:attributes="href python: '%s/collector_contents?b_start=%s'
                                             % (here.absolute_url(),
                                                prev.first)">
               Previous batch</a>
             </span>
          </th>

          <td align="center" NOWRAP>
            <b>
              <span tal:replace="python: 'Issues %s to %s of %s'
                                   % (batch.start, batch.end, here.length())"/>
            </b>
          </td>

          <th align="center" width="30%">
            <span tal:condition="next">
              <a href=""
                tal:attributes="href python: '%s/collector_contents?b_start=%s'
                                             % (here.absolute_url(),
                                                next.first)">
              Next batch</a>
            </span>
          </th>

          <td align="left" width="10%">
            <strong>
            <span tal:condition="next">
              <a href="LAST BATCH"
                tal:attributes="href python: '%s/collector_contents?b_start=%s'
                                             % (here.absolute_url(),
                                                last_batch)">
               &gt;&gt; </a>
            </span>
            </strong>
          </td>
        </tr>
      </table>
    </div>
  </body>
</html>


=== Added File CMF/CMFCollector/skins/collector/collector_transcript_view.py ===
## Script (Python) "collector_transcript_view.py"
##title=Redirect to the issue containing the transcript

context.REQUEST.RESPONSE.redirect(context.aq_parent.absolute_url())