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