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