[refs #194] assignee & user
This commit is contained in:
parent
ba9184cc49
commit
2dedbd92d0
|
@ -128,28 +128,28 @@ $(document).ready(function() {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
function remExecutor(form) {
|
function remAssignee(form) {
|
||||||
var el = form.find('.people.selected.remove_executor');
|
var el = form.find('.people.selected.remove_assignee');
|
||||||
var id = el.attr('id');
|
var id = el.attr('id');
|
||||||
$('#manage_issue_users_list .add_executor.people.selected').removeClass('select');
|
$('#manage_issue_users_list .add_assignee.people.selected').removeClass('select');
|
||||||
el.remove();
|
el.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
$('.add_executor.people.selected').live('click', function() {
|
$('.add_assignee.people.selected').live('click', function() {
|
||||||
var form_new = $('form.issue');
|
var form_new = $('form.issue');
|
||||||
var form_edit = $('form.edit_form.issue');
|
var form_edit = $('form.edit_form.issue');
|
||||||
form_new.find('#people-span').fadeOut(0);
|
form_new.find('#people-span').fadeOut(0);
|
||||||
remExecutor(form_new);
|
remAssignee(form_new);
|
||||||
var clone = $(this).clone().removeClass('add_executor').addClass('remove_executor');
|
var clone = $(this).clone().removeClass('add_assignee').addClass('remove_assignee');
|
||||||
form_new.find('#issue_executor').html(clone);
|
form_new.find('#issue_assignee').html(clone);
|
||||||
$('.current_executor').html(clone.removeClass('select'));
|
$('.current_assignee').html(clone.removeClass('select'));
|
||||||
$(this).addClass('select');
|
$(this).addClass('select');
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.remove_executor.people.selected').live('click', function() {
|
$('.remove_assignee.people.selected').live('click', function() {
|
||||||
var form = $('form.issue, form.edit_form issue');
|
var form = $('form.issue, form.edit_form issue');
|
||||||
form.find('#people-span').fadeIn(0);
|
form.find('#people-span').fadeIn(0);
|
||||||
remExecutor(form);
|
remAssignee(form);
|
||||||
});
|
});
|
||||||
|
|
||||||
function remLabel(form, id) {
|
function remLabel(form, id) {
|
||||||
|
@ -241,9 +241,9 @@ $(document).ready(function() {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.button.manage_executor').live('click', function() {
|
$('.button.manage_assignee').live('click', function() {
|
||||||
$('form#search_user, .button.update_executor').fadeIn(0);
|
$('form#search_user, .button.update_assignee').fadeIn(0);
|
||||||
$('.current_executor .people').addClass('remove_executor selected').removeClass('nopointer');
|
$('.current_assignee .people').addClass('remove_assignee selected').removeClass('nopointer');
|
||||||
$(this).fadeOut(0);
|
$(this).fadeOut(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -254,16 +254,16 @@ $(document).ready(function() {
|
||||||
$(this).fadeOut(0);
|
$(this).fadeOut(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
$('.button.update_executor').live('click', function() {
|
$('.button.update_assignee').live('click', function() {
|
||||||
var form = $('form.edit_executor.issue');
|
var form = $('form.edit_assignee.issue');
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
url: form.attr("action"),
|
url: form.attr("action"),
|
||||||
data: form.serialize(),
|
data: form.serialize(),
|
||||||
success: function(data){
|
success: function(data){
|
||||||
$('.current_executor .people').removeClass('remove_executor selected').addClass('nopointer');
|
$('.current_assignee .people').removeClass('remove_assignee selected').addClass('nopointer');
|
||||||
$('form#search_user, .button.update_executor').fadeOut(0);
|
$('form#search_user, .button.update_assignee').fadeOut(0);
|
||||||
$('.button.manage_executor').fadeIn(0);
|
$('.button.manage_assignee').fadeIn(0);
|
||||||
$('#manage_issue_users_list').html('');
|
$('#manage_issue_users_list').html('');
|
||||||
},
|
},
|
||||||
error: function(data){
|
error: function(data){
|
||||||
|
|
|
@ -14,7 +14,7 @@ class IssuesController < ApplicationController
|
||||||
@status = params[:status] == 'closed' ? 'closed' : 'open'
|
@status = params[:status] == 'closed' ? 'closed' : 'open'
|
||||||
@labels = params[:labels] || []
|
@labels = params[:labels] || []
|
||||||
@issues = @project.issues
|
@issues = @project.issues
|
||||||
@issues = @issues.where(:user_id => current_user.id) if @is_assigned_to_me
|
@issues = @issues.where(:assignee_id => current_user.id) if @is_assigned_to_me
|
||||||
@issues = @issues.joins(:labels).where(:labels => {:name => @labels}) unless @labels == []
|
@issues = @issues.joins(:labels).where(:labels => {:name => @labels}) unless @labels == []
|
||||||
|
|
||||||
if params[:search_issue]
|
if params[:search_issue]
|
||||||
|
@ -25,7 +25,7 @@ class IssuesController < ApplicationController
|
||||||
@issues = @issues.where(:status => @status)
|
@issues = @issues.where(:status => @status)
|
||||||
|
|
||||||
|
|
||||||
@issues = @issues.includes(:creator, :user).order('serial_id desc').uniq.paginate :per_page => 10, :page => params[:page]
|
@issues = @issues.includes(:assignee, :user).order('serial_id desc').uniq.paginate :per_page => 10, :page => params[:page]
|
||||||
if status == 200
|
if status == 200
|
||||||
render 'index', :layout => request.format == '*/*' ? 'issues' : 'application' # maybe FIXME '*/*'?
|
render 'index', :layout => request.format == '*/*' ? 'issues' : 'application' # maybe FIXME '*/*'?
|
||||||
else
|
else
|
||||||
|
@ -38,9 +38,9 @@ class IssuesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@user_uname = params[:user_uname]
|
@assignee_uname = params[:assignee_uname]
|
||||||
@issue = @project.issues.new(params[:issue])
|
@issue = @project.issues.new(params[:issue])
|
||||||
@issue.creator_id = current_user.id
|
@issue.user_id = current_user.id
|
||||||
|
|
||||||
if @issue.save
|
if @issue.save
|
||||||
@issue.subscribe_creator(current_user.id)
|
@issue.subscribe_creator(current_user.id)
|
||||||
|
|
|
@ -19,17 +19,17 @@ class ActivityFeedObserver < ActiveRecord::Observer
|
||||||
ActivityFeed.create(
|
ActivityFeed.create(
|
||||||
:user => recipient,
|
:user => recipient,
|
||||||
:kind => 'new_issue_notification',
|
:kind => 'new_issue_notification',
|
||||||
:data => {:user_name => record.creator.name, :user_email => record.creator.email, :user_id => record.creator_id,:issue_serial_id => record.serial_id,
|
:data => {:user_name => record.user.name, :user_email => record.user.email, :user_id => record.user_id,:issue_serial_id => record.serial_id,
|
||||||
:issue_title => record.title, :project_id => record.project.id, :project_name => record.project.name, :project_owner => record.project.owner.uname}
|
:issue_title => record.title, :project_id => record.project.id, :project_name => record.project.name, :project_owner => record.project.owner.uname}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
if record.user_id_changed?
|
if record.assignee_id_changed?
|
||||||
UserMailer.delay.issue_assign_notification(record, record.user) if record.user.notifier.issue_assign && record.user.notifier.can_notify
|
UserMailer.delay.issue_assign_notification(record, record.assignee) if record.assignee.notifier.issue_assign && record.assignee.notifier.can_notify
|
||||||
ActivityFeed.create(
|
ActivityFeed.create(
|
||||||
:user => record.user,
|
:user => record.user,
|
||||||
:kind => 'issue_assign_notification',
|
:kind => 'issue_assign_notification',
|
||||||
:data => {:user_name => record.creator.name, :user_email => record.creator.email, :user_id => record.creator_id, :issue_serial_id => record.serial_id,
|
:data => {:user_name => record.user.name, :user_email => record.user.email, :user_id => record.user_id, :issue_serial_id => record.serial_id,
|
||||||
:project_id => record.project.id, :issue_title => record.title, :project_name => record.project.name, :project_owner => record.project.owner.uname}
|
:project_id => record.project.id, :issue_title => record.title, :project_name => record.project.name, :project_owner => record.project.owner.uname}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
@ -121,12 +121,12 @@ class ActivityFeedObserver < ActiveRecord::Observer
|
||||||
def after_update(record)
|
def after_update(record)
|
||||||
case record.class.to_s
|
case record.class.to_s
|
||||||
when 'Issue'
|
when 'Issue'
|
||||||
if record.user_id && record.user_id_changed?
|
if record.assignee_id && record.assignee_id_changed?
|
||||||
UserMailer.delay.issue_assign_notification(record, record.user) if record.user.notifier.issue_assign && record.user.notifier.can_notify
|
UserMailer.delay.issue_assign_notification(record, record.assignee) if record.assignee.notifier.issue_assign && record.assignee.notifier.can_notify
|
||||||
ActivityFeed.create(
|
ActivityFeed.create(
|
||||||
:user => record.user,
|
:user => record.assignee,
|
||||||
:kind => 'issue_assign_notification',
|
:kind => 'issue_assign_notification',
|
||||||
:data => {:user_name => record.user.name, :user_email => record.user.email, :issue_serial_id => record.serial_id, :issue_title => record.title,
|
:data => {:user_name => record.assignee.name, :user_email => record.assignee.email, :issue_serial_id => record.serial_id, :issue_title => record.title,
|
||||||
:project_id => record.project.id, :project_name => record.project.name, :project_owner => record.project.owner.uname}
|
:project_id => record.project.id, :project_name => record.project.name, :project_owner => record.project.owner.uname}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,30 +4,28 @@ class Issue < ActiveRecord::Base
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
belongs_to :creator, :class_name => 'User', :foreign_key => 'creator_id'
|
belongs_to :assignee, :class_name => 'User', :foreign_key => 'assignee_id'
|
||||||
belongs_to :closer, :class_name => 'User', :foreign_key => 'closed_by'
|
belongs_to :closer, :class_name => 'User', :foreign_key => 'closed_by'
|
||||||
|
|
||||||
has_many :comments, :as => :commentable, :dependent => :destroy #, :finder_sql => proc { "comments.commentable_id = '#{self.id}' AND comments.commentable_type = '#{self.class.name}'"}
|
has_many :comments, :as => :commentable, :dependent => :destroy
|
||||||
has_many :subscribes, :as => :subscribeable, :dependent => :destroy #, :finder_sql => proc { "subscribes.subscribeable_id = '#{self.id}' AND subscribes.subscribeable_type = '#{self.class.name}'"}
|
has_many :subscribes, :as => :subscribeable, :dependent => :destroy
|
||||||
has_many :labels, :through => :labelings, :uniq => true
|
has_many :labels, :through => :labelings, :uniq => true
|
||||||
has_many :labelings
|
has_many :labelings
|
||||||
|
|
||||||
validates :title, :body, :project_id, :presence => true
|
validates :title, :body, :project_id, :presence => true
|
||||||
|
|
||||||
#attr_readonly :serial_id
|
|
||||||
|
|
||||||
after_create :set_serial_id
|
after_create :set_serial_id
|
||||||
after_create :subscribe_users
|
after_create :subscribe_users
|
||||||
after_update :subscribe_issue_assigned_user
|
after_update :subscribe_issue_assigned_user
|
||||||
|
|
||||||
attr_accessible :labelings_attributes, :title, :body, :user_id
|
attr_accessible :labelings_attributes, :title, :body, :assignee_id
|
||||||
accepts_nested_attributes_for :labelings, :allow_destroy => true
|
accepts_nested_attributes_for :labelings, :allow_destroy => true
|
||||||
|
|
||||||
scope :opened, where(:status => 'open', :closed_by => nil, :closed_at => nil)
|
scope :opened, where(:status => 'open', :closed_by => nil, :closed_at => nil)
|
||||||
scope :closed, where(:status => 'closed').where("closed_by is not null and closed_at is not null")
|
scope :closed, where(:status => 'closed').where("closed_by is not null and closed_at is not null")
|
||||||
|
|
||||||
def assign_uname
|
def assign_uname
|
||||||
user.uname if user
|
assignee.uname if assignee
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_param
|
def to_param
|
||||||
|
@ -57,7 +55,7 @@ class Issue < ActiveRecord::Base
|
||||||
|
|
||||||
def collect_recipient_ids
|
def collect_recipient_ids
|
||||||
recipients = self.project.relations.by_role('admin').where(:object_type => 'User').map { |rel| rel.read_attribute(:object_id) }
|
recipients = self.project.relations.by_role('admin').where(:object_type => 'User').map { |rel| rel.read_attribute(:object_id) }
|
||||||
recipients = recipients | [self.user_id] if self.user_id
|
recipients = recipients | [self.assignee_id] if self.assignee_id
|
||||||
recipients = recipients | [self.project.owner_id] if self.project.owner_type == 'User'
|
recipients = recipients | [self.project.owner_id] if self.project.owner_type == 'User'
|
||||||
|
|
||||||
recipients
|
recipients
|
||||||
|
@ -80,10 +78,10 @@ class Issue < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def subscribe_issue_assigned_user
|
def subscribe_issue_assigned_user
|
||||||
if self.user_id && self.user_id_changed?
|
if self.assignee_id && self.assignee_id_changed?
|
||||||
self.subscribes.where(:user_id => self.user_id_was).first.destroy unless self.user_id_was.blank?
|
self.subscribes.where(:user_id => self.assignee_id_was).first.destroy unless self.assignee_id_was.blank?
|
||||||
if self.user.notifier.issue_assign && !self.subscribes.exists?(:user_id => self.user_id)
|
if self.assignee.notifier.issue_assign && !self.subscribes.exists?(:user_id => self.assignee_id)
|
||||||
self.subscribes.create(:user_id => self.user_id)
|
self.subscribes.create(:user_id => self.assignee_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,12 +3,12 @@
|
||||||
.leftlist= t('activerecord.attributes.issue.body') + ':'
|
.leftlist= t('activerecord.attributes.issue.body') + ':'
|
||||||
.rightlist= f.text_area :body
|
.rightlist= f.text_area :body
|
||||||
.both
|
.both
|
||||||
.leftlist= t('activerecord.attributes.issue.user') + ':'
|
.leftlist= t('activerecord.attributes.issue.assignee') + ':'
|
||||||
.rightlist
|
.rightlist
|
||||||
%span#people-span.small-text= t('layout.issues.choose_user_on_left')
|
%span#people-span.small-text= t('layout.issues.choose_user_on_left')
|
||||||
#issue_executor
|
#issue_assignee
|
||||||
.both
|
.both
|
||||||
.leftlist= t('layout.issues.labels')
|
.leftlist= t('layout.issues.labels') + ':'
|
||||||
.rightlist
|
.rightlist
|
||||||
%span#flag-span.small-text= t('layout.issues.choose_labels_on_left')
|
%span#flag-span.small-text= t('layout.issues.choose_labels_on_left')
|
||||||
#issue_labels
|
#issue_labels
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
%tr
|
%tr
|
||||||
%td=radio_button_tag :myradio, 'to_me', @is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'}
|
%td=radio_button_tag :myradio, 'to_me', @is_assigned_to_me, {:id => 'myradio1', :class => 'niceRadio', :name => 'filter'}
|
||||||
%td=t("layout.issues.to_me")
|
%td=t("layout.issues.to_me")
|
||||||
%td.width30.right=@project.issues.where(:user_id => current_user).count
|
%td.width30.right=@project.issues.where(:assignee_id => current_user.id).count
|
||||||
=form_tag project_issues_path(@project), :id => 'search_issue', :method => :get do
|
=form_tag project_issues_path(@project), :id => 'search_issue', :method => :get do
|
||||||
.bordered.bpadding20
|
.bordered.bpadding20
|
||||||
=tracker_search_field(:search_issue, t('layout.issues.search'))
|
=tracker_search_field(:search_issue, t('layout.issues.search'))
|
||||||
|
|
|
@ -7,15 +7,15 @@
|
||||||
%div.issue_title=issue.title
|
%div.issue_title=issue.title
|
||||||
.smalltext
|
.smalltext
|
||||||
=issue.created_at.to_s(:long)
|
=issue.created_at.to_s(:long)
|
||||||
=t("layout.by") if issue.creator
|
=t("layout.by") if issue.user
|
||||||
=link_to(issue.creator.uname, user_path(issue.creator)) if issue.creator
|
=link_to(issue.user.uname, user_path(issue.user)) if issue.user
|
||||||
-issue.labels.each do |label|
|
-issue.labels.each do |label|
|
||||||
.left.nomargin
|
.left.nomargin
|
||||||
.label.selected.tracker.left
|
.label.selected.tracker.left
|
||||||
.labeltext.selected{:style => "background: ##{label.color};"}=label.name
|
.labeltext.selected{:style => "background: ##{label.color};"}=label.name
|
||||||
%td.td3
|
%td.td3
|
||||||
.avatar
|
.avatar
|
||||||
=link_to image_tag(avatar_url(issue.user), :alt => 'avatar'), user_path(issue.user) if issue.user
|
=link_to image_tag(avatar_url(issue.assignee), :alt => 'avatar'), user_path(issue.assignee) if issue.assignee
|
||||||
%a{:href => "#{project_issue_path @project, issue}#block-list"}
|
%a{:href => "#{project_issue_path @project, issue}#block-list"}
|
||||||
.answers
|
.answers
|
||||||
.pic= image_tag 'answers.png'
|
.pic= image_tag 'answers.png'
|
||||||
|
|
|
@ -10,30 +10,30 @@
|
||||||
=form_tag [@project, @issue], :id => 'update_issue_status', :method => :put do
|
=form_tag [@project, @issue], :id => 'update_issue_status', :method => :put do
|
||||||
=hidden_field_tag "issue_status", @issue.closed? ? 'closed' : 'open', :name => "issue[status]"
|
=hidden_field_tag "issue_status", @issue.closed? ? 'closed' : 'open', :name => "issue[status]"
|
||||||
.bordered.nopadding
|
.bordered.nopadding
|
||||||
%h3=t('layout.issues.executor')
|
%h3=t('layout.issues.assignee')
|
||||||
- if @issue.persisted?
|
- if @issue.persisted?
|
||||||
-if can_manage
|
-if can_manage
|
||||||
=form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_executor issue'} do |f|
|
=form_for :issue, :url => [@project, @issue], :method => :put, :html => { :class => 'edit_assignee issue'} do |f|
|
||||||
=hidden_field_tag "user-default_executor", nil, :name => 'issue[user_id]'
|
=hidden_field_tag "user-default_assignee", nil, :name => 'issue[assignee_id]'
|
||||||
.current_executor
|
.current_assignee
|
||||||
- if @issue.user
|
- if @issue.assignee
|
||||||
#user-0.people.nopointer
|
#user-0.people.nopointer
|
||||||
.avatar=image_tag avatar_url(@issue.user), :alt => 'avatar'
|
.avatar=image_tag avatar_url(@issue.assignee), :alt => 'avatar'
|
||||||
.name="#{@issue.user.uname} (#{@issue.user.name})"
|
.name="#{@issue.user.uname} (#{@issue.assignee.name})"
|
||||||
=hidden_field_tag "user-0", @issue.user.id, :name => 'issue[user_id]'
|
=hidden_field_tag "user-0", @issue.assignee.id, :name => 'issue[assignee_id]'
|
||||||
.both
|
.both
|
||||||
- elsif @issue.user
|
- elsif @issue.assignee
|
||||||
.people.nopointer
|
.people.nopointer
|
||||||
.avatar=image_tag avatar_url(@issue.user), :alt => 'avatar'
|
.avatar=image_tag avatar_url(@issue.assignee), :alt => 'avatar'
|
||||||
.name="#{@issue.user.uname} (#{@issue.user.name})"
|
.name="#{@issue.assignee.uname} (#{@issue.assignee.name})"
|
||||||
.both
|
.both
|
||||||
=link_to(t('layout.issues.label_manage'), '#', :class => "button tmargin10 manage_executor") if can_manage
|
=link_to(t('layout.issues.label_manage'), '#', :class => "button tmargin10 manage_assignee") if can_manage
|
||||||
- if can_manage
|
- if can_manage
|
||||||
=form_tag search_collaborators_project_issues_path(@project), :id => 'search_user', :method => :get, :style => @issue.persisted? ? 'display:none' : '' do
|
=form_tag search_collaborators_project_issues_path(@project), :id => 'search_user', :method => :get, :style => @issue.persisted? ? 'display:none' : '' do
|
||||||
=tracker_search_field(:search_user, t('layout.issues.search_user'))
|
=tracker_search_field(:search_user, t('layout.issues.search_user'))
|
||||||
#manage_issue_users_list
|
#manage_issue_users_list
|
||||||
=render 'issues/search_collaborators'
|
=render 'issues/search_collaborators'
|
||||||
=link_to(t('layout.issues.done'), '#', :class => "button tmargin10 update_executor", :style => 'display:none') if can_manage
|
=link_to(t('layout.issues.done'), '#', :class => "button tmargin10 update_assignee", :style => 'display:none') if can_manage
|
||||||
|
|
||||||
.block
|
.block
|
||||||
%h3=t('layout.issues.labels')
|
%h3=t('layout.issues.labels')
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
- (@users || []).each_with_index do |user, index|
|
- (@users || []).each_with_index do |user, index|
|
||||||
.people.selected{:id => "user-#{index}", :class => 'add_executor'}
|
.people.selected{:id => "user-#{index}", :class => 'add_assignee'}
|
||||||
.avatar= image_tag(avatar_url(user), :alt => 'avatar')
|
.avatar= image_tag(avatar_url(user), :alt => 'avatar')
|
||||||
.name="#{user.uname} (#{user.name})"
|
.name="#{user.uname} (#{user.name})"
|
||||||
=hidden_field_tag "user-#{index}", user.id, :name => 'issue[user_id]'
|
=hidden_field_tag "user-#{index}", user.id, :name => 'issue[assignee_id]'
|
||||||
.both
|
.both
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
.activity
|
.activity
|
||||||
.top
|
.top
|
||||||
.image
|
.image
|
||||||
=image_tag(avatar_url(@issue.creator, :medium), :alt => 'avatar') if @issue.creator
|
=image_tag(avatar_url(@issue.user, :medium), :alt => 'avatar') if @issue.user
|
||||||
.text
|
.text
|
||||||
%span.name=link_to("#{@issue.creator.uname} (#{@issue.creator.name})", user_path(@issue.creator)) if @issue.creator
|
%span.name=link_to("#{@issue.user.uname} (#{@issue.user.name})", user_path(@issue.user)) if @issue.user
|
||||||
%br/
|
%br/
|
||||||
%span.date=@issue.created_at.to_s(:long)
|
%span.date=@issue.created_at.to_s(:long)
|
||||||
%br/
|
%br/
|
||||||
|
|
|
@ -4,8 +4,8 @@ en:
|
||||||
issue:
|
issue:
|
||||||
title: Name
|
title: Name
|
||||||
body: Description
|
body: Description
|
||||||
user: Assigned
|
assignee: Assigned
|
||||||
user_id: Assigned
|
assignee_id: Assigned
|
||||||
project: Project
|
project: Project
|
||||||
status: Status
|
status: Status
|
||||||
|
|
||||||
|
@ -41,10 +41,10 @@ en:
|
||||||
update_label: Update label
|
update_label: Update label
|
||||||
label_custom_color: Custom color
|
label_custom_color: Custom color
|
||||||
label_manage: Manage labels
|
label_manage: Manage labels
|
||||||
executor: Executor
|
assignee: Assignee
|
||||||
search_user: Find user...
|
search_user: Find user...
|
||||||
search_labels: Find labels...
|
search_labels: Find labels...
|
||||||
choose_user_on_left: Choose executor on the left
|
choose_user_on_left: Choose assignee on the left
|
||||||
choose_labels_on_left: Choose labels on the left
|
choose_labels_on_left: Choose labels on the left
|
||||||
at: at
|
at: at
|
||||||
cancel_button: Cancel
|
cancel_button: Cancel
|
||||||
|
|
|
@ -4,8 +4,8 @@ ru:
|
||||||
issue:
|
issue:
|
||||||
title: Название
|
title: Название
|
||||||
body: Описание
|
body: Описание
|
||||||
user: Назначена
|
assignee: Назначена
|
||||||
user_id: Назначена
|
assignee_id: Назначена
|
||||||
project: Проект
|
project: Проект
|
||||||
status: Статус
|
status: Статус
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ ru:
|
||||||
update_label: Обновить метку
|
update_label: Обновить метку
|
||||||
label_custom_color: Свой цвет
|
label_custom_color: Свой цвет
|
||||||
label_manage: Управление
|
label_manage: Управление
|
||||||
executor: Исполнитель
|
assignee: Исполнитель
|
||||||
search_user: Найти пользователя...
|
search_user: Найти пользователя...
|
||||||
search_labels: Найти метки...
|
search_labels: Найти метки...
|
||||||
choose_user_on_left: выберите исполнителя слева
|
choose_user_on_left: выберите исполнителя слева
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
class AddAssigneeToIssues < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
rename_column :issues, :user_id, :assignee_id
|
||||||
|
rename_column :issues, :creator_id, :user_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
rename_column :issues, :user_id, :creator_id
|
||||||
|
rename_column :issues, :assignee_id, :user_id
|
||||||
|
end
|
||||||
|
end
|
|
@ -80,7 +80,7 @@ describe IssuesController do
|
||||||
|
|
||||||
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
||||||
|
|
||||||
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :user_id => @issue_user.id)
|
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :assignee_id => @issue_user.id)
|
||||||
@create_params = {
|
@create_params = {
|
||||||
:project_id => @project.id,
|
:project_id => @project.id,
|
||||||
:issue => {
|
:issue => {
|
||||||
|
@ -88,8 +88,8 @@ describe IssuesController do
|
||||||
:body => "issue body",
|
:body => "issue body",
|
||||||
:project_id => @project.id
|
:project_id => @project.id
|
||||||
},
|
},
|
||||||
:user_id => @issue_user.id,
|
:assignee_id => @issue_user.id,
|
||||||
:user_uname => @issue_user.uname
|
:assignee_uname => @issue_user.uname
|
||||||
}
|
}
|
||||||
@update_params = {
|
@update_params = {
|
||||||
:project_id => @project.id,
|
:project_id => @project.id,
|
||||||
|
@ -99,7 +99,7 @@ describe IssuesController do
|
||||||
}
|
}
|
||||||
|
|
||||||
@project_with_turned_off_issues = FactoryGirl.create(:project, :has_issues => false)
|
@project_with_turned_off_issues = FactoryGirl.create(:project, :has_issues => false)
|
||||||
@turned_of_issue = FactoryGirl.create(:issue, :project_id => @project_with_turned_off_issues.id, :user_id => @issue_user.id)
|
@turned_of_issue = FactoryGirl.create(:issue, :project_id => @project_with_turned_off_issues.id, :assignee_id => @issue_user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for global admin user' do
|
context 'for global admin user' do
|
||||||
|
|
|
@ -5,7 +5,7 @@ FactoryGirl.define do
|
||||||
body { FactoryGirl.generate(:string) }
|
body { FactoryGirl.generate(:string) }
|
||||||
association :project, :factory => :project
|
association :project, :factory => :project
|
||||||
association :user, :factory => :user
|
association :user, :factory => :user
|
||||||
association :creator, :factory => :user
|
association :assignee, :factory => :user
|
||||||
status "open"
|
status "open"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,7 +13,7 @@ describe UserMailer do
|
||||||
|
|
||||||
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
||||||
|
|
||||||
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :user_id => @issue_user.id, :creator => @issue_user)
|
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :assignee_id => @issue_user.id, :user => @issue_user)
|
||||||
@email = UserMailer.new_issue_notification(@issue, @issue_user).deliver
|
@email = UserMailer.new_issue_notification(@issue, @issue_user).deliver
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ describe UserMailer do
|
||||||
|
|
||||||
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
||||||
|
|
||||||
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :user_id => @issue_user.id, :creator => @issue_user)
|
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :assignee_id => @issue_user.id, :user => @issue_user)
|
||||||
@email = UserMailer.issue_assign_notification(@issue, @user).deliver
|
@email = UserMailer.issue_assign_notification(@issue, @user).deliver
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ describe UserMailer do
|
||||||
|
|
||||||
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
any_instance_of(Project, :versions => ['v1.0', 'v2.0'])
|
||||||
|
|
||||||
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :user_id => @issue_user.id, :creator => @issue_user)
|
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :assignee_id => @issue_user.id, :user => @issue_user)
|
||||||
@comment = FactoryGirl.create(:comment, :commentable => @issue, :user_id => @user.id, :project => @project)
|
@comment = FactoryGirl.create(:comment, :commentable => @issue, :user_id => @user.id, :project => @project)
|
||||||
@email = UserMailer.new_comment_notification(@comment, @issue_user).deliver
|
@email = UserMailer.new_comment_notification(@comment, @issue_user).deliver
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,7 +6,7 @@ def set_commentable_data
|
||||||
@ability = Ability.new(@user)
|
@ability = Ability.new(@user)
|
||||||
|
|
||||||
@project = FactoryGirl.create(:project)
|
@project = FactoryGirl.create(:project)
|
||||||
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :creator => @user)
|
@issue = FactoryGirl.create(:issue, :project_id => @project.id, :user => @user)
|
||||||
|
|
||||||
@comment = FactoryGirl.create(:comment, :commentable => @issue, :user => @user, :project => @project)
|
@comment = FactoryGirl.create(:comment, :commentable => @issue, :user => @user, :project => @project)
|
||||||
@stranger_comment = FactoryGirl.create(:comment, :commentable => @issue, :user => @stranger, :project => @project)
|
@stranger_comment = FactoryGirl.create(:comment, :commentable => @issue, :user => @stranger, :project => @project)
|
||||||
|
|
Loading…
Reference in New Issue