Code

The mail-gateway used to process messages fetched, e.g., via imap in a
[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 If a specific version transition isn't mentioned here (eg. 0.6.7 to 0.6.8)
10 then you don't need to do anything. If you're upgrading from 0.5.6 to
11 0.6.8 though, you'll need to check the "0.5 to 0.6" and "0.6.x to 0.6.3"
12 steps.
14 .. contents::
16 Migrating from 1.4.x to 1.4.9
17 =============================
19 Customized MailGW Class
20 -----------------------
22 If you have customized the MailGW class in your tracker: The new MailGW
23 class opens the database for each message in the method handle_message
24 (instance.open) instead of passing the opened database as a parameter to
25 the MailGW constructor. The old handle_message has been renamed to
26 _handle_message. The new method opens the database and wraps the call to
27 the old method into a try/finally.
29 Your customized MailGW class needs to mirror this behavior.
31 Fix the "remove" button in issue files and messages lists
32 ---------------------------------------------------------
34 The "remove" button(s) in the issue messages list needs to be altered. Find
35 the following in your tracker's ``html/issue.item.html`` template::
37   <td>
38    <form style="padding:0" tal:condition="context/is_edit_ok"
39          tal:attributes="action string:issue${context/id}">
40     <input type="hidden" name="@remove@files" tal:attributes="value file/id">
42 and add ``method="POST"`` as shown below::
44   <td>
45    <form style="padding:0" method="POST" tal:condition="context/is_edit_ok"
46          tal:attributes="action string:issue${context/id}">
47     <input type="hidden" name="@remove@files" tal:attributes="value file/id">
49 Then also find::
51   <td>
52    <form style="padding:0" tal:condition="context/is_edit_ok"
53          tal:attributes="action string:issue${context/id}">
54     <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
56 and add ``method="POST"`` as shown below::
58   <td>
59    <form style="padding:0" method="POST" tal:condition="context/is_edit_ok"
60          tal:attributes="action string:issue${context/id}">
61     <input type="hidden" name="@remove@messages" tal:attributes="value msg/id">
64 Fixing the "retire" button in user management list
65 --------------------------------------------------
67 If you made the change to the "reture" link in the user management list as
68 listed below in `Migrating from 1.4.x to 1.4.7`_ then you'll need to fix that
69 change by adding ``method="POST"`` to the ``<form>`` tag::
71      <form style="padding:0" method="POST"
72            tal:attributes="action string:user${user/id}">
73       <input type="hidden" name="@template" value="index">
74       <input type="hidden" name="@action" value="retire">
75       <input type="submit" value="retire" i18n:attributes="value">
76      </form>
79 Migrating from 1.4.x to 1.4.7
80 =============================
82 Several security issues were addressed in this release. Some aspects of your
83 trackers may no longer function depending on your local customisations. Core
84 functionality that will need to be modified:
86 Grant the "retire" permission to users for their queries
87 --------------------------------------------------------
89 Users will no longer be able to retire their own queries. To remedy this you
90 will need to add the following to your tracker's ``schema.py`` just under the
91 line that grants them permission to edit their own queries::
93    p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
94       description="User is allowed to edit their queries")
95    db.security.addPermissionToRole('User', p)
96  + p = db.security.addPermission(name='Retire', klass='query', check=edit_query,
97  +    description="User is allowed to retire their queries")
98  + db.security.addPermissionToRole('User', p)
99    p = db.security.addPermission(name='Create', klass='query',
100       description="User is allowed to create queries")
101    db.security.addPermissionToRole('User', p)
103 The lines marked "+" should be added, minus the "+" sign.
106 Fix the "retire" link in the users list for admin users
107 -------------------------------------------------------
109 The "retire" link found in the file ``html/users.index.html``::
111   <td tal:condition="context/is_edit_ok">
112    <a tal:attributes="href string:user${user/id}?@action=retire&@template=index"
113     i18n:translate="">retire</a>
115 Should be replaced with::
117   <td tal:condition="context/is_retire_ok">
118      <form style="padding:0" method="POST"
119            tal:attributes="action string:user${user/id}">
120       <input type="hidden" name="@template" value="index">
121       <input type="hidden" name="@action" value="retire">
122       <input type="submit" value="retire" i18n:attributes="value">
123      </form>
126 Fix for Python 2.6+ users
127 -------------------------
129 If you use Python 2.6 you should edit your tracker's
130 ``detectors/nosyreaction.py`` file to change::
132    import sets
134 at the top to::
136    from roundup.anypy.sets_ import set
138 and then all instances of ``sets.Set()`` to ``set()`` in the later code.
142 Trackers currently allowing HTML file uploading
143 -----------------------------------------------
145 Trackers which wish to continue to allow uploading of HTML content against issues
146 will need to set a new configuration variable in the ``[web]`` section of the
147 tracker's ``config.ini`` file:
149    # Setting this option enables Roundup to serve uploaded HTML
150    # file content *as HTML*. This is a potential security risk
151    # and is therefore disabled by default. Set to 'yes' if you
152    # trust *all* users uploading content to your tracker.
153    # Allowed values: yes, no
154    # Default: no
155    allow_html_file = no
159 Migrating from 1.4.2 to 1.4.3
160 =============================
162 If you are using the MySQL backend you will need to replace some indexes
163 that may have been created by version 1.4.2.
165 You should to access your MySQL database directly and remove any indexes
166 with a name ending in "_key_retired_idx". You should then re-add them with
167 the same spec except the key column name needs a size. So an index on
168 "_user (__retired, _name)" should become "_user (__retired, _name(255))".
171 Migrating from 1.4.x to 1.4.2
172 =============================
174 You should run the "roundup-admin migrate" command for your tracker once
175 you've installed the latest codebase. 
177 Do this before you use the web, command-line or mail interface and before
178 any users access the tracker.
180 This command will respond with either "Tracker updated" (if you've not
181 previously run it on an RDBMS backend) or "No migration action required"
182 (if you have run it, or have used another interface to the tracker,
183 or are using anydbm).
185 It's safe to run this even if it's not required, so just get into the
186 habit.
189 Migrating from 1.3.3 to 1.4.0
190 =============================
192 Value of the "refwd_re" tracker configuration option (section "mailgw")
193 is treated as UTF-8 string.  In previous versions, it was ISO8859-1.
195 If you have running trackers based on the classic template, please
196 update the messagesummary detector as follows::
198     --- detectors/messagesummary.py 17 Apr 2003 03:26:38 -0000      1.1
199     +++ detectors/messagesummary.py 3 Apr 2007 06:47:21 -0000       1.2
200     @@ -8,7 +8,7 @@
201      if newvalues.has_key('summary') or not newvalues.has_key('content'):
202          return
204     -    summary, content = parseContent(newvalues['content'], 1, 1)
205     +    summary, content = parseContent(newvalues['content'], config=db.config)
206      newvalues['summary'] = summary
208 In the latest version we have added some database indexes to the
209 SQL-backends (mysql, postgresql, sqlite) for speeding up building the
210 roundup-index for full-text search. We recommend that you create the
211 following database indexes on the database by hand::
213  CREATE INDEX words_by_id ON __words (_textid)
214  CREATE UNIQUE INDEX __textids_by_props ON __textids (_class, _itemid, _prop)
216 Migrating from 1.2.x to 1.3.0
217 =============================
219 1.3.0 Web interface changes
220 ---------------------------
222 Some of the HTML files in the "classic" and "minimal" tracker templates
223 were changed to fix some bugs and clean them up. You may wish to compare
224 them to the HTML files in your tracker and apply any changes.
227 Migrating from 1.1.2 to 1.2.0
228 =============================
230 1.2.0 Sorting and grouping by multiple properties
231 -------------------------------------------------
233 Starting with this version, sorting and grouping by multiple properties
234 is possible. This means that request.sort and request.group are now
235 lists. This is reflected in several places:
237  * ``renderWith`` now has list attributes for ``sort`` and ``group``,
238    where you previously wrote::
239    
240     renderWith(... sort=('-', 'activity'), group=('+', 'priority')
242    you write now::
244     renderWith(... sort=[('-', 'activity')], group=[('+', 'priority')]
246  * In templates that permit to edit sorting/grouping, request.sort and
247    request.group are (possibly empty) lists. You can now sort and group
248    by multiple attributes. For an example, see the classic template. You
249    may want search for the variable ``n_sort`` which can be set to the
250    number of sort/group properties.
252  * Templates that diplay new headlines for each group of items with
253    equal group properties can now use the modified ``batch.propchanged``
254    method that can take several properties which are checked for
255    changes. See the example in the classic template which makes use of
256    ``batch.propchanged``.
258 Migrating from 1.1.0 to 1.1.1
259 =============================
261 1.1.1 "Clear this message"
262 --------------------------
264 In 1.1.1, the standard ``page.html`` template includes a "clear this message"
265 link in the green "ok" message bar that appears after a successful edit
266 (or other) action.
268 To include this in your tracker, change the following in your ``page.html``
269 template::
271  <p tal:condition="options/ok_message | nothing" class="ok-message"
272     tal:repeat="m options/ok_message" tal:content="structure m">error</p>
274 to be::
276  <p tal:condition="options/ok_message | nothing" class="ok-message">
277    <span tal:repeat="m options/ok_message"
278       tal:content="structure string:$m <br/ > " />
279     <a class="form-small" tal:attributes="href request/current_url"
280        i18n:translate="">clear this message</a>
281  </p>
284 If you implemented the "clear this message" in your 1.1.0 tracker, then you
285 should change it to the above and it will work much better!
288 Migrating from 1.0.x to 1.1.0
289 =============================
291 1.1 Login "For Session Only"
292 ----------------------------
294 In 1.1, web logins are alive for the length of a session only, *unless* you
295 add the following to the login form in your tracker's ``page.html``::
297     <input type="checkbox" name="remember" id="remember">
298     <label for="remember" i18n:translate="">Remember me?</label><br>
300 See the classic tracker ``page.html`` if you're unsure where this should
301 go.
304 1.1 Query Display Name
305 ----------------------
307 The ``dispname`` web variable has been renamed ``@dispname`` to avoid
308 clashing with other variables of the same name. If you are using the
309 display name feature, you will need to edit your tracker's ``page.html``
310 and ``issue.index.html`` pages to change ``dispname`` to ``@dispname``.
312 A side-effect of this change is that the renderWith method used in the
313 ``home.html`` page may now take a dispname argument.
316 1.1 "Clear this message"
317 ------------------------
319 In 1.1, the standard ``page.html`` template includes a "clear this message"
320 link in the green "ok" message bar that appears after a successful edit
321 (or other) action.
323 To include this in your tracker, change the following in your ``page.html``
324 template::
326  <p tal:condition="options/ok_message | nothing" class="ok-message"
327     tal:repeat="m options/ok_message" tal:content="structure m">error</p>
329 to be::
331  <p tal:condition="options/ok_message | nothing" class="ok-message">
332    <span tal:repeat="m options/ok_message"
333       tal:content="structure string:$m <br/ > " />
334     <a class="form-small" tal:attributes="href string:issue${context/id}"
335        i18n:translate="">clear this message</a>
336  </p>
339 Migrating from 0.8.x to 1.0
340 ===========================
342 1.0 New Query Permissions
343 -------------------------
345 New permissions are defined for query editing and viewing. To include these
346 in your tracker, you need to add these lines to your tracker's
347 ``schema.py``::
349  # Users should be able to edit and view their own queries. They should also
350  # be able to view any marked as not private. They should not be able to
351  # edit others' queries, even if they're not private
352  def view_query(db, userid, itemid):
353      private_for = db.query.get(itemid, 'private_for')
354      if not private_for: return True
355      return userid == private_for
356  def edit_query(db, userid, itemid):
357      return userid == db.query.get(itemid, 'creator')
358  p = db.security.addPermission(name='View', klass='query', check=view_query,
359      description="User is allowed to view their own and public queries")
360  db.security.addPermissionToRole('User', p)
361  p = db.security.addPermission(name='Edit', klass='query', check=edit_query,
362      description="User is allowed to edit their queries")
363  db.security.addPermissionToRole('User', p)
364  p = db.security.addPermission(name='Create', klass='query',
365      description="User is allowed to create queries")
366  db.security.addPermissionToRole('User', p)
368 and then remove 'query' from the line::
370  # Assign the access and edit Permissions for issue, file and message
371  # to regular users now
372  for cl in 'issue', 'file', 'msg', 'query', 'keyword':
374 so it looks like::
376  for cl in 'issue', 'file', 'msg', 'keyword':
379 Migrating from 0.8.0 to 0.8.3
380 =============================
382 0.8.3 Nosy Handling Changes
383 ---------------------------
385 A change was made to fix a bug in the ``nosyreaction.py`` standard
386 detector. To incorporate this fix in your trackers, you will need to copy
387 the ``nosyreaction.py`` file from the ``templates/classic/detectors``
388 directory of the source to your tracker's ``templates`` directory.
390 If you have modified the ``nosyreaction.py`` file from the standard
391 version, you will need to roll your changes into the new file.
394 Migrating from 0.7.1 to 0.8.0
395 =============================
397 You *must* fully uninstall previous Roundup version before installing
398 Roundup 0.8.0.  If you don't do that, ``roundup-admin install``
399 command may fail to function properly.
401 0.8.0 Backend changes
402 ---------------------
404 Backends 'bsddb' and 'bsddb3' are removed.  If you are using one of these,
405 you *must* migrate to another backend before upgrading.
408 0.8.0 API changes
409 -----------------
411 Class.safeget() was removed from the API. Test your item ids before calling
412 Class.get() instead.
415 0.8.0 New tracker layout
416 ------------------------
418 The ``config.py`` file has been replaced by ``config.ini``. You may use the
419 roundup-admin command "genconfig" to generate a new config file::
421   roundup-admin genconfig <tracker home>/config.ini
423 and modify the values therein based on the contents of your old config.py.
424 In most cases, the names of the config variables are the same.
426 The ``select_db.py`` file has been replaced by a file in the ``db``
427 directory called ``backend_name``. As you might guess, this file contains
428 just the name of the backend. To figure what the contents of yours should
429 be, use the following table:
431   ================================ =========================
432   ``select_db.py`` contents        ``backend_name`` contents
433   ================================ =========================
434   from back_anydbm import ...      anydbm
435   from back_metakit import ...     metakit
436   from back_sqlite import ...      sqlite
437   from back_mysql import ...       mysql
438   from back_postgresql import ...  postgresql
439   ================================ =========================
441 The ``dbinit.py`` file has been split into two new files,
442 ``initial_data.py`` and ``schema.py``. The contents of this file are:
444 ``initial_data.py``
445   You don't need one of these as your tracker is already initialised.
447 ``schema.py``
448   Copy the body of the ``def open(name=None)`` function from your old
449   tracker's ``dbinit.py`` file to this file. As the lines you're copying
450   aren't part of a function definition anymore, one level of indentation
451   needs to be removed (remove only the leading four spaces on each
452   line). 
454   The first few lines -- those starting with ``from roundup.hyperdb
455   import ...`` and the ``db = Database(config, name)`` line -- don't
456   need to be copied. Neither do the last few lines -- those starting
457   with ``import detectors``, down to ``return db`` inclusive.
459 You may remove the ``__init__.py`` module from the "detectors" directory as
460 it is no longer used.
462 There's a new way to write extension code for Roundup. If you have code in
463 an ``interfaces.py`` file you should move it. See the `customisation
464 documentation`_ for information about how extensions are now written.
465 Note that some older trackers may use ``interfaces.py`` to customise the
466 mail gateway behaviour. You will need to keep your ``interfaces.py`` file
467 if this is the case.
470 0.8.0 Permissions Changes
471 -------------------------
473 The creation of a new item in the user interfaces is now controlled by the
474 "Create" Permission. You will need to add an assignment of this Permission
475 to your users who are allowed to create items. The most common form of this
476 is the following in your ``schema.py`` added just under the current
477 assignation of the Edit Permission::
479     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
480         p = db.security.getPermission('Create', cl)
481         db.security.addPermissionToRole('User', p)
483 You will need to explicitly let anonymous users access the web interface so
484 that regular users are able to see the login form. Note that almost all
485 trackers will need this Permission. The only situation where it's not
486 required is in a tracker that uses an HTTP Basic Authenticated front-end.
487 It's enabled by adding to your ``schema.py``::
489     p = db.security.getPermission('Web Access')
490     db.security.addPermissionToRole('Anonymous', p)
492 Finally, you will need to enable permission for your users to edit their
493 own details by adding the following to ``schema.py``::
495     # Users should be able to edit their own details. Note that this
496     # permission is limited to only the situation where the Viewed or
497     # Edited item is their own.
498     def own_record(db, userid, itemid):
499         '''Determine whether the userid matches the item being accessed.'''
500         return userid == itemid
501     p = db.security.addPermission(name='View', klass='user', check=own_record,
502         description="User is allowed to view their own user details")
503     p = db.security.addPermission(name='Edit', klass='user', check=own_record,
504         description="User is allowed to edit their own user details")
505     db.security.addPermissionToRole('User', p)
508 0.8.0 Use of TemplatingUtils
509 ----------------------------
511 If you used custom python functions in TemplatingUtils, they must
512 be moved from interfaces.py to a new file in the ``extensions`` directory. 
514 Each Function that should be available through TAL needs to be defined
515 as a toplevel function in the newly created file. Furthermore you
516 add an inititialization function, that registers the functions with the 
517 tracker.
519 If you find this too tedious, donfu wrote an automatic init function that
520 takes an existing TemplatingUtils class, and registers all class methods
521 that do not start with an underscore. The following hack should be placed
522 in the ``extensions`` directory alongside other extensions::
524     class TemplatingUtils:
525          # copy from interfaces.py
527     def init(tracker):
528          util = TemplatingUtils()
530          def setClient(tu):
531              util.client = tu.client
532              return util
534          def execUtil(name):
535              return lambda tu, *args, **kwargs: \
536                      getattr(setClient(tu), name)(*args, **kwargs)
538          for name in dir(util):
539              if callable(getattr(util, name)) and not name.startswith('_'):
540                   tracker.registerUtil(name, execUtil(name))
543 0.8.0 Logging Configuration
544 ---------------------------
546 See the `administration guide`_ for information about configuring the new
547 logging implemented in 0.8.0.
550 Migrating from 0.7.2 to 0.7.3
551 =============================
553 0.7.3 Configuration
554 -------------------
556 If you choose, you may specify the directory from which static files are
557 served (those which use the URL component ``@@file``). Currently the
558 directory defaults to the ``TEMPLATES`` configuration variable. You may
559 define a new variable, ``STATIC_FILES`` which overrides this value for
560 static files.
563 Migrating from 0.7.0 to 0.7.2
564 =============================
566 0.7.2 DEFAULT_TIMEZONE is now required
567 --------------------------------------
569 The DEFAULT_TIMEZONE configuration variable is now required. Add the
570 following to your tracker's ``config.py`` file::
572     # You may specify a different default timezone, for use when users do not
573     # choose their own in their settings.
574     DEFAULT_TIMEZONE = 0            # specify as numeric hour offest
577 Migrating from 0.7.0 to 0.7.1
578 =============================
580 0.7.1 Permission assignments
581 ----------------------------
583 If you allow anonymous access to your tracker, you might need to assign
584 some additional View (or Edit if your tracker is that open) permissions
585 to the "anonymous" user. To do so, find the code in your ``dbinit.py`` that
586 says::
588     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
589         p = db.security.getPermission('View', cl)
590         db.security.addPermissionToRole('User', p)
591         p = db.security.getPermission('Edit', cl)
592         db.security.addPermissionToRole('User', p)
593     for cl in 'priority', 'status':
594         p = db.security.getPermission('View', cl)
595         db.security.addPermissionToRole('User', p)
597 Add add a line::
599         db.security.addPermissionToRole('Anonymous', p)
601 next to the existing ``'User'`` lines for the Permissions you wish to
602 assign to the anonymous user.
605 Migrating from 0.6 to 0.7
606 =========================
608 0.7.0 Permission assignments
609 ----------------------------
611 Due to a change in the rendering of web widgets, permissions are now
612 checked on Classes where they previously weren't (this is a good thing).
614 You will need to add some additional Permission assignments for your
615 regular users, or some displays will break. After the following in your 
616 tracker's ``dbinit.py``::
618     # Assign the access and edit Permissions for issue, file and message
619     # to regular users now
620     for cl in 'issue', 'file', 'msg', 'query', 'keyword':
621         p = db.security.getPermission('View', cl)
622         db.security.addPermissionToRole('User', p)
623         p = db.security.getPermission('Edit', cl)
624         db.security.addPermissionToRole('User', p)
626 add::
628     for cl in 'priority', 'status':
629         p = db.security.getPermission('View', cl)
630         db.security.addPermissionToRole('User', p)
633 0.7.0 Getting the current user id
634 ---------------------------------
636 The Database.curuserid attribute has been removed.
638 Any code referencing this attribute should be replaced with a
639 call to Database.getuid().
642 0.7.0 ZRoundup changes
643 ----------------------
645 The templates in your tracker's html directory will need updating if you
646 wish to use ZRoundup. If you've not modified those files (or some of them),
647 you may just copy the new versions from the Roundup source in the
648 templates/classic/html directory.
650 If you have modified the html files, then you'll need to manually edit them
651 to change all occurances of special form variables from using the colon ":"
652 special character to the at "@" special character. That is, variables such
653 as::
655   :action :required :template :remove:messages ...
657 should become::
659   @action @required @template @remove@messages ...
661 Note that ``tal:`` statements are unaffected. So are TAL expression type
662 prefixes such as ``python:`` and ``string:``. Please ask on the
663 roundup-users mailing list for help if you're unsure.
666 0.7.0 Edit collision detection
667 ------------------------------
669 Roundup now detects collisions with editing in the web interface (that is,
670 two people editing the same item at the same time).
672 You must copy the ``_generic.collision.html`` file from Roundup source in
673 the ``templates/classic/html`` directory. to your tracker's ``html``
674 directory.
677 Migrating from 0.6.x to 0.6.3
678 =============================
680 0.6.3 Configuration
681 -------------------
683 You will need to copy the file::
685   templates/classic/detectors/__init__.py
687 to your tracker's ``detectors`` directory, replacing the one already there.
688 This fixes a couple of bugs in that file.
692 Migrating from 0.5 to 0.6
693 =========================
696 0.6.0 Configuration
697 -------------------
699 Introduced EMAIL_FROM_TAG config variable. This value is inserted into
700 the From: line of nosy email. If the sending user is "Foo Bar", the
701 From: line is usually::
703      "Foo Bar" <issue_tracker@tracker.example>
705 the EMAIL_FROM_TAG goes inside the "Foo Bar" quotes like so::
707      "Foo Bar EMAIL_FROM_TAG" <issue_tracker@tracker.example>
709 I've altered the mechanism in the detectors __init__.py module so that it
710 doesn't cross-import detectors from other trackers (if you run more than one
711 in a single roundup-server). This change means that you'll need to copy the
712 __init__.py from roundup/templates/classic/detectors/__init__.py to your
713 <tracker home>/detectors/__init__.py. Don't worry, the "classic" __init__ is a
714 one-size-fits-all, so it'll work even if you've added/removed detectors.
716 0.6.0 Templating changes
717 ------------------------
719 The ``user.item`` template (in the tracker home "templates" directory)
720 needs to have the following hidden variable added to its form (between the
721 ``<form...>`` and ``</form>`` tags::
723   <input type="hidden" name=":template" value="item">
726 0.6.0 Form handling changes
727 ---------------------------
729 Roundup's form handling capabilities have been significantly expanded. This
730 should not affect users of 0.5 installations - but if you find you're
731 getting errors from form submissions, please ask for help on the Roundup
732 users mailing list:
734   http://lists.sourceforge.net/lists/listinfo/roundup-users
736 See the customisation doc section on `Form Values`__ for documentation of the
737 new form variables possible.
739 __ customizing.html#form-values
742 0.6.0 Multilingual character set support
743 ----------------------------------------
745 Added internationalization support. This is done via encoding all data
746 stored in roundup database to utf-8 (unicode encoding). To support utf-8 in
747 web interface you should add the folowing line to your tracker's html/page
748 and html/_generic.help files inside <head> tag::
749   
750     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
752 Since latin characters in utf-8 have the same codes as in ASCII table, this
753 modification is optional for users who use only plain latin characters. 
755 After this modification, you will be able to see and enter any world
756 character via web interface. Data received via mail interface also converted
757 to utf-8, however only new messages will be converted. If your roundup
758 database contains some of non-ASCII characters in one of 8-bit encoding,
759 they will not be visible in new unicode environment. Some of such data (e.g.
760 user names, keywords, etc)  can be edited by administrator, the others
761 (e.g. messages' contents) is not editable via web interface. Currently there
762 is no tool for converting such data, the only solution is to close
763 appropriate old issues and create new ones with the same content.
766 0.6.0 User timezone support
767 ---------------------------
769 From version 0.6.0 roundup supports displaying of Date data in user' local
770 timezone if he/she has provided timezone information. To make it possible
771 some modification to tracker's schema and HTML templates are required.
772 First you must add string property 'timezone' to user class in dbinit.py
773 like this::
774   
775     user = Class(db, "user", 
776                     username=String(),   password=Password(),
777                     address=String(),    realname=String(), 
778                     phone=String(),      organisation=String(),
779                     alternate_addresses=String(),
780                     queries=Multilink('query'), roles=String(),
781                     timezone=String())
782   
783 And second - html interface. Add following lines to
784 $TRACKER_HOME/html/user.item template::
785   
786      <tr>
787       <th>Timezone</th>
788       <td tal:content="structure context/timezone/field">timezone</td>
789      </tr>
791 After that all users should be able to provide their timezone information.
792 Timezone should be a positive or negative integer - offset from GMT.
794 After providing timezone, roundup will show all dates values, found in web
795 and mail interfaces in local time. It will also accept any Date info in
796 local time, convert and store it in GMT.
799 0.6.0 Search page structure
800 ---------------------------
802 In order to accomodate query editing the search page has been restructured. If
803 you want to provide your users with query editing, you should update your
804 search page using the macros detailed in the customisation doc section
805 `Searching on categories`__.
807 __ customizing.html#searching-on-categories
809 Also, the url field in the query class no longer starts with a '?'. You'll need
810 to remove this question mark from the url field to support queries. There's
811 a script in the "tools" directory called ``migrate-queries.py`` that should
812 automatically change any existing queries for you. As always, make a backup
813 of your database before running such a script.
816 0.6.0 Notes for metakit backend users
817 -------------------------------------
819 Roundup 0.6.0 introduced searching on ranges of dates and intervals. To
820 support it, some modifications to interval storing routine were made. So if
821 your tracker uses metakit backend and your db schema contains intervals
822 property, searches on that property will not be accurate for db items that
823 was stored before roundup' upgrade. However all new records should be
824 searchable on intervals.
826 It is possible to convert your database to new format: you can export and
827 import back all your data (consult "Migrating backends" in "Maintenance"
828 documentation). After this operation all your interval properties should
829 become searchable.
831 Users of backends others than metakit should not worry about this issue.
834 Migrating from 0.4.x to 0.5.0
835 =============================
837 This has been a fairly major revision of Roundup:
839 1. Brand new, much more powerful, flexible, tasty and nutritious templating.
840    Unfortunately, this means all your current templates are useless. Hopefully
841    the new documentation and examples will be enough to help you make the
842    transition. Please don't hesitate to ask on roundup-users for help (or
843    complete conversions if you're completely stuck)!
844 2. The database backed got a lot more flexible, allowing Metakit and SQL
845    databases! The only decent SQL database implemented at present is sqlite,
846    but others shouldn't be a whole lot more work.
847 3. A brand new, highly flexible and much more robust security system including
848    a system of Permissions, Roles and Role assignments to users. You may now
849    define your own Permissions that may be checked in CGI transactions.
850 4. Journalling has been made less storage-hungry, so has been turned on
851    by default *except* for author, recipient and nosy link/unlink events. You
852    are advised to turn it off in your trackers too.
853 5. We've changed the terminology from "instance" to "tracker", to ease the
854    learning curve/impact for new users.
855 6. Because of the above changes, the tracker configuration has seen some
856    major changes. See below for the details.
858 Please, **back up your database** before you start the migration process. This
859 is as simple as copying the "db" directory and all its contents from your
860 tracker to somewhere safe.
863 0.5.0 Configuration
864 -------------------
866 First up, rename your ``instance_config.py`` file to just ``config.py``.
868 Then edit your tracker's ``__init__.py`` module. It'll currently look
869 like this::
871  from instance_config import *
872  try:
873      from dbinit import *
874  except ImportError:
875      pass # in installdir (probably :)
876  from interfaces import *
878 and it needs to be::
880  import config
881  from dbinit import open, init
882  from interfaces import Client, MailGW
884 Due to the new templating having a top-level ``page`` that defines links for
885 searching, indexes, adding items etc, the following variables are no longer
886 used:
888 - HEADER_INDEX_LINKS
889 - HEADER_ADD_LINKS
890 - HEADER_SEARCH_LINKS
891 - SEARCH_FILTERS
892 - DEFAULT_INDEX
893 - UNASSIGNED_INDEX
894 - USER_INDEX
895 - ISSUE_FILTER
897 The new security implementation will require additions to the dbinit module,
898 but also removes the need for the following tracker config variables:
900 - ANONYMOUS_ACCESS
901 - ANONYMOUS_REGISTER
903 but requires two new variables which define the Roles assigned to users who
904 register through the web and e-mail interfaces:
906 - NEW_WEB_USER_ROLES
907 - NEW_EMAIL_USER_ROLES
909 in both cases, 'User' is a good initial setting. To emulate
910 ``ANONYMOUS_ACCESS='deny'``, remove all "View" Permissions from the
911 "Anonymous" Role. To emulate ``ANONYMOUS_REGISTER='deny'``, remove the "Web
912 Registration" and/or the "Email Registration" Permission from the "Anonymous"
913 Role. See the section on customising security in the `customisation
914 documentation`_ for more information.
916 Finally, the following config variables have been renamed to make more sense:
918 - INSTANCE_HOME -> TRACKER_HOME
919 - INSTANCE_NAME -> TRACKER_NAME
920 - ISSUE_TRACKER_WEB -> TRACKER_WEB
921 - ISSUE_TRACKER_EMAIL -> TRACKER_EMAIL
924 0.5.0 Schema Specification
925 --------------------------
927 0.5.0 Database backend changes
928 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
930 Your select_db module in your tracker has changed a fair bit. Where it used
931 to contain::
933  # WARNING: DO NOT EDIT THIS FILE!!!
934  from roundup.backends.back_anydbm import Database
936 it must now contain::
938  # WARNING: DO NOT EDIT THIS FILE!!!
939  from roundup.backends.back_anydbm import Database, Class, FileClass, IssueClass
941 Yes, I realise the irony of the "DO NOT EDIT THIS FILE" statement :)
942 Note the addition of the Class, FileClass, IssueClass imports. These are very
943 important, as they're going to make the next change work too. You now need to
944 modify the top of the dbinit module in your tracker from::
946  import instance_config
947  from roundup import roundupdb
948  from select_db import Database
950  from roundup.roundupdb import Class, FileClass
952  class Database(roundupdb.Database, select_db.Database):
953      ''' Creates a hybrid database from:
954           . the selected database back-end from select_db
955           . the roundup extensions from roundupdb
956      '''
957      pass
959  class IssueClass(roundupdb.IssueClass):
960      ''' issues need the email information
961      '''
962      pass
964 to::
966  import config
967  from select_db import Database, Class, FileClass, IssueClass
969 Yes, remove the Database and IssueClass definitions and those other imports.
970 They're not needed any more!
972 Look for places in dbinit.py where ``instance_config`` is used too, and
973 rename them ``config``.
976 0.5.0 Journalling changes
977 ~~~~~~~~~~~~~~~~~~~~~~~~~
979 Journalling has been optimised for storage. Journalling of links has been
980 turned back on by default. If your tracker has a large user base, you may wish
981 to turn off journalling of nosy list, message author and message recipient
982 link and unlink events. You do this by adding ``do_journal='no'`` to the Class
983 initialisation in your dbinit. For example, your *msg* class initialisation
984 probably looks like this::
986     msg = FileClass(db, "msg",
987                     author=Link("user"), recipients=Multilink("user"),
988                     date=Date(),         summary=String(),
989                     files=Multilink("file"),
990                     messageid=String(),  inreplyto=String())
992 to turn off journalling of author and recipient link events, add
993 ``do_journal='no'`` to the ``author=Link("user")`` part of the statement,
994 like so::
996     msg = FileClass(db, "msg",
997                     author=Link("user", do_journal='no'),
998                     recipients=Multilink("user", do_journal='no'),
999                     date=Date(),         summary=String(),
1000                     files=Multilink("file"),
1001                     messageid=String(),  inreplyto=String())
1003 Nosy list link event journalling is actually turned off by default now. If you
1004 want to turn it on, change to your issue class' nosy list, change its
1005 definition from::
1007     issue = IssueClass(db, "issue",
1008                     assignedto=Link("user"), topic=Multilink("keyword"),
1009                     priority=Link("priority"), status=Link("status"))
1011 to::
1013     issue = IssueClass(db, "issue", nosy=Multilink("user", do_journal='yes'),
1014                     assignedto=Link("user"), topic=Multilink("keyword"),
1015                     priority=Link("priority"), status=Link("status"))
1017 noting that your definition of the nosy Multilink will override the normal one.
1020 0.5.0 User schema changes
1021 ~~~~~~~~~~~~~~~~~~~~~~~~~
1023 Users have two more properties, "queries" and "roles". You'll have something
1024 like this in your dbinit module now::
1026     user = Class(db, "user",
1027                     username=String(),   password=Password(),
1028                     address=String(),    realname=String(),
1029                     phone=String(),      organisation=String(),
1030                     alternate_addresses=String())
1031     user.setkey("username")
1033 and you'll need to add the new properties and the new "query" class to it
1034 like so::
1036     query = Class(db, "query",
1037                     klass=String(),     name=String(),
1038                     url=String())
1039     query.setkey("name")
1041     # Note: roles is a comma-separated string of Role names
1042     user = Class(db, "user",
1043                     username=String(),   password=Password(),
1044                     address=String(),    realname=String(),
1045                     phone=String(),      organisation=String(),
1046                     alternate_addresses=String(),
1047                     queries=Multilink('query'), roles=String())
1048     user.setkey("username")
1050 The "queries" property is used to store off the user's favourite database
1051 queries. The "roles" property is explained below in `0.5.0 Security
1052 Settings`_.
1055 0.5.0 Security Settings
1056 ~~~~~~~~~~~~~~~~~~~~~~~
1058 See the `security documentation`_ for an explanation of how the new security
1059 system works. In a nutshell though, the security is handled as a four step
1060 process:
1062 1. Permissions are defined as having a name and optionally a hyperdb class
1063    they're specific to,
1064 2. Roles are defined that have one or more Permissions,
1065 3. Users are assigned Roles in their "roles" property, and finally
1066 4. Roundup checks that users have appropriate Permissions at appropriate times
1067    (like editing issues).
1069 Your tracker dbinit module's *open* function now has to define any
1070 Permissions that are specific to your tracker, and also the assignment
1071 of Permissions to Roles. At the moment, your open function
1072 ends with::
1074     import detectors
1075     detectors.init(db)
1077     return db
1079 and what we need to do is insert some commands that will set up the security
1080 parameters. Right above the ``import detectors`` line, you'll want to insert
1081 these lines::
1083     #
1084     # SECURITY SETTINGS
1085     #
1086     # new permissions for this schema
1087     for cl in 'issue', 'file', 'msg', 'user':
1088         db.security.addPermission(name="Edit", klass=cl,
1089             description="User is allowed to edit "+cl)
1090         db.security.addPermission(name="View", klass=cl,
1091             description="User is allowed to access "+cl)
1093     # Assign the access and edit permissions for issue, file and message
1094     # to regular users now
1095     for cl in 'issue', 'file', 'msg':
1096         p = db.security.getPermission('View', cl)
1097         db.security.addPermissionToRole('User', p)
1098         p = db.security.getPermission('Edit', cl)
1099         db.security.addPermissionToRole('User', p)
1100     # and give the regular users access to the web and email interface
1101     p = db.security.getPermission('Web Access')
1102     db.security.addPermissionToRole('User', p)
1103     p = db.security.getPermission('Email Access')
1104     db.security.addPermissionToRole('User', p)
1106     # May users view other user information? Comment these lines out
1107     # if you don't want them to
1108     p = db.security.getPermission('View', 'user')
1109     db.security.addPermissionToRole('User', p)
1111     # Assign the appropriate permissions to the anonymous user's Anonymous
1112     # Role. Choices here are:
1113     # - Allow anonymous users to register through the web
1114     p = db.security.getPermission('Web Registration')
1115     db.security.addPermissionToRole('Anonymous', p)
1116     # - Allow anonymous (new) users to register through the email gateway
1117     p = db.security.getPermission('Email Registration')
1118     db.security.addPermissionToRole('Anonymous', p)
1119     # - Allow anonymous users access to the "issue" class of data
1120     #   Note: this also grants access to related information like files,
1121     #         messages, statuses etc that are linked to issues
1122     #p = db.security.getPermission('View', 'issue')
1123     #db.security.addPermissionToRole('Anonymous', p)
1124     # - Allow anonymous users access to edit the "issue" class of data
1125     #   Note: this also grants access to create related information like
1126     #         files and messages etc that are linked to issues
1127     #p = db.security.getPermission('Edit', 'issue')
1128     #db.security.addPermissionToRole('Anonymous', p)
1130     # oh, g'wan, let anonymous access the web interface too
1131     p = db.security.getPermission('Web Access')
1132     db.security.addPermissionToRole('Anonymous', p)
1134 Note in the comments there the places where you might change the permissions
1135 to restrict users or grant users more access. If you've created additional
1136 classes that users should be able to edit and view, then you should add them
1137 to the "new permissions for this schema" section at the start of the security
1138 block. Then add them to the "Assign the access and edit permissions" section
1139 too, so people actually have the new Permission you've created.
1141 One final change is needed that finishes off the security system's
1142 initialisation. We need to add a call to ``db.post_init()`` at the end of the
1143 dbinit open() function. Add it like this::
1145     import detectors
1146     detectors.init(db)
1148     # schema is set up - run any post-initialisation
1149     db.post_init()
1150     return db
1152 You may verify the setup of Permissions and Roles using the new
1153 "``roundup-admin security``" command.
1156 0.5.0 User changes
1157 ~~~~~~~~~~~~~~~~~~
1159 To support all those schema changes, you'll need to massage your user database
1160 a little too, to:
1162 1. make sure there's an "anonymous" user - this user is mandatory now and is
1163    the one that unknown users are logged in as.
1164 2. make sure all users have at least one Role.
1166 If you don't have the "anonymous" user, create it now with the command::
1168   roundup-admin create user username=anonymous roles=Anonymous
1170 making sure the capitalisation is the same as above. Once you've done that,
1171 you'll need to set the roles property on all users to a reasonable default.
1172 The admin user should get "Admin", the anonymous user "Anonymous"
1173 and all other users "User". The ``fixroles.py`` script in the tools directory
1174 will do this. Run it like so (where python is your python 2+ binary)::
1176   python tools/fixroles.py -i <tracker home> fixroles
1180 0.5.0 CGI interface changes
1181 ---------------------------
1183 The CGI interface code was completely reorganised and largely rewritten. The
1184 end result is that this section of your tracker interfaces module will need
1185 changing from::
1187  from roundup import cgi_client, mailgw
1188  from roundup.i18n import _
1189  
1190  class Client(cgi_client.Client):
1191      ''' derives basic CGI implementation from the standard module,
1192          with any specific extensions
1193      '''
1194      pass
1196 to::
1198  from roundup import mailgw
1199  from roundup.cgi import client
1200  
1201  class Client(client.Client): 
1202      ''' derives basic CGI implementation from the standard module,
1203          with any specific extensions
1204      '''
1205      pass
1207 You will also need to install the new version of roundup.cgi from the source
1208 cgi-bin directory if you're using it.
1211 0.5.0 HTML templating
1212 ---------------------
1214 You'll want to make a backup of your current tracker html directory. You
1215 should then copy the html directory from the Roundup source "classic" template
1216 and modify it according to your local schema changes.
1218 If you need help with the new templating system, please ask questions on the
1219 roundup-users mailing list (available through the roundup project page on
1220 sourceforge, http://roundup.sf.net/)
1223 0.5.0 Detectors
1224 ---------------
1226 The nosy reactor has been updated to handle the tracker not having an
1227 "assignedto" property on issues. You may want to copy it into your tracker's
1228 detectors directory. Chances are you've already fixed it though :)
1231 Migrating from 0.4.1 to 0.4.2
1232 =============================
1234 0.4.2 Configuration
1235 -------------------
1236 The USER_INDEX definition introduced in 0.4.1 was too restrictive in its
1237 allowing replacement of 'assignedto' with the user's userid. Users must change
1238 the None value of 'assignedto' to 'CURRENT USER' (the string, in quotes) for
1239 the replacement behaviour to occur now.
1241 The new configuration variables are:
1243 - EMAIL_KEEP_QUOTED_TEXT 
1244 - EMAIL_LEAVE_BODY_UNCHANGED
1245 - ADD_RECIPIENTS_TO_NOSY
1247 See the sample configuration files in::
1249  <roundup source>/roundup/templates/classic/instance_config.py
1251 and::
1253  <roundup source>/roundup/templates/extended/instance_config.py
1255 and the `customisation documentation`_ for information on how they're used.
1258 0.4.2 Changes to detectors
1259 --------------------------
1260 You will need to copy the detectors from the distribution into your instance
1261 home "detectors" directory. If you used the classic schema, the detectors
1262 are in::
1264  <roundup source>/roundup/templates/classic/detectors/
1266 If you used the extended schema, the detectors are in::
1268  <roundup source>/roundup/templates/extended/detectors/
1270 The change means that schema-specific code has been removed from the
1271 mail gateway and cgi interface and made into auditors:
1273 - nosyreactor.py has now got an updatenosy auditor which updates the nosy
1274   list with author, recipient and assignedto information.
1275 - statusauditor.py makes the unread or resolved -> chatting changes and
1276   presets the status of an issue to unread.
1278 There's also a bug or two fixed in the nosyreactor code.
1280 0.4.2 HTML templating changes
1281 -----------------------------
1282 The link() htmltemplate function now has a "showid" option for links and
1283 multilinks. When true, it only displays the linked item id as the anchor
1284 text. The link value is displayed as a tooltip using the title anchor
1285 attribute. To use in eg. the superseder field, have something like this::
1287    <td>
1288     <display call="field('superseder', showid=1)">
1289     <display call="classhelp('issue', 'id,title', label='list', width=500)">
1290     <property name="superseder">
1291      <br>View: <display call="link('superseder', showid=1)">
1292     </property>
1293    </td>
1295 The stylesheets have been cleaned up too. You may want to use the newer
1296 versions in::
1298  <roundup source>/roundup/templates/<template>/html/default.css
1302 Migrating from 0.4.0 to 0.4.1
1303 =============================
1305 0.4.1 Files storage
1306 -------------------
1308 Messages and files from newly created issues will be put into subdierectories
1309 in thousands e.g. msg123 will be put into files/msg/0/msg123, file2003
1310 will go into files/file/2/file2003. Previous messages are still found, but
1311 could be put into this structure.
1313 0.4.1 Configuration
1314 -------------------
1316 To allow more fine-grained access control, the variable used to check
1317 permission to auto-register users in the mail gateway is now called
1318 ANONYMOUS_REGISTER_MAIL rather than overloading ANONYMOUS_REGISTER. If the
1319 variable doesn't exist, then ANONYMOUS_REGISTER is tested as before.
1321 Configuring the links in the web header is now easier too. The following
1322 variables have been added to the classic instance_config.py::
1324   HEADER_INDEX_LINKS   - defines the "index" links to be made available
1325   HEADER_ADD_LINKS     - defines the "add" links
1326   DEFAULT_INDEX        - specifies the index view for DEFAULT
1327   UNASSIGNED_INDEX     - specifies the index view for UNASSIGNED
1328   USER_INDEX           - specifies the index view for USER
1330 See the <roundup source>/roundup/templates/classic/instance_config.py for more
1331 information - including how the variables are to be set up. Most users will
1332 just be able to copy the variables from the source to their instance home. If
1333 you've modified the header by changing the source of the interfaces.py file in
1334 the instance home, you'll need to remove that customisation and move it into
1335 the appropriate variables in instance_config.py.
1337 The extended schema has similar variables added too - see the source for more
1338 info.
1340 0.4.1 Alternate E-Mail Addresses
1341 --------------------------------
1343 If you add the property "alternate_addresses" to your user class, your users
1344 will be able to register alternate email addresses that they may use to
1345 communicate with roundup as. All email from roundup will continue to be sent
1346 to their primary address.
1348 If you have not edited the dbinit.py file in your instance home directory,
1349 you may simply copy the new dbinit.py file from the core code. If you used
1350 the classic schema, the interfaces file is in::
1352  <roundup source>/roundup/templates/classic/dbinit.py
1354 If you used the extended schema, the file is in::
1356  <roundup source>/roundup/templates/extended/dbinit.py 
1358 If you have modified your dbinit.py file, you need to edit the dbinit.py
1359 file in your instance home directory. Find the lines which define the user
1360 class::
1362     user = Class(db, "msg",
1363                     username=String(),   password=Password(),
1364                     address=String(),    realname=String(), 
1365                     phone=String(),      organisation=String(),
1366                     alternate_addresses=String())
1368 You will also want to add the property to the user's details page. The
1369 template for this is the "user.item" file in your instance home "html"
1370 directory. Similar to above, you may copy the file from the roundup source if
1371 you haven't modified it. Otherwise, add the following to the template::
1373    <display call="multiline('alternate_addresses')">
1375 with appropriate labelling etc. See the standard template for an idea.
1379 Migrating from 0.3.x to 0.4.0
1380 =============================
1382 0.4.0 Message-ID and In-Reply-To addition
1383 -----------------------------------------
1384 0.4.0 adds the tracking of messages by message-id and allows threading
1385 using in-reply-to. Most e-mail clients support threading using this
1386 feature, and we hope to add support for it to the web gateway. If you
1387 have not edited the dbinit.py file in your instance home directory, you may
1388 simply copy the new dbinit.py file from the core code. If you used the
1389 classic schema, the interfaces file is in::
1391  <roundup source>/roundup/templates/classic/dbinit.py
1393 If you used the extended schema, the file is in::
1395  <roundup source>/roundup/templates/extended/dbinit.py 
1397 If you have modified your dbinit.py file, you need to edit the dbinit.py
1398 file in your instance home directory. Find the lines which define the msg
1399 class::
1401     msg = FileClass(db, "msg",
1402                     author=Link("user"), recipients=Multilink("user"),
1403                     date=Date(),         summary=String(),
1404                     files=Multilink("file"))
1406 and add the messageid and inreplyto properties like so::
1408     msg = FileClass(db, "msg",
1409                     author=Link("user"), recipients=Multilink("user"),
1410                     date=Date(),         summary=String(),
1411                     files=Multilink("file"),
1412                     messageid=String(),  inreplyto=String())
1414 Also, configuration is being cleaned up. This means that your dbinit.py will
1415 also need to be changed in the open function. If you haven't changed your
1416 dbinit.py, the above copy will be enough. If you have, you'll need to change
1417 the line (round line 50)::
1419     db = Database(instance_config.DATABASE, name)
1421 to::
1423     db = Database(instance_config, name)
1426 0.4.0 Configuration
1427 --------------------
1428 ``TRACKER_NAME`` and ``EMAIL_SIGNATURE_POSITION`` have been added to the
1429 instance_config.py. The simplest solution is to copy the default values
1430 from template in the core source.
1432 The mail gateway now checks ``ANONYMOUS_REGISTER`` to see if unknown users
1433 are to be automatically registered with the tracker. If it is set to "deny"
1434 then unknown users will not have access. If it is set to "allow" they will be
1435 automatically registered with the tracker.
1438 0.4.0 CGI script roundup.cgi
1439 ----------------------------
1440 The CGI script has been updated with some features and a bugfix, so you should
1441 copy it from the roundup cgi-bin source directory again. Make sure you update
1442 the ROUNDUP_INSTANCE_HOMES after the copy.
1445 0.4.0 Nosy reactor
1446 ------------------
1447 The nosy reactor has also changed - copy the nosyreactor.py file from the core
1448 source::
1450    <roundup source>/roundup/templates/<template>/detectors/nosyreactor.py
1452 to your instance home "detectors" directory.
1455 0.4.0 HTML templating
1456 ---------------------
1457 The field() function was incorrectly implemented - links and multilinks now
1458 display as text fields when rendered using field(). To display a menu (drop-
1459 down or select box) you need to use the menu() function.
1463 Migrating from 0.2.x to 0.3.x
1464 =============================
1466 0.3.x Cookie Authentication changes
1467 -----------------------------------
1468 0.3.0 introduces cookie authentication - you will need to copy the
1469 interfaces.py file from the roundup source to your instance home to enable
1470 authentication. If you used the classic schema, the interfaces file is in::
1472  <roundup source>/roundup/templates/classic/interfaces.py
1474 If you used the extended schema, the file is in::
1476  <roundup source>/roundup/templates/extended/interfaces.py
1478 If you have modified your interfaces.Client class, you will need to take
1479 note of the login/logout functionality provided in roundup.cgi_client.Client
1480 (classic schema) or roundup.cgi_client.ExtendedClient (extended schema) and
1481 modify your instance code apropriately.
1484 0.3.x Password encoding
1485 -----------------------
1486 This release also introduces encoding of passwords in the database. If you
1487 have not edited the dbinit.py file in your instance home directory, you may
1488 simply copy the new dbinit.py file from the core code. If you used the
1489 classic schema, the interfaces file is in::
1491  <roundup source>/roundup/templates/classic/dbinit.py
1493 If you used the extended schema, the file is in::
1495  <roundup source>/roundup/templates/extended/dbinit.py
1498 If you have modified your dbinit.py file, you may use encoded passwords:
1500 1. Edit the dbinit.py file in your instance home directory
1501    a. At the first code line of the open() function::
1503        from roundup.hyperdb import String, Date, Link, Multilink
1505       alter to include Password, as so::
1507        from roundup.hyperdb import String, Password, Date, Link, Multilink
1509    b. Where the password property is defined (around line 66)::
1511        user = Class(db, "user", 
1512                        username=String(),   password=String(),
1513                        address=String(),    realname=String(), 
1514                        phone=String(),      organisation=String())
1515        user.setkey("username")
1517       alter the "password=String()" to "password=Password()"::
1519        user = Class(db, "user", 
1520                        username=String(),   password=Password(),
1521                        address=String(),    realname=String(), 
1522                        phone=String(),      organisation=String())
1523        user.setkey("username")
1525 2. Any existing passwords in the database will remain cleartext until they
1526    are edited. It is recommended that at a minimum the admin password be
1527    changed immediately::
1529       roundup-admin -i <instance home> set user1 password=<new password>
1532 0.3.x Configuration
1533 -------------------
1534 FILTER_POSITION, ANONYMOUS_ACCESS, ANONYMOUS_REGISTER have been added to
1535 the instance_config.py. Simplest solution is to copy the default values from
1536 template in the core source.
1538 MESSAGES_TO_AUTHOR has been added to the IssueClass in dbinit.py. Set to 'yes'
1539 to send nosy messages to the author. Default behaviour is to not send nosy
1540 messages to the author. You will need to add MESSAGES_TO_AUTHOR to your
1541 dbinit.py in your instance home.
1544 0.3.x CGI script roundup.cgi
1545 ----------------------------
1546 There have been some structural changes to the roundup.cgi script - you will
1547 need to install it again from the cgi-bin directory of the source
1548 distribution. Make sure you update the ROUNDUP_INSTANCE_HOMES after the
1549 copy.
1552 .. _`customisation documentation`: customizing.html
1553 .. _`security documentation`: security.html
1554 .. _`administration guide`: admin_guide.html