[CMF-checkins] CVS: CMF/CMFCollector/skins/collector_plone - README.txt:1.1 collector_add_issue_form.pt:1.1 collector_contents.pt:1.1 collector_edit_form.pt:1.1 collector_icon.gif:1.1 collector_issue_contents.pt:1.1 collector_issue_edit_form.pt:1.1 collector_issue_followup_form.pt:1.1 collector_issue_icon.gif:1.1 collector_issue_notice.dtml:1.1 collector_macros.pt:1.1

Alexander Limi cvs-admin at zope.org
Sat Oct 25 01:32:13 EDT 2003


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

Added Files:
	README.txt collector_add_issue_form.pt collector_contents.pt 
	collector_edit_form.pt collector_icon.gif 
	collector_issue_contents.pt collector_issue_edit_form.pt 
	collector_issue_followup_form.pt collector_issue_icon.gif 
	collector_issue_notice.dtml collector_macros.pt 
Log Message:
This is just the original Plone skin for CMFCollector, it works well, 
but is not going to be part of Plone Core anymore. I'm donating it to 
whoever wants to maintain it. I hope I'm not being rude when I check 
this into the CMF repository. It's not hooked up to anything yet, but
can easily be in the Install.py - check if the site is a Plone site,
and install this skin if it is.

Feel free to contact me if you have any questions.

-- Alexander Limi, 25. Oct 2003
   http://www.plonesolutions.com


=== Added File CMF/CMFCollector/skins/collector_plone/README.txt ===
This is just the original Plone skin for CMFCollector, it works well, 
but is not going to be part of Plone Core anymore. I'm donating it to 
whoever wants to maintain it. I hope I'm not being rude when I check 
this into the CMF repository. It's not hooked up to anything yet, but
can easily be in the Install.py - check if the site is a Plone site,
and install this skin if it is.

Feel free to contact me if you have any questions.

-- Alexander Limi, 25. Oct 2003
   http://www.plonesolutions.com


=== Added File CMF/CMFCollector/skins/collector_plone/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"
      i18n:domain="plone">

<span tal:condition="nothing"
      tal:define="has_add_priv nocall: here/add_issue">
  This span ensures that the visitor has edit privilege, by fetching - but not
  displaying - the protected collector.add_issue method.
</span>
<tal:block tal:condition="nothing">
  Template description: Form for submitting new collector issues.
</tal:block>

<body>

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

<h1 i18n:translate="heading_add_new_issue_to">
Add new issue to <tal:block content="here/title_or_id"
i18n:name="collector_title">TITLE</tal:block>
</h1>

<div id="description" i18n:translate="description_add_new_issue">
Use this form to add your issue to the Collector. Please provide as many details
as possible.
</div>

</div>

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

<div tal:define="pm python: here.portal_membership;
                 authenticated python: member.has_role('Authenticated')
                                         or member.has_role('Member')">

<form class="group"
        method="post"
        enctype="multipart/form-data"
        action=""
        tal:attributes="action string:${here/absolute_url}/collector_add_issue"
        >

    <span class="legend" i18n:translate="legend_issue_details">Issue Details</span>

    <div class="row">
        <div class="label" i18n:translate="label_title">Title</div>

        <div class="field">
            <input type="text" name="title" value="" size="40" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_security">Security</div>
        <div class="field">
            <input type="hidden" name="security_related:boolean" value="" />
            <input class="noborder"
                   type="checkbox"
                   name="security_related:boolean"
                   />

            <span i18n:translate="label_security_related_desc">
            Yes, this issue is security related, and
            should <strong>not</strong> be publicly visible until
            completed.
            </span>

        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_submitter">Submitter</div>

        <div class="field"
             tal:condition="authenticated"
             tal:content="python: member.getProperty('full_name',
                                                      str(member))">
        </div>

        <div class="field"
              tal:condition="not: authenticated">
            <input type="text" name="submitter_name" size="30" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_email">Email</div>

        <div class="field">
            <input type="text" name="submitter_email" size="30"
                   tal:attributes="value python: member.getProperty('email',
                                                                    '')" />
            <span tal:condition="python: not authenticated and
                                       here.participation != 'anyone'">
                  NOTE that anonymous-submitted issues do not allow submitter
                  to followup.
            </span>

        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_topic"> Topic </div>

        <div class="field">
            <select name="topic">
              <option value=""
                      tal:repeat="it here/topics"
                tal:attributes="value it"
                tal:content="it"></option>
            </select>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_importance">Importance</div>

        <div class="field">
         <select name="importance">
           <option value=""
                   tal:repeat="it here/importances"
                   tal:attributes="value it"
                   tal:content="it"></option>
         </select>
        </div>

    </div>

    <div class="row">
        <div class="label" i18n:translate="label_classification">Classification</div>

        <div class="field">
         <select name="classification">
           <option value=""
                   tal:repeat="it here/classifications"
                   tal:attributes="value it"
                   tal:content="it"></option>
         </select>
        </div>

    </div>

    <div class="row">
        <div class="label" i18n:translate="label_version_info">Version Info</div>
        <div class="field">
            <textarea name="version_info" rows="3" cols="35"
                      tal:content="here/version_info_spiel"></textarea>
        </div>
    </div>


    <metal:block tal:define="assigner python: pm.checkPermission(
                                              'Support collector issue', here);
                             supporters here/supporters">

    <div class="row">
         <div class="label" i18n:translate="label_description">Description</div>
         <div class="field">
           <textarea name="description:text" rows="10" cols="55" i18n:translate="help_prefix_lines_with_whitespace"></textarea>
         </div>

    </div>

    <div class="row" tal:condition="assigner">
        <div class="label" i18n:translate="label_assign_to">Assign to</div>
        <div class="field">
           <select name="assignees:list" multiple="multiple" size="5"
                   tal:attributes="size python:
                                        min(max(len(supporters), 3), 8)">
             <option tal:repeat="supporter supporters"
                      tal:content="supporter">
               SUPPORTER
             </option>
           </select>
        </div>
    </div>

    </metal:block>

    <div class="row">
        <div class="label" i18n:translate="label_attachment_optional">Attachment (optional)</div>
        <div class="field">
            <input type="file" name="file" size="20" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_attachment_type_optional"> Attachment type (optional)</div>
        <div class="field">
            <input class="noborder" type="radio" name="filetype" id="radio_file" value="File" checked="checked" />
	    <label for="radio_file" i18n:translate="">File</label>
            <input class="noborder" type="radio" name="filetype" id="radio_image" value="Image" />
	    <label for="radio_image" i18n:translate="">Image</label>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_name_of_upload_optional">Name of upload (optional)</div>
        <div class="field">
            <input type="text" name="fileid" size="12" />
        </div>
    </div>

    <div class="row">
        <div class="label">&nbsp;</div>
        <div class="field">
         <input class="context" type="submit" value="Submit" i18n:attributes="value" />
        </div>
    </div>

</form>

</div>

</div>

</body>

</html>


=== Added File CMF/CMFCollector/skins/collector_plone/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"
      i18n:domain="plone">

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

<body>

<div metal:fill-slot="header"
     tal:define="global collector_header_present python: 1">

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

</div>

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

<div tal:condition="not: collector_header_present|nothing">
  <!-- Master template has no "header" macro... -->
    <div metal:use-macro="here/collector_macros/macros/collector_header">
    COLLECTOR HEADER
    </div>
</div>

<div tal:define="Batch python:modules['Products.CMFPlone'].Batch;
                 pysutil modules/Products.PythonScripts.standard;
                 strmod modules/string;
                 cap nocall: strmod/capitalize;
                 split nocall: strmod/split;
                 DateTime nocall: modules/DateTime/DateTime;
                 BATCHSIZE python: 10;
                 TITLELEN python: 110;
                 DESCRLEN python: 200;
                 b_start python: request.get('b_start', 0);
                 searching
                    python: (request.get('searching') != 'yep'
                             and (request.set('status',
                                              ['Pending', 'Accepted'])));
                 items here/collector_search;
                 batch python: Batch(items, BATCHSIZE, int(b_start), orphan=0);">

    <div tal:define="total here/length;
                     found python:len(items);"
         i18n:translate="collector_issue_number">
        Found
        <span tal:replace="found" i18n:name="found">found</span>
        issues. In total there are
        <span tal:replace="total" i18n:name="total">total</span>
        issues in this collector.
    </div>

    <!-- Navigation -->
    <div metal:use-macro="here/batch_macros/macros/navigation" />


    <table id="sortable" class="listing">
      <thead>
      <tr>
        <th>&nbsp;<span tal:omit-tag="" i18n:translate="listingheader_issue">Issue</span>&nbsp;</th>
        <th>&nbsp;<span tal:omit-tag="" i18n:translate="listingheader_title">Title</span>&nbsp;</th>
        <th>&nbsp;<span tal:omit-tag="" i18n:translate="listingheader_submitter">Submitter</span>&nbsp;</th>
        <th>&nbsp;<span tal:omit-tag="" i18n:translate="listingheader_date">Date</span>&nbsp;</th>
        <th>&nbsp;<span tal:omit-tag="" i18n:translate="listingheader_status">Status</span>&nbsp;</th>
      </tr>
      </thead>

      <tbody>
        <metal:block tal:repeat="itemnum python: range(len(batch))">
        <tr tal:define="oddrow repeat/itemnum/odd"
                      tal:attributes="class python:test(oddrow, 'even', 'odd')">
        <metal:block tal:define="global item python:batch[itemnum];
                        itemurl item/getURL;
                        itemtype item/getId|nothing;
                        icon item/getIcon|item/icon|nothing;
                        odd repeat/itemnum/odd;
                        global alternatingcolor python:
                                                ['#ffffff', '#eeeeee'][odd]">

          <td>
            <a href="ITEMURL" tal:attributes="href itemurl">
              <span tal:replace="item/id">ID</span>
            </a>
          </td>

          <td>
            <a href="ITEMURL" tal:attributes="href itemurl">
                <img src="" alt="Issue" border="0"
                     tal:condition="icon"
                     tal:attributes="src icon" />
                <span tal:replace="itemtype"
                      tal:condition="not: icon"></span>

                <span tal:condition="item/Title"
                      tal:replace="python:
                                   item.Title[:TITLELEN]
                                   + (item.Title[TITLELEN:] and '...')">
                  TITLE
                </span>
            </a>
          </td>

        </metal:block>

        <metal:block tal:define="crdate item/created;
                                 moddate item/modified;
                                 global numcmts python: int(item.action_number)-1;
                                 datesdiff python: ((moddate - crdate) * 86400) > 30">

          <td>

            <span tal:replace="item/submitter_id|nothing">SUBMITTER ID</span
              ><span tal:condition="numcmts"></span>
            <span tal:condition="not: item/submitter_id|nothing">?</span>
          </td>

          <td>
            <span tal:replace="python: here.aCompact(crdate)">CREATEDATE
              </span><span tal:condition="python: datesdiff"> ...
                <span tal:replace="python: here.aCompact(moddate)">
                  MODDATE</span>
            </span>
          </td>

        </metal:block>

        <metal:block tal:define="security python: item.security_related;
                                 confidential python: split(item.status, '_')[-1]
                                                      == 'confidential';">
          <td style="white-space: nowrap">

            <!-- The color indicates whether the item is security-related, and
                  parenthesizing indicates that a security-related item has not
                  yet reached a completed state, ie is still confidential. -->
            <font color="SECURITY COLOR"
                  tal:attributes="color python:
                                        (security and 'brown' or 'black')">
                <span i18n:translate=""
		              tal:content="python: (confidential and '(' or '')
                                           + cap(split(item.status,
                                                       '_')[0])
                                           + (confidential and ')' or '')">
                  STATUS</span>
            </font>

            <br />

            <span tal:replace="python: '%s %s'
                                       % (item.topic, item.classification)">
              TOPIC/CLASSIFICATION
            </span>

            <br />

            <span tal:omit-tag="" i18n:translate=""><span tal:replace="item/importance">
              Importance
            </span></span>

            <span tal:condition="item/assigned_to|nothing"
	              i18n:translate="collector_issue_assigned_to">,
              Assigned to

              <span tal:content="python: ', '.join(item.assigned_to)" i18n:name="names">
                SUPPORTERS
              </span>
            </span>
          </td>

        </metal:block>
        </tr>
      </metal:block>
      </tbody>

    </table>

    <!-- Navigation -->
    <div metal:use-macro="here/batch_macros/macros/navigation" />


    <form class="group"
          action="RETURNHERE" method="get"
          tal:attributes="action python: here.absolute_url()
                                         + '/collector_contents'"
          tal:define="uniquevals python:
                                 here.get_internal_catalog().uniqueValuesFor;
                      ordered nocall: here/collector_ordered_traits">
      <input type="hidden" name="searching" value="yep" />

      <span class="legend" i18n:translate="legend_search_for_issues">Search for issues</span>

      <div class="row">
          <div class="label" i18n:translate="label_contains">Contains</div>

          <div class="field">
             <input type="text" name="SearchableText" size="40"
                    value="TEXT"
                    tal:attributes="value request/SearchableText|nothing" />
          </div>
      </div>

      <div class="row">
          <div class="label">&nbsp;</div>

          <div class="field">
                <table>

                  <tr>
                    <th i18n:translate="listingheader_status">Status</th>
                    <th i18n:translate="listingheader_requester">Requester</th>
                    <th i18n:translate="listingheader_assigned">Assigned</th>
                    <th i18n:translate="listingheader_security_related">Security Related</th>
                  </tr>
                  <tr>
                    <td>
                      <select name="status:list:ignore_empty" multiple size="SIZE"
                            tal:define="values here/collector_issue_trim_states"
                            tal:attributes="size python: min(max(len(values), 3), 5)">
                        <option value="" i18n:translate=""
                                tal:repeat="status values"
                                tal:attributes="value status;
                                                selected python: status
                                                       in request.get('status', [])"
                                tal:content="status">
                        </option>
                     </select>
                    </td>
                    <td>
                      <select name="Creator:list:ignore_empty" multiple size="SIZE"
                              tal:define="values python: uniquevals('Creator')"
                              tal:attributes="size python: min(max(len(values), 3),
                                                               5)">
                        <option value=""
                                tal:repeat="creator values"
                                tal:attributes="
                                    value creator;
                                    selected python: creator
                                                     in request.get('Creator', [])"
                                tal:content="creator">
                        </option>
                      </select>
                    </td>
                    <td>
                      <select name="supporters:list:ignore_empty" multiple size="SIZE"
                              tal:define="values python:
                                                 ordered(uniquevals('assigned_to'),
                                                         here.supporters)"
                              tal:attributes="size python: min(max(len(values), 3),
                                                               5)">
                        <option value=""
                                tal:repeat="supporter values"
                                tal:attributes="
                                    value supporter;
                                    selected python: supporter
                                             in request.get('supporters', [])"
                                tal:content="supporter">
                        </option>
                      </select>
                    </td>
                    <td>
                      <select name="security_related:list:ignore_empty" size="3" multiple
                              tal:define="was python: request.get('security_related',
                                                                  [])">
                        <option value="No" i18n:translate=""
                                tal:attributes="selected python: 'No' in was">
                          No </option>
                        <option value="Yes" i18n:translate=""
                                tal:attributes="selected python: 'Yes' in was">
                          Yes </option>
                      </select>
                    </td>

                  </tr>
                  <tr>
                    <th i18n:translate="listingheader_topic">Topic</th>
                    <th i18n:translate="listingheader_classification">Classification</th>
                    <th i18n:translate="listingheader_importance">Importance</th>
                    <th> &nbsp; </th>
                  </tr>
                  <tr>
                    <td>
                      <select name="topics:list:ignore_empty" multiple size="SIZE"
                            tal:define="values python: ordered(uniquevals('topic'),
                                                               here.topics)"
                            tal:attributes="size python: min(max(len(values), 3), 5)">
                        <option value=""
                                tal:repeat="topic values"
                                tal:attributes="
                                    value topic;
                                    selected python: topic
                                                     in request.get('topics', [])"
                                tal:content="topic">
                        </option>
                     </select>
                    </td>
                    <td>
                      <select name="classifications:list:ignore_empty" multiple size="SIZE"
                              tal:define="values python:
                                                 ordered(uniquevals('classification'),
                                                         here.classifications)"
                              tal:attributes="size python: min(max(len(values), 3),
                                                               5)">
                        <option value="" i18n:translate=""
                                tal:repeat="classification values"
                                tal:attributes="
                                   value classification;
                                   selected python: classification
                                                    in request.get('classifications',
                                                                   [])"
                                tal:content="classification">
                        </option>
                      </select>
                    </td>
                    <td>
                      <select name="importances:list:ignore_empty" multiple size="SIZE"
                              tal:define="values python:
                                                 ordered(uniquevals('importance'),
                                                         here.importances)"
                              tal:attributes="size python: min(max(len(values), 3),
                                                               5)">
                        <option value="" i18n:translate=""
                                tal:repeat="importance values"
                                tal:attributes="
                                    value importance;
                                    selected python: importance
                                                     in request.get('importances',
                                                                    [])"
                                tal:content="importance">
                        </option>
                     </select>
                  </td>

                  <td>
                  &nbsp;
                  </td>

                </tr>


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

     <div class="row">

        <div class="label">&nbsp;</div>

        <div class="field">
            <input class="context" type="Submit" value="Search" i18n:attributes="value" />
            <input class="standalone" type="reset" value="Reset" i18n:attributes="value" />
        </div>
    </div>

</form>

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


=== Added File CMF/CMFCollector/skins/collector_plone/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"
      i18n:domain="plone">

<span tal:condition="nothing"
      tal:define="has_edit_priv nocall: here/edit">
  This span ensures that the visitor has edit privilege, by fetching - but not
  displaying - the protected collector.edit method.
</span>
<div metal:fill-slot="header">

<h1 i18n:translate="heading_collector_configuration">Collector Configuration</h1>

</div>

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

<form class="group"
      action=""
      method="post"
      tal:attributes="action string:${here/absolute_url}/collector_edit"
      >

    <span class="legend" i18n:translate="legend_collector_details">Collector Details</span>

    <div class="row"
         tal:condition="python: member.getProperty('visible_ids', None)"
         tal:define="error_id errors/id | nothing;
                     id python:request.get('id', here.getId());">
        <div class="label required">

            <span i18n:translate="label_name">Name</span>

            <div id="id_help"
                 i18n:translate="help_name"
                 class="help"
                 style="visibility:hidden">
            Enter the ID of the document. This is the part that will show up as part
            of the web address. This should be short, descriptive
            and preferrably not contain spaces, underscores or mixed case. Example:
            "expense-report-2002"
            </div>
        </div>

        <div class="field"
              tal:attributes="class python:test(error_id, 'field error', 'field')" >

            <div tal:replace="error_id" />

            <input type="text"
                   name="id"
                   value="#"
                   size="30"
                   tabindex="1"
                   onfocus="formtooltip('id_help',1)"
                   onblur="formtooltip('id_help',0)"
                   tal:attributes="value id;"
                   />
        </div>

    </div>
    <input type="hidden"
           name="id"
           tal:condition="python: not member.getProperty('visible_ids', None)"
           tal:attributes="value python:request.get('id', here.getId())"
           />

    <div class="row">
        <div class="label" i18n:translate="label_title">Title</div>
        <div class="field">
            <input type="text"
                   name="title"
                   value=""
                   tal:attributes="value here/title"
                   size="45" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_abbreviation">
        Abbreviation

        </div>
        <div class="field">
            <input type="text"
                   name="abbrev"
                   value=""
                   onfocus="formtooltip('abbrev_help',1)"
                   onblur="formtooltip('abbrev_help',0)"
                   tal:attributes="value here/abbrev|nothing"
                   size="5" />
            <div id="abbrev_help"
                 i18n:translate="help_abbreviation"
                 class="help"
                 style="visibility:hidden">
            Abbreviation for the collector, used as the prefix of
            the subject line in mail from the collector.
            </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_description">Description</div>
        <div class="field">
            <textarea name="description:text" rows="3"
                      cols="50"
                      tal:content="here/description">
            </textarea>
        </div>
    </div>

    <div class="row">
        <div class="label required" i18n:translate="label_collector_email">Collector email</div>
        <div class="field"
             tal:define="getpropemail python: hasattr(member, 'getProperty')
                                              and member.getProperty('email', '');
                         attremail python: getattr(member, 'email', '');
                         email python: getattr(here, 'email',
                                                getpropemail or attremail)">

            <input type="text"
                   name="email"
                   size="25"
                   value="EMAIL"
                   onfocus="formtooltip('email_help',1)"
                   onblur="formtooltip('email_help',0)"
                   tal:attributes="value email" />
        <div id="email_help"
                 i18n:translate="help_email"
                 class="help"
                 style="visibility:hidden">
        This is the collector's email 'From' address.
        </div>

        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_collector_managers">Managers</div>
        <div class="field">
            <textarea name="managers:lines" rows="5" cols="15"
                      tal:define="mgrs python:'\n'.join([m for m in here.managers])"
		      onfocus="formtooltip('managers_help',1)"
		      onblur="formtooltip('managers_help',0)"
                      tal:content="mgrs"></textarea>
            <div id="managers_help"
                 i18n:translate="help_collector_managers"
                 class="help"
                 style="visibility:hidden">
            Managers configure the collector, and receive request notices.
            Managers can accept issues, but must be on Supporters roster to be
            assigned.  (Managers cannot remove <em>themselves</em> from the
            management roster.)
            </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_collector_supporters">Supporters</div>
        <div class="field">
            <textarea name="supporters:lines" rows="5" cols="15"
		      onfocus="formtooltip('supporters_help',1)"
		      onblur="formtooltip('supporters_help',0)"
                      tal:define="supporters python:'\n'.join([s for s in here.supporters])"
		      tal:content="supporters"></textarea>
            <div id="supporters_help"
                 i18n:translate="help_collector_supporters"
                 class="help"
                 style="visibility:hidden">
            Supporters can be assigned to requests.  They may or may not
            receive initial request notifications, depending on the
            'dispatching' setting below.
            </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_collector_dispatcher_mode">Dispatcher Mode</div>
        <div class="field">
            <div style="float:left">
            <input class="noborder"
                   type="radio"
                   name="dispatching:int"
                   value="0"
                   tal:attributes="checked not: here/dispatching|nothing" />
            <span i18n:translate="label_collector_dispatcher_off">
        Off (Managers and supporters receive pending-issue notices)
        </span>


            <br />

            <input class="noborder"
                   type="radio"
                   name="dispatching:int"
                   value="1"
                   tal:attributes="checked here/dispatching|nothing" />
        <span i18n:translate="label_collector_dispatcher_on">
            On (Only managers receive pending-issue notices)
        </span>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_collector_participation_mode">Participation Mode</div>
        <div class="field">
            <div style="float: left">
                <input class="noborder"
                       type="radio"
                       name="participation:string"
                       value="staff"
                       tal:attributes="checked python: here.participation
                                                       == 'staff'" />
                  <span i18n:translate="label_collector_staff">
          Staff

                  (Only collector staff and issue requester participate in an
                  issue)
          </span>

                <br />

                <input class="noborder"
                       type="radio"
                       name="participation:string"
                       value="authenticated"
                       tal:attributes="checked python: here.participation
                                                       == 'authenticated'" />
                  <span i18n:translate="label_collector_authenticated">
          Authenticated

                  (Any non-anonymous visitors can participate)
          </span>

                <br />

                <input class="noborder"
                       type="radio"
                       name="participation:string"
                       value="anyone"
                       tal:attributes="checked python: here.participation
                                                       == 'anyone'" />
                  <span i18n:translate="label_collector_anyone">
          Anyone

                  (Anyone, including anonymous visitors, can chime in)
          </span>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_notifications">Notifications</div>
        <div class="field">
            <div style="float:left">
            <metal:block tal:define="states here/issue_states;"
                         tal:repeat="state states">

                <span tal:omit-tag="" i18n:translate=""><span tal:replace="state">State:</span></span>

                <br />

                <input type="text"
                       size="30"
                       name="stateemail"
                       value=""
		       onfocus="formtooltip('notification_help',1)"
		       onblur="formtooltip('notification_help',0)"
                       tal:attributes="name python: 'state_email.' + state
                                                    + ':record';
                                       value python: here.state_email.get(state, '')" />
                <br />

            </metal:block>
            </div>
            <div id="notification_help"
                 i18n:translate="help_collector_notifications"
                 class="help"
                 style="visibility:hidden">
            Fill in addresses next to the state names to have notifications for
            issues in that state sent to those addresses (this is in addition to
            normal issue-participant notifications)
            </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_selections">Selections</div>
        <div class="field">
            <div style="float: left">

            <span i18n:translate="label_collector_topics">Topics</span>
            <textarea name="topics:lines" rows="5" cols="15"
                      onfocus="formtooltip('selections_help',1)"
                      onblur="formtooltip('selections_help',0)"
                      tal:define="topics python:'\n'.join([t for t in here.topics])"
                      tal:content="topics"></textarea>

            <span i18n:translate="label_collector_classifications">Classifications</span>
            <textarea name="classifications:lines" rows="5" cols="15"
                      onfocus="formtooltip('selections_help',1)"
                      onblur="formtooltip('selections_help',0)"
                      tal:define="classi python:'\n'.join([c for c in here.classifications])"
                      tal:content="classi"></textarea>

            <span i18n:translate="label_collector_importance">Importance</span>
            <textarea name="importances:lines" rows="5" cols="15"
                      onfocus="formtooltip('selections_help',1)"
                      onblur="formtooltip('selections_help',0)"
                      tal:define="imp python:'\n'.join([i for i in here.importances])"
                      tal:content="imp"></textarea>
            </div>
            <div id="selections_help"
                 i18n:translate="help_collector_selections"
                 class="help"
                 style="visibility:hidden">
            Fill in the alternatives for issue categorization.
	    </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_version_boilerplate">Version boilerplate</div>
        <div class="field">
   <textarea name="version_info_spiel:text" rows="3" cols="50"
             onfocus="formtooltip('version_bp_help',1)"
	     onblur="formtooltip('version_bp_help',0)"
             tal:content="here/version_info_spiel|nothing"></textarea>

            <div id="version_bp_help"
                 i18n:translate="help_collector_version_boilerplate"
                 class="help"
                 style="visibility:hidden">
            The text shown to users about what kind of version information they should include.
	    </div>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_reinstate_catalog">Reinstate catalog</div>
        <div class="field">
            <div style="float: left">
                <input class="noborder"
		       id="reinstate_no"
                       type="radio"
                       name="recatalog:int"
                       value="0"
                       checked="checked"
		       onfocus="formtooltip('reinstate_help',1)"
		       onblur="formtooltip('reinstate_help',0)"
                       />

                <label for="reinstate_no" i18n:translate="label_collector_reinstate_no">No</label><br />

                <input class="noborder"
		       id="reinstate_internal"
                       type="radio"
                       name="recatalog:int"
                       value="1"
		       onfocus="formtooltip('reinstate_help',1)"
		       onblur="formtooltip('reinstate_help',0)"
                       />

                <label for="reinstate_internal" i18n:translate="label_collector_reinstate_internal_only">Internal only</label><br />

                <input class="noborder"
		       id="reinstate_sitewide"
                       type="radio"
                       name="recatalog:int"
                       value="2"
		       onfocus="formtooltip('reinstate_help',1)"
		       onblur="formtooltip('reinstate_help',0)"
                       />

               <label for="reinstate_sitewide" i18n:translate="label_collector_reinstate_sitewide">Internal &amp; Site-wide (slow)</label><br />

            </div>
            <div id="reinstate_help"
                 i18n:translate="help_collector_reinstate"
                 class="help"
                 style="visibility:hidden">
                Occasionally, product updates require internal catalog reinit and
                reindex and other existing-issue adjustment.  Collector product
                RELEASE_NOTES.txt will indicate when necessary.
	    </div>
        </div>
    </div>

    <div class="row">
        <div class="label"> &nbsp; </div>
        <div class="field">
            <input class="context" type="submit" value="Submit" i18n:attributes="value" />
            <input class="standalone" type="reset" value="Reset" i18n:attributes="value" />
        </div>
    </div>

</form>

</div>

</html>


=== Added File CMF/CMFCollector/skins/collector_plone/collector_icon.gif ===
  <Binary-ish file>

=== Added File CMF/CMFCollector/skins/collector_plone/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"
      i18n:domain="plone">

<metal:block metal:fill-slot="head_slot">
  <tal:block tal:define="dummy python:request.set('enable_border',1)" />
</metal:block>

<body>

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

<div metal:fill-slot="header"
     tal:define="global collector_issue_header_present python: 1">
  <div metal:use-macro="here/collector_macros/macros/issue_header">
    ISSUE HEADER
  </div>
</div>

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

  <div tal:condition="not: collector_issue_header_present|nothing">
    <!-- Master template has no "header" macro... -->
    <div metal:use-macro="here/collector_macros/macros/issue_header">
      ISSUE HEADER
    </div>
  </div>

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

    <div class="row" tal:define="entries here/action_number">

        <div class="box">

            <h6 i18n:translate="box_transcript_for_issue">
                Transcript for Issue
                <tal:block content="here/id" i18n:name="id">ID</tal:block>
                (<tal:block content="entries" i18n:name="num">7</tal:block>

                 <tal:block condition="python:entries == 1">
                 <span i18n:name="listing_entry" i18n:translate="entry_singular">entry</span>
                 <tal:block i18n:name="listing_entries"></tal:block>
                 </tal:block>

                 <tal:block condition="python:entries != 1">
                 <tal:block i18n:name="listing_entry"></tal:block>
                 <span i18n:name="listing_entries" i18n:translate="entries_plural">entries</span>
                 </tal:block>)
            </h6>

            <div class="body">
                <div class="content" tal:content="structure here/CookedBody">
                          TRANSCRIPT
                </div>
            </div>

        </div>
    </div>

  </div>

</div>

</body>
</html>


=== Added File CMF/CMFCollector/skins/collector_plone/collector_issue_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"
      i18n:domain="plone">

<metal:block metal:fill-slot="head_slot">
  <tal:block tal:define="dummy python:request.set('enable_border',1)" />
</metal:block>

<body>

<span tal:condition="nothing"
      tal:define="has_edit_priv nocall: here/edit">
  This span ensures that the visitor has edit privilege, by fetching - but
  not displaying - the protected issue.edit method.
</span>

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

<div metal:fill-slot="header"
     tal:define="global collector_issue_header_present python: 1">

    <h1 i18n:translate="heading_edit_collector_issue">
    Edit Collector Issue
    </h1>

    <div id="description" i18n:translate="description_edit_collector_issue">
    Use this form to edit the data of an existing issue. Do not use this form
    to follow up or change the workflow status of an issue - use the issue follow
    up form for that.
    </div>

</div>

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

  <div tal:condition="not: collector_issue_header_present|nothing">
    <!-- Master template has no "header" macro... -->
    <div metal:use-macro="here/collector_macros/macros/issue_header">
      ISSUE HEADER
    </div>
  </div>

<form class="group"
        method="post"
        enctype="multipart/form-data"
        action=""
        tal:attributes="action string:${here/absolute_url}/collector_issue_edit"
        >

    <span class="legend" i18n:translate="legend_issue_details">Issue details</span>


    <div class="row">
        <div class="label" i18n:translate="label_title">Title</div>
        <div class="field">
            <input name="title" value="TITLE" size="65"
                   tal:attributes="value python: here.Title()" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_security">Security</div>
        <div class="field">
            <input class="noborder" id="security_related_checkbox"
                   type="checkbox"
                   name="security_related:int"
                   value="1"
                   tal:attributes="checked here/security_related" />
	    <label for="security_related_checkbox" i18n:translate="label_security_related">Security related</label>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_description">Description</div>
        <div class="field">
            <textarea name="description:text" rows="4" cols="60"
                      tal:content="here/description"></textarea>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_from_name">From (name)</div>
        <div class="field">
              <input name="submitter_name" value="NAME" size="25"
                     tal:attributes="value python: here.submitter_name" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_from_login_name">From (login name)</div>
        <div class="field">
            <input name="submitter_id" value="ID" size="25"
                   tal:attributes="value python: here.submitter_id" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_from_alt_email">From (alt. email)</div>
        <div class="field">
                  <input name="submitter_email" value="EMAIL" size="25"
                         tal:attributes="value here/submitter_email|nothing" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_topic">Topic</div>
        <div class="field">
            <select name="topic">
                <option value=""
                        tal:repeat="it here/aq_parent/topics"
                        tal:attributes="value it;
                                        selected python: here.topic == it"
                        tal:content="python: it.capitalize()">
                </option>
            </select>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_classification">Classification</div>
        <div class="field">
            <select name="classification">
                <option value=""
                        tal:repeat="it here/aq_parent/classifications"
                        tal:attributes="value it;
                                        selected python: here.classification
                                                         == it"
                        tal:content="python: it.capitalize()">
                </option>
            </select>
        </div>
    </div>


    <div class="row">
        <div class="label" i18n:translate="label_importance">Importance</div>
        <div class="field">
            <select name="importance">
                <option value=""
                        tal:repeat="it here/aq_parent/importances"
                        tal:attributes="value it;
                                        selected python: here.importance == it"
                        tal:content="python: it.capitalize()">
                </option>
            </select>
        </div>
    </div>


    <div class="row">
        <div class="label" i18n:translate="label_version_info">Version info</div>
        <div class="field">
            <textarea name="version_info" rows="2" cols="40"
                      tal:content="here/version_info"></textarea>
        </div>
    </div>


    <div class="row">
        <div class="label" i18n:translate="label_upload">Upload</div>
        <div class="field" i18n:translate="">
        Use the issue folder_contents view (if accessible) to change the
        uploads.
        </div>
    </div>


    <div class="row">
        <div class="label" i18n:translate="label_comment">Comment</div>
        <div class="field">
            <textarea name="comment" rows="3" cols="75"></textarea>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_collector_transcript">Transcript</div>
        <div class="field" tal:define="transcript here/get_transcript">
          <textarea name="text" rows="10" cols="75" wrap="soft"
                    tal:content="transcript/text"></textarea>
        </div>
    </div>


    <div class="row">
        <div class="label"> &nbsp; </div>
        <div class="field">
            <input class="context" type="submit" name="submit" value="Submit" i18n:attributes="value" />
            <input class="standalone" type="reset" name="reset" value="Reset" i18n:attributes="value" />
        </div>
    </div>

  </form>

</div>

</body>
</html>


=== Added File CMF/CMFCollector/skins/collector_plone/collector_issue_followup_form.pt ===


<span tal:condition="nothing"
      tal:define="has_followup_priv nocall: here/do_action">
  This span ensures that the visitor has edit privilege, by fetching - but
  not displaying - the protected collector.do_action method.
</span><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"
      i18n:domain="plone">

<metal:block metal:fill-slot="head_slot">
  <tal:block tal:define="dummy python:request.set('enable_border',1)" />
</metal:block>


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

<div metal:fill-slot="header"
     tal:define="global collector_issue_header_present python: 1">
  <div metal:use-macro="here/collector_macros/macros/issue_header">
    ISSUE HEADER
  </div>
</div>

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

  <div tal:condition="not: collector_issue_header_present|nothing">
    <!-- Master template has no "header" macro... -->
    <div metal:use-macro="here/collector_macros/macros/issue_header">
      ISSUE HEADER
    </div>
  </div>

<div class="message" tal:condition="here/no_submitter_email">
    <img tal:replace="structure here/info.gif" />
    <span i18n:translate="no_mail_address">
    Note: We have no mail address for the submitters, so they won't
    get followups.
    </span>
</div>


<form class="group"
      method="post"
      enctype="multipart/form-data"
      action=""
      tal:attributes="action string:${here/absolute_url}/collector_issue_followup"
      tal:define="actions_pairs here/valid_actions_pairs">

    <span class="legend" i18n:translate="legend_follow_up_details">Follow-up details</span>


    <div class="row" tal:condition="actions_pairs">
        <div class="label" i18n:translate="label_collector_action">Action</div>
        <div class="field">
            <input class="noborder"
                   type="radio" id="radio_action_comment"
                   name="action" value="comment" checked="checked" />
	    <label for="radio_action_comment" i18n:translate="label_do_comment">Comment</label>

            <span tal:repeat="pair actions_pairs">
                <span tal:define="name python:pair[0]; text python:pair[1];
		                  widget_id
				  string:radio_action_$name"
				  tal:condition="python: text != 'Assign'">
                    <input class="noborder"
                           type="radio"
                           name="action"
                           value="VALUE"
                           tal:attributes="value name; id widget_id"
                     /><label tal:content="python: text"
		     tal:attributes="for widget_id" i18n:translate="">ACTION</label>
                </span>
            </span>

            <span tal:define="assigning python: [i[0] for i in actions_pairs
                                         if i[1] == 'Assign']"
                  tal:condition="assigning">
                <input class="noborder"
                       type="radio"
		       id="radio_action_Assign"
                       name="action"
                       value="Assign"
                       tal:attributes="value python:
		       assigning[0]"/><label for="radio_action_Assign" i18n:translate="label_assign_to">Assign to:</label>
                <span tal:define="assigning python: [1 for i in actions_pairs
                                                     if i[1] == 'Assign'];
                                  supporters here/aq_parent/supporters"
                      tal:condition="assigning">

                    <select name="assignees:list" MULTIPLE size="5"
                            tal:attributes="size python:min(max(len(supporters), 3), 8)">

                        <option tal:content="supporter"
                                tal:repeat="supporter supporters"
                                tal:attributes="selected python:supporter in here.assigned_to()">
                        SUPPORTER
                        </option>
                    </select>
                </span>
            </span>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_follow_up">Follow-up</div>
        <div class="field">
          <textarea name="comment" rows="10" cols="65" wrap="soft"
                    tal:content="python: (request.get('do_cite')
                                          and here.cited_text()) or ''">Prefix lines with whitespace or '&gt;' to preserve their format.</textarea>
        </div>
    </div>


          <span i18n:translate="click_to_cite">
          Click <a href="QUALIFIED" i18n:name="here"
                   tal:attributes="href python: request.URL + '?do_cite=1'">
                here</a> to cite the existing transcript.
          </span>

    <div class="row">
        <div class="label" i18n:translate="label_attachment_optional">Attachment (optional)</div>
        <div class="field">
            <input type=file name="file" size="20" />
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_attachment_type_optional">Attachment type (optional)</div>
        <div class="field">
            <input class="noborder" type=radio name="filetype"
            value="File" id="radio_attachment_type_file" checked />
	    <label for="radio_attachment_type_file" i18n:translate="label_file">File</label>
            <input class="noborder" type=radio name="filetype"
            value="Image" id="radio_attachment_type_image" />
	    <label for="radio_attachment_type_image" i18n:translate="label_image">Image</label>
        </div>
    </div>

    <div class="row">
        <div class="label" i18n:translate="label_name_of_upload_optional">Name of upload (optional)</div>
        <div class="field">
            <input type=text name="fileid" size="12" />
        </div>
    </div>

    <div class="row">
        <div class="label">&nbsp;</div>
        <div class="field">
         <input class="context" type="submit" value="Submit"
        i18n:attributes="value" />
        </div>
    </div>

  </form>

</div>

</html>


=== Added File CMF/CMFCollector/skins/collector_plone/collector_issue_icon.gif ===
  <Binary-ish file>

=== Added File CMF/CMFCollector/skins/collector_plone/collector_issue_notice.dtml ===
<dtml-comment>
  Form an email message for issue events.
</dtml-comment>
From: <dtml-var sender>
To: <dtml-var recipients>
Subject: <dtml-var subject>
X-Recipients-debug: <dtml-var candidates>

Issue #<dtml-var issue_id> Update (<dtml-var action>) "<dtml-var title size=200>"
<dtml-if security_related> ** Security Related ** (<dtml-if confidential>Confidential<dtml-else>Public</dtml-if>)
</dtml-if> Status <dtml-var status>, <dtml-var topic>/<dtml-var klass> <dtml-var importance>
To followup, visit:
  <dtml-var issue_url>
______________________________________________________________

<dtml-var body>
______________________________________________________________



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

    <span tal:replace="nothing">
      Collector issue macros:

        - collector_header

        - issue_header

        - issue_batch_nav

        - add_artifacts_table
    </span>

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

        <h1 i18n:translate="">
            <span tal:condition="here/Title" i18n:name="title"
                tal:replace="here/Title">TITLE</span>

            <span tal:condition="here/abbrev" i18n:name="abbrev">
                [<span tal:replace="here/abbrev|nothing"></span>]
            </span>
        </h1>

        <div id="description"
             tal:define="stx nocall:
                   modules/Products/PythonScripts/standard/structured_text"
             tal:content="structure here/description">
          DESCRIPTION
        </div>

    </div>  <!-- End macro: collector_header -->


    <div metal:define-macro="issue_header"
         tal:define="TITLELEN python: 150;
                     split nocall: modules/string/split;
                     TRUNCDESCR python: 150;
                     global artifacts
                            python:[i for i in here.objectValues()
                                      if i.getTypeInfo().getId() != 'Collector Issue Transcript']">

        <h1 i18n:translate="">
            Issue <tal:block content="here/id" i18n:name="id">ID</tal:block> of
            <a href=""
               i18n:name="collector_link"
               tal:attributes="href python:here.aq_parent.absolute_url()">
                <span i18n:translate="collector_link">
                    <tal:block content="here/aq_parent/Title"
                          i18n:name="collector_title">COLLECTOR TITLE</tal:block>
                    [<tal:block content="here/abbrev|nothing" i18n:name="collector_abbrev" />]
                </span>
            </a>
        </h1>

       <table summary="Issue Characteristics" cellspacing="4">


         <tr>
           <td align="right"><tal:block i18n:translate="label_title">Title</tal:block>:</td>
           <td colspan="3" metal:define-slot="issue_title_slot">
             <strong>
               <span tal:replace="python: here.title[:TITLELEN]
                                          + (here.title[TITLELEN+1:]
                                             and '...')">
                 TITLE
               </span>
             </strong>
           </td>
         </tr>

         <tr>
           <td align="right"><tal:block i18n:translate="label_status">Status</tal:block>:</td>
           <td tal:define="statpair python: split(here.status(), '_');
                           base python: statpair[0];
                           paren python: len(statpair) > 1">
                <span tal:omit-tag="" i18n:translate=""><span tal:replace="python: '%s%s%s'
                                           % ((paren and '(') or '',
                                              base,
                                              (paren and ')') or '')">
                  STATUS
                </span></span>
           </td>

           <td align="right"><tal:block i18n:translate="label_security_related">Security related</tal:block>:</td>
           <td metal:define-slot="issue_security_slot">
             <span tal:condition="not: here/security_related" i18n:translate="">
               No
             </span>
             <span tal:condition="here/security_related" i18n:translate="">
               Yes
               <font color="BROWN or BLACK" i18n:name="confidential"
                     tal:attributes="color python:
                                          (here.confidential() and 'brown')
                                          or 'black'"
                     tal:content="python: (here.confidential()
                                           and '(confidential)'
                                           or '(public)')">CONFIDENTIALITY
               </font>
             </span>
           </td>
         </tr>

         <tr>
           <td align="right" valign="top"><tal:block i18n:translate="label_description">Description</tal:block>:</td>
           <td colspan="3" metal:define-slot="issue_description_slot">
             <font color="gray">
               <span tal:replace="python: here.description[:TRUNCDESCR]
                                          + (here.description[TRUNCDESCR+1:]
                                             and '...')">
                 DESCRIPTION
               </span>
             </font>
           </td>
         </tr>

         <tr>
           <td align="right"><tal:block i18n:translate="label_from">From</tal:block>:</td>
           <td NOWRAP>
              <span metal:define-slot="issue_from_slot"
                    tal:content="here/submitter_name">NAME</span>
           </td>
           <td align="right" i18n:translate="posted_on">on</td>
           <td NOWRAP>
             <code>
               <span tal:replace="python: here.aCompact(here.creation_date)">
                 CREATIONDATE
               </span>
             </code>
           </td>
         </tr>

         <tr>
           <td> </td>
           <td>
             <em><span metal:define-slot="issue_submitter_id_slot"
                        tal:content="here/submitter_id">ID</span></em>
           </td>
           <td align="right"><tal:block i18n:translate="label_last_update">
             Last update</tal:block>:
           </td>
           <td tal:define="actions here/action_number">
             <code>
               <span tal:condition="python: actions <= 1">~</span>
               <span tal:condition="python: actions > 1"
                     tal:replace="python:
                                  here.aCompact(here.modified())">
                 MODDATE
               </span>
             </code>
           </td>
         </tr>

         <tr>
           <td align="right"><tal:block i18n:translate="label_topic_class">Topic/class</tal:block>:</td>
           <td> <strong>
           <span metal:define-slot="issue_topic_slot"
                 tal:replace="here/topic">
            TOPIC</span>/<metal:block define-slot="issue_classification_slot"><span tal:omit-tag="" i18n:translate=""><span tal:replace="here/classification"
            >CLASSIFICATION</span></span></metal:block>
             </strong>
           </td>
           <td align="right"><tal:block i18n:translate="label_collector_importance">Importance</tal:block>:</td>
           <td metal:define-slot="issue_importance_slot">
             <span tal:omit-tag="" i18n:translate=""><span tal:replace="here/importance">
               IMPORTANCE
             </span></span>
           </td>
         </tr>

         <tr>
           <td align="right" valign="top"><tal:block i18n:translate="label_version_info">Version info</tal:block>:</td>
           <td valign="top"
	       metal:define-slot="issue_version_info_slot"
               colspan="3"
               tal:content="python: here.version_info[:120]
                              + ((here.version_info[121:] and '...') or '')">
             VERSION_INFO
           </td>
         </tr>

         <tr tal:condition="here/assigned_to">
           <td align="right"><tal:block i18n:translate="label_assigned">Assigned</tal:block>:</td>
           <td colspan="3">
             <span tal:content="python: ', '.join(here.assigned_to())">
               SUPPORTERS</span>
           </td>
         </tr>

        <tr tal:condition="artifacts">
          <td align="right" valign="top"><tal:block i18n:translate="label_uploads">Uploads</tal:block>:</td>
          <td metal:define-slot="issue_uploads_slot"
              colspan="3">
            <table>
              <tal:block repeat="item artifacts">
                <tr>
                  <td tal:define="icon item/getIcon|item/icon|nothing;
                                  item_url python: item.absolute_url()
                                                   + '/view'">
                    <span tal:condition="icon">
                      <a href=""
		         tal:attributes="href item_url">
                        <img src="" alt="" border="0"
                             tal:attributes="src python: here.portal_url()
                                                         + '/' + icon;
                                             alt item/Title|nothing" /></a>
                    </span>
                    <a href="ITEM URL" tal:attributes="href item_url"
                       tal:content="item/id">ITEM ID</a>
                    <span tal:replace="python: item.description[:45]
                                               + (item.description[46:]
                                                  and '...')">
                    DESCRIPTION</span>
                </td> </tr>
              </tal:block>
            </table>
          </td>
        </tr>

        <tr valign="middle"><td>&nbsp;</td></tr>

       </table>

    </div>  <!-- End macro: collector_issue_header -->

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

        <!-- Deprecated in Plone, included for compatibility -->
        <div class="group">
            <input class="noborder" type=radio name="filetype" value="File" checked /> File
            <input class="noborder" type=radio name="filetype" value="Image" /> Image
            <br />
            <input type=file name="file" size="20" />
            (Optional) Id:
            <input type=text name="fileid" size="12" />
        </div>

    </div>  <!-- End macro: add_artifacts_excerpt -->

  </body>
</html>




More information about the CMF-checkins mailing list