comparison doc/customizing.txt @ 6168:de9d602c8ce6

more index entries and CHANGES.txt update for them.
author John Rouillard <rouilj@ieee.org>
date Thu, 14 May 2020 22:18:18 -0400
parents c2fd254c9257
children 53a674b5910f
comparison
equal deleted inserted replaced
6167:81ae33038ec5 6168:de9d602c8ce6
34 34
35 Trackers in a Nutshell 35 Trackers in a Nutshell
36 ====================== 36 ======================
37 37
38 Trackers have the following structure: 38 Trackers have the following structure:
39
40 .. index::
41 single: tracker; structure db directory
42 single: tracker; structure detectors directory
43 single: tracker; structure extensions directory
44 single: tracker; structure html directory
45 single: tracker; structure html directory
46 single: tracker; structure lib directory
39 47
40 =================== ======================================================== 48 =================== ========================================================
41 Tracker File Description 49 Tracker File Description
42 =================== ======================================================== 50 =================== ========================================================
43 config.ini Holds the basic `tracker configuration`_ 51 config.ini Holds the basic `tracker configuration`_
54 html/ Web interface templates, images and style sheets 62 html/ Web interface templates, images and style sheets
55 lib/ optional common imports for detectors and extensions 63 lib/ optional common imports for detectors and extensions
56 =================== ======================================================== 64 =================== ========================================================
57 65
58 66
67 .. index:: config.ini
68 .. index:: configuration; see config.ini
69
59 Tracker Configuration 70 Tracker Configuration
60 ===================== 71 =====================
61 72
62 The ``config.ini`` located in your tracker home contains the basic 73 The ``config.ini`` located in your tracker home contains the basic
63 configuration for the web and e-mail components of roundup's interfaces. 74 configuration for the web and e-mail components of roundup's interfaces.
98 109
99 Example configuration settings are below. This is a partial 110 Example configuration settings are below. This is a partial
100 list. Documentation on all the settings is included in the 111 list. Documentation on all the settings is included in the
101 ``config.ini`` file. 112 ``config.ini`` file.
102 113
103 .. index:: configuration; sections main 114 .. index:: config.ini; sections main
104 115
105 Section **main** 116 Section **main**
106 database -- ``db`` 117 database -- ``db``
107 Database directory path. The path may be either absolute or relative 118 Database directory path. The path may be either absolute or relative
108 to the directory containig this config file. 119 to the directory containig this config file.
184 reader has a limit on the size of individual fields 195 reader has a limit on the size of individual fields
185 starting with python 2.5. Set this to a higher value if you 196 starting with python 2.5. Set this to a higher value if you
186 get the error 'Error: field larger than field limit' during 197 get the error 'Error: field larger than field limit' during
187 import. 198 import.
188 199
200 .. index:: config.ini; sections tracker
201
189 Section **tracker** 202 Section **tracker**
190 name -- ``Roundup issue tracker`` 203 name -- ``Roundup issue tracker``
191 A descriptive name for your roundup instance. 204 A descriptive name for your roundup instance.
192 205
193 web -- ``http://host.example/demo/`` 206 web -- ``http://host.example/demo/``
203 language -- default *blank* 216 language -- default *blank*
204 Default locale name for this tracker. If this option is not set, the 217 Default locale name for this tracker. If this option is not set, the
205 language is determined by the environment variable LANGUAGE, LC_ALL, 218 language is determined by the environment variable LANGUAGE, LC_ALL,
206 LC_MESSAGES, or LANG, in that order of preference. 219 LC_MESSAGES, or LANG, in that order of preference.
207 220
208 .. index:: configuration; sections web 221 .. index:: config.ini; sections web
209 222
210 Section **web** 223 Section **web**
211 allow_html_file -- ``no`` 224 allow_html_file -- ``no``
212 Setting this option enables Roundup to serve uploaded HTML 225 Setting this option enables Roundup to serve uploaded HTML
213 file content *as HTML*. This is a potential security risk 226 file content *as HTML*. This is a potential security risk
230 243
231 debug -- ``no`` 244 debug -- ``no``
232 Setting this option makes Roundup display error tracebacks 245 Setting this option makes Roundup display error tracebacks
233 in the user's browser rather than emailing them to the 246 in the user's browser rather than emailing them to the
234 tracker admin."), 247 tracker admin."),
248
249 .. index:: config.ini; sections rdbms
250 single: config.ini; database settings
235 251
236 Section **rdbms** 252 Section **rdbms**
237 Settings in this section are used to set the backend and configure 253 Settings in this section are used to set the backend and configure
238 addition settings needed by RDBMs like SQLite, Postgresql and 254 addition settings needed by RDBMs like SQLite, Postgresql and
239 MySQL backends. 255 MySQL backends.
284 300
285 cache_size -- `100` 301 cache_size -- `100`
286 Size of the node cache (in elements) used to keep most recently used 302 Size of the node cache (in elements) used to keep most recently used
287 data in memory. 303 data in memory.
288 304
305 .. index:: config.ini; sections logging
306 see: logging; config.ini, sections logging
307
289 Section **logging** 308 Section **logging**
290 config -- default *blank* 309 config -- default *blank*
291 Path to configuration file for standard Python logging module. If this 310 Path to configuration file for standard Python logging module. If this
292 option is set, logging configuration is loaded from specified file; 311 option is set, logging configuration is loaded from specified file;
293 options 'filename' and 'level' in this section are ignored. The path may 312 options 'filename' and 'level' in this section are ignored. The path may
302 level -- ``ERROR`` 321 level -- ``ERROR``
303 Minimal severity level of messages written to log file. If above 'config' 322 Minimal severity level of messages written to log file. If above 'config'
304 option is set, this option has no effect. 323 option is set, this option has no effect.
305 Allowed values: ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR`` 324 Allowed values: ``DEBUG``, ``INFO``, ``WARNING``, ``ERROR``
306 325
326 .. index:: config.ini; sections mail
327
307 Section **mail** 328 Section **mail**
308 Outgoing email options. Used for nosy messages, password reset and 329 Outgoing email options. Used for nosy messages, password reset and
309 registration approval requests. 330 registration approval requests.
310 331
311 domain -- ``localhost`` 332 domain -- ``localhost``
367 Add the mail address of the author to the author information at the 388 Add the mail address of the author to the author information at the
368 top of all messages. If this is false but add_authorinfo is true, 389 top of all messages. If this is false but add_authorinfo is true,
369 only the name of the actor is added which protects the mail address 390 only the name of the actor is added which protects the mail address
370 of the actor from being exposed at mail archives, etc. 391 of the actor from being exposed at mail archives, etc.
371 392
393 .. index:: config.ini; sections mailgw
394 single: mailgw; config
395 see: mail gateway; mailgw
396
372 Section **mailgw** 397 Section **mailgw**
373 Roundup Mail Gateway options 398 Roundup Mail Gateway options
374 399
375 keep_quoted_text -- ``yes`` 400 keep_quoted_text -- ``yes``
376 Keep email citations when accepting messages. Setting this to ``no`` strips 401 Keep email citations when accepting messages. Setting this to ``no`` strips
447 text/plain part it finds. If this part is inside a 472 text/plain part it finds. If this part is inside a
448 multipart/alternative, and this option is set, all other 473 multipart/alternative, and this option is set, all other
449 parts of the multipart/alternative are ignored. The default 474 parts of the multipart/alternative are ignored. The default
450 is to keep all parts and attach them to the issue. 475 is to keep all parts and attach them to the issue.
451 476
477 .. index:: config.ini; sections php
478
452 Section **pgp** 479 Section **pgp**
453 OpenPGP mail processing options 480 OpenPGP mail processing options
454 481
455 enable -- ``no`` 482 enable -- ``no``
456 Enable PGP processing. Requires gpg. 483 Enable PGP processing. Requires gpg.
460 processing on. If not specified, it happens for all users. 487 processing on. If not specified, it happens for all users.
461 488
462 homedir -- default *blank* 489 homedir -- default *blank*
463 Location of PGP directory. Defaults to $HOME/.gnupg if not 490 Location of PGP directory. Defaults to $HOME/.gnupg if not
464 specified. 491 specified.
492
493
494 .. index:: config.ini; sections nosy
465 495
466 Section **nosy** 496 Section **nosy**
467 Nosy messages sending 497 Nosy messages sending
468 498
469 messages_to_author -- ``no`` 499 messages_to_author -- ``no``
513 543
514 Configuration variables may be referred to in lower or upper case. In code, 544 Configuration variables may be referred to in lower or upper case. In code,
515 variables not in the "main" section are referred to using their section and 545 variables not in the "main" section are referred to using their section and
516 name, so "domain" in the section "mail" becomes MAIL_DOMAIN. 546 name, so "domain" in the section "mail" becomes MAIL_DOMAIN.
517 547
548 .. index:: pair: configuration; extensions
549 pair: configuration; detectors
550
518 Extending the configuration file 551 Extending the configuration file
519 -------------------------------- 552 --------------------------------
520 553
521 You can't add new variables to the config.ini file in the tracker home but 554 You can't add new variables to the config.ini file in the tracker home but
522 you can add two new config.ini files: 555 you can add two new config.ini files:
569 The initial_data.py module sets up the initial state of your 602 The initial_data.py module sets up the initial state of your
570 tracker. It’s called exactly once - by the ``roundup-admin initialise`` 603 tracker. It’s called exactly once - by the ``roundup-admin initialise``
571 command. See the start of the section on database content for more 604 command. See the start of the section on database content for more
572 info about how this works. 605 info about how this works.
573 606
607 .. index:: schema; classic - description of
574 608
575 The "classic" schema 609 The "classic" schema
576 -------------------- 610 --------------------
577 611
578 The "classic" schema looks like this (see section `setkey(property)`_ 612 The "classic" schema looks like this (see section `setkey(property)`_
604 issue = IssueClass(db, "issue", keyword=Multilink("keyword"), 638 issue = IssueClass(db, "issue", keyword=Multilink("keyword"),
605 status=Link("status"), assignedto=Link("user"), 639 status=Link("status"), assignedto=Link("user"),
606 priority=Link("priority")) 640 priority=Link("priority"))
607 issue.setkey('title') 641 issue.setkey('title')
608 642
643 .. index:: schema; allowed changes
609 644
610 What you can't do to the schema 645 What you can't do to the schema
611 ------------------------------- 646 -------------------------------
612 647
613 You must never: 648 You must never:
688 723
689 The actual data entered into the database, using ``class.create()``, are 724 The actual data entered into the database, using ``class.create()``, are
690 called items. They have a special immutable property called ``'id'``. We 725 called items. They have a special immutable property called ``'id'``. We
691 sometimes refer to this as the *itemid*. 726 sometimes refer to this as the *itemid*.
692 727
728
729 .. index:: schema; property types
693 730
694 Properties 731 Properties
695 ~~~~~~~~~~ 732 ~~~~~~~~~~
696 733
697 A Class is comprised of one or more properties of the following types: 734 A Class is comprised of one or more properties of the following types:
724 class. The value is a list of integers. 761 class. The value is a list of integers.
725 762
726 Properties can have additional attributes to change the default 763 Properties can have additional attributes to change the default
727 behaviour: 764 behaviour:
728 765
766 .. index:: triple: schema; property attributes; required
767 triple: schema; property attributes; default_value
768 triple: schema; property attributes; quiet
769
729 * All properties support the following attributes: 770 * All properties support the following attributes:
730 771
731 - ``required``: see `design documentation`_. Adds the property to 772 - ``required``: see `design documentation`_. Adds the property to
732 the list returned by calling get_required_props for the class. 773 the list returned by calling get_required_props for the class.
733 - ``default_value``: see `design documentation`_ Sets the default 774 - ``default_value``: see `design documentation`_ Sets the default
745 user). Making properties that are updated as an indirect result of 786 user). Making properties that are updated as an indirect result of
746 a user's change (e.g. updating a blockers property, counting 787 a user's change (e.g. updating a blockers property, counting
747 number of times an issue was reopened or reassigned etc.) should 788 number of times an issue was reopened or reassigned etc.) should
748 not be displayed to the user as they can be confusing. 789 not be displayed to the user as they can be confusing.
749 790
791 .. index:: triple: schema; property attributes; indexme
792
750 * String properties can have an ``indexme`` attribute that defines if the 793 * String properties can have an ``indexme`` attribute that defines if the
751 property should be part of the full text index. The default is 'no' but this 794 property should be part of the full text index. The default is 'no' but this
752 can be set to 'yes' to allow a property's contents to be in the full 795 can be set to 'yes' to allow a property's contents to be in the full
753 text index. 796 text index.
797
798 .. index:: triple: schema; property attributes; use_double
799
754 * Number properties can have a ``use_double`` attribute that, when set 800 * Number properties can have a ``use_double`` attribute that, when set
755 to ``True``, will use double precision floating point in the database. 801 to ``True``, will use double precision floating point in the database.
756 * Link and Multilink properties can have several attributes: 802 * Link and Multilink properties can have several attributes:
757 803
804 .. index:: triple: schema; property attributes; do_journal
805
758 - ``do_journal``: By default, every change of a link property is 806 - ``do_journal``: By default, every change of a link property is
759 recorded in the item being linked to (or being unlinked). A typical 807 recorded in the item being linked to (or being unlinked). A typical
760 use-case for setting ``do_journal='no'`` would be to turn off 808 use-case for setting ``do_journal='no'`` would be to turn off
761 journalling of nosy list, message author and message recipient link 809 journalling of nosy list, message author and message recipient link
762 and unlink events to prevent the journal from clogged with these 810 and unlink events to prevent the journal from clogged with these
763 events. 811 events.
812
813 .. index:: triple: schema; property attributes; try_id_parsing
814
764 - ``try_id_parsing`` is turned on by default. If entering a number 815 - ``try_id_parsing`` is turned on by default. If entering a number
765 into a Link or Multilink field, roundup interprets this number as an 816 into a Link or Multilink field, roundup interprets this number as an
766 ID of the item to link to. Sometimes items can have numeric names 817 ID of the item to link to. Sometimes items can have numeric names
767 (like, e.g., product codes). For these roundup needs to match the 818 (like, e.g., product codes). For these roundup needs to match the
768 numeric name and should never match an ID. In this case you can set 819 numeric name and should never match an ID. In this case you can set
769 ``try_id_parsing='no'``. 820 ``try_id_parsing='no'``.
821
822 .. index:: triple: schema; property attributes; rev_multilink
823
770 - The ``rev_multilink`` option takes a property name to be inserted 824 - The ``rev_multilink`` option takes a property name to be inserted
771 into the linked-to class. This property is a Multilink property that 825 into the linked-to class. This property is a Multilink property that
772 links back to the current class. The new Multilink is read-only (it 826 links back to the current class. The new Multilink is read-only (it
773 is automatically modified if the Link or Multilink property defining 827 is automatically modified if the Link or Multilink property defining
774 it is modified). The new property can be used in normal searches 828 it is modified). The new property can be used in normal searches
817 assigned_to = Link("user", rev_multilink="responsibleFor"), 871 assigned_to = Link("user", rev_multilink="responsibleFor"),
818 ... ) 872 ... )
819 873
820 This makes it easy to list all issues that the user is responsible 874 This makes it easy to list all issues that the user is responsible
821 for (aka assigned_to). 875 for (aka assigned_to).
876
877 .. index:: triple: schema; property attributes; msg_header_property
822 878
823 - The ``msg_header_property`` is used by the mail gateway when sending 879 - The ``msg_header_property`` is used by the mail gateway when sending
824 out messages. When a link or multilink property of an issue changes, 880 out messages. When a link or multilink property of an issue changes,
825 roundup creates email headers of the form:: 881 roundup creates email headers of the form::
826 882
881 for emails sent on issues where joe_user has been assigned to the issue. 937 for emails sent on issues where joe_user has been assigned to the issue.
882 938
883 If this property is set to the empty string "", it will prevent 939 If this property is set to the empty string "", it will prevent
884 the header from being generated on outgoing mail. 940 the header from being generated on outgoing mail.
885 941
942 .. index:: triple: schema; class property; creator
943 triple: schema; class property; creation
944 triple: schema; class property; actor
945 triple: schema; class property; activity
946
886 All Classes automatically have a number of properties by default: 947 All Classes automatically have a number of properties by default:
887 948
888 *creator* 949 *creator*
889 Link to the user that created the item. 950 Link to the user that created the item.
890 *creation* 951 *creation*
893 Link to the user that last modified the item. 954 Link to the user that last modified the item.
894 *activity* 955 *activity*
895 Date the item was last modified. 956 Date the item was last modified.
896 957
897 958
959 .. index:: triple: schema; class property; content
960 triple: schema; class property; type
961
898 FileClass 962 FileClass
899 ~~~~~~~~~ 963 ~~~~~~~~~
900 964
901 FileClasses save their "content" attribute off in a separate file from 965 FileClasses save their "content" attribute off in a separate file from
902 the rest of the database. This reduces the number of large entries in 966 the rest of the database. This reduces the number of large entries in
904 allows us to use command-line tools to operate on the files. They are 968 allows us to use command-line tools to operate on the files. They are
905 stored in the files sub-directory of the ``'db'`` directory in your 969 stored in the files sub-directory of the ``'db'`` directory in your
906 tracker. FileClasses also have a "type" attribute to store the MIME 970 tracker. FileClasses also have a "type" attribute to store the MIME
907 type of the file. 971 type of the file.
908 972
973 .. index:: triple: schema; class property; messages
974 triple: schema; class property; files
975 triple: schema; class property; nosy
976 triple: schema; class property; superseder
909 977
910 IssueClass 978 IssueClass
911 ~~~~~~~~~~ 979 ~~~~~~~~~~
912 980
913 IssueClasses automatically include the "messages", "files", "nosy", and 981 IssueClasses automatically include the "messages", "files", "nosy", and
927 created, and the value of the "activity" property is the date when any 995 created, and the value of the "activity" property is the date when any
928 property on the item was last edited (equivalently, these are the dates 996 property on the item was last edited (equivalently, these are the dates
929 on the first and last records in the item's journal). The "creator" 997 on the first and last records in the item's journal). The "creator"
930 property holds a link to the user that created the issue. 998 property holds a link to the user that created the issue.
931 999
1000 .. index: triple: schema; class method; setkey
932 1001
933 setkey(property) 1002 setkey(property)
934 ~~~~~~~~~~~~~~~~ 1003 ~~~~~~~~~~~~~~~~
935 1004
936 Select a String property of the class to be the key property. The key 1005 Select a String property of the class to be the key property. The key
946 1015
947 roundup-admin set issue23 assignedto=richard 1016 roundup-admin set issue23 assignedto=richard
948 1017
949 Note, the same thing can be done in the web and e-mail interfaces. 1018 Note, the same thing can be done in the web and e-mail interfaces.
950 1019
1020 .. index: triple: schema; class method; setlabelprop
1021
951 setlabelprop(property) 1022 setlabelprop(property)
952 ~~~~~~~~~~~~~~~~~~~~~~ 1023 ~~~~~~~~~~~~~~~~~~~~~~
953 1024
954 Select a property of the class to be the label property. The label 1025 Select a property of the class to be the label property. The label
955 property is used whereever an item should be uniquely identified, e.g., 1026 property is used whereever an item should be uniquely identified, e.g.,
966 1037
967 You should make sure that users have View access to this property or 1038 You should make sure that users have View access to this property or
968 the id property for a class. If the property can not be viewed by a 1039 the id property for a class. If the property can not be viewed by a
969 user, looping over items in the class (e.g. messages attached to an 1040 user, looping over items in the class (e.g. messages attached to an
970 issue) will not work. 1041 issue) will not work.
1042
1043 .. index: triple: schema; class method; setorderprop
971 1044
972 setorderprop(property) 1045 setorderprop(property)
973 ~~~~~~~~~~~~~~~~~~~~~~ 1046 ~~~~~~~~~~~~~~~~~~~~~~
974 1047
975 Select a property of the class to be the order property. The order 1048 Select a property of the class to be the order property. The order
983 * the label property (see `setlabelprop(property)`_ above) 1056 * the label property (see `setlabelprop(property)`_ above)
984 1057
985 So in most cases you can get away without specifying setorderprop 1058 So in most cases you can get away without specifying setorderprop
986 explicitly. 1059 explicitly.
987 1060
1061 .. index: triple: schema; class method; create
1062
988 create(information) 1063 create(information)
989 ~~~~~~~~~~~~~~~~~~~ 1064 ~~~~~~~~~~~~~~~~~~~
990 1065
991 Create an item in the database. This is generally used to create items 1066 Create an item in the database. This is generally used to create items
992 in the "definitional" classes like "priority" and "status". 1067 in the "definitional" classes like "priority" and "status".
993 1068
1069 .. index: schema; item ordering
994 1070
995 A note about ordering 1071 A note about ordering
996 ~~~~~~~~~~~~~~~~~~~~~ 1072 ~~~~~~~~~~~~~~~~~~~~~
997 1073
998 When we sort items in the hyperdb, we use one of a number of methods, 1074 When we sort items in the hyperdb, we use one of a number of methods,
1073 .. index:: detectors; writing api 1149 .. index:: detectors; writing api
1074 1150
1075 Detector API 1151 Detector API
1076 ------------ 1152 ------------
1077 1153
1154 .. index:: pair: detectors; auditors
1155 single: auditors; function signature
1156 single: auditors; defining
1157 single: auditors; arguments
1158
1078 Auditors are called with the arguments:: 1159 Auditors are called with the arguments::
1079 1160
1080 audit(db, cl, itemid, newdata) 1161 audit(db, cl, itemid, newdata)
1081 1162
1082 where ``db`` is the database, ``cl`` is an instance of Class or 1163 where ``db`` is the database, ``cl`` is an instance of Class or
1089 1170
1090 For a ``set()`` operation, newdata contains only the names and values of 1171 For a ``set()`` operation, newdata contains only the names and values of
1091 properties that are about to be changed. 1172 properties that are about to be changed.
1092 1173
1093 For a ``retire()`` or ``restore()`` operation, newdata is None. 1174 For a ``retire()`` or ``restore()`` operation, newdata is None.
1175
1176 .. index:: pair: detectors; reactor
1177 single: reactors; function signature
1178 single: reactors; defining
1179 single: reactors; arguments
1094 1180
1095 Reactors are called with the arguments:: 1181 Reactors are called with the arguments::
1096 1182
1097 react(db, cl, itemid, olddata) 1183 react(db, cl, itemid, olddata)
1098 1184
1142 things with a .eml attachment, as they deem it 'unsafe'. Worse yet, 1228 things with a .eml attachment, as they deem it 'unsafe'. Worse yet,
1143 they'll just give you an incomprehensible error message. For more 1229 they'll just give you an incomprehensible error message. For more
1144 information, see the detector code - it has a length explanation. 1230 information, see the detector code - it has a length explanation.
1145 1231
1146 1232
1233 .. index:: auditors; rules for use
1234 single: reactors; rules for use
1235
1147 Auditor or Reactor? 1236 Auditor or Reactor?
1148 ------------------- 1237 -------------------
1149 1238
1150 Generally speaking, the following rules should be observed: 1239 Generally speaking, the following rules should be observed:
1151 1240
1193 messages which only consist of a change note (ie. the message id parameter 1282 messages which only consist of a change note (ie. the message id parameter
1194 is not required - this is referred to as a "System Message" because it 1283 is not required - this is referred to as a "System Message" because it
1195 comes from "the system" and not a user). 1284 comes from "the system" and not a user).
1196 1285
1197 1286
1287 .. index:: extensions
1288 .. index:: extensions; add python functions to tracker
1289
1198 Extensions - adding capabilities to your tracker 1290 Extensions - adding capabilities to your tracker
1199 ================================================ 1291 ================================================
1200 .. _extensions: 1292 .. _extensions:
1201 1293
1202 While detectors_ add new behavior by reacting to changes in tracked 1294 While detectors_ add new behavior by reacting to changes in tracked
1265 * a file named rss.xml will be cached for 5 minutes 1357 * a file named rss.xml will be cached for 5 minutes
1266 * a file named local.js will be cached for 2 hours 1358 * a file named local.js will be cached for 2 hours
1267 1359
1268 Note that a file name match overrides the mime type settings. 1360 Note that a file name match overrides the mime type settings.
1269 1361
1362
1270 Example: Implement password complexity checking 1363 Example: Implement password complexity checking
1271 ----------------------------------------------- 1364 -----------------------------------------------
1365
1366 .. index:: tracker; lib directory (example)
1272 1367
1273 This example uses the zxcvbn_ module that you can place in the zxcvbn 1368 This example uses the zxcvbn_ module that you can place in the zxcvbn
1274 subdirectory of your tracker's lib directory. 1369 subdirectory of your tracker's lib directory.
1275 1370
1276 If you add this to the interfaces.py file in the root directory of 1371 If you add this to the interfaces.py file in the root directory of
4767 4862
4768 4863
4769 Changes to Tracker Behaviour 4864 Changes to Tracker Behaviour
4770 ---------------------------- 4865 ----------------------------
4771 4866
4867 .. index:: single: auditors; how to register (example)
4868 single: reactors; how to register (example)
4869
4772 Preventing SPAM 4870 Preventing SPAM
4773 ~~~~~~~~~~~~~~~ 4871 ~~~~~~~~~~~~~~~
4774 4872
4775 The following detector code may be installed in your tracker's 4873 The following detector code may be installed in your tracker's
4776 ``detectors`` directory. It will block any messages being created that 4874 ``detectors`` directory. It will block any messages being created that
5292 In the auditor, there is a loop over all users. For a site with 5390 In the auditor, there is a loop over all users. For a site with
5293 only few users this will pose no serious problem; however, with 5391 only few users this will pose no serious problem; however, with
5294 many users this will be a serious performance bottleneck. 5392 many users this will be a serious performance bottleneck.
5295 A way out would be to link from the keywords to the users who 5393 A way out would be to link from the keywords to the users who
5296 selected these keywords as nosy keywords. This will eliminate the 5394 selected these keywords as nosy keywords. This will eliminate the
5297 loop over all users. 5395 loop over all users. See the ``rev_multilink`` attribute to make
5396 this easier.
5298 5397
5299 Restricting updates that arrive by email 5398 Restricting updates that arrive by email
5300 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5399 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5301 5400
5302 Roundup supports multiple update methods: 5401 Roundup supports multiple update methods:

Roundup Issue Tracker: http://roundup-tracker.org/