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