Upgrade to 4.2.2 4.2.0_on_4.0.17
authorMikal Kolbein Gule <m.k.gule@usit.uio.no>
Thu, 16 Jan 2014 08:22:36 +0000 (09:22 +0100)
committerMikal Kolbein Gule <m.k.gule@usit.uio.no>
Thu, 16 Jan 2014 08:22:36 +0000 (09:22 +0100)
897 files changed:
bin/rt
bin/rt-crontool
bin/rt-mailgate
docs/README
docs/UPGRADING-3.8
docs/UPGRADING-4.2
docs/automating_rt.pod [new file with mode: 0644]
docs/customizing/lifecycles.pod
etc/RT_Config.pm
etc/acl.mysql
etc/initialdata
etc/schema.mysql
etc/upgrade/3.7.19/content
etc/upgrade/3.8-ical-extension
etc/upgrade/4.0.18/content [new file with mode: 0644]
etc/upgrade/4.0.19/content [new file with mode: 0644]
etc/upgrade/4.0.19/schema.mysql [new file with mode: 0644]
etc/upgrade/4.1.1/schema.Oracle
etc/upgrade/4.1.13/backcompat
etc/upgrade/4.1.22/schema.Oracle
etc/upgrade/4.1.23/indexes
etc/upgrade/4.1.5/content
etc/upgrade/4.1.5/schema.Oracle
etc/upgrade/4.2.1/content [new file with mode: 0644]
etc/upgrade/4.2.2/content [new file with mode: 0644]
etc/upgrade/4.2.2/schema.mysql [new file with mode: 0644]
etc/upgrade/generate-rtaddressregexp
etc/upgrade/sanity-check-stylesheets.pl
etc/upgrade/shrink_cgm_table.pl
etc/upgrade/shrink_transactions_table.pl
etc/upgrade/split-out-cf-categories
etc/upgrade/switch-templates-to
etc/upgrade/time-worked-history.pl
etc/upgrade/upgrade-articles
etc/upgrade/upgrade-mysql-schema.pl
etc/upgrade/vulnerable-passwords
lib/RT.pm
lib/RT/ACE.pm
lib/RT/ACL.pm
lib/RT/Action.pm
lib/RT/Action/AutoOpen.pm
lib/RT/Action/AutoOpenInactive.pm
lib/RT/Action/Autoreply.pm
lib/RT/Action/CreateTickets.pm
lib/RT/Action/EscalatePriority.pm
lib/RT/Action/ExtractSubjectTag.pm
lib/RT/Action/LinearEscalate.pm
lib/RT/Action/Notify.pm
lib/RT/Action/NotifyAsComment.pm
lib/RT/Action/NotifyGroup.pm
lib/RT/Action/NotifyGroupAsComment.pm
lib/RT/Action/OpenOnStarted.pm
lib/RT/Action/RecordComment.pm
lib/RT/Action/RecordCorrespondence.pm
lib/RT/Action/SendEmail.pm
lib/RT/Action/SendForward.pm
lib/RT/Action/SetPriority.pm
lib/RT/Action/SetStatus.pm
lib/RT/Action/UserDefined.pm
lib/RT/Approval.pm
lib/RT/Approval/Rule.pm
lib/RT/Approval/Rule/Created.pm
lib/RT/Approval/Rule/NewPending.pm
lib/RT/Approval/Rule/Passed.pm
lib/RT/Approval/Rule/Rejected.pm
lib/RT/Article.pm
lib/RT/Articles.pm
lib/RT/Attachment.pm
lib/RT/Attachments.pm
lib/RT/Attribute.pm
lib/RT/Attributes.pm
lib/RT/Base.pm
lib/RT/CachedGroupMember.pm
lib/RT/CachedGroupMembers.pm
lib/RT/Class.pm
lib/RT/Classes.pm
lib/RT/Condition.pm
lib/RT/Condition/AnyTransaction.pm
lib/RT/Condition/BeforeDue.pm
lib/RT/Condition/CloseTicket.pm
lib/RT/Condition/Overdue.pm
lib/RT/Condition/OwnerChange.pm
lib/RT/Condition/PriorityChange.pm
lib/RT/Condition/PriorityExceeds.pm
lib/RT/Condition/QueueChange.pm
lib/RT/Condition/ReopenTicket.pm
lib/RT/Condition/StatusChange.pm
lib/RT/Condition/UserDefined.pm
lib/RT/Config.pm
lib/RT/Crypt.pm
lib/RT/Crypt/GnuPG.pm
lib/RT/Crypt/GnuPG/CRLFHandle.pm
lib/RT/Crypt/Role.pm
lib/RT/Crypt/SMIME.pm
lib/RT/CurrentUser.pm
lib/RT/CustomField.pm
lib/RT/CustomFieldValue.pm
lib/RT/CustomFieldValues.pm
lib/RT/CustomFieldValues/External.pm
lib/RT/CustomFieldValues/Groups.pm
lib/RT/CustomFields.pm
lib/RT/Dashboard.pm
lib/RT/Dashboard/Mailer.pm
lib/RT/Dashboards.pm
lib/RT/Date.pm
lib/RT/DependencyWalker.pm
lib/RT/DependencyWalker/FindDependencies.pm [new file with mode: 0644]
lib/RT/EmailParser.pm
lib/RT/Generated.pm
lib/RT/Generated.pm.in
lib/RT/Graph/Tickets.pm
lib/RT/Group.pm
lib/RT/GroupMember.pm
lib/RT/GroupMembers.pm
lib/RT/Groups.pm
lib/RT/Handle.pm
lib/RT/I18N.pm
lib/RT/I18N/cs.pm
lib/RT/I18N/de.pm
lib/RT/I18N/fr.pm
lib/RT/I18N/i_default.pm
lib/RT/I18N/ru.pm
lib/RT/Installer.pm
lib/RT/Interface/CLI.pm
lib/RT/Interface/Email.pm
lib/RT/Interface/Email/Auth/Crypt.pm
lib/RT/Interface/Email/Auth/MailFrom.pm
lib/RT/Interface/REST.pm
lib/RT/Interface/Web.pm
lib/RT/Interface/Web/Handler.pm
lib/RT/Interface/Web/Menu.pm
lib/RT/Interface/Web/QueryBuilder.pm
lib/RT/Interface/Web/QueryBuilder/Tree.pm
lib/RT/Interface/Web/Request.pm
lib/RT/Interface/Web/Session.pm
lib/RT/Lifecycle.pm
lib/RT/Lifecycle/Ticket.pm
lib/RT/Link.pm
lib/RT/Links.pm
lib/RT/Migrate.pm
lib/RT/Migrate/Importer.pm
lib/RT/Migrate/Importer/File.pm
lib/RT/Migrate/Incremental.pm
lib/RT/Migrate/Serializer.pm
lib/RT/Migrate/Serializer/File.pm
lib/RT/Migrate/Serializer/IncrementalRecord.pm
lib/RT/Migrate/Serializer/IncrementalRecords.pm
lib/RT/ObjectClass.pm
lib/RT/ObjectClasses.pm
lib/RT/ObjectCustomField.pm
lib/RT/ObjectCustomFieldValue.pm
lib/RT/ObjectCustomFieldValues.pm
lib/RT/ObjectCustomFields.pm
lib/RT/ObjectScrip.pm
lib/RT/ObjectScrips.pm
lib/RT/ObjectTopic.pm
lib/RT/ObjectTopics.pm
lib/RT/PlackRunner.pm
lib/RT/Plugin.pm
lib/RT/Pod/HTML.pm
lib/RT/Pod/HTMLBatch.pm
lib/RT/Pod/Search.pm
lib/RT/Principal.pm
lib/RT/Principals.pm
lib/RT/Queue.pm
lib/RT/Queues.pm
lib/RT/Record.pm
lib/RT/Record/AddAndSort.pm
lib/RT/Record/Role.pm
lib/RT/Record/Role/Lifecycle.pm
lib/RT/Record/Role/Links.pm
lib/RT/Record/Role/Rights.pm
lib/RT/Record/Role/Roles.pm
lib/RT/Record/Role/Status.pm
lib/RT/Reminders.pm
lib/RT/Report/Tickets.pm
lib/RT/Report/Tickets/Entry.pm
lib/RT/Rule.pm
lib/RT/Ruleset.pm
lib/RT/SQL.pm
lib/RT/SavedSearch.pm
lib/RT/SavedSearches.pm
lib/RT/Scrip.pm
lib/RT/ScripAction.pm
lib/RT/ScripActions.pm
lib/RT/ScripCondition.pm
lib/RT/ScripConditions.pm
lib/RT/Scrips.pm
lib/RT/Search.pm
lib/RT/Search/ActiveTicketsInQueue.pm
lib/RT/Search/FromSQL.pm
lib/RT/Search/Simple.pm
lib/RT/SearchBuilder.pm
lib/RT/SearchBuilder/AddAndSort.pm
lib/RT/SearchBuilder/Role.pm
lib/RT/SearchBuilder/Role/Roles.pm
lib/RT/SharedSetting.pm
lib/RT/SharedSettings.pm
lib/RT/Shredder.pm
lib/RT/Shredder/ACE.pm
lib/RT/Shredder/Attachment.pm
lib/RT/Shredder/CachedGroupMember.pm
lib/RT/Shredder/Constants.pm
lib/RT/Shredder/CustomField.pm
lib/RT/Shredder/CustomFieldValue.pm
lib/RT/Shredder/Dependencies.pm
lib/RT/Shredder/Dependency.pm
lib/RT/Shredder/Exceptions.pm
lib/RT/Shredder/Group.pm
lib/RT/Shredder/GroupMember.pm
lib/RT/Shredder/Link.pm
lib/RT/Shredder/ObjectCustomFieldValue.pm
lib/RT/Shredder/POD.pm
lib/RT/Shredder/Plugin.pm
lib/RT/Shredder/Plugin/Attachments.pm
lib/RT/Shredder/Plugin/Base.pm
lib/RT/Shredder/Plugin/Base/Dump.pm
lib/RT/Shredder/Plugin/Base/Search.pm
lib/RT/Shredder/Plugin/Objects.pm
lib/RT/Shredder/Plugin/SQLDump.pm
lib/RT/Shredder/Plugin/Summary.pm
lib/RT/Shredder/Plugin/Tickets.pm
lib/RT/Shredder/Plugin/Users.pm
lib/RT/Shredder/Principal.pm
lib/RT/Shredder/Queue.pm
lib/RT/Shredder/Record.pm
lib/RT/Shredder/Scrip.pm
lib/RT/Shredder/ScripAction.pm
lib/RT/Shredder/ScripCondition.pm
lib/RT/Shredder/Template.pm
lib/RT/Shredder/Ticket.pm
lib/RT/Shredder/Transaction.pm
lib/RT/Shredder/User.pm
lib/RT/Squish.pm
lib/RT/Squish/CSS.pm
lib/RT/Squish/JS.pm
lib/RT/System.pm
lib/RT/Template.pm
lib/RT/Templates.pm
lib/RT/Test.pm
lib/RT/Test/Apache.pm
lib/RT/Test/Email.pm
lib/RT/Test/GnuPG.pm
lib/RT/Test/SMIME.pm
lib/RT/Test/Shredder.pm
lib/RT/Test/Web.pm
lib/RT/Ticket.pm
lib/RT/Tickets.pm
lib/RT/Topic.pm
lib/RT/Topics.pm
lib/RT/Transaction.pm
lib/RT/Transactions.pm
lib/RT/URI.pm
lib/RT/URI/a.pm
lib/RT/URI/base.pm
lib/RT/URI/fsck_com_article.pm
lib/RT/URI/fsck_com_rt.pm
lib/RT/URI/t.pm
lib/RT/User.pm
lib/RT/Users.pm
lib/RT/Util.pm
local/bin/rt-count [changed mode: 0644->0755]
sbin/rt-attributes-viewer
sbin/rt-clean-sessions
sbin/rt-dump-metadata
sbin/rt-email-dashboards
sbin/rt-email-digest
sbin/rt-email-group-admin
sbin/rt-fulltext-indexer
sbin/rt-importer [new file with mode: 0755]
sbin/rt-preferences-viewer
sbin/rt-serializer [new file with mode: 0755]
sbin/rt-server
sbin/rt-server.fcgi
sbin/rt-session-viewer
sbin/rt-setup-database
sbin/rt-setup-fulltext-index
sbin/rt-shredder
sbin/rt-test-dependencies
sbin/rt-validate-aliases
sbin/rt-validator
sbin/standalone_httpd
share/html/Admin/Articles/Classes/CustomFields.html
share/html/Admin/Articles/Classes/GroupRights.html
share/html/Admin/Articles/Classes/Modify.html
share/html/Admin/Articles/Classes/Objects.html
share/html/Admin/Articles/Classes/Topics.html
share/html/Admin/Articles/Classes/UserRights.html
share/html/Admin/Articles/Classes/index.html
share/html/Admin/Articles/Elements/Topics
share/html/Admin/Articles/index.html
share/html/Admin/CustomFields/GroupRights.html
share/html/Admin/CustomFields/Modify.html
share/html/Admin/CustomFields/Objects.html
share/html/Admin/CustomFields/UserRights.html
share/html/Admin/CustomFields/index.html
share/html/Admin/Elements/AddCustomFieldValue
share/html/Admin/Elements/ConfigureDashboardsInMenu
share/html/Admin/Elements/ConfigureMyRT
share/html/Admin/Elements/EditCustomField
share/html/Admin/Elements/EditCustomFieldValues
share/html/Admin/Elements/EditCustomFieldValuesSource
share/html/Admin/Elements/EditCustomFields
share/html/Admin/Elements/EditQueueWatcherGroup
share/html/Admin/Elements/EditQueueWatchers
share/html/Admin/Elements/EditRights
share/html/Admin/Elements/EditRightsCategoryTabs
share/html/Admin/Elements/EditScrips
share/html/Admin/Elements/EditTemplates
share/html/Admin/Elements/Header
share/html/Admin/Elements/LoggingSummary
share/html/Admin/Elements/MembershipsPage
share/html/Admin/Elements/ModifyTemplate
share/html/Admin/Elements/Portal
share/html/Admin/Elements/SelectCustomField
share/html/Admin/Elements/SelectCustomFieldLookupType
share/html/Admin/Elements/SelectCustomFieldRenderType
share/html/Admin/Elements/SelectCustomFieldType
share/html/Admin/Elements/SelectGroups
share/html/Admin/Elements/SelectNewGroupMembers
share/html/Admin/Elements/SelectScripAction
share/html/Admin/Elements/SelectScripCondition
share/html/Admin/Elements/SelectStage
share/html/Admin/Elements/SelectStageForAdded
share/html/Admin/Elements/SelectUsers
share/html/Admin/Elements/ShowKeyInfo
share/html/Admin/Elements/UpgradeHistory
share/html/Admin/Elements/UpgradeHistoryRow
share/html/Admin/Global/CustomFields/Class-Article.html
share/html/Admin/Global/CustomFields/Groups.html
share/html/Admin/Global/CustomFields/Queue-Tickets.html
share/html/Admin/Global/CustomFields/Queue-Transactions.html
share/html/Admin/Global/CustomFields/Queues.html
share/html/Admin/Global/CustomFields/Users.html
share/html/Admin/Global/CustomFields/index.html
share/html/Admin/Global/DashboardsInMenu.html
share/html/Admin/Global/GroupRights.html
share/html/Admin/Global/MyRT.html
share/html/Admin/Global/Scrips.html
share/html/Admin/Global/Template.html
share/html/Admin/Global/Templates.html
share/html/Admin/Global/Topics.html
share/html/Admin/Global/UserRights.html
share/html/Admin/Global/index.html
share/html/Admin/Groups/GroupRights.html
share/html/Admin/Groups/History.html
share/html/Admin/Groups/Members.html
share/html/Admin/Groups/Memberships.html
share/html/Admin/Groups/Modify.html
share/html/Admin/Groups/UserRights.html
share/html/Admin/Groups/index.html
share/html/Admin/Queues/CustomField.html
share/html/Admin/Queues/CustomFields.html
share/html/Admin/Queues/GroupRights.html
share/html/Admin/Queues/History.html
share/html/Admin/Queues/Modify.html
share/html/Admin/Queues/People.html
share/html/Admin/Queues/Scrips.html
share/html/Admin/Queues/Template.html
share/html/Admin/Queues/Templates.html
share/html/Admin/Queues/UserRights.html
share/html/Admin/Queues/index.html
share/html/Admin/Scrips/Create.html
share/html/Admin/Scrips/Elements/EditBasics
share/html/Admin/Scrips/Elements/EditCustomCode
share/html/Admin/Scrips/Elements/SelectTemplate
share/html/Admin/Scrips/Modify.html
share/html/Admin/Scrips/Objects.html
share/html/Admin/Scrips/index.html
share/html/Admin/Tools/Configuration.html
share/html/Admin/Tools/Queries.html
share/html/Admin/Tools/Shredder/Dumps/dhandler
share/html/Admin/Tools/Shredder/Elements/DumpFileLink
share/html/Admin/Tools/Shredder/Elements/Error/NoRights
share/html/Admin/Tools/Shredder/Elements/Error/NoStorage
share/html/Admin/Tools/Shredder/Elements/Object/RT--Attachment
share/html/Admin/Tools/Shredder/Elements/Object/RT--Ticket
share/html/Admin/Tools/Shredder/Elements/Object/RT--User
share/html/Admin/Tools/Shredder/Elements/ObjectCheckBox
share/html/Admin/Tools/Shredder/Elements/PluginArguments
share/html/Admin/Tools/Shredder/Elements/PluginHelp
share/html/Admin/Tools/Shredder/Elements/SelectObjects
share/html/Admin/Tools/Shredder/Elements/SelectPlugin
share/html/Admin/Tools/Shredder/autohandler
share/html/Admin/Tools/Shredder/index.html
share/html/Admin/Tools/Theme.html
share/html/Admin/Tools/index.html
share/html/Admin/Users/CustomFields.html
share/html/Admin/Users/DashboardsInMenu.html
share/html/Admin/Users/History.html
share/html/Admin/Users/Keys.html
share/html/Admin/Users/Memberships.html
share/html/Admin/Users/Modify.html
share/html/Admin/Users/MyRT.html
share/html/Admin/Users/index.html
share/html/Admin/autohandler
share/html/Admin/index.html
share/html/Approvals/Display.html
share/html/Approvals/Elements/Approve
share/html/Approvals/Elements/PendingMyApproval
share/html/Approvals/Elements/ShowDependency
share/html/Approvals/autohandler
share/html/Approvals/index.html
share/html/Articles/Article/Delete.html
share/html/Articles/Article/Display.html
share/html/Articles/Article/Edit.html
share/html/Articles/Article/Elements/EditBasics
share/html/Articles/Article/Elements/EditCustomFields
share/html/Articles/Article/Elements/EditLinks
share/html/Articles/Article/Elements/EditTopics
share/html/Articles/Article/Elements/LinkEntryInstructions
share/html/Articles/Article/Elements/Preformatted
share/html/Articles/Article/Elements/SearchByCustomField
share/html/Articles/Article/Elements/SelectSavedSearches
share/html/Articles/Article/Elements/SelectSearchPrivacy
share/html/Articles/Article/Elements/ShowLinks
share/html/Articles/Article/Elements/ShowSavedSearches
share/html/Articles/Article/Elements/ShowSearchCriteria
share/html/Articles/Article/Elements/ShowTopics
share/html/Articles/Article/ExtractFromTicket.html
share/html/Articles/Article/ExtractIntoClass.html
share/html/Articles/Article/ExtractIntoTopic.html
share/html/Articles/Article/History.html
share/html/Articles/Article/PreCreate.html
share/html/Articles/Article/Search.html
share/html/Articles/Elements/BeforeMessageBox
share/html/Articles/Elements/CheckSkipCreate
share/html/Articles/Elements/CreateArticle
share/html/Articles/Elements/GotoArticle
share/html/Articles/Elements/IncludeArticle
share/html/Articles/Elements/MaybeNeedsSetup
share/html/Articles/Elements/NeedsSetup
share/html/Articles/Elements/NewestArticles
share/html/Articles/Elements/QuickSearch
share/html/Articles/Elements/SelectClass
share/html/Articles/Elements/ShowTopic
share/html/Articles/Elements/ShowTopicLink
share/html/Articles/Elements/SubjectOverride
share/html/Articles/Elements/UpdatedArticles
share/html/Articles/Topics.html
share/html/Articles/index.html
share/html/Dashboards/Elements/DashboardsForObject
share/html/Dashboards/Elements/Deleted
share/html/Dashboards/Elements/HiddenSearches
share/html/Dashboards/Elements/ListOfDashboards
share/html/Dashboards/Elements/SelectPrivacy
share/html/Dashboards/Elements/ShowDashboards
share/html/Dashboards/Elements/ShowPortlet/component
share/html/Dashboards/Elements/ShowPortlet/dashboard
share/html/Dashboards/Elements/ShowPortlet/search
share/html/Dashboards/Modify.html
share/html/Dashboards/Queries.html
share/html/Dashboards/Render.html
share/html/Dashboards/Subscription.html
share/html/Dashboards/dhandler
share/html/Dashboards/index.html
share/html/Download/CustomFieldValue/dhandler
share/html/Elements/AddLinks
share/html/Elements/BulkCustomFields
share/html/Elements/BulkLinks
share/html/Elements/CSRF
share/html/Elements/Callback
share/html/Elements/Checkbox
share/html/Elements/CollectionAsTable/Header
share/html/Elements/CollectionAsTable/ParseFormat
share/html/Elements/CollectionAsTable/Row
share/html/Elements/CollectionList
share/html/Elements/CollectionListPaging
share/html/Elements/ColumnMap
share/html/Elements/CreateTicket
share/html/Elements/Crypt/KeyIssues
share/html/Elements/Crypt/SelectKeyForEncryption
share/html/Elements/Crypt/SelectKeyForSigning
share/html/Elements/Crypt/SignEncryptWidget
share/html/Elements/CryptStatus
share/html/Elements/Dashboards
share/html/Elements/EditCustomField
share/html/Elements/EditCustomFieldAutocomplete
share/html/Elements/EditCustomFieldBinary
share/html/Elements/EditCustomFieldCombobox
share/html/Elements/EditCustomFieldCustomGroupings
share/html/Elements/EditCustomFieldDate
share/html/Elements/EditCustomFieldDateTime
share/html/Elements/EditCustomFieldFreeform
share/html/Elements/EditCustomFieldIPAddress
share/html/Elements/EditCustomFieldIPAddressRange
share/html/Elements/EditCustomFieldImage
share/html/Elements/EditCustomFieldSelect
share/html/Elements/EditCustomFieldText
share/html/Elements/EditCustomFieldWikitext
share/html/Elements/EditCustomFields
share/html/Elements/EditLinks
share/html/Elements/EditPassword
share/html/Elements/EditTimeValue
share/html/Elements/EmailInput
share/html/Elements/Error
share/html/Elements/FindUser
share/html/Elements/FoldStanzaJS
share/html/Elements/Footer
share/html/Elements/Framekiller
share/html/Elements/GotoTicket
share/html/Elements/GotoUser
share/html/Elements/Header
share/html/Elements/HeaderJavascript
share/html/Elements/JavascriptConfig
share/html/Elements/ListActions
share/html/Elements/ListMenu
share/html/Elements/Login
share/html/Elements/LoginHelp
share/html/Elements/LoginRedirectWarning
share/html/Elements/Logo
share/html/Elements/MakeClicky
share/html/Elements/Menu
share/html/Elements/MessageBox
share/html/Elements/MyAdminQueues
share/html/Elements/MyRT
share/html/Elements/MyReminders
share/html/Elements/MySupportQueues
share/html/Elements/PageLayout
share/html/Elements/PersonalQuickbar
share/html/Elements/QueriesAsComment
share/html/Elements/QueryString
share/html/Elements/QueueSummaryByLifecycle
share/html/Elements/QueueSummaryByStatus
share/html/Elements/QuickCreate
share/html/Elements/Quicksearch
share/html/Elements/RT__Article/ColumnMap
share/html/Elements/RT__Class/ColumnMap
share/html/Elements/RT__CustomField/ColumnMap
share/html/Elements/RT__Dashboard/ColumnMap
share/html/Elements/RT__Group/ColumnMap
share/html/Elements/RT__Queue/ColumnMap
share/html/Elements/RT__SavedSearch/ColumnMap
share/html/Elements/RT__Scrip/ColumnMap
share/html/Elements/RT__Template/ColumnMap
share/html/Elements/RT__Ticket/ColumnMap
share/html/Elements/RT__User/ColumnMap
share/html/Elements/Refresh
share/html/Elements/RefreshHomepage
share/html/Elements/SavedSearches
share/html/Elements/ScrubHTML
share/html/Elements/Section
share/html/Elements/SelectAttachmentField
share/html/Elements/SelectBoolean
share/html/Elements/SelectCustomFieldOperator
share/html/Elements/SelectCustomFieldValue
share/html/Elements/SelectDate
share/html/Elements/SelectDateRelation
share/html/Elements/SelectDateType
share/html/Elements/SelectEqualityOperator
share/html/Elements/SelectGroups
share/html/Elements/SelectIPRelation
share/html/Elements/SelectLang
share/html/Elements/SelectMatch
share/html/Elements/SelectNewTicketQueue
share/html/Elements/SelectObject
share/html/Elements/SelectOwner
share/html/Elements/SelectOwnerAutocomplete
share/html/Elements/SelectOwnerDropdown
share/html/Elements/SelectPriority
share/html/Elements/SelectQueue
share/html/Elements/SelectResultsPerPage
share/html/Elements/SelectStatus
share/html/Elements/SelectTimeUnits
share/html/Elements/SelectTimezone
share/html/Elements/SelectUsers
share/html/Elements/SelectWatcherType
share/html/Elements/SetupSessionCookie
share/html/Elements/ShowCustomFieldBinary
share/html/Elements/ShowCustomFieldCustomGroupings
share/html/Elements/ShowCustomFieldDate
share/html/Elements/ShowCustomFieldDateTime
share/html/Elements/ShowCustomFieldImage
share/html/Elements/ShowCustomFieldText
share/html/Elements/ShowCustomFieldWikitext
share/html/Elements/ShowCustomFields
share/html/Elements/ShowHistory
share/html/Elements/ShowLink
share/html/Elements/ShowLinks
share/html/Elements/ShowLinksOfType
share/html/Elements/ShowMemberships
share/html/Elements/ShowMessageHeaders
share/html/Elements/ShowMessageStanza
share/html/Elements/ShowPrincipal
share/html/Elements/ShowRecord
share/html/Elements/ShowRelationLabel
share/html/Elements/ShowReminders
share/html/Elements/ShowSearch
share/html/Elements/ShowTransaction
share/html/Elements/ShowTransactionAttachments
share/html/Elements/ShowUser
share/html/Elements/ShowUserEmailFrequency
share/html/Elements/SimpleSearch
share/html/Elements/Submit
share/html/Elements/Tabs
share/html/Elements/TicketList
share/html/Elements/TitleBox
share/html/Elements/TitleBoxEnd
share/html/Elements/TitleBoxStart
share/html/Elements/ValidateCustomFields
share/html/Elements/WidgetBar
share/html/Errors/WebRemoteUser/Deauthorized
share/html/Errors/WebRemoteUser/NoInternalUser
share/html/Errors/WebRemoteUser/NoRemoteUser
share/html/Errors/WebRemoteUser/UserAutocreateDefaultsOnLogin
share/html/Errors/WebRemoteUser/Wrapper
share/html/Helpers/Autocomplete/CustomFieldValues
share/html/Helpers/Autocomplete/Groups
share/html/Helpers/Autocomplete/Owners
share/html/Helpers/Autocomplete/Tickets
share/html/Helpers/Autocomplete/Users
share/html/Helpers/Autocomplete/autohandler
share/html/Helpers/TicketHistory
share/html/Helpers/Toggle/ShowRequestor
share/html/Helpers/Toggle/TicketBookmark
share/html/Helpers/UserInfo
share/html/Helpers/autohandler
share/html/Install/Basics.html
share/html/Install/DatabaseDetails.html
share/html/Install/DatabaseType.html
share/html/Install/Elements/Errors
share/html/Install/Elements/Wrapper
share/html/Install/Finish.html
share/html/Install/Global.html
share/html/Install/Initialize.html
share/html/Install/Sendmail.html
share/html/Install/autohandler
share/html/Install/index.html
share/html/NoAuth/Helpers/CustomLogo/dhandler
share/html/NoAuth/Login.html
share/html/NoAuth/Logout.html
share/html/NoAuth/RichText/autohandler
share/html/NoAuth/css/aileron/AfterMenus
share/html/NoAuth/css/aileron/InHeader
share/html/NoAuth/css/autohandler
share/html/NoAuth/css/ballard/InHeader
share/html/NoAuth/css/dhandler
share/html/NoAuth/css/rudder/AfterMenus
share/html/NoAuth/css/rudder/InHeader
share/html/NoAuth/css/web2/AfterMenus
share/html/NoAuth/css/web2/InHeader
share/html/NoAuth/iCal/dhandler
share/html/NoAuth/js/autohandler
share/html/NoAuth/js/dhandler
share/html/NoAuth/rss/dhandler
share/html/Prefs/DashboardsInMenu.html
share/html/Prefs/MyRT.html
share/html/Prefs/Other.html
share/html/Prefs/Quicksearch.html
share/html/Prefs/Search.html
share/html/Prefs/SearchOptions.html
share/html/REST/1.0/Forms/attachment/default
share/html/REST/1.0/Forms/group/customfields
share/html/REST/1.0/Forms/group/default
share/html/REST/1.0/Forms/group/ns
share/html/REST/1.0/Forms/queue/customfields
share/html/REST/1.0/Forms/queue/default
share/html/REST/1.0/Forms/queue/ns
share/html/REST/1.0/Forms/queue/ticketcustomfields
share/html/REST/1.0/Forms/ticket/attachments
share/html/REST/1.0/Forms/ticket/comment
share/html/REST/1.0/Forms/ticket/default
share/html/REST/1.0/Forms/ticket/history
share/html/REST/1.0/Forms/ticket/links
share/html/REST/1.0/Forms/ticket/merge
share/html/REST/1.0/Forms/ticket/take
share/html/REST/1.0/Forms/transaction/default
share/html/REST/1.0/Forms/user/default
share/html/REST/1.0/Forms/user/ns
share/html/REST/1.0/NoAuth/mail-gateway
share/html/REST/1.0/autohandler
share/html/REST/1.0/dhandler
share/html/REST/1.0/logout
share/html/REST/1.0/search/dhandler
share/html/REST/1.0/ticket/comment
share/html/REST/1.0/ticket/link
share/html/REST/1.0/ticket/merge
share/html/Search/Article.html
share/html/Search/Build.html
share/html/Search/Bulk.html
share/html/Search/Chart
share/html/Search/Chart.html
share/html/Search/Edit.html
share/html/Search/Elements/Article
share/html/Search/Elements/BuildFormatString
share/html/Search/Elements/Chart
share/html/Search/Elements/ChartTable
share/html/Search/Elements/ConditionRow
share/html/Search/Elements/DisplayOptions
share/html/Search/Elements/EditFormat
share/html/Search/Elements/EditQuery
share/html/Search/Elements/EditSearches
share/html/Search/Elements/EditSort
share/html/Search/Elements/Graph
share/html/Search/Elements/NewListActions
share/html/Search/Elements/PickBasics
share/html/Search/Elements/PickCFs
share/html/Search/Elements/PickCriteria
share/html/Search/Elements/PickObjectCFs
share/html/Search/Elements/PickTicketCFs
share/html/Search/Elements/ResultsRSSView
share/html/Search/Elements/SearchPrivacy
share/html/Search/Elements/SearchesForObject
share/html/Search/Elements/SelectAndOr
share/html/Search/Elements/SelectChartFunction
share/html/Search/Elements/SelectChartType
share/html/Search/Elements/SelectGroup
share/html/Search/Elements/SelectGroupBy
share/html/Search/Elements/SelectLinks
share/html/Search/Elements/SelectPersonType
share/html/Search/Elements/SelectSearchObject
share/html/Search/Elements/SelectSearchesForObjects
share/html/Search/Results.html
share/html/Search/Results.rdf
share/html/Search/Results.tsv
share/html/Search/Simple.html
share/html/Search/index.html
share/html/SelfService/Article/Display.html
share/html/SelfService/Article/Search.html
share/html/SelfService/Article/autohandler
share/html/SelfService/Attachment/dhandler
share/html/SelfService/Closed.html
share/html/SelfService/Create.html
share/html/SelfService/CreateTicketInQueue.html
share/html/SelfService/Display.html
share/html/SelfService/Elements/GotoTicket
share/html/SelfService/Elements/Header
share/html/SelfService/Elements/MyRequests
share/html/SelfService/Elements/SearchArticle
share/html/SelfService/Helpers/Autocomplete/CustomFieldValues
share/html/SelfService/Helpers/Autocomplete/Users
share/html/SelfService/Prefs.html
share/html/SelfService/Update.html
share/html/SelfService/index.html
share/html/Ticket/Attachment/WithHeaders/dhandler
share/html/Ticket/Attachment/dhandler
share/html/Ticket/Create.html
share/html/Ticket/Crypt.html
share/html/Ticket/Display.html
share/html/Ticket/Elements/AddAttachments
share/html/Ticket/Elements/AddWatchers
share/html/Ticket/Elements/Bookmark
share/html/Ticket/Elements/ClickToShowHistory
share/html/Ticket/Elements/DelayShowHistory
share/html/Ticket/Elements/EditBasics
share/html/Ticket/Elements/EditCustomFields
share/html/Ticket/Elements/EditDates
share/html/Ticket/Elements/EditMerge
share/html/Ticket/Elements/EditPeople
share/html/Ticket/Elements/EditTransactionCustomFields
share/html/Ticket/Elements/EditWatchers
share/html/Ticket/Elements/LoadTextAttachments
share/html/Ticket/Elements/PreviewScrips
share/html/Ticket/Elements/Reminders
share/html/Ticket/Elements/SelectStatus
share/html/Ticket/Elements/ShowAttachments
share/html/Ticket/Elements/ShowBasics
share/html/Ticket/Elements/ShowCustomFields
share/html/Ticket/Elements/ShowDates
share/html/Ticket/Elements/ShowDependencyStatus
share/html/Ticket/Elements/ShowGroupMembers
share/html/Ticket/Elements/ShowPeople
share/html/Ticket/Elements/ShowPriority
share/html/Ticket/Elements/ShowQueue
share/html/Ticket/Elements/ShowRequestor
share/html/Ticket/Elements/ShowRequestorExtraInfo
share/html/Ticket/Elements/ShowRequestorTickets
share/html/Ticket/Elements/ShowRequestorTicketsActive
share/html/Ticket/Elements/ShowRequestorTicketsAll
share/html/Ticket/Elements/ShowRequestorTicketsInactive
share/html/Ticket/Elements/ShowSimplifiedRecipients
share/html/Ticket/Elements/ShowSummary
share/html/Ticket/Elements/ShowTime
share/html/Ticket/Elements/ShowUpdateStatus
share/html/Ticket/Elements/UpdateCc
share/html/Ticket/Forward.html
share/html/Ticket/Graphs/Elements/EditGraphProperties
share/html/Ticket/Graphs/Elements/ShowGraph
share/html/Ticket/Graphs/Elements/ShowLegends
share/html/Ticket/Graphs/dhandler
share/html/Ticket/Graphs/index.html
share/html/Ticket/History.html
share/html/Ticket/Modify.html
share/html/Ticket/ModifyAll.html
share/html/Ticket/ModifyDates.html
share/html/Ticket/ModifyLinks.html
share/html/Ticket/ModifyPeople.html
share/html/Ticket/Reminders.html
share/html/Ticket/ShowEmailRecord.html
share/html/Ticket/Update.html
share/html/Ticket/autohandler
share/html/Tools/MyDay.html
share/html/Tools/MyReminders.html
share/html/Tools/index.html
share/html/User/Elements/Portlets/ActiveTickets
share/html/User/Elements/Portlets/CreateTicket
share/html/User/Elements/Portlets/ExtraInfo
share/html/User/Elements/Portlets/InactiveTickets
share/html/User/Elements/TicketList
share/html/User/Elements/UserInfo
share/html/User/History.html
share/html/User/Prefs.html
share/html/User/Search.html
share/html/User/Summary.html
share/html/Widgets/BulkEdit
share/html/Widgets/BulkProcess
share/html/Widgets/ComboBox
share/html/Widgets/FinalizeWidgetArguments
share/html/Widgets/Form/Boolean
share/html/Widgets/Form/Integer
share/html/Widgets/Form/Select
share/html/Widgets/Form/String
share/html/Widgets/SavedSearch
share/html/Widgets/SelectionBox
share/html/Widgets/TitleBox
share/html/Widgets/TitleBoxEnd
share/html/Widgets/TitleBoxStart
share/html/autohandler
share/html/dhandler
share/html/index.html
share/html/l
share/html/l_unsafe
share/html/m/_elements/footer
share/html/m/_elements/full_site_link
share/html/m/_elements/header
share/html/m/_elements/login
share/html/m/_elements/menu
share/html/m/_elements/ticket_list
share/html/m/_elements/ticket_menu
share/html/m/_elements/wrapper
share/html/m/dhandler
share/html/m/index.html
share/html/m/logout
share/html/m/ticket/autohandler
share/html/m/ticket/create
share/html/m/ticket/history
share/html/m/ticket/reply
share/html/m/ticket/select_create_queue
share/html/m/ticket/show
share/html/m/tickets/search
share/po/ar.po
share/po/bg.po
share/po/ca.po
share/po/cs.po
share/po/da.po
share/po/de.po
share/po/el.po
share/po/en.po
share/po/en_GB.po
share/po/es.po
share/po/et.po
share/po/eu.po [new file with mode: 0644]
share/po/fi.po
share/po/fr.po
share/po/hr.po
share/po/hu.po
share/po/id.po
share/po/is.po
share/po/it.po
share/po/ja.po
share/po/lt.po
share/po/lv.po
share/po/mk.po
share/po/nb.po
share/po/nl.po
share/po/nn.po
share/po/oc.po
share/po/pl.po
share/po/pt.po
share/po/pt_BR.po
share/po/pt_PT.po
share/po/rt.pot
share/po/ru.po
share/po/sk.po
share/po/sl.po
share/po/sr.po [new file with mode: 0644]
share/po/sv.po
share/po/tr.po
share/po/zh_CN.po
share/po/zh_TW.po
share/static/css/aileron/msie6.css
share/static/css/aileron/ticket-lists.css
share/static/css/ballard/msie6.css
share/static/css/ballard/nav.css
share/static/css/ballard/ticket-lists.css
share/static/css/base/history-folding.css
share/static/css/base/misc.css
share/static/css/base/msie6.css [new file with mode: 0644]
share/static/css/rudder/misc.css
share/static/css/web2/msie6.css
share/static/css/web2/ticket-lists.css
share/static/js/cascaded.js
share/static/js/event-registration.js
share/static/js/forms.js
share/static/js/history-folding.js
share/static/js/late.js
share/static/js/util.js

diff --git a/bin/rt b/bin/rt
index d5a1161..d342b64 100755 (executable)
--- a/bin/rt
+++ b/bin/rt
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -329,32 +329,53 @@ sub list {
         $data{orderby} =~ s/^\+?(.*)/-$1/;
     }
 
-    if (!defined $q) {
-        $q = $config{query}; 
+    $type ||= "ticket";
+
+    if (!defined $q ) {
+        if ( $type eq 'ticket' ) {
+            $q = $config{query};
+        }
+        else {
+            $q = '';
+        }
     }
-    
-    $q =~ s/^#//; # get rid of leading hash
-    if ($q =~ /^\d+$/) {
-        # only digits, must be an id, formulate a correct query
-        $q = "id=$q" if $q =~ /^\d+$/;
-    } else {
-        # a string only, take it as an owner or requestor (quoting done later)
-        $q = "(Owner=$q or Requestor like $q) and $config{query}"
-             if $q =~ /^[\w\-]+$/;
-        # always add a query for a specific queue or (comma separated) queues
-        $queue =~ s/,/ or Queue=/g if $queue;
-        $q .= " and (Queue=$queue)" if $queue and $q and $q !~ /Queue\s*=/i
-            and $q !~ /id\s*=/i;
+
+    if ( $type ne 'ticket' ) {
+        $rawprint = 1;
     }
-    # correctly quote strings in a query
-    $q =~ s/(=|like\s)\s*([^'\d\s]\S*)\b/$1\'$2\'/g;
 
-    $type ||= "ticket";
-    unless ($type && defined $q) {
+    unless (defined $q) {
         my $item = $type ? "query string" : "object type";
         whine "No $item specified.";
         $bad = 1;
     }
+
+    $q =~ s/^#//; # get rid of leading hash
+    if ( $type eq 'ticket' ) {
+        if ( $q =~ /^\d+$/ ) {
+
+            # only digits, must be an id, formulate a correct query
+            $q = "id=$q" if $q =~ /^\d+$/;
+        }
+        else {
+
+          # a string only, take it as an owner or requestor (quoting done later)
+            $q = "(Owner=$q or Requestor like $q) and $config{query}"
+              if $q =~ /^[\w\-]+$/;
+
+           # always add a query for a specific queue or (comma separated) queues
+            $queue =~ s/,/ or Queue=/g if $queue;
+            $q .= " and (Queue=$queue)"
+              if $queue
+                  and $q
+                  and $q !~ /Queue\s*=/i
+                  and $q !~ /id\s*=/i;
+        }
+
+        # correctly quote strings in a query
+        $q =~ s/(=|like\s)\s*([^'\d\s]\S*)\b/$1\'$2\'/g;
+    }
+
     #return help("list", $type) if $bad;
     return suggest_help("list", $type, $bad) if $bad;
 
@@ -2198,13 +2219,14 @@ Text:
     Displays a list of objects matching the specified conditions.
     ("ls", "list", and "search" are synonyms.)
 
-    Conditions are expressed in the SQL-like syntax used internally by
-    RT. (For more information, see "rt help query".) The query string
-    must be supplied as one argument.
+    The query string must be supplied as one argument.
+
+    if on tickets, query is in the SQL-like syntax used internally by
+    RT. (For more information, see "rt help query".), otherwise, query
+    is plain string with format "FIELD OP VALUE", e.g. "Name = General".
 
-    (Right now, the server doesn't support listing anything but tickets.
-    Other types will be supported in future; this client will be able to
-    take advantage of that support without any changes.)
+    if query string is absent, we limit to privileged ones on users and
+    user defined ones on groups automatically.
 
     Options:
 
@@ -2235,6 +2257,9 @@ Text:
         rt ls -t ticket "Subject like '[PATCH]%'"
         rt ls -q systems
         rt ls -f owner,subject
+        rt ls -t queue 'Name = General'
+        rt ls -t user 'EmailAddress like foo@bar.com'
+        rt ls -t group 'Name like foo'
 
 --
 
index c8e0798..1c081e7 100755 (executable)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index deccd70..4e5cc34 100755 (executable)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index ec7fdcc..4bc7114 100644 (file)
@@ -288,7 +288,7 @@ fix them.  To report a bug, send email to <rt-bugs@bestpractical.com>.
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index cfe01df..ba71777 100644 (file)
@@ -168,11 +168,7 @@ Change this line to read:
     been assigned an ID of { $Ticket->SubjectTag }."
 
 If you were previously using RT::Extension::BrandedQueues, you MUST uninstall
-it before upgrading. In addition, you must run the
-'etc/upgrade/3.8-branded-queues-extension' perl script.  This will
-convert the extension's configuration into the new format.  Finally, in
-templates where you were using the Tag method ($Ticket->QueueObj->Tag),
-you will need to replace it with $Ticket->SubjectTag
+it before upgrading.
 
 RT::Action::LinearEscalate extension has been integrated into core, so you
 MUST uninstall it before upgrading.
index 0e458fa..dd21c25 100644 (file)
@@ -300,6 +300,14 @@ on C<configure> enabling these in F<RT_Config.pm> implicitly will need
 to pass C<--enable-gpg> to C<configure>, or alter their
 C<RT_SiteConfig.pm> to enable the functionality explicitly.
 
+=item *
+
+In TicketSQL, "Starts = '1970-01-01'" will no longer find tickets with
+no Starts date set.  Instead, use "Starts IS NULL".  As a direct
+consequence, "Starts < 'today'" will no longer also find tickets with no
+Starts date; use "Starts < 'today' OR Starts IS NULL" to have the
+equivalent results in RT 4.2.
+
 =back
 
 =cut
diff --git a/docs/automating_rt.pod b/docs/automating_rt.pod
new file mode 100644 (file)
index 0000000..5636d41
--- /dev/null
@@ -0,0 +1,234 @@
+=head1 Automating Tasks in RT
+
+As RT tickets are created, worked on, and resolved, there are sometimes
+updates or notifications that have defined rules and could be automatic.
+These might include increasing ticket priority over time so tickets don't
+get lost, resolving old tickets that haven't had any activity for a period of
+time, or sending email notifications based on some ticket criteria like
+being 3 days old and still having a status of new.
+
+The tool for automating RT tasks is L<rt-crontool>. It's designed to be
+run from the cron scheduler and accepts a set of parameters that define
+what RT objects it should operate on and what it should do. The sections
+below describe some common L<rt-crontool> tasks as examples of the
+different ways you can automate tasks.
+
+All of the options for L<rt-crontool> are documented with the tool itself:
+
+    $ perldoc bin/rt-crontool
+
+and on the Best Practical web site.
+
+=head2 Running C<rt-crontool>
+
+As you'll see in the examples below, this tool gives full access to RT.
+To manage the scope of changes that could be performed by the tool, we
+recommended creating a dedicated unix user with limited privileges for
+this purpose. Then create a user in RT with just enough access to
+perform the changes you need to automate, and set the "Unix login" field
+of the RT user to the username of the unix user you created. See the
+L<rt-crontool> documentation for more information.
+
+=head2 Testing Tips
+
+When setting up a new automated crontool job, keep in mind that you might be
+modifying a large number of tickets, especially the first time you run it.
+Changes to tickets can trigger scrips just like the same change made via
+the user interface. For example, changing the status to resolved will trigger
+the 'On Resolve' scrips, which often means sending email. Depending on the
+modification, you could end up sending a lot of email or triggering other
+actions.
+
+You can test your TicketSQL search queries in the RT web interface
+(using the Advanced tab of ticket search), and use bulk update if you
+want to prepare things for your new automated job. You can also disable
+scrips which you wish to avoid, or turn off outgoing mail with the
+L<RT_Config.pm/"$MailCommand"> option. This can be useful if you want to
+clean up older tickets without sending notifications to requestors for
+tickets that were resolved years ago.
+
+To help with debugging, the C<--verbose> option will give you more output.
+The C<--log> option accepts all of the valid log levels for RT and allows
+you to change the logging level just for the automated job. While testing,
+it's often convenient to set:
+
+    --log debug
+
+to see what's happening.
+
+=head1 A Simple Search
+
+Starting with a simple example, this command performs a search and
+displays output, but doesn't do anything to the returned tickets.
+This can be useful for safely testing search criteria.
+
+    bin/rt-crontool --search RT::Search::FromSQL \
+        --search-arg "Owner = 'root'" \
+        --action RT::Action \
+        --verbose \
+        --log debug
+
+The C<--search> argument sets the search module RT should use, in this
+case L<RT::Search::FromSQL> which processes TicketSQL. The second
+argument, C<--search-arg>, is the search query to use. These are
+the same queries you create in the RT search interface, so can use
+the RT web UI to refine your queries before setting up your job.
+
+The C<--action> argument is set to L<RT::Action> which is the base class
+for RT actions. Since this class doesn't perform any action itself, this
+command will just output the results of the TicketSQL search.
+
+=head1 Auto-resolve Aged Tickets
+
+You can auto-set status based on any criteria you can define in
+a TicketSQL statement. For example, this command will resolve all
+active tickets that haven't been acted on in a month or more:
+
+    bin/rt-crontool --search RT::Search::FromSQL \
+        --search-arg "(Status != 'resolved' AND Status != 'rejected') \
+                       AND LastUpdated <= '1 month ago'" \
+        --action RT::Action::SetStatus \
+        --action-arg resolved
+
+The search is similar to the previous example with a slightly more
+complicated search argument.  Note that since LastUpdated is treated as
+a timestamp (which increases over time) C<LastUpdated <= '1 month ago'>
+means "the timestamp when it was updated is before the timestamp one
+month ago" and not "updated less than a month ago."
+
+The C<--action> in this case uses the L<RT::Action::SetStatus> module
+with an C<--action-arg> of C<resolved>.  For each of the tickets
+returned from the search query, the status is set to resolved. When
+setting up automated tasks, you can use actions provided as part of RT,
+actions available from extensions, or actions you create yourself.
+
+As noted previously, the normal RT rules apply when running actions
+with L<rt-crontool>, so for this example applicable 'On Resolve'
+scrips will run. If a ticket has unresolved dependencies, it will
+log an error since tickets can't be resolved until dependencies are
+resolved. Also, the status argument must be valid for the lifecycle of
+the selected tickets, and the transition must be allowed.
+
+=head1 Commenting and Corresponding on a Ticket
+
+The following command records a comment on all tickets returned from the
+query -- in this case, tickets that are new and unowned after 3 days.
+
+    bin/rt-crontool --search RT::Search::FromSQL \
+        --search-arg "Owner = 'Nobody' AND Status = 'new' \
+                      AND Created < '3 days ago'" \
+        --action RT::Action::RecordComment \
+        --template 'Unowned tickets'
+
+The L<RT::Action::RecordComment> action does just that, it records a
+comment just like replying to a comment email or commenting in the
+RT UI. It uses the global RT template defined by C<--template>, so you
+could put whatever you like in that template. For example:
+
+    Subject: {$Ticket->id} new and unowned
+    RT-Send-Cc: support-backup@example.com
+
+    Ticket {$Ticket->id} is still new and unowned after 3 days!
+
+You can set up a similar command to send a reply rather than a comment
+using the L<RT::Action::RecordCorrespondence> module.
+
+=head1 Sending Notifications
+
+While the example above sends notifications as a side-effect of recording
+a comment, you can also send notifications directly.
+
+    bin/rt-crontool --search RT::Search::FromSQL \
+        --search-arg "(Status != 'resolved' AND Status != 'rejected') \
+                      AND Queue = 'Project Work'" \
+        --condition RT::Condition::Overdue \
+        --action RT::Action::NotifyGroup \
+        --action-arg 'project-manager@example.com' \
+        --template 'Overdue task'
+
+This example shows the C<--condition> argument and the
+L<RT::Condition::Overdue> module, which returns true if the current
+time (the time the cron job is running) is past the Due date on the
+ticket. Like the C<--action> argument, you can use conditions
+provided with RT, added from extensions, or conditions you have
+created.
+
+L<RT::Action::NotifyGroup>, despite the "Group" in the name, can accept a
+bare email address or list of addresses as the action argument and it will
+send mail to them. A combination of email addresses and group names separated
+by commas also works. RT usernames are valid unless they conflict with group
+names.
+
+The action sends email, but unlike comment and correspond above, it
+doesn't record a transaction in the ticket history.
+
+=head1 Escalating Priority
+
+RT has a built-in ticket priority system with priority values from
+0 to 99. Depending on how you configure your queues, you can set 1 as the
+top priority with lower numbers meaning more important, or 99 can be the
+top priority with higher numbers meaning more important. You can set this
+in your queue configuration at Tools -> Configuration -> Queues. On the queue
+configuration page, set "Priority starts at" and "Over time, priority moves
+toward".
+
+Whichever scheme you choose, RT's L<RT::Action::EscalatePriority> can
+escalate the priority over time so tickets that are closer to their due
+date and are still not resolved have priority escalated automatically.
+
+This command escalates tickets in a designated queue:
+
+    bin/rt-crontool --search RT::Search::ActiveTicketsInQueue \
+        --search-arg "General" \
+        --action RT::Action::EscalatePriority
+
+The C<--search-arg> is the name of the queue in which to escalate tickets.
+As shown in previous examples, you can also set your criteria using a
+TicketSQL query as well:
+
+    bin/rt-crontool --search RT::Search::FromSQL \
+        --search-arg "(Status='new' OR Status='open') AND Due > 'Jan 1, 1970'" \
+        --action RT::Action::EscalatePriority
+
+This example will find new and open tickets in all queues, but will skip tickets
+with no explicit due dates set. Maybe you only want to bump the priority on tasks
+that have to be done by a certain date.
+
+L<RT::Action::LinearEscalate> is an alternative escalation module that
+handles the "Due date not set" condition for you. It also offers some
+configuration options to control whether a transaction is recorded on the
+ticket and whether LastUpdated is modified.
+
+=head1 Transactions
+
+Many actions and conditions are also used in RT in scrips and may require
+a transaction in addition to a ticket. For such cases, L<rt-crontool>
+provides a C<--transaction> argument to designate a transaction. Valid
+values are C<first>, C<last>, and C<all> and these are relative to the
+current ticket being processed. C<first> and C<last> are the first and
+last transaction on the ticket. Be careful with the C<all> option since
+it will run the action on all transactions for the ticket.
+
+Since actions and conditions can be used in different contexts, you
+may need to provide a transaction object even if it doesn't seem
+necessary for your automated job. If you're seeing errors about
+a missing transaction, setting C<--transaction> to C<first> or
+C<last> is usually safe and will resolve the error.
+
+You can also target specific transaction types with C<--transation-type>.
+This argument accepts one or more transaction types as a comma-separated
+list.
+
+Using these options together, you can set up a command that sets the
+appropriate transaction object for your conditions and actions. For
+example, if you had an action you wanted to perform based on the content
+of the last reply on stalled tickets, you could do something like:
+
+    bin/rt-crontool --search RT::Search::FromSQL \
+        --search-arg "Status = 'stalled' AND Queue = 'General'" \
+        --action RT::Action::CheckLastCorrespond \
+        --transaction last \
+        --transaction-type Correspond
+
+
+=cut
index 9a6f38b..29ab96b 100644 (file)
@@ -305,8 +305,10 @@ mapping, defining the most sensible mapping you can.
 If you don't provide a mapping, users will see an error when they try to
 move a ticket between queues with different lifecycles but no mapping.
 
-    Set( %Lifecycles, orders => {
-        # ...,
+    Set( %Lifecycles,
+        orders => {
+            # ...
+        },
         __maps__ => {
             'default -> orders' => {
                 'new'  => 'pending',
@@ -340,7 +342,7 @@ to experiment.
             # All the appropriate order statuses
             initial         => [ 'pending' ],
             active          => [ 'processing', 'delivery' ],
-            inactive        => [ 'delivered', 'returned', 'declined' ],
+            inactive        => [ 'delivered', 'returned', 'declined', 'deleted' ],
 
             # Default order statuses for certain actions
             defaults => {
@@ -376,10 +378,6 @@ to experiment.
                     label  => 'Open For Processing',
                     update => 'Comment',
                 },
-                'pending -> delivered' => {
-                    label  => 'Mark as being delivered',
-                    update => 'Comment',
-                },
                 'pending -> declined' => {
                     label  => 'Decline',
                     update => 'Respond',
index 26ca3e9..c7c3762 100644 (file)
@@ -370,11 +370,14 @@ Set($StoreLoops, undef);
 
 C<$MaxAttachmentSize> sets the maximum size (in bytes) of attachments
 stored in the database.  This setting is irrelevant unless one of
-$TruncateLongAttachments or $DropLongAttachments (below) are set.
+$TruncateLongAttachments or $DropLongAttachments (below) are set, B<OR>
+the database is stored in Oracle.  On Oracle, attachments larger than
+this can be fully stored, but will be truncated to this length when
+read.
 
 =cut
 
-Set($MaxAttachmentSize, 10_000_000);
+Set($MaxAttachmentSize, 10_000_000);  # 10M
 
 =item C<$TruncateLongAttachments>
 
@@ -972,6 +975,8 @@ Set(@CSSFiles, qw//);
 This determines how user info is displayed. 'concise' will show the
 first of RealName, Name or EmailAddress that has a value. 'verbose' will
 show EmailAddress, and the first of RealName or Name which is defined.
+The default, 'role', uses 'verbose' for unprivileged users, and the Name
+followed by the RealName for privileged users.
 
 =cut
 
@@ -1297,7 +1302,7 @@ Set ($DefaultSearchResultFormat, qq{
    Owner,
    Priority,
    '__NEWLINE__',
-   '',
+   '__NBSP__',
    '<small>__Requestors__</small>',
    '<small>__CreatedRelative__</small>',
    '<small>__ToldRelative__</small>',
@@ -2467,7 +2472,7 @@ Set(%GnuPGOptions,
 #    'auto-key-locate' => 'keyserver',
 
 # enables the automatic retrieving of keys when verifying signatures
-#    'auto-key-retrieve' => undef,
+#    'keyserver-options' => 'auto-key-retrieve',
 );
 
 =back
index 1688237..7e56e97 100644 (file)
@@ -5,14 +5,13 @@ sub acl {
     my $db_user = RT->Config->Get('DatabaseUser');
     my $db_pass = RT->Config->Get('DatabasePassword');
     unless ( $db_user ) {
-        print STDERR "DatabaseUser option is not defined or empty. Skipping...\n";
+        RT->Logger->warn("DatabaseUser option is not defined or empty. Skipping...");
         return;
     }
     if ( $db_user eq 'root' ) {
-        print STDERR "DatabaseUser is root. Skipping...\n";
+        RT->Logger->warn("DatabaseUser is root. Skipping...");
         return;
     }
-    print "Granting access to $db_user\@'$db_rthost' on $db_name.\n";
     $db_name =~ s/([_%])/\\$1/g;
     return (
         "GRANT SELECT,INSERT,CREATE,INDEX,UPDATE,DELETE
index 2a4a6e9..3de65f4 100644 (file)
@@ -841,7 +841,7 @@ Hour:         { $SubscriptionObj->SubValue('Hour') }
         Name        => 'HomepageSettings',
         Description => 'HomepageSettings',
         Content     => {
-            'body' =>    # loc
+            'body' =>                               # loc_left_pair
               [
                 {
                     type => 'system',
@@ -860,7 +860,7 @@ Hour:         { $SubscriptionObj->SubValue('Hour') }
                     name => 'QuickCreate'           # loc
                 },
               ],
-            'sidebar' =>                            # loc
+            'sidebar' =>                            # loc_left_pair
               [
                 {
                     type => 'component',
index 3669fb3..610a79c 100644 (file)
@@ -22,9 +22,9 @@ CREATE TABLE Queues (
   id INTEGER NOT NULL  AUTO_INCREMENT,
   Name varchar(200) NOT NULL  ,
   Description varchar(255) NULL  ,
-  CorrespondAddress varchar(120) CHARACTER SET ascii NULL,
-  CommentAddress varchar(120) CHARACTER SET ascii NULL,
-  Lifecycle varchar(32) CHARACTER SET ascii NULL,
+  CorrespondAddress varchar(120) NULL,
+  CommentAddress varchar(120) NULL,
+  Lifecycle varchar(32) NULL,
   SubjectTag varchar(120) NULL,
   InitialPriority integer NOT NULL DEFAULT 0  ,
   FinalPriority integer NOT NULL DEFAULT 0  ,
index a694562..34af550 100644 (file)
@@ -26,9 +26,20 @@ our @Final = (
 
 sub gen_scrip_description {
     my $scrip = shift;
-    my $condition = $scrip->ConditionObj->Name
+
+    my $condition;
+    eval{
+      $condition = $scrip->ConditionObj->Name
         || $scrip->ConditionObj->Description
         || ('On Condition #'. $scrip->Condition);
+    };
+
+    if ($@){
+      print STDERR $@;
+      print STDERR "Reference to missing scrip condition found. If you have ScripCondition = 0 in the Scrips table, update with a real condition number.\n";
+      $condition = 'On undefined Condition # 0';
+    }
+
     my $action = $scrip->ActionObj->Name
         || $scrip->ActionObj->Description
         || ('Run Action #'. $scrip->Action);
index 3b81231..7b160d7 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/4.0.18/content b/etc/upgrade/4.0.18/content
new file mode 100644 (file)
index 0000000..64eea9a
--- /dev/null
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+
+our @Initial = (
+    sub {
+        my $attr = RT->System->FirstAttribute('BrandedSubjectTag');
+        return 1 unless $attr;
+        my ( $status, $msg ) = $attr->Delete;
+        unless ( $status ) {
+            RT->Logger->error("Couldn't delete System BrandedSubjectTag: $msg");
+        }
+        return 1;
+    },
+);
diff --git a/etc/upgrade/4.0.19/content b/etc/upgrade/4.0.19/content
new file mode 100644 (file)
index 0000000..31e4d9f
--- /dev/null
@@ -0,0 +1,29 @@
+use strict;
+use warnings;
+
+our @Initial = (
+    sub {
+        use RT::CustomFields;
+        my $cfs = RT::CustomFields->new(RT->SystemUser);
+        $cfs->{'find_disabled_rows'} = 1;
+        $cfs->Limit( FIELD => 'LookupType', VALUE => 'RT::FM::Class-RT::FM::Article' );
+        while ( my $cf = $cfs->Next ) {
+            my ($ret, $msg) = $cf->__Set( Field => 'LookupType', Value => 'RT::Class-RT::Article' );
+            RT->Logger->warning("Update Custom Field LookupType for CF.".$cf->Id." $msg");
+        }
+        return 1;
+    },
+
+    sub {
+        use RT::ObjectCustomFieldValues;
+        my $ocfvs = RT::ObjectCustomFieldValues->new(RT->System);
+        $ocfvs->{'find_expired_rows'} = 1;
+        $ocfvs->Limit( FIELD => 'ObjectType', VALUE => 'RT::FM::Article' );
+        while ( my $ocfv = $ocfvs->Next ) {
+            my ($ret, $msg) = $ocfv->__Set( Field => 'ObjectType', Value => 'RT::Article' );
+            RT->Logger->warning("Updated CF ".$ocfv->__Value('CustomField')." Value for Article ".$ocfv->__Value('ObjectId'));
+        }
+        return 1;
+    },
+);
+
diff --git a/etc/upgrade/4.0.19/schema.mysql b/etc/upgrade/4.0.19/schema.mysql
new file mode 100644 (file)
index 0000000..de28cc9
--- /dev/null
@@ -0,0 +1,5 @@
+ALTER TABLE Users MODIFY EmailAddress varchar(120) CHARACTER SET utf8;
+ALTER TABLE Queues
+    MODIFY Lifecycle varchar(32) CHARACTER SET utf8,
+    MODIFY CorrespondAddress varchar(120) CHARACTER SET utf8,
+    MODIFY CommentAddress varchar(120) CHARACTER SET utf8;
index 180cf0c..4590585 100644 (file)
@@ -11,7 +11,7 @@ CREATE TABLE ObjectScrips (
         LastUpdatedBy   NUMBER(11,0) DEFAULT 0 NOT NULL,
         LastUpdated     DATE
 );
-ALTER TABLE Scrips ADD COLUMN Disabled int2 NOT NULL DEFAULT 0;
+ALTER TABLE Scrips ADD Disabled NUMBER(11,0) DEFAULT 0 NOT NULL;
 
 INSERT INTO ObjectScrips(
     id, Scrip, Stage, ObjectId,
index b4e69a3..0dc53d2 100644 (file)
@@ -5,6 +5,9 @@ $groups->Limit(
     FIELD => 'Name', OPERATOR => '!=', VALUE => 'main.Type', QUOTEVALUE => 0
 );
 $groups->Limit(
+    FIELD => 'Name', OPERATOR => 'IS', VALUE => 'NULL',
+);
+$groups->Limit(
     FIELD => 'Domain',
     VALUE => 'SystemInternal',
     CASESENSITIVE => 0,
index 6ce5646..273779b 100644 (file)
@@ -1 +1 @@
-ALTER TABLE Users ADD COLUMN SMIMECertificate CLOB;
+ALTER TABLE Users ADD SMIMECertificate CLOB;
index d76264f..78db4ae 100644 (file)
@@ -94,13 +94,11 @@ my $dedup = sub {
     );
     foreach my $e (@list) {
         RT->Logger->debug("Checking index on ". $e->{'Column'} ." in ". $e->{'Table'} );
-        my ($index) = $RT::Handle->IndexesThatBeginWith(
+        my (@indexes) = $RT::Handle->IndexesThatBeginWith(
             Table => $e->{'Table'}, Columns => [$e->{'Column'}]
         );
-        $index = undef if $index && @{$index->{'Columns'}}>1;
-        if (
-            $index && $index->{'Unique'}
-            && ($RT::Handle->CaseSensitive? $index->{'CaseInsensitive'}{ lc $e->{'Column'} } : 1 )
+        @indexes = grep {@{$_->{'Columns'}} == 1} @indexes;
+        if (grep {$_->{Unique} && ($RT::Handle->CaseSensitive? $_->{'CaseInsensitive'}{ lc $e->{'Column'} } : 1 ) } @indexes
         ) {
             RT->Logger->debug("Required index exists. Skipping.");
             next;
@@ -108,7 +106,7 @@ my $dedup = sub {
 
         $dedup->( $e->{'Table'}, $e->{'Column'} );
 
-        if ( $index ) {
+        for my $index ( @indexes ) {
             my ($status, $msg) = $RT::Handle->DropIndex(
                 Table => $e->{'Table'}, Name => $index->{'Name'},
             );
@@ -162,7 +160,8 @@ foreach my $table ('Users', 'Tickets') {
         my ($status, $msg) = $RT::Handle->DropIndex(
             Table => $table, Name => $index->{'Name'},
         );
-        RT->Logger->info($msg);
+        my $method = $status ? 'debug' : 'warning';
+        RT->Logger->$method($msg);
     }
 }
 
index 0ed1dda..4cf1bdb 100644 (file)
@@ -6,6 +6,7 @@ our @Initial = (
     sub {
         require RT::Scrips;
         my $scrips = RT::Scrips->new( RT->SystemUser );
+        $scrips->{'find_disabled_rows'} = 1;
         $scrips->UnLimit;
         while ( my $scrip = $scrips->Next ) {
             my $id = $scrip->Template;
index b0b4d4c..648784d 100644 (file)
@@ -1,5 +1,6 @@
 # Template column
 ALTER TABLE Scrips RENAME COLUMN Template TO TemplateOld;
-ALTER TABLE Scrips ADD COLUMN Template VARCHAR2(200) NOT NULL;
-UPDATE TABLE Scrips SET Template = CAST(TemplateOld AS varchar2);
-ALTER TABLE Scrips DROP COLUMN TemplateOld;
\ No newline at end of file
+ALTER TABLE Scrips ADD Template VARCHAR2(200);
+UPDATE Scrips SET Template = CAST(TemplateOld AS varchar2(200));
+ALTER TABLE Scrips MODIFY Template VARCHAR2(200) NOT NULL;
+ALTER TABLE Scrips DROP COLUMN TemplateOld;
diff --git a/etc/upgrade/4.2.1/content b/etc/upgrade/4.2.1/content
new file mode 100644 (file)
index 0000000..64eea9a
--- /dev/null
@@ -0,0 +1,14 @@
+use strict;
+use warnings;
+
+our @Initial = (
+    sub {
+        my $attr = RT->System->FirstAttribute('BrandedSubjectTag');
+        return 1 unless $attr;
+        my ( $status, $msg ) = $attr->Delete;
+        unless ( $status ) {
+            RT->Logger->error("Couldn't delete System BrandedSubjectTag: $msg");
+        }
+        return 1;
+    },
+);
diff --git a/etc/upgrade/4.2.2/content b/etc/upgrade/4.2.2/content
new file mode 100644 (file)
index 0000000..762289a
--- /dev/null
@@ -0,0 +1,59 @@
+use strict;
+use warnings;
+
+our @Initial = (
+    sub {
+        use RT::CustomFields;
+        my $cfs = RT::CustomFields->new(RT->SystemUser);
+        $cfs->{'find_disabled_rows'} = 1;
+        $cfs->Limit( FIELD => 'LookupType', VALUE => 'RT::FM::Class-RT::FM::Article' );
+        while ( my $cf = $cfs->Next ) {
+            my ($ret, $msg) = $cf->__Set( Field => 'LookupType', Value => 'RT::Class-RT::Article' );
+            RT->Logger->warning("Update Custom Field LookupType for CF.".$cf->Id." $msg");
+        }
+        return 1;
+    },
+
+    sub {
+        use RT::ObjectCustomFieldValues;
+        my $ocfvs = RT::ObjectCustomFieldValues->new(RT->System);
+        $ocfvs->{'find_expired_rows'} = 1;
+        $ocfvs->Limit( FIELD => 'ObjectType', VALUE => 'RT::FM::Article' );
+        while ( my $ocfv = $ocfvs->Next ) {
+            my ($ret, $msg) = $ocfv->__Set( Field => 'ObjectType', Value => 'RT::Article' );
+            RT->Logger->warning("Updated CF ".$ocfv->__Value('CustomField')." Value for Article ".$ocfv->__Value('ObjectId'));
+        }
+        return 1;
+    },
+
+    sub {
+        require RT::Scrips;
+        my $scrips = RT::Scrips->new( RT->SystemUser );
+        $scrips->{'find_disabled_rows'} = 1;
+        $scrips->Limit( FIELD => 'Disabled', VALUE => 1 );;
+        while ( my $scrip = $scrips->Next ) {
+            my $id = $scrip->Template;
+            if ( $id =~ /\D/ ) {
+                $RT::Logger->info('Template column for scrip #'. $scrip->id .' already contains characters');
+                next;
+            }
+
+            my $name;
+
+            my $template = RT::Template->new( RT->SystemUser );
+            $template->Load( $id );
+            unless ( $template->id ) {
+                $RT::Logger->error("Scrip #". $scrip->id ." has template set to #$id, but it's not in DB, setting it 'Blank'");
+                $name = 'Blank';
+            } else {
+                $name = $template->Name;
+            }
+
+            my ($status, $msg) = $scrip->_Set( Field => 'Template', Value => $name );
+            unless ( $status ) {
+                $RT::Logger->error("Couldn't set template: $msg");
+            }
+        }
+    },
+);
+
diff --git a/etc/upgrade/4.2.2/schema.mysql b/etc/upgrade/4.2.2/schema.mysql
new file mode 100644 (file)
index 0000000..de28cc9
--- /dev/null
@@ -0,0 +1,5 @@
+ALTER TABLE Users MODIFY EmailAddress varchar(120) CHARACTER SET utf8;
+ALTER TABLE Queues
+    MODIFY Lifecycle varchar(32) CHARACTER SET utf8,
+    MODIFY CorrespondAddress varchar(120) CHARACTER SET utf8,
+    MODIFY CommentAddress varchar(120) CHARACTER SET utf8;
index 1dcff87..44451d2 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index aa4faaf..2019f25 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 9b453ba..7157b20 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 601c297..3bc1b6d 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index c39d6d4..7dbee50 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index c6270c8..138138d 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 8c8a696..67ee104 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 2d338b0..f9938bb 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -157,6 +157,7 @@ sub copy_tables {
     use RT::CustomFields;
     my $cfs = RT::CustomFields->new(RT->SystemUser);
     $cfs->Limit( FIELD => 'LookupType', VALUE => 'RT::FM::Class-RT::FM::Article' );
+    $cfs->{'find_disabled_rows'} = 1;
     while ( my $cf = $cfs->Next ) {
         my ($ret, $msg) = $cf->__Set( Field => 'LookupType', Value => 'RT::Class-RT::Article' );
         warn "Update Custom Field LookupType for CF.".$cf->Id." $msg";
@@ -167,6 +168,7 @@ sub copy_tables {
     use RT::ObjectCustomFieldValues;
     my $ocfvs = RT::ObjectCustomFieldValues->new(RT->System);
     $ocfvs->Limit( FIELD => 'ObjectType', VALUE => 'RT::FM::Article' );
+    $ocfvs->{'find_expired_rows'} = 1;
     while ( my $ocfv = $ocfvs->Next ) {
         my ($ret, $msg) = $ocfv->__Set( Field => 'ObjectType', Value => 'RT::Article' );
         warn "Updated CF ".$ocfv->__Value('CustomField')." Value for Article ".$ocfv->__Value('ObjectId');
index 98eb7b4..8d6615d 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -184,8 +184,8 @@ my %charset = (
     Queues                   => {
         Name  => 'utf8',
         Description  => 'utf8',
-        CorrespondAddress  => 'ascii',
-        CommentAddress  => 'ascii',
+        CorrespondAddress  => 'utf8',
+        CommentAddress  => 'utf8',
     },
     ScripActions             => {
         Name  => 'utf8',
@@ -239,7 +239,7 @@ my %charset = (
         Password  => 'binary',
         Comments  => 'utf8',
         Signature  => 'utf8',
-        EmailAddress  => 'ascii',
+        EmailAddress  => 'utf8',
         FreeformContactInfo  => 'utf8',
         Organization  => 'utf8',
         RealName  => 'utf8',
index 6a904c8..1785fa9 100644 (file)
@@ -3,7 +3,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 92e15f3..17aaffb 100644 (file)
--- a/lib/RT.pm
+++ b/lib/RT.pm
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -181,6 +181,8 @@ up logging|/InitLogging>, and L<loads plugins|/InitPlugins>.
 =cut
 
 sub Init {
+    shift if @_%2; # code is inconsistent about calling as method
+    my %args = (@_);
 
     CheckPerlRequirements();
 
@@ -189,7 +191,7 @@ sub Init {
     #Get a database connection
     ConnectToDatabase();
     InitSystemObjects();
-    InitClasses();
+    InitClasses(%args);
     InitLogging();
     InitPlugins();
     _BuildTableAttributes();
index 01e1795..eb83ebe 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 9995b80..cf38c1f 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index d02159b..53e2ec4 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 30a58a7..7e65fc1 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 58c55cb..9c06fea 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 7390b43..1df8fb4 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 8817adb..a88a6ee 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 6e8d880..046d6dd 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 6a3898e..92a7214 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index d0529a4..e6260aa 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 41a992b..d38fd26 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 0016a36..a2c57db 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 1dece60..789c182 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 6218061..19d4e19 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index f7551c3..267f30a 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 2092196..4cb372e 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 058a88b..1a1136b 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 5f02e43..1266d21 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index f6570da..0a7949c 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 2043532..7385c13 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index ba7652d..0847fa4 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index b259323..adc40e9 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index dc60222..34cf100 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 6892f41..1b7b7ac 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 8fcaeb2..91063d1 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 2054c53..533944b 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 45a64e3..eb53de4 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 7e0c4a8..edbc6c2 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 05f209d..0e440b0 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 8521432..410578a 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index ee10301..800f4f5 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 60fda95..4e8b824 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 39987ad..797e22e 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 43748b3..b3da755 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 403c318..f83ed8e 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 04cdb22..17e4842 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 072f489..d070d49 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index c0a5f43..01c0d79 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -84,19 +84,19 @@ sub Load {
     }
 }
 
-__PACKAGE__->AddRight( Staff   => SeeClass            => 'See that this class exists'); # loc_pair
-__PACKAGE__->AddRight( Staff   => CreateArticle       => 'Create articles in this class'); # loc_pair
-__PACKAGE__->AddRight( General => ShowArticle         => 'See articles in this class'); # loc_pair
-__PACKAGE__->AddRight( Staff   => ShowArticleHistory  => 'See changes to articles in this class'); # loc_pair
-__PACKAGE__->AddRight( General => SeeCustomField      => 'View custom field values' ); # loc_pair
-__PACKAGE__->AddRight( Staff   => ModifyArticle       => 'Modify or delete articles in this class'); # loc_pair
-__PACKAGE__->AddRight( Staff   => ModifyArticleTopics => 'Modify topics for articles in this class'); # loc_pair
-__PACKAGE__->AddRight( Staff   => ModifyCustomField   => 'Modify custom field values' ); # loc_pair
-__PACKAGE__->AddRight( Admin   => AdminClass          => 'Modify metadata and custom fields for this class'); # loc_pair
-__PACKAGE__->AddRight( Admin   => AdminTopics         => 'Modify topic hierarchy associated with this class'); # loc_pair
-__PACKAGE__->AddRight( Admin   => ShowACL             => 'Display Access Control List'); # loc_pair
-__PACKAGE__->AddRight( Admin   => ModifyACL           => 'Create, modify and delete Access Control List entries'); # loc_pair
-__PACKAGE__->AddRight( Staff   => DeleteArticle       => 'Delete articles in this class'); # loc_pair
+__PACKAGE__->AddRight( Staff   => SeeClass            => 'See that this class exists'); # loc
+__PACKAGE__->AddRight( Staff   => CreateArticle       => 'Create articles in this class'); # loc
+__PACKAGE__->AddRight( General => ShowArticle         => 'See articles in this class'); # loc
+__PACKAGE__->AddRight( Staff   => ShowArticleHistory  => 'See changes to articles in this class'); # loc
+__PACKAGE__->AddRight( General => SeeCustomField      => 'View custom field values' ); # loc
+__PACKAGE__->AddRight( Staff   => ModifyArticle       => 'Modify or delete articles in this class'); # loc
+__PACKAGE__->AddRight( Staff   => ModifyArticleTopics => 'Modify topics for articles in this class'); # loc
+__PACKAGE__->AddRight( Staff   => ModifyCustomField   => 'Modify custom field values' ); # loc
+__PACKAGE__->AddRight( Admin   => AdminClass          => 'Modify metadata and custom fields for this class'); # loc
+__PACKAGE__->AddRight( Admin   => AdminTopics         => 'Modify topic hierarchy associated with this class'); # loc
+__PACKAGE__->AddRight( Admin   => ShowACL             => 'Display Access Control List'); # loc
+__PACKAGE__->AddRight( Admin   => ModifyACL           => 'Create, modify and delete Access Control List entries'); # loc
+__PACKAGE__->AddRight( Staff   => DeleteArticle       => 'Delete articles in this class'); # loc
 
 # {{{ Create
 
index 112ab98..fd3a3aa 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index ab70972..3bb6909 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 2c9129c..5d8b3bc 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 1e27865..7e5f1f7 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index bdeaf2d..2e027f4 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 8e12f23..bf044f8 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 51f482e..15274e6 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index be79c01..ae70fcf 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index b43ef83..784382d 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index ed3d9ff..e00cbc6 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index a057e40..69ef8f9 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index f3a87cd..9cbccf8 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 1abee67..4f4ff18 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 7ea5433..a6b3269 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 7554aab..e275295 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 44d6518..316d2fa 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -1840,11 +1840,13 @@ sub Probe {
             return 0;
         }
     } else {
+        local $ENV{PATH} = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
+            unless defined $ENV{PATH};
         my $path = File::Which::which( $bin );
         unless ($path) {
             $RT::Logger->warning(
-                "Can't find gpg binary '$bin' in PATH; GnuPG support has been disabled.  ".
-                "Check the 'GnuPG' configuration in %GnuPG");
+                "Can't find gpg binary '$bin' in PATH ($ENV{PATH}); GnuPG support has been disabled.  ".
+                "You may need to specify a full path to gpg via the 'GnuPG' configuration in %GnuPG");
             return 0;
         }
         $self->GnuPGPath( $bin = $path );
index 0ed93f5..5e7fc04 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index df53438..b7bf49d 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index cb05e33..5351dba 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -163,11 +163,13 @@ sub Probe {
             return 0;
         }
     } else {
+        local $ENV{PATH} = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
+            unless defined $ENV{PATH};
         my $path = File::Which::which( $bin );
         unless ($path) {
             $RT::Logger->warning(
-                "Can't find openssl binary '$bin' in PATH; SMIME support has been disabled.  ".
-                "Check the 'OpenSSL' configuration in %OpenSSL");
+                "Can't find openssl binary '$bin' in PATH ($ENV{PATH}); SMIME support has been disabled.  ".
+                "You may need to specify a full path to opensssl via the 'OpenSSL' configuration in %OpenSSL");
             return 0;
         }
         $self->OpenSSLPath( $bin = $path );
index a87cec3..0ec3170 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index da6e16a..fe4e5f6 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -210,10 +210,10 @@ __PACKAGE__->RegisterBuiltInGroupings(
     'RT::User'      => [ 'Identity', 'Access control', 'Location', 'Phones' ],
 );
 
-__PACKAGE__->AddRight( General => SeeCustomField         => 'View custom fields'); # loc_pair
-__PACKAGE__->AddRight( Admin   => AdminCustomField       => 'Create, modify and delete custom fields'); # loc_pair
-__PACKAGE__->AddRight( Admin   => AdminCustomFieldValues => 'Create, modify and delete custom fields values'); # loc_pair
-__PACKAGE__->AddRight( Staff   => ModifyCustomField      => 'Add, modify and delete custom field values for objects'); # loc_pair
+__PACKAGE__->AddRight( General => SeeCustomField         => 'View custom fields'); # loc
+__PACKAGE__->AddRight( Admin   => AdminCustomField       => 'Create, modify and delete custom fields'); # loc
+__PACKAGE__->AddRight( Admin   => AdminCustomFieldValues => 'Create, modify and delete custom fields values'); # loc
+__PACKAGE__->AddRight( Staff   => ModifyCustomField      => 'Add, modify and delete custom field values for objects'); # loc
 
 =head1 NAME
 
@@ -1052,11 +1052,6 @@ sub SetRenderType {
                                 $self->FriendlyType));
     }
 
-    # XXX: Remove this restriction once we support lists and cascaded selects
-    if ( $self->BasedOnObj->id and $type =~ /List/ ) {
-        return (0, $self->loc("We can't currently render as a List when basing categories on another custom field.  Please use another render type."));
-    }
-
     return $self->_Set( Field => 'RenderType', Value => $type, @_ );
 }
 
index fb8d83f..1ba73ef 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 37d1594..25d5d69 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 4e58388..96ffc00 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 34722bb..48234e2 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index e30aa42..eab9a10 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 8fafc1c..6b9244f 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -75,17 +75,17 @@ use base qw/RT::SharedSetting/;
 use RT::SavedSearch;
 
 use RT::System;
-'RT::System'->AddRight( Staff   => SubscribeDashboard => 'Subscribe to dashboards'); # loc_pair
+'RT::System'->AddRight( Staff   => SubscribeDashboard => 'Subscribe to dashboards'); # loc
 
-'RT::System'->AddRight( General => SeeDashboard       => 'View system dashboards'); # loc_pair
-'RT::System'->AddRight( Admin   => CreateDashboard    => 'Create system dashboards'); # loc_pair
-'RT::System'->AddRight( Admin   => ModifyDashboard    => 'Modify system dashboards'); # loc_pair
-'RT::System'->AddRight( Admin   => DeleteDashboard    => 'Delete system dashboards'); # loc_pair
+'RT::System'->AddRight( General => SeeDashboard       => 'View system dashboards'); # loc
+'RT::System'->AddRight( Admin   => CreateDashboard    => 'Create system dashboards'); # loc
+'RT::System'->AddRight( Admin   => ModifyDashboard    => 'Modify system dashboards'); # loc
+'RT::System'->AddRight( Admin   => DeleteDashboard    => 'Delete system dashboards'); # loc
 
-'RT::System'->AddRight( Staff   => SeeOwnDashboard    => 'View personal dashboards'); # loc_pair
-'RT::System'->AddRight( Staff   => CreateOwnDashboard => 'Create personal dashboards'); # loc_pair
-'RT::System'->AddRight( Staff   => ModifyOwnDashboard => 'Modify personal dashboards'); # loc_pair
-'RT::System'->AddRight( Staff   => DeleteOwnDashboard => 'Delete personal dashboards'); # loc_pair
+'RT::System'->AddRight( Staff   => SeeOwnDashboard    => 'View personal dashboards'); # loc
+'RT::System'->AddRight( Staff   => CreateOwnDashboard => 'Create personal dashboards'); # loc
+'RT::System'->AddRight( Staff   => ModifyOwnDashboard => 'Modify personal dashboards'); # loc
+'RT::System'->AddRight( Staff   => DeleteOwnDashboard => 'Delete personal dashboards'); # loc
 
 
 =head2 ObjectName
index c4de860..5126560 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -147,7 +147,7 @@ sub IsSubscriptionReady {
     my $sub_hour      = $subscription->SubValue('Hour');
     my $sub_dow       = $subscription->SubValue('Dow');
     my $sub_dom       = $subscription->SubValue('Dom');
-    my $sub_fow       = $subscription->SubValue('Fow');
+    my $sub_fow       = $subscription->SubValue('Fow') || 1;
 
     my ($hour, $dow, $dom) = @{ $args{LocalTime} };
 
@@ -166,8 +166,6 @@ sub IsSubscriptionReady {
         return 0 if $sub_dow ne $dow;
 
         # does it match the "every N weeks" clause?
-        $sub_fow = 1 if !$sub_fow;
-
         return 1 if $counter % $sub_fow == 0;
 
         $subscription->SetSubValues(Counter => $counter + 1)
@@ -426,12 +424,15 @@ sub BuildEmail {
         Type        => 'text/html',
         Charset     => 'UTF-8',
         Disposition => 'inline',
+        Encoding    => "base64",
     );
 
     for my $part (@parts) {
         $entity->add_part($part);
     }
 
+    $entity->make_singlepart;
+
     return $entity;
 }
 
index 023745c..7c8511f 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
index 28a1593..509e11c 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -920,7 +920,7 @@ sub RFC2822 {
 
     my ($date, $time) = ('','');
     $date .= "$DAYS_OF_WEEK[$wday], " if $args{'DayOfWeek'} && $args{'Date'};
-    $date .= "$mday $MONTHS[$mon] $year" if $args{'Date'};
+    $date .= sprintf("%02d %s %04d", $mday, $MONTHS[$mon], $year) if $args{'Date'};
 
     if ( $args{'Time'} ) {
         $time .= sprintf("%02d:%02d", $hour, $min);
@@ -988,28 +988,19 @@ sub iCal {
         @_,
     );
 
-    my $tz;
-    if ( $args{'Date'} && !$args{'Time'} ) {
-        $tz = 'user';
-    } else {
-        $tz = 'utc';
-    }
-
-    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydaym,$isdst,$offset) =
-        $self->Localtime( $tz );
-
-    #the month needs incrementing, as gmtime returns 0-11
-    $mon++;
-
     my $res;
     if ( $args{'Date'} && !$args{'Time'} ) {
-        $res = sprintf( '%04d%02d%02d', $year, $mon, $mday );
-    }
-    elsif ( !$args{'Date'} && $args{'Time'} ) {
+        my (undef, undef, undef, $mday, $mon, $year) =
+            $self->Localtime( 'user' );
+        $res = sprintf( '%04d%02d%02d', $year, $mon+1, $mday );
+    } elsif ( !$args{'Date'} && $args{'Time'} ) {
+        my ($sec, $min, $hour) =
+            $self->Localtime( 'utc' );
         $res = sprintf( 'T%02d%02d%02dZ', $hour, $min, $sec );
-    }
-    else {
-        $res = sprintf( '%04d%02d%02dT%02d%02d%02dZ', $year, $mon, $mday, $hour, $min, $sec );
+    } else {
+        my ($sec, $min, $hour, $mday, $mon, $year) =
+            $self->Localtime( 'utc' );
+        $res = sprintf( '%04d%02d%02dT%02d%02d%02dZ', $year, $mon+1, $mday, $hour, $min, $sec );
     }
     return $res;
 }
index a1890e1..97f7ce2 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -51,7 +51,7 @@ package RT::DependencyWalker;
 use strict;
 use warnings;
 
-use RT::DependencyWalker::Dependencies;
+use RT::DependencyWalker::FindDependencies;
 use Carp;
 
 sub new {
diff --git a/lib/RT/DependencyWalker/FindDependencies.pm b/lib/RT/DependencyWalker/FindDependencies.pm
new file mode 100644 (file)
index 0000000..b3d3d19
--- /dev/null
@@ -0,0 +1,65 @@
+# BEGIN BPS TAGGED BLOCK {{{
+#
+# COPYRIGHT:
+#
+# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC
+#                                          <sales@bestpractical.com>
+#
+# (Except where explicitly superseded by other copyright notices)
+#
+#
+# LICENSE:
+#
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+#
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+#
+#
+# CONTRIBUTION SUBMISSION POLICY:
+#
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+#
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+#
+# END BPS TAGGED BLOCK }}}
+
+package RT::DependencyWalker::FindDependencies;
+
+use strict;
+use warnings;
+
+sub new {
+    my $class = shift;
+    return bless {out => [], in => []}, $class;
+}
+
+sub Add {
+    my $self =&nbs