Code

499618a9acb21da56249e42c80090e170656b43a
[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 saying "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")``.
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.
113 ZRoundup reinstated
114 -------------------
116 The Zope interface, ZRoundup, lives again!
118 See the `upgrading documentation`__ if you wish to use it.
120 __ upgrading.html#zroundup-changes
123 Simple support for collision detection
124 --------------------------------------
126 Item edit pages that use the ``context/submit`` function to generate their
127 submit buttons now automatically include a datestamp in the form. This
128 datestamp is compared to the "activity" property of the item when the form
129 is submitted. If the "actvity" property is younger than the datestamp in
130 the form submission, then someone else has edited the item, and a page
131 indicating this is displayed to the user.
134 Extending the cgi interface
135 ---------------------------
137 Before 0.7.0 adding or extending web actions was done by overriding or adding
138 methods on the Client class. Though this approach still works to provide
139 backwards compatibility, it is recommended you upgrade to the new approach, as
140 described in the `Defining new web actions`__ section of the customization
141 documentation. You might also want to take a look at the `Using an external
142 password validation source`__ example.
144 __ customizing.html#defining-new-web-actions
145 __ customizing.html#using-an-external-password-validation-source
147 Actions may also return the content that should return to the user, which
148 causes the web interface to skip the normal template formatting step.
149 This could be used to return an image to the user instead of HTML. Be sure
150 to set the correct content-type header though! The default is still
151 text/html. This is done with::
153    self.client.setHeader('Content-Type', 'image/png')
155 if you were returning a PNG image.
158 Added CSV export action
159 -----------------------
161 A new action has been added which exports the current index page or search
162 result as a comma-separated-value (CSV) file.
164 To use it, add this to your "index" templates::
166   <a tal:attributes="href python:request.indexargs_url('issue',
167       {'@action':'export_csv'})">Download as CSV</a>
169 Making sure that the ``'issue'`` part matches the class name of the page
170 you're editing.
172 Roundup server 
173 --------------
175 The roundup-server web interface now supports setgid and running on port
176 < 1024.
179 HTML templating made easier
180 ---------------------------
182 All HTML templating functions perform checks for permissions required to
183 display or edit the data they are manipulating. The simplest case is
184 editing an issue title. Including the expression::
186    context/title/field
188 will present the user with an edit field if they have Edit Permission. If
189 not, then they will be presented with a static display if they have View
190 Permission. If they don't even have View Permission, then an error message
191 is raised, preventing the display of the page, indicating that they don't
192 have permission to view the information.
194 This removes the need for the template to perform those checks, which was
195 just plain messy.
197 Some new permissions will need to be created in your trackers to cope with
198 this change, as outlined in the `upgrading documentation`__.
200 __ upgrading.html#permission-assignments
203 Standards changes
204 -----------------
206 The HTTP Content-Length header when we serve up files, either
207 static ones from the "html" folder or file content from the database.
209 We also handle If-Modified-Since and supply Last-Modified for both types
210 of file too.
212 The HTML generated in the classic tracker is now HTML4 (or optionally
213 XHTML) compliant. The ``config.py`` variable "HTML_VERSION" is used to
214 control this behaviour.
216 The stylesheet includes printer settings now too, so printed pages
217 don't include the sidebar.
220 Email Interface
221 ===============
223 Better handling of some email headers
224 -------------------------------------
226 We ignore messages with the header "Precedence: bulk".
228 If a Resent-From: header is present, it is used in preference to the From:
229 header when determining the author of the message. Useful for redirecting
230 error messages from automated systems.
233 Email character set
234 -------------------
236 The default character set for sending email is UTF-8 (ie. Unicode). If you
237 have users whose email clients can't handle UTF-8 (eg. Eudora) then you
238 will need to edit the new config.py variable ``EMAIL_CHARSET``.
241 Dispatcher configuration
242 ------------------------
244 A new config option has been added that specifies the email address of
245 a "dispatcher" role.  This email address acts as a central sentinel for
246 issues coming into the system. You can configure it so that all e-mail
247 error messages get bounced to them, them and the user in question, or
248 just the user (default).
250 To toggle these switches, add the "DISPATCHER_EMAIL" and
251 "ERROR_MESSAGES_TO" configuration values to your tracker's ``config.py``.
252 See the `customisation documentation`_ for how to use them.
255 More flexible message generation
256 --------------------------------
258 The code for generating email messages in Roundup has been refactored. A
259 new module, ``roundup.mailer`` contains most of the nuts-n-bolts required
260 to generate email messages from Roundup.
262 In addition, the ``IssueClass`` methods ``nosymessage()`` and
263 ``send_message()`` have both been altered so that they don't require the
264 message id parameter. This means that change notes with no associated
265 change message may now be generated much more easily.
268 Registration confirmation by email
269 ----------------------------------
271 Users may now reply to their registration confirmation email, and the
272 roundup mail gateway will complete their registration.
275 Database configuration
276 ======================
278 Postgresql added as a backend option
279 ------------------------------------
281 Trackers may now use the postgresql RDBMS as a database store.
283 Postgresql is a good choice if you expect your tracker to grow very large,
284 and are expecting many users.
287 API change
288 ----------
290 The Database.curuserid attribute was removed. Any code referencing this
291 attribute should be replaced with a call to Database.getuid().
294 New configuration options
295 -------------------------
297 - Added DEFAULT_TIMEZONE which allows the tracker to have a different
298   default to UTC when users don't specify their own preference.
300 - Added EMAIL_CHARSET (in 0.6.6, but worth mentioning here) which hard-codes
301   the character set to be used when sending email from Roundup. This works
302   around some email clients' inability to cope well with UTF-8 (the
303   default).
305 - ERROR_MESSAGES_TO and DISPATCHER_EMAIL as described above in `Dispatcher
306   configuration`_.
309 Typed columns in RDBMS backends
310 -------------------------------
312 The SQLite, MySQL and Postgresql backends now create tables with
313 appropriate column datatypes (not just varchar).
315 Your database will be automatically migrated to use the new schemas, but
316 it will take time. It's probably a good idea to make sure you do this as
317 part of the upgrade when users are not expected to be using the system.
320 Permission setup
321 ----------------
323 0.7 automatically sets up the Edit and View Permissions for all classes,
324 thus you don't need to do so. Feel free to remove the code::
326     # Add new Permissions for this schema
327     for cl in 'issue', 'file', 'msg', 'user', 'query', 'keyword':
328         db.security.addPermission(name="Edit", klass=cl,
329             description="User is allowed to edit "+cl)
330         db.security.addPermission(name="View", klass=cl,
331             description="User is allowed to access "+cl)
333 from your ``dbinit.py``.
336 New "actor" property
337 --------------------
339 Roundup's database has a new per-item property "actor" which reflects the
340 user performing the last "actvitiy". See the classic template for ways to
341 integrate this new property into your interface.
343 The property will be automatically added to your existing database.
346 New Reject exception for Auditors
347 ---------------------------------
349 An auditor may raise this exception when the current create or set
350 operation should be stopped.
352 It is up to the specific interface invoking the create or set to
353 handle this exception sanely. For example:
355 - mailgw will trap and ignore Reject for file attachments and messages
356 - cgi will trap and present the exception in a nice format
359 New auditor fixes Outlook bug
360 -----------------------------
362 The new optional auditor ``detectors/emailauditor.py`` fires whenever a
363 new file entity is created.
365 If the file is of type message/rfc822, we tack on the extension .mht.
367 The reason for this is that Microsoft Internet Explorer will not open
368 things with a .eml attachment, as they deem it 'unsafe'. Worse yet,
369 they'll just give you an incomprehensible error message. For more 
370 information, please see: 
372 http://support.microsoft.com/default.aspx?scid=kb;EN-US;825803
374 Their suggested work around is (excerpt):
376  WORKAROUND
378  To work around this behavior, rename the .EML file that the URL
379  links to so that it has a .MHT file name extension, and then update
380  the URL to reflect the change to the file name. To do this:
382  1. In Windows Explorer, locate and then select the .EML file that
383     the URL links.
384  2. Right-click the .EML file, and then click Rename.
385  3. Change the file name so that the .EML file uses a .MHT file name
386     extension, and then press ENTER.
387  4. Updated the URL that links to the file to reflect the new file
388     name extension.
391 New script for copying users
392 ----------------------------
394 A new script, ``scripts/copy-user.py``, will copy users from one tracker
395 to another.  Example usage::
397     copy-user.py /roundup/tracker1 /roundup/tracker2 `seq 3 10` 14 16
399 which copies users 3, 4, 5, 6, 7, 8, 9, 10, 14 and 16.
402 Other improvements
403 ------------------
405 - All RDBMS backends now have indexes automatically created on critical
406   table columns.
408 - Additionally, the RDBMS backends also implement their own session,
409   one-time-key and full-text indexing stores. These were previously external
410   dbm stores. This change allows control of locking the database to be
411   completely handed over to the RDBMS.
413 - Date values capture fractions of seconds now. Note that the MySQL backend
414   is not capable of storing this precision though, so it will be lost for
415   users of that backend.
419 .. _`customisation documentation`: customizing.html