[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>
</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
<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>
</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>
</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>
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">
<< </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)">
>> </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())