diff options
author | ivan <ivan> | 2003-07-15 13:16:32 +0000 |
---|---|---|
committer | ivan <ivan> | 2003-07-15 13:16:32 +0000 |
commit | 0ebeec96313dd7edfca340f01f8fbbbac1f4aa1d (patch) | |
tree | 64e852c61cbf09007d52cd6978bfddea721d00d2 /rt/etc | |
parent | c0567c688084e89fcd11bf82348b6c418f1254ac (diff) | |
parent | 945721f48f74d5cfffef7c7cf3a3d6bc2521f5dd (diff) |
This commit was generated by cvs2svn to compensate for changes in r2526,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'rt/etc')
-rw-r--r-- | rt/etc/RT_Config.pm | 349 | ||||
-rw-r--r-- | rt/etc/RT_Config.pm.in | 349 | ||||
-rw-r--r-- | rt/etc/RT_SiteConfig.pm | 1 | ||||
-rw-r--r-- | rt/etc/constraints.mysql | 52 | ||||
-rw-r--r-- | rt/etc/initialdata | 569 | ||||
-rw-r--r-- | rt/etc/schema.SQLite | 384 | ||||
-rw-r--r-- | rt/etc/upgrade/2.1.71 | 211 |
7 files changed, 1915 insertions, 0 deletions
diff --git a/rt/etc/RT_Config.pm b/rt/etc/RT_Config.pm new file mode 100644 index 000000000..2b3f4f9fe --- /dev/null +++ b/rt/etc/RT_Config.pm @@ -0,0 +1,349 @@ +# +# WARNING: NEVER EDIT RT_Config.pm. Instead, copy any sections you want to change to RT_SiteConfig.pm +# and edit them there. +# + +package RT; + +=head1 NAME + +RT::Config + +=for testing + +use RT::Config; + +=cut + +# {{{ Base Configuration + +# $rtname the string that RT will look for in mail messages to +# figure out what ticket a new piece of mail belongs to + +# Your domain name is recommended, so as not to pollute the namespace. +# once you start using a given tag, you should probably never change it. +# (otherwise, mail for existing tickets won't get put in the right place + +Set($rtname , "example.com"); + +# You should set this to your organization's DNS domain. For example, +# fsck.com or asylum.arkham.ma.us. It's used by the linking interface to +# guarantee that ticket URIs are unique and easy to construct. + +Set($Organization , "example.com"); + +# $user_passwd_min defines the minimum length for user passwords. Setting +# it to 0 disables this check +Set($MinimumPasswordLength , "5"); + +# $Timezone is used to convert times entered by users into GMT and back again +# It should be set to a timezone recognized by your local unix box. +Set($Timezone , 'US/Eastern'); + +# }}} + +# }}} + +# {{{ Database Configuration + +# Database driver beeing used. Case matters +# Valid types are "mysql" and "Pg" + +Set($DatabaseType , 'mysql'); + +# The domain name of your database server +# If you're running mysql and it's on localhost, +# leave it blank for enhanced performance +Set($DatabaseHost , 'localhost'); +Set($DatabaseRTHost , 'localhost'); + +# The port that your database server is running on. Ignored unless it's +# a positive integer. It's usually safe to leave this blank +Set($DatabasePort , ''); + +#The name of the database user (inside the database) +Set($DatabaseUser , 'rt_user'); + +# Password the DatabaseUser should use to access the database +Set($DatabasePassword , 'rt_pass'); + +# The name of the RT's database on your database server +Set($DatabaseName , 'rt3'); + +# If you're using Postgres and have compiled in SSL support, +# set DatabaseRequireSSL to 1 to turn on SSL communication +Set($DatabaseRequireSSL , undef); + +# }}} + +# {{{ Incoming mail gateway configuration + +# OwnerEmail is the address of a human who manages RT. RT will send +# errors generated by the mail gateway to this address. This address +# should _not_ be an address that's managed by your RT instance. + +Set($OwnerEmail , 'root'); + +# If $LoopsToRTOwner is defined, RT will send mail that it believes +# might be a loop to $RT::OwnerEmail + +Set($LoopsToRTOwner , 1); + +# If $StoreLoopss is defined, RT will record messages that it believes +# to be part of mail loops. +# As it does this, it will try to be careful not to send mail to the +# sender of these messages + +Set($StoreLoops , undef); + +# $MaxAttachmentSize sets the maximum size (in bytes) of attachments stored +# in the database. + +# For mysql and oracle, we set this size at 10 megabytes. +# If you're running a postgres version earlier than 7.1, you will need +# to drop this to 8192. (8k) + +Set($MaxAttachmentSize , 10000000); + +# $TruncateLongAttachments: if this is set to a non-undef value, +# RT will truncate attachments longer than MaxAttachmentLength. + +Set($TruncateLongAttachments , undef); + +# $DropLongAttachments: if this is set to a non-undef value, +# RT will silently drop attachments longer than MaxAttachmentLength. + +Set($DropLongAttachments , undef); + +# If $ParseNewMessageForTicketCcs is true, RT will attempt to divine +# Ticket 'Cc' watchers from the To and Cc lines of incoming messages +# Be forewarned that if you have _any_ addresses which forward mail to +# RT automatically and you enable this option without modifying +# "RTAddressRegexp" below, you will get yourself into a heap of trouble. + +Set($ParseNewMessageForTicketCcs , undef); + +# RTAddressRegexp is used to make sure RT doesn't add itself as a ticket CC if +# the setting above is enabled. + +Set($RTAddressRegexp , '^rt\@example.com$'); + +# RT provides functionality which allows the system to rewrite +# incoming email addresses. In its simplest form, +# you can substitute the value in CanonicalizeEmailAddressReplace +# for the value in CanonicalizeEmailAddressMatch +# (These values are passed to the CanonicalizeEmailAddress subroutine in RT/User.pm) +# By default, that routine performs a s/$Match/$Replace/gi on any address passed to it + +Set($CanonicalizeEmailAddressMatch , 'subdomain.example.com$'); +Set($CanonicalizeEmailAddressReplace , 'example.com'); + +# If $SenderMustExistInExternalDatabase is true, RT will refuse to +# create non-privileged accounts for unknown users if you are using +# the "LookupSenderInExternalDatabase" option. +# Instead, an error message will be mailed and RT will forward the +# message to $RTOwner. +# +# If you are not using $LookupSenderInExternalDatabase, this option +# has no effect. +# +# If you define an AutoRejectRequest template, RT will use this +# template for the rejection message. + +Set($SenderMustExistInExternalDatabase , undef); + +# }}} + +# {{{ Outgoing mail configuration + +# RT is designed such that any mail which already has a ticket-id associated +# with it will get to the right place automatically. + +# $CorrespondAddress and $CommentAddress are the default addresses +# that will be listed in From: and Reply-To: headers of correspondence +# and comment mail tracked by RT, unless overridden by a queue-specific +# address. + +Set($CorrespondAddress , 'RT::CorrespondAddress.not.set'); + +Set($CommentAddress , 'RT::CommentAddress.not.set'); + +#Sendmail Configuration + +# $MailCommand defines which method RT will use to try to send mail +# We know that 'sendmailpipe' works fairly well. +# If 'sendmailpipe' doesn't work well for you, try 'sendmail' +# +# Note that you should remove the '-t' from $SendmailArguments +# if you use 'sendmail rather than 'sendmailpipe' + +Set($MailCommand , 'sendmailpipe'); + +# $SendmailArguments defines what flags to pass to $Sendmail +# assuming you picked 'sendmail' or 'sendmailpipe' as the $MailCommand above. +# If you picked 'sendmailpipe', you MUST add a -t flag to $SendmailArguments + +# These options are good for most sendmail wrappers and workalikes +Set($SendmailArguments , "-oi -t"); + +# These arguments are good for sendmail brand sendmail 8 and newer +#Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m"); + +# If you selected 'sendmailpipe' above, you MUST specify the path +# to your sendmail binary in $SendmailPath. +# !! If you did not # select 'sendmailpipe' above, this has no effect!! +Set($SendmailPath , "/usr/sbin/sendmail"); + +# By default, RT sets the outgoing mail's "From:" header to +# "SenderName via RT". Setting this option to 0 disables it. + +Set($UseFriendlyFromLine , 1); + +# sprintf() format of the friendly 'From:' header; its arguments +# are SenderName and SenderEmailAddress. +Set($FriendlyFromLineFormat , "\"%s via RT\" <%s>"); + +# RT can optionally set a "Friendly" 'To:' header when sending messages to +# Ccs or AdminCcs (rather than having a blank 'To:' header. + +# This feature DOES NOT WORK WITH SENDMAIL[tm] BRAND SENDMAIL +# If you are using sendmail, rather than postfix, qmail, exim or some other MTA, +# you _must_ disable this option. + +Set($UseFriendlyToLine , 0); + +# sprintf() format of the friendly 'From:' header; its arguments +# are WatcherType and TicketId. +Set($FriendlyToLineFormat, "\"%s of $RT::rtname Ticket #%s\":;"); + +# By default RT doesn't notify the person who performs an update, as they +# already know what they've done. If you'd like to change this behaviour, +# Set $NotifyActor to 1 + +Set($NotifyActor, 0); + + +# }}} + +# {{{ Logging + +# Logging. The default is to log anything except debugging +# information to syslog. Check the Log::Dispatch POD for +# information about how to get things by syslog, mail or anything +# else, get debugging info in the log, etc. + +# It might generally make +# sense to send error and higher by email to some administrator. +# If you do this, be careful that this email isn't sent to this RT instance. + +# the minimum level error that will be logged to the specific device. +# levels from lowest to highest: +# debug info notice warning error critical alert emergency + +# Mail loops will generate a critical log message. +Set($LogToSyslog , 'debug'); +Set($LogToScreen , 'error'); +Set($LogToFile , undef); +Set($LogDir, '/opt/rt3/var/log'); +Set($LogToFileNamed , "rt.log"); #log to rt.log + +# }}} + +# {{{ Web interface configuration + +# Define the directory name to be used for images in rt web +# documents. + +# If you're putting the web ui somewhere other than at the root of +# your server +# $WebPath requires a leading / but no trailing / + +Set($WebPath , ""); + +# This is the Scheme, server and port for constructing urls to webrt +# $WebBaseURL doesn't need a trailing / + +Set($WebBaseURL , "http://RT::WebBaseURL.not.configured:80"); + +Set($WebURL , $WebBaseURL . $WebPath . "/"); + +# $WebImagesURL points to the base URL where RT can find its images. +# If you're running the FastCGI version of the RT web interface, +# you should make RT's WebRT/html/NoAuth/images directory available on +# a static web server and supply that URL as $WebImagesURL. + +Set($WebImagesURL , $WebURL . "NoAuth/images/"); + +# $RTLogoURL points to the URL of the RT logo displayed in the web UI + +Set($LogoURL , $WebImagesURL . "rt.jpg"); + +# if TrustHTMLAttachments is not defined, we will display them +# as text. This prevents malicious HTML and javascript from being +# sent in a request (although there is probably more to it than that) +Set($TrustHTMLAttachments , undef); + +# If $WebExternalAuth is defined, RT will defer to the environment's +# REMOTE_USER variable. + +Set($WebExternalAuth , undef); + +# If $WebFallbackToInternalAuth is undefined, the user is allowed a chance +# of fallback to the login screen, even if REMOTE_USER failed. + +Set($WebFallbackToInternalAuth , undef); + +# $WebExternalGecos means to match 'gecos' field as the user identity); +# useful with mod_auth_pwcheck and IIS Integrated Windows logon. + +Set($WebExternalGecos , undef); + +# $WebExternalAuto will create users under the same name as REMOTE_USER +# upon login, if it's missing in the Users table. + +Set($WebExternalAuto , undef); + +# $WebSessionClass is the class you wish to use for managing Sessions. +# It defaults to use your SQL database, but if you are using MySQL 3.x and +# plans to use non-ascii Queue names, uncomment and add this line to +# RT_SiteConfig.pm will prevent session corruption. + +# Set($WebSessionClass , 'Apache::Session::File'); + +# }}} + +# {{{ RT UTF-8 Settings + +# An array that contains languages supported by RT's internationalization +# interface. Defaults to all *.po lexicons; set it to qw(en ja) will make +# RT bilingual instead of multilingual, but will save same memory. + +@LexiconLanguages = qw(*) unless (@LexiconLanguages); + +# An array that contains default encodings used to guess which charset +# an attachment uses if not specified. Must be recognized by +# Encode::Guess. + +@EmailInputEncodings = qw(utf-8 iso-8859-1 us-ascii) unless (@EmailInputEncodings); + +# The charset for localized email. Must be recognized by Encode. + +Set($EmailOutputEncoding , 'utf-8'); + +# }}} + +# {{{ RT Date Handling Options (for Time::ParseDate) + +# Set this to 1 if your local date convention looks like "dd/mm/yy" +# instead of "mm/dd/yy". + +Set($DateDayBeforeMonth , 1); + +# Should "Tuesday" default to meaning "Next Tuesday" or "Last Tuesday"? +# Set to 0 for "Next" or 1 for "Last". + +Set($AmbiguousDayInPast , 1); + +# }}} + +1; diff --git a/rt/etc/RT_Config.pm.in b/rt/etc/RT_Config.pm.in new file mode 100644 index 000000000..5f97eb0a0 --- /dev/null +++ b/rt/etc/RT_Config.pm.in @@ -0,0 +1,349 @@ +# +# WARNING: NEVER EDIT RT_Config.pm. Instead, copy any sections you want to change to RT_SiteConfig.pm +# and edit them there. +# + +package RT; + +=head1 NAME + +RT::Config + +=for testing + +use RT::Config; + +=cut + +# {{{ Base Configuration + +# $rtname the string that RT will look for in mail messages to +# figure out what ticket a new piece of mail belongs to + +# Your domain name is recommended, so as not to pollute the namespace. +# once you start using a given tag, you should probably never change it. +# (otherwise, mail for existing tickets won't get put in the right place + +Set($rtname , "example.com"); + +# You should set this to your organization's DNS domain. For example, +# fsck.com or asylum.arkham.ma.us. It's used by the linking interface to +# guarantee that ticket URIs are unique and easy to construct. + +Set($Organization , "example.com"); + +# $user_passwd_min defines the minimum length for user passwords. Setting +# it to 0 disables this check +Set($MinimumPasswordLength , "5"); + +# $Timezone is used to convert times entered by users into GMT and back again +# It should be set to a timezone recognized by your local unix box. +Set($Timezone , 'US/Eastern'); + +# }}} + +# }}} + +# {{{ Database Configuration + +# Database driver beeing used. Case matters +# Valid types are "mysql" and "Pg" + +Set($DatabaseType , '@DB_TYPE@'); + +# The domain name of your database server +# If you're running mysql and it's on localhost, +# leave it blank for enhanced performance +Set($DatabaseHost , '@DB_HOST@'); +Set($DatabaseRTHost , '@DB_RT_HOST@'); + +# The port that your database server is running on. Ignored unless it's +# a positive integer. It's usually safe to leave this blank +Set($DatabasePort , '@DB_PORT@'); + +#The name of the database user (inside the database) +Set($DatabaseUser , '@DB_RT_USER@'); + +# Password the DatabaseUser should use to access the database +Set($DatabasePassword , '@DB_RT_PASS@'); + +# The name of the RT's database on your database server +Set($DatabaseName , '@DB_DATABASE@'); + +# If you're using Postgres and have compiled in SSL support, +# set DatabaseRequireSSL to 1 to turn on SSL communication +Set($DatabaseRequireSSL , undef); + +# }}} + +# {{{ Incoming mail gateway configuration + +# OwnerEmail is the address of a human who manages RT. RT will send +# errors generated by the mail gateway to this address. This address +# should _not_ be an address that's managed by your RT instance. + +Set($OwnerEmail , 'root'); + +# If $LoopsToRTOwner is defined, RT will send mail that it believes +# might be a loop to $RT::OwnerEmail + +Set($LoopsToRTOwner , 1); + +# If $StoreLoopss is defined, RT will record messages that it believes +# to be part of mail loops. +# As it does this, it will try to be careful not to send mail to the +# sender of these messages + +Set($StoreLoops , undef); + +# $MaxAttachmentSize sets the maximum size (in bytes) of attachments stored +# in the database. + +# For mysql and oracle, we set this size at 10 megabytes. +# If you're running a postgres version earlier than 7.1, you will need +# to drop this to 8192. (8k) + +Set($MaxAttachmentSize , 10000000); + +# $TruncateLongAttachments: if this is set to a non-undef value, +# RT will truncate attachments longer than MaxAttachmentLength. + +Set($TruncateLongAttachments , undef); + +# $DropLongAttachments: if this is set to a non-undef value, +# RT will silently drop attachments longer than MaxAttachmentLength. + +Set($DropLongAttachments , undef); + +# If $ParseNewMessageForTicketCcs is true, RT will attempt to divine +# Ticket 'Cc' watchers from the To and Cc lines of incoming messages +# Be forewarned that if you have _any_ addresses which forward mail to +# RT automatically and you enable this option without modifying +# "RTAddressRegexp" below, you will get yourself into a heap of trouble. + +Set($ParseNewMessageForTicketCcs , undef); + +# RTAddressRegexp is used to make sure RT doesn't add itself as a ticket CC if +# the setting above is enabled. + +Set($RTAddressRegexp , '^rt\@example.com$'); + +# RT provides functionality which allows the system to rewrite +# incoming email addresses. In its simplest form, +# you can substitute the value in CanonicalizeEmailAddressReplace +# for the value in CanonicalizeEmailAddressMatch +# (These values are passed to the CanonicalizeEmailAddress subroutine in RT/User.pm) +# By default, that routine performs a s/$Match/$Replace/gi on any address passed to it + +Set($CanonicalizeEmailAddressMatch , 'subdomain.example.com$'); +Set($CanonicalizeEmailAddressReplace , 'example.com'); + +# If $SenderMustExistInExternalDatabase is true, RT will refuse to +# create non-privileged accounts for unknown users if you are using +# the "LookupSenderInExternalDatabase" option. +# Instead, an error message will be mailed and RT will forward the +# message to $RTOwner. +# +# If you are not using $LookupSenderInExternalDatabase, this option +# has no effect. +# +# If you define an AutoRejectRequest template, RT will use this +# template for the rejection message. + +Set($SenderMustExistInExternalDatabase , undef); + +# }}} + +# {{{ Outgoing mail configuration + +# RT is designed such that any mail which already has a ticket-id associated +# with it will get to the right place automatically. + +# $CorrespondAddress and $CommentAddress are the default addresses +# that will be listed in From: and Reply-To: headers of correspondence +# and comment mail tracked by RT, unless overridden by a queue-specific +# address. + +Set($CorrespondAddress , 'RT::CorrespondAddress.not.set'); + +Set($CommentAddress , 'RT::CommentAddress.not.set'); + +#Sendmail Configuration + +# $MailCommand defines which method RT will use to try to send mail +# We know that 'sendmailpipe' works fairly well. +# If 'sendmailpipe' doesn't work well for you, try 'sendmail' +# +# Note that you should remove the '-t' from $SendmailArguments +# if you use 'sendmail rather than 'sendmailpipe' + +Set($MailCommand , 'sendmailpipe'); + +# $SendmailArguments defines what flags to pass to $Sendmail +# assuming you picked 'sendmail' or 'sendmailpipe' as the $MailCommand above. +# If you picked 'sendmailpipe', you MUST add a -t flag to $SendmailArguments + +# These options are good for most sendmail wrappers and workalikes +Set($SendmailArguments , "-oi -t"); + +# These arguments are good for sendmail brand sendmail 8 and newer +#Set($SendmailArguments,"-oi -t -ODeliveryMode=b -OErrorMode=m"); + +# If you selected 'sendmailpipe' above, you MUST specify the path +# to your sendmail binary in $SendmailPath. +# !! If you did not # select 'sendmailpipe' above, this has no effect!! +Set($SendmailPath , "/usr/sbin/sendmail"); + +# By default, RT sets the outgoing mail's "From:" header to +# "SenderName via RT". Setting this option to 0 disables it. + +Set($UseFriendlyFromLine , 1); + +# sprintf() format of the friendly 'From:' header; its arguments +# are SenderName and SenderEmailAddress. +Set($FriendlyFromLineFormat , "\"%s via RT\" <%s>"); + +# RT can optionally set a "Friendly" 'To:' header when sending messages to +# Ccs or AdminCcs (rather than having a blank 'To:' header. + +# This feature DOES NOT WORK WITH SENDMAIL[tm] BRAND SENDMAIL +# If you are using sendmail, rather than postfix, qmail, exim or some other MTA, +# you _must_ disable this option. + +Set($UseFriendlyToLine , 0); + +# sprintf() format of the friendly 'From:' header; its arguments +# are WatcherType and TicketId. +Set($FriendlyToLineFormat, "\"%s of $RT::rtname Ticket #%s\":;"); + +# By default RT doesn't notify the person who performs an update, as they +# already know what they've done. If you'd like to change this behaviour, +# Set $NotifyActor to 1 + +Set($NotifyActor, 0); + + +# }}} + +# {{{ Logging + +# Logging. The default is to log anything except debugging +# information to syslog. Check the Log::Dispatch POD for +# information about how to get things by syslog, mail or anything +# else, get debugging info in the log, etc. + +# It might generally make +# sense to send error and higher by email to some administrator. +# If you do this, be careful that this email isn't sent to this RT instance. + +# the minimum level error that will be logged to the specific device. +# levels from lowest to highest: +# debug info notice warning error critical alert emergency + +# Mail loops will generate a critical log message. +Set($LogToSyslog , 'debug'); +Set($LogToScreen , 'error'); +Set($LogToFile , undef); +Set($LogDir, '@RT_LOG_PATH@'); +Set($LogToFileNamed , "rt.log"); #log to rt.log + +# }}} + +# {{{ Web interface configuration + +# Define the directory name to be used for images in rt web +# documents. + +# If you're putting the web ui somewhere other than at the root of +# your server +# $WebPath requires a leading / but no trailing / + +Set($WebPath , ""); + +# This is the Scheme, server and port for constructing urls to webrt +# $WebBaseURL doesn't need a trailing / + +Set($WebBaseURL , "http://RT::WebBaseURL.not.configured:80"); + +Set($WebURL , $WebBaseURL . $WebPath . "/"); + +# $WebImagesURL points to the base URL where RT can find its images. +# If you're running the FastCGI version of the RT web interface, +# you should make RT's WebRT/html/NoAuth/images directory available on +# a static web server and supply that URL as $WebImagesURL. + +Set($WebImagesURL , $WebURL . "NoAuth/images/"); + +# $RTLogoURL points to the URL of the RT logo displayed in the web UI + +Set($LogoURL , $WebImagesURL . "rt.jpg"); + +# if TrustHTMLAttachments is not defined, we will display them +# as text. This prevents malicious HTML and javascript from being +# sent in a request (although there is probably more to it than that) +Set($TrustHTMLAttachments , undef); + +# If $WebExternalAuth is defined, RT will defer to the environment's +# REMOTE_USER variable. + +Set($WebExternalAuth , undef); + +# If $WebFallbackToInternalAuth is undefined, the user is allowed a chance +# of fallback to the login screen, even if REMOTE_USER failed. + +Set($WebFallbackToInternalAuth , undef); + +# $WebExternalGecos means to match 'gecos' field as the user identity); +# useful with mod_auth_pwcheck and IIS Integrated Windows logon. + +Set($WebExternalGecos , undef); + +# $WebExternalAuto will create users under the same name as REMOTE_USER +# upon login, if it's missing in the Users table. + +Set($WebExternalAuto , undef); + +# $WebSessionClass is the class you wish to use for managing Sessions. +# It defaults to use your SQL database, but if you are using MySQL 3.x and +# plans to use non-ascii Queue names, uncomment and add this line to +# RT_SiteConfig.pm will prevent session corruption. + +# Set($WebSessionClass , 'Apache::Session::File'); + +# }}} + +# {{{ RT UTF-8 Settings + +# An array that contains languages supported by RT's internationalization +# interface. Defaults to all *.po lexicons; set it to qw(en ja) will make +# RT bilingual instead of multilingual, but will save same memory. + +@LexiconLanguages = qw(*) unless (@LexiconLanguages); + +# An array that contains default encodings used to guess which charset +# an attachment uses if not specified. Must be recognized by +# Encode::Guess. + +@EmailInputEncodings = qw(utf-8 iso-8859-1 us-ascii) unless (@EmailInputEncodings); + +# The charset for localized email. Must be recognized by Encode. + +Set($EmailOutputEncoding , 'utf-8'); + +# }}} + +# {{{ RT Date Handling Options (for Time::ParseDate) + +# Set this to 1 if your local date convention looks like "dd/mm/yy" +# instead of "mm/dd/yy". + +Set($DateDayBeforeMonth , 1); + +# Should "Tuesday" default to meaning "Next Tuesday" or "Last Tuesday"? +# Set to 0 for "Next" or 1 for "Last". + +Set($AmbiguousDayInPast , 1); + +# }}} + +1; diff --git a/rt/etc/RT_SiteConfig.pm b/rt/etc/RT_SiteConfig.pm new file mode 100644 index 000000000..0afc6045c --- /dev/null +++ b/rt/etc/RT_SiteConfig.pm @@ -0,0 +1 @@ +1; diff --git a/rt/etc/constraints.mysql b/rt/etc/constraints.mysql new file mode 100644 index 000000000..33a037673 --- /dev/null +++ b/rt/etc/constraints.mysql @@ -0,0 +1,52 @@ +#ALTER TABLE Users ADD FOREIGN KEY (Creator) REFERENCES Users(id); +#ALTER TABLE Users ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE Links ADD FOREIGN KEY (LocalBase) REFERENCES Tickets(id) ; + ALTER TABLE Links ADD FOREIGN KEY (LocalTarget) REFERENCES Tickets(id); + ObjectId integer, # FOREIGN KEY to Users or Groups, depending + ALTER TABLE Tickets ADD FOREIGN KEY (Queue) REFERENCES Queues(id); + ALTER TABLE Tickets ADD FOREIGN KEY (EffectiveId) REFERENCES Tickets(id); + ALTER TABLE Tickets ADD FOREIGN KEY (Owner) REFERENCES Principals(id); + ALTER TABLE Tickets ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE Tickets ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE Transactions ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE Transactions ADD FOREIGN KEY (Ticket) REFERENCES Tickets(id); + ALTER TABLE Transactions ADD FOREIGN KEY (EffectiveTicket) REFERENCES Tickets(id); + ALTER TABLE Attachments ADD FOREIGN KEY (TransactionId) REFERENCES Transactions(id); + ALTER TABLE Attachments ADD FOREIGN KEY (Parent) REFERENCES Attachments(id); + ALTER TABLE Scrips ADD FOREIGN KEY (ScripCondition) REFERENCES ScripConditions(id); + ALTER TABLE Scrips ADD FOREIGN KEY (ScripAction) REFERENCES ScripActions(id); + ALTER TABLE Scrips ADD FOREIGN KEY (Template) REFERENCES Templates(id); + ALTER TABLE Scrips ADD FOREIGN KEY (Queue) REFERENCES Queues(id); + ALTER TABLE Scrips ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE Scrips ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + PrincipalId integer NOT NULL , #ALTER TABLE ADD FOREIGN KEY to principals + DelegatedBy integer NOT NULL default 0, #ALTER TABLE ADD FOREIGN KEY to principals with a userid + DelegatedFrom integer NOT NULL default 0, #ALTER TABLE ADD FOREIGN KEY to ACL + ALTER TABLE ACL ADD FOREIGN KEY (PrincipalId) REFERENCES Principals(id); + ALTER TABLE ACL ADD FOREIGN KEY (DelegatedBy) REFERENCES Principals(id); + ALTER TABLE ACL ADD FOREIGN KEY (DelegatedFrom) REFERENCES ACL(id); + ALTER TABLE GroupMembers ADD FOREIGN KEY (GroupId) REFERENCES Principals(id); + ALTER TABLE GroupMembers ADD FOREIGN KEY (MemberId) REFERENCES Principals(id); + GroupId int, # ALTER TABLE ADD FOREIGN KEY to Principals + MemberId int, # ALTER TABLE ADD FOREIGN KEY to Principals + Via int, #ALTER TABLE ADD FOREIGN KEY to CachedGroupMembers. (may point to $self->id) + ImmediateParentId int, #ALTER TABLE ADD FOREIGN KEY to prinicpals. + ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (ImmediateParentId) REFERENCES Principals(id); + ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (GroupId) REFERENCES Principals(id); + ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (MemberId) REFERENCES Principals(id); + ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (Via) REFERENCES CachedGroupMembers(id); + ALTER TABLE ScripActions ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE ScripActions ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE Templates ADD FOREIGN KEY (Queue) REFERENCES Queues(id); + ALTER TABLE Templates ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE Templates ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE CustomFields ADD FOREIGN KEY (Queue) REFERENCES Queues(id); + ALTER TABLE CustomFields ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE CustomFields ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (Ticket) REFERENCES Ticketss(id); + ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (CustomField) REFERENCES CustomFields(id); + ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE CustomFieldValues ADD FOREIGN KEY (CustomField) REFERENCES CustomFields(id); + ALTER TABLE CustomFieldValues ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE CustomFieldValues ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); diff --git a/rt/etc/initialdata b/rt/etc/initialdata new file mode 100644 index 000000000..62b35ace2 --- /dev/null +++ b/rt/etc/initialdata @@ -0,0 +1,569 @@ +# Initial data for a fresh RT3 Installation. + +@Users = ( + { Name => 'Nobody', + RealName => 'Nobody in particular', + Comments => 'Do not delete or modify this user. It is integral ' + . 'to RT\'s internal data structures', + Privileged => '0', }, + + { Name => 'root', + Gecos => 'root', + RealName => 'Enoch Root', + Password => 'password', + EmailAddress => "root\@localhost", + Comments => 'SuperUser', + Privileged => '1', } ); + +@Groups = ( + { Name => '', + Type => 'Everyone', # loc + Domain => 'SystemInternal', + Instance => '', + Description => 'Pseudogroup for internal use', # loc + }, + { Type => 'Privileged', # loc + Domain => 'SystemInternal', + Instance => '', + Name => '', + Description => 'Pseudogroup for internal use', # loc + }, + { Name => '', + Type => 'Unprivileged', # loc + Domain => 'SystemInternal', + Instance => '', + Description => 'Pseudogroup for internal use', # loc + }, + { Name => '', + Type => 'Owner', # loc + Domain => 'RT::System-Role', + Instance => '', + Description => 'SystemRolegroup for internal use', # loc + }, + { Name => '', + Type => 'Requestor', # loc + Domain => 'RT::System-Role', + Instance => '', + Description => 'SystemRolegroup for internal use', # loc + }, + { Name => '', + Type => 'Cc', # loc + Domain => 'RT::System-Role', + Instance => '', + Description => 'SystemRolegroup for internal use', # loc + }, + { Name => '', + Type => 'AdminCc', # loc + Domain => 'RT::System-Role', + Instance => '', + Description => 'Pseudogroup for internal use', # loc + }, ); + +@Queues = ({ Name => 'General', + Description => 'The default queue', + CorrespondAddress => "", + CommentAddress => "", }, + { Name => '___Approvals', + Description => 'A system-internal queue for the approvals system', + Disabled => 2, } ); + +@ScripActions = ( + + { Name => 'Autoreply To Requestors', # loc + Description => +'Always sends a message to the requestors independent of message sender' , # loc + ExecModule => 'Autoreply', + Argument => 'Requestor' }, + { Name => 'Notify Requestors', # loc + Description => 'Sends a message to the requestors', # loc + ExecModule => 'Notify', + Argument => 'Requestor' }, + { Name => 'Notify Owner as Comment', # loc + Description => 'Sends mail to the owner', # loc + ExecModule => 'NotifyAsComment', + Argument => 'Owner' }, + { Name => 'Notify Owner', # loc + Description => 'Sends mail to the owner', # loc + ExecModule => 'Notify', + Argument => 'Owner' }, + { Name => 'Notify AdminCcs as Comment', # loc + Description => 'Sends mail to the administrative Ccs as a comment', # loc + ExecModule => 'NotifyAsComment', + Argument => 'AdminCc' }, + { Name => 'Notify AdminCcs', # loc + Description => 'Sends mail to the administrative Ccs', # loc + ExecModule => 'Notify', + Argument => 'AdminCc' }, + + { Name => 'Notify Requestors and Ccs as Comment', # loc + Description => 'Send mail to requestors and Ccs as a comment', # loc + ExecModule => 'NotifyAsComment', + Argument => 'Requestor,Cc' }, + + { Name => 'Notify Requestors and Ccs', # loc + Description => 'Send mail to requestors and Ccs', # loc + ExecModule => 'Notify', + Argument => 'Requestor,Cc' }, + + { Name => 'Notify Requestors, Ccs and AdminCcs as Comment', # loc + Description => 'Send mail to all watchers as a "comment"', # loc + ExecModule => 'NotifyAsComment', + Argument => 'All' }, + { Name => 'Notify Requestors, Ccs and AdminCcs', # loc + Description => 'Send mail to all watchers', # loc + ExecModule => 'Notify', + Argument => 'All' }, + { Name => 'Notify Other Recipients as Comment', # loc + Description => 'Sends mail to explicitly listed Ccs and Bccs', # loc + ExecModule => 'NotifyAsComment', + Argument => 'OtherRecipients' }, + { Name => 'Notify Other Recipients', # loc + Description => 'Sends mail to explicitly listed Ccs and Bccs', # loc + ExecModule => 'Notify', + Argument => 'OtherRecipients' }, + { Name => 'User Defined', # loc + Description => 'Perform a user-defined action', # loc + ExecModule => 'UserDefined', }, + { Name => 'Create Tickets', # loc + Description => + 'Create new tickets based on this scrip\'s template', # loc + ExecModule => 'CreateTickets', }, + { Name => 'Open Tickets', + Description => 'Open tickets on correspondence', # loc + ExecModule => 'AutoOpen' }, +); + +@ScripConditions = ( + { Name => 'On Create', # loc + Description => 'When a ticket is created', # loc + ApplicableTransTypes => 'Create', + ExecModule => 'AnyTransaction', }, + + { Name => 'On Transaction', # loc + Description => 'When anything happens', # loc + ApplicableTransTypes => 'Any', + ExecModule => 'AnyTransaction', }, + { + + Name => 'On Correspond', # loc + Description => 'Whenever correspondence comes in', # loc + ApplicableTransTypes => 'Correspond', + ExecModule => 'AnyTransaction', }, + + { + + Name => 'On Comment', # loc + Description => 'Whenever comments come in', # loc + ApplicableTransTypes => 'Comment', + ExecModule => 'AnyTransaction' }, + { + + Name => 'On Status Change', # loc + Description => 'Whenever a ticket\'s status changes', # loc + ApplicableTransTypes => 'Status', + ExecModule => 'AnyTransaction', + + }, + { + + Name => 'On Owner Change', # loc + Description => 'Whenever a ticket\'s owner changes', # loc + ApplicableTransTypes => 'Any', + ExecModule => 'OwnerChange', + + }, + { + + Name => 'On Queue Change', # loc + Description => 'Whenever a ticket\'s queue changes', # loc + ApplicableTransTypes => 'Set', + ExecModule => 'QueueChange', + + }, + { Name => 'On Resolve', # loc + Description => 'Whenever a ticket is resolved', # loc + ApplicableTransTypes => 'Status', + ExecModule => 'StatusChange', + Argument => 'resolved' + + }, + + { Name => 'User Defined', # loc + Description => 'Whenever a user-defined condition occurs', # loc + ApplicableTransTypes => 'Any', + ExecModule => 'UserDefined' + + }, + +); + +@Templates = ( + { Queue => '0', + Name => 'Blank', # loc + Description => 'A blank template', # loc + Content => '', }, + { Queue => '0', + Name => 'Autoreply', # loc + Description => 'Default Autoresponse template', # loc + Content => 'Subject: AutoReply: {$Ticket->Subject} + + +Greetings, + +This message has been automatically generated in response to the +creation of a trouble ticket regarding: + "{$Ticket->Subject()}", +a summary of which appears below. + +There is no need to reply to this message right now. Your ticket has been +assigned an ID of [{$rtname} #{$Ticket->id()}]. + +Please include the string: + + [{$rtname} #{$Ticket->id}] + +in the subject line of all future correspondence about this issue. To do so, +you may reply to this message. + + Thank you, + {$Ticket->QueueObj->CorrespondAddress()} + +------------------------------------------------------------------------- +{$Transaction->Content()} +' + }, + + { Queue => '0', + Name => 'Transaction', # loc + Description => 'Default transaction template', # loc + Content => 'RT-Attach-Message: yes + + +{$Transaction->CreatedAsString}: Request {$Ticket->id} was acted upon. +Transaction: {$Transaction->Description} + Queue: {$Ticket->QueueObj->Name} + Subject: {$Transaction->Subject || $Ticket->Subject || "(No subject given)"} + Owner: {$Ticket->OwnerObj->Name} + Requestors: {$Ticket->RequestorAddresses} + Status: {$Ticket->Status} + Ticket <URL: {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} > + + +{$Transaction->Content()} +' + }, + + { + + Queue => '0', + Name => 'Admin Correspondence', # loc + Description => 'Default admin correspondence template', # loc + Content => 'RT-Attach-Message: yes + + +<URL: {$RT::WebURL}Ticket/Display.html?id={$Ticket->id} > + +{$Transaction->Content()} +' + }, + + { Queue => '0', + Name => 'Correspondence', # loc + Description => 'Default correspondence template', # loc + Content => 'RT-Attach-Message: yes + +{$Transaction->Content()} +' + }, + + { Queue => '0', + Name => 'Admin Comment', # loc + Description => 'Default admin comment template', # loc + Content => +'Subject: [Comment] {my $s=($Transaction->Subject||$Ticket->Subject); $s =~ s/\\[Comment\\]//g; $comment =~ s/^Re//i; $s;} + + +{$RT::WebURL}Ticket/Display.html?id={$Ticket->id} +This is a comment. It is not sent to the Requestor(s): + +{$Transaction->Content()} +' + }, + + { Queue => '0', + Name => 'Status Change', # loc + Description => 'Ticket status changed', # loc + Content => 'Subject: Status Changed to: {$Transaction->NewValue} + + +{$RT::WebURL}Ticket/Display.html?id={$Ticket->id} + +{$Transaction->Content()} +' + }, + + { + + Queue => '0', + Name => 'Resolved', # loc + Description => 'Ticket Resolved', # loc + Content => 'Subject: Ticket Resolved + +According to our records, your request has been resolved. If you have any +further questions or concerns, please respond to this message. +' + }, + { Queue => '___Approvals', + Name => "New Pending Approval", # loc + Description => + "Notify Owners and AdminCcs of new items pending their approval", # loc + Content => 'Subject: New Pending Approval: {$Ticket->Subject} + +Greetings, + +There is a new item pending your approval: "{$Ticket->Subject()}", +a summary of which appears below. + +Please visit {$RT::WebURL}Approvals/Display.html?id={$Ticket->id} +to approve or reject this ticket, or {$RT::WebURL}Approvals/ to +batch-process all your pending approvals. + +------------------------------------------------------------------------- +{$Transaction->Content()} +' + }, + { Queue => '___Approvals', + Name => "Approval Passed", # loc + Description => + "Notify Owner of their ticket has been approved by some approver", # loc + Content => 'Subject: Ticket Rejected: {$Ticket->Subject} + +Greetings, + +Your ticket has been approved by { eval { $Approval->OwnerObj->Name } }. +Other approvals may be pending. +' + }, + { Queue => '___Approvals', + Name => "All Approvals Passed", # loc + Description => + "Notify Owner of their ticket has been approved by all approvers", # loc + Content => 'Subject: Ticket Rejected: {$Ticket->Subject} + +Greetings, + +Your ticket has been approved. Its Owner may now start to act on it. +' + }, + { Queue => '___Approvals', + Name => "Approval Rejected", # loc + Description => + "Notify Owner of their rejected ticket", # loc + Content => 'Subject: Ticket Rejected: {$Ticket->Subject} + +Greetings, + +Your ticket has been rejected by { eval { $Approval->OwnerObj->Name } }. +' + }, +); +# }}} + +@Scrips = ( + { ScripCondition => 'On Correspond', + ScripAction => 'Open Tickets', + Template => 'Blank' }, + { ScripCondition => 'On Create', + ScripAction => 'AutoReply To Requestors', + Template => 'AutoReply' }, + { ScripCondition => 'On Create', + ScripAction => 'Notify AdminCcs', + Template => 'Transaction' }, + { ScripCondition => 'On Correspond', + ScripAction => 'Notify AdminCcs', + Template => 'Admin Correspondence' }, + { ScripCondition => 'On Correspond', + ScripAction => 'Notify Requestors And Ccs', + Template => 'Correspondence' }, + { ScripCondition => 'On Correspond', + ScripAction => 'Notify Other Recipients', + Template => 'Correspondence' }, + { ScripCondition => 'On Comment', + ScripAction => 'Notify AdminCcs As Comment', + Template => 'Admin Comment' }, + { ScripCondition => 'On Comment', + ScripAction => 'Notify Other Recipients As Comment', + Template => 'Correspondence' }, + { ScripCondition => 'On Resolve', + ScripAction => 'Notify Requestors', + Template => 'Resolved' }, + { Description => "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval", # loc + Queue => '___Approvals', + ScripCondition => 'User Defined', + CustomIsApplicableCode => q[ + $self->TicketObj->Type eq 'approval' and + $self->TransactionObj->Field eq 'Status' and + $self->TransactionObj->NewValue eq 'open' and + eval { $T::Approving = ($self->TicketObj->AllDependedOnBy( Type => 'ticket' ))[0] } + ], + ScripAction => 'Notify Owner', + Template => 'New Pending Approval' }, + { Description => "If an approval is rejected, reject the original and delete pending approvals", # loc + Queue => '___Approvals', + ScripCondition => 'On Status Change', + ScripAction => 'User Defined', + CustomPrepareCode => q[ +# ------------------------------------------------------------------- # +return(0) unless ( lc($self->TransactionObj->NewValue) eq "rejected" or + lc($self->TransactionObj->NewValue) eq "deleted" ); + +my $rejected = 0; +my $links = $self->TicketObj->DependedOnBy; +foreach my $link (@{ $links->ItemsArrayRef }) { + my $obj = $link->BaseObj; + if ($obj->QueueObj->IsActiveStatus($obj->Status)) { + if ($obj->Type eq 'ticket') { + $obj->Comment( + Content => $self->loc("Your request was rejected."), + ); + $obj->SetStatus( + Status => 'rejected', + Force => 1, + ); + + $T::Approval = $self->TicketObj; # so we can access it inside templates + $self->{TicketObj} = $obj; # we want the original id in the token line + $rejected = 1; + } + else { + $obj->SetStatus( + Status => 'deleted', + Force => 1, + ); + } + } +} + +$links = $self->TicketObj->DependsOn; +foreach my $link (@{ $links->ItemsArrayRef }) { + my $obj = $link->TargetObj; + if ($obj->QueueObj->IsActiveStatus($obj->Status)) { + $obj->SetStatus( + Status => 'deleted', + Force => 1, + ); + } +} + +# Now magically turn myself into a Requestor Notify object... +require RT::Action::Notify; bless($self, 'RT::Action::Notify'); +$self->{Argument} = 'Requestor'; $self->Prepare; + +return $rejected; +# ------------------------------------------------------------------- # + ], + CustomCommitCode => '"never needed"', + Template => 'Approval Rejected', }, + { Description => "When a ticket has been approved by any approver, add correspondence to the original ticket", # loc + Queue => '___Approvals', + ScripCondition => 'On Resolve', + ScripAction => 'User Defined', + CustomPrepareCode => q[ +# ------------------------------------------------------------------- # +return(0) unless ($self->TicketObj->Type eq 'approval'); + +my $note; +my $t = $self->TicketObj->Transactions; +while (my $o = $t->Next) { + $note .= $o->Content . "\n" if $o->ContentObj + and $o->Content !~ /Default Approval/; +} + +foreach my $obj ($self->TicketObj->AllDependedOnBy( Type => 'ticket' )) { + $obj->Comment( + Content => $self->loc( "Your request has been approved by [_1]. Other approvals may still be pending.", # loc + $self->TransactionObj->CreatorObj->Name, + ) . "\n" . $self->loc( "Approver's notes: [_1]", # loc + $note + ), + ); + $T::Approval = $self->TicketObj; # so we can access it inside templates + $self->{TicketObj} = $obj; # we want the original id in the token line +} + +# Now magically turn myself into a Requestor Notify object... +require RT::Action::Notify; bless($self, 'RT::Action::Notify'); +$self->{Argument} = 'Requestor'; $self->Prepare; + +return 1; +# ------------------------------------------------------------------- # + ], + CustomCommitCode => '"never needed"', + Template => 'Approval Passed' }, + { Description => "When a ticket has been approved by all approvers, add correspondence to the original ticket", # loc + Queue => '___Approvals', + ScripCondition => 'On Resolve', + ScripAction => 'User Defined', + CustomPrepareCode => q[ +# ------------------------------------------------------------------- # +# Find all the tickets that depend on this (that this is approving) + +my $Ticket = $self->TicketObj; +my @TOP = $Ticket->AllDependedOnBy( Type => 'ticket' ); +my $links = $Ticket->DependedOnBy; +my $passed = 0; + +while (my $link = $links->Next) { + my $obj = $link->BaseObj; + next if ($obj->HasUnresolvedDependencies( Type => 'approval' )); + + if ($obj->Type eq 'ticket') { + $obj->Comment( + Content => $self->loc("Your request has been approved."), + ); + $T::Approval = $Ticket; # so we can access it inside templates + $self->{TicketObj} = $obj; # we want the original id in the token line + $passed = 1; + } + elsif ($obj->Type eq 'approval') { + $obj->SetStatus( Status => 'open', Force => 1 ); + } + elsif ($RT::UseCodeTickets and $obj->Type eq 'code') { + my $code = $obj->Transactions->First->Content; + my $rv; + + foreach my $TOP (@TOP) { + local $@; + $rv++ if eval $code; + $RT::Logger->error("Cannot eval code: $@") if $@; + } + + if ($rv or !@TOP) { + $obj->SetStatus( Status => 'resolved', Force => 1,); + } + else { + $obj->SetStatus( Status => 'rejected', Force => 1,); + } + } +} + +# Now magically turn myself into a Requestor Notify object... +require RT::Action::Notify; bless($self, 'RT::Action::Notify'); +$self->{Argument} = 'Requestor'; $self->Prepare; + +return $passed; +# ------------------------------------------------------------------- # + ], + CustomCommitCode => '"never needed"', + Template => 'All Approvals Passed', }, + +); + +@ACL = ( + { UserId => 'Nobody', # - principalId + Right => 'OwnTicket', }, + + { UserId => 'root', # - principalid + Right => 'SuperUser', }, + +); diff --git a/rt/etc/schema.SQLite b/rt/etc/schema.SQLite new file mode 100644 index 000000000..f24bdbdc1 --- /dev/null +++ b/rt/etc/schema.SQLite @@ -0,0 +1,384 @@ +--- {{{ Attachments + +CREATE TABLE Attachments ( + id INTEGER PRIMARY KEY , + TransactionId INTEGER , + Parent integer NULL , + MessageId varchar(160) NULL , + Subject varchar(255) NULL , + Filename varchar(255) NULL , + ContentType varchar(80) NULL , + ContentEncoding varchar(80) NULL , + Content LONGTEXT NULL , + Headers LONGTEXT NULL , + Creator integer NULL , + Created DATETIME NULL + +) ; + +CREATE INDEX Attachments1 ON Attachments (Parent) ; +CREATE INDEX Attachments2 ON Attachments (TransactionId) ; +CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId) ; +--- }}} + +--- {{{ Queues +CREATE TABLE Queues ( + id INTEGER PRIMARY KEY , + Name varchar(200) NOT NULL , + Description varchar(255) NULL , + CorrespondAddress varchar(120) NULL , + CommentAddress varchar(120) NULL , + InitialPriority integer NULL , + FinalPriority integer NULL , + DefaultDueIn integer NULL , + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 + +) ; +CREATE UNIQUE INDEX Queues1 ON Queues (Name) ; + +--- }}} + +--- {{{ Links + +CREATE TABLE Links ( + id INTEGER PRIMARY KEY , + Base varchar(240) NULL , + Target varchar(240) NULL , + Type varchar(20) NOT NULL , + LocalTarget integer NULL , + LocalBase integer NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL , + Creator integer NULL , + Created DATETIME NULL + +) ; +CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type) ; + +--- }}} + +--- {{{ Principals + +CREATE TABLE Principals ( + id INTEGER PRIMARY KEY, + PrincipalType VARCHAR(16) not null, + ObjectId integer, + Disabled int2 NOT NULL DEFAULT 0 + +) ; + +--- }}} + +--- {{{ Groups + +CREATE TABLE Groups ( + id INTEGER , + Name varchar(200) NULL , + Description varchar(255) NULL , + Domain varchar(64), + Type varchar(64), + Instance varchar(64) + +) ; + +CREATE UNIQUE INDEX Groups1 ON Groups (Name,Domain,Type,Instance) ; + +--- }}} + +--- {{{ ScripConditions + +CREATE TABLE ScripConditions ( + id INTEGER PRIMARY KEY , + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + ApplicableTransTypes varchar(60) NULL , + + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + +--- }}} + +--- {{{ Transactions +CREATE TABLE Transactions ( + id INTEGER PRIMARY KEY , + EffectiveTicket integer NULL , + Ticket integer NULL , + TimeTaken integer NULL , + Type varchar(20) NULL , + Field varchar(40) NULL , + OldValue varchar(255) NULL , + NewValue varchar(255) NULL , + Data varchar(100) NULL , + + Creator integer NULL , + Created DATETIME NULL + +) ; +CREATE INDEX Transactions1 ON Transactions (Ticket); +CREATE INDEX Transactions2 ON Transactions (EffectiveTicket); + +--- }}} + +--- {{{ Scrips + +CREATE TABLE Scrips ( + id INTEGER PRIMARY KEY , + Description varchar(255), + ScripCondition integer NULL , + ScripAction integer NULL , + ConditionRules text NULL , + ActionRules text NULL , + CustomIsApplicableCode text NULL , + CustomPrepareCode text NULL , + CustomCommitCode text NULL , + Stage varchar(32) NULL , + Queue integer NULL , + Template integer NULL , + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + +--- }}} + +--- {{{ ACL +CREATE TABLE ACL ( + id INTEGER PRIMARY KEY , + PrincipalType varchar(25) NOT NULL, + + PrincipalId INTEGER, + RightName varchar(25) NOT NULL , + ObjectType varchar(25) NOT NULL , + ObjectId INTEGER default 0, + DelegatedBy integer NOT NULL default 0, + DelegatedFrom integer NOT NULL default 0 + +) ; + + +--- }}} + +--- {{{ GroupMembers + +CREATE TABLE GroupMembers ( + id INTEGER PRIMARY KEY , + GroupId integer NULL, + MemberId integer NULL + +) ; + +--- }}} + +--- {{{ CachedGroupMembers + +create table CachedGroupMembers ( + id integer primary key , + GroupId int, + MemberId int, + Via int, + ImmediateParentId int, + Disabled int2 NOT NULL DEFAULT 0 # if this cached group member is a member of this group by way of a disabled + # group or this group is disabled, this will be set to 1 + # this allows us to not find members of disabled subgroups when listing off + # group members recursively. + # Also, this allows us to have the ACL system elide members of disabled groups + + +) ; + +--- }}} + +--- {{{ Users + +CREATE TABLE Users ( + id INTEGER , + Name varchar(200) NOT NULL , + Password varchar(40) NULL , + Comments blob NULL , + Signature blob NULL , + EmailAddress varchar(120) NULL , + FreeformContactInfo blob NULL , + Organization varchar(200) NULL , + RealName varchar(120) NULL , + NickName varchar(16) NULL , + Lang varchar(16) NULL , + EmailEncoding varchar(16) NULL , + WebEncoding varchar(16) NULL , + ExternalContactInfoId varchar(100) NULL , + ContactInfoSystem varchar(30) NULL , + ExternalAuthId varchar(100) NULL , + AuthSystem varchar(30) NULL , + Gecos varchar(16) NULL , + HomePhone varchar(30) NULL , + WorkPhone varchar(30) NULL , + MobilePhone varchar(30) NULL , + PagerPhone varchar(30) NULL , + Address1 varchar(200) NULL , + Address2 varchar(200) NULL , + City varchar(100) NULL , + State varchar(100) NULL , + Zip varchar(16) NULL , + Country varchar(50) NULL , + Timezone char(50) NULL , + PGPKey text NULL, + + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + + +CREATE UNIQUE INDEX Users1 ON Users (Name) ; +CREATE INDEX Users2 ON Users (Name); +CREATE INDEX Users3 ON Users (id, EmailAddress); +CREATE INDEX Users4 ON Users (EmailAddress); + + +--- }}} + +--- {{{ Tickets + +CREATE TABLE Tickets ( + id INTEGER PRIMARY KEY , + EffectiveId integer NULL , + Queue integer NULL , + Type varchar(16) NULL , + IssueStatement integer NULL , + Resolution integer NULL , + Owner integer NULL , + Subject varchar(200) NULL DEFAULT '[no subject]' , + InitialPriority integer NULL , + FinalPriority integer NULL , + Priority integer NULL , + TimeEstimated integer NULL , + TimeWorked integer NULL , + Status varchar(10) NULL , + TimeLeft integer NULL , + Told DATETIME NULL , + Starts DATETIME NULL , + Started DATETIME NULL , + Due DATETIME NULL , + Resolved DATETIME NULL , + + + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL , + Creator integer NULL , + Created DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 + +) ; + +CREATE INDEX Tickets1 ON Tickets (Queue, Status) ; +CREATE INDEX Tickets2 ON Tickets (Owner) ; +CREATE INDEX Tickets3 ON Tickets (EffectiveId) ; +CREATE INDEX Tickets4 ON Tickets (id, Status) ; +CREATE INDEX Tickets5 ON Tickets (id, EffectiveId) ; + +--- }}} + +--- {{{ ScripActions + +CREATE TABLE ScripActions ( + id INTEGER PRIMARY KEY , + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + +--- }}} + +--- {{{ Templates + +CREATE TABLE Templates ( + id INTEGER PRIMARY KEY , + Queue integer NOT NULL DEFAULT 0 , + Name varchar(200) NOT NULL , + Description varchar(255) NULL , + Type varchar(16) NULL , + Language varchar(16) NULL , + TranslationOf integer NULL , + Content blob NULL , + LastUpdated DATETIME NULL , + LastUpdatedBy integer NULL , + Creator integer NULL , + Created DATETIME NULL + +) ; + +--- }}} + +--- {{{ TicketCustomFieldValues + +CREATE TABLE TicketCustomFieldValues ( + id INTEGER PRIMARY KEY , + Ticket int NOT NULL , + CustomField int NOT NULL , + Content varchar(255) NULL , + + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + +--- }}} + +--- {{{ CustomFields + +CREATE TABLE CustomFields ( + id INTEGER PRIMARY KEY , + Name varchar(200) NULL , + Type varchar(200) NULL , + Queue int NULL , + Description varchar(255) NULL , + SortOrder integer NULL , + + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 + +) ; + +--- }}} + +--- {{{ CustomFieldValues + +CREATE TABLE CustomFieldValues ( + id INTEGER PRIMARY KEY , + CustomField int NOT NULL , + Name varchar(200) NULL , + Description varchar(255) NULL , + SortOrder integer NULL , + + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + +--- }}} diff --git a/rt/etc/upgrade/2.1.71 b/rt/etc/upgrade/2.1.71 new file mode 100644 index 000000000..cb89a3ac3 --- /dev/null +++ b/rt/etc/upgrade/2.1.71 @@ -0,0 +1,211 @@ +@Queues = ( { + Name => '___Approvals', + Description => 'A system-internal queue for the approvals system', + Disabled => 2, + } +); + + + + + +# {{{ Templates +@Templates = ( + { + Queue => '___Approvals', + Name => "New Pending Approval", # loc + Description => "Notify Owners and AdminCcs of new items pending their approval", # loc + Content => 'Subject: New Pending Approval: {$Ticket->Subject} + +Greetings, + +There is a new item pending your approval: "{$Ticket->Subject()}", +a summary of which appears below. + +Please visit {$RT::WebURL}Approvals/Display.html?id={$Ticket->id} +to approve or reject this ticket, or {$RT::WebURL}Approvals/ to +batch-process all your pending approvals. + +------------------------------------------------------------------------- +{$Transaction->Content()} +' + }, +); + +# }}} + +1; + +@ScripActions = ( + { Name => 'Open Tickets', + Description => 'Open tickets on correspondence', + ExecModule => 'AutoOpen' }, + +); + + @Scrips = ( + { ScripCondition => 'On Correspond', + ScripAction => 'Open Tickets', + Template => 'Blank', + Queue => '0' + }, + { ScripCondition => 'On Create', + ScripAction => 'AutoReply To Requestors', + Template => 'AutoReply' }, + { ScripCondition => 'On Create', + ScripAction => 'Notify AdminCcs', + Template => 'Transaction' }, + { ScripCondition => 'On Correspond', + ScripAction => 'Notify AdminCcs', + Template => 'Admin Correspondence' }, + { ScripCondition => 'On Correspond', + ScripAction => 'Notify Requestors And Ccs', + Template => 'Correspondence' }, + { ScripCondition => 'On Correspond', + ScripAction => 'Notify Other Recipients', + Template => 'Correspondence' }, + { ScripCondition => 'On Comment', + ScripAction => 'Notify AdminCcs As Comment', + Template => 'Admin Comment' }, + { ScripCondition => 'On Comment', + ScripAction => 'Notify Other Recipients As Comment', + Template => 'Correspondence' }, + { ScripCondition => 'On Resolve', + ScripAction => 'Notify Requestors', + Template => 'Resolved' }, + + + { + Description => "When an approval ticket is created, notify the Owner and AdminCc of the item awaiting their approval", # loc + Queue => '___Approvals', + ScripCondition => 'On Create', + ScripAction => 'Notify AdminCcs', + Template => 'New Pending Approval' + }, + { + Description => "If an approval is rejected, reject the original and delete pending approvals", # loc + Queue => '___Approvals', + ScripCondition => 'On Status Change', + ScripAction => 'User Defined', + CustomCommitCode => q[ +# ------------------------------------------------------------------- # +return(1) unless ( lc($self->TransactionObj->NewValue) eq "rejected" or + lc($self->TransactionObj->NewValue) eq "deleted" ); + +my $links = $self->TicketObj->DependedOnBy; +foreach my $link (@{ $links->ItemsArrayRef }) { + my $obj = $link->BaseObj; + if ($obj->QueueObj->IsActiveStatus($obj->Status)) { + if ($obj->Type eq 'ticket') { + $obj->Correspond( + Content => $self->loc("Your request was rejected."), + ); + $obj->SetStatus( + Status => 'rejected', + Force => 1, + ); + } + else { + $obj->SetStatus( + Status => 'deleted', + Force => 1, + ); + } + } +} + +$links = $self->TicketObj->DependsOn; +foreach my $link (@{ $links->ItemsArrayRef }) { + my $obj = $link->TargetObj; + if ($obj->QueueObj->IsActiveStatus($obj->Status)) { + $obj->SetStatus( + Status => 'deleted', + Force => 1, + ); + } +} + +return 1; +# ------------------------------------------------------------------- # + ], + CustomPrepareCode => '1', + Template => 'Admin Comment', + }, + { + Description => "When a ticket has been approved by any approver, add correspondence to the original ticket", # loc + Queue => '___Approvals', + ScripCondition => 'On Resolve', + ScripAction => 'User Defined', + CustomPrepareCode => 'return(1);', + CustomCommitCode => q[ +# ------------------------------------------------------------------- # +return(1) unless ($self->TicketObj->Type eq 'approval'); + +foreach my $obj ($self->TicketObj->AllDependedOnBy( Type => 'ticket' )) { + $obj->Correspond( + Content => $self->loc( "Your request has been approved by [_1]. Other approvals may still be pending.", # loc + $self->TransactionObj->CreatorObj->Name, + ) . "\n" . $self->loc( "Approver's notes: [_1]", # loc + $self->TicketObj->Transactions->Last->Content, + ), + _reopen => 0, + ); +} + +return 1; +# ------------------------------------------------------------------- # + ], + Template => 'Admin Comment' + }, + { + Description => "When a ticket has been approved by all approvers, add correspondence to the original ticket", # loc + Queue => '___Approvals', + ScripCondition => 'On Resolve', + ScripAction => 'User Defined', + CustomPrepareCode => 'return(1);', + CustomCommitCode => q[ +# ------------------------------------------------------------------- # +# Find all the tickets that depend on this (that this is approving) + +my $Ticket = $self->TicketObj; +my @TOP = $Ticket->AllDependedOnBy( Type => 'ticket' ); +my $links = $Ticket->DependedOnBy; + +while (my $link = $links->Next) { + my $obj = $link->BaseObj; + next if ($obj->HasUnresolvedDependencies( Type => 'approval' )); + + if ($obj->Type eq 'ticket') { + $obj->Correspond( + Content => $self->loc("Your request has been approved."), + _reopen => 0, + ); + } + elsif ($obj->Type eq 'code') { + my $code = $obj->Transactions->First->Content; + my $rv; + + foreach my $TOP (@TOP) { + local $@; + $rv++ if eval $code; + $RT::Logger->error("Cannot eval code: $@") if $@; + } + + if ($rv or !@TOP) { + $obj->SetStatus( Status => 'resolved', Force => 1,); + } + else { + $obj->SetStatus( Status => 'rejected', Force => 1,); + } + } +} + +return 1; +# ------------------------------------------------------------------- # + ], + Template => 'Admin Comment', + }, +); + +# }}} + |