Chris@1494: # Redmine - project management software Chris@1494: # Copyright (C) 2006-2014 Jean-Philippe Lang Chris@1494: # Chris@1494: # This program is free software; you can redistribute it and/or Chris@1494: # modify it under the terms of the GNU General Public License Chris@1494: # as published by the Free Software Foundation; either version 2 Chris@1494: # of the License, or (at your option) any later version. Chris@1494: # Chris@1494: # This program is distributed in the hope that it will be useful, Chris@1494: # but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@1494: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@1494: # GNU General Public License for more details. Chris@1494: # Chris@1494: # You should have received a copy of the GNU General Public License Chris@1494: # along with this program; if not, write to the Free Software Chris@1494: # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Chris@1494: Chris@1494: module Redmine Chris@1494: module DefaultData Chris@1494: class DataAlreadyLoaded < Exception; end Chris@1494: Chris@1494: module Loader Chris@1494: include Redmine::I18n Chris@1494: Chris@1494: class << self Chris@1494: # Returns true if no data is already loaded in the database Chris@1494: # otherwise false Chris@1494: def no_data? Chris@1494: !Role.where(:builtin => 0).exists? && Chris@1494: !Tracker.exists? && Chris@1494: !IssueStatus.exists? && Chris@1494: !Enumeration.exists? Chris@1494: end Chris@1494: Chris@1494: # Loads the default data Chris@1494: # Raises a RecordNotSaved exception if something goes wrong Chris@1494: def load(lang=nil) Chris@1494: raise DataAlreadyLoaded.new("Some configuration data is already loaded.") unless no_data? Chris@1494: set_language_if_valid(lang) Chris@1494: Chris@1494: Role.transaction do Chris@1494: # Roles Chris@1494: manager = Role.create! :name => l(:default_role_manager), Chris@1494: :issues_visibility => 'all', Chris@1494: :position => 1 Chris@1494: manager.permissions = manager.setable_permissions.collect {|p| p.name} Chris@1494: manager.save! Chris@1494: Chris@1494: developer = Role.create! :name => l(:default_role_developer), Chris@1494: :position => 2, Chris@1494: :permissions => [:manage_versions, Chris@1494: :manage_categories, Chris@1494: :view_issues, Chris@1494: :add_issues, Chris@1494: :edit_issues, Chris@1494: :view_private_notes, Chris@1494: :set_notes_private, Chris@1494: :manage_issue_relations, Chris@1494: :manage_subtasks, Chris@1494: :add_issue_notes, Chris@1494: :save_queries, Chris@1494: :view_gantt, Chris@1494: :view_calendar, Chris@1494: :log_time, Chris@1494: :view_time_entries, Chris@1494: :comment_news, Chris@1494: :view_documents, Chris@1494: :view_wiki_pages, Chris@1494: :view_wiki_edits, Chris@1494: :edit_wiki_pages, Chris@1494: :delete_wiki_pages, Chris@1494: :add_messages, Chris@1494: :edit_own_messages, Chris@1494: :view_files, Chris@1494: :manage_files, Chris@1494: :browse_repository, Chris@1494: :view_changesets, Chris@1494: :commit_access, Chris@1494: :manage_related_issues] Chris@1494: Chris@1494: reporter = Role.create! :name => l(:default_role_reporter), Chris@1494: :position => 3, Chris@1494: :permissions => [:view_issues, Chris@1494: :add_issues, Chris@1494: :add_issue_notes, Chris@1494: :save_queries, Chris@1494: :view_gantt, Chris@1494: :view_calendar, Chris@1494: :log_time, Chris@1494: :view_time_entries, Chris@1494: :comment_news, Chris@1494: :view_documents, Chris@1494: :view_wiki_pages, Chris@1494: :view_wiki_edits, Chris@1494: :add_messages, Chris@1494: :edit_own_messages, Chris@1494: :view_files, Chris@1494: :browse_repository, Chris@1494: :view_changesets] Chris@1494: Chris@1494: Role.non_member.update_attribute :permissions, [:view_issues, Chris@1494: :add_issues, Chris@1494: :add_issue_notes, Chris@1494: :save_queries, Chris@1494: :view_gantt, Chris@1494: :view_calendar, Chris@1494: :view_time_entries, Chris@1494: :comment_news, Chris@1494: :view_documents, Chris@1494: :view_wiki_pages, Chris@1494: :view_wiki_edits, Chris@1494: :add_messages, Chris@1494: :view_files, Chris@1494: :browse_repository, Chris@1494: :view_changesets] Chris@1494: Chris@1494: Role.anonymous.update_attribute :permissions, [:view_issues, Chris@1494: :view_gantt, Chris@1494: :view_calendar, Chris@1494: :view_time_entries, Chris@1494: :view_documents, Chris@1494: :view_wiki_pages, Chris@1494: :view_wiki_edits, Chris@1494: :view_files, Chris@1494: :browse_repository, Chris@1494: :view_changesets] Chris@1494: Chris@1494: # Trackers Chris@1494: Tracker.create!(:name => l(:default_tracker_bug), :is_in_chlog => true, :is_in_roadmap => false, :position => 1) Chris@1494: Tracker.create!(:name => l(:default_tracker_feature), :is_in_chlog => true, :is_in_roadmap => true, :position => 2) Chris@1494: Tracker.create!(:name => l(:default_tracker_support), :is_in_chlog => false, :is_in_roadmap => false, :position => 3) Chris@1494: Chris@1494: # Issue statuses Chris@1494: new = IssueStatus.create!(:name => l(:default_issue_status_new), :is_closed => false, :is_default => true, :position => 1) Chris@1494: in_progress = IssueStatus.create!(:name => l(:default_issue_status_in_progress), :is_closed => false, :is_default => false, :position => 2) Chris@1494: resolved = IssueStatus.create!(:name => l(:default_issue_status_resolved), :is_closed => false, :is_default => false, :position => 3) Chris@1494: feedback = IssueStatus.create!(:name => l(:default_issue_status_feedback), :is_closed => false, :is_default => false, :position => 4) Chris@1494: closed = IssueStatus.create!(:name => l(:default_issue_status_closed), :is_closed => true, :is_default => false, :position => 5) Chris@1494: rejected = IssueStatus.create!(:name => l(:default_issue_status_rejected), :is_closed => true, :is_default => false, :position => 6) Chris@1494: Chris@1494: # Workflow Chris@1494: Tracker.all.each { |t| Chris@1494: IssueStatus.all.each { |os| Chris@1494: IssueStatus.all.each { |ns| Chris@1494: WorkflowTransition.create!(:tracker_id => t.id, :role_id => manager.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns Chris@1494: } Chris@1494: } Chris@1494: } Chris@1494: Chris@1494: Tracker.all.each { |t| Chris@1494: [new, in_progress, resolved, feedback].each { |os| Chris@1494: [in_progress, resolved, feedback, closed].each { |ns| Chris@1494: WorkflowTransition.create!(:tracker_id => t.id, :role_id => developer.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns Chris@1494: } Chris@1494: } Chris@1494: } Chris@1494: Chris@1494: Tracker.all.each { |t| Chris@1494: [new, in_progress, resolved, feedback].each { |os| Chris@1494: [closed].each { |ns| Chris@1494: WorkflowTransition.create!(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => os.id, :new_status_id => ns.id) unless os == ns Chris@1494: } Chris@1494: } Chris@1494: WorkflowTransition.create!(:tracker_id => t.id, :role_id => reporter.id, :old_status_id => resolved.id, :new_status_id => feedback.id) Chris@1494: } Chris@1494: Chris@1494: # Enumerations Chris@1494: IssuePriority.create!(:name => l(:default_priority_low), :position => 1) Chris@1494: IssuePriority.create!(:name => l(:default_priority_normal), :position => 2, :is_default => true) Chris@1494: IssuePriority.create!(:name => l(:default_priority_high), :position => 3) Chris@1494: IssuePriority.create!(:name => l(:default_priority_urgent), :position => 4) Chris@1494: IssuePriority.create!(:name => l(:default_priority_immediate), :position => 5) Chris@1494: Chris@1494: DocumentCategory.create!(:name => l(:default_doc_category_user), :position => 1) Chris@1494: DocumentCategory.create!(:name => l(:default_doc_category_tech), :position => 2) Chris@1494: Chris@1494: TimeEntryActivity.create!(:name => l(:default_activity_design), :position => 1) Chris@1494: TimeEntryActivity.create!(:name => l(:default_activity_development), :position => 2) Chris@1494: end Chris@1494: true Chris@1494: end Chris@1494: end Chris@1494: end Chris@1494: end Chris@1494: end