Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Create many new sprints at once. #1039

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions app/controllers/rb_master_backlogs_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,15 @@ def show
@release_backlogs.map{|r| r[:releases]}
].flatten.compact.map{|s| s.updated_on}.sort.last

@is_it_creation_of_many_sprints = params[:process_many_sprint]
if @is_it_creation_of_many_sprints then
team_params = params[:team_parameters]
@title_for_many_sprints = team_params[:sprint_title]
@associated_teams = team_params[:teams]
@start_date_for_many_sprints = team_params[:start_date]
@end_date_for_many_sprints = team_params[:end_date]
end

respond_to do |format|
format.html { render :layout => "rb"}
end
Expand Down Expand Up @@ -63,6 +72,11 @@ def menu

links << {:label => l(:label_new_sprint), :url => '#', :classname => 'add_new_sprint'
} unless @sprint || !User.current.allowed_to?(:create_sprints, @project)
if Setting.plugin_redmine_backlogs[:many_sprints_enabled] == 'enabled' then
links << {:label => "Many New Sprints",
:url => url_for(:controller => 'rb_teams', :action => 'create')
} unless @sprint || !User.current.allowed_to?(:create_many_sprints, @project)
end
links << {:label => l(:label_task_board),
:url => url_for(:controller => 'rb_taskboards', :action => 'show', :sprint_id => @sprint, :only_path => true)
} if @sprint && @sprint.stories.size > 0 && Backlogs.task_workflow(@project) && User.current.allowed_to?(:view_taskboards, @project)
Expand Down
22 changes: 22 additions & 0 deletions app/controllers/rb_teams_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
include RbCommonHelper
include RbFormHelper
include ProjectsHelper

class RbTeamsController < RbApplicationController

def create
@team = RbTeam.new(:project => @project)
if request.post?
if @team.areAttributesAssignedCorrectly?(params[:post])
flash[:notice] = @team.success
redirect_to :controller => 'rb_master_backlogs', :action => 'show',
:project_id => @project, :team_parameters => @team.getParams,
:process_many_sprint => true
else
flash[:error] = @team.fail
redirect_to :controller => 'rb_master_backlogs', :action => 'show', :project_id => @project
end
end
end

end
72 changes: 72 additions & 0 deletions app/models/rb_team.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
require 'date'

class RbTeam

def initialize(project)
@project = project
@current_date = Time.now.to_date
print "\n\n\t\t", @current_date, "\n"
end

def success
@success = "Successful creation."
end

def fail
@fail = "Creation failed: sprints end before start."
end

def areAttributesAssignedCorrectly?(parameters)

@teams = "t"
if Setting.plugin_redmine_backlogs[:number_of_teams].to_i == 1 then
@teams += parameters[:t1].to_s
else
for i in 1..Setting.plugin_redmine_backlogs[:number_of_teams].to_i
name = ":t" + i.to_s
@teams += parameters[name].to_s
end
end

@start_date = Time.new( parameters["form_start_date(1i)"],
parameters["form_start_date(2i)"],
parameters["form_start_date(3i)"]).to_date

@end_date = Time.new( parameters["form_end_date(1i)"],
parameters["form_end_date(2i)"],
parameters["form_end_date(3i)"]).to_date

@sprint_title = Setting.plugin_redmine_backlogs[:alternative_sprint_name] + " " +
parameters[:partial_title] + " " +
Setting.plugin_redmine_backlogs[:teams_prefix_name]

@params = { :sprint_title => @sprint_title,
:start_date => @start_date.to_s,
:end_date => @end_date.to_s,
:teams => @teams }

if(isCorrectDate?)
printAssignedAttr
return true
else
return false
end
end

def getParams
return @params
end

def printAssignedAttr
print "Hash variable: ", @params, "_\n"
end

def isCorrectDate?
if( @start_date < @end_date) then
return true
else
return false
end
end

end
27 changes: 27 additions & 0 deletions app/views/backlogs/_settings.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -307,3 +307,30 @@
%><span style="margin-left: 12px;"><%= l(:backlogs_sharing_new_sprint_explanation) %></span>
</p>
</fieldset>

<fieldset>
<legend><%= "Sprints settings" %></legend>
<p>
<%= content_tag(:label, "Enable option \"Many New Sprints\"") %>
<%= check_box_tag("settings[many_sprints_enabled]", 'enabled',
Backlogs.setting[:many_sprints_enabled]) %>
</p>
<p>
<%= content_tag(:label, "Teams' name without number:") %>
<%= text_field_tag("settings[teams_prefix_name]",
Backlogs.setting[:teams_prefix_name]) %>
e.g. for teams' name "T " it's genereted: "T 1", "T 2"...
</p>
<p>
<%= content_tag(:label, "Number of teams:") %>
<%= select_tag("settings[number_of_teams]",
options_for_select(
(2..50).step(1).collect { |s| ["#{s}", s] },
Backlogs.setting[:number_of_teams]))%>
</p>
<p>
<%= content_tag(:label, "Alternative name for \"sprint\"") %>
<% value = Backlogs.setting[:alternative_sprint_name].nil? ? "sprint" : Backlogs.setting[:alternative_sprint_name] %>
<%= text_field_tag("settings[alternative_sprint_name]", value) %>
</p>
</fieldset>
9 changes: 9 additions & 0 deletions app/views/layouts/rb.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,15 @@ RB.$(function(){
<% end %>

<div id="main" class="rb-main rb-theme-default <%= sidebar_content? ? '' : 'nosidebar' %>">

<% if @is_it_creation_of_many_sprints then %>
<%= content_tag "div", id: "creation_of_many_sprints", data: {manysprints: true} do -%>
<% end %>
<br>
<%= content_tag "div", id: "associated_teams", data: {associateteams: @associated_teams} do -%>
<% end %>
<% end %>

<div id="sidebar">
<%= yield :sidebar %>
<%= view_layouts_base_sidebar_hook_response %>
Expand Down
16 changes: 16 additions & 0 deletions app/views/rb_master_backlogs/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

<%= javascript_include_tag(
'master_backlog',
'teams',
'backlog',
'backlog_options',
'model',
Expand Down Expand Up @@ -100,6 +101,21 @@
<%- sprint_backlog = { :sprint => sprint, :stories => nil } -%>
<%= render :partial => "backlog", :object => sprint_backlog %>
</div>

<% if @associated_teams != nil then %>
<% for i in 1..(@associated_teams.length - 1) %>
<% id_name = "sprint_template_team" + ((i < 10) ? ("0" + i.to_s) : i.to_s) %>
<div id="<%= id_name %>">
<% title = @title_for_many_sprints.to_s + i.to_s %>
<%- sprint = RbSprint.new( :name => title,
:sprint_start_date => @start_date_for_many_sprints,
:effective_date => @end_date_for_many_sprints) -%>
<%- sprint_backlog = { :sprint => sprint, :stories => nil } -%>
<%= render :partial => "backlog", :object => sprint_backlog %>
</div>
<% end %>
<% end %>

<%= render :partial => "rb_stories/helpers" %>
<div id="last_updated"><%= date_string_with_milliseconds(@last_update, 0.001) %></div>
<%- end %>
55 changes: 55 additions & 0 deletions app/views/rb_teams/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<div class="box tabular">
<p>
<%= f.label "Number" %>
<%= f.text_field :partial_title, :required => true %>
(e.g. result: <%= Setting.plugin_redmine_backlogs[:alternative_sprint_name] %>
XXXX <%= Setting.plugin_redmine_backlogs[:teams_prefix_name] %>1, where XXXX is gathered number)
</p>
<p>
<%= f.label (Setting.plugin_redmine_backlogs[:alternative_sprint_name].capitalize + " - start date") %>
<%= f.date_select :form_start_date %>
</p>
<p>
<%= f.label (Setting.plugin_redmine_backlogs[:alternative_sprint_name].capitalize + " - end date") %>
<%= f.date_select :form_end_date %>
</p>
<p>
<%= f.label "Associate with teams:" %>
<% wrap_manually_columns = 1 %>
<% number_of_teams_in_one_column = 6 %>
<% if wrap_manually_columns == 1 then %>
<div style="margin-left: 180px;">
<div style=" display: inline-block; vertical-align: top;">
<% if Setting.plugin_redmine_backlogs[:number_of_teams].to_i == 1 then %>
<%= f.check_box :t1, {:checked=>true} %>
<%= Setting.plugin_redmine_backlogs[:teams_prefix_name] + "1" %>
<% else %>
<% for i in 1..Setting.plugin_redmine_backlogs[:number_of_teams].to_i %>
<% name = ":t" + i.to_s %>
<%= f.check_box name, {:checked=>true} %>
<%= Setting.plugin_redmine_backlogs[:teams_prefix_name] + i.to_s %>

<% if i%number_of_teams_in_one_column == 0 then %>
</div><div style=" display: inline-block; vertical-align: top;">
<% else %>
<br>
<% end %>
<% end %>
<% end %>
</div>
</div>
<% else %>
<% if Setting.plugin_redmine_backlogs[:number_of_teams].to_i == 1 then %>
<%= f.check_box :t1, {:checked=>true} %>
<%= Setting.plugin_redmine_backlogs[:teams_prefix_name] + "1" %>
<% else %>
<% for i in 1..Setting.plugin_redmine_backlogs[:number_of_teams].to_i %>
<% name = ":t" + i.to_s %>
<%= f.check_box name, {:checked=>true} %>
<%= Setting.plugin_redmine_backlogs[:teams_prefix_name] + i.to_s %>
<br>
<% end %>
<% end %>
<% end %>
</p>
</div>
7 changes: 7 additions & 0 deletions app/views/rb_teams/create.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<h2><%= "Many New Sprints"%></h2>

<%= form_for :post do |f| %>
<%= render :partial => 'rb_teams/form', :locals => { :f => f } %>
<%= f.submit "Create sprints"%>
<% end %>
</div>
29 changes: 27 additions & 2 deletions assets/javascripts/backlog.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,12 @@ RB.Backlog = RB.Object.create({
});

this.recalcVelocity();

if ($('#creation_of_many_sprints').data('manysprints') &&
is_creation_of_many_sprints_done_ones == false){
is_creation_of_many_sprints_done_ones = true;
this.newManySprint();
}
},

afterCreate: function(data, textStatus, xhr){
Expand Down Expand Up @@ -271,7 +277,7 @@ RB.Backlog = RB.Object.create({
isReleaseBacklog: function(){
return RB.$(this.el).find('.release').length == 1; // return true if backlog has an element with class="release"
},

newStory: function(project_id) {
var story = RB.$('#story_template').children().first().clone();
if(project_id) {
Expand All @@ -291,7 +297,7 @@ RB.Backlog = RB.Object.create({
scrollTop: story.find('.editor').first().offset().top-100
}, 200);
},

newSprint: function(){
var sprint_backlog = RB.$('#sprint_template').children().first().clone();

Expand All @@ -304,6 +310,25 @@ RB.Backlog = RB.Object.create({
}, 200);
},

newManySprint: function(){
var arrayOfManySprintsBacklogs={};
var associated_teams = ($('#associated_teams').data('associateteams')).toString();

for (var i = 2; i <= associated_teams.length; i++){
if(associated_teams[i-1] == 1)
{
var team_number_leads_by_zeros = (i-1 < 10) ? ("0" + (i-1)) : i-1;

arrayOfManySprintsBacklogs[i] = RB.$('#sprint_template_team'+team_number_leads_by_zeros).children().first().clone();
RB.$("*#sprint_backlogs_container").append(arrayOfManySprintsBacklogs[i]);
o = RB.Factory.initialize(RB.Backlog, arrayOfManySprintsBacklogs[i]);
o.edit();
o.saveEdits();
}
}
if (RB.BacklogOptionsInstance) RB.BacklogOptionsInstance.showSprintPanel();
},

recalcVelocity: function(){
var tracker_total = new Array();
total = 0;
Expand Down
4 changes: 4 additions & 0 deletions assets/javascripts/teams.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// This 'is_creation_of_many_sprints_done_ones' is global variable
// used as flag to add new sprints in backlog.js.

is_creation_of_many_sprints_done_ones = false;
1 change: 1 addition & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ en:
label_master_backlog: "Master Backlog"
label_my_tasks: "My tasks"
label_new_sprint: "New Sprint"
label_many_new_sprints: "Many New Sprints"
label_new_story: "New Story"
label_no_data_to_show: "No data to show"
label_no_end: "no end"
Expand Down
3 changes: 3 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ def rb_common_routes(rb)
rb_match rb, 'release/:release_id/shapshot',
:to => 'rb_releases#snapshot', :via => [:get]

rb_match rb, 'team/:project_id/create',
:to => 'rb_teams#create', :via => [:get, :post]

rb_match rb, 'releases_multiview/:project_id/new',
:to => 'rb_releases_multiview#new', :via => [:get, :post]
rb_match rb, 'releases_multiview/:release_multiview_id',
Expand Down
2 changes: 2 additions & 0 deletions features/step_definitions/helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ def setup_permissions(typ)
role.permissions << :view_wiki_pages # NOTE: This is a Redmine core permission
role.permissions << :edit_wiki_pages # NOTE: This is a Redmine core permission
role.permissions << :create_sprints
role.permissions << :create_many_sprints
elsif typ == 'team member'
role.permissions << :view_master_backlog
role.permissions << :view_releases
Expand All @@ -255,6 +256,7 @@ def setup_permissions(typ)
role.permissions << :modify_releases
role.permissions << :view_scrum_statistics
role.permissions << :configure_backlogs
role.permissions << :create_many_sprints
end
role.save!

Expand Down
1 change: 1 addition & 0 deletions init.rb
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@
# Sprint permissions
# :show_sprints and :list_sprints are implicit in :view_master_backlog permission
permission :create_sprints, { :rb_sprints => [:new, :create] }
permission :create_many_sprints, { :rb_teams => [:create] }
permission :update_sprints, {
:rb_sprints => [:edit, :update, :close],
:rb_wikis => [:edit, :update]
Expand Down