Code

*** empty log message ***
[roundup.git] / doc / whatsnew-0.7.txt
1 =========================
2 What's New in Roundup 0.7
3 =========================
5 For those completely new to Roundup, you might want to look over the very
6 terse features__ page.
8 __ features.html
10 .. contents::
12 Instant-Gratification script even more gratifying
13 =================================================
15 The immensely popular ``python demo.py`` instant-gratification script has
16 been extended to allow you to choose the backend to use with the demo. To
17 select the "sqlite" backend (assuming it is available) you use::
19   python demo.py sqlite nuke
21 This will nuke any existing demo and reinitialise it with the sqlite
22 backend. Remember folks, if you want to restart the demo at a later point,
23 you just need to type::
25   python demo.py
27 without the "sqlite nuke" part, or you'll clear out the demo again. The
28 backend names are:
30   anydbm bsddb bsddb3 sqlite metakit mysql postgresql
32 You will need support modules installed for all except the first two. If
33 you're not sure whether you have support, run::
35   python run_tests.py
37 and if you see a line saynig "Including XXXX tests" where XXXX is the
38 backend you wish to try, then you're on your way. The mysql and postgresql
39 require their test environments to be set up. Read their respective
40 documents in the "doc" directory to do that.
43 Web Interface
44 =============
46 Saving and sharing of user queries
47 ----------------------------------
49 Due to popular demand, the user query saving mechanisms have been
50 overhauled.
52 As before, you may save queries in the tracker by giving the query a
53 name. Each user may only have one query with a given name - if a
54 subsequent search is performed with the same query name supplied, then
55 it will edit the existing query of the same name.
57 Queries may be marked as "private". These queries are only visible to the
58 user that created them. If they're not marked "private" then all other
59 users may include the query in their list of "Your Queries". Marking it as
60 private at a later date does not affect users already using the query, nor
61 does deleting the query.
63 If a user subsequently creates or edits a public query, a new personal
64 version of that query is made, with the same editing rules as described
65 above.
67 You *are not required* to make these changes in your tracker. You only
68 need to make them if you wish to use the new query editing features. It's
69 highly recommended, as the effort is minimal.
71 1. You will need to edit your tracker's ``dbinit.py`` to change the way
72    queries are stored. Change the lines::
74       query = Class(db, "query",
75                       klass=String(),     name=String(),
76                       url=String())
77       query.setkey("name")
79    to::
81       query = Class(db, "query",
82                       klass=String(),     name=String(),
83                       url=String(),       private_for=Link('user'))
85    That is, add the "private_for" property, and remove the line that says
86    ``query.setkey("name")``. The latter is the most important edit here.
88 2. You will also need to copy the ``query.edit.html`` template page from the
89    ``templates/classic/html/`` directory of the source to your tracker's
90    ``html`` directory.
92 3. Once you've done that, edit the tracker's ``page.html`` template to
93    change::
95     <td rowspan="2" valign="top" class="sidebar">
96      <p class="classblock" tal:condition="request/user/queries">
97       <b>Your Queries</b><br>
98       <tal:block tal:repeat="qs request/user/queries">
100    to::
102     <td rowspan="2" valign="top" class="sidebar">
103      <p class="classblock">
104       <b>Your Queries</b> (<a href="query?@template=edit">edit</a>)<br>
105       <tal:block tal:repeat="qs request/user/queries">
107    That is, you're removing the ``tal:condition`` and adding a link to the
108    new edit page.
110 4. You might also wish to remove the redundant query editing section from the
111    ``user.item.html`` page.
114 Simple support for collision detection
115 --------------------------------------
117 Item edit pages that use the ``context/submit`` function to generate their
118 submit buttons now automatically include a datestamp in the form. This
119 datestamp is compared to the "activity" property of the item when the form
120 is submitted. If the "actvity" property is younger than the datestamp in
121 the form submission, then someone else has edited the item, and a page
122 indicating this is displayed to the user.
125 Extending the cgi interface
126 ---------------------------
128 Before 0.7.0 adding or extending web actions was done by overriding or adding
129 methods on the Client class. Though this approach still works to provide
130 backwards compatibility, it is recommended you upgrade to the new approach, as
131 described in the `Defining new web actions`__ section of the customization
132 documentation. You might also want to take a look at the `Using an external
133 password validation source`__ example.
135 __ customizing.html#defining-new-web-actions
136 __ customizing.html#using-an-external-password-validation-source
138 Actions may also return the content that should return to the user, which
139 causes the web interface to skip the normal template formatting step.
140 This could be used to return an image to the user instead of HTML. Be sure
141 to set the correct content-type header though! The default is still
142 text/html. This is done with::
144    self.client.setHeader('Content-Type', 'image/png')
146 if you were returning a PNG image.
149 Added CSV export action
150 -----------------------
152 A new action has been added which exports the current index page or search
153 result as a comma-separated-value (CSV) file.
155 To use it, add this to your "index" templates:
157 <a tal:attributes="href python:request.indexargs_url('issue',
158             {'@action':'csv_export'})">Download as CSV</a>
160 Making sure that the ``'issue'`` part matches the class name of the page
161 you're editing.
163 Roundup server 
164 --------------
166 The roundup-server web interface now supports setgid and running on port
167 < 1024.
170 HTML templating made easier
171 ---------------------------
173 All HTML templating functions perform checks for permissions required to
174 display or edit the data they are manipulating. The simplest case is
175 editing an issue title. Including the expression::
177    context/title/field
179 Will present the user with an edit field, if they have edit permission. If
180 not, then they will be presented with a static display if they have view
181 permission. If they don't even have view permission, then an error message
182 is raised, preventing the display of the page, indicating that they don't
183 have permission to view the information.
185 This removes the need for the template to perform those checks, which was
186 just plain messy.
189 Standards changes
190 -----------------
192 We now set the HTTP Content-Length header when we serve up files, either
193 static ones from the "html" folder or file content from the database.
195 We also handle If-Modified-Since and supply Last-Modified for both types
196 of file too.
198 The HTML generated in the classic tracker is now HTML4 (or optionally
199 XHTML) compliant. The ``config.py`` variable "HTML_VERSION" is used to
200 control this behaviour.
202 We've got a printer setting in the stylesheet now too, so printed pages
203 don't include the sidebar.
206 Email Interface
207 ===============
209 Better handling of some email headers
210 -------------------------------------
212 We ignore messages with the header "Precedence: bulk".
214 If a Resent-From: header is present, it is used in preference to the From:
215 header when determining the author of the message. Useful for redirecting
216 error messages from automated systems.
219 Email character set
220 -------------------
222 The default character set for sending email is UTF-8 (ie. Unicode). If you
223 have users whose email clients can't handle UTF-8 (eg. Eudora) then you
224 will need to edit the new config.py variable ``EMAIL_CHARSET``.
227 Dispatcher configuration
228 ------------------------
230 A new config option has been added that specifies the email address of
231 a "dispatcher" role.  This email address acts as a central sentinel for
232 issues coming into the system. You can configure it so that all e-mail
233 error messages get bounced to them, them and the user in question, or
234 just the user (default).
236 To toggle these switches, add the "DISPATCHER_EMAIL" and
237 "ERROR_MESSAGES_TO" configuration values to your tracker's ``config.py``.
238 See the `customisation documentation`_ for how to use them.
241 More flexible message generation
242 --------------------------------
244 The code for generating email messages in Roundup has been refactored. A
245 new module, ``roundup.mailer`` contains most of the nuts-n-bolts required
246 to generate email messages from Roundup.
248 In addition, the ``IssueClass`` methods ``nosymessage()`` and
249 ``send_message()`` have both been altered so that they don't require the
250 message id parameter. This means that change notes with no associated
251 change message may now be generated much more easily.
254 Registration confirmation by email
255 ----------------------------------
257 Users may now reply to their registration confirmation email, and the
258 roundup mail gateway will complete their registration.
261 Database configuration
262 ======================
264 Postgresql added as a backend option
265 ------------------------------------
267 Trackers may now use the postgresql RDBMS as a database store.
269 Postgresql is a good choice if you expect your tracker to grow very large,
270 and are expecting many users.
273 Other improvements
274 ------------------
276 All RDBMS backends now have indexes automatically created on critical
277 table columns.
279 Additionally, the RDBMS backends also implement their own session,
280 one-time-key and full-text indexing stores. These were previously external
281 dbm stores. This change allows control of locking the database to be
282 completely handed over to the RDBMS.
284 Date values capture fractions of seconds now. Note that the MySQL backend
285 is not capable of storing this precision though, so it will be lost for
286 users of that backend.
289 Typed columns in RDBMS backends
290 -------------------------------
292 The MySQL (and Postgresql for that matter) backend now creates tables with
293 appropriate column datatypes (not just varchar). Sqlite got the typing
294 too, but it ignores the datatypes :)
296 Your database will be automatically migrated to use the new schemas, but
297 it will take time. It's probably a good idea to make sure you do this as
298 part of the upgrade when users are not expected to be using the system.
301 Permission setup
302 ----------------
304 0.7 automatically sets up the Edit and View Permissions for all classes,
305 thus you don't need to do so. Feel free to remove the code::
307     # Add new Permissions for this schema
308     for cl in 'issue', 'file', 'msg', 'user', 'query', 'keyword':
309         db.security.addPermission(name="Edit", klass=cl,
310             description="User is allowed to edit "+cl)
311         db.security.addPermission(name="View", klass=cl,
312             description="User is allowed to access "+cl)
314 from your ``dbinit.py``.
317 New "actor" property
318 --------------------
320 Roundup's database has a new per-item property "actor" which reflects the
321 user performing the last "actvitiy". See the classic template for ways to
322 integrate this new property into your interface.
324 The property will be automatically added to your existing database.
327 New Reject exception for Auditors
328 ---------------------------------
330 An auditor may raise this exception when the current create or set
331 operation should be stopped.
333 It is up to the specific interface invoking the create or set to
334 handle this exception sanely. For example:
336 - mailgw will trap and ignore Reject for file attachments and messages
337 - cgi will trap and present the exception in a nice format
340 New auditor fixes Outlook bug
341 -----------------------------
343 The new optional auditor ``detectors/emailauditor.py`` fires whenever a
344 new file entity is created.
346 If the file is of type message/rfc822, we tack onthe extension .eml.
348 The reason for this is that Microsoft Internet Explorer will not open
349 things with a .eml attachment, as they deem it 'unsafe'. Worse yet,
350 they'll just give you an incomprehensible error message. For more 
351 information, please see: 
353 http://support.microsoft.com/default.aspx?scid=kb;EN-US;825803
355 Their suggested work around is (excerpt):
357  WORKAROUND
359  To work around this behavior, rename the .EML file that the URL
360  links to so that it has a .MHT file name extension, and then update
361  the URL to reflect the change to the file name. To do this:
363  1. In Windows Explorer, locate and then select the .EML file that
364     the URL links.
365  2. Right-click the .EML file, and then click Rename.
366  3. Change the file name so that the .EML file uses a .MHT file name
367     extension, and then press ENTER.
368  4. Updated the URL that links to the file to reflect the new file
369     name extension.
372 New script for copying users
373 ----------------------------
375 A new script, ``scripts/copy-user.py``, will copy users from one tracker
376 to another.  Example usage::
378     copy-user.py /roundup/tracker1 /roundup/tracker2 `seq 3 10` 14 16
380 which copies users 3, 4, 5, 6, 7, 8, 9, 10, 14 and 16.
383 .. _`customisation documentation`: customizing.html