diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index ae80f8fcb..cdbcc36cb 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -33,7 +33,7 @@ class ProjectsController < ApplicationController before_filter :require_admin, :only => [ :copy, :archive, :unarchive, :destroy, :calendar] before_filter :file, :statistics #:watcherlist # 除非项目内人员,不可查看成员, TODO: 完了写报表里去 - before_filter :memberAccess, only: :member + # before_filter :memberAccess, only: :member # accept_rss_auth :index accept_api_auth :index, :show, :create, :update, :destroy @@ -359,17 +359,28 @@ class ProjectsController < ApplicationController # 两种情况:1、系统外用户;2、系统内用户 (通过邮件判定) def send_mail_to_member + # 该邮箱未注册过 if !params[:mail].blank? && User.find_by_mail(params[:mail].to_s).nil? - email = params[:mail] - Mailer.run.send_invite_in_project(email, @project, User.current) - @is_zhuce = false - flash[:notice] = l(:notice_email_sent, :value => email) + if !User.where("login =?", params[:mail]).first.nil? + # 用户名唯一,如果该邮箱被用户作为用户名使用则跳出 + flash[:error] = l(:notice_email_login_used) + else + email = params[:mail] + Mailer.send_invite_in_project(email, @project, User.current).deliver + @is_zhuce = false + flash[:notice] = l(:notice_email_sent, :value => email) + end elsif !User.find_by_mail(params[:mail].to_s).nil? user = User.find_by_mail(params[:mail].to_s) if !user.member_of?(@project) - email = params[:mail] - Mailer.run.request_member_to_project(email, @project, User.current) - flash[:notice] = l(:notice_email_sent, :value => email) + # 如果已经邀请过该用户,则不重复发送 + if InviteList.where("project_id =? and mail =?", @project.id, params[:mail].to_s).first.nil? + email = params[:mail] + Mailer.request_member_to_project(email, @project, User.current).deliver + flash[:notice] = l(:notice_email_sent, :value => email) + else + flash[:error] = l(:notice_email_invited) + end else flash[:error] = l(:label_member_of_project, :value => email) end @@ -450,6 +461,10 @@ class ProjectsController < ApplicationController flash[:notice] = l(:label_mail_invite_success) end end + unless @project.is_public? + return render_403 unless User.current.member_of?(@project) + + end ## 有角色参数的才是课程,没有的就是项目 @render_file = 'project_member_list' # 判断是否课程 diff --git a/app/models/invite_list.rb b/app/models/invite_list.rb index 4868fc3d7..66efc8609 100644 --- a/app/models/invite_list.rb +++ b/app/models/invite_list.rb @@ -1,5 +1,5 @@ class InviteList < ActiveRecord::Base - attr_accessible :project_id, :user_id + attr_accessible :project_id, :user_id, :mail belongs_to :user belongs_to :project diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 4fe2478d2..c2b66f2a5 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -48,7 +48,7 @@ class Mailer < ActionMailer::Base end # author: alan - # 发送邀请未注册用户加入项目邮件 + # 邀请未注册用户加入项目 # 功能: 在加入项目的同时自动注册用户 def send_invite_in_project(email, project, invitor) @email = email @@ -59,8 +59,8 @@ class Mailer < ActionMailer::Base login = login.sub(/%40/,'@') us = UsersService.new # 自动激活用户 - user = us.register_auto(login, @email, @password) - InviteList.create(:user_id => user.id, :project_id => project.id) + user = us.register_auto(login, email, @password) + InviteList.create(:user_id => user.id, :project_id => project.id, :mail =>email) User.current = user unless User.current.nil? @user = user @token = Token.get_token_from_user(user, 'autologin') @@ -76,9 +76,8 @@ class Mailer < ActionMailer::Base @project_name = "#{project.name}" @user = user @project = project - inviter_lists = InviteList.where(project_id:@project.id, user_id:@user.id).all - if inviter_lists.blank? - InviteList.create(:user_id => user.id, :project_id => project.id) + if InviteList.where("project_id= ? and user_id =? and mail =?", project.id, @user.id, email).first.nil? + InviteList.create(:user_id => user.id, :project_id => project.id, :mail => email) end @token = Token.get_token_from_user(user, 'autologin') @project_url = url_for(:controller => 'projects', :action => 'member', :id => project.id, :user_id => user.id, :mail => true, :token => @token.value) diff --git a/app/models/member.rb b/app/models/member.rb index 292dd2034..655c79895 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -30,6 +30,9 @@ class Member < ActiveRecord::Base validate :validate_role before_destroy :set_issue_category_nil + # 删除项目成员一并删除该成员的邀请记录 + after_destroy :delete_ivite_list + def role end @@ -97,6 +100,16 @@ class Member < ActiveRecord::Base end end + # 删除成员一并删除该成员的邀请信息 + def delete_ivite_list + member_invite_lists = InviteList.where("user_id =? and project_id =?", self.user_id, self.project_id) + unless member_invite_lists.nil? + member_invite_lists.each do |member_invite_list| + member_invite_list.destroy + end + end + end + # Find or initilize a Member with an id, attributes, and for a Principal def self.edit_membership(id, new_attributes, principal=nil) @membership = id.present? ? Member.find(id) : Member.new(:principal => principal) diff --git a/app/models/project.rb b/app/models/project.rb index 0618dd145..0cd6af35b 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -66,8 +66,8 @@ class Project < ActiveRecord::Base # has_many :students_for_courses, :dependent => :destroy has_many :student, :through => :students_for_courses, :source => :user has_one :course_extra, :class_name => 'Course', :foreign_key => :extra,:primary_key => :identifier, :dependent => :destroy - has_many :applied_projects - has_many :invite_lists + has_many :applied_projects, :dependent => :destroy + has_many :invite_lists, :dependent => :destroy has_one :dts # end diff --git a/app/models/user.rb b/app/models/user.rb index 63811cd58..48b269e6e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -140,7 +140,7 @@ class User < Principal has_many :issue_assigns, :class_name => 'ForgeMessage', :conditions => 'viewed=0 and forge_message_type="Issue"' has_many :status_updates, :class_name => 'ForgeMessage', :conditions => 'viewed=0 and forge_message_type="Journal"' # 邮件邀请状态 - # has_many :invite_lists + has_many :invite_lists, :dependent => :destroy # end ######added by nie @@ -213,6 +213,8 @@ class User < Principal # added by fq after_create :act_as_activity, :add_onclick_time # end + # 更新邮箱用户或用户名的同事,同步更新邀请信息 + after_update :update_invite_list scope :in_group, lambda {|group| group_id = group.is_a?(Group) ? group.id : group.to_i @@ -1010,6 +1012,16 @@ class User < Principal end end + # 更新邮箱的同事,更新invite_lists表中的邮箱信息 + def update_invite_list + invite_lists = InviteList.where("user_id =?",self.id).all + unless invite_lists.blank? + invite_lists.each do |invite_list| + invite_list.update_attribute(:mail, self.mail) + end + end + end + # Removes references that are not handled by associations # Things that are not deleted are reassociated with the anonymous user def remove_references_before_destroy diff --git a/config/configuration.yml b/config/configuration.yml index af68515eb..5c58c705a 100644 --- a/config/configuration.yml +++ b/config/configuration.yml @@ -224,9 +224,9 @@ development: email_delivery: delivery_method: :smtp smtp_settings: - address: mail.trustie.net + address: smtp.163.com port: 25 - domain: mail.trustie.net + domain: smtp.163.com authentication: :login - user_name: "mail@trustie.net" - password: "loong2010" + user_name: "huang.jingquan@163.com" + password: "xinhu1ji2qu366" diff --git a/config/locales/zh.yml b/config/locales/zh.yml index d2fa502b9..19271d93d 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -52,6 +52,8 @@ zh: notice_not_authorized_archived_project: 要访问的项目已经归档。 notice_not_authorized_message: 您访问的消息不存在! notice_email_sent: "邮件已发送至 %{value}" + notice_email_login_used: 无法自动为该邮箱注册新用户,该邮箱地址已经有人作为登录名使用,您可以通过平台的注册功能为该用户注册账号! + notice_email_invited: 已经向该邮箱发送过邀请,正在等待对方的回复! notice_email_error: "发送邮件时发生错误 (%{value})" notice_feeds_access_key_reseted: 您的RSS存取键已被重置。 notice_api_access_key_reseted: 您的API访问键已被重置。 diff --git a/db/migrate/20150915063302_add_mail_to_invite_list.rb b/db/migrate/20150915063302_add_mail_to_invite_list.rb new file mode 100644 index 000000000..800b5abd4 --- /dev/null +++ b/db/migrate/20150915063302_add_mail_to_invite_list.rb @@ -0,0 +1,5 @@ +class AddMailToInviteList < ActiveRecord::Migration + def change + add_column :invite_lists, :mail, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index b162337d3..5eec29135 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20150914063751) do +ActiveRecord::Schema.define(:version => 20150915063302) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -685,6 +685,7 @@ ActiveRecord::Schema.define(:version => 20150914063751) do t.integer "user_id" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false + t.string "mail" end create_table "issue_categories", :force => true do |t| diff --git a/public/javascripts/jQuery.autoMail.js b/public/javascripts/jQuery.autoMail.js index bf3519561..949476fcc 100644 --- a/public/javascripts/jQuery.autoMail.js +++ b/public/javascripts/jQuery.autoMail.js @@ -17,137 +17,137 @@ focusColor: "#333" //blurColor: "#999 }; - var settings = $.extend({}, defaults, options || {}); - //页面装载CSS样式 - if(settings.autoClass && $("#mailListAppendCss").size() === 0){ - $('').appendTo($("head")); - } - var cb = settings.boxClass, cl = settings.listClass, cf = settings.focusClass, cm = settings.markCalss; //插件的class变量 - var z = settings.zIndex, newArr = mailArr = settings.mailArr, hint = settings.textHint, text = settings.hintText, fc = settings.focusColor, bc = settings.blurColor; +// var settings = $.extend({}, defaults, options || {}); +// //页面装载CSS样式 +// if(settings.autoClass && $("#mailListAppendCss").size() === 0){ +// $('').appendTo($("head")); +// } +// var cb = settings.boxClass, cl = settings.listClass, cf = settings.focusClass, cm = settings.markCalss; //插件的class变量 +// var z = settings.zIndex, newArr = mailArr = settings.mailArr, hint = settings.textHint, text = settings.hintText, fc = settings.focusColor, bc = settings.blurColor; //创建邮件内部列表内容 - $.createHtml = function(str, arr, cur){ - var mailHtml = ""; - if($.isArray(arr)){ - $.each(arr, function(i, n){ - if(i === cur){ - mailHtml += '