diff options
Diffstat (limited to 'rt/etc')
50 files changed, 5063 insertions, 0 deletions
diff --git a/rt/etc/RT_Config.pm b/rt/etc/RT_Config.pm new file mode 100644 index 000000000..7f7eadcca --- /dev/null +++ b/rt/etc/RT_Config.pm @@ -0,0 +1,587 @@ +# +# 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 is 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"); + + +# This regexp controls what subject tags RT recognizes as its own. +# If you're not dealing with historical $rtname values, you'll likely +# never have to enable this feature. +# +# Be VERY CAREFUL with it. Note that it overrides $rtname for subject +# token matching and that you should use only "non-capturing" parenthesis +# grouping. For example: +# +# Set($EmailSubjectTagRegex, qr/(?:example.com|example.org)/i ); +# +# and NOT +# +# Set($EmailSubjectTagRegex, qr/(example.com|example.org)/i ); +# +# This setting would make RT behave exactly as it does without the +# setting enabled. +# +# Set($EmailSubjectTagRegex, qr/\Q$rtname\E/i ); + + + +# 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", "Oracle" and "Pg" + +Set($DatabaseType , 'Pg'); + +# 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 , 'freeside'); + +# Password the DatabaseUser should use to access the database +Set($DatabasePassword , ''); + +# The name of the RT's database on your database server +Set($DatabaseName , 'freeside'); + +# 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 $StoreLoops 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 MaxAttachmentSize. + +Set($TruncateLongAttachments , undef); + +# $DropLongAttachments: if this is set to a non-undef value, +# RT will silently drop attachments longer than MaxAttachmentSize. + +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'); + +# set this to true and the create new user page will use the values that you +# enter in the form but use the function CanonicalizeUserInfo in User_Local.pm +Set($CanonicalizeOnCreate , 0); + +# 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_CorrespondAddressNotSet'); + +Set($CommentAddress , 'RT_CommentAddressNotSet'); + +#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"); + +# $SendmailBounceArguments defines what flags to pass to $Sendmail +# assuming RT needs to send an error (ie. bounce). + +Set($SendmailBounceArguments , '-f "<>"'); + +# 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); + +# By default, RT records each message it sends out to its own internal database.# To change this behaviour, set $RecordOutgoingEmail to 0 + +Set($RecordOutgoingEmail, 1); + +# VERP support (http://cr.yp.to/proto/verp.txt) +# uncomment the following two directives to generate envelope senders +# of the form ${VERPPrefix}${originaladdress}@${VERPDomain} +# (i.e. rt-jesse=fsck.com@rt.example.com ) This currently only works +# with sendmail and sendmailppie. +# Set($VERPPrefix, 'rt-'); +# Set($VERPDomain, $RT::Organization); + +# }}} + +# {{{ 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 + +# If true generates stack traces to file log or screen +# never generates traces to syslog + +Set($LogStackTraces , 0); + +# On Solaris or UnixWare, set to ( socket => 'inet' ). Options here +# override any other options RT passes to Log::Dispatch::Syslog. +# Other interesting flags include facility and logopt. (See the +# Log::Dispatch::Syslog documentation for more information.) (Maybe +# ident too, if you have multiple RT installations.) + +@LogToSyslogConf = () unless (@LogToSyslogConf); + +# RT has rudimentary SQL statement logging support if you have +# DBIx-SearchBuilder 1.31_1 or higher; simply set $StatementLog to be +# the level that you wish SQL statements to be logged at. +Set($StatementLog, undef); + +# }}} + +# {{{ Web interface configuration + +# This determines the default stylesheet the RT web interface will use. +# RT ships with two valid values by default: +# +# 3.5-default The totally new, default layout for RT 3.5 +# 3.4-compat A 3.4 compatibility stylesheet to make RT 3.5 look +# (mostly) like 3.4 +# +# This value actually specifies a directory in share/html/NoAuth/css/ +# from which RT will try to load the file main.css (which should +# @import any other files the stylesheet needs). This allows you to +# easily and cleanly create your own stylesheets to apply to RT. + +Set($WebDefaultStylesheet, '3.5-default'); + +# 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, you should set $WebPath to the path you'll be +# serving RT at. +# $WebPath requires a leading / but no trailing /. +# +# In most cases, you should leave $WebPath set to '' (an empty value). + +Set($WebPath , ""); + +# If we're running as a superuser, run on port 80 +# Otherwise, pick a high port for this user. + +Set($WebPort , 80);# + ($< * 7274) % 32766 + ($< && 1024)); + +# This is the Scheme, server and port for constructing urls to webrt +# $WebBaseURL doesn't need a trailing / + +Set($WebBaseURL , "http://localhost:$WebPort"); + +Set($WebURL , $WebBaseURL . $WebPath . "/"); + +# $WebImagesURL points to the base URL where RT can find its images. + +Set($WebImagesURL , $WebPath . "/NoAuth/images/"); + +# $LogoURL points to the URL of the RT logo displayed in the web UI + +Set($LogoURL , $WebImagesURL . "bplogo.gif"); + +# WebNoAuthRegex - What portion of RT's URLspace should not require +# authentication. +Set($WebNoAuthRegex, qr!^/rt(?:/+NoAuth/| + /+REST/\d+\.\d+/NoAuth/)!x ); + +# For message boxes, set the entry box width and what type of wrapping +# to use. +# +# Default width: 72 +Set($MessageBoxWidth , 72); + +# Default wrapping: "HARD" (choices "SOFT", "HARD") +Set($MessageBoxWrap, "HARD"); + +# Support implicit links in WikiText custom fields? A true value +# causes InterCapped or ALLCAPS words in WikiText fields to +# automatically become links to searches for those words. If used on +# RTFM articles, it links to the RTFM article with that name. +Set($WikiImplicitLinks, 0); + +# 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); + +# Should RT redistribute correspondence that it identifies as +# machine generated? A true value will do so; setting this to '0' +# will cause no such messages to be redistributed. +# You can also use 'privileged' (the default), which will redistribute +# only to privileged users. This helps to protect against malformed +# bounces and loops caused by autocreated requestors with bogus addresses. +Set($RedistributeAutoGeneratedMessages, 'privileged'); + +# If PreferRichText is set to a true value, RT will show HTML/Rich text +# messages in preference to their plaintext alternatives. RT "scrubs" the +# html to show only a minimal subset of HTML to avoid possible contamination +# by cross-site-scripting attacks. +Set($PreferRichText, 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'); + + +# By default, RT's session cookie isn't marked as "secure" Some web browsers +# will treat secure cookies more carefully than non-secure ones, being careful +# not to write them to disk, only send them over an SSL secured connection +# and so on. To enable this behaviour, set # $WebSecureCookies to a true value. +# NOTE: You probably don't want to turn this on _unless_ users are only connecting +# via SSL encrypted HTTP connections. + +Set($WebSecureCookies, 0); + + +# By default, RT clears its database cache after every page view. +# This ensures that you've always got the most current information +# when working in a multi-process (mod_perl or FastCGI) Environment +# Setting $WebFlushDbCacheEveryRequest to '0' will turn this off, +# which will speed RT up a bit, at the expense of a tiny bit of data +# accuracy. + +Set($WebFlushDbCacheEveryRequest, '1'); + + +# $MaxInlineBody is the maximum attachment size that we want to see +# inline when viewing a transaction. 13456 is a random sane-sounding +# default. + +Set($MaxInlineBody, 13456); + +# $DefaultSummaryRows is default number of rows displayed in for search +# results on the frontpage. + +Set($DefaultSummaryRows, 10); + +# By default, RT shows newest transactions at the bottom of the ticket +# history page, if you want see them at the top set this to '0'. + +Set($OldestTransactionsFirst, '1'); + +# By default, RT shows images attached to incoming (and outgoing) ticket updates +# inline. Set this variable to 0 if you'd like to disable that behaviour + +Set($ShowTransactionImages, 1); + + +# $HomepageComponents is an arrayref of allowed components on a user's +# customized homepage ("RT at a glance"). + +Set($HomepageComponents, [qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage)]); + +# @MasonParameters is the list of parameters for the constructor of +# HTML::Mason's Apache or CGI Handler. This is normally only useful +# for debugging, eg. profiling individual components with: +# use MasonX::Profiler; # available on CPAN +# @MasonParameters = (preamble => 'my $p = MasonX::Profiler->new($m, $r);'); + +@MasonParameters = () unless (@MasonParameters); + +# $DefaultSearchResultFormat is the default format for RT search results +Set ($DefaultSearchResultFormat, qq{ + '<B><A HREF="$RT::WebPath/Ticket/Display.html?id=__id__">__id__</a></B>/TITLE:#', + '<B><A HREF="$RT::WebPath/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject', + Status, + QueueName, + OwnerName, + Priority, + '__NEWLINE__', + '', + '<small>__Requestors__</small>', + '<small>__CreatedRelative__</small>', + '<small>__ToldRelative__</small>', + '<small>__LastUpdatedRelative__</small>', + '<small>__TimeLeft__</small>'}); + +# If $SuppressInlineTextFiles is set to a true value, then uploaded +# text files (text-type attachments with file names) are prevented +# from being displayed in-line when viewing a ticket's history. + +Set($SuppressInlineTextFiles, undef); + +# If $DontSearchFileAttachments is set to a true value, then uploaded +# files (attachments with file names) are not searched during full-content +# ticket searches. + +Set($DontSearchFileAttachments, undef); + + +# }}} + +# {{{ RT UTF-8 Settings + +# An array that contains languages supported by RT's internationalization +# interface. Defaults to all *.po lexicons; setting it to qw(en ja) will make +# RT bilingual instead of multilingual, but will save some 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); + +# }}} + +# {{{ Miscellaneous RT Settings + +# You can define new statuses and even reorder existing statuses here. +# WARNING. DO NOT DELETE ANY OF THE DEFAULT STATUSES. If you do, RT +# will break horribly. The statuses you add must be no longer than +# 10 characters. + +@ActiveStatus = qw(new open stalled) unless @ActiveStatus; +@InactiveStatus = qw(resolved rejected deleted) unless @InactiveStatus; + +# Backward compatability setting. Add/Delete Link used to record one +# transaction and run one scrip. Set this value to 1 if you want +# only one of the link transactions to have scrips run. +Set($LinkTransactionsRun1Scrip , 0); + +# When this feature is enabled an user need ModifyTicket right on both +# tickets to link them together, otherwise he can have right on any of +# two. +Set($StrictLinkACL, 1); + +# }}} + + +# {{{ Development Mode +# +# RT comes with a "Development mode" setting. +# This setting, as a convenience for developers, turns on +# all sorts of development options that you most likely don't want in +# production: +# +# * Turns off Mason's 'static_source' directive. By default, you can't +# edit RT's web ui components on the fly and have RT magically pick up +# your changes. (It's a big performance hit) +# +# * More to come +# + +Set($DevelMode, '0'); + +# }}} + + +1; diff --git a/rt/etc/RT_Config.pm.in b/rt/etc/RT_Config.pm.in new file mode 100644 index 000000000..cf089fb8d --- /dev/null +++ b/rt/etc/RT_Config.pm.in @@ -0,0 +1,594 @@ +# +# 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 is 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"); + + +# This regexp controls what subject tags RT recognizes as its own. +# If you're not dealing with historical $rtname values, you'll likely +# never have to enable this feature. +# +# Be VERY CAREFUL with it. Note that it overrides $rtname for subject +# token matching and that you should use only "non-capturing" parenthesis +# grouping. For example: +# +# Set($EmailSubjectTagRegex, qr/(?:example.com|example.org)/i ); +# +# and NOT +# +# Set($EmailSubjectTagRegex, qr/(example.com|example.org)/i ); +# +# This setting would make RT behave exactly as it does without the +# setting enabled. +# +# Set($EmailSubjectTagRegex, qr/\Q$rtname\E/i ); + + + +# 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", "Oracle" 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 $StoreLoops 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 MaxAttachmentSize. + +Set($TruncateLongAttachments , undef); + +# $DropLongAttachments: if this is set to a non-undef value, +# RT will silently drop attachments longer than MaxAttachmentSize. + +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'); + +# set this to true and the create new user page will use the values that you +# enter in the form but use the function CanonicalizeUserInfo in User_Local.pm +Set($CanonicalizeOnCreate , 0); + +# 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_CorrespondAddressNotSet'); + +Set($CommentAddress , 'RT_CommentAddressNotSet'); + +#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"); + +# $SendmailBounceArguments defines what flags to pass to $Sendmail +# assuming RT needs to send an error (ie. bounce). + +Set($SendmailBounceArguments , '-f "<>"'); + +# 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); + +# By default, RT records each message it sends out to its own internal database.# To change this behaviour, set $RecordOutgoingEmail to 0 + +Set($RecordOutgoingEmail, 1); + +# VERP support (http://cr.yp.to/proto/verp.txt) +# uncomment the following two directives to generate envelope senders +# of the form ${VERPPrefix}${originaladdress}@${VERPDomain} +# (i.e. rt-jesse=fsck.com@rt.example.com ) This currently only works +# with sendmail and sendmailppie. +# Set($VERPPrefix, 'rt-'); +# Set($VERPDomain, $RT::Organization); + +# }}} + +# {{{ 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 + +# If true generates stack traces to file log or screen +# never generates traces to syslog + +Set($LogStackTraces , 0); + +# On Solaris or UnixWare, set to ( socket => 'inet' ). Options here +# override any other options RT passes to Log::Dispatch::Syslog. +# Other interesting flags include facility and logopt. (See the +# Log::Dispatch::Syslog documentation for more information.) (Maybe +# ident too, if you have multiple RT installations.) + +@LogToSyslogConf = () unless (@LogToSyslogConf); + +# RT has rudimentary SQL statement logging support if you have +# DBIx-SearchBuilder 1.31_1 or higher; simply set $StatementLog to be +# the level that you wish SQL statements to be logged at. +Set($StatementLog, undef); + +# }}} + +# {{{ Web interface configuration + +# This determines the default stylesheet the RT web interface will use. +# RT ships with two valid values by default: +# +# 3.5-default The totally new, default layout for RT 3.5 +# 3.4-compat A 3.4 compatibility stylesheet to make RT 3.5 look +# (mostly) like 3.4 +# +# This value actually specifies a directory in share/html/NoAuth/css/ +# from which RT will try to load the file main.css (which should +# @import any other files the stylesheet needs). This allows you to +# easily and cleanly create your own stylesheets to apply to RT. + +Set($WebDefaultStylesheet, '3.5-default'); + +# 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, you should set $WebPath to the path you'll be +# serving RT at. +# $WebPath requires a leading / but no trailing /. +# +# In most cases, you should leave $WebPath set to '' (an empty value). + +Set($WebPath , ""); + +# If we're running as a superuser, run on port 80 +# Otherwise, pick a high port for this user. + +Set($WebPort , 80);# + ($< * 7274) % 32766 + ($< && 1024)); + +# This is the Scheme, server and port for constructing urls to webrt +# $WebBaseURL doesn't need a trailing / + +Set($WebBaseURL , "http://localhost:$WebPort"); + +Set($WebURL , $WebBaseURL . $WebPath . "/"); + +# $WebImagesURL points to the base URL where RT can find its images. + +Set($WebImagesURL , $WebPath . "/NoAuth/images/"); + +# $LogoURL points to the URL of the RT logo displayed in the web UI + +Set($LogoURL , $WebImagesURL . "bplogo.gif"); + +# WebNoAuthRegex - What portion of RT's URLspace should not require +# authentication. +Set($WebNoAuthRegex, qr!^/rt(?:/+NoAuth/| + /+REST/\d+\.\d+/NoAuth/)!x ); + +# For message boxes, set the entry box width and what type of wrapping +# to use. +# +# Default width: 72 +Set($MessageBoxWidth , 72); + +# Default wrapping: "HARD" (choices "SOFT", "HARD") +Set($MessageBoxWrap, "HARD"); + +# Support implicit links in WikiText custom fields? A true value +# causes InterCapped or ALLCAPS words in WikiText fields to +# automatically become links to searches for those words. If used on +# RTFM articles, it links to the RTFM article with that name. +Set($WikiImplicitLinks, 0); + +# 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); + +# Should RT redistribute correspondence that it identifies as +# machine generated? A true value will do so; setting this to '0' +# will cause no such messages to be redistributed. +# You can also use 'privileged' (the default), which will redistribute +# only to privileged users. This helps to protect against malformed +# bounces and loops caused by autocreated requestors with bogus addresses. +Set($RedistributeAutoGeneratedMessages, 'privileged'); + +# If PreferRichText is set to a true value, RT will show HTML/Rich text +# messages in preference to their plaintext alternatives. RT "scrubs" the +# html to show only a minimal subset of HTML to avoid possible contamination +# by cross-site-scripting attacks. +Set($PreferRichText, 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'); + + +# By default, RT's session cookie isn't marked as "secure" Some web browsers +# will treat secure cookies more carefully than non-secure ones, being careful +# not to write them to disk, only send them over an SSL secured connection +# and so on. To enable this behaviour, set # $WebSecureCookies to a true value. +# NOTE: You probably don't want to turn this on _unless_ users are only connecting +# via SSL encrypted HTTP connections. + +Set($WebSecureCookies, 0); + + +# By default, RT clears its database cache after every page view. +# This ensures that you've always got the most current information +# when working in a multi-process (mod_perl or FastCGI) Environment +# Setting $WebFlushDbCacheEveryRequest to '0' will turn this off, +# which will speed RT up a bit, at the expense of a tiny bit of data +# accuracy. + +Set($WebFlushDbCacheEveryRequest, '1'); + + +# $MaxInlineBody is the maximum attachment size that we want to see +# inline when viewing a transaction. 13456 is a random sane-sounding +# default. + +Set($MaxInlineBody, 13456); + +# $DefaultSummaryRows is default number of rows displayed in for search +# results on the frontpage. + +Set($DefaultSummaryRows, 10); + +# By default, RT shows newest transactions at the bottom of the ticket +# history page, if you want see them at the top set this to '0'. + +Set($OldestTransactionsFirst, '1'); + +# By default, RT shows images attached to incoming (and outgoing) ticket updates +# inline. Set this variable to 0 if you'd like to disable that behaviour + +Set($ShowTransactionImages, 1); + + +# $HomepageComponents is an arrayref of allowed components on a user's +# customized homepage ("RT at a glance"). + +Set($HomepageComponents, [qw(QuickCreate Quicksearch MyAdminQueues MySupportQueues MyReminders RefreshHomepage)]); + +# @MasonParameters is the list of parameters for the constructor of +# HTML::Mason's Apache or CGI Handler. This is normally only useful +# for debugging, eg. profiling individual components with: +# use MasonX::Profiler; # available on CPAN +# @MasonParameters = (preamble => 'my $p = MasonX::Profiler->new($m, $r);'); + +@MasonParameters = () unless (@MasonParameters); + +# $DefaultSearchResultFormat is the default format for RT search results +Set ($DefaultSearchResultFormat, qq{ + '<B><A HREF="$RT::WebPath/Ticket/Display.html?id=__id__">__id__</a></B>/TITLE:#', + '<B><A HREF="$RT::WebPath/Ticket/Display.html?id=__id__">__Subject__</a></B>/TITLE:Subject', + Status, + QueueName, + OwnerName, + Priority, + '__NEWLINE__', + '', + '<small>__Requestors__</small>', + '<small>__CreatedRelative__</small>', + '<small>__ToldRelative__</small>', + '<small>__LastUpdatedRelative__</small>', + '<small>__TimeLeft__</small>'}); + +# If $SuppressInlineTextFiles is set to a true value, then uploaded +# text files (text-type attachments with file names) are prevented +# from being displayed in-line when viewing a ticket's history. + +Set($SuppressInlineTextFiles, undef); + +# If $DontSearchFileAttachments is set to a true value, then uploaded +# files (attachments with file names) are not searched during full-content +# ticket searches. + +Set($DontSearchFileAttachments, undef); + +# The GD module (which RT uses for graphs) uses a builtin font that doesn't +# have full Unicode support. You can use a particular TrueType font by setting +# $ChartFont to the absolute path of that font. Your GD library must have +# support for TrueType fonts to use this option. + +Set($ChartFont, undef); + + +# }}} + +# {{{ RT UTF-8 Settings + +# An array that contains languages supported by RT's internationalization +# interface. Defaults to all *.po lexicons; setting it to qw(en ja) will make +# RT bilingual instead of multilingual, but will save some 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); + +# }}} + +# {{{ Miscellaneous RT Settings + +# You can define new statuses and even reorder existing statuses here. +# WARNING. DO NOT DELETE ANY OF THE DEFAULT STATUSES. If you do, RT +# will break horribly. The statuses you add must be no longer than +# 10 characters. + +@ActiveStatus = qw(new open stalled) unless @ActiveStatus; +@InactiveStatus = qw(resolved rejected deleted) unless @InactiveStatus; + +# Backward compatability setting. Add/Delete Link used to record one +# transaction and run one scrip. Set this value to 1 if you want +# only one of the link transactions to have scrips run. +Set($LinkTransactionsRun1Scrip , 0); + +# When this feature is enabled an user need ModifyTicket right on both +# tickets to link them together, otherwise he can have right on any of +# two. +Set($StrictLinkACL, 1); + +# }}} + + +# {{{ Development Mode +# +# RT comes with a "Development mode" setting. +# This setting, as a convenience for developers, turns on +# all sorts of development options that you most likely don't want in +# production: +# +# * Turns off Mason's 'static_source' directive. By default, you can't +# edit RT's web ui components on the fly and have RT magically pick up +# your changes. (It's a big performance hit) +# +# * More to come +# + +Set($DevelMode, '@RT_DEVEL_MODE@'); + +# }}} + + +1; diff --git a/rt/etc/RT_SiteConfig.pm b/rt/etc/RT_SiteConfig.pm new file mode 100644 index 000000000..c3d6a66ce --- /dev/null +++ b/rt/etc/RT_SiteConfig.pm @@ -0,0 +1,52 @@ +# Any configuration directives you include here will override +# RT's default configuration file, RT_Config.pm +# +# To include a directive here, just copy the equivalent statement +# from RT_Config.pm and change the value. We've included a single +# sample value below. +# +# This file is actually a perl module, so you can include valid +# perl code, as well. +# +# The converse is also true, if this file isn't valid perl, you're +# going to run into trouble. To check your SiteConfig file, use +# this comamnd: +# +# perl -c /path/to/your/etc/RT_SiteConfig.pm + +#Set( $rtname, 'example.com'); + +# These settings should have been inserted by the initial Freeside install. +# Sometimes you may want to change domain, timezone, or freeside::URL later, +# everything else should probably stay untouched. + +$RT::rtname = '%%%RT_DOMAIN%%%'; +$RT::Organization = '%%%RT_DOMAIN%%%'; + +$RT::Timezone = '%%%RT_TIMEZONE%%%'; + +$RT::WebExternalAuth = 1; +$RT::WebFallbackToInternal = 1; #no +$RT::WebExternalAuto = 1; + +$RT::URI::freeside::IntegrationType = 'Internal'; +$RT::URI::freeside::URL = '%%%FREESIDE_URL%%%'; + +$RT::URI::freeside::URL =~ m(^(https?://[^/]+)(/.*)$)i; +$RT::WebBaseURL = $1; +$RT::WebPath = "$2/rt"; + +Set($DatabaseHost , ''); + +# These settings are user-editable. + +#old, RT 3.4 style (deprecated, useless): +#$RT::MyTicketsLength = 10; +#NEW, RT 3.6 style (uncomment to use): +#Set($DefaultSummaryRows, 10); + +$RT::QuickCreateLong = 0; #set to true to cause quick ticket creation to + #redirect to the "long" ticket creation screen + #instead of just creating a ticket with the subject. + +1; diff --git a/rt/etc/acl.Informix b/rt/etc/acl.Informix new file mode 100644 index 000000000..bca0408dd --- /dev/null +++ b/rt/etc/acl.Informix @@ -0,0 +1,5 @@ +sub acl { +return ( +"GRANT RESOURCE TO ${RT::DatabaseUser};"); +} +1; diff --git a/rt/etc/acl.Oracle b/rt/etc/acl.Oracle new file mode 100644 index 000000000..ac29215c2 --- /dev/null +++ b/rt/etc/acl.Oracle @@ -0,0 +1,10 @@ +sub acl { +return ( +"CREATE USER ${RT::DatabaseUser} identified by ${RT::DatabasePassword} ". +"default tablespace USERS " . +"temporary tablespace TEMP " . +"quota unlimited on USERS" , +"grant connect, resource to ${RT::DatabaseUser}" +); +} +1; diff --git a/rt/etc/acl.Pg b/rt/etc/acl.Pg new file mode 100755 index 000000000..fb625592d --- /dev/null +++ b/rt/etc/acl.Pg @@ -0,0 +1,67 @@ +sub acl { + my $dbh = shift; + + my @acls; + + my @tables = qw ( + + attachments_id_seq + Attachments + Attributes + attributes_id_seq + queues_id_seq + Queues + links_id_seq + Links + principals_id_seq + Principals + groups_id_seq + Groups + scripconditions_id_seq + ScripConditions + transactions_id_seq + Transactions + scrips_id_seq + Scrips + acl_id_seq + ACL + groupmembers_id_seq + GroupMembers + cachedgroupmembers_id_seq + CachedGroupMembers + users_id_seq + Users + tickets_id_seq + Tickets + scripactions_id_seq + ScripActions + templates_id_seq + Templates + objectcustomfieldvalues_id_s + ObjectCustomFieldValues + customfields_id_seq + CustomFields + objectcustomfields_id_s + ObjectCustomFields + customfieldvalues_id_seq + CustomFieldValues + sessions + ); + + # if there's already an rt_user, drop it. + my @row = + $dbh->selectrow_array( "select usename from pg_user where usename = '" . $RT::DatabaseUser."'" ); + if ( $row[0] ) { + push @acls, "drop user ${RT::DatabaseUser};",; + } + + push @acls, "create user ${RT::DatabaseUser} with password '${RT::DatabasePassword}' NOCREATEDB NOCREATEUSER;"; + foreach my $table (@tables) { + push @acls, + "GRANT SELECT, INSERT, UPDATE, DELETE ON $table to " + . $RT::DatabaseUser . ";"; + + } + return (@acls); +} +1; diff --git a/rt/etc/acl.Sybase b/rt/etc/acl.Sybase new file mode 100644 index 000000000..6192b4ebe --- /dev/null +++ b/rt/etc/acl.Sybase @@ -0,0 +1,6 @@ +sub acl { +return ( +"SP_ADDLOGIN ${RT::DatabaseUser}, ${RT::DatabasePassword}, ${RT::DatabaseName} ", +); +} +1; diff --git a/rt/etc/acl.mysql b/rt/etc/acl.mysql new file mode 100755 index 000000000..621ef121c --- /dev/null +++ b/rt/etc/acl.mysql @@ -0,0 +1,9 @@ +sub acl { +return () if !$RT::DatabaseUser or $RT::DatabaseUser eq 'root'; +return ( +"USE mysql;", +"DELETE FROM user WHERE user = '${RT::DatabaseUser}';", +"DELETE FROM db where db = '${RT::DatabaseName}';", +"GRANT SELECT,INSERT,CREATE,INDEX,UPDATE,DELETE ON ${RT::DatabaseName}.* TO ${RT::DatabaseUser}\@'${RT::DatabaseRTHost}' IDENTIFIED BY '${RT::DatabasePassword}';"); +} +1; diff --git a/rt/etc/constraints.mysql b/rt/etc/constraints.mysql new file mode 100644 index 000000000..355d2c5e5 --- /dev/null +++ b/rt/etc/constraints.mysql @@ -0,0 +1,85 @@ + + ALTER TABLE Links ADD INDEX(LocalBase); + ALTER TABLE Links ADD FOREIGN KEY (LocalBase) REFERENCES Tickets(id); + ALTER TABLE Links ADD INDEX(LocalTarget); + ALTER TABLE Links ADD FOREIGN KEY (LocalTarget) REFERENCES Tickets(id); + ALTER TABLE Tickets ADD INDEX(Queue); + ALTER TABLE Tickets ADD FOREIGN KEY (Queue) REFERENCES Queues(id); + ALTER TABLE Tickets ADD INDEX(EffectiveId); + ALTER TABLE Tickets ADD FOREIGN KEY (EffectiveId) REFERENCES Tickets(id); + ALTER TABLE Tickets ADD INDEX(Owner); + ALTER TABLE Tickets ADD FOREIGN KEY (Owner) REFERENCES Principals(id); + ALTER TABLE Tickets ADD INDEX(Creator); + ALTER TABLE Tickets ADD INDEX(LastUpdatedBy); + ALTER TABLE Tickets ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE Tickets ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE Transactions ADD INDEX(Creator); + ALTER TABLE Transactions ADD INDEX (Ticket) ; + ALTER TABLE Transactions ADD INDEX (EffectiveTicket) ; + 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 INDEX (TransactionId) ; + ALTER TABLE Attachments ADD INDEX (Parent) ; + ALTER TABLE Attachments ADD FOREIGN KEY (TransactionId) REFERENCES Transactions(id); + ALTER TABLE Attachments ADD FOREIGN KEY (Parent) REFERENCES Attachments(id); + ALTER TABLE Scrips ADD INDEX (ScripCondition) ; + ALTER TABLE Scrips ADD INDEX (ScripAction) ; + ALTER TABLE Scrips ADD INDEX (Template) ; + ALTER TABLE Scrips ADD INDEX (Queue) ; + ALTER TABLE Scrips ADD INDEX (Creator) ; + ALTER TABLE Scrips ADD INDEX (LastUpdatedBy) ; + 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); + ALTER TABLE ACL ADD INDEX (PrincipalId) ; + ALTER TABLE ACL ADD INDEX (DelegatedBy) ; + ALTER TABLE ACL ADD INDEX (DelegatedFrom) ; + 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 INDEX (MemberId); + ALTER TABLE GroupMembers ADD INDEX (GroupId); + ALTER TABLE GroupMembers ADD FOREIGN KEY (GroupId) REFERENCES Groups(id); + ALTER TABLE GroupMembers ADD FOREIGN KEY (MemberId) REFERENCES Principals(id); + ALTER TABLE CachedGroupMembers ADD INDEX (ImmediateParentId) ; + ALTER TABLE CachedGroupMembers ADD INDEX (GroupId) ; + ALTER TABLE CachedGroupMembers ADD INDEX (MemberId) ; + ALTER TABLE CachedGroupMembers ADD INDEX (Via) ; + 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 INDEX(Creator); + ALTER TABLE ScripActions ADD INDEX(LastUpdatedBy); + ALTER TABLE ScripActions ADD FOREIGN KEY (Creator) REFERENCES Users(id); + ALTER TABLE ScripActions ADD FOREIGN KEY (LastUpdatedBy) REFERENCES Users(id); + ALTER TABLE Templates ADD INDEX(Queue); + ALTER TABLE Templates ADD INDEX(Creator); + ALTER TABLE Templates ADD INDEX(LastUpdatedBy); + 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 INDEX(Queue); + ALTER TABLE CustomFields ADD INDEX(Creator); + ALTER TABLE CustomFields ADD INDEX(LastUpdatedBy); + 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 INDEX(Ticket); + ALTER TABLE TicketCustomFieldValues ADD INDEX(CustomField); + ALTER TABLE TicketCustomFieldValues ADD INDEX(Creator); + ALTER TABLE TicketCustomFieldValues ADD INDEX(LastUpdatedBy); + ALTER TABLE TicketCustomFieldValues ADD FOREIGN KEY (Ticket) REFERENCES Tickets(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 INDEX(CustomField); + ALTER TABLE CustomFieldValues ADD INDEX(Creator); + ALTER TABLE CustomFieldValues ADD INDEX(LastUpdatedBy); + 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/drop.Informix b/rt/etc/drop.Informix new file mode 100644 index 000000000..ce7cc0181 --- /dev/null +++ b/rt/etc/drop.Informix @@ -0,0 +1,19 @@ +DROP TABLE ACL; +DROP TABLE ATTACHMENTS; +DROP TABLE CACHEDGROUPMEMBERS; +DROP TABLE CUSTOMFIELDS; +DROP TABLE CUSTOMFIELDVALUES; +DROP TABLE GROUPMEMBERS; +DROP TABLE GROUPS; +DROP TABLE LINKS; +DROP TABLE PRINCIPALS; +DROP TABLE QUEUES; +DROP TABLE SCRIPACTIONS; +DROP TABLE SCRIPCONDITIONS; +DROP TABLE SCRIPS; +DROP TABLE SESSIONS; +DROP TABLE TEMPLATES; +DROP TABLE TICKETCUSTOMFIELDVALUES; +DROP TABLE TICKETS; +DROP TABLE TRANSACTIONS; +DROP TABLE USERS; diff --git a/rt/etc/drop.Oracle b/rt/etc/drop.Oracle new file mode 100644 index 000000000..475e984e1 --- /dev/null +++ b/rt/etc/drop.Oracle @@ -0,0 +1,41 @@ +DROP TABLE ACL; +DROP TABLE ATTACHMENTS; +DROP TABLE ATTRIBUTES; +DROP TABLE CACHEDGROUPMEMBERS; +DROP TABLE CUSTOMFIELDS; +DROP TABLE CUSTOMFIELDVALUES; +DROP TABLE GROUPMEMBERS; +DROP TABLE GROUPS; +DROP TABLE LINKS; +DROP TABLE PRINCIPALS; +DROP TABLE QUEUES; +DROP TABLE SCRIPACTIONS; +DROP TABLE SCRIPCONDITIONS; +DROP TABLE SCRIPS; +DROP TABLE SESSIONS; +DROP TABLE TEMPLATES; +DROP TABLE OBJECTCUSTOMFIELDS; +DROP TABLE OBJECTCUSTOMFIELDVALUES; +DROP TABLE TICKETS; +DROP TABLE TRANSACTIONS; +DROP TABLE USERS; +DROP SEQUENCE ACL_seq; +DROP SEQUENCE ATTACHMENTS_seq; +DROP SEQUENCE ATTRIBUTES_seq; +DROP SEQUENCE CACHEDGROUPMEMBERS_seq; +DROP SEQUENCE CUSTOMFIELDS_seq; +DROP SEQUENCE CUSTOMFIELDVALUES_seq; +DROP SEQUENCE GROUPMEMBERS_seq; +DROP SEQUENCE GROUPS_seq; +DROP SEQUENCE LINKS_seq; +DROP SEQUENCE PRINCIPALS_seq; +DROP SEQUENCE QUEUES_seq; +DROP SEQUENCE SCRIPACTIONS_seq; +DROP SEQUENCE SCRIPCONDITIONS_seq; +DROP SEQUENCE SCRIPS_seq; +DROP SEQUENCE TEMPLATES_seq; +DROP SEQUENCE OBJECTCUSTOMFIELDVALUES_seq; +DROP SEQUENCE OBJECTCUSTOMFIELDS_seq; +DROP SEQUENCE TICKETS_seq; +DROP SEQUENCE TRANSACTIONS_seq; +DROP SEQUENCE USERS_seq; diff --git a/rt/etc/initialdata b/rt/etc/initialdata new file mode 100644 index 000000000..54fa9d195 --- /dev/null +++ b/rt/etc/initialdata @@ -0,0 +1,625 @@ +# 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 Ccs as Comment', # loc + Description => 'Sends mail to the Ccs as a comment', # loc + ExecModule => 'NotifyAsComment', + Argument => 'Cc' }, + { Name => 'Notify Ccs', # loc + Description => 'Sends mail to the Ccs', # loc + ExecModule => 'Notify', + Argument => 'Cc' }, + { 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', # loc + 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 Priority Change', # loc + Description => 'Whenever a ticket\'s priority changes', # loc + ApplicableTransTypes => 'Set', + ExecModule => 'PriorityChange', + }, + { + + 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: Resolved: {$Ticket->Subject} + +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 Approved: {$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 Approved: {$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 Owner Change', + ScripAction => 'Notify Owner', + Template => 'Transaction' }, + { 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 0; # ignore $passed; +# ------------------------------------------------------------------- # + ], + CustomCommitCode => '"never needed"', + Template => 'All Approvals Passed', }, + +); + +@ACL = ( + { UserId => 'Nobody', # - principalId + Right => 'OwnTicket', }, + + { UserId => 'root', # - principalid + Right => 'SuperUser', }, + +); + +# Predefined searches + +@Attributes = ( + { Name => 'Search - My Tickets', + Description => '[_1] highest priority tickets I own', # loc + Content => + { Format => "'<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__id__</a>/TITLE:#', '<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__Subject__</a>/TITLE:Subject', Priority, QueueName, ExtendedStatus", + Query => " Owner = '__CurrentUser__' AND ( Status = 'new' OR Status = 'open')", + OrderBy => 'Priority', + Order => 'DESC' }, + }, + { Name => 'Search - Unowned Tickets', + Description => '[_1] newest unowned tickets', # loc + Content => +# 'Take' #loc + { Format => "'<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__id__</a>/TITLE:#', '<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__Subject__</a>/TITLE:Subject', QueueName, ExtendedStatus, CreatedRelative, '<A HREF=\"__WebPath__/Ticket/Display.html?Action=Take&id=__id__\">__loc(Take)__</a>/TITLE: ' ", + Query => " Owner = 'Nobody' AND ( Status = 'new' OR Status = 'open')", + OrderBy => 'Created', + Order => 'DESC' }, + }, + { Name => 'HomepageSettings', + Description => 'HomepageSettings', + Content => + { 'body' => # loc + [ { type => 'system', name => 'My Tickets' }, + { type => 'system', name => 'Unowned Tickets' }, + { type => 'component', name => 'QuickCreate'}, + ], + 'summary' => # loc + [ + { type => 'component', name => 'MyReminders' }, + { type => 'component', name => 'Quicksearch' }, + { type => 'component', name => 'RefreshHomepage' }, + ] + }, +} +); diff --git a/rt/etc/rt.spec b/rt/etc/rt.spec new file mode 100644 index 000000000..14200c1f3 --- /dev/null +++ b/rt/etc/rt.spec @@ -0,0 +1,137 @@ +Summary: rt Request Tracker + +Name: rt +Version: 2.0.9pre5 +Release: 1 +Group: Applications/Web +Packager: Jesse Vincent <jesse@bestpractical.com> +Vendor: http://www.fsck.com/projects/rt +Requires: perl +Requires: mod_perl > 1.22 +Requires: perl-DBI >= 1.18 +Requires: perl-DBIx-DataSource >= 0.02 +Requires: perl-DBIx-SearchBuilder >= 0.47 +Requires: perl-HTML-Parser +Requires: perl-MLDBM +Requires: perl-libnet +Requires: perl-CGI.pm >= 2.78 +Requires: perl-Params-Validate >= 0.02 +Requires: perl-HTML-Mason >= 0.896 +Requires: perl-libapreq +Requires: perl-Apache-Session >= 1.53 +Requires: perl-MIME-tools >= 5.411 +Requires: perl-MailTools >= 1.20 +Requires: perl-Getopt-Long >= 2.24 +Requires: perl-Tie-IxHash +Requires: perl-TimeDate +Requires: perl-Time-HiRes +Requires: perl-Text-Wrapper +Requires: perl-Text-Template +Requires: perl-File-Spec >= 0.8 +Requires: perl-FreezeThaw +Requires: perl-Storable +Requires: perl-File-Temp +Requires: perl-Log-Dispatch >= 1.6 + +Source: http://www.fsck.com/pub/rt/release/%{name}.tar.gz + +Copyright: GPL +BuildRoot: /var/tmp/rt-root + +%description +RT is an industrial-grade ticketing system. It lets a group +of people intelligently and efficiently manage requests +submitted by a community of users. RT is used by systems +administrators, customer support staffs, NOCs, developers +and even marketing departments at over a thousand sites +around the world. + +%prep +groupadd rt || true +%setup -q -n %{name} + +%build + +%install + +if [ x$RPM_BUILD_ROOT != x ]; then +rm -rf $RPM_BUILD_ROOT +fi + +# +# Perform all the non-site specfic steps whilst building the package +# +make dirs libs-install html-install bin-install DESTDIR=$RPM_BUILD_ROOT +# +# fixperms needs these, so make fake empty files +touch $RPM_BUILD_ROOT/opt/rt2/etc/insertdata $RPM_BUILD_ROOT/opt/rt2/etc/config.pm +make fixperms insert-install WEB_USER=www DESTDIR=$RPM_BUILD_ROOT + +# +# Copy in the files needed again after install +# +mkdir -p $RPM_BUILD_ROOT/opt/rt2/postinstall/bin +cp -rp Makefile etc tools $RPM_BUILD_ROOT/opt/rt2/postinstall +cp -rp bin/initacls.* $RPM_BUILD_ROOT/opt/rt2/postinstall/bin + +# logging in /var/log/rt2 +mkdir -p $RPM_BUILD_ROOT/var/log/rt2 +chown www $RPM_BUILD_ROOT/var/log/rt2 +chgrp rt $RPM_BUILD_ROOT/var/log/rt2 +chmod ug=rwx,o= $RPM_BUILD_ROOT/var/log/rt2 + +%clean +if [ x$RPM_BUILD_ROOT != x ]; then +rm -rf $RPM_BUILD_ROOT +fi + +# +# A new rt groups is required +# +%pre +groupadd rt || true + +# +# Show the user the site specific steps required after install +# +%post +cat <<EOF +----------------------------------------------------------------------- +rt2 installation is complete. Now create the rt2 database by running: +----------------------------------------------------------------------- + +# cd /opt/rt2/postinstall +# make config-replace initialize.mysql insert RT_LOG_PATH=/var/log/rt2 DB_RT_PASS=new_rt_user_password + +Choose your own new_rt_user_password. You will need the mysql root password. +You can try Pg or Oracle instead of mysql - untested. + +Review and configure your site specific details in /opt/rt2/etc/config.pm +EOF + +%preun + +%files +%dir /opt/rt2 +/opt/rt2/bin +/opt/rt2/WebRT +/opt/rt2/lib +/opt/rt2/local +/opt/rt2/man +/opt/rt2/postinstall +%dir /opt/rt2/etc +/opt/rt2/etc/insertdata +%config /opt/rt2/etc/config.pm +%dir /var/log/rt2 + +%changelog +* Mon Sep 24 2001 Jesse Vincent <jesse@bestpractical.com> + Switch to rt DESTDIR support +* Fri Sep 14 2001 Cris Bailiff <c.bailiff@devsecure.com> + Fix permissions on created /var/log/rt2 and roll in 2.0.7 +* Tue Sep 4 2001 Cris Bailiff <c.bailiff@devsecure.com> +- created initial spec file +* Tue Sep 4 2001 Cris Bailiff <c.bailiff@devsecure.com> +- created initial spec file +* Tue Sep 4 2001 Cris Bailiff <c.bailiff@devsecure.com> +- created initial spec file diff --git a/rt/etc/schema.Informix b/rt/etc/schema.Informix new file mode 100644 index 000000000..6a4e5334e --- /dev/null +++ b/rt/etc/schema.Informix @@ -0,0 +1,364 @@ +-- This schema was adopted from the oracle schema by +-- Andre Koppel. +-- Version 0.2 Date 2003.10.21 +-- The work is still in progress + +CREATE TABLE Attachments ( + id SERIAL, + TransactionId INTEGER NOT NULL, + Parent INTEGER DEFAULT 0 NOT NULL, + MessageId VARCHAR(160), + Subject VARCHAR(255), + Filename VARCHAR(255), + ContentType VARCHAR(80), + ContentEncoding VARCHAR(80), + Content BYTE, + Headers BYTE, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); +CREATE INDEX Attachments1 ON Attachments (Parent); +CREATE INDEX Attachments2 ON Attachments (TransactionId); +CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId); + + +CREATE TABLE Queues ( + id SERIAL, + Name VARCHAR(200) DEFAULT '' NOT NULL, + Description VARCHAR(255) DEFAULT NULL, + CorrespondAddress VARCHAR(120) DEFAULT NULL, + CommentAddress VARCHAR(120) DEFAULT NULL, + InitialPriority INTEGER DEFAULT 0 NOT NULL, + FinalPriority INTEGER DEFAULT 0 NOT NULL, + DefaultDueIn INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + Disabled INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); +CREATE UNIQUE INDEX Queues1 ON Queues (Name); +CREATE INDEX Queues2 ON Queues (Disabled); + + +CREATE TABLE Links ( + id SERIAL, + Base VARCHAR(240) DEFAULT NULL, + Target VARCHAR(240) DEFAULT NULL, + Type VARCHAR(20) DEFAULT '' NOT NULL, + LocalTarget INTEGER DEFAULT 0 NOT NULL, + LocalBase INTEGER DEFAULT 0 NOT NULL, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); +-- CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type); +CREATE INDEX Links2 ON Links (Base, Type); +CREATE INDEX Links3 ON Links (Target, Type); +CREATE INDEX Links4 ON Links(Type,LocalBase); + + +CREATE TABLE Principals ( + id SERIAL, + PrincipalType VARCHAR(16) DEFAULT '' NOT NULL, + ObjectId INTEGER DEFAULT 0, + Disabled INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); +CREATE INDEX Principals2 ON Principals (ObjectId); + + +CREATE TABLE Groups ( + id SERIAL, + Name VARCHAR(200) DEFAULT NULL, + Description VARCHAR(255) DEFAULT NULL, + Domain VARCHAR(64) DEFAULT '', + Type VARCHAR(64) DEFAULT '', + Instance INTEGER DEFAULT 0 NOT NULL, +-- Instance VARCHAR(64) DEFAULT '' NOT NULL, + PRIMARY KEY (id) +); +CREATE INDEX Groups1 ON Groups (Domain, Instance, Type, id); +CREATE INDEX Groups2 ON Groups (Type, Instance, Domain); + + +CREATE TABLE ScripConditions ( + id SERIAL, + Name VARCHAR(200), + Description VARCHAR(255), + ExecModule VARCHAR(60), + Argument VARCHAR(255), + ApplicableTransTypes VARCHAR(60), + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + + +CREATE TABLE Transactions ( + id SERIAL, + ObjectType VARCHAR(255), + ObjectId INTEGER DEFAULT 0 NOT NULL, + TimeTaken INTEGER DEFAULT 0 NOT NULL, + Type VARCHAR(20), + Field VARCHAR(40), + OldValue VARCHAR(255), + NewValue VARCHAR(255), + ReferenceType VARCHAR(255), + OldReference INTEGER DEFAULT 0, + NewReference INTEGER DEFAULT 0, + Data VARCHAR(255), + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + + +CREATE TABLE Scrips ( + id SERIAL, + Description VARCHAR(255) DEFAULT '', + ScripCondition INTEGER DEFAULT 0 NOT NULL, + ScripAction INTEGER DEFAULT 0 NOT NULL, + ConditionRules BYTE, + ActionRules BYTE, + CustomIsApplicableCode BYTE, + CustomPrepareCode BYTE, + CustomCommitCode BYTE, + Stage VARCHAR(32), + Queue INTEGER DEFAULT 0 NOT NULL, + Template INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + + +CREATE TABLE ACL ( + id SERIAL, + PrincipalType VARCHAR(25) NOT NULL, + PrincipalId INTEGER NOT NULL, + RightName VARCHAR(25) NOT NULL, + ObjectType VARCHAR(25) NOT NULL, + ObjectId INTEGER DEFAULT 0 NOT NULL, + DelegatedBy INTEGER DEFAULT 0 NOT NULL, + DelegatedFrom INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); +CREATE INDEX ACL1 ON ACL(RightName, ObjectType, ObjectId, PrincipalType, PrincipalId); + + +CREATE TABLE GroupMembers ( + id SERIAL, + GroupId INTEGER DEFAULT 0 NOT NULL, + MemberId INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); +CREATE UNIQUE INDEX GroupMembers1 ON GroupMembers (GroupId, MemberId); + + +CREATE TABLE CachedGroupMembers ( + id SERIAL, + GroupId INTEGER DEFAULT 0, + MemberId INTEGER DEFAULT 0, + Via INTEGER DEFAULT 0, + ImmediateParentId INTEGER DEFAULT 0, + Disabled INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); +CREATE INDEX DisGrouMem ON CachedGroupMembers (GroupId, MemberId, Disabled); +CREATE INDEX GrouMem ON CachedGroupMembers (GroupId, MemberId); + + +CREATE TABLE Users ( + id SERIAL, + Name VARCHAR(200) NOT NULL, + Password VARCHAR(40), + Comments BYTE, + Signature BYTE, + EmailAddress VARCHAR(120), + FreeFormContactInfo BYTE, + Organization VARCHAR(200), + RealName VARCHAR(120), + NickName VARCHAR(16), + Lang VARCHAR(16), + EmailEncoding VARCHAR(16), + WebEncoding VARCHAR(16), + ExternalContactInfoId VARCHAR(100), + ContactInfoSystem VARCHAR(30), + ExternalAuthId VARCHAR(100), + AuthSystem VARCHAR(30), + Gecos VARCHAR(16), + HomePhone VARCHAR(30), + WorkPhone VARCHAR(30), + MobilePhone VARCHAR(30), + PagerPhone VARCHAR(30), + Address1 VARCHAR(200), + Address2 VARCHAR(200), + City VARCHAR(100), + State VARCHAR(100), + Zip VARCHAR(16), + Country VARCHAR(50), + Timezone VARCHAR(50), + PGPKey BYTE, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); +-- 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); + + +CREATE TABLE Tickets ( + id SERIAL, + EffectiveId INTEGER DEFAULT 0 NOT NULL, + Queue INTEGER DEFAULT 0 NOT NULL, + Type VARCHAR(16), + IssueStatement INTEGER DEFAULT 0 NOT NULL, + Resolution INTEGER DEFAULT 0 NOT NULL, + Owner INTEGER DEFAULT 0 NOT NULL, + Subject VARCHAR(200) DEFAULT '[no subject]', + InitialPriority INTEGER DEFAULT 0 NOT NULL, + FinalPriority INTEGER DEFAULT 0 NOT NULL, + Priority INTEGER DEFAULT 0 NOT NULL, + TimeEstimated INTEGER DEFAULT 0 NOT NULL, + TimeWorked INTEGER DEFAULT 0 NOT NULL, + Status VARCHAR(10), + TimeLeft INTEGER DEFAULT 0 NOT NULL, + Told DATETIME YEAR TO SECOND, + Starts DATETIME YEAR TO SECOND, + Started DATETIME YEAR TO SECOND, + Due DATETIME YEAR TO SECOND, + Resolved DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + Disabled INTEGER DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); +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); +CREATE INDEX Tickets6 ON Tickets (EffectiveId, Type); + + +CREATE TABLE ScripActions ( + id SERIAL, + Name VARCHAR(200), + Description VARCHAR(255), + ExecModule VARCHAR(60), + Argument VARCHAR(255), + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + + +CREATE TABLE Templates ( + id SERIAL, + Queue INTEGER DEFAULT 0 NOT NULL, + Name VARCHAR(200) NOT NULL, + Description VARCHAR(255), + Type VARCHAR(16), + Language VARCHAR(16), + TranslationOf INTEGER DEFAULT 0 NOT NULL, + Content BYTE, + LastUpdated DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + + +CREATE TABLE TicketCustomFieldValues ( + id SERIAL, + Ticket INTEGER NOT NULL, + CustomField INTEGER NOT NULL, + Content VARCHAR(255), + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + +CREATE INDEX TicketCustomFieldValues1 ON TicketCustomFieldValues (CustomField,Ticket,Content); +CREATE INDEX TicketCustomFieldValues2 ON TicketCustomFieldValues (CustomField,Ticket); + +CREATE TABLE CustomFields ( + id SERIAL, + Name VARCHAR(200), + Type VARCHAR(200), + MaxValues INTEGER DEFAULT 0 NOT NULL, + Pattern VARCHAR(255), + LookupType VARCHAR(255), + Description VARCHAR(255), + SortOrder INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + Disabled SMALLINT DEFAULT 0 NOT NULL, + PRIMARY KEY (id) +); + + +CREATE TABLE CustomFieldValues ( + id SERIAL, + CustomField INTEGER NOT NULL, + Name VARCHAR(200), + Description VARCHAR(255), + SortOrder INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + +CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); + +CREATE TABLE Attributes ( + id SERIAL, + Name VARCHAR(255) DEFAULT '' NOT NULL, + Description VARCHAR(255) DEFAULT NULL, + Content BYTE, + ContentType VARCHAR(16), + ObjectType VARCHAR(25) NOT NULL, + ObjectId INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + + +CREATE TABLE sessions ( + id VARCHAR(32) NOT NULL, + a_session BYTE, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + diff --git a/rt/etc/schema.Pg b/rt/etc/schema.Pg new file mode 100755 index 000000000..2d45a946a --- /dev/null +++ b/rt/etc/schema.Pg @@ -0,0 +1,636 @@ +------------------------------------------------------------------ +-- My2Pg 1.23 translated dump +-- +------------------------------------------------------------------ + + + +-- +-- Sequences for table ATTACHMENTS +-- + +CREATE SEQUENCE attachments_id_seq; + +-- {{{ Attachments + +CREATE TABLE Attachments ( + id INTEGER DEFAULT nextval('attachments_id_seq'), + TransactionId integer NOT NULL , + Parent integer NOT NULL DEFAULT 0 , + MessageId varchar(160) NULL , + Subject varchar(255) NULL , + Filename varchar(255) NULL , + ContentType varchar(80) NULL , + ContentEncoding varchar(80) NULL , + Content text NULL , + Headers text NULL , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +CREATE INDEX Attachments1 ON Attachments (Parent) ; +CREATE INDEX Attachments2 ON Attachments (TransactionId) ; +CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId) ; +-- }}} + +-- {{{ Queues + + +-- +-- Sequences for table QUEUES +-- + +CREATE SEQUENCE queues_id_seq; + +CREATE TABLE Queues ( + id INTEGER DEFAULT nextval('queues_id_seq'), + Name varchar(200) NOT NULL , + Description varchar(255) NULL , + CorrespondAddress varchar(120) NULL , + CommentAddress varchar(120) NULL , + InitialPriority integer NOT NULL DEFAULT 0 , + FinalPriority integer NOT NULL DEFAULT 0 , + DefaultDueIn integer NOT NULL DEFAULT 0 , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + Disabled integer NOT NULL DEFAULT 0 , + PRIMARY KEY (id) + +); +CREATE UNIQUE INDEX Queues1 ON Queues (Name) ; + +-- }}} + +-- {{{ Links + + + +-- +-- Sequences for table LINKS +-- + +CREATE SEQUENCE links_id_seq; + +CREATE TABLE Links ( + id INTEGER DEFAULT nextval('links_id_seq'), + Base varchar(240) NULL , + Target varchar(240) NULL , + Type varchar(20) NOT NULL , + LocalTarget integer NOT NULL DEFAULT 0 , + LocalBase integer NOT NULL DEFAULT 0 , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + PRIMARY KEY (id) + +); +CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type) ; +CREATE INDEX Links4 ON Links(Type,LocalBase); + +-- }}} + +-- {{{ Principals + + + +-- +-- Sequences for table PRINCIPALS +-- + +CREATE SEQUENCE principals_id_seq; + +CREATE TABLE Principals ( + id INTEGER DEFAULT nextval('principals_id_seq') not null, + PrincipalType VARCHAR(16) not null, + ObjectId integer, + Disabled integer NOT NULL DEFAULT 0 , + PRIMARY KEY (id) + +); + +CREATE INDEX Principals2 ON Principals (ObjectId); + + +-- }}} + +-- {{{ Groups + + + +-- +-- Sequences for table GROUPS +-- + +CREATE SEQUENCE groups_id_seq; + +CREATE TABLE Groups ( + id INTEGER DEFAULT nextval('groups_id_seq'), + Name varchar(200) NULL , + Description varchar(255) NULL , + Domain varchar(64), + Type varchar(64), + Instance integer, + PRIMARY KEY (id) + +); +CREATE UNIQUE INDEX Groups1 ON Groups (Domain,Instance,Type,id, Name); +CREATE INDEX Groups2 On Groups (Type, Instance, Domain); + + +-- }}} + +-- {{{ ScripConditions + + + +-- +-- Sequences for table SCRIPCONDITIONS +-- + +CREATE SEQUENCE scripconditions_id_seq; + +CREATE TABLE ScripConditions ( + id INTEGER DEFAULT nextval('scripconditions_id_seq'), + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + ApplicableTransTypes varchar(60) NULL , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ Transactions + + +-- +-- Sequences for table TRANSACTIONS +-- + +CREATE SEQUENCE transactions_id_seq; + +CREATE TABLE Transactions ( + id INTEGER DEFAULT nextval('transactions_id_seq'), + ObjectType varchar(255) NOT NULL , + ObjectId integer NOT NULL DEFAULT 0 , + TimeTaken integer NOT NULL DEFAULT 0 , + Type varchar(20) NULL , + Field varchar(40) NULL , + OldValue varchar(255) NULL , + NewValue varchar(255) NULL , + ReferenceType varchar(255) NULL, + OldReference integer NULL , + NewReference integer NULL , + Data varchar(255) NULL , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + PRIMARY KEY (id) + +); +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + +-- }}} + +-- {{{ Scrips + + + +-- +-- Sequences for table SCRIPS +-- + +CREATE SEQUENCE scrips_id_seq; + +CREATE TABLE Scrips ( + id INTEGER DEFAULT nextval('scrips_id_seq'), + Description varchar(255), + ScripCondition integer NOT NULL DEFAULT 0 , + ScripAction integer NOT NULL DEFAULT 0 , + ConditionRules text NULL , + ActionRules text NULL , + CustomIsApplicableCode text NULL , + CustomPrepareCode text NULL , + CustomCommitCode text NULL , + Stage varchar(32) NULL , + Queue integer NOT NULL DEFAULT 0 , + Template integer NOT NULL DEFAULT 0 , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ ACL + + +-- +-- Sequences for table ACL +-- + +CREATE SEQUENCE acl_id_seq; + +CREATE TABLE ACL ( + id INTEGER DEFAULT nextval('acl_id_seq'), + PrincipalType varchar(25) NOT NULL, + + PrincipalId integer NOT NULL , + RightName varchar(25) NOT NULL , + ObjectType varchar(25) NOT NULL , + ObjectId integer NOT NULL DEFAULT 0, + DelegatedBy integer NOT NULL DEFAULT 0, + DelegatedFrom integer NOT NULL DEFAULT 0, + PRIMARY KEY (id) + +); + +CREATE INDEX ACL1 on ACL(RightName, ObjectType, ObjectId,PrincipalType,PrincipalId); + + +-- }}} + +-- {{{ GroupMembers + + + +-- +-- Sequences for table GROUPMEMBERS +-- + +CREATE SEQUENCE groupmembers_id_seq; + +CREATE TABLE GroupMembers ( + id INTEGER DEFAULT nextval('groupmembers_id_seq'), + GroupId integer NOT NULL DEFAULT 0, + MemberId integer NOT NULL DEFAULT 0, + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ GroupMembersCache + + + +-- +-- Sequences for table CACHEDGROUPMEMBERS +-- + +CREATE SEQUENCE cachedgroupmembers_id_seq; + +CREATE TABLE CachedGroupMembers ( + id int DEFAULT nextval('cachedgroupmembers_id_seq'), + GroupId int, + MemberId int, + Via int, + ImmediateParentId int, + Disabled integer NOT NULL DEFAULT 0 , + PRIMARY KEY (id) + +); + +CREATE INDEX CachedGroupMembers2 on CachedGroupMembers (MemberId); +CREATE INDEX CachedGroupMembers3 on CachedGroupMembers (GroupId); +CREATE INDEX DisGrouMem on CachedGroupMembers (GroupId,MemberId,Disabled); + +-- }}} + +-- {{{ Users + + + +-- +-- Sequences for table USERS +-- + +CREATE SEQUENCE users_id_seq; + +CREATE TABLE Users ( + id INTEGER DEFAULT nextval('users_id_seq'), + Name varchar(200) NOT NULL , + Password varchar(40) NULL , + Comments text NULL , + Signature text NULL , + EmailAddress varchar(120) NULL , + FreeformContactInfo text 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 varchar(50) NULL , + PGPKey text NULL, + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + + +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 + + + +-- +-- Sequences for table TICKETS +-- + +CREATE SEQUENCE tickets_id_seq; + +CREATE TABLE Tickets ( + id INTEGER DEFAULT nextval('tickets_id_seq'), + EffectiveId integer NOT NULL DEFAULT 0 , + Queue integer NOT NULL DEFAULT 0 , + Type varchar(16) NULL , + IssueStatement integer NOT NULL DEFAULT 0 , + Resolution integer NOT NULL DEFAULT 0 , + Owner integer NOT NULL DEFAULT 0 , + Subject varchar(200) NULL DEFAULT '[no subject]' , + InitialPriority integer NOT NULL DEFAULT 0 , + FinalPriority integer NOT NULL DEFAULT 0 , + Priority integer NOT NULL DEFAULT 0 , + TimeEstimated integer NOT NULL DEFAULT 0 , + TimeWorked integer NOT NULL DEFAULT 0 , + Status varchar(10) NULL , + TimeLeft integer NOT NULL DEFAULT 0 , + Told TIMESTAMP NULL , + Starts TIMESTAMP NULL , + Started TIMESTAMP NULL , + Due TIMESTAMP NULL , + Resolved TIMESTAMP NULL , + + + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + Disabled integer NOT NULL DEFAULT 0 , + PRIMARY KEY (id) + +); + +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 + + + +-- +-- Sequences for table SCRIPACTIONS +-- + +CREATE SEQUENCE scripactions_id_seq; + +CREATE TABLE ScripActions ( + id INTEGER DEFAULT nextval('scripactions_id_seq'), + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ Templates + + + +-- +-- Sequences for table TEMPLATES +-- + +CREATE SEQUENCE templates_id_seq; + +CREATE TABLE Templates ( + id INTEGER DEFAULT nextval('templates_id_seq'), + 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 NOT NULL DEFAULT 0 , + Content text NULL , + LastUpdated TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ ObjectCustomFieldValues + + + +-- +-- Sequences for table TICKETCUSTOMFIELDVALUES +-- + +CREATE SEQUENCE objectcustomfieldvalues_id_s; + +CREATE TABLE ObjectCustomFieldValues ( + id INTEGER DEFAULT nextval('objectcustomfieldvalues_id_s'), + CustomField int NOT NULL , + ObjectType varchar(255) NULL , + ObjectId int NOT NULL , + SortOrder integer NOT NULL DEFAULT 0 , + + Content varchar(255) NULL , + LargeContent text NULL, + ContentType varchar(80) NULL, + ContentEncoding varchar(80) NULL , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + Disabled integer NOT NULL DEFAULT 0 , + PRIMARY KEY (id) + +); + +CREATE INDEX ObjectCustomFieldValues1 ON ObjectCustomFieldValues (CustomField,ObjectType,ObjectId,Content); +CREATE INDEX ObjectCustomFieldValues2 ON ObjectCustomFieldValues (CustomField,ObjectType,ObjectId); + +-- }}} + +-- {{{ CustomFields + + + +-- +-- Sequences for table CUSTOMFIELDS +-- + +CREATE SEQUENCE customfields_id_seq; + +CREATE TABLE CustomFields ( + id INTEGER DEFAULT nextval('customfields_id_seq'), + Name varchar(200) NULL , + Type varchar(200) NULL , + MaxValues integer NOT NULL DEFAULT 0 , + Repeated integer NOT NULL DEFAULT 0 , + Pattern varchar(255) NULL , + LookupType varchar(255) NOT NULL , + Description varchar(255) NULL , + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + Disabled integer NOT NULL DEFAULT 0 , + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ ObjectCustomFields + +CREATE SEQUENCE objectcustomfields_id_s; + +CREATE TABLE ObjectCustomFields ( + id INTEGER DEFAULT nextval('objectcustomfields_id_s'), + CustomField integer NOT NULL, + ObjectId integer NOT NULL, + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +-- }}} + +-- {{{ CustomFieldValues + + + +-- +-- Sequences for table CUSTOMFIELDVALUES +-- + +CREATE SEQUENCE customfieldvalues_id_seq; + +CREATE TABLE CustomFieldValues ( + id INTEGER DEFAULT nextval('customfieldvalues_id_seq'), + CustomField int NOT NULL , + Name varchar(200) NULL , + Description varchar(255) NULL , + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); + +-- }}} + + +-- {{{ Attributes + +CREATE SEQUENCE attributes_id_seq; + +CREATE TABLE Attributes ( + id INTEGER DEFAULT nextval('attributes_id_seq'), + Name varchar(255) NOT NULL , + Description varchar(255) NULL , + Content text, + ContentType varchar(16), + ObjectType varchar(64), + ObjectId integer, + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +-- }}} + +-- {{{ Sessions + +-- sessions is used by Apache::Session to keep sessions in the database. +-- We should have a reaper script somewhere. + +CREATE TABLE sessions ( + id char(32) NOT NULL, + a_session bytea, + LastUpdated TIMESTAMP not null default current_timestamp, + PRIMARY KEY (id) + +); + +-- }}} + diff --git a/rt/etc/schema.SQLite b/rt/etc/schema.SQLite new file mode 100644 index 000000000..8791bb47e --- /dev/null +++ b/rt/etc/schema.SQLite @@ -0,0 +1,442 @@ +--- {{{ 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) ; +CREATE INDEX Links4 ON Links(Type,LocalBase); + +--- }}} + +--- {{{ 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 integer + +) ; + +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 , + ObjectType varchar(255) NULL , + ObjectId integer NULL , + TimeTaken integer NULL , + Type varchar(20) NULL , + Field varchar(40) NULL , + OldValue varchar(255) NULL , + NewValue varchar(255) NULL , + ReferenceType varchar(255) NULL , + OldReference integer NULL , + NewReference integer NULL , + Data varchar(255) NULL , + + Creator integer NULL , + Created DATETIME NULL + +) ; +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + +--- }}} + +--- {{{ 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 + +) ; + +--- }}} + + + +# {{{ ObjectCustomFieldValues + +CREATE TABLE ObjectCustomFieldValues ( + id INTEGER NOT NULL , + CustomField int NOT NULL , + ObjectType varchar(255) NOT NULL, # Final target of the Object + ObjectId int NOT NULL , # New -- Replaces Ticket + SortOrder integer NOT NULL DEFAULT 0 , + + Content varchar(255) NULL , + LargeContent LONGTEXT NULL, # New -- to hold 255+ strings + ContentType varchar(80) NULL, # New -- only text/* gets searched + ContentEncoding varchar(80) NULL , # New -- for binary Content + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 , + PRIMARY KEY (id) +) ; + +CREATE INDEX ObjectCustomFieldValues1 ON ObjectCustomFieldValues (Content); +CREATE INDEX ObjectCustomFieldValues2 ON ObjectCustomFieldValues (CustomField,ObjectType,ObjectId); + +# }}} + +# {{{ CustomFields + +CREATE TABLE CustomFields ( + id INTEGER NOT NULL , + Name varchar(200) NULL , + Type varchar(200) NULL , # Changed -- 'Single' and 'Multiple' is moved out + MaxValues integer, # New -- was 'Single'(1) and 'Multiple'(0) + Pattern varchar(255) NULL , # New -- Must validate against this + Repeated int2 NOT NULL DEFAULT 0 , # New -- repeated table entry + Description varchar(255) NULL , + SortOrder integer NOT NULL DEFAULT 0 , + LookupType varchar(255) NOT NULL, + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 , + PRIMARY KEY (id) +) ; + +# }}} + +# {{{ ObjectCustomFields + +CREATE TABLE ObjectCustomFields ( + id INTEGER NOT NULL , + CustomField int NOT NULL , + ObjectId integer NOT NULL, + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +# }}} + +# {{{ CustomFieldValues + +CREATE TABLE CustomFieldValues ( + id INTEGER NOT NULL , + CustomField int NOT NULL , + Name varchar(200) NULL , + Description varchar(255) NULL , + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); + +# }}} + +--- {{{ Attributes +CREATE TABLE Attributes ( + id INTEGER PRIMARY KEY , + Name varchar(255) NOT NULL , + Description varchar(255) NULL , + Content LONGTEXT NULL , + ContentType varchar(16), + ObjectType varchar(25) NOT NULL , + ObjectId INTEGER default 0, + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +--- }}} + diff --git a/rt/etc/schema.Sybase b/rt/etc/schema.Sybase new file mode 100644 index 000000000..67a411d13 --- /dev/null +++ b/rt/etc/schema.Sybase @@ -0,0 +1,444 @@ +# {{{ Attachments + +CREATE TABLE rt3.Attachments ( + id numeric(38,0) identity, + TransactionId integer NOT NULL , + Parent integer NOT NULL , + MessageId varchar(160) NULL , + Subject varchar(255) NULL , + Filename varchar(255) NULL , + ContentType varchar(80) NULL , + ContentEncoding varchar(80) NULL , + Content TEXT NULL , + Headers TEXT NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX Attachments1 ON Attachments (Parent) ; +CREATE INDEX Attachments2 ON Attachments (TransactionId) ; +CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId) ; +# }}} + +# {{{ Queues +CREATE TABLE rt3.Queues ( + id numeric(38,0) identity, + Name varchar(200) NOT NULL , + Description varchar(255) NULL , + CorrespondAddress varchar(120) NULL , + CommentAddress varchar(120) NULL , + InitialPriority integer NOT NULL , + FinalPriority integer NOT NULL , + DefaultDueIn integer NOT NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + Disabled numeric(1) NOT NULL , + PRIMARY KEY (id) +) ; +CREATE UNIQUE INDEX Queues1 ON Queues (Name) ; +CREATE INDEX Queues2 ON Queues (Disabled) ; + +# }}} + +# {{{ Links + +CREATE TABLE rt3.Links ( + id numeric(38,0) identity, + Base varchar(240) NULL , + Target varchar(240) NULL , + Type varchar(20) NOT NULL , + LocalTarget integer NOT NULL , + LocalBase integer NOT NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + PRIMARY KEY (id) +) ; + +CREATE UNIQUE INDEX Links1 ON Links (Base, Target, Type) ; +CREATE INDEX Links2 ON Links (Base, Type) ; +CREATE INDEX Links3 ON Links (Target, Type) ; +CREATE INDEX Links4 ON Links(Type,LocalBase); + +# }}} + +# {{{ Principals + +CREATE TABLE rt3.Principals ( + id numeric(38,0) identity, + PrincipalType VARCHAR(16) not null, + ObjectId integer, Disabled numeric(1) NOT NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX Principals2 ON Principals (ObjectId); + +# }}} + +# {{{ Groups + +CREATE TABLE rt3.Groups ( + id numeric(38,0) identity, + Name varchar(200) NULL , + Description varchar(255) NULL , + Domain varchar(64), + Type varchar(64), + Instance integer, + PRIMARY KEY (id) +) ; + +CREATE INDEX Groups1 ON Groups (Domain,Instance,Type,id); +CREATE INDEX Groups2 On Groups (Type, Instance, Domain); + +# }}} + +# {{{ ScripConditions + +CREATE TABLE rt3.ScripConditions ( + id numeric(38,0) identity, + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + ApplicableTransTypes varchar(60) NULL , + + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +# }}} + +# {{{ Transactions +CREATE TABLE rt3.Transactions ( + id numeric(38,0) identity, + EffectiveTicket integer NOT NULL , + Ticket integer NOT NULL , + TimeTaken integer NOT NULL , + Type varchar(20) NULL , + Field varchar(40) NULL , + OldValue varchar(255) NULL , + NewValue varchar(255) NULL , + Data varchar(255) NULL , + + Creator integer NOT NULL , + Created DATETIME NULL , + PRIMARY KEY (id) +) ; +CREATE INDEX Transactions1 ON Transactions (Ticket); +CREATE INDEX Transactions2 ON Transactions (EffectiveTicket); + +# }}} + +# {{{ Scrips + +CREATE TABLE rt3.Scrips ( + id numeric(38,0) identity, + Description varchar(255), + ScripCondition integer NOT NULL , + ScripAction integer NOT NULL , + ConditionRules text NULL , + ActionRules text NULL , + CustomIsApplicableCode text NULL , + CustomPrepareCode text NULL , + CustomCommitCode text NULL , + Stage varchar(32) NULL , + Queue integer NOT NULL , + Template integer NOT NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +# }}} + +# {{{ ACL +CREATE TABLE rt3.ACL ( + id numeric(38,0) identity, + PrincipalType varchar(25) NOT NULL, #"User" "Group", "Owner", "Cc" "AdminCc", "Requestor", "Requestor" + + PrincipalId integer NOT NULL , #Foreign key to principals + RightName varchar(25) NOT NULL , + ObjectType varchar(25) NOT NULL , + ObjectId integer NOT NULL , + DelegatedBy integer NOT NULL , #foreign key to principals with a userid + DelegatedFrom integer NOT NULL , #foreign key to ACL + PRIMARY KEY (id) +) ; + +CREATE INDEX ACL1 on ACL(RightName, ObjectType, ObjectId,PrincipalType,PrincipalId); + +# }}} + +# {{{ GroupMembers + +CREATE TABLE rt3.GroupMembers ( + id numeric(38,0) identity, + GroupId integer NOT NULL , + MemberId integer NOT NULL , #Foreign key to Principals + PRIMARY KEY (id) +) ; +CREATE UNIQUE INDEX GroupMembers1 on GroupMembers (GroupId, MemberId); + + +# }}} + +# {{{ GroupMembersCache + +CREATE TABLE rt3.CachedGroupMembers ( + id numeric(38,0) identity, + GroupId int, # foreign key to Principals + MemberId int, # foreign key to Principals + Via int, #foreign key to CachedGroupMembers. (may point to $self->id) + ImmediateParentId int, #foreign key to prinicpals. + # this points to the group that the member is + # a member of, for ease of deletes. + Disabled numeric(1) NOT NULL , # 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 + PRIMARY KEY (id) +) ; + +CREATE INDEX DisGrouMem on CachedGroupMembers (GroupId,MemberId,Disabled); +CREATE INDEX GrouMem on CachedGroupMembers (GroupId,MemberId); + +# }}} + +# {{{ Users + +CREATE TABLE rt3.Users ( + id numeric(38,0) identity, + Name varchar(200) NOT NULL , + Password varchar(40) NULL , + Comments text NULL , + Signature text NULL , + EmailAddress varchar(120) NULL , + FreeformContactInfo text 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 varchar(50) NULL , + PGPKey text NULL, + + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + + +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 rt3.Tickets ( + id numeric(38,0) identity, + EffectiveId integer NOT NULL , + Queue integer NOT NULL , + Type varchar(16) NULL , + IssueStatement integer NOT NULL , + Resolution integer NOT NULL , + Owner integer NOT NULL , + Subject varchar(200) NULL, + InitialPriority integer NOT NULL , + FinalPriority integer NOT NULL , + Priority integer NOT NULL , + TimeEstimated integer NOT NULL , + TimeWorked integer NOT NULL , + Status varchar(10) NULL , + TimeLeft integer NOT NULL , + Told DATETIME NULL , + Starts DATETIME NULL , + Started DATETIME NULL , + Due DATETIME NULL , + Resolved DATETIME NULL , + + + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + Disabled numeric(1) NOT NULL , + PRIMARY KEY (id) +) ; + +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) ; +CREATE INDEX Tickets6 ON Tickets (EffectiveId, Type) ; + +# }}} + +# {{{ ScripActions + +CREATE TABLE rt3.ScripActions ( + id numeric(38,0) identity, + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +# }}} + +# {{{ Templates + +CREATE TABLE rt3.Templates ( + id numeric(38,0) identity, + Queue integer NOT NULL , + Name varchar(200) NOT NULL , + Description varchar(255) NULL , + Type varchar(16) NULL , + Language varchar(16) NULL , + TranslationOf integer NOT NULL , + Content text NULL , + LastUpdated DATETIME NULL , + LastUpdatedBy integer NOT NULL , + Creator integer NOT NULL , + Created DATETIME NULL , + PRIMARY KEY (id) +) ; + +# }}} + +# {{{ TicketCustomFieldValues + +CREATE TABLE rt3.TicketCustomFieldValues ( + id numeric(38,0) identity, + Ticket int NOT NULL , + CustomField int NOT NULL , + Content varchar(255) NULL , + + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX TicketCustomFieldValues1 ON TicketCustomFieldValues (CustomField,Ticket,Content); +CREATE INDEX TicketCustomFieldValues2 ON TicketCustomFieldValues (CustomField,Ticket); + +# }}} + +# {{{ CustomFields + +CREATE TABLE rt3.CustomFields ( + id numeric(38,0) identity, + Name varchar(200) NULL , + Type varchar(200) NULL , + Queue integer NOT NULL , + Description varchar(255) NULL , + SortOrder integer NOT NULL , + + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + Disabled numeric(1) NOT NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX CustomFields1 on CustomFields (Disabled, Queue); + + +# }}} + +# {{{ CustomFieldValues + +CREATE TABLE rt3.CustomFieldValues ( + id numeric(38,0) identity, + CustomField int NOT NULL , + Name varchar(200) NULL , + Description varchar(255) NULL , + SortOrder integer NOT NULL , + + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); + +# }}} + + +# {{{ Attributes + +CREATE TABLE rt3.Attributes ( + id numeric(38,0) identity, + Name varchar(255) NULL , + Description varchar(255) NULL , + Content text, + ContentType varchar(16), + ObjectType varchar(64), + ObjectId integer, # foreign key to anything + Creator integer NOT NULL , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) ; + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +# }}} + +# {{{ Sessions + +# sessions is used by Apache::Session to keep sessions in the database. +# We should have a reaper script somewhere. + +CREATE TABLE rt3.sessions ( + id char(32) NOT NULL, + a_session TEXT, + LastUpdated DATETIME, + PRIMARY KEY (id) +); + +# }}} diff --git a/rt/etc/schema.mysql b/rt/etc/schema.mysql new file mode 100755 index 000000000..b7d53f884 --- /dev/null +++ b/rt/etc/schema.mysql @@ -0,0 +1,463 @@ +# {{{ Attachments + +CREATE TABLE Attachments ( + id INTEGER NOT NULL AUTO_INCREMENT, + TransactionId integer NOT NULL , + Parent integer NOT NULL DEFAULT 0 , + 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 NOT NULL DEFAULT 0 , + Created DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Attachments2 ON Attachments (TransactionId) ; +CREATE INDEX Attachments3 ON Attachments (Parent, TransactionId) ; +# }}} + +# {{{ Queues +CREATE TABLE Queues ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(200) NOT NULL , + Description varchar(255) NULL , + CorrespondAddress varchar(120) NULL , + CommentAddress varchar(120) NULL , + InitialPriority integer NOT NULL DEFAULT 0 , + FinalPriority integer NOT NULL DEFAULT 0 , + DefaultDueIn integer NOT NULL DEFAULT 0 , + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 , + PRIMARY KEY (id) +) TYPE=InnoDB; +CREATE UNIQUE INDEX Queues1 ON Queues (Name) ; +CREATE INDEX Queues2 ON Queues (Disabled) ; + +# }}} + +# {{{ Links + +CREATE TABLE Links ( + id INTEGER NOT NULL AUTO_INCREMENT, + Base varchar(240) NULL , + Target varchar(240) NULL , + Type varchar(20) NOT NULL , + LocalTarget integer NOT NULL DEFAULT 0 , + LocalBase integer NOT NULL DEFAULT 0 , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Links2 ON Links (Base, Type) ; +CREATE INDEX Links3 ON Links (Target, Type) ; +CREATE INDEX Links4 ON Links (Type,LocalBase); + +# }}} + +# {{{ Principals + +CREATE TABLE Principals ( + id INTEGER AUTO_INCREMENT not null, + PrincipalType VARCHAR(16) not null, + ObjectId integer, # foreign key to Users or Groups, depending + Disabled int2 NOT NULL DEFAULT 0 , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Principals2 ON Principals (ObjectId); + +# }}} + +# {{{ Groups + +CREATE TABLE Groups ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(200) NULL , + Description varchar(255) NULL , + Domain varchar(64), + Type varchar(64), + Instance integer, + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Groups1 ON Groups (Domain,Instance,Type,id); +CREATE INDEX Groups2 On Groups (Type, Instance); + +# }}} + +# {{{ ScripConditions + +CREATE TABLE ScripConditions ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + ApplicableTransTypes varchar(60) NULL , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +# }}} + +# {{{ Transactions +CREATE TABLE Transactions ( + id INTEGER NOT NULL AUTO_INCREMENT, + ObjectType varchar(64) NOT NULL, + ObjectId integer NOT NULL DEFAULT 0 , + TimeTaken integer NOT NULL DEFAULT 0 , + Type varchar(20) NULL , + Field varchar(40) NULL , + OldValue varchar(255) NULL , + NewValue varchar(255) NULL , + ReferenceType varchar(255) NULL, + OldReference integer NULL , + NewReference integer NULL , + Data varchar(255) NULL , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + +# }}} + +# {{{ Scrips + +CREATE TABLE Scrips ( + id INTEGER NOT NULL AUTO_INCREMENT, + Description varchar(255), + ScripCondition integer NOT NULL DEFAULT 0 , + ScripAction integer NOT NULL DEFAULT 0 , + ConditionRules text NULL , + ActionRules text NULL , + CustomIsApplicableCode text NULL , + CustomPrepareCode text NULL , + CustomCommitCode text NULL , + Stage varchar(32) NULL , + Queue integer NOT NULL DEFAULT 0 , + Template integer NOT NULL DEFAULT 0 , + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +# }}} + +# {{{ ACL +CREATE TABLE ACL ( + id INTEGER NOT NULL AUTO_INCREMENT, + PrincipalType varchar(25) NOT NULL, #"User" "Group", "Owner", "Cc" "AdminCc", "Requestor", "Requestor" + + PrincipalId integer NOT NULL , #Foreign key to principals + RightName varchar(25) NOT NULL , + ObjectType varchar(25) NOT NULL , + ObjectId integer NOT NULL default 0, + DelegatedBy integer NOT NULL default 0, #foreign key to principals with a userid + DelegatedFrom integer NOT NULL default 0, #foreign key to ACL + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX ACL1 on ACL(RightName, ObjectType, ObjectId,PrincipalType,PrincipalId); + +# }}} + +# {{{ GroupMembers + +CREATE TABLE GroupMembers ( + id INTEGER NOT NULL AUTO_INCREMENT, + GroupId integer NOT NULL DEFAULT 0, + MemberId integer NOT NULL DEFAULT 0, #Foreign key to Principals + PRIMARY KEY (id) +) TYPE=InnoDB; +CREATE UNIQUE INDEX GroupMembers1 on GroupMembers (GroupId, MemberId); + + +# }}} + +# {{{ GroupMembersCache + +create table CachedGroupMembers ( + id int auto_increment, + GroupId int, # foreign key to Principals + MemberId int, # foreign key to Principals + Via int, #foreign key to CachedGroupMembers. (may point to $self->id) + ImmediateParentId int, #foreign key to prinicpals. + # this points to the group that the member is + # a member of, for ease of deletes. + 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 + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX DisGrouMem on CachedGroupMembers (GroupId,MemberId,Disabled); + +# }}} + +# {{{ Users + +CREATE TABLE Users ( + id INTEGER NOT NULL AUTO_INCREMENT, + 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 varchar(50) NULL , + PGPKey text NULL, + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + + +CREATE UNIQUE INDEX Users1 ON Users (Name) ; +CREATE INDEX Users4 ON Users (EmailAddress); + + +# }}} + +# {{{ Tickets + +CREATE TABLE Tickets ( + id INTEGER NOT NULL AUTO_INCREMENT, + EffectiveId integer NOT NULL DEFAULT 0 , + Queue integer NOT NULL DEFAULT 0 , + Type varchar(16) NULL , + IssueStatement integer NOT NULL DEFAULT 0 , + Resolution integer NOT NULL DEFAULT 0 , + Owner integer NOT NULL DEFAULT 0 , + Subject varchar(200) NULL DEFAULT '[no subject]' , + InitialPriority integer NOT NULL DEFAULT 0 , + FinalPriority integer NOT NULL DEFAULT 0 , + Priority integer NOT NULL DEFAULT 0 , + TimeEstimated integer NOT NULL DEFAULT 0 , + TimeWorked integer NOT NULL DEFAULT 0 , + Status varchar(10) NULL , + TimeLeft integer NOT NULL DEFAULT 0 , + Told DATETIME NULL , + Starts DATETIME NULL , + Started DATETIME NULL , + Due DATETIME NULL , + Resolved DATETIME NULL , + + + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Tickets1 ON Tickets (Queue, Status) ; +CREATE INDEX Tickets2 ON Tickets (Owner) ; +CREATE INDEX Tickets6 ON Tickets (EffectiveId, Type) ; + +# }}} + +# {{{ ScripActions + +CREATE TABLE ScripActions ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(200) NULL , + Description varchar(255) NULL , + ExecModule varchar(60) NULL , + Argument varchar(255) NULL , + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +# }}} + +# {{{ Templates + +CREATE TABLE Templates ( + id INTEGER NOT NULL AUTO_INCREMENT, + 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 NOT NULL DEFAULT 0 , + Content blob NULL , + LastUpdated DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +# }}} + +# {{{ ObjectCustomFieldValues + +CREATE TABLE ObjectCustomFieldValues ( + id INTEGER NOT NULL AUTO_INCREMENT, + CustomField int NOT NULL , + ObjectType varchar(255) NOT NULL, # Final target of the Object + ObjectId int NOT NULL , # New -- Replaces Ticket + SortOrder integer NOT NULL DEFAULT 0 , # New -- ordering for multiple values + + Content varchar(255) NULL , + LargeContent LONGTEXT NULL, # New -- to hold 255+ strings + ContentType varchar(80) NULL, # New -- only text/* gets searched + ContentEncoding varchar(80) NULL , # New -- for binary Content + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 , # New -- whether the value was current + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX ObjectCustomFieldValues1 ON ObjectCustomFieldValues (Content); +CREATE INDEX ObjectCustomFieldValues2 ON ObjectCustomFieldValues (CustomField,ObjectType,ObjectId); + +# }}} + +# {{{ CustomFields + +CREATE TABLE CustomFields ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(200) NULL , + Type varchar(200) NULL , # Changed -- 'Single' and 'Multiple' is moved out + MaxValues integer, # New -- was 'Single'(1) and 'Multiple'(0) + Pattern varchar(255) NULL , # New -- Must validate against this + Repeated int2 NOT NULL DEFAULT 0 , # New -- repeated table entry + Description varchar(255) NULL , + SortOrder integer NOT NULL DEFAULT 0 , + LookupType varchar(255) NOT NULL, + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + Disabled int2 NOT NULL DEFAULT 0 , + PRIMARY KEY (id) +) TYPE=InnoDB; + +# }}} + +# {{{ ObjectCustomFields + +CREATE TABLE ObjectCustomFields ( + id INTEGER NOT NULL AUTO_INCREMENT, + CustomField int NOT NULL , + ObjectId integer NOT NULL, + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +# }}} + +# {{{ CustomFieldValues + +CREATE TABLE CustomFieldValues ( + id INTEGER NOT NULL AUTO_INCREMENT, + CustomField int NOT NULL , + Name varchar(200) NULL , + Description varchar(255) NULL , + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX CustomFieldValues1 ON CustomFieldValues (CustomField); + +# }}} + + +# {{{ Attributes + +CREATE TABLE Attributes ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(255) NULL , + Description varchar(255) NULL , + Content text, + ContentType varchar(16), + ObjectType varchar(64), + ObjectId integer, # foreign key to anything + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +# }}} + +# {{{ Sessions + +# sessions is used by Apache::Session to keep sessions in the database. +# We should have a reaper script somewhere. + +CREATE TABLE sessions ( + id char(32) NOT NULL, + a_session LONGTEXT, + LastUpdated TIMESTAMP, + PRIMARY KEY (id) +); + +# }}} diff --git a/rt/etc/upgrade/3.1.0/acl.Informix b/rt/etc/upgrade/3.1.0/acl.Informix new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/acl.Informix @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.1.0/acl.Oracle b/rt/etc/upgrade/3.1.0/acl.Oracle new file mode 100755 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/acl.Oracle @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.1.0/acl.Pg b/rt/etc/upgrade/3.1.0/acl.Pg new file mode 100755 index 000000000..809e99ab3 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/acl.Pg @@ -0,0 +1,19 @@ +sub acl { + my $dbh = shift; + + my @acls; + + my @tables = qw ( + attributes_id_seq + attributes + ); + + foreach my $table (@tables) { + push @acls, + "GRANT SELECT, INSERT, UPDATE, DELETE ON $table to " + . $RT::DatabaseUser . ";"; + + } + return (@acls); +} +1; diff --git a/rt/etc/upgrade/3.1.0/acl.SQLite b/rt/etc/upgrade/3.1.0/acl.SQLite new file mode 100755 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/acl.SQLite @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.1.0/acl.mysql b/rt/etc/upgrade/3.1.0/acl.mysql new file mode 100755 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/acl.mysql @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.1.0/content b/rt/etc/upgrade/3.1.0/content new file mode 100644 index 000000000..3117dafc5 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/content @@ -0,0 +1,2 @@ +# nothing to do +1; diff --git a/rt/etc/upgrade/3.1.0/schema.Informix b/rt/etc/upgrade/3.1.0/schema.Informix new file mode 100644 index 000000000..722eb70b3 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/schema.Informix @@ -0,0 +1,17 @@ +CREATE TABLE Attributes ( + id SERIAL, + Name VARCHAR(255) DEFAULT '' NOT NULL, + Description VARCHAR(255) DEFAULT NULL, + Content BYTE, + ContentType VARCHAR(16), + ObjectType VARCHAR(25) NOT NULL, + ObjectId INTEGER DEFAULT 0 NOT NULL, + Creator INTEGER DEFAULT 0 NOT NULL, + Created DATETIME YEAR TO SECOND, + LastUpdatedBy INTEGER DEFAULT 0 NOT NULL, + LastUpdated DATETIME YEAR TO SECOND, + PRIMARY KEY (id) +); + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); diff --git a/rt/etc/upgrade/3.1.0/schema.Oracle b/rt/etc/upgrade/3.1.0/schema.Oracle new file mode 100644 index 000000000..a8aae18b5 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/schema.Oracle @@ -0,0 +1,17 @@ +CREATE SEQUENCE ATTRIBUTES_seq; +CREATE TABLE Attributes ( + id NUMBER(11,0) PRIMARY KEY, + Name VARCHAR2(255) NOT NULL, + Description VARCHAR2(255), + Content CLOB, + ContentType VARCHAR(16), + ObjectType VARCHAR2(25) NOT NULL, + ObjectId NUMBER(11,0) DEFAULT 0 NOT NULL, + Creator NUMBER(11,0) DEFAULT 0 NOT NULL, + Created DATE, + LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, + LastUpdated DATE +); + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); diff --git a/rt/etc/upgrade/3.1.0/schema.Pg b/rt/etc/upgrade/3.1.0/schema.Pg new file mode 100755 index 000000000..94c3fe70d --- /dev/null +++ b/rt/etc/upgrade/3.1.0/schema.Pg @@ -0,0 +1,25 @@ +-- {{{ Attributes + +CREATE SEQUENCE attributes_id_seq; + +CREATE TABLE Attributes ( + id INTEGER DEFAULT nextval('attributes_id_seq'), + Name varchar(255) NOT NULL , + Description varchar(255) NULL , + Content text, + ContentType varchar(16), + ObjectType varchar(64), + ObjectId integer, + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +-- }}} + diff --git a/rt/etc/upgrade/3.1.0/schema.SQLite b/rt/etc/upgrade/3.1.0/schema.SQLite new file mode 100644 index 000000000..1dd466fa7 --- /dev/null +++ b/rt/etc/upgrade/3.1.0/schema.SQLite @@ -0,0 +1,21 @@ +--- {{{ Attributes +CREATE TABLE Attributes ( + id INTEGER PRIMARY KEY , + Name varchar(255) NOT NULL , + Description varchar(255) NULL , + Content LONGTEXT NULL , + ContentType varchar(16), + ObjectType varchar(25) NOT NULL , + ObjectId INTEGER default 0, + Creator integer NULL , + Created DATETIME NULL , + LastUpdatedBy integer NULL , + LastUpdated DATETIME NULL + +) ; + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +--- }}} + diff --git a/rt/etc/upgrade/3.1.0/schema.mysql b/rt/etc/upgrade/3.1.0/schema.mysql new file mode 100755 index 000000000..c4a345d3e --- /dev/null +++ b/rt/etc/upgrade/3.1.0/schema.mysql @@ -0,0 +1,21 @@ +# {{{ Attributes + +CREATE TABLE Attributes ( + id INTEGER NOT NULL AUTO_INCREMENT, + Name varchar(255) NULL , + Description varchar(255) NULL , + Content text, + ContentType varchar(16), + ObjectType varchar(64), + ObjectId integer, # foreign key to anything + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + +CREATE INDEX Attributes1 on Attributes(Name); +CREATE INDEX Attributes2 on Attributes(ObjectType, ObjectId); + +# }}} diff --git a/rt/etc/upgrade/3.1.15/content b/rt/etc/upgrade/3.1.15/content new file mode 100644 index 000000000..d23125a0b --- /dev/null +++ b/rt/etc/upgrade/3.1.15/content @@ -0,0 +1,7 @@ +@Scrips = ( + { ScripCondition => 'On Owner Change', + ScripAction => 'Notify Owner', + Template => 'Transaction' }, +); + +1; diff --git a/rt/etc/upgrade/3.1.17/content b/rt/etc/upgrade/3.1.17/content new file mode 100644 index 000000000..1d648d82f --- /dev/null +++ b/rt/etc/upgrade/3.1.17/content @@ -0,0 +1,22 @@ +@ScripActions = ( + { Name => 'Notify Ccs as Comment', # loc + Description => 'Sends mail to the Ccs as a comment', # loc + ExecModule => 'NotifyAsComment', + Argument => 'Cc' }, + { Name => 'Notify Ccs', # loc + Description => 'Sends mail to the Ccs', # loc + ExecModule => 'Notify', + Argument => 'Cc' }, +); + + +@ScripConditions = ( + { + Name => 'On Priority Change', # loc + Description => 'Whenever a ticket\'s priority changes', # loc + ApplicableTransTypes => 'Set', + ExecModule => 'PriorityChange', + }, +); + +1; diff --git a/rt/etc/upgrade/3.3.0/acl.Informix b/rt/etc/upgrade/3.3.0/acl.Informix new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/acl.Informix @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.0/acl.Oracle b/rt/etc/upgrade/3.3.0/acl.Oracle new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/acl.Oracle @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.0/acl.Pg b/rt/etc/upgrade/3.3.0/acl.Pg new file mode 100644 index 000000000..2069a198e --- /dev/null +++ b/rt/etc/upgrade/3.3.0/acl.Pg @@ -0,0 +1,20 @@ +sub acl { + my $dbh = shift; + + my @acls; + + my @tables = qw ( + objectcustomfieldvalues + objectcustomfields_id_s + objectcustomfields + ); + + foreach my $table (@tables) { + push @acls, + "GRANT SELECT, INSERT, UPDATE, DELETE ON $table to " + . $RT::DatabaseUser . ";"; + + } + return (@acls); +} +1; diff --git a/rt/etc/upgrade/3.3.0/acl.SQLite b/rt/etc/upgrade/3.3.0/acl.SQLite new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/acl.SQLite @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.0/acl.mysql b/rt/etc/upgrade/3.3.0/acl.mysql new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/acl.mysql @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.0/content b/rt/etc/upgrade/3.3.0/content new file mode 100644 index 000000000..0afc6045c --- /dev/null +++ b/rt/etc/upgrade/3.3.0/content @@ -0,0 +1 @@ +1; diff --git a/rt/etc/upgrade/3.3.0/schema.Oracle b/rt/etc/upgrade/3.3.0/schema.Oracle new file mode 100644 index 000000000..f81feeb79 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/schema.Oracle @@ -0,0 +1,65 @@ +alter Table Transactions ADD ObjectType VARCHAR2(64); +UPDATE Transactions set ObjectType = 'RT::Ticket'; +ALTER TABLE Transactions modify ObjectType NOT NULL; +ALTER TABLE Transactions drop column EffectiveTicket; +ALTER TABLE Transactions ADD ReferenceType VARCHAR2(255) NULL; +ALTER TABLE Transactions ADD OldReference NUMBER(11,0) NULL; +ALTER TABLE Transactions ADD NewReference NUMBER(11,0) NULL; +DROP INDEX transactions1; +ALTER TABLE Transactions rename column Ticket to ObjectId; +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + +ALTER TABLE TicketCustomFieldValues rename to ObjectCustomFieldValues; +ALTER TABLE ObjectCustomFieldValues rename column Ticket to ObjectId; +ALTER TABLE ObjectCustomFieldValues ADD ObjectType VARCHAR2(255); +UPDATE ObjectCustomFieldValues set ObjectType = 'RT::Ticket'; +ALTER TABLE ObjectCustomFieldValues MODIFY ObjectType NOT NULL; +ALTER TABLE ObjectCustomFieldValues ADD Disabled NUMBER(11,0); +ALTER TABLE ObjectCustomFieldValues MODIFY Disabled default 0; +UPDATE ObjectCustomFieldValues SET Disabled = 0; +ALTER TABLE ObjectCustomFieldValues MODIFY Disabled NOT NULL; +ALTER TABLE ObjectCustomFieldValues ADD LargeContent CLOB NULL; +ALTER TABLE ObjectCustomFieldValues ADD ContentType VARCHAR2(80) NULL; +ALTER TABLE ObjectCustomFieldValues ADD ContentEncoding VARCHAR2(80) NULL; +ALTER TABLE ObjectCustomFieldValues ADD SortOrder NUMBER(11,0) DEFAULT 0 NOT NULL; + + + +CREATE INDEX ObjectCustomFieldValues1 on ObjectCustomFieldValues (CustomField,ObjectType,ObjectId,Content); +CREATE INDEX ObjectCustomFieldValues2 on ObjectCustomFieldValues (CustomField,ObjectType,ObjectId); + + + +CREATE SEQUENCE OBJECTCUSTOMFIELDS_seq; +CREATE TABLE ObjectCustomFields ( + id NUMBER(11,0) + CONSTRAINT ObjectCustomFields_Key PRIMARY KEY, + CustomField NUMBER(11,0) NOT NULL, + ObjectId NUMBER(11,0) NOT NULL, + SortOrder NUMBER(11,0) DEFAULT 0 NOT NULL, + Creator NUMBER(11,0) DEFAULT 0 NOT NULL, + Created DATE, + LastUpdatedBy NUMBER(11,0) DEFAULT 0 NOT NULL, + LastUpdated DATE +); + + +INSERT into ObjectCustomFields (id, CustomField, ObjectId, SortOrder, Creator, LastUpdatedBy) SELECT objectcustomfields_seq.nextval, id, Queue, SortOrder, Creator, LastUpdatedBy from CustomFields; + +ALTER TABLE CustomFields ADD LookupType VARCHAR2(255); +ALTER TABLE CustomFields ADD Repeated NUMBER(11,0); +ALTER TABLE CustomFields ADD Pattern VARCHAR2(255) NULL; +ALTER TABLE CustomFields ADD MaxValues NUMBER(11,0); + +UPDATE CustomFields SET MaxValues = 0 WHERE Type LIKE '%Multiple'; +UPDATE CustomFields SET MaxValues = 1 WHERE Type LIKE '%Single'; +UPDATE CustomFields SET Type = 'Select' WHERE Type LIKE 'Select%'; +UPDATE CustomFields SET Type = 'Freeform' WHERE Type LIKE 'Freeform%'; +UPDATE CustomFields Set LookupType = 'RT::Queue-RT::Ticket'; +ALTER TABLE CustomFields MODIFY LookupType NOT NULL; +UPDATE CustomFields Set Repeated = 0; +ALTER TABLE CustomFields MODIFY Repeated DEFAULT 0; +ALTER TABLE CustomFields MODIFY Repeated NOT NULL; +ALTER TABLE CustomFields drop column Queue; + + diff --git a/rt/etc/upgrade/3.3.0/schema.Pg b/rt/etc/upgrade/3.3.0/schema.Pg new file mode 100644 index 000000000..427eae798 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/schema.Pg @@ -0,0 +1,74 @@ +alter Table Transactions ADD Column ObjectType varchar(64); +update Transactions set ObjectType = 'RT::Ticket'; +ALTER TABLE Transactions ALTER COLUMN ObjectType SET NOT NULL; +alter table Transactions drop column EffectiveTicket; +alter table Transactions add column ReferenceType varchar(255) NULL; +alter table Transactions add column OldReference integer NULL; +alter table Transactions add column NewReference integer NULL; +drop index transactions1; +alter table Transactions rename column Ticket to ObjectId; + + +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + +alter table TicketCustomFieldValues rename to ObjectCustomFieldValues; + +alter table ObjectCustomFieldValues rename column Ticket to ObjectId; + +alter table objectcustomfieldvalues add column ObjectType varchar(255); + +update objectcustomfieldvalues set ObjectType = 'RT::Ticket'; + +ALTER TABLE objectcustomfieldvalues ALTER COLUMN ObjectType SET NOT NULL; + +alter table objectcustomfieldvalues add column Current int; + +alter table objectcustomfieldvalues alter column Current SET default 1; + +UPDATE objectcustomfieldvalues SET Current = 1; + +alter table objectcustomfieldvalues add column LargeContent TEXT NULL; + +alter table objectcustomfieldvalues add column ContentType varchar(80) NULL; + +alter table objectcustomfieldvalues add column ContentEncoding varchar(80) NULL; + +create index ObjectCustomFieldValues1 on objectcustomfieldvalues (CustomField,ObjectType,ObjectId,Content); + +create index ObjectCustomFieldValues2 on objectcustomfieldvalues (CustomField,ObjectType,ObjectId); + + +CREATE SEQUENCE objectcustomfields_id_s; + +CREATE TABLE ObjectCustomFields ( + id INTEGER DEFAULT nextval('objectcustomfields_id_s'), + CustomField integer NOT NULL, + ObjectId integer NOT NULL, + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created TIMESTAMP NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated TIMESTAMP NULL , + PRIMARY KEY (id) + +); + + +INSERT into ObjectCustomFields (CustomField, ObjectId, SortOrder, Creator, LastUpdatedBy) SELECT id, Queue, SortOrder, Creator, LastUpdatedBy from CustomFields; + +alter table CustomFields add column LookupType varchar(255); +alter table CustomFields add column Repeated int2; +alter table CustomFields add column Pattern varchar(255) NULL; +alter table CustomFields add column MaxValues integer; + +UPDATE CustomFields SET MaxValues = 0 WHERE Type LIKE '%Multiple'; +UPDATE CustomFields SET MaxValues = 1 WHERE Type LIKE '%Single'; +UPDATE CustomFields SET Type = 'Select' WHERE Type LIKE 'Select%'; +UPDATE CustomFields SET Type = 'Freeform' WHERE Type LIKE 'Freeform%'; +UPDATE CustomFields Set LookupType = 'RT::Queue-RT::Ticket'; +ALTER TABLE CustomFields ALTER COLUMN LookupType SET NOT NULL; +UPDATE CustomFields Set Repeated = 0; +ALTER TABLE CustomFields ALTER COLUMN Repeated SET DEFAULT 0; +ALTER TABLE CustomFields ALTER COLUMN Repeated SET NOT NULL; +alter table CustomFields drop column Queue; diff --git a/rt/etc/upgrade/3.3.0/schema.mysql b/rt/etc/upgrade/3.3.0/schema.mysql new file mode 100644 index 000000000..0e33a2819 --- /dev/null +++ b/rt/etc/upgrade/3.3.0/schema.mysql @@ -0,0 +1,65 @@ +alter Table Transactions ADD Column (ObjectType varchar(64) not null); +update Transactions set ObjectType = 'RT::Ticket'; +alter table Transactions drop column EffectiveTicket; +alter table Transactions add column ReferenceType varchar(255) NULL; +alter table Transactions add column OldReference integer NULL; +alter table Transactions add column NewReference integer NULL; +alter table Transactions drop index transactions1; +alter table Transactions change Ticket ObjectId integer NOT NULL DEFAULT 0 ; + +CREATE INDEX Transactions1 ON Transactions (ObjectType, ObjectId); + +alter table TicketCustomFieldValues rename ObjectCustomFieldValues; + +alter table ObjectCustomFieldValues change Ticket ObjectId integer NOT NULL DEFAULT 0 ; + +alter table ObjectCustomFieldValues add column ObjectType varchar(255) not null; + +update ObjectCustomFieldValues set ObjectType = 'RT::Ticket'; + +alter table ObjectCustomFieldValues add column Current bool default 1; + +alter table ObjectCustomFieldValues add column LargeContent LONGTEXT NULL; + +alter table ObjectCustomFieldValues add column ContentType varchar(80) NULL; + +alter table ObjectCustomFieldValues add column ContentEncoding varchar(80) NULL; + +# These could fail if there's no such index and there's no "drop index if exists" syntax +#alter table ObjectCustomFieldValues drop index ticketcustomfieldvalues1; +#alter table ObjectCustomFieldValues drop index ticketcustomfieldvalues2; + +alter table ObjectCustomFieldValues add index ObjectCustomFieldValues1 (Content); + +alter table ObjectCustomFieldValues add index ObjectCustomFieldValues2 (CustomField,ObjectType,ObjectId); + + +CREATE TABLE ObjectCustomFields ( + id INTEGER NOT NULL AUTO_INCREMENT, + CustomField int NOT NULL , + ObjectId integer NOT NULL, + SortOrder integer NOT NULL DEFAULT 0 , + + Creator integer NOT NULL DEFAULT 0 , + Created DATETIME NULL , + LastUpdatedBy integer NOT NULL DEFAULT 0 , + LastUpdated DATETIME NULL , + PRIMARY KEY (id) +) TYPE=InnoDB; + + +INSERT into ObjectCustomFields (id, CustomField, ObjectId, SortOrder, Creator, LastUpdatedBy) SELECT null, id, Queue, SortOrder, Creator, LastUpdatedBy from CustomFields; + +alter table CustomFields add column LookupType varchar(255) NOT NULL; +alter table CustomFields add column Repeated int2 NOT NULL DEFAULT 0 ; +alter table CustomFields add column Pattern varchar(255) NULL; +alter table CustomFields add column MaxValues integer; +# See above +# alter table CustomFields drop index CustomFields1; + +UPDATE CustomFields SET MaxValues = 0 WHERE Type LIKE '%Multiple'; +UPDATE CustomFields SET MaxValues = 1 WHERE Type LIKE '%Single'; +UPDATE CustomFields SET Type = 'Select' WHERE Type LIKE 'Select%'; +UPDATE CustomFields SET Type = 'Freeform' WHERE Type LIKE 'Freeform%'; +UPDATE CustomFields Set LookupType = 'RT::Queue-RT::Ticket'; +alter table CustomFields drop column Queue; diff --git a/rt/etc/upgrade/3.3.11/acl.Oracle b/rt/etc/upgrade/3.3.11/acl.Oracle new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.11/acl.Oracle @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.11/acl.Pg b/rt/etc/upgrade/3.3.11/acl.Pg new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.11/acl.Pg @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.11/acl.SQLite b/rt/etc/upgrade/3.3.11/acl.SQLite new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.11/acl.SQLite @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.11/acl.mysql b/rt/etc/upgrade/3.3.11/acl.mysql new file mode 100644 index 000000000..73c16ae03 --- /dev/null +++ b/rt/etc/upgrade/3.3.11/acl.mysql @@ -0,0 +1,4 @@ +sub acl { + return (); +} +1; diff --git a/rt/etc/upgrade/3.3.11/content b/rt/etc/upgrade/3.3.11/content new file mode 100644 index 000000000..0afc6045c --- /dev/null +++ b/rt/etc/upgrade/3.3.11/content @@ -0,0 +1 @@ +1; diff --git a/rt/etc/upgrade/3.3.11/schema.Oracle b/rt/etc/upgrade/3.3.11/schema.Oracle new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/rt/etc/upgrade/3.3.11/schema.Oracle diff --git a/rt/etc/upgrade/3.3.11/schema.Pg b/rt/etc/upgrade/3.3.11/schema.Pg new file mode 100644 index 000000000..6ab5d6581 --- /dev/null +++ b/rt/etc/upgrade/3.3.11/schema.Pg @@ -0,0 +1,11 @@ +ALTER TABLE ObjectCustomFieldValues ADD COLUMN SortOrder INTEGER; +UPDATE ObjectCustomFieldValues SET SortOrder = 0; +ALTER TABLE ObjectCustomFieldValues ALTER COLUMN SortOrder SET DEFAULT 0; +ALTER TABLE ObjectCustomFieldValues ALTER COLUMN SortOrder SET NOT NULL; +ALTER TABLE ObjectCustomFieldValues ADD COLUMN Disabled INTEGER; +UPDATE ObjectCustomFieldValues SET Disabled = 1 WHERE Current = 0; +UPDATE ObjectCustomFieldValues SET Disabled = 0 WHERE Current != 0; +ALTER TABLE ObjectCustomFieldValues ALTER COLUMN Disabled SET DEFAULT 0; +ALTER TABLE ObjectCustomFieldValues ALTER COLUMN Disabled SET NOT NULL; + +ALTER TABLE ObjectCustomFieldValues DROP COLUMN Current; diff --git a/rt/etc/upgrade/3.3.11/schema.SQLite b/rt/etc/upgrade/3.3.11/schema.SQLite new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/rt/etc/upgrade/3.3.11/schema.SQLite diff --git a/rt/etc/upgrade/3.3.11/schema.mysql b/rt/etc/upgrade/3.3.11/schema.mysql new file mode 100644 index 000000000..cc35d40f2 --- /dev/null +++ b/rt/etc/upgrade/3.3.11/schema.mysql @@ -0,0 +1,5 @@ +ALTER TABLE ObjectCustomFieldValues ADD COLUMN SortOrder INTEGER NOT NULL DEFAULT 0; +ALTER TABLE ObjectCustomFieldValues ADD COLUMN Disabled int2 NOT NULL DEFAULT 0; + +UPDATE ObjectCustomFieldValues SET Disabled = 1 WHERE Current = 0; +ALTER TABLE ObjectCustomFieldValues DROP COLUMN Current; diff --git a/rt/etc/upgrade/3.5.1/content b/rt/etc/upgrade/3.5.1/content new file mode 100644 index 000000000..e3898a7cc --- /dev/null +++ b/rt/etc/upgrade/3.5.1/content @@ -0,0 +1,36 @@ +@Attributes = ( + { Name => 'Search - My Tickets', + Description => '[_1] highest priority tickets I own', + Content => + { Format => "'<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__id__</a>/TITLE:#', '<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__Subject__</a>/TITLE:Subject', Priority, QueueName, ExtendedStatus", + Query => " Owner = '__CurrentUser__' AND ( Status = 'new' OR Status = 'open')", + OrderBy => 'Priority', + Order => 'DESC' }, + }, + { Name => 'Search - Unowned Tickets', + Description => '[_1] newest unowned tickets', + Content => + { Format => "'<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__id__</a>/TITLE:#', '<a href=\"__WebPath__/Ticket/Display.html?id=__id__\">__Subject__</a>/TITLE:Subject', QueueName, ExtendedStatus, CreatedRelative, '<A HREF=\"__WebPath__/Ticket/Display.html?Action=Take&id=__id__\">__loc(Take)__</a>/TITLE: ' ", + Query => " Owner = 'Nobody' AND ( Status = 'new' OR Status = 'open')", + OrderBy => 'Created', + Order => 'DESC' }, + }, + { Name => 'HomepageSettings', + Description => 'HomepageSettings', + Content => + { 'body' => + [ { type => 'system', name => 'My Tickets' }, + { type => 'system', name => 'Unowned Tickets' }, + { type => 'component', name => 'QuickCreate'}, + ], + 'summary' => + [ + { type => 'component', name => 'MyReminders' }, + { type => 'component', name => 'Quicksearch' }, + { type => 'component', name => 'RefreshHomepage' }, + ] + }, +} +); + +1; |