Code

Added the "actor" property. Metakit backend not done (still not confident
[roundup.git] / doc / upgrading.txt
1 ======================================
2 Upgrading to newer versions of Roundup
3 ======================================
5 Please read each section carefully and edit your tracker home files
6 accordingly. Note that there is information about upgrade procedures in the
7 `administration guide`_.
9 .. contents::
11 Migrating from 0.6 to 0.7
12 =========================
14 0.7.0 Permission setup
15 ----------------------
17 0.7 automatically sets up the Edit and View Permissions for all classes,
18 thus you don't need to do so. Feel free to remove the code::
20     # Add new Permissions for this schema
21     for cl in 'issue', 'file', 'msg', 'user', 'query', 'keyword':
22         db.security.addPermission(name="Edit", klass=cl,
23             description="User is allowed to edit "+cl)
24         db.security.addPermission(name="View", klass=cl,
25             description="User is allowed to access "+cl)
27 from your ``dbinit.py``.
30 0.7.0 Permission assignments
31 ----------------------------
33 Due to a change in the rendering of web widgets, permissions are now
34 checked on Classes where they previously weren't (this is a good thing).
36 You will need to add some additional Permission assignments for your
37 regular users, or some displays will break. After the following in your 
38 tracker's ``dbinit.py``::
40     # Assign the access and edit Permissions for issue, file and message
41     # to regular users now
42     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
43         p = db.security.getPermission('View', cl)
44         db.security.addPermissionToRole('User', p)
45         p = db.security.getPermission('Edit', cl)
46         db.security.addPermissionToRole('User', p)
48 add::
50     for cl in 'priority', 'status':
51         p = db.security.getPermission('View', cl)
52         db.security.addPermissionToRole('User', p)
54 0.7.0 New "actor" property
55 --------------------------
57 Roundup's database has a new per-item property "actor" which reflects the
58 user performing the last "actvitiy". See the classic template for ways to
59 integrate this new property into your interface.
62 0.7.0 Extending the cgi interface
63 ---------------------------------
65 Before 0.7.0 adding or extending web actions was done by overriding or adding
66 methods on the Client class. Though this approach still works to provide
67 backwards compatibility, it is recommended you upgrade to the new approach, as
68 described in the `Defining new web actions`__ section of the customization
69 documentation. You might also want to take a look at the `Using an external
70 password validation source`__ example.
72 __ customizing.html#defining-new-web-actions
73 __ customizing.html#using-an-external-password-validation-source
76 0.7.0 Getting the current user id
77 ---------------------------------
79 Removed Database.curuserid attribute. Any code referencing this attribute
80 should be replaced with a call to Database.getuid().
83 0.7.0 Email character set
84 -------------------------
86 The default character set for sending email is UTF-8 (ie. Unicode). If you
87 have users whose email clients can't handle UTF-8 (eg. Eudora) then you
88 will need to edit the new config.py variable ``EMAIL_CHARSET``.
91 0.7.0 ZRoundup changes
92 ----------------------
94 The templates in your tracker's html directory will need updating if you
95 wish to use ZRoundup. If you've not modified those files (or some of them),
96 you may just copy the new versions from the Roundup source in the
97 templates/classic/html directory.
99 If you have modified the html files, then you'll need to manually edit them
100 to change all occurances of special form variables from using the colon ":"
101 special character to the at "@" special character. That is, variables such
102 as::
104   :action :required :template :remove:messages ...
106 should become:
108   @action @required @template @remove@messages ...
110 Note that ``tal:`` statements are unaffected. So are TAL expression type
111 prefixes such as ``python:`` and ``string:``. Please ask on the
112 roundup-users mailing list for help if you're unsure.
115 Migrating from 0.6.x to 0.6.3
116 =============================
118 0.6.3 Configuration
119 -------------------
121 You will need to copy the file::
123   templates/classic/detectors/__init__.py
125 to your tracker's ``detectors`` directory, replacing the one already there.
126 This fixes a couple of bugs in that file.
130 Migrating from 0.5 to 0.6
131 =========================
134 0.6.0 Configuration
135 -------------------
137 Introduced EMAIL_FROM_TAG config variable. This value is inserted into
138 the From: line of nosy email. If the sending user is "Foo Bar", the
139 From: line is usually::
141      "Foo Bar" <issue_tracker@tracker.example>
143 the EMAIL_FROM_TAG goes inside the "Foo Bar" quotes like so::
145      "Foo Bar EMAIL_FROM_TAG" <issue_tracker@tracker.example>
147 I've altered the mechanism in the detectors __init__.py module so that it
148 doesn't cross-import detectors from other trackers (if you run more than one
149 in a single roundup-server). This change means that you'll need to copy the
150 __init__.py from roundup/templates/classic/detectors/__init__.py to your
151 <tracker home>/detectors/__init__.py. Don't worry, the "classic" __init__ is a
152 one-size-fits-all, so it'll work even if you've added/removed detectors.
154 0.6.0 Templating changes
155 ------------------------
157 The ``user.item`` template (in the tracker home "templates" directory)
158 needs to have the following hidden variable added to its form (between the
159 ``<form...>`` and ``</form>`` tags::
161   <input type="hidden" name=":template" value="item">
164 0.6.0 Form handling changes
165 ---------------------------
167 Roundup's form handling capabilities have been significantly expanded. This
168 should not affect users of 0.5 installations - but if you find you're
169 getting errors from form submissions, please ask for help on the Roundup
170 users mailing list:
172   http://lists.sourceforge.net/lists/listinfo/roundup-users
174 See the customisation doc section on `Form Values`__ for documentation of the
175 new form variables possible.
177 __ customizing.html#form-values
180 0.6.0 Multilingual character set support
181 ----------------------------------------
183 Added internationalization support. This is done via encoding all data
184 stored in roundup database to utf-8 (unicode encoding). To support utf-8 in
185 web interface you should add the folowing line to your tracker's html/page
186 and html/_generic.help files inside <head> tag::
187   
188     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
190 Since latin characters in utf-8 have the same codes as in ASCII table, this
191 modification is optional for users who use only plain latin characters. 
193 After this modification, you will be able to see and enter any world
194 character via web interface. Data received via mail interface also converted
195 to utf-8, however only new messages will be converted. If your roundup
196 database contains some of non-ASCII characters in one of 8-bit encoding,
197 they will not be visible in new unicode environment. Some of such data (e.g.
198 user names, keywords, etc)  can be edited by administrator, the others
199 (e.g. messages' contents) is not editable via web interface. Currently there
200 is no tool for converting such data, the only solution is to close
201 appropriate old issues and create new ones with the same content.
204 0.6.0 User timezone support
205 ---------------------------
207 From version 0.6.0 roundup supports displaying of Date data in user' local
208 timezone if he/she has provided timezone information. To make it possible
209 some modification to tracker's schema and HTML templates are required.
210 First you must add string property 'timezone' to user class in dbinit.py
211 like this::
212   
213     user = Class(db, "user", 
214                     username=String(),   password=Password(),
215                     address=String(),    realname=String(), 
216                     phone=String(),      organisation=String(),
217                     alternate_addresses=String(),
218                     queries=Multilink('query'), roles=String(),
219                     timezone=String())
220   
221 And second - html interface. Add following lines to
222 $TRACKER_HOME/html/user.item template::
223   
224      <tr>
225       <th>Timezone</th>
226       <td tal:content="structure context/timezone/field">timezone</td>
227      </tr>
229 After that all users should be able to provide their timezone information.
230 Timezone should be a positive or negative integer - offset from GMT.
232 After providing timezone, roundup will show all dates values, found in web
233 and mail interfaces in local time. It will also accept any Date info in
234 local time, convert and store it in GMT.
237 0.6.0 Search page structure
238 ---------------------------
240 In order to accomodate query editing the search page has been restructured. If
241 you want to provide your users with query editing, you should update your
242 search page using the macros detailed in the customisation doc section
243 `Searching on categories`__.
245 __ customizing.html#searching-on-categories
247 Also, the url field in the query class no longer starts with a '?'. You'll need
248 to remove this question mark from the url field to support queries. There's
249 a script in the "tools" directory called ``migrate-queries.py`` that should
250 automatically change any existing queries for you. As always, make a backup
251 of your database before running such a script.
254 0.6.0 Notes for metakit backend users
255 -------------------------------------
257 Roundup 0.6.0 introduced searching on ranges of dates and intervals. To
258 support it, some modifications to interval storing routine were made. So if
259 your tracker uses metakit backend and your db schema contains intervals
260 property, searches on that property will not be accurate for db items that
261 was stored before roundup' upgrade. However all new records should be
262 searchable on intervals.
264 It is possible to convert your database to new format: you can export and
265 import back all your data (consult "Migrating backends" in "Maintenance"
266 documentation). After this operation all your interval properties should
267 become searchable.
269 Users of backends others than metakit should not worry about this issue.
272 Migrating from 0.4.x to 0.5.0
273 =============================
275 This has been a fairly major revision of Roundup:
277 1. Brand new, much more powerful, flexible, tasty and nutritious templating.
278    Unfortunately, this means all your current templates are useless. Hopefully
279    the new documentation and examples will be enough to help you make the
280    transition. Please don't hesitate to ask on roundup-users for help (or
281    complete conversions if you're completely stuck)!
282 2. The database backed got a lot more flexible, allowing Metakit and SQL
283    databases! The only decent SQL database implemented at present is sqlite,
284    but others shouldn't be a whole lot more work.
285 3. A brand new, highly flexible and much more robust security system including
286    a system of Permissions, Roles and Role assignments to users. You may now
287    define your own Permissions that may be checked in CGI transactions.
288 4. Journalling has been made less storage-hungry, so has been turned on
289    by default *except* for author, recipient and nosy link/unlink events. You
290    are advised to turn it off in your trackers too.
291 5. We've changed the terminology from "instance" to "tracker", to ease the
292    learning curve/impact for new users.
293 6. Because of the above changes, the tracker configuration has seen some
294    major changes. See below for the details.
296 Please, **back up your database** before you start the migration process. This
297 is as simple as copying the "db" directory and all its contents from your
298 tracker to somewhere safe.
301 0.5.0 Configuration
302 -------------------
304 First up, rename your ``instance_config.py`` file to just ``config.py``.
306 Then edit your tracker's ``__init__.py`` module. It'll currently look
307 like this::
309  from instance_config import *
310  try:
311      from dbinit import *
312  except ImportError:
313      pass # in installdir (probably :)
314  from interfaces import *
316 and it needs to be::
318  import config
319  from dbinit import open, init
320  from interfaces import Client, MailGW
322 Due to the new templating having a top-level ``page`` that defines links for
323 searching, indexes, adding items etc, the following variables are no longer
324 used:
326 - HEADER_INDEX_LINKS
327 - HEADER_ADD_LINKS
328 - HEADER_SEARCH_LINKS
329 - SEARCH_FILTERS
330 - DEFAULT_INDEX
331 - UNASSIGNED_INDEX
332 - USER_INDEX
333 - ISSUE_FILTER
335 The new security implementation will require additions to the dbinit module,
336 but also removes the need for the following tracker config variables:
338 - ANONYMOUS_ACCESS
339 - ANONYMOUS_REGISTER
341 but requires two new variables which define the Roles assigned to users who
342 register through the web and e-mail interfaces:
344 - NEW_WEB_USER_ROLES
345 - NEW_EMAIL_USER_ROLES
347 in both cases, 'User' is a good initial setting. To emulate
348 ``ANONYMOUS_ACCESS='deny'``, remove all "View" Permissions from the
349 "Anonymous" Role. To emulate ``ANONYMOUS_REGISTER='deny'``, remove the "Web
350 Registration" and/or the "Email Registration" Permission from the "Anonymous"
351 Role. See the section on customising security in the `customisation
352 documentation`_ for more information.
354 Finally, the following config variables have been renamed to make more sense:
356 - INSTANCE_HOME -> TRACKER_HOME
357 - INSTANCE_NAME -> TRACKER_NAME
358 - ISSUE_TRACKER_WEB -> TRACKER_WEB
359 - ISSUE_TRACKER_EMAIL -> TRACKER_EMAIL
362 0.5.0 Schema Specification
363 --------------------------
365 0.5.0 Database backend changes
366 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
368 Your select_db module in your tracker has changed a fair bit. Where it used
369 to contain::
371  # WARNING: DO NOT EDIT THIS FILE!!!
372  from roundup.backends.back_anydbm import Database
374 it must now contain::
376  # WARNING: DO NOT EDIT THIS FILE!!!
377  from roundup.backends.back_anydbm import Database, Class, FileClass, IssueClass
379 Yes, I realise the irony of the "DO NOT EDIT THIS FILE" statement :)
380 Note the addition of the Class, FileClass, IssueClass imports. These are very
381 important, as they're going to make the next change work too. You now need to
382 modify the top of the dbinit module in your tracker from::
384  import instance_config
385  from roundup import roundupdb
386  from select_db import Database
388  from roundup.roundupdb import Class, FileClass
390  class Database(roundupdb.Database, select_db.Database):
391      ''' Creates a hybrid database from:
392           . the selected database back-end from select_db
393           . the roundup extensions from roundupdb
394      '''
395      pass
397  class IssueClass(roundupdb.IssueClass):
398      ''' issues need the email information
399      '''
400      pass
402 to::
404  import config
405  from select_db import Database, Class, FileClass, IssueClass
407 Yes, remove the Database and IssueClass definitions and those other imports.
408 They're not needed any more!
410 Look for places in dbinit.py where ``instance_config`` is used too, and
411 rename them ``config``.
414 0.5.0 Journalling changes
415 ~~~~~~~~~~~~~~~~~~~~~~~~~
417 Journalling has been optimised for storage. Journalling of links has been
418 turned back on by default. If your tracker has a large user base, you may wish
419 to turn off journalling of nosy list, message author and message recipient
420 link and unlink events. You do this by adding ``do_journal='no'`` to the Class
421 initialisation in your dbinit. For example, your *msg* class initialisation
422 probably looks like this::
424     msg = FileClass(db, "msg",
425                     author=Link("user"), recipients=Multilink("user"),
426                     date=Date(),         summary=String(),
427                     files=Multilink("file"),
428                     messageid=String(),  inreplyto=String())
430 to turn off journalling of author and recipient link events, add
431 ``do_journal='no'`` to the ``author=Link("user")`` part of the statement,
432 like so::
434     msg = FileClass(db, "msg",
435                     author=Link("user", do_journal='no'),
436                     recipients=Multilink("user", do_journal='no'),
437                     date=Date(),         summary=String(),
438                     files=Multilink("file"),
439                     messageid=String(),  inreplyto=String())
441 Nosy list link event journalling is actually turned off by default now. If you
442 want to turn it on, change to your issue class' nosy list, change its
443 definition from::
445     issue = IssueClass(db, "issue",
446                     assignedto=Link("user"), topic=Multilink("keyword"),
447                     priority=Link("priority"), status=Link("status"))
449 to::
451     issue = IssueClass(db, "issue", nosy=Multilink("user", do_journal='yes'),
452                     assignedto=Link("user"), topic=Multilink("keyword"),
453                     priority=Link("priority"), status=Link("status"))
455 noting that your definition of the nosy Multilink will override the normal one.
458 0.5.0 User schema changes
459 ~~~~~~~~~~~~~~~~~~~~~~~~~
461 Users have two more properties, "queries" and "roles". You'll have something
462 like this in your dbinit module now::
464     user = Class(db, "user",
465                     username=String(),   password=Password(),
466                     address=String(),    realname=String(),
467                     phone=String(),      organisation=String(),
468                     alternate_addresses=String())
469     user.setkey("username")
471 and you'll need to add the new properties and the new "query" class to it
472 like so::
474     query = Class(db, "query",
475                     klass=String(),     name=String(),
476                     url=String())
477     query.setkey("name")
479     # Note: roles is a comma-separated string of Role names
480     user = Class(db, "user",
481                     username=String(),   password=Password(),
482                     address=String(),    realname=String(),
483                     phone=String(),      organisation=String(),
484                     alternate_addresses=String(),
485                     queries=Multilink('query'), roles=String())
486     user.setkey("username")
488 The "queries" property is used to store off the user's favourite database
489 queries. The "roles" property is explained below in `0.5.0 Security
490 Settings`_.
493 0.5.0 Security Settings
494 ~~~~~~~~~~~~~~~~~~~~~~~
496 See the `security documentation`_ for an explanation of how the new security
497 system works. In a nutshell though, the security is handled as a four step
498 process:
500 1. Permissions are defined as having a name and optionally a hyperdb class
501    they're specific to,
502 2. Roles are defined that have one or more Permissions,
503 3. Users are assigned Roles in their "roles" property, and finally
504 4. Roundup checks that users have appropriate Permissions at appropriate times
505    (like editing issues).
507 Your tracker dbinit module's *open* function now has to define any
508 Permissions that are specific to your tracker, and also the assignment
509 of Permissions to Roles. At the moment, your open function
510 ends with::
512     import detectors
513     detectors.init(db)
515     return db
517 and what we need to do is insert some commands that will set up the security
518 parameters. Right above the ``import detectors`` line, you'll want to insert
519 these lines::
521     #
522     # SECURITY SETTINGS
523     #
524     # new permissions for this schema
525     for cl in 'issue', 'file', 'msg', 'user':
526         db.security.addPermission(name="Edit", klass=cl,
527             description="User is allowed to edit "+cl)
528         db.security.addPermission(name="View", klass=cl,
529             description="User is allowed to access "+cl)
531     # Assign the access and edit permissions for issue, file and message
532     # to regular users now
533     for cl in 'issue', 'file', 'msg':
534         p = db.security.getPermission('View', cl)
535         db.security.addPermissionToRole('User', p)
536         p = db.security.getPermission('Edit', cl)
537         db.security.addPermissionToRole('User', p)
538     # and give the regular users access to the web and email interface
539     p = db.security.getPermission('Web Access')
540     db.security.addPermissionToRole('User', p)
541     p = db.security.getPermission('Email Access')
542     db.security.addPermissionToRole('User', p)
544     # May users view other user information? Comment these lines out
545     # if you don't want them to
546     p = db.security.getPermission('View', 'user')
547     db.security.addPermissionToRole('User', p)
549     # Assign the appropriate permissions to the anonymous user's Anonymous
550     # Role. Choices here are:
551     # - Allow anonymous users to register through the web
552     p = db.security.getPermission('Web Registration')
553     db.security.addPermissionToRole('Anonymous', p)
554     # - Allow anonymous (new) users to register through the email gateway
555     p = db.security.getPermission('Email Registration')
556     db.security.addPermissionToRole('Anonymous', p)
557     # - Allow anonymous users access to the "issue" class of data
558     #   Note: this also grants access to related information like files,
559     #         messages, statuses etc that are linked to issues
560     #p = db.security.getPermission('View', 'issue')
561     #db.security.addPermissionToRole('Anonymous', p)
562     # - Allow anonymous users access to edit the "issue" class of data
563     #   Note: this also grants access to create related information like
564     #         files and messages etc that are linked to issues
565     #p = db.security.getPermission('Edit', 'issue')
566     #db.security.addPermissionToRole('Anonymous', p)
568     # oh, g'wan, let anonymous access the web interface too
569     p = db.security.getPermission('Web Access')
570     db.security.addPermissionToRole('Anonymous', p)
572 Note in the comments there the places where you might change the permissions
573 to restrict users or grant users more access. If you've created additional
574 classes that users should be able to edit and view, then you should add them
575 to the "new permissions for this schema" section at the start of the security
576 block. Then add them to the "Assign the access and edit permissions" section
577 too, so people actually have the new Permission you've created.
579 One final change is needed that finishes off the security system's
580 initialisation. We need to add a call to ``db.post_init()`` at the end of the
581 dbinit open() function. Add it like this::
583     import detectors
584     detectors.init(db)
586     # schema is set up - run any post-initialisation
587     db.post_init()
588     return db
590 You may verify the setup of Permissions and Roles using the new
591 "``roundup-admin security``" command.
594 0.5.0 User changes
595 ~~~~~~~~~~~~~~~~~~
597 To support all those schema changes, you'll need to massage your user database
598 a little too, to:
600 1. make sure there's an "anonymous" user - this user is mandatory now and is
601    the one that unknown users are logged in as.
602 2. make sure all users have at least one Role.
604 If you don't have the "anonymous" user, create it now with the command::
606   roundup-admin create user username=anonymous roles=Anonymous
608 making sure the capitalisation is the same as above. Once you've done that,
609 you'll need to set the roles property on all users to a reasonable default.
610 The admin user should get "Admin", the anonymous user "Anonymous"
611 and all other users "User". The ``fixroles.py`` script in the tools directory
612 will do this. Run it like so (where python is your python 2+ binary)::
614   python tools/fixroles.py -i <tracker home> fixroles
618 0.5.0 CGI interface changes
619 ---------------------------
621 The CGI interface code was completely reorganised and largely rewritten. The
622 end result is that this section of your tracker interfaces module will need
623 changing from::
625  from roundup import cgi_client, mailgw
626  from roundup.i18n import _
627  
628  class Client(cgi_client.Client):
629      ''' derives basic CGI implementation from the standard module,
630          with any specific extensions
631      '''
632      pass
634 to::
636  from roundup import mailgw
637  from roundup.cgi import client
638  
639  class Client(client.Client): 
640      ''' derives basic CGI implementation from the standard module,
641          with any specific extensions
642      '''
643      pass
645 You will also need to install the new version of roundup.cgi from the source
646 cgi-bin directory if you're using it.
649 0.5.0 HTML templating
650 ---------------------
652 You'll want to make a backup of your current tracker html directory. You
653 should then copy the html directory from the Roundup source "classic" template
654 and modify it according to your local schema changes.
656 If you need help with the new templating system, please ask questions on the
657 roundup-users mailing list (available through the roundup project page on
658 sourceforge, http://roundup.sf.net/)
661 0.5.0 Detectors
662 ---------------
664 The nosy reactor has been updated to handle the tracker not having an
665 "assignedto" property on issues. You may want to copy it into your tracker's
666 detectors directory. Chances are you've already fixed it though :)
669 Migrating from 0.4.1 to 0.4.2
670 =============================
672 0.4.2 Configuration
673 -------------------
674 The USER_INDEX definition introduced in 0.4.1 was too restrictive in its
675 allowing replacement of 'assignedto' with the user's userid. Users must change
676 the None value of 'assignedto' to 'CURRENT USER' (the string, in quotes) for
677 the replacement behaviour to occur now.
679 The new configuration variables are:
681 - EMAIL_KEEP_QUOTED_TEXT 
682 - EMAIL_LEAVE_BODY_UNCHANGED
683 - ADD_RECIPIENTS_TO_NOSY
685 See the sample configuration files in::
687  <roundup source>/roundup/templates/classic/instance_config.py
689 and::
691  <roundup source>/roundup/templates/extended/instance_config.py
693 and the `customisation documentation`_ for information on how they're used.
696 0.4.2 Changes to detectors
697 --------------------------
698 You will need to copy the detectors from the distribution into your instance
699 home "detectors" directory. If you used the classic schema, the detectors
700 are in::
702  <roundup source>/roundup/templates/classic/detectors/
704 If you used the extended schema, the detectors are in::
706  <roundup source>/roundup/templates/extended/detectors/
708 The change means that schema-specific code has been removed from the
709 mail gateway and cgi interface and made into auditors:
711 - nosyreactor.py has now got an updatenosy auditor which updates the nosy
712   list with author, recipient and assignedto information.
713 - statusauditor.py makes the unread or resolved -> chatting changes and
714   presets the status of an issue to unread.
716 There's also a bug or two fixed in the nosyreactor code.
718 0.4.2 HTML templating changes
719 -----------------------------
720 The link() htmltemplate function now has a "showid" option for links and
721 multilinks. When true, it only displays the linked item id as the anchor
722 text. The link value is displayed as a tooltip using the title anchor
723 attribute. To use in eg. the superseder field, have something like this::
725    <td>
726     <display call="field('superseder', showid=1)">
727     <display call="classhelp('issue', 'id,title', label='list', width=500)">
728     <property name="superseder">
729      <br>View: <display call="link('superseder', showid=1)">
730     </property>
731    </td>
733 The stylesheets have been cleaned up too. You may want to use the newer
734 versions in::
736  <roundup source>/roundup/templates/<template>/html/default.css
740 Migrating from 0.4.0 to 0.4.1
741 =============================
743 0.4.1 Files storage
744 -------------------
746 Messages and files from newly created issues will be put into subdierectories
747 in thousands e.g. msg123 will be put into files/msg/0/msg123, file2003
748 will go into files/file/2/file2003. Previous messages are still found, but
749 could be put into this structure.
751 0.4.1 Configuration
752 -------------------
754 To allow more fine-grained access control, the variable used to check
755 permission to auto-register users in the mail gateway is now called
756 ANONYMOUS_REGISTER_MAIL rather than overloading ANONYMOUS_REGISTER. If the
757 variable doesn't exist, then ANONYMOUS_REGISTER is tested as before.
759 Configuring the links in the web header is now easier too. The following
760 variables have been added to the classic instance_config.py::
762   HEADER_INDEX_LINKS   - defines the "index" links to be made available
763   HEADER_ADD_LINKS     - defines the "add" links
764   DEFAULT_INDEX        - specifies the index view for DEFAULT
765   UNASSIGNED_INDEX     - specifies the index view for UNASSIGNED
766   USER_INDEX           - specifies the index view for USER
768 See the <roundup source>/roundup/templates/classic/instance_config.py for more
769 information - including how the variables are to be set up. Most users will
770 just be able to copy the variables from the source to their instance home. If
771 you've modified the header by changing the source of the interfaces.py file in
772 the instance home, you'll need to remove that customisation and move it into
773 the appropriate variables in instance_config.py.
775 The extended schema has similar variables added too - see the source for more
776 info.
778 0.4.1 Alternate E-Mail Addresses
779 --------------------------------
781 If you add the property "alternate_addresses" to your user class, your users
782 will be able to register alternate email addresses that they may use to
783 communicate with roundup as. All email from roundup will continue to be sent
784 to their primary address.
786 If you have not edited the dbinit.py file in your instance home directory,
787 you may simply copy the new dbinit.py file from the core code. If you used
788 the classic schema, the interfaces file is in::
790  <roundup source>/roundup/templates/classic/dbinit.py
792 If you used the extended schema, the file is in::
794  <roundup source>/roundup/templates/extended/dbinit.py 
796 If you have modified your dbinit.py file, you need to edit the dbinit.py
797 file in your instance home directory. Find the lines which define the user
798 class::
800     user = Class(db, "msg",
801                     username=String(),   password=Password(),
802                     address=String(),    realname=String(), 
803                     phone=String(),      organisation=String(),
804                     alternate_addresses=String())
806 You will also want to add the property to the user's details page. The
807 template for this is the "user.item" file in your instance home "html"
808 directory. Similar to above, you may copy the file from the roundup source if
809 you haven't modified it. Otherwise, add the following to the template::
811    <display call="multiline('alternate_addresses')">
813 with appropriate labelling etc. See the standard template for an idea.
817 Migrating from 0.3.x to 0.4.0
818 =============================
820 0.4.0 Message-ID and In-Reply-To addition
821 -----------------------------------------
822 0.4.0 adds the tracking of messages by message-id and allows threading
823 using in-reply-to. Most e-mail clients support threading using this
824 feature, and we hope to add support for it to the web gateway. If you
825 have not edited the dbinit.py file in your instance home directory, you may
826 simply copy the new dbinit.py file from the core code. If you used the
827 classic schema, the interfaces file is in::
829  <roundup source>/roundup/templates/classic/dbinit.py
831 If you used the extended schema, the file is in::
833  <roundup source>/roundup/templates/extended/dbinit.py 
835 If you have modified your dbinit.py file, you need to edit the dbinit.py
836 file in your instance home directory. Find the lines which define the msg
837 class::
839     msg = FileClass(db, "msg",
840                     author=Link("user"), recipients=Multilink("user"),
841                     date=Date(),         summary=String(),
842                     files=Multilink("file"))
844 and add the messageid and inreplyto properties like so::
846     msg = FileClass(db, "msg",
847                     author=Link("user"), recipients=Multilink("user"),
848                     date=Date(),         summary=String(),
849                     files=Multilink("file"),
850                     messageid=String(),  inreplyto=String())
852 Also, configuration is being cleaned up. This means that your dbinit.py will
853 also need to be changed in the open function. If you haven't changed your
854 dbinit.py, the above copy will be enough. If you have, you'll need to change
855 the line (round line 50)::
857     db = Database(instance_config.DATABASE, name)
859 to::
861     db = Database(instance_config, name)
864 0.4.0 Configuration
865 --------------------
866 ``TRACKER_NAME`` and ``EMAIL_SIGNATURE_POSITION`` have been added to the
867 instance_config.py. The simplest solution is to copy the default values
868 from template in the core source.
870 The mail gateway now checks ``ANONYMOUS_REGISTER`` to see if unknown users
871 are to be automatically registered with the tracker. If it is set to "deny"
872 then unknown users will not have access. If it is set to "allow" they will be
873 automatically registered with the tracker.
876 0.4.0 CGI script roundup.cgi
877 ----------------------------
878 The CGI script has been updated with some features and a bugfix, so you should
879 copy it from the roundup cgi-bin source directory again. Make sure you update
880 the ROUNDUP_INSTANCE_HOMES after the copy.
883 0.4.0 Nosy reactor
884 ------------------
885 The nosy reactor has also changed - copy the nosyreactor.py file from the core
886 source::
888    <roundup source>/roundup/templates/<template>/detectors/nosyreactor.py
890 to your instance home "detectors" directory.
893 0.4.0 HTML templating
894 ---------------------
895 The field() function was incorrectly implemented - links and multilinks now
896 display as text fields when rendered using field(). To display a menu (drop-
897 down or select box) you need to use the menu() function.
901 Migrating from 0.2.x to 0.3.x
902 =============================
904 0.3.x Cookie Authentication changes
905 -----------------------------------
906 0.3.0 introduces cookie authentication - you will need to copy the
907 interfaces.py file from the roundup source to your instance home to enable
908 authentication. If you used the classic schema, the interfaces file is in::
910  <roundup source>/roundup/templates/classic/interfaces.py
912 If you used the extended schema, the file is in::
914  <roundup source>/roundup/templates/extended/interfaces.py
916 If you have modified your interfaces.Client class, you will need to take
917 note of the login/logout functionality provided in roundup.cgi_client.Client
918 (classic schema) or roundup.cgi_client.ExtendedClient (extended schema) and
919 modify your instance code apropriately.
922 0.3.x Password encoding
923 -----------------------
924 This release also introduces encoding of passwords in the database. If you
925 have not edited the dbinit.py file in your instance home directory, you may
926 simply copy the new dbinit.py file from the core code. If you used the
927 classic schema, the interfaces file is in::
929  <roundup source>/roundup/templates/classic/dbinit.py
931 If you used the extended schema, the file is in::
933  <roundup source>/roundup/templates/extended/dbinit.py
936 If you have modified your dbinit.py file, you may use encoded passwords:
938 1. Edit the dbinit.py file in your instance home directory
939    a. At the first code line of the open() function::
941        from roundup.hyperdb import String, Date, Link, Multilink
943       alter to include Password, as so::
945        from roundup.hyperdb import String, Password, Date, Link, Multilink
947    b. Where the password property is defined (around line 66)::
949        user = Class(db, "user", 
950                        username=String(),   password=String(),
951                        address=String(),    realname=String(), 
952                        phone=String(),      organisation=String())
953        user.setkey("username")
955       alter the "password=String()" to "password=Password()"::
957        user = Class(db, "user", 
958                        username=String(),   password=Password(),
959                        address=String(),    realname=String(), 
960                        phone=String(),      organisation=String())
961        user.setkey("username")
963 2. Any existing passwords in the database will remain cleartext until they
964    are edited. It is recommended that at a minimum the admin password be
965    changed immediately::
967       roundup-admin -i <instance home> set user1 password=<new password>
970 0.3.x Configuration
971 -------------------
972 FILTER_POSITION, ANONYMOUS_ACCESS, ANONYMOUS_REGISTER have been added to
973 the instance_config.py. Simplest solution is to copy the default values from
974 template in the core source.
976 MESSAGES_TO_AUTHOR has been added to the IssueClass in dbinit.py. Set to 'yes'
977 to send nosy messages to the author. Default behaviour is to not send nosy
978 messages to the author. You will need to add MESSAGES_TO_AUTHOR to your
979 dbinit.py in your instance home.
982 0.3.x CGI script roundup.cgi
983 ----------------------------
984 There have been some structural changes to the roundup.cgi script - you will
985 need to install it again from the cgi-bin directory of the source
986 distribution. Make sure you update the ROUNDUP_INSTANCE_HOMES after the
987 copy.
990 .. _`customisation documentation`: customizing.html
991 .. _`security documentation`: security.html
992 .. _`administration guide`: admin.html