Code

Did a couple of things:
[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::
13 Migrating from 0.7 to 0.8
14 =========================
16 0.8.0 Added Dispatcher role
17 ---------------------------
19 A new config option has been added. There is a 'role' that can be filled, 
20 that of the 'dispatcher'. This person acts as a central sentinel for issues
21 coming into the system. You can configure it so that all e-mail error messages
22 get bounced to them, them and the user in question, or just the user (default).
24 To toggle these switches, look at the new classic and minimal config.py's,
25 specifically:
28 # The 'dispatcher' is a role that can get notified of new items to the database.
29 DISPATCHER_EMAIL = ADMIN_EMAIL
31 ...
34 # Send error messages to the dispatcher, user, or both?
35 # If 'dispatcher', error message notifications will only be sent to the dispatcher.
36 # If 'user',       error message notifications will only be sent to the user.
37 # If 'both',       error message notifications will be sent to both individuals.
38 ERROR_MESSAGES_TO = 'user'
40 Migrating from 0.6 to 0.7
41 =========================
43 0.7.0 Added CSV export action
44 -----------------------------
46 A new action has been added which exports the current index page or search
47 result as a comma-separated-value (CSV) file.
49 To use it, add this to your "index" templates:
51 <a tal:attributes="href python:request.indexargs_url('issue',
52             {'@action':'csv_export'})">Download as CSV</a>
54 Making sure that the ``'issue'`` part matches the class name of the page
55 you're editing.
58 0.7.0 Typed columns in MySQL backend
59 ------------------------------------
61 The MySQL (and Postgresql for that matter) backend now creates tables with
62 appropriate column datatypes (not just varchar).
64 Your database will be automatically migrated to use the new schemas, but
65 it will take time. It's probably a good idea to make sure you do this as
66 part of the upgrade when users are not expected to be using the system.
69 0.7.0 Permission setup
70 ----------------------
72 0.7 automatically sets up the Edit and View Permissions for all classes,
73 thus you don't need to do so. Feel free to remove the code::
75     # Add new Permissions for this schema
76     for cl in 'issue', 'file', 'msg', 'user', 'query', 'keyword':
77         db.security.addPermission(name="Edit", klass=cl,
78             description="User is allowed to edit "+cl)
79         db.security.addPermission(name="View", klass=cl,
80             description="User is allowed to access "+cl)
82 from your ``dbinit.py``.
85 0.7.0 Permission assignments
86 ----------------------------
88 Due to a change in the rendering of web widgets, permissions are now
89 checked on Classes where they previously weren't (this is a good thing).
91 You will need to add some additional Permission assignments for your
92 regular users, or some displays will break. After the following in your 
93 tracker's ``dbinit.py``::
95     # Assign the access and edit Permissions for issue, file and message
96     # to regular users now
97     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
98         p = db.security.getPermission('View', cl)
99         db.security.addPermissionToRole('User', p)
100         p = db.security.getPermission('Edit', cl)
101         db.security.addPermissionToRole('User', p)
103 add::
105     for cl in 'priority', 'status':
106         p = db.security.getPermission('View', cl)
107         db.security.addPermissionToRole('User', p)
110 0.7.0 New "actor" property
111 --------------------------
113 Roundup's database has a new per-item property "actor" which reflects the
114 user performing the last "actvitiy". See the classic template for ways to
115 integrate this new property into your interface.
117 The property will be automatically added to your existing database.
120 0.7.0 Extending the cgi interface
121 ---------------------------------
123 Before 0.7.0 adding or extending web actions was done by overriding or adding
124 methods on the Client class. Though this approach still works to provide
125 backwards compatibility, it is recommended you upgrade to the new approach, as
126 described in the `Defining new web actions`__ section of the customization
127 documentation. You might also want to take a look at the `Using an external
128 password validation source`__ example.
130 __ customizing.html#defining-new-web-actions
131 __ customizing.html#using-an-external-password-validation-source
134 0.7.0 Getting the current user id
135 ---------------------------------
137 Removed Database.curuserid attribute. Any code referencing this attribute
138 should be replaced with a call to Database.getuid().
141 0.7.0 Email character set
142 -------------------------
144 The default character set for sending email is UTF-8 (ie. Unicode). If you
145 have users whose email clients can't handle UTF-8 (eg. Eudora) then you
146 will need to edit the new config.py variable ``EMAIL_CHARSET``.
149 0.7.0 ZRoundup changes
150 ----------------------
152 The templates in your tracker's html directory will need updating if you
153 wish to use ZRoundup. If you've not modified those files (or some of them),
154 you may just copy the new versions from the Roundup source in the
155 templates/classic/html directory.
157 If you have modified the html files, then you'll need to manually edit them
158 to change all occurances of special form variables from using the colon ":"
159 special character to the at "@" special character. That is, variables such
160 as::
162   :action :required :template :remove:messages ...
164 should become:
166   @action @required @template @remove@messages ...
168 Note that ``tal:`` statements are unaffected. So are TAL expression type
169 prefixes such as ``python:`` and ``string:``. Please ask on the
170 roundup-users mailing list for help if you're unsure.
173 Migrating from 0.6.x to 0.6.3
174 =============================
176 0.6.3 Configuration
177 -------------------
179 You will need to copy the file::
181   templates/classic/detectors/__init__.py
183 to your tracker's ``detectors`` directory, replacing the one already there.
184 This fixes a couple of bugs in that file.
188 Migrating from 0.5 to 0.6
189 =========================
192 0.6.0 Configuration
193 -------------------
195 Introduced EMAIL_FROM_TAG config variable. This value is inserted into
196 the From: line of nosy email. If the sending user is "Foo Bar", the
197 From: line is usually::
199      "Foo Bar" <issue_tracker@tracker.example>
201 the EMAIL_FROM_TAG goes inside the "Foo Bar" quotes like so::
203      "Foo Bar EMAIL_FROM_TAG" <issue_tracker@tracker.example>
205 I've altered the mechanism in the detectors __init__.py module so that it
206 doesn't cross-import detectors from other trackers (if you run more than one
207 in a single roundup-server). This change means that you'll need to copy the
208 __init__.py from roundup/templates/classic/detectors/__init__.py to your
209 <tracker home>/detectors/__init__.py. Don't worry, the "classic" __init__ is a
210 one-size-fits-all, so it'll work even if you've added/removed detectors.
212 0.6.0 Templating changes
213 ------------------------
215 The ``user.item`` template (in the tracker home "templates" directory)
216 needs to have the following hidden variable added to its form (between the
217 ``<form...>`` and ``</form>`` tags::
219   <input type="hidden" name=":template" value="item">
222 0.6.0 Form handling changes
223 ---------------------------
225 Roundup's form handling capabilities have been significantly expanded. This
226 should not affect users of 0.5 installations - but if you find you're
227 getting errors from form submissions, please ask for help on the Roundup
228 users mailing list:
230   http://lists.sourceforge.net/lists/listinfo/roundup-users
232 See the customisation doc section on `Form Values`__ for documentation of the
233 new form variables possible.
235 __ customizing.html#form-values
238 0.6.0 Multilingual character set support
239 ----------------------------------------
241 Added internationalization support. This is done via encoding all data
242 stored in roundup database to utf-8 (unicode encoding). To support utf-8 in
243 web interface you should add the folowing line to your tracker's html/page
244 and html/_generic.help files inside <head> tag::
245   
246     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
248 Since latin characters in utf-8 have the same codes as in ASCII table, this
249 modification is optional for users who use only plain latin characters. 
251 After this modification, you will be able to see and enter any world
252 character via web interface. Data received via mail interface also converted
253 to utf-8, however only new messages will be converted. If your roundup
254 database contains some of non-ASCII characters in one of 8-bit encoding,
255 they will not be visible in new unicode environment. Some of such data (e.g.
256 user names, keywords, etc)  can be edited by administrator, the others
257 (e.g. messages' contents) is not editable via web interface. Currently there
258 is no tool for converting such data, the only solution is to close
259 appropriate old issues and create new ones with the same content.
262 0.6.0 User timezone support
263 ---------------------------
265 From version 0.6.0 roundup supports displaying of Date data in user' local
266 timezone if he/she has provided timezone information. To make it possible
267 some modification to tracker's schema and HTML templates are required.
268 First you must add string property 'timezone' to user class in dbinit.py
269 like this::
270   
271     user = Class(db, "user", 
272                     username=String(),   password=Password(),
273                     address=String(),    realname=String(), 
274                     phone=String(),      organisation=String(),
275                     alternate_addresses=String(),
276                     queries=Multilink('query'), roles=String(),
277                     timezone=String())
278   
279 And second - html interface. Add following lines to
280 $TRACKER_HOME/html/user.item template::
281   
282      <tr>
283       <th>Timezone</th>
284       <td tal:content="structure context/timezone/field">timezone</td>
285      </tr>
287 After that all users should be able to provide their timezone information.
288 Timezone should be a positive or negative integer - offset from GMT.
290 After providing timezone, roundup will show all dates values, found in web
291 and mail interfaces in local time. It will also accept any Date info in
292 local time, convert and store it in GMT.
295 0.6.0 Search page structure
296 ---------------------------
298 In order to accomodate query editing the search page has been restructured. If
299 you want to provide your users with query editing, you should update your
300 search page using the macros detailed in the customisation doc section
301 `Searching on categories`__.
303 __ customizing.html#searching-on-categories
305 Also, the url field in the query class no longer starts with a '?'. You'll need
306 to remove this question mark from the url field to support queries. There's
307 a script in the "tools" directory called ``migrate-queries.py`` that should
308 automatically change any existing queries for you. As always, make a backup
309 of your database before running such a script.
312 0.6.0 Notes for metakit backend users
313 -------------------------------------
315 Roundup 0.6.0 introduced searching on ranges of dates and intervals. To
316 support it, some modifications to interval storing routine were made. So if
317 your tracker uses metakit backend and your db schema contains intervals
318 property, searches on that property will not be accurate for db items that
319 was stored before roundup' upgrade. However all new records should be
320 searchable on intervals.
322 It is possible to convert your database to new format: you can export and
323 import back all your data (consult "Migrating backends" in "Maintenance"
324 documentation). After this operation all your interval properties should
325 become searchable.
327 Users of backends others than metakit should not worry about this issue.
330 Migrating from 0.4.x to 0.5.0
331 =============================
333 This has been a fairly major revision of Roundup:
335 1. Brand new, much more powerful, flexible, tasty and nutritious templating.
336    Unfortunately, this means all your current templates are useless. Hopefully
337    the new documentation and examples will be enough to help you make the
338    transition. Please don't hesitate to ask on roundup-users for help (or
339    complete conversions if you're completely stuck)!
340 2. The database backed got a lot more flexible, allowing Metakit and SQL
341    databases! The only decent SQL database implemented at present is sqlite,
342    but others shouldn't be a whole lot more work.
343 3. A brand new, highly flexible and much more robust security system including
344    a system of Permissions, Roles and Role assignments to users. You may now
345    define your own Permissions that may be checked in CGI transactions.
346 4. Journalling has been made less storage-hungry, so has been turned on
347    by default *except* for author, recipient and nosy link/unlink events. You
348    are advised to turn it off in your trackers too.
349 5. We've changed the terminology from "instance" to "tracker", to ease the
350    learning curve/impact for new users.
351 6. Because of the above changes, the tracker configuration has seen some
352    major changes. See below for the details.
354 Please, **back up your database** before you start the migration process. This
355 is as simple as copying the "db" directory and all its contents from your
356 tracker to somewhere safe.
359 0.5.0 Configuration
360 -------------------
362 First up, rename your ``instance_config.py`` file to just ``config.py``.
364 Then edit your tracker's ``__init__.py`` module. It'll currently look
365 like this::
367  from instance_config import *
368  try:
369      from dbinit import *
370  except ImportError:
371      pass # in installdir (probably :)
372  from interfaces import *
374 and it needs to be::
376  import config
377  from dbinit import open, init
378  from interfaces import Client, MailGW
380 Due to the new templating having a top-level ``page`` that defines links for
381 searching, indexes, adding items etc, the following variables are no longer
382 used:
384 - HEADER_INDEX_LINKS
385 - HEADER_ADD_LINKS
386 - HEADER_SEARCH_LINKS
387 - SEARCH_FILTERS
388 - DEFAULT_INDEX
389 - UNASSIGNED_INDEX
390 - USER_INDEX
391 - ISSUE_FILTER
393 The new security implementation will require additions to the dbinit module,
394 but also removes the need for the following tracker config variables:
396 - ANONYMOUS_ACCESS
397 - ANONYMOUS_REGISTER
399 but requires two new variables which define the Roles assigned to users who
400 register through the web and e-mail interfaces:
402 - NEW_WEB_USER_ROLES
403 - NEW_EMAIL_USER_ROLES
405 in both cases, 'User' is a good initial setting. To emulate
406 ``ANONYMOUS_ACCESS='deny'``, remove all "View" Permissions from the
407 "Anonymous" Role. To emulate ``ANONYMOUS_REGISTER='deny'``, remove the "Web
408 Registration" and/or the "Email Registration" Permission from the "Anonymous"
409 Role. See the section on customising security in the `customisation
410 documentation`_ for more information.
412 Finally, the following config variables have been renamed to make more sense:
414 - INSTANCE_HOME -> TRACKER_HOME
415 - INSTANCE_NAME -> TRACKER_NAME
416 - ISSUE_TRACKER_WEB -> TRACKER_WEB
417 - ISSUE_TRACKER_EMAIL -> TRACKER_EMAIL
420 0.5.0 Schema Specification
421 --------------------------
423 0.5.0 Database backend changes
424 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
426 Your select_db module in your tracker has changed a fair bit. Where it used
427 to contain::
429  # WARNING: DO NOT EDIT THIS FILE!!!
430  from roundup.backends.back_anydbm import Database
432 it must now contain::
434  # WARNING: DO NOT EDIT THIS FILE!!!
435  from roundup.backends.back_anydbm import Database, Class, FileClass, IssueClass
437 Yes, I realise the irony of the "DO NOT EDIT THIS FILE" statement :)
438 Note the addition of the Class, FileClass, IssueClass imports. These are very
439 important, as they're going to make the next change work too. You now need to
440 modify the top of the dbinit module in your tracker from::
442  import instance_config
443  from roundup import roundupdb
444  from select_db import Database
446  from roundup.roundupdb import Class, FileClass
448  class Database(roundupdb.Database, select_db.Database):
449      ''' Creates a hybrid database from:
450           . the selected database back-end from select_db
451           . the roundup extensions from roundupdb
452      '''
453      pass
455  class IssueClass(roundupdb.IssueClass):
456      ''' issues need the email information
457      '''
458      pass
460 to::
462  import config
463  from select_db import Database, Class, FileClass, IssueClass
465 Yes, remove the Database and IssueClass definitions and those other imports.
466 They're not needed any more!
468 Look for places in dbinit.py where ``instance_config`` is used too, and
469 rename them ``config``.
472 0.5.0 Journalling changes
473 ~~~~~~~~~~~~~~~~~~~~~~~~~
475 Journalling has been optimised for storage. Journalling of links has been
476 turned back on by default. If your tracker has a large user base, you may wish
477 to turn off journalling of nosy list, message author and message recipient
478 link and unlink events. You do this by adding ``do_journal='no'`` to the Class
479 initialisation in your dbinit. For example, your *msg* class initialisation
480 probably looks like this::
482     msg = FileClass(db, "msg",
483                     author=Link("user"), recipients=Multilink("user"),
484                     date=Date(),         summary=String(),
485                     files=Multilink("file"),
486                     messageid=String(),  inreplyto=String())
488 to turn off journalling of author and recipient link events, add
489 ``do_journal='no'`` to the ``author=Link("user")`` part of the statement,
490 like so::
492     msg = FileClass(db, "msg",
493                     author=Link("user", do_journal='no'),
494                     recipients=Multilink("user", do_journal='no'),
495                     date=Date(),         summary=String(),
496                     files=Multilink("file"),
497                     messageid=String(),  inreplyto=String())
499 Nosy list link event journalling is actually turned off by default now. If you
500 want to turn it on, change to your issue class' nosy list, change its
501 definition from::
503     issue = IssueClass(db, "issue",
504                     assignedto=Link("user"), topic=Multilink("keyword"),
505                     priority=Link("priority"), status=Link("status"))
507 to::
509     issue = IssueClass(db, "issue", nosy=Multilink("user", do_journal='yes'),
510                     assignedto=Link("user"), topic=Multilink("keyword"),
511                     priority=Link("priority"), status=Link("status"))
513 noting that your definition of the nosy Multilink will override the normal one.
516 0.5.0 User schema changes
517 ~~~~~~~~~~~~~~~~~~~~~~~~~
519 Users have two more properties, "queries" and "roles". You'll have something
520 like this in your dbinit module now::
522     user = Class(db, "user",
523                     username=String(),   password=Password(),
524                     address=String(),    realname=String(),
525                     phone=String(),      organisation=String(),
526                     alternate_addresses=String())
527     user.setkey("username")
529 and you'll need to add the new properties and the new "query" class to it
530 like so::
532     query = Class(db, "query",
533                     klass=String(),     name=String(),
534                     url=String())
535     query.setkey("name")
537     # Note: roles is a comma-separated string of Role names
538     user = Class(db, "user",
539                     username=String(),   password=Password(),
540                     address=String(),    realname=String(),
541                     phone=String(),      organisation=String(),
542                     alternate_addresses=String(),
543                     queries=Multilink('query'), roles=String())
544     user.setkey("username")
546 The "queries" property is used to store off the user's favourite database
547 queries. The "roles" property is explained below in `0.5.0 Security
548 Settings`_.
551 0.5.0 Security Settings
552 ~~~~~~~~~~~~~~~~~~~~~~~
554 See the `security documentation`_ for an explanation of how the new security
555 system works. In a nutshell though, the security is handled as a four step
556 process:
558 1. Permissions are defined as having a name and optionally a hyperdb class
559    they're specific to,
560 2. Roles are defined that have one or more Permissions,
561 3. Users are assigned Roles in their "roles" property, and finally
562 4. Roundup checks that users have appropriate Permissions at appropriate times
563    (like editing issues).
565 Your tracker dbinit module's *open* function now has to define any
566 Permissions that are specific to your tracker, and also the assignment
567 of Permissions to Roles. At the moment, your open function
568 ends with::
570     import detectors
571     detectors.init(db)
573     return db
575 and what we need to do is insert some commands that will set up the security
576 parameters. Right above the ``import detectors`` line, you'll want to insert
577 these lines::
579     #
580     # SECURITY SETTINGS
581     #
582     # new permissions for this schema
583     for cl in 'issue', 'file', 'msg', 'user':
584         db.security.addPermission(name="Edit", klass=cl,
585             description="User is allowed to edit "+cl)
586         db.security.addPermission(name="View", klass=cl,
587             description="User is allowed to access "+cl)
589     # Assign the access and edit permissions for issue, file and message
590     # to regular users now
591     for cl in 'issue', 'file', 'msg':
592         p = db.security.getPermission('View', cl)
593         db.security.addPermissionToRole('User', p)
594         p = db.security.getPermission('Edit', cl)
595         db.security.addPermissionToRole('User', p)
596     # and give the regular users access to the web and email interface
597     p = db.security.getPermission('Web Access')
598     db.security.addPermissionToRole('User', p)
599     p = db.security.getPermission('Email Access')
600     db.security.addPermissionToRole('User', p)
602     # May users view other user information? Comment these lines out
603     # if you don't want them to
604     p = db.security.getPermission('View', 'user')
605     db.security.addPermissionToRole('User', p)
607     # Assign the appropriate permissions to the anonymous user's Anonymous
608     # Role. Choices here are:
609     # - Allow anonymous users to register through the web
610     p = db.security.getPermission('Web Registration')
611     db.security.addPermissionToRole('Anonymous', p)
612     # - Allow anonymous (new) users to register through the email gateway
613     p = db.security.getPermission('Email Registration')
614     db.security.addPermissionToRole('Anonymous', p)
615     # - Allow anonymous users access to the "issue" class of data
616     #   Note: this also grants access to related information like files,
617     #         messages, statuses etc that are linked to issues
618     #p = db.security.getPermission('View', 'issue')
619     #db.security.addPermissionToRole('Anonymous', p)
620     # - Allow anonymous users access to edit the "issue" class of data
621     #   Note: this also grants access to create related information like
622     #         files and messages etc that are linked to issues
623     #p = db.security.getPermission('Edit', 'issue')
624     #db.security.addPermissionToRole('Anonymous', p)
626     # oh, g'wan, let anonymous access the web interface too
627     p = db.security.getPermission('Web Access')
628     db.security.addPermissionToRole('Anonymous', p)
630 Note in the comments there the places where you might change the permissions
631 to restrict users or grant users more access. If you've created additional
632 classes that users should be able to edit and view, then you should add them
633 to the "new permissions for this schema" section at the start of the security
634 block. Then add them to the "Assign the access and edit permissions" section
635 too, so people actually have the new Permission you've created.
637 One final change is needed that finishes off the security system's
638 initialisation. We need to add a call to ``db.post_init()`` at the end of the
639 dbinit open() function. Add it like this::
641     import detectors
642     detectors.init(db)
644     # schema is set up - run any post-initialisation
645     db.post_init()
646     return db
648 You may verify the setup of Permissions and Roles using the new
649 "``roundup-admin security``" command.
652 0.5.0 User changes
653 ~~~~~~~~~~~~~~~~~~
655 To support all those schema changes, you'll need to massage your user database
656 a little too, to:
658 1. make sure there's an "anonymous" user - this user is mandatory now and is
659    the one that unknown users are logged in as.
660 2. make sure all users have at least one Role.
662 If you don't have the "anonymous" user, create it now with the command::
664   roundup-admin create user username=anonymous roles=Anonymous
666 making sure the capitalisation is the same as above. Once you've done that,
667 you'll need to set the roles property on all users to a reasonable default.
668 The admin user should get "Admin", the anonymous user "Anonymous"
669 and all other users "User". The ``fixroles.py`` script in the tools directory
670 will do this. Run it like so (where python is your python 2+ binary)::
672   python tools/fixroles.py -i <tracker home> fixroles
676 0.5.0 CGI interface changes
677 ---------------------------
679 The CGI interface code was completely reorganised and largely rewritten. The
680 end result is that this section of your tracker interfaces module will need
681 changing from::
683  from roundup import cgi_client, mailgw
684  from roundup.i18n import _
685  
686  class Client(cgi_client.Client):
687      ''' derives basic CGI implementation from the standard module,
688          with any specific extensions
689      '''
690      pass
692 to::
694  from roundup import mailgw
695  from roundup.cgi import client
696  
697  class Client(client.Client): 
698      ''' derives basic CGI implementation from the standard module,
699          with any specific extensions
700      '''
701      pass
703 You will also need to install the new version of roundup.cgi from the source
704 cgi-bin directory if you're using it.
707 0.5.0 HTML templating
708 ---------------------
710 You'll want to make a backup of your current tracker html directory. You
711 should then copy the html directory from the Roundup source "classic" template
712 and modify it according to your local schema changes.
714 If you need help with the new templating system, please ask questions on the
715 roundup-users mailing list (available through the roundup project page on
716 sourceforge, http://roundup.sf.net/)
719 0.5.0 Detectors
720 ---------------
722 The nosy reactor has been updated to handle the tracker not having an
723 "assignedto" property on issues. You may want to copy it into your tracker's
724 detectors directory. Chances are you've already fixed it though :)
727 Migrating from 0.4.1 to 0.4.2
728 =============================
730 0.4.2 Configuration
731 -------------------
732 The USER_INDEX definition introduced in 0.4.1 was too restrictive in its
733 allowing replacement of 'assignedto' with the user's userid. Users must change
734 the None value of 'assignedto' to 'CURRENT USER' (the string, in quotes) for
735 the replacement behaviour to occur now.
737 The new configuration variables are:
739 - EMAIL_KEEP_QUOTED_TEXT 
740 - EMAIL_LEAVE_BODY_UNCHANGED
741 - ADD_RECIPIENTS_TO_NOSY
743 See the sample configuration files in::
745  <roundup source>/roundup/templates/classic/instance_config.py
747 and::
749  <roundup source>/roundup/templates/extended/instance_config.py
751 and the `customisation documentation`_ for information on how they're used.
754 0.4.2 Changes to detectors
755 --------------------------
756 You will need to copy the detectors from the distribution into your instance
757 home "detectors" directory. If you used the classic schema, the detectors
758 are in::
760  <roundup source>/roundup/templates/classic/detectors/
762 If you used the extended schema, the detectors are in::
764  <roundup source>/roundup/templates/extended/detectors/
766 The change means that schema-specific code has been removed from the
767 mail gateway and cgi interface and made into auditors:
769 - nosyreactor.py has now got an updatenosy auditor which updates the nosy
770   list with author, recipient and assignedto information.
771 - statusauditor.py makes the unread or resolved -> chatting changes and
772   presets the status of an issue to unread.
774 There's also a bug or two fixed in the nosyreactor code.
776 0.4.2 HTML templating changes
777 -----------------------------
778 The link() htmltemplate function now has a "showid" option for links and
779 multilinks. When true, it only displays the linked item id as the anchor
780 text. The link value is displayed as a tooltip using the title anchor
781 attribute. To use in eg. the superseder field, have something like this::
783    <td>
784     <display call="field('superseder', showid=1)">
785     <display call="classhelp('issue', 'id,title', label='list', width=500)">
786     <property name="superseder">
787      <br>View: <display call="link('superseder', showid=1)">
788     </property>
789    </td>
791 The stylesheets have been cleaned up too. You may want to use the newer
792 versions in::
794  <roundup source>/roundup/templates/<template>/html/default.css
798 Migrating from 0.4.0 to 0.4.1
799 =============================
801 0.4.1 Files storage
802 -------------------
804 Messages and files from newly created issues will be put into subdierectories
805 in thousands e.g. msg123 will be put into files/msg/0/msg123, file2003
806 will go into files/file/2/file2003. Previous messages are still found, but
807 could be put into this structure.
809 0.4.1 Configuration
810 -------------------
812 To allow more fine-grained access control, the variable used to check
813 permission to auto-register users in the mail gateway is now called
814 ANONYMOUS_REGISTER_MAIL rather than overloading ANONYMOUS_REGISTER. If the
815 variable doesn't exist, then ANONYMOUS_REGISTER is tested as before.
817 Configuring the links in the web header is now easier too. The following
818 variables have been added to the classic instance_config.py::
820   HEADER_INDEX_LINKS   - defines the "index" links to be made available
821   HEADER_ADD_LINKS     - defines the "add" links
822   DEFAULT_INDEX        - specifies the index view for DEFAULT
823   UNASSIGNED_INDEX     - specifies the index view for UNASSIGNED
824   USER_INDEX           - specifies the index view for USER
826 See the <roundup source>/roundup/templates/classic/instance_config.py for more
827 information - including how the variables are to be set up. Most users will
828 just be able to copy the variables from the source to their instance home. If
829 you've modified the header by changing the source of the interfaces.py file in
830 the instance home, you'll need to remove that customisation and move it into
831 the appropriate variables in instance_config.py.
833 The extended schema has similar variables added too - see the source for more
834 info.
836 0.4.1 Alternate E-Mail Addresses
837 --------------------------------
839 If you add the property "alternate_addresses" to your user class, your users
840 will be able to register alternate email addresses that they may use to
841 communicate with roundup as. All email from roundup will continue to be sent
842 to their primary address.
844 If you have not edited the dbinit.py file in your instance home directory,
845 you may simply copy the new dbinit.py file from the core code. If you used
846 the classic schema, the interfaces file is in::
848  <roundup source>/roundup/templates/classic/dbinit.py
850 If you used the extended schema, the file is in::
852  <roundup source>/roundup/templates/extended/dbinit.py 
854 If you have modified your dbinit.py file, you need to edit the dbinit.py
855 file in your instance home directory. Find the lines which define the user
856 class::
858     user = Class(db, "msg",
859                     username=String(),   password=Password(),
860                     address=String(),    realname=String(), 
861                     phone=String(),      organisation=String(),
862                     alternate_addresses=String())
864 You will also want to add the property to the user's details page. The
865 template for this is the "user.item" file in your instance home "html"
866 directory. Similar to above, you may copy the file from the roundup source if
867 you haven't modified it. Otherwise, add the following to the template::
869    <display call="multiline('alternate_addresses')">
871 with appropriate labelling etc. See the standard template for an idea.
875 Migrating from 0.3.x to 0.4.0
876 =============================
878 0.4.0 Message-ID and In-Reply-To addition
879 -----------------------------------------
880 0.4.0 adds the tracking of messages by message-id and allows threading
881 using in-reply-to. Most e-mail clients support threading using this
882 feature, and we hope to add support for it to the web gateway. If you
883 have not edited the dbinit.py file in your instance home directory, you may
884 simply copy the new dbinit.py file from the core code. If you used the
885 classic schema, the interfaces file is in::
887  <roundup source>/roundup/templates/classic/dbinit.py
889 If you used the extended schema, the file is in::
891  <roundup source>/roundup/templates/extended/dbinit.py 
893 If you have modified your dbinit.py file, you need to edit the dbinit.py
894 file in your instance home directory. Find the lines which define the msg
895 class::
897     msg = FileClass(db, "msg",
898                     author=Link("user"), recipients=Multilink("user"),
899                     date=Date(),         summary=String(),
900                     files=Multilink("file"))
902 and add the messageid and inreplyto properties like so::
904     msg = FileClass(db, "msg",
905                     author=Link("user"), recipients=Multilink("user"),
906                     date=Date(),         summary=String(),
907                     files=Multilink("file"),
908                     messageid=String(),  inreplyto=String())
910 Also, configuration is being cleaned up. This means that your dbinit.py will
911 also need to be changed in the open function. If you haven't changed your
912 dbinit.py, the above copy will be enough. If you have, you'll need to change
913 the line (round line 50)::
915     db = Database(instance_config.DATABASE, name)
917 to::
919     db = Database(instance_config, name)
922 0.4.0 Configuration
923 --------------------
924 ``TRACKER_NAME`` and ``EMAIL_SIGNATURE_POSITION`` have been added to the
925 instance_config.py. The simplest solution is to copy the default values
926 from template in the core source.
928 The mail gateway now checks ``ANONYMOUS_REGISTER`` to see if unknown users
929 are to be automatically registered with the tracker. If it is set to "deny"
930 then unknown users will not have access. If it is set to "allow" they will be
931 automatically registered with the tracker.
934 0.4.0 CGI script roundup.cgi
935 ----------------------------
936 The CGI script has been updated with some features and a bugfix, so you should
937 copy it from the roundup cgi-bin source directory again. Make sure you update
938 the ROUNDUP_INSTANCE_HOMES after the copy.
941 0.4.0 Nosy reactor
942 ------------------
943 The nosy reactor has also changed - copy the nosyreactor.py file from the core
944 source::
946    <roundup source>/roundup/templates/<template>/detectors/nosyreactor.py
948 to your instance home "detectors" directory.
951 0.4.0 HTML templating
952 ---------------------
953 The field() function was incorrectly implemented - links and multilinks now
954 display as text fields when rendered using field(). To display a menu (drop-
955 down or select box) you need to use the menu() function.
959 Migrating from 0.2.x to 0.3.x
960 =============================
962 0.3.x Cookie Authentication changes
963 -----------------------------------
964 0.3.0 introduces cookie authentication - you will need to copy the
965 interfaces.py file from the roundup source to your instance home to enable
966 authentication. If you used the classic schema, the interfaces file is in::
968  <roundup source>/roundup/templates/classic/interfaces.py
970 If you used the extended schema, the file is in::
972  <roundup source>/roundup/templates/extended/interfaces.py
974 If you have modified your interfaces.Client class, you will need to take
975 note of the login/logout functionality provided in roundup.cgi_client.Client
976 (classic schema) or roundup.cgi_client.ExtendedClient (extended schema) and
977 modify your instance code apropriately.
980 0.3.x Password encoding
981 -----------------------
982 This release also introduces encoding of passwords in the database. If you
983 have not edited the dbinit.py file in your instance home directory, you may
984 simply copy the new dbinit.py file from the core code. If you used the
985 classic schema, the interfaces file is in::
987  <roundup source>/roundup/templates/classic/dbinit.py
989 If you used the extended schema, the file is in::
991  <roundup source>/roundup/templates/extended/dbinit.py
994 If you have modified your dbinit.py file, you may use encoded passwords:
996 1. Edit the dbinit.py file in your instance home directory
997    a. At the first code line of the open() function::
999        from roundup.hyperdb import String, Date, Link, Multilink
1001       alter to include Password, as so::
1003        from roundup.hyperdb import String, Password, Date, Link, Multilink
1005    b. Where the password property is defined (around line 66)::
1007        user = Class(db, "user", 
1008                        username=String(),   password=String(),
1009                        address=String(),    realname=String(), 
1010                        phone=String(),      organisation=String())
1011        user.setkey("username")
1013       alter the "password=String()" to "password=Password()"::
1015        user = Class(db, "user", 
1016                        username=String(),   password=Password(),
1017                        address=String(),    realname=String(), 
1018                        phone=String(),      organisation=String())
1019        user.setkey("username")
1021 2. Any existing passwords in the database will remain cleartext until they
1022    are edited. It is recommended that at a minimum the admin password be
1023    changed immediately::
1025       roundup-admin -i <instance home> set user1 password=<new password>
1028 0.3.x Configuration
1029 -------------------
1030 FILTER_POSITION, ANONYMOUS_ACCESS, ANONYMOUS_REGISTER have been added to
1031 the instance_config.py. Simplest solution is to copy the default values from
1032 template in the core source.
1034 MESSAGES_TO_AUTHOR has been added to the IssueClass in dbinit.py. Set to 'yes'
1035 to send nosy messages to the author. Default behaviour is to not send nosy
1036 messages to the author. You will need to add MESSAGES_TO_AUTHOR to your
1037 dbinit.py in your instance home.
1040 0.3.x CGI script roundup.cgi
1041 ----------------------------
1042 There have been some structural changes to the roundup.cgi script - you will
1043 need to install it again from the cgi-bin directory of the source
1044 distribution. Make sure you update the ROUNDUP_INSTANCE_HOMES after the
1045 copy.
1048 .. _`customisation documentation`: customizing.html
1049 .. _`security documentation`: security.html
1050 .. _`administration guide`: admin.html