From 6ed300af16ef3607831776d9912ddefd64f76ce3 Mon Sep 17 00:00:00 2001 From: Jens Ulferts Date: Fri, 12 Dec 2014 13:40:08 +0100 Subject: [PATCH] splits redmine.rb into initializers --- config/initializers/30-redmine.rb | 2 +- config/initializers/activity.rb | 41 ++ config/initializers/custom_field_format.rb | 64 +++ config/initializers/menus.rb | 255 +++++++++++ config/initializers/permissions.rb | 364 ++++++++++++++++ .../redcloth_numbered_headings.rb | 2 + config/initializers/scm.rb | 34 ++ config/initializers/search.rb | 37 ++ config/initializers/wiki_formatting.rb | 36 ++ lib/open_project.rb | 43 ++ lib/redmine.rb | 404 ------------------ 11 files changed, 877 insertions(+), 405 deletions(-) create mode 100644 config/initializers/activity.rb create mode 100644 config/initializers/custom_field_format.rb create mode 100644 config/initializers/menus.rb create mode 100644 config/initializers/permissions.rb create mode 100644 config/initializers/scm.rb create mode 100644 config/initializers/search.rb create mode 100644 config/initializers/wiki_formatting.rb create mode 100644 lib/open_project.rb delete mode 100644 lib/redmine.rb diff --git a/config/initializers/30-redmine.rb b/config/initializers/30-redmine.rb index fbe22da3c39..00242f7ca7b 100644 --- a/config/initializers/30-redmine.rb +++ b/config/initializers/30-redmine.rb @@ -34,5 +34,5 @@ if Setting.table_exists? # don't want to prevent migrations I18n.fallbacks.defaults = [I18n.default_locale] + Setting.available_languages.map(&:to_sym) end -require 'redmine' +require 'open_project' require 'chili_project' diff --git a/config/initializers/activity.rb b/config/initializers/activity.rb new file mode 100644 index 00000000000..fec5b0783a0 --- /dev/null +++ b/config/initializers/activity.rb @@ -0,0 +1,41 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +Redmine::Activity.map do |activity| + activity.register :work_packages, class_name: 'Activity::WorkPackageActivityProvider' + activity.register :changesets, class_name: 'Activity::ChangesetActivityProvider' + activity.register :news, class_name: 'Activity::NewsActivityProvider', + default: false + activity.register :wiki_edits, class_name: 'Activity::WikiContentActivityProvider', + default: false + activity.register :messages, class_name: 'Activity::MessageActivityProvider', + default: false + activity.register :time_entries, class_name: 'Activity::TimeEntryActivityProvider', + default: false +end diff --git a/config/initializers/custom_field_format.rb b/config/initializers/custom_field_format.rb new file mode 100644 index 00000000000..dcb6fcabc3e --- /dev/null +++ b/config/initializers/custom_field_format.rb @@ -0,0 +1,64 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +Redmine::CustomFieldFormat.map do |fields| + fields.register Redmine::CustomFieldFormat.new('string', + label: :label_string, + order: 1) + fields.register Redmine::CustomFieldFormat.new('text', + label: :label_text, + order: 2) + fields.register Redmine::CustomFieldFormat.new('int', + label: :label_integer, + order: 3) + fields.register Redmine::CustomFieldFormat.new('float', + label: :label_float, + order: 4) + fields.register Redmine::CustomFieldFormat.new('list', + label: :label_list, + order: 5) + fields.register Redmine::CustomFieldFormat.new('date', + label: :label_date, + order: 6) + fields.register Redmine::CustomFieldFormat.new('bool', + label: :label_boolean, + order: 7) + fields.register Redmine::CustomFieldFormat.new('user', + label: Proc.new { User.model_name.human }, + only: %w(WorkPackage TimeEntry + Version Project), + edit_as: 'list', + order: 8) + fields.register Redmine::CustomFieldFormat.new('version', + label: Proc.new { Version.model_name.human }, + only: %w(WorkPackage TimeEntry + Version Project), + edit_as: 'list', + order: 9) +end diff --git a/config/initializers/menus.rb b/config/initializers/menus.rb new file mode 100644 index 00000000000..c048af52be5 --- /dev/null +++ b/config/initializers/menus.rb @@ -0,0 +1,255 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'redmine/menu_manager' + +Redmine::MenuManager.map :top_menu do |menu| + menu.push :my_page, + { controller: '/my', action: 'page' }, + html: { class: 'icon5 icon-star2' }, + if: Proc.new { User.current.logged? } + # projects menu will be added by + # Redmine::MenuManager::TopMenuHelper#render_projects_top_menu_node + menu.push :administration, + { controller: '/admin', action: 'projects' }, + if: Proc.new { User.current.admin? }, + last: true + menu.push :help, OpenProject::Info.help_url, + last: true, + caption: I18n.t('label_help'), + html: { accesskey: OpenProject::AccessKeys.key_for(:help), + class: 'icon5 icon-help' } +end + +Redmine::MenuManager.map :account_menu do |menu| + menu.push :my_account, + { controller: '/my', action: 'account' }, + if: Proc.new { User.current.logged? } + menu.push :logout, :signout_path, + if: Proc.new { User.current.logged? } +end + +Redmine::MenuManager.map :application_menu do |_menu| + # Empty +end + +Redmine::MenuManager.map :my_menu do |menu| + menu.push :account, + { controller: '/my', action: 'account' }, + caption: :label_my_account, + html: { class: 'icon2 icon-user1' } + menu.push :password, + { controller: '/my', action: 'password' }, + caption: :button_change_password, + if: Proc.new { User.current.change_password_allowed? }, + html: { class: 'icon2 icon-locked' } + + menu.push :delete_account, :deletion_info_path, + caption: I18n.t('account.delete'), + param: :user_id, + if: Proc.new { Setting.users_deletable_by_self? }, + html: { class: 'icon2 icon-delete' } +end + +Redmine::MenuManager.map :admin_menu do |menu| + menu.push :projects, + { controller: '/admin', action: 'projects' }, + caption: :label_project_plural, + html: { class: 'icon2 icon-list-view2' } + + menu.push :users, + { controller: '/users' }, + caption: :label_user_plural, + html: { class: 'icon2 icon-user1' } + + menu.push :groups, + { controller: '/groups' }, + caption: :label_group_plural, + html: { class: 'icon2 icon-group' } + menu.push :roles, + { controller: '/roles' }, + caption: :label_role_and_permissions, + html: { class: 'icon2 icon-settings' } + + menu.push :types, + { controller: '/types' }, + caption: :label_type_plural, + html: { class: 'icon2 icon-tracker' } + + menu.push :statuses, + { controller: '/statuses' }, + caption: :label_work_package_status_plural, + html: { class: 'statuses icon2 icon-status' } + + menu.push :workflows, + { controller: '/workflows', action: 'edit' }, + caption: Proc.new { Workflow.model_name.human }, + html: { class: 'icon2 icon-status' } + + menu.push :custom_fields, + { controller: '/custom_fields' }, + caption: :label_custom_field_plural, + html: { class: 'custom_fields icon2 icon-status' } + + menu.push :enumerations, + { controller: '/enumerations' }, + html: { class: 'icon2 icon-status' } + + menu.push :settings, + { controller: '/settings' }, + html: { class: 'icon2 icon-settings2' } + + menu.push :ldap_authentication, + { controller: '/ldap_auth_sources', action: 'index' }, + html: { class: 'server_authentication icon2 icon-status' }, + if: proc { !OpenProject::Configuration.disable_password_login? } + + menu.push :plugins, + { controller: '/admin', action: 'plugins' }, + last: true, + html: { class: 'icon2 icon-status' } + + menu.push :info, + { controller: '/admin', action: 'info' }, + caption: :label_information_plural, + last: true, + html: { class: 'icon2 icon-info' } + + menu.push :colors, + { controller: '/planning_element_type_colors', action: 'index' }, + caption: :'timelines.admin_menu.colors', + html: { class: 'icon2 icon-status' } + + menu.push :project_types, + { controller: '/project_types', action: 'index' }, + caption: :'timelines.admin_menu.project_types', + html: { class: 'icon2 icon-tracker' } +end + +Redmine::MenuManager.map :project_menu do |menu| + menu.push :overview, + { controller: '/projects', action: 'show' }, + html: { class: 'icon2 icon-list-view2' } + + menu.push :activity, + { controller: '/activities', action: 'index' }, + param: :project_id, + if: Proc.new { |p| p.module_enabled?('activity') }, + html: { class: 'icon2 icon-yes' } + + menu.push :roadmap, + { controller: '/versions', action: 'index' }, + param: :project_id, + if: Proc.new { |p| p.shared_versions.any? }, + html: { class: 'icon2 icon-process-arrow1' } + + menu.push :work_packages, + { controller: '/work_packages', action: 'index' }, + param: :project_id, + caption: :label_work_package_plural, + html: { + id: 'main-menu-work-packages', + class: 'icon2 icon-project-tree', + 'data-ui-route' => '', + query_menu_item: 'query_menu_item' + } + + menu.push :new_work_package, + { controller: '/work_packages', action: 'new' }, + param: :project_id, + caption: :label_work_package_new, + parent: :work_packages, + html: { accesskey: OpenProject::AccessKeys.key_for(:new_work_package), + class: 'icon2 icon-add' } + + menu.push :summary_field, + { controller: '/work_packages/reports', action: 'report' }, + param: :project_id, + caption: :label_workflow_summary, + parent: :work_packages, + html: { class: 'icon2 icon-stats4' } + + menu.push :timelines, + { controller: '/timelines', action: 'index' }, + param: :project_id, + caption: :'timelines.project_menu.timelines', + html: { class: 'icon2 icon-timeline-view' } + + menu.push :calendar, + { controller: '/work_packages/calendars', action: 'index' }, + param: :project_id, + caption: :label_calendar, + html: { class: 'icon2 icon-calendar' } + + menu.push :news, + { controller: '/news', action: 'index' }, + param: :project_id, + caption: :label_news_plural, + html: { class: 'icon2 icon-news' } + + menu.push :new_news, + { controller: '/news', action: 'new' }, + param: :project_id, + caption: :label_news_new, + parent: :news, + if: Proc.new { |p| User.current.allowed_to?(:manage_news, p.project) }, + html: { class: 'icon2 icon-add' } + + menu.push :boards, + { controller: '/boards', action: 'index', id: nil }, + param: :project_id, + if: Proc.new { |p| p.boards.any? }, + caption: :label_board_plural, + html: { class: 'icon2 icon-ticket-note' } + + menu.push :repository, + { controller: '/repositories', action: 'show' }, + param: :project_id, + if: Proc.new { |p| p.repository && !p.repository.new_record? }, + html: { class: 'icon2 icon-open-folder' } + + menu.push :reportings, + { controller: '/reportings', action: 'index' }, + param: :project_id, + caption: :'timelines.project_menu.reportings', + html: { class: 'icon2 icon-status-reporting' } + + menu.push :project_associations, + { controller: '/project_associations', action: 'index' }, + param: :project_id, + caption: :'timelines.project_menu.project_associations', + if: Proc.new { |p| p.project_type.try :allows_association }, + html: { class: 'icon2 icon-dependency' } + + menu.push :settings, + { controller: '/projects', action: 'settings' }, + caption: :label_project_settings, + last: true, + html: { class: 'icon2 icon-settings2' } +end diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb new file mode 100644 index 00000000000..62aa408feae --- /dev/null +++ b/config/initializers/permissions.rb @@ -0,0 +1,364 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'redmine/access_control' + +Redmine::AccessControl.map do |map| + map.permission :view_project, + { projects: [:show], + activities: [:index] }, + public: true + + map.permission :search_project, + { search: :index }, + public: true + + map.permission :add_project, + { projects: [:new, :create], + members: [:paginate_users] }, + require: :loggedin + + map.permission :edit_project, + { projects: [:settings, :edit, :update], + members: [:paginate_users] }, + require: :member + + map.permission :select_project_modules, + { projects: :modules }, + require: :member + + map.permission :manage_members, + { projects: :settings, + members: [:create, :update, :destroy, :autocomplete_for_member] }, + require: :member + + map.permission :manage_versions, + { projects: :settings, + versions: [:new, :create, :edit, :update, + :close_completed, :destroy] }, + require: :member + + map.permission :manage_types, + { projects: :types }, + require: :member + + map.permission :add_subprojects, + { projects: [:new, :create] }, + require: :member + + map.permission :copy_projects, + { copy_projects: [:copy, :copy_project], + members: [:paginate_users] }, + require: :member + + map.project_module :work_package_tracking do |wpt| + # Issue categories + wpt.permission :manage_categories, + { projects: :settings, + categories: [:new, :create, :edit, :update, :destroy] }, + require: :member + # Issues + wpt.permission :view_work_packages, + issues: [:index, :all, :show], + auto_complete: [:issues], + versions: [:index, :show, :status_by], + journals: [:index, :diff], + work_packages: [:show, :index], + work_packages_api: [:get], + :'work_packages/reports' => [:report, :report_details], + planning_elements: [:index, :all, :show, :recycle_bin], + planning_element_journals: [:index], + :'api/experimental/queries' => [:available_columns, + :custom_field_filters, + :grouped], + :'api/experimental/users' => [:index], + :'api/experimental/roles' => [:index], + :'api/experimental/groups' => [:index], + :'api/experimental/versions' => [:index], + :'api/experimental/projects' => [:show, + :sub_projects, + :index], + :'api/experimental/work_packages' => [:index, + :column_data, + :column_sums], + # This is api/v2/planning_element_types + :'planning_element_types' => [:index, + :show] + + wpt.permission :export_work_packages, + work_packages: [:index, :all] + + wpt.permission :add_work_packages, + issues: [:new, :create, :update_form], + :'issues/previews' => :create, + work_packages: [:new, :new_type, :preview, :create] + + wpt.permission :move_work_packages, + { :'work_packages/moves' => [:new, :create] }, + require: :loggedin + + wpt.permission :edit_work_packages, + { issues: [:edit, :update, :update_form], + :'work_packages/bulk' => [:edit, :update], + work_packages: [:edit, :update, :new_type, + :preview, :quoted], + journals: :preview, + planning_elements: [:new, :create, :edit, :update], + planning_element_journals: [:create] }, + require: :member + + wpt.permission :add_work_package_notes, + work_packages: [:edit, :update], + journals: [:new] + + wpt.permission :edit_work_package_notes, + { journals: [:edit, :update] }, + require: :loggedin + + wpt.permission :edit_own_work_package_notes, + { journals: [:edit, :update] }, + require: :loggedin + + wpt.permission :delete_work_packages, + { issues: :destroy, + work_packages: :destroy, + :'work_packages/bulk' => :destroy, + planning_elements: [:confirm_destroy, + :destroy, + :destroy_all, + :confirm_destroy_all] }, + require: :member + + wpt.permission :manage_work_package_relations, + work_package_relations: [:create, :destroy] + + wpt.permission :manage_subtasks, + {} + # Queries + wpt.permission :manage_public_queries, + { :'api/experimental/queries' => [:create, + :update, + :destroy], + queries: [:star, :unstar] }, + require: :member + + wpt.permission :save_queries, + { :'api/experimental/queries' => [:create, :update, :destroy], + :'queries' => [:star, :unstar] }, + require: :loggedin + # Watchers + wpt.permission :view_work_package_watchers, + {} + + wpt.permission :add_work_package_watchers, + watchers: [:new, :create] + + wpt.permission :delete_work_package_watchers, + watchers: :destroy + end + + map.project_module :time_tracking do |time| + time.permission :log_time, + { timelog: [:new, :create, :edit, :update] }, + require: :loggedin + + time.permission :view_time_entries, + timelog: [:index, :show], + time_entry_reports: [:report] + + time.permission :edit_time_entries, + { timelog: [:new, :create, :edit, :update, :destroy] }, + require: :member + + time.permission :edit_own_time_entries, + { timelog: [:new, :create, :edit, :update, :destroy] }, + require: :loggedin + + time.permission :manage_project_activities, + { project_enumerations: [:update, :destroy] }, + require: :member + + end + + map.project_module :news do |news| + news.permission :manage_news, + { news: [:new, :create, :edit, :update, :destroy, :preview], + :'news/comments' => [:destroy] }, + require: :member + + news.permission :view_news, + { news: [:index, :show] }, + public: true + + news.permission :comment_news, + :'news/comments' => :create + end + + map.project_module :wiki do |wiki| + + wiki.permission :manage_wiki, + { wikis: [:edit, :destroy] }, + require: :member + + wiki.permission :manage_wiki_menu, + { wiki_menu_items: [:edit, :update, :select_main_menu_item, + :replace_main_menu_item] }, + require: :member + + wiki.permission :rename_wiki_pages, + { wiki: :rename }, + require: :member + + wiki.permission :change_wiki_parent_page, + { wiki: [:edit_parent_page, :update_parent_page] }, + require: :member + + wiki.permission :delete_wiki_pages, + { wiki: :destroy }, + require: :member + + wiki.permission :view_wiki_pages, + wiki: [:index, :show, :special, :date_index] + + wiki.permission :export_wiki_pages, + wiki: [:export] + + wiki.permission :view_wiki_edits, + wiki: [:history, :diff, :annotate] + + wiki.permission :edit_wiki_pages, + wiki: [:edit, :update, :preview, :add_attachment, + :new, :new_child, :create] + + wiki.permission :delete_wiki_pages_attachments, + {} + + wiki.permission :protect_wiki_pages, + { wiki: :protect }, + require: :member + + wiki.permission :list_attachments, + { wiki: :list_attachments }, + require: :member + end + + map.project_module :repository do |repo| + repo.permission :manage_repository, + { repositories: [:edit, :committers, :destroy] }, + require: :member + + repo.permission :browse_repository, + repositories: [:show, :browse, :entry, :annotate, + :changes, :diff, :stats, :graph] + + repo.permission :view_changesets, + repositories: [:show, :revisions, :revision] + + repo.permission :commit_access, + {} + + repo.permission :view_commit_author_statistics, + {} + end + + map.project_module :boards do |board| + board.permission :manage_boards, + { boards: [:new, :create, :edit, :update, :move, :destroy] }, + require: :member + + board.permission :view_messages, + { boards: [:index, :show], + messages: [:show] }, + public: true + + board.permission :add_messages, + messages: [:new, :create, :reply, :quote, :preview] + + board.permission :edit_messages, + { messages: [:edit, :update, :preview] }, + require: :member + + board.permission :edit_own_messages, + { messages: [:edit, :update, :preview] }, + require: :loggedin + + board.permission :delete_messages, + { messages: :destroy }, + require: :member + + board.permission :delete_own_messages, + { messages: :destroy }, + require: :loggedin + end + + map.project_module :calendar do |cal| + cal.permission :view_calendar, + :'work_packages/calendars' => [:index] + end + + map.project_module :activity + + map.project_module :timelines do |timelines| + timelines.permission :view_project_associations, + project_associations: [:index, :show] + + timelines.permission :edit_project_associations, + { project_associations: [:edit, :update, :new, + :create, + :available_projects] }, + require: :member + + timelines.permission :delete_project_associations, + { project_associations: [:confirm_destroy, :destroy] }, + require: :member + + timelines.permission :view_timelines, + timelines: [:index, :show] + + timelines.permission :edit_timelines, + { timelines: [:edit, :update, :new, :create] }, + require: :member + + timelines.permission :delete_timelines, + { timelines: [:confirm_destroy, :destroy] }, + require: :member + + timelines.permission :view_reportings, + reportings: [:index, :all, :show] + + timelines.permission :edit_reportings, + { reportings: [:new, :create, :edit, + :update, :available_projects] }, + require: :member + + timelines.permission :delete_reportings, + { reportings: [:confirm_destroy, :destroy] }, + require: :member + end +end diff --git a/config/initializers/redcloth_numbered_headings.rb b/config/initializers/redcloth_numbered_headings.rb index b97e217cf77..6377cba2983 100644 --- a/config/initializers/redcloth_numbered_headings.rb +++ b/config/initializers/redcloth_numbered_headings.rb @@ -27,6 +27,8 @@ # See doc/COPYRIGHT.rdoc for more details. #++ +require 'redcloth3' + module RedCloth3Patch def self.included(base) base.send(:include, InstanceMethods) diff --git a/config/initializers/scm.rb b/config/initializers/scm.rb new file mode 100644 index 00000000000..f8711fb1d73 --- /dev/null +++ b/config/initializers/scm.rb @@ -0,0 +1,34 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'redmine/scm/base' + +Redmine::Scm::Base.add 'Subversion' +Redmine::Scm::Base.add 'Git' +Redmine::Scm::Base.add 'Filesystem' diff --git a/config/initializers/search.rb b/config/initializers/search.rb new file mode 100644 index 00000000000..c5ceb403be5 --- /dev/null +++ b/config/initializers/search.rb @@ -0,0 +1,37 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +Redmine::Search.map do |search| + search.register :work_packages + search.register :news + search.register :changesets + search.register :wiki_pages + search.register :messages + search.register :projects +end diff --git a/config/initializers/wiki_formatting.rb b/config/initializers/wiki_formatting.rb new file mode 100644 index 00000000000..9485d58511a --- /dev/null +++ b/config/initializers/wiki_formatting.rb @@ -0,0 +1,36 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'redmine/wiki_formatting' + +Redmine::WikiFormatting.map do |format| + format.register :textile, + Redmine::WikiFormatting::Textile::Formatter, + Redmine::WikiFormatting::Textile::Helper +end diff --git a/lib/open_project.rb b/lib/open_project.rb new file mode 100644 index 00000000000..1b3dca79ec8 --- /dev/null +++ b/lib/open_project.rb @@ -0,0 +1,43 @@ +#-- encoding: UTF-8 +#-- copyright +# OpenProject is a project management system. +# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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, USA. +# +# See doc/COPYRIGHT.rdoc for more details. +#++ + +require 'redmine/menu_manager' +require 'redmine/activity' +require 'redmine/search' +require 'redmine/custom_field_format' +require 'redmine/mime_type' +require 'redmine/core_ext' +require 'open_project/themes' +require 'redmine/hook' +require 'open_project/hooks' +require 'redmine/plugin' +require 'redmine/notifiable' + +require 'csv' +require 'globalize' diff --git a/lib/redmine.rb b/lib/redmine.rb deleted file mode 100644 index 8142a2cf7a1..00000000000 --- a/lib/redmine.rb +++ /dev/null @@ -1,404 +0,0 @@ -#-- encoding: UTF-8 -#-- copyright -# OpenProject is a project management system. -# Copyright (C) 2012-2014 the OpenProject Foundation (OPF) -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License version 3. -# -# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -# Copyright (C) 2006-2013 Jean-Philippe Lang -# Copyright (C) 2010-2013 the ChiliProject Team -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# This program 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, USA. -# -# See doc/COPYRIGHT.rdoc for more details. -#++ - -require 'redmine/access_control' -require 'redmine/menu_manager' -require 'redmine/activity' -require 'redmine/search' -require 'redmine/custom_field_format' -require 'redmine/mime_type' -require 'redmine/core_ext' -require 'open_project/themes' -require 'redmine/hook' -require 'open_project/hooks' -require 'redmine/plugin' -require 'redmine/notifiable' -require 'redmine/wiki_formatting' -require 'redmine/scm/base' - -require 'csv' -require 'globalize' - -Redmine::Scm::Base.add 'Subversion' -Redmine::Scm::Base.add 'Git' -Redmine::Scm::Base.add 'Filesystem' - -Redmine::CustomFieldFormat.map do |fields| - fields.register Redmine::CustomFieldFormat.new('string', label: :label_string, order: 1) - fields.register Redmine::CustomFieldFormat.new('text', label: :label_text, order: 2) - fields.register Redmine::CustomFieldFormat.new('int', label: :label_integer, order: 3) - fields.register Redmine::CustomFieldFormat.new('float', label: :label_float, order: 4) - fields.register Redmine::CustomFieldFormat.new('list', label: :label_list, order: 5) - fields.register Redmine::CustomFieldFormat.new('date', label: :label_date, order: 6) - fields.register Redmine::CustomFieldFormat.new('bool', label: :label_boolean, order: 7) - fields.register Redmine::CustomFieldFormat.new('user', label: Proc.new { User.model_name.human }, only: %w(WorkPackage TimeEntry Version Project), edit_as: 'list', order: 8) - fields.register Redmine::CustomFieldFormat.new('version', label: Proc.new { Version.model_name.human }, only: %w(WorkPackage TimeEntry Version Project), edit_as: 'list', order: 9) -end - -# Permissions -Redmine::AccessControl.map do |map| - map.permission :view_project, - { - projects: [:show], - activities: [:index] - }, - public: true - map.permission :search_project, { search: :index }, public: true - map.permission :add_project, { - projects: [:new, :create], - members: [:paginate_users] - }, require: :loggedin - map.permission :edit_project, - { - projects: [:settings, :edit, :update], - members: [:paginate_users] - }, - require: :member - map.permission :select_project_modules, { projects: :modules }, require: :member - map.permission :manage_members, { projects: :settings, members: [:create, :update, :destroy, :autocomplete_for_member] }, require: :member - map.permission :manage_versions, { projects: :settings, versions: [:new, :create, :edit, :update, :close_completed, :destroy] }, require: :member - map.permission :manage_types, { projects: :types }, require: :member - map.permission :add_subprojects, { projects: [:new, :create] }, require: :member - map.permission :copy_projects, { - copy_projects: [:copy, :copy_project], - members: [:paginate_users] - }, require: :member - - map.project_module :work_package_tracking do |map| - # Issue categories - map.permission :manage_categories, { projects: :settings, categories: [:new, :create, :edit, :update, :destroy] }, require: :member - # Issues - map.permission :view_work_packages, :'issues' => [:index, :all, :show], - auto_complete: [:issues], - versions: [:index, :show, :status_by], - journals: [:index, :diff], - work_packages: [:show, :index], - work_packages_api: [:get], - :'work_packages/reports' => [:report, :report_details], - planning_elements: [:index, :all, :show, :recycle_bin], - planning_element_journals: [:index], - :'api/experimental/queries' => [:available_columns, - :custom_field_filters, - :grouped], - :'api/experimental/users' => [:index], - :'api/experimental/roles' => [:index], - :'api/experimental/groups' => [:index], - :'api/experimental/versions' => [:index], - :'api/experimental/projects' => [:show, - :sub_projects, - :index], - :'api/experimental/work_packages' => [:index, - :column_data, - :column_sums], - # This is api/v2/planning_element_types - :'planning_element_types' => [:index, - :show] - map.permission :export_work_packages, work_packages: [:index, :all] - map.permission :add_work_packages, issues: [:new, :create, :update_form], - :'issues/previews' => :create, - work_packages: [:new, :new_type, :preview, :create] - map.permission :move_work_packages, { :'work_packages/moves' => [:new, :create] }, require: :loggedin - map.permission :edit_work_packages, issues: [:edit, :update, :update_form], - :'work_packages/bulk' => [:edit, :update], - work_packages: [:edit, :update, :new_type, :preview, :quoted], - journals: :preview, - planning_elements: [:new, :create, :edit, :update], - planning_element_journals: [[:create], { require: :member }] - map.permission :add_work_package_notes, work_packages: [:edit, :update], journals: [:new] - map.permission :edit_work_package_notes, { journals: [:edit, :update] }, require: :loggedin - map.permission :edit_own_work_package_notes, { journals: [:edit, :update] }, require: :loggedin - map.permission :delete_work_packages, { issues: :destroy, - work_packages: :destroy, - :'work_packages/bulk' => :destroy, - planning_elements: [:confirm_destroy, - :destroy, - :destroy_all, - :confirm_destroy_all] }, - require: :member - map.permission :manage_work_package_relations, work_package_relations: [:create, :destroy] - map.permission :manage_subtasks, {} - # Queries - map.permission :manage_public_queries, { :'api/experimental/queries' => [:create, - :update, - :destroy], - queries: [:star, :unstar] }, require: :member - map.permission :save_queries, { :'api/experimental/queries' => [:create, :update, :destroy], - :'queries' => [:star, :unstar] }, require: :loggedin - # Watchers - map.permission :view_work_package_watchers, {} - map.permission :add_work_package_watchers, watchers: [:new, :create] - map.permission :delete_work_package_watchers, watchers: :destroy - end - - map.project_module :time_tracking do |map| - map.permission :log_time, { timelog: [:new, :create, :edit, :update] }, require: :loggedin - map.permission :view_time_entries, timelog: [:index, :show], time_entry_reports: [:report] - map.permission :edit_time_entries, { timelog: [:new, :create, :edit, :update, :destroy] }, require: :member - map.permission :edit_own_time_entries, { timelog: [:new, :create, :edit, :update, :destroy] }, require: :loggedin - map.permission :manage_project_activities, { project_enumerations: [:update, :destroy] }, require: :member - end - - map.project_module :news do |map| - map.permission :manage_news, { news: [:new, :create, :edit, :update, :destroy, :preview], :'news/comments' => [:destroy] }, require: :member - map.permission :view_news, { news: [:index, :show] }, public: true - map.permission :comment_news, :'news/comments' => :create - end - - map.project_module :wiki do |map| - map.permission :manage_wiki, { wikis: [:edit, :destroy] }, require: :member - map.permission :manage_wiki_menu, { wiki_menu_items: [:edit, :update, :select_main_menu_item, :replace_main_menu_item] }, require: :member - map.permission :rename_wiki_pages, { wiki: :rename }, require: :member - map.permission :change_wiki_parent_page, { wiki: [:edit_parent_page, :update_parent_page] }, - require: :member - map.permission :delete_wiki_pages, { wiki: :destroy }, require: :member - map.permission :view_wiki_pages, wiki: [:index, :show, :special, :date_index] - map.permission :export_wiki_pages, wiki: [:export] - map.permission :view_wiki_edits, wiki: [:history, :diff, :annotate] - map.permission :edit_wiki_pages, wiki: [:edit, :update, :preview, :add_attachment, :new, :new_child, :create] - map.permission :delete_wiki_pages_attachments, {} - map.permission :protect_wiki_pages, { wiki: :protect }, require: :member - map.permission :list_attachments, { wiki: :list_attachments }, require: :member - end - - map.project_module :repository do |map| - map.permission :manage_repository, { repositories: [:edit, :committers, :destroy] }, require: :member - map.permission :browse_repository, repositories: [:show, :browse, :entry, :annotate, :changes, :diff, :stats, :graph] - map.permission :view_changesets, repositories: [:show, :revisions, :revision] - map.permission :commit_access, {} - map.permission :view_commit_author_statistics, {} - end - - map.project_module :boards do |map| - map.permission :manage_boards, { boards: [:new, :create, :edit, :update, :move, :destroy] }, require: :member - map.permission :view_messages, { boards: [:index, :show], messages: [:show] }, public: true - map.permission :add_messages, messages: [:new, :create, :reply, :quote, :preview] - map.permission :edit_messages, { messages: [:edit, :update, :preview] }, require: :member - map.permission :edit_own_messages, { messages: [:edit, :update, :preview] }, require: :loggedin - map.permission :delete_messages, { messages: :destroy }, require: :member - map.permission :delete_own_messages, { messages: :destroy }, require: :loggedin - end - - map.project_module :calendar do |map| - map.permission :view_calendar, :'work_packages/calendars' => [:index] - end - - map.project_module :activity - - map.project_module :timelines do |map| - map.permission :view_project_associations, - project_associations: [:index, :show] - map.permission :edit_project_associations, - { project_associations: [:edit, :update, :new, - :create, :available_projects] }, - require: :member - map.permission :delete_project_associations, - { project_associations: [:confirm_destroy, :destroy] }, - require: :member - - map.permission :view_timelines, - timelines: [:index, :show] - map.permission :edit_timelines, - { timelines: [:edit, :update, :new, :create] }, - require: :member - map.permission :delete_timelines, - { timelines: [:confirm_destroy, :destroy] }, - require: :member - - map.permission :view_reportings, - reportings: [:index, :all, :show] - map.permission :edit_reportings, - { reportings: [:new, :create, :edit, :update, :available_projects] }, - require: :member - map.permission :delete_reportings, - { reportings: [:confirm_destroy, :destroy] }, - require: :member - end -end - -Redmine::MenuManager.map :top_menu do |menu| - menu.push :my_page, { controller: '/my', action: 'page' }, html: { class: 'icon5 icon-star2' }, if: Proc.new { User.current.logged? } - # projects menu will be added by Redmine::MenuManager::TopMenuHelper#render_projects_top_menu_node - menu.push :administration, { controller: '/admin', action: 'projects' }, if: Proc.new { User.current.admin? }, last: true - menu.push :help, OpenProject::Info.help_url, last: true, caption: I18n.t('label_help'), html: { accesskey: OpenProject::AccessKeys.key_for(:help), class: 'icon5 icon-help' } -end - -Redmine::MenuManager.map :account_menu do |menu| - menu.push :my_account, { controller: '/my', action: 'account' }, if: Proc.new { User.current.logged? } - menu.push :logout, :signout_path, if: Proc.new { User.current.logged? } -end - -Redmine::MenuManager.map :application_menu do |_menu| - # Empty -end - -Redmine::MenuManager.map :my_menu do |menu| - menu.push :account, { controller: '/my', action: 'account' }, caption: :label_my_account, html: { class: 'icon2 icon-user1' } - menu.push :password, { controller: '/my', action: 'password' }, caption: :button_change_password, if: Proc.new { User.current.change_password_allowed? }, html: { class: 'icon2 icon-locked' } - - menu.push :delete_account, :deletion_info_path, - caption: I18n.t('account.delete'), - param: :user_id, - if: Proc.new { Setting.users_deletable_by_self? }, - html: { class: 'icon2 icon-delete' } -end - -Redmine::MenuManager.map :admin_menu do |menu| - menu.push :projects, { controller: '/admin', action: 'projects' }, caption: :label_project_plural, html: { class: 'icon2 icon-list-view2' } - menu.push :users, { controller: '/users' }, caption: :label_user_plural, html: { class: 'icon2 icon-user1' } - menu.push :groups, { controller: '/groups' }, caption: :label_group_plural, html: { class: 'icon2 icon-group' } - menu.push :roles, { controller: '/roles' }, caption: :label_role_and_permissions, html: { class: 'icon2 icon-settings' } - menu.push :types, { controller: '/types' }, caption: :label_type_plural, html: { class: 'icon2 icon-tracker' } - menu.push :statuses, { controller: '/statuses' }, caption: :label_work_package_status_plural, - html: { class: 'statuses icon2 icon-status' } - menu.push :workflows, { controller: '/workflows', action: 'edit' }, caption: Proc.new { Workflow.model_name.human }, html: { class: 'icon2 icon-status' } - menu.push :custom_fields, { controller: '/custom_fields' }, caption: :label_custom_field_plural, - html: { class: 'custom_fields icon2 icon-status' } - menu.push :enumerations, { controller: '/enumerations' }, html: { class: 'icon2 icon-status' } - menu.push :settings, { controller: '/settings' }, html: { class: 'icon2 icon-settings2' } - menu.push :ldap_authentication, - { controller: '/ldap_auth_sources', action: 'index' }, - html: { class: 'server_authentication icon2 icon-status' }, - if: proc { !OpenProject::Configuration.disable_password_login? } - menu.push :plugins, { controller: '/admin', action: 'plugins' }, last: true, html: { class: 'icon2 icon-status' } - menu.push :info, { controller: '/admin', action: 'info' }, caption: :label_information_plural, last: true, html: { class: 'icon2 icon-info' } - menu.push :colors, - { controller: '/planning_element_type_colors', action: 'index' }, - caption: :'timelines.admin_menu.colors', html: { class: 'icon2 icon-status' } - menu.push :project_types, - { controller: '/project_types', action: 'index' }, - caption: :'timelines.admin_menu.project_types', html: { class: 'icon2 icon-tracker' } -end - -Redmine::MenuManager.map :project_menu do |menu| - menu.push :overview, { controller: '/projects', action: 'show' }, - html: { class: 'icon2 icon-list-view2' } - - menu.push :activity, { controller: '/activities', action: 'index' }, - param: :project_id, - if: Proc.new { |p| p.module_enabled?('activity') }, - html: { class: 'icon2 icon-yes' } - - menu.push :roadmap, { controller: '/versions', action: 'index' }, - param: :project_id, - if: Proc.new { |p| p.shared_versions.any? }, - html: { class: 'icon2 icon-process-arrow1' } - - menu.push :work_packages, { controller: '/work_packages', action: 'index' }, - param: :project_id, - caption: :label_work_package_plural, - html: { - id: 'main-menu-work-packages', - class: 'icon2 icon-project-tree', - 'data-ui-route' => '', - query_menu_item: 'query_menu_item' - } - - menu.push :new_work_package, { controller: '/work_packages', action: 'new' }, - param: :project_id, - caption: :label_work_package_new, - parent: :work_packages, - html: { accesskey: OpenProject::AccessKeys.key_for(:new_work_package), class: 'icon2 icon-add' } - - menu.push :summary_field, { controller: '/work_packages/reports', action: 'report' }, - param: :project_id, - caption: :label_workflow_summary, - parent: :work_packages, - html: { class: 'icon2 icon-stats4' } - - menu.push :timelines, { controller: '/timelines', action: 'index' }, - param: :project_id, - caption: :'timelines.project_menu.timelines', - html: { class: 'icon2 icon-timeline-view' } - - menu.push :calendar, { controller: '/work_packages/calendars', action: 'index' }, - param: :project_id, - caption: :label_calendar, - html: { class: 'icon2 icon-calendar' } - - menu.push :news, { controller: '/news', action: 'index' }, - param: :project_id, - caption: :label_news_plural, - html: { class: 'icon2 icon-news' } - - menu.push :new_news, { controller: '/news', action: 'new' }, - param: :project_id, - caption: :label_news_new, - parent: :news, - if: Proc.new { |p| User.current.allowed_to?(:manage_news, p.project) }, - html: { class: 'icon2 icon-add' } - - menu.push :boards, { controller: '/boards', action: 'index', id: nil }, - param: :project_id, - if: Proc.new { |p| p.boards.any? }, - caption: :label_board_plural, - html: { class: 'icon2 icon-ticket-note' } - - menu.push :repository, { controller: '/repositories', action: 'show' }, - param: :project_id, - if: Proc.new { |p| p.repository && !p.repository.new_record? }, - html: { class: 'icon2 icon-open-folder' } - - menu.push :reportings, { controller: '/reportings', action: 'index' }, - param: :project_id, - caption: :'timelines.project_menu.reportings', - html: { class: 'icon2 icon-status-reporting' } - - menu.push :project_associations, { controller: '/project_associations', action: 'index' }, - param: :project_id, - caption: :'timelines.project_menu.project_associations', - if: Proc.new { |p| p.project_type.try :allows_association }, - html: { class: 'icon2 icon-dependency' } - - menu.push :settings, { controller: '/projects', action: 'settings' }, - caption: :label_project_settings, - last: true, - html: { class: 'icon2 icon-settings2' } -end - -Redmine::Activity.map do |activity| - activity.register :work_packages, class_name: 'Activity::WorkPackageActivityProvider' - activity.register :changesets, class_name: 'Activity::ChangesetActivityProvider' - activity.register :news, class_name: 'Activity::NewsActivityProvider', default: false - activity.register :wiki_edits, class_name: 'Activity::WikiContentActivityProvider', default: false - activity.register :messages, class_name: 'Activity::MessageActivityProvider', default: false - activity.register :time_entries, class_name: 'Activity::TimeEntryActivityProvider', default: false -end - -Redmine::Search.map do |search| - search.register :work_packages - search.register :news - search.register :changesets - search.register :wiki_pages - search.register :messages - search.register :projects -end - -Redmine::WikiFormatting.map do |format| - format.register :textile, Redmine::WikiFormatting::Textile::Formatter, Redmine::WikiFormatting::Textile::Helper -end