diff --git a/.gitignore b/.gitignore
index fdb7a3c6b..22d9e17e6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,3 +29,4 @@ vendor/cache
/public/images/avatars
/public/files
/tags
+/config/initializers/gitlab_config.rb
diff --git a/Gemfile b/Gemfile
index cf6e9f773..3027c16cd 100644
--- a/Gemfile
+++ b/Gemfile
@@ -6,7 +6,8 @@ unless RUBY_PLATFORM =~ /w32/
gem 'iconv'
end
-gem 'grack', path:'./lib/grack'
+gem 'grack', path:'lib/grack'
+gem 'gitlab', path: 'lib/gitlab-cli'
gem 'rest-client'
gem "mysql2", "= 0.3.18"
gem 'redis-rails'
@@ -45,7 +46,7 @@ group :development, :test do
gem 'pry-stack_explorer'
if RUBY_PLATFORM =~ /darwin/
gem 'puma'
- end
+ end
end
gem 'rspec-rails', '~> 3.0'
diff --git a/app/assets/javascripts/organizations.js.coffee b/app/assets/javascripts/organizations.js.coffee
new file mode 100644
index 000000000..761567942
--- /dev/null
+++ b/app/assets/javascripts/organizations.js.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
diff --git a/app/assets/stylesheets/organizations.css.scss b/app/assets/stylesheets/organizations.css.scss
new file mode 100644
index 000000000..39819880e
--- /dev/null
+++ b/app/assets/stylesheets/organizations.css.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the organizations controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index 477a8e2b9..9e935ae40 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -354,7 +354,7 @@ class AdminController < ApplicationController
@schools = School.where('1=1')
end
@school_count = @schools.count
- @school_pages = Paginator.new @school_count, per_page_option, params['page'] || 1
+ @school_pages = Paginator.new @school_count, 100, params['page'] || 1
@schools = paginateHelper @schools,100
respond_to do |format|
format.html
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 86c220bd2..bb2138062 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -38,7 +38,8 @@ class ApplicationController < ActionController::Base
protect_from_forgery
def handle_unverified_request
super
- cookies.delete(autologin_cookie_name)
+ raise(ActionController::InvalidAuthenticityToken)
+ # cookies.delete(autologin_cookie_name)
end
before_filter :find_first_page
@@ -381,6 +382,11 @@ class ApplicationController < ActionController::Base
if allowed
true
else
+ if params[:action] == 'show'
+ #更新申请结果反馈消息的状态
+ messages = CourseMessage.where("course_message_type =? and course_id =? and user_id =? and viewed =?", 'CourseRequestDealResult', @course.id, User.current.id, false)
+ messages.update_all(:viewed => true)
+ end
if @course && @course.archived?
render_403 :message => :notice_not_authorized_archived_project
else
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index ee953e913..37182dbcf 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -227,6 +227,8 @@ class AttachmentsController < ApplicationController
format.js
elsif @attachment.container.is_a?(Message)
format.html { redirect_to_referer_or new_board_message_path(@attachment.container) }
+ elsif @attachment.container.is_a?(BlogComment)
+ format.html { redirect_to_referer_or user_blog_blog_comment_path(:user_id=>@attachment.container.author.id,:blog_id=>@attachment.container.blog_id,:id=>@attachment.container.id)}
elsif @course.nil?
format.html { redirect_to_referer_or forum_memo_path(@attachment.container.forum, @attachment.container) }
else
diff --git a/app/controllers/blog_comments_controller.rb b/app/controllers/blog_comments_controller.rb
new file mode 100644
index 000000000..b92223edc
--- /dev/null
+++ b/app/controllers/blog_comments_controller.rb
@@ -0,0 +1,150 @@
+class BlogCommentsController < ApplicationController
+ include ApplicationHelper
+ before_filter :find_user
+ def index
+
+ end
+ def create
+ if User.current.logged?
+ @article = BlogComment.new
+ @article.author = User.current
+ @article.blog_id = params[:blog_id]
+ @article.safe_attributes = params[:blog_comment]
+ if request.post?
+ @article.save_attachments(params[:attachments])
+ if @article.save
+ # 更新kindeditor上传的图片资源所有者
+ # if params[:asset_id]
+ # ids = params[:asset_id].split(',')
+ # update_kindeditor_assets_owner ids,@article.id,OwnerTypeHelper::BLOGCOMMENT
+ # end
+ render_attachment_warning_if_needed(@article)
+ else
+ end
+ redirect_to user_blogs_path(:user_id=>params[:user_id])
+ else
+ respond_to do |format|
+ format.html {
+ render :layout => 'new_base_user'
+ }
+ end
+ end
+ else
+ redirect_to signin_path
+ end
+ end
+ def new
+ respond_to do |format|
+ format.html {render :layout=>'new_base_user'}
+ end
+ end
+ def show
+ @article = BlogComment.find(params[:id])
+ respond_to do |format|
+ format.html {render :layout=>'new_base_user'}
+ end
+ end
+ def update
+ @article = BlogComment.find(params[:id])
+ @article.safe_attributes = params[:blog_comment]
+ @article.save_attachments(params[:attachments])
+ if @article.save
+ render_attachment_warning_if_needed(@article)
+ else
+ end
+ redirect_to user_blog_blog_comment_path(:user_id=>params[:user_id],:blog_id=>params[:blog_id],:id=>params[:id])
+ end
+ def destroy
+ @article = BlogComment.find(params[:id])
+ if @article.parent_id.nil? #如果是文章被删,那么跳转到用户博客界面,如果带了course_id过来,那么就要跳转到课程首页
+ if params[:course_id] #如果带了课程id过来,说明这是课程大纲,不要删除,只需取消课程大纲就ok了
+ @course = Course.find(params[:course_id])
+ @course.outline = 0
+ @course.save
+ redirect_to course_path(:id=>params[:course_id])
+ else
+ @article.children.delete
+ @article.delete
+ redirect_to user_blogs_path(:user_id=>User.current)
+ end
+
+ else#如果是回复被删,
+ if params[:course_id] #如果带了course_id过来了,那么这是要跳到课程大纲去的
+ @article.delete
+ redirect_to syllabus_course_path(:id=>params[:course_id])
+ else
+ root = @article.root
+ @article.delete
+ redirect_to user_blog_blog_comment_path(:user_id=>root.author_id,:blog_id=>root.blog_id,:id=>root.id)
+ end
+
+ end
+ end
+
+ def edit
+ @article = BlogComment.find(params[:id])
+ respond_to do |format|
+ format.html {render :layout=>'new_base_user'}
+ end
+ end
+
+ def quote
+ @blogComment = BlogComment.find(params[:id])
+ @subject = @blogComment.title
+ @subject = "RE: #{@subject}" unless @subject.starts_with?('RE:')
+
+ @content = "> #{ll(Setting.default_language, :text_user_wrote, @blogComment.author.realname)}\n> "
+ @temp = BlogComment.new
+ @course_id = params[:course_id]
+ @temp.content = "
#{ll(Setting.default_language, :text_user_wrote, @blogComment.author.realname)} #{@blogComment.content.html_safe} ".html_safe
+ respond_to do | format|
+ format.js
+ end
+ end
+
+ #回复
+ def reply
+ if params[:in_user_center]
+ @in_user_center = true
+ end
+ @article = BlogComment.find(params[:id]).root
+ @quote = params[:quote][:quote]
+ @blogComment = BlogComment.new
+ @blogComment.author = User.current
+ @blogComment.blog = Blog.find(params[:blog_id])
+ params[:blog_comment][:sticky] = params[:blog_comment][:sticky] || 0
+ params[:blog_comment][:locked] = params[:blog_comment][:locked] || 0
+ @blogComment.safe_attributes = params[:blog_comment]
+ @blogComment.content = @quote + @blogComment.content
+ @blogComment.title = "RE: #{@article.title}" unless params[:blog_comment][:title]
+ @article.children << @blogComment
+ @user_activity_id = params[:user_activity_id]
+ user_activity = UserActivity.where("act_type='BlogComment' and act_id =#{@article.id}").first
+ if user_activity
+ user_activity.updated_at = Time.now
+ user_activity.save
+ end
+ attachments = Attachment.attach_files(@blogComment, params[:attachments])
+ render_attachment_warning_if_needed(@blogComment)
+ #@article.save
+ # redirect_to user_blogs_path(:user_id=>params[:user_id])
+ respond_to do |format|
+ format.html {
+ if params[:course_id] #如果呆了course_id过来了,那么这是要跳到课程大纲去的
+ redirect_to syllabus_course_path(:id=>params[:course_id])
+ else
+ redirect_to user_blog_blog_comment_path(:user_id=>@article.author_id,:blog_id=>@article.blog_id,:id=>@article)
+ end
+
+ }
+ format.js
+ end
+ rescue Exception => e #如果上面的代码执行发生异常就捕获
+ flash[:notice] = e.message
+ end
+
+ private
+ def find_user
+ @user = User.find(params[:user_id])
+ end
+end
diff --git a/app/controllers/blogs_controller.rb b/app/controllers/blogs_controller.rb
new file mode 100644
index 000000000..07bf60464
--- /dev/null
+++ b/app/controllers/blogs_controller.rb
@@ -0,0 +1,47 @@
+class BlogsController < ApplicationController
+ before_filter :find_blog,:except => [:index,:create,:new]
+ before_filter :find_user
+ def index
+ @articls = @user.blog.articles
+ @article = BlogComment.new
+ respond_to do |format|
+ format.html {render :layout=>'new_base_user'}
+ end
+ end
+ def create
+
+ end
+ def new
+
+ end
+ def show
+
+ end
+ def update
+
+ end
+ def destory
+
+ end
+ def edit
+
+ end
+ private
+ def find_blog
+ if params[:blog_id]
+ @blog = Blog.find(params[:blog_id])
+ else
+ render_404
+ end
+ if @blog.nil?
+ #如果某个user的blog不存在,那么就创建一条
+ @blog = Blog.create(:name=>User.find(params[:id]).realname ,
+ :description=>'',
+ :author_id=>params[:id])
+ end
+ end
+
+ def find_user
+ @user = User.find(params[:user_id])
+ end
+end
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index fe9318006..1a561006a 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -31,17 +31,16 @@ class CoursesController < ApplicationController
def join
if User.current.logged?
- if params[:role] == 10
cs = CoursesService.new
@user = User.current
- join = cs.join_course params,user
+ join = cs.join_course params,@user
@state = join[:state]
@course = join[:course]
- else
- @course = Course.find_by_id params[:object_id]
- CourseMessage.create(:user_id => @course.tea_id, :course_id => @course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest')
- @state = 6
- end
+ # else
+ # @course = Course.find_by_id params[:object_id]
+ # CourseMessage.create(:user_id => @course.tea_id, :course_id => @course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest')
+ # @state = 6
+ # end
else
@state = 5 #未登录
end
@@ -108,7 +107,7 @@ class CoursesController < ApplicationController
courses = Course.visible
@courses = paginateHelper courses,10
else
- courses = Course.visible.where("LOWER(name) like '%#{params[:name].to_s.downcase}%'")
+ courses = Course.visible.where("LOWER(name) like '%#{params[:name].to_s.downcase}%'").order("time desc, created_at desc")
@courses = paginateHelper courses,10
end
@name = params[:name]
@@ -289,14 +288,11 @@ class CoursesController < ApplicationController
def export_course_member_excel
@all_members = student_homework_score(0,0,0,"desc")
filename="#{@course.teacher.lastname.to_s + @course.teacher.firstname.to_s }_#{@course.name}_#{@course.time.to_s + @course.term}#{l(:excel_member_list)}";
- # 如果是ie 需要转码
- if(/trident/.match(request.env["HTTP_USER_AGENT"]) != nil)
- filename= URI::encode(filename)
- end
+
respond_to do |format|
format.xls {
send_data(member_to_xls(@all_members,@course.course_groups), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{filename}.xls")
+ :filename => filename_for_content_disposition("#{filename}.xls"))
}
end
end
@@ -617,6 +613,10 @@ class CoursesController < ApplicationController
create_course_messages = @course.course_messages.where("user_id =? and course_message_type =? and course_id =? and viewed =?", User.current.id, 'Course', @course.id, 0)
create_course_messages.update_all(:viewed => true)
+ #更新申请结果反馈消息的状态
+ course_request_messages = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @course.id, 'CourseRequestDealResult', false)
+ course_request_messages.update_all(:viewed => true)
+
course_activities = @course.course_activities
@canShowRealName = User.current.member_of_course? @course
@page = params[:page] ? params[:page].to_i + 1 : 0
@@ -711,6 +711,41 @@ class CoursesController < ApplicationController
end
end
+ #从课程创建的老师那里选择课程大纲
+ def course_outline
+ @teacher = User.find(@course.tea_id)
+ @blog_articles = @teacher.blog.articles
+ @is_in_show_outline_page = params[:is_in_show_outline_page]
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ #根据关键字搜索,查找方法一样的,但返回内容不一样
+ def search_course_outline
+ @article_title = params[:title]
+ @teacher = User.find(@course.tea_id)
+ @blog_articles = @teacher.blog.articles.like(@article_title)
+ render :json=>@blog_articles.to_json
+ end
+
+ #设置或者更改课程的大纲
+ def set_course_outline
+ @course.outline = params[:outline_id]
+ @course.save
+ @is_in_show_outline_page = params[:is_in_show_outline_page]
+ respond_to do |format|
+ format.js
+ end
+ end
+
+ #显示课程大纲
+ def syllabus
+ @article = BlogComment.find(@course.outline)
+ respond_to do |format|
+ format.html {render :layout => 'base_courses'}
+ end
+ end
#删除课程
#删除课程只是将课程的is_delete状态改为false,is_delete为false状态的课程只有管理员可以看到
def destroy
diff --git a/app/controllers/gantts_controller.rb b/app/controllers/gantts_controller.rb
index ee132ac29..710bb2f47 100644
--- a/app/controllers/gantts_controller.rb
+++ b/app/controllers/gantts_controller.rb
@@ -42,8 +42,8 @@ class GanttsController < ApplicationController
respond_to do |format|
format.html { render :action => "show", :layout => 'base_projects' }#by young
- format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
- format.pdf { send_data(@gantt.to_pdf, :type => 'application/pdf', :filename => "#{basename}.pdf") }
+ format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => filename_for_content_disposition("#{basename}.png")) } if @gantt.respond_to?('to_image')
+ format.pdf { send_data(@gantt.to_pdf, :type => 'application/pdf', :filename => filename_for_content_disposition("#{basename}.pdf") ) }
end
end
end
diff --git a/app/controllers/homework_attach_controller.rb b/app/controllers/homework_attach_controller.rb
index 5dd5363b9..93459578c 100644
--- a/app/controllers/homework_attach_controller.rb
+++ b/app/controllers/homework_attach_controller.rb
@@ -33,7 +33,7 @@ class HomeworkAttachController < ApplicationController
format.js
format.xls {
send_data(homework_to_xls(@all_homework_list), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}(#{l(:excel_not_rated)}).xls")
+ :filename => filename_for_content_disposition("#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}(#{l(:excel_not_rated)}).xls") )
}
end
end
@@ -66,7 +66,7 @@ class HomeworkAttachController < ApplicationController
format.js
format.xls {
send_data(homework_to_xls(all_homework_list), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}(#{l(:excel_been_rated)}).xls")
+ :filename => filename_for_content_disposition("#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}(#{l(:excel_been_rated)}).xls") )
}
end
end
@@ -101,7 +101,7 @@ class HomeworkAttachController < ApplicationController
format.js
format.xls {
send_data(homework_to_xls(all_homework_list), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}.xls")
+ :filename => filename_for_content_disposition("#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@bid.name}#{l(:excel_homework_list)}.xls") )
}
end
end
diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb
index 9e3a4b836..3db7ada2b 100644
--- a/app/controllers/homework_common_controller.rb
+++ b/app/controllers/homework_common_controller.rb
@@ -6,8 +6,8 @@ class HomeworkCommonController < ApplicationController
include StudentWorkHelper
before_filter :find_course, :only => [:index,:new,:create]
- before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy,:start_evaluation_set,:set_evaluation_attr]
- before_filter :teacher_of_course, :only => [:new, :create, :edit, :update, :destroy, :start_anonymous_comment, :stop_anonymous_comment, :alert_anonymous_comment,:start_evaluation_set,:set_evaluation_attr]
+ before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy,:start_evaluation_set,:set_evaluation_attr,:score_rule_set]
+ before_filter :teacher_of_course, :only => [:new, :create, :edit, :update, :destroy, :start_anonymous_comment, :stop_anonymous_comment, :alert_anonymous_comment,:start_evaluation_set,:set_evaluation_attr,:score_rule_set]
before_filter :member_of_course, :only => [:index]
def index
@@ -47,10 +47,18 @@ class HomeworkCommonController < ApplicationController
if params[:homework_common]
@homework.name = params[:homework_common][:name]
@homework.description = params[:homework_common][:description]
+ if params[:homework_common][:publish_time] == ""
+ @homework.publish_time = Date.today
+ else
+ @homework.publish_time = params[:homework_common][:publish_time]
+ end
@homework.end_time = params[:homework_common][:end_time] || Time.now
@homework.course_id = params[:course_id]
homework_detail_manual = @homework.homework_detail_manual || HomeworkDetailManual.new
+ if @homework.publish_time <= Date.today && homework_detail_manual.comment_status == 0
+ homework_detail_manual.comment_status = 1
+ end
homework_detail_manual.evaluation_start = params[:evaluation_start].blank? ? @homework.end_time + 7 : params[:evaluation_start]
homework_detail_manual.evaluation_end = params[:evaluation_end].blank? ? homework_detail_manual.evaluation_start + 7 : params[:evaluation_end]
@@ -215,6 +223,16 @@ class HomeworkCommonController < ApplicationController
end
end
+ #评分设置
+ def score_rule_set
+ if params[:user_activity_id]
+ @user_activity_id = params[:user_activity_id]
+ else
+ @user_activity_id = -1
+ end
+ @is_in_course = params[:is_in_course]
+ end
+
private
#获取课程
def find_course
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index 923414583..e529dd3b9 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -151,7 +151,7 @@ class IssuesController < ApplicationController
format.atom { render :template => 'journals/index', :layout => false, :content_type => 'application/atom+xml' }
format.pdf {
pdf = issue_to_pdf(@issue, :journals => @journals)
- send_data(pdf, :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf")
+ send_data(pdf, :type => 'application/pdf', :filename => filename_for_content_disposition("#{@project.identifier}-#{@issue.id}.pdf") )
}
end
end
diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb
index 6bb61e6a1..4dc2c52f5 100644
--- a/app/controllers/members_controller.rb
+++ b/app/controllers/members_controller.rb
@@ -159,6 +159,14 @@ class MembersController < ApplicationController
if role && (role.name == "学生" || role.name == "Student")
StudentsForCourse.create(:student_id => user_id, :course_id =>@course.id)
end
+
+ #给新成员和老师发送加入课程的消息,发送者id放在CourseMessage的course_message_id字段中
+ #course_message_type设置为JoinCourse
+ #status = 0 表示给学生发,status = 1表示给老师发
+ course_join = CourseMessage.new(:user_id =>user_id, :course_message_id=>User.current.id,:course_id => @course.id,:course_message_type=>"JoinCourse", :content => role, :viewed => false, :status => 0)
+ course_join.save
+ CourseMessage.create(:user_id => User.current.id, :course_message_id => user_id, :course_id => @course.id, :course_message_type => "JoinCourse",:content => role, :viewed => false, :status => 1)
+
members << member
#user_grades << UserGrade.new(:user_id => user_id, :course_id => @course.id)
if (params[:membership][:role_ids])
@@ -305,7 +313,8 @@ class MembersController < ApplicationController
grade.destroy
end
end
- ForgeMessage.create(:user_id => @member.user_id, :project_id => @project.id, :forge_message_type => "RemoveFromProject", :viewed => false, :forge_message_id => User.current.id)
+ #移出项目发送消息
+ ForgeMessage.create(:user_id => @member.user_id, :project_id => @project.id, :forge_message_type => "RemoveFromProject", :viewed => false, :forge_message_id => User.current.id)
end
respond_to do |format|
format.html { redirect_to_settings_in_projects }
@@ -333,6 +342,8 @@ class MembersController < ApplicationController
end
@roles = Role.givable.all[3..5]
@members = @course.member_principals.includes(:roles, :principal).all.sort
+ #移出课程发送消息
+ CourseMessage.create(:user_id => @member.user_id, :course_id => @course.id, :course_message_type => "RemoveFromCourse", :viewed => false, :course_message_id => User.current.id)
end
respond_to do |format|
format.html { redirect_to_settings_in_courses }
diff --git a/app/controllers/organization_controller.rb b/app/controllers/organization_controller.rb
deleted file mode 100644
index 748fc1732..000000000
--- a/app/controllers/organization_controller.rb
+++ /dev/null
@@ -1,55 +0,0 @@
-class OrganizationController < ApplicationController
- # layout 'base_projects'
- before_filter :require_admin, :except => [:index]
-
- def index
- #@projects = Project.find_by_sql("SELECT * FROM projects WHERE id IN (select MAX(id) from projects GROUP BY enterprise_name)")
- @organizations = Organization.all
- respond_to do |format|
- format.html
- end
- end
-
- def new
- @organizations = Organization.new
- respond_to do |format|
- format.html
- end
- end
-
- def create
- @organizations = Organization.new
- @organizations.name = params[:organization][:name]
- if @organizations.save
- redirect_to admin_organization_url
- end
- end
-
- def edit
- @organization = Organization.find params[:id]
- respond_to do |format|
- format.html
- end
- rescue Exception => e
- render_404
- end
-
- def update
- @organization = Organization.find params[:id]
- @organization.name = params[:organization][:name]
- if @organization.save
- redirect_to admin_organization_url
- end
- rescue Exception => e
- render_404
- end
-
- def destroy
- @organization = Organization.find params[:id]
- if @organization.destroy
- redirect_to admin_organization_url
- end
- rescue Exception => e
- render_404
- end
-end
diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb
new file mode 100644
index 000000000..0def8b5f8
--- /dev/null
+++ b/app/controllers/organizations_controller.rb
@@ -0,0 +1,27 @@
+class OrganizationsController < ApplicationController
+ layout 'base_org'
+ def new
+ @organization = Organization.new
+ render :layout => 'new_base'
+ end
+ def create
+ @organization = Organization.new
+ @organization.name = params[:organization][:name]
+ @organization.description = params[:organization][:description]
+ @organization.is_public = params[:organization][:is_public]
+ @organization.creator_id = User.current.id
+ member = OrgMember.new(:user_id => User.current.id, :role => 'Manager')
+ @organization.org_members << member
+ if @organization.save
+ redirect_to organization_path(@organization)
+ end
+ end
+
+ def show
+
+ end
+
+ def update
+
+ end
+end
diff --git a/app/controllers/poll_controller.rb b/app/controllers/poll_controller.rb
index a8f2a11f1..ec54ae8a4 100644
--- a/app/controllers/poll_controller.rb
+++ b/app/controllers/poll_controller.rb
@@ -413,7 +413,7 @@ class PollController < ApplicationController
respond_to do |format|
format.xls {
send_data(poll_to_xls(poll_questions), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{@poll.polls_name}.xls")
+ :filename => filename_for_content_disposition("#{@poll.polls_name}.xls") )
}
end
end
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index f2f10d5b6..8a1b3bbe0 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -29,12 +29,12 @@ class RepositoriesController < ApplicationController
menu_item :repository
menu_item :settings, :only => [:new, :create, :edit, :update, :destroy, :committers]
default_search_scope :changesets
-
+
before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo]
before_filter :find_repository, :only => [:edit, :update, :destroy, :committers]
- before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo]
+ before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo,:to_gitlab]
before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue]
- before_filter :authorize , :except => [:newrepo,:newcreate,:fork]
+ before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab]
accept_rss_auth :revisions
# hidden repositories filter // 隐藏代码过滤器
before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ]
@@ -42,7 +42,7 @@ class RepositoriesController < ApplicationController
include RepositoriesHelper
helper :project_score
#@root_path = RepositoriesHelper::ROOT_PATH
-
+
rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed
def new
@@ -62,8 +62,8 @@ class RepositoriesController < ApplicationController
end
end
-
-
+
+
def newrepo
scm = params[:repository_scm] || (Redmine::Scm::Base.all & Setting.enabled_scm).first
@repository = Repository.factory(scm)
@@ -76,23 +76,23 @@ class RepositoriesController < ApplicationController
render :layout => 'base_projects'
end
end
-
+
def fork
@repository_url = params[:repository_url]
-
+
# @repository.url
# system "htpasswd -mb "+@root_path+"user.passwd "+params[:repository][:identifier]+" "+@upasswd
# system "echo -e '"+params[:project_id]+"-"+params[:repository][:identifier]+"-write:"+
- # " "+params[:repository][:identifier]+"' >> "+@root_path+"group.passwd"
- system "git clone --bare "+@repository_url
+ # " "+params[:repository][:identifier]+"' >> "+@root_path+"group.passwd"
+ system "git clone --bare "+@repository_url
# system "mv "+@project_path+"/hooks/post-update{.sample,}"
# system "chmod a+x "+@project_path+"/hooks/post-update"
# system "."+@project_path+"/hooks/post-update"
# system "echo -e 'Allow from all \n Order Deny,Allow \n "+
- # " \n"+
- # "Require group "+params[:project_id]+"-"+params[:repository][:identifier]+"-write \n "+
- # " \n ' >>"+
- # @project_path+"/.htaccess"
+ # " \n"+
+ # "Require group "+params[:project_id]+"-"+params[:repository][:identifier]+"-write \n "+
+ # " \n ' >>"+
+ # @project_path+"/.htaccess"
flash[:notice] = l(:label_notice_fork_successed)
@repositories = @project.repositories
render :action => 'show', :layout => 'base_projects'
@@ -115,77 +115,24 @@ update
}
def create
- if params[:repository_scm].to_s == 'Gitlab'
- # add by nwb
- # 增加对gitlab版本库的支持
- attrs = pickup_extra_info
- @repository = Repository.factory('Git')
- @repository.safe_attributes = params[:repository]
- if attrs[:attrs_extra].keys.any?
- @repository.merge_extra_info(attrs[:attrs_extra])
- end
- @repository.project = @project
- if request.post? && @repository.save
- redirect_to settings_project_url(@project, :tab => 'repositories')
- else
- redirect_to settings_project_url(@project, :tab => 'repositories')
- end
- else # 原逻辑
- ##xianbo
- @root_path=RepositoriesHelper::ROOT_PATH
- @repository_name=User.current.login.to_s+"/"+params[:repository][:identifier]+".git"
- @project_path=@root_path+"htdocs/"+@repository_name
- @repository_tag=params[:repository][:upassword] || params[:repository][:password]
- @repo_name=User.current.login.to_s+"_"+params[:repository][:identifier]
- logger.info "htpasswd -mb "+@root_path+"htdocs/user.passwd "+@repo_name+": "+@repository_tag
- logger.info "the value of create repository"+@root_path+": "+@repository_name+": "+@project_path+": "+@repo_name
- attrs = pickup_extra_info
- if((@repository_tag!="")&¶ms[:repository_scm]=="Git")
- params[:repository][:url]=@project_path
- end
- ###xianbo
- @repository = Repository.factory(params[:repository_scm])
- @repository.safe_attributes = params[:repository]
- if attrs[:attrs_extra].keys.any?
- @repository.merge_extra_info(attrs[:attrs_extra])
- end
-
- @repository.project = @project
- if request.post? && @repository.save
- if(params[:repository_scm]=="Git")
- system "htpasswd -mb "+@root_path+"htdocs/user.passwd "+@repo_name+" "+@repository_tag
- system "echo -e '"+@repo_name+"-write:"+
- " "+@repo_name+"' >> "+@root_path+"htdocs/group.passwd"
- system "mkdir "+@root_path+"htdocs/"+User.current.login.to_s
- system "git init --bare "+@project_path
- system "mv "+@project_path+"/hooks/post-update{.sample,}"
- system "chmod a+x "+@project_path+"/hooks/post-update"
- system "echo -e 'Allow from all \n Order Deny,Allow \n "+
- " \n"+
- "Require group "+@repo_name+"-write \n "+
- " \n ' >> "+
- @root_path+"htdocs/"+ @repository_name+"/.htaccess"
- system "cd "+@project_path+" ;git update-server-info"
-
- File.open(@project_path+"/hooks/post-update", "w+") do |f|
- f.write(HOOK_TEMPLATE)
- end
-
- @repository.update_attributes(:login => User.current.login.to_s)
- end
- redirect_to settings_project_url(@project, :tab => 'repositories',:repository_error_message=>@repository.errors.full_messages)
- else if(@repository_tag.blank?)
- #render :action => 'newrepo', :layout =>'base_projects'
- redirect_to settings_project_url(@project, :tab => 'repositories',:repository => "pswd_is_null",:repository_error_message=>@repository.errors.full_messages)
- else
- redirect_to settings_project_url(@project, :tab => 'repositories',:repository => @repository,:repository_error_message=>@repository.errors.full_messages)
- end
- end
-
-
+ attrs = pickup_extra_info
+ @repository = Repository.factory('Git')
+ @repository.safe_attributes = params[:repository]
+ if attrs[:attrs_extra].keys.any?
+ @repository.merge_extra_info(attrs[:attrs_extra])
+ end
+ @repository.project = @project
+ @repository.type = 'Repository::Gitlab'
+ @repository.url = @repository.identifier
+ if request.post? && @repository.save
+ s = Trustie::Gitlab::Sync.new
+ s.create_project(@project, @repository)
+ redirect_to settings_project_url(@project, :tab => 'repositories')
+ else
+ redirect_to settings_project_url(@project, :tab => 'repositories',:repository_error_message=>@repository.errors.full_messages)
end
end
-
+
def edit
end
@@ -228,15 +175,17 @@ update
# Build a hash with repository usernames as keys and corresponding user ids as values
@repository.committer_ids = params[:committers].values.inject({}) {|h, c| h[c.first] = c.last; h}
flash[:notice] = l(:notice_successful_update)
- redirect_to settings_project_url(@project, :tab => 'repositories')
+ respond_to do |format|
+ format.html{
+ render :layout => "base_projects"
+ }
+ end
elsif request.get?
- respond_to do |format|
- format.html{
- render :layout => "base_projects"
- }
- end
-
-
+ respond_to do |format|
+ format.html{
+ render :layout => "base_projects"
+ }
+ end
end
end
@@ -247,6 +196,16 @@ update
redirect_to settings_project_url(@project, :tab => 'repositories')
end
+ def to_gitlab
+ @project = Project.find(params[:project_id])
+ @repository = Repository.find(params[:id])
+ s = Trustie::Gitlab::Sync.new
+ s.sync_project(@project, path: params[:repo_name], import_url: @repository.url)
+ @repository.type = 'Repository::Gitlab'
+ @repository.save
+ redirect_to :controller => 'repositories', :action => 'show', :id => @project.id, to: 'gitlab'
+ end
+
def show
## TODO: the below will move to filter, done.
if !User.current.member_of?(@project)
@@ -256,19 +215,23 @@ update
end
end
- if params[:to] == 'gitlab'
- g = Gitlab.client
- g.post('/session', body: {email: User.current.mail, password: User.current.hashed_password})
- redirect_to "http://192.168.41.130:3000/gitlab-org/gitlab-shell/tree/master"
+ unless @repository.gitlab?
+ # redirect_to to_gitlab_project_repository_path(@project, @repository)
+ render :to_gitlab
return
end
#if( !User.current.member_of?(@project) || @project.hidden_repo)
@repository.fetch_changesets if Setting.autofetch_changesets? && @path.empty?
+ # g = Gitlab.client
+ # project = g.project(20)
+ # rr = g.trees(project.id, @path)
+ # r = g.get ("/projects/#{@project}/repository/tree")
+ # :name, :path, :kind, :size, :lastrev, :changeset
@entries = @repository.entries(@path, @rev)
+ # @trees = g.trees(project, @path)
@changeset = @repository.find_changeset_by_name(@rev)
-
#@project_path_cut = RepositoriesHelper::PROJECT_PATH_CUT
#@ip = RepositoriesHelper::REPO_IP_ADDRESS
@@ -276,15 +239,25 @@ update
@entries ? render(:partial => 'dir_list_content') : render(:nothing => true)
else
#Modified by young
- # (show_error_not_found; return) unless @entries
- @changesets = @repository.latest_changesets(@path, @rev)
+ # (show_error_not_found; return) unless @entries
+ g = Gitlab.client
+ @changesets = g.get ("/projects/#{@project.gpid}/repository/commits")
+ # @changesets = @repository.latest_changesets(@path, @rev)
+ # @changesets_count = @repository.latest_changesets(@path, @rev).count
+ @changesets_count = @changesets.count
+ @changesets_latest_coimmit = @changesets[0]
@properties = @repository.properties(@path, @rev)
@repositories = @project.repositories
@course_tag = params[:course]
project_path_cut = RepositoriesHelper::PROJECT_PATH_CUT
ip = RepositoriesHelper::REPO_IP_ADDRESS
- @repos_url = "http://"+@repository.login.to_s+"_"+@repository.identifier.to_s+"@"+ip.to_s+
- @repository.url.slice(project_path_cut, @repository.url.length).to_s
+ gitlab_address = Redmine::Configuration['gitlab_address']
+ if @repository.type.to_s=="Repository::Gitlab"
+ @repos_url = gitlab_address.to_s+"/"+@project.owner.to_s+"/"+@repository.identifier+"."+"git"
+ else
+ @repos_url = "http://"+@repository.login.to_s+"_"+@repository.identifier.to_s+"@"+ip.to_s+
+ @repository.url.slice(project_path_cut, @repository.url.length).to_s
+ end
if @course_tag == 1
render :action => 'show', :layout => 'base_courses'
else
@@ -298,7 +271,9 @@ update
def changes
@entry = @repository.entry(@path, @rev)
(show_error_not_found; return) unless @entry
- @changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
+ g = Gitlab.client
+ @changesets = g.get ("/projects/#{@project.gpid}/repository/commits?#{@rev}")
+ #@changesets = @repository.latest_changesets(@path, @rev, Setting.repository_log_display_limit.to_i)
@properties = @repository.properties(@path, @rev)
@changeset = @repository.find_changeset_by_name(@rev)
render :layout => 'base_projects'
@@ -310,10 +285,10 @@ update
per_page_option,
params['page']
@changesets = @repository.changesets.
- limit(@changeset_pages.per_page).
- offset(@changeset_pages.offset).
- includes(:user, :repository, :parents).
- all
+ limit(@changeset_pages.per_page).
+ offset(@changeset_pages.offset).
+ includes(:user, :repository, :parents).
+ all
respond_to do |format|
format.html { render :layout => 'base_projects' }
@@ -327,6 +302,7 @@ update
def entry
entry_and_raw(false)
+ render :layout => 'base_projects'
end
def entry_and_raw(is_raw)
@@ -339,8 +315,8 @@ update
@content = @repository.cat(@path, @rev)
(show_error_not_found; return) unless @content
if is_raw ||
- (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) ||
- ! is_entry_text_data?(@content, @path)
+ (@content.size && @content.size > Setting.file_max_size_displayed.to_i.kilobyte) ||
+ ! is_entry_text_data?(@content, @path)
# Force the download
send_opt = { :filename => filename_for_content_disposition(@path.split('/').last) }
send_type = Redmine::MimeType.of(@path)
@@ -423,8 +399,8 @@ update
filename = "changeset_r#{@rev}"
filename << "_r#{@rev_to}" if @rev_to
send_data @diff.join, :filename => "#{filename}.diff",
- :type => 'text/x-patch',
- :disposition => 'attachment'
+ :type => 'text/x-patch',
+ :disposition => 'attachment'
else
@diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
@diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
@@ -435,7 +411,7 @@ update
User.current.preference.save
end
@cache_key = "repositories/diff/#{@repository.id}/" +
- Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}-#{current_language}")
+ Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}-#{current_language}")
unless read_fragment(@cache_key)
@diff = @repository.diff(@path, @rev, @rev_to)
unless @diff
@@ -462,16 +438,16 @@ update
def graph
data = nil
case params[:graph]
- when "commits_per_month"
- data = graph_commits_per_month(@repository)
- when "commits_per_author"
- data = graph_commits_per_author(@repository)
- when "author_commits_per_month"
- data = graph_author_commits_per_month(@repository)
- when "author_commits_six_month"
- data = author_commits_six_month(@repository)
- when "author_code_six_months"
- data = author_code_six_month(@repository)
+ when "commits_per_month"
+ data = graph_commits_per_month(@repository)
+ when "commits_per_author"
+ data = graph_commits_per_author(@repository)
+ when "author_commits_per_month"
+ data = graph_author_commits_per_month(@repository)
+ when "author_commits_six_month"
+ data = author_commits_six_month(@repository)
+ when "author_code_six_months"
+ data = author_code_six_month(@repository)
end
if data
headers["Content-Type"] = "image/svg+xml"
@@ -551,14 +527,14 @@ update
@date_from = @date_to << 11
@date_from = Date.civil(@date_from.year, @date_from.month, 1)
commits_by_day = Changeset.count(
- :all, :group => :commit_date,
- :conditions => ["repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
+ :all, :group => :commit_date,
+ :conditions => ["repository_id = ? AND commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
commits_by_month = [0] * 12
commits_by_day.each {|c| commits_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last }
changes_by_day = Change.count(
- :all, :group => :commit_date, :include => :changeset,
- :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
+ :all, :group => :commit_date, :include => :changeset,
+ :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
changes_by_month = [0] * 12
changes_by_day.each {|c| changes_by_month[(@date_to.month - c.first.to_date.month) % 12] += c.last }
@@ -566,26 +542,26 @@ update
12.times {|m| fields << month_name(((Date.today.month - 1 - m) % 12) + 1)}
graph = SVG::Graph::Bar.new(
- :height => 300,
- :width => 600,
- :fields => fields.reverse,
- :stack => :side,
- :scale_integers => true,
- :step_x_labels => 2,
- :show_data_values => true,
- :graph_title => l(:label_commits_per_month),
- :show_graph_title => true
+ :height => 300,
+ :width => 600,
+ :fields => fields.reverse,
+ :stack => :side,
+ :scale_integers => true,
+ :step_x_labels => 2,
+ :show_data_values => true,
+ :graph_title => l(:label_commits_per_month),
+ :show_graph_title => true
)
# 具状图
graph.add_data(
- :data => commits_by_month[0..11].reverse,
- :title => l(:label_revision_plural)
+ :data => commits_by_month[0..11].reverse,
+ :title => l(:label_revision_plural)
)
graph.add_data(
- :data => changes_by_month[0..11].reverse,
- :title => l(:label_change_plural)
+ :data => changes_by_month[0..11].reverse,
+ :title => l(:label_change_plural)
)
graph.burn
@@ -610,23 +586,23 @@ update
fields = fields.collect {|c| c.gsub(%r{<.+@.+>}, '') }
graph = SVG::Graph::BarHorizontal.new(
- :height => 400,
- :width => 600,
- :fields => fields,
- :stack => :side,
- :scale_integers => true,
- :show_data_values => true,
- :rotate_y_labels => false,
- :graph_title => l(:label_commits_per_author),
- :show_graph_title => true
+ :height => 400,
+ :width => 600,
+ :fields => fields,
+ :stack => :side,
+ :scale_integers => true,
+ :show_data_values => true,
+ :rotate_y_labels => false,
+ :graph_title => l(:label_commits_per_author),
+ :show_graph_title => true
)
graph.add_data(
- :data => commits_data,
- :title => l(:label_revision_plural)
+ :data => commits_data,
+ :title => l(:label_revision_plural)
)
graph.add_data(
- :data => changes_data,
- :title => l(:label_change_plural)
+ :data => changes_data,
+ :title => l(:label_change_plural)
)
graph.burn
end
@@ -637,7 +613,7 @@ update
@date_from = @date_to << 12
@date_from = Date.civil(@date_from.year, @date_from.month, @date_from.day)
commits_by_author = Changeset.count(:all, :group => :committer,
- :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
+ :conditions => ["#{Changeset.table_name}.repository_id = ? AND #{Changeset.table_name}.commit_date BETWEEN ? AND ?", repository.id, @date_from, @date_to])
commits_by_author = commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}.last(25)
fields = commits_by_author.collect {|r| r.first}
diff --git a/app/controllers/stores_controller.rb b/app/controllers/stores_controller.rb
index 85ea85241..0d1755294 100644
--- a/app/controllers/stores_controller.rb
+++ b/app/controllers/stores_controller.rb
@@ -84,7 +84,7 @@ class StoresController < ApplicationController
respond_to do |format|
format.xls {
send_data(homework_to_xls(attachments), :type => "text/excel;charset=utf-8; header=present",
- :filename => "#{l(:label_file_lost_list)}.xls")
+ :filename => filename_for_content_disposition("#{l(:label_file_lost_list)}.xls") )
}
end
end
diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb
index e5e1bf391..25782ec4b 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -108,6 +108,7 @@ class StudentWorkController < ApplicationController
else
@stundet_works = []
end
+ @student_work_count = (search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name).count
else
if @is_teacher || @homework.homework_detail_manual.nil? #老师 || 超级管理员 显示所有列表
@stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").order("#{@order} #{@b_sort}"),@name
@@ -128,6 +129,7 @@ class StudentWorkController < ApplicationController
else
@stundet_works = []
end
+ @student_work_count = (search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").order("#{@order} #{@b_sort}"),@name).count
end
@score = @b_sort == "desc" ? "asc" : "desc"
@@ -456,8 +458,14 @@ class StudentWorkController < ApplicationController
student_work.save
end
end
- respond_to do |format|
- format.html{redirect_to student_work_index_url(:homework => @homework.id)}
+ if params[:student_path]
+ redirect_to student_work_index_url(:homework => @homework.id)
+ else
+ @user_activity_id = params[:user_activity_id]
+ @is_in_course = params[:is_in_course]
+ respond_to do |format|
+ format.js
+ end
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 7adba7cbf..0d9588d24 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -239,6 +239,46 @@ class UsersController < ApplicationController
end
end
+ #处理加入课程成为教辅教师的请求
+ #status 1 同意 2 拒绝
+ def dealwith_apply_request
+ @msg = CourseMessage.find(params[:msg_id])
+ #CourseMessage content存的是role 7教辅 9 教师
+ case params[:agree]
+ when 'Y'
+ apply_user = User.find(@msg.course_message_id)
+
+ if apply_user.member_of_course?(Course.find(@msg.course_id))
+ #将角色改为老师或者教辅
+ member = Course.find(@msg.course_id).members.where(:user_id=>apply_user.id).all[0]
+ member.role_ids = [@msg.content] # msg content保存的是申请的职位角色
+ #删除为学生的记录
+ joined = StudentsForCourse.where('student_id = ? and course_id = ?', member.user_id,@msg.course_id)
+ joined.each do |join|
+ join.delete
+ end
+
+ member.course_group_id = 0
+ member.save
+ CourseMessage.create(:user_id => @msg.course_message_id, :course_id => @msg.course_id, :viewed => false,:content=> @msg.content,:course_message_id=>User.current.id,:content=>@msg.content,:course_message_type=>'CourseRequestDealResult',:status=>1)
+ @msg.update_attributes(:status=>1,:viewed=>1)
+ else
+ members = []
+ members << Member.new(:role_ids => [@msg.content.to_i], :user_id => @msg.course_message_id)
+ Course.find(@msg.course_id).members << members
+ CourseMessage.create(:user_id => @msg.course_message_id, :course_id => @msg.course_id, :viewed => false,:content=> @msg.content,:course_message_id=>User.current.id,:content=>@msg.content,:course_message_type=>'CourseRequestDealResult',:status=>1)
+ @msg.update_attributes(:status=>1,:viewed=>1)
+ end
+
+ when 'N'
+ CourseMessage.create(:user_id => @msg.course_message_id, :course_id => @msg.course_id, :viewed => false,:content=> @msg.content,:course_message_id=>User.current.id,:content=>@msg.content,:course_message_type=>'CourseRequestDealResult',:status=>2)
+ @msg.update_attributes(:status=>2,:viewed=>1)
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+
# added by bai
def show_score
@@ -328,7 +368,21 @@ class UsersController < ApplicationController
if User.current == @user
@page = params[:page] ? params[:page].to_i + 1 : 0
user_course_ids = @user.courses.empty? ? "(-1)" :"(" + @user.courses.visible.map{|course| course.id}.join(",") + ")"
- @homework_commons = HomeworkCommon.where("course_id in #{user_course_ids}").order("created_at desc").limit(10).offset(@page * 10)
+
+ #判断当前用户在当前课程的身份
+ visibleCourse = @user.courses.empty? ? [] : @user.courses.visible
+ homework_ids = []
+ visibleCourse.each do |course|
+ if User.current.allowed_to?(:as_teacher,course)
+ homeworks = HomeworkCommon.where("course_id = #{course.id}")
+ homework_ids << homeworks.pluck(:id) unless homeworks.empty?
+ else
+ homeworks = HomeworkCommon.where("course_id = #{course.id} and publish_time <= '#{Date.today}'")
+ homework_ids << homeworks.pluck(:id) unless homeworks.empty?
+ end
+ end
+ visible_homework_ids = homework_ids.size == 0 ? "(-1)" :"(" + homework_ids.join(",") + ")"
+ @homework_commons = HomeworkCommon.where("id in #{visible_homework_ids}").order("created_at desc").limit(10).offset(@page * 10)
@is_teacher = User.current.user_extensions && User.current.user_extensions.identity == 0 && User.current.allowed_to?(:add_course, nil, :global => true)
@is_in_course = params[:is_in_course].to_i || 0
respond_to do |format|
@@ -453,8 +507,12 @@ class UsersController < ApplicationController
homework = HomeworkCommon.new
homework.name = params[:homework_common][:name]
homework.description = params[:homework_common][:description]
- homework.end_time = params[:homework_common][:end_time] || Time.now
- homework.publish_time = Time.now
+ homework.end_time = params[:homework_common][:end_time] || Date.today
+ if params[:homework_common][:publish_time] == ""
+ homework.publish_time = Date.today
+ else
+ homework.publish_time = params[:homework_common][:publish_time]
+ end
homework.homework_type = params[:homework_type].to_i || 1
homework.late_penalty = 10
homework.teacher_priority = 1
@@ -466,7 +524,11 @@ class UsersController < ApplicationController
homework_detail_manual = HomeworkDetailManual.new
homework_detail_manual.ta_proportion = homework.homework_type == 1 ? 0.6 : 0.3
- homework_detail_manual.comment_status = 1
+ if homework.publish_time > Date.today
+ homework_detail_manual.comment_status = 0
+ else
+ homework_detail_manual.comment_status = 1
+ end
homework_detail_manual.evaluation_start = params[:evaluation_start].blank? ? homework.end_time + 7 : params[:evaluation_start]
homework_detail_manual.evaluation_end = params[:evaluation_end].blank? ? homework_detail_manual.evaluation_start + 7 : params[:evaluation_end]
homework_detail_manual.evaluation_num = params[:evaluation_num] || 3
@@ -878,6 +940,12 @@ class UsersController < ApplicationController
end
def show
+ #更新用户申请成为课程老师或教辅消息的状态
+ if params[:course_id] != nil
+ join_course_messages = CourseMessage.where("course_id =? and course_message_type =? and user_id =? and course_message_id =? and viewed =?",
+ params[:course_id], 'JoinCourseRequest', User.current.id, @user.id, false)
+ join_course_messages.update_all(:viewed => true)
+ end
@page = params[:page] ? params[:page].to_i + 1 : 0
user_project_ids = @user.projects.visible.empty? ? "(-1)" : "(" + @user.projects.visible.map{|project| project.id}.join(",") + ")"
user_course_ids = @user.courses.visible.empty? ? "(-1)" : "(" + @user.courses.visible.map{|course| course.id}.join(",") + ")"
@@ -903,10 +971,19 @@ class UsersController < ApplicationController
when "current_user"
@user_activities = UserActivity.where("user_id = #{@user.id} and ((container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}))").order('updated_at desc').limit(10).offset(@page * 10)
else
- @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id})").order('updated_at desc').limit(10).offset(@page * 10)
+ blog_ids = "("+@user.blog.id.to_s+","+((User.watched_by(@user.id).count == 0 )? '0' :User.watched_by(@user.id).map{|u| u.blog.id}.join(','))+")"
+ @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})" +
+ "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+
+ "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id}) " +
+ "or (container_type = 'Blog' and act_type= 'BlogComment' and container_id in #{blog_ids})").order('updated_at desc').limit(10).offset(@page * 10)
end
else
- @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id})").order('updated_at desc').limit(10).offset(@page * 10)
+ # @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id})").order('updated_at desc').limit(10).offset(@page * 10)
+ blog_ids = "("+@user.blog.id.to_s+","+((User.watched_by(@user.id).count == 0 )? '0' :User.watched_by(@user.id).map{|u| u.blog.id}.join(','))+")"
+ @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types})" +
+ "or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) "+
+ "or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id}) " +
+ "or (container_type = 'Blog' and act_type= 'BlogComment' and container_id in #{blog_ids})").order('updated_at desc').limit(10).offset(@page * 10)
end
# @user_activities = paginateHelper @user_activities,500
@type = params[:type]
diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb
index da6d48b8d..c0351c6da 100644
--- a/app/controllers/wiki_controller.rb
+++ b/app/controllers/wiki_controller.rb
@@ -82,14 +82,14 @@ class WikiController < ApplicationController
@content = @page.content_for_version(params[:version])
if User.current.allowed_to?(:export_wiki_pages, @project)
if params[:format] == 'pdf'
- send_data(wiki_page_to_pdf(@page, @project), :type => 'application/pdf', :filename => "#{@page.title}.pdf")
+ send_data(wiki_page_to_pdf(@page, @project), :type => 'application/pdf', :filename => filename_for_content_disposition("#{@page.title}.pdf") )
return
elsif params[:format] == 'html'
export = render_to_string :action => 'export', :layout => false
- send_data(export, :type => 'text/html', :filename => "#{@page.title}.html")
+ send_data(export, :type => 'text/html', :filename => filename_for_content_disposition("#{@page.title}.html"))
return
elsif params[:format] == 'txt'
- send_data(@content.text, :type => 'text/plain', :filename => "#{@page.title}.txt")
+ send_data(@content.text, :type => 'text/plain', :filename => filename_for_content_disposition("#{@page.title}.txt") )
return
end
end
@@ -286,7 +286,7 @@ class WikiController < ApplicationController
send_data(export, :type => 'text/html', :filename => "wiki.html")
}
format.pdf {
- send_data(wiki_pages_to_pdf(@pages, @project), :type => 'application/pdf', :filename => "#{@project.identifier}.pdf")
+ send_data(wiki_pages_to_pdf(@pages, @project), :type => 'application/pdf', :filename => filename_for_content_disposition("#{@project.identifier}.pdf") )
}
end
end
diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb
index 6304055ed..6ad1a66b4 100644
--- a/app/controllers/words_controller.rb
+++ b/app/controllers/words_controller.rb
@@ -243,7 +243,45 @@ class WordsController < ApplicationController
flash[:error] = feedback.errors.full_messages[0]
redirect_to course_feedback_url(params[:id])
end
+ end
+
+ #作业的回复
+ def leave_homework_message
+ if User.current.logged?
+ @user = User.current
+ @homework_common = HomeworkCommon.find(params[:id]);
+ if params[:homework_message].size>0 && User.current.logged? && @user
+ feedback = HomeworkCommon.add_homework_jour(@user, params[:homework_message], params[:id])
+ if (feedback.errors.empty?)
+ if params[:asset_id]
+ ids = params[:asset_id].split(',')
+ update_kindeditor_assets_owner ids,feedback[:id],OwnerTypeHelper::JOURNALSFORMESSAGE
+ end
+ course_activity = CourseActivity.where("course_act_type='HomeworkCommon' and course_act_id =#{@homework_common.id}").first
+ if course_activity
+ course_activity.updated_at = Time.now
+ course_activity.save
+ end
+ user_activity = UserActivity.where("act_type='HomeworkCommon' and act_id =#{@homework_common.id}").first
+ if user_activity
+ user_activity.updated_at = Time.now
+ user_activity.save
+ end
+ respond_to do |format|
+ format.js{
+ @user_activity_id = params[:user_activity_id]
+ @is_in_course = params[:is_in_course]
+ @homework_common_id = params[:homework_common_id]
+ }
+ end
+ else
+ flash[:error] = feedback.errors.full_messages[0]
+ end
+ end
+ else
+ render_403
+ end
end
def add_brief_introdution
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index ce11bded8..84364b4f6 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -2355,14 +2355,16 @@ module ApplicationHelper
else #学生显示提交作品、修改作品等按钮
work = cur_user_works_for_homework homework
if work.nil?
- link_to "提交作品", new_student_work_path(:homework => homework.id),:class => 'c_blue'
+ link_to "提交作品(#{homework.student_works.count})", new_student_work_path(:homework => homework.id),:class => 'c_blue'
else
- if homework.homework_detail_manual && homework.homework_detail_manual.comment_status != 1 #匿评作业,且作业状态不是在开启匿评之前
+ if homework.homework_detail_manual && homework.homework_detail_manual.comment_status == 2 #匿评作业,且作业状态不是在开启匿评之前
link_to "作品匿评", student_work_index_path(:homework => homework.id), :class => 'c_blue', :title => "开启匿评后不可修改作品"
+ elsif homework.homework_detail_manual && homework.homework_detail_manual.comment_status == 3
+ link_to "匿评结束", student_work_index_path(:homework => homework.id), :class => 'c_blue', :title => "匿评已结束"
elsif homework.homework_type == 2 #编程作业不能修改作品
- link_to "修改作品", new_student_work_path(:homework => homework.id),:class => 'c_blue'
+ link_to "修改作品(#{homework.student_works.count})", new_student_work_path(:homework => homework.id),:class => 'c_blue'
else
- link_to "修改作品", edit_student_work_path(work.id),:class => 'c_blue'
+ link_to "修改作品(#{homework.student_works.count})", edit_student_work_path(work.id),:class => 'c_blue'
end
end
end
diff --git a/app/helpers/blog_comments_helper.rb b/app/helpers/blog_comments_helper.rb
new file mode 100644
index 000000000..2b0c3e5bd
--- /dev/null
+++ b/app/helpers/blog_comments_helper.rb
@@ -0,0 +1,2 @@
+module BlogCommentsHelper
+end
diff --git a/app/helpers/blogs_helper.rb b/app/helpers/blogs_helper.rb
new file mode 100644
index 000000000..cc0dbd200
--- /dev/null
+++ b/app/helpers/blogs_helper.rb
@@ -0,0 +1,2 @@
+module BlogsHelper
+end
diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb
index f9fb31969..caca6fb1e 100644
--- a/app/helpers/courses_helper.rb
+++ b/app/helpers/courses_helper.rb
@@ -36,7 +36,7 @@ module CoursesHelper
#生成课程老师成员链接
def course_teacher_link teacher_num
if User.current.member_of_course?(@course) || User.current.admin?
- link_to "#{teacher_num}", course_member_path(@course, :role => 1), :class => 'info_foot_num c_blue'
+ link_to "#{teacher_num}", course_member_path(@course, :role => 1), :class => 'info_foot_num c_blue', :id => 'teacher_number'
else
content_tag 'span',teacher_num, :class => 'info_foot_num c_blue'
end
@@ -45,7 +45,7 @@ module CoursesHelper
#生成课程学生列表连接
def course_student_link student_num
if (User.current.logged? && @course.open_student == 1) || (User.current.member_of_course?(@course)) || User.current.admin?
- link_to "#{student_num}", course_member_path(@course, :role => 2), :class => 'info_foot_num c_blue'
+ link_to "#{student_num}", course_member_path(@course, :role => 2), :class => 'info_foot_num c_blue', :id => "student_number"
else
content_tag 'span',student_num, :class => 'info_foot_num c_blue'
end
@@ -628,10 +628,10 @@ module CoursesHelper
#重启、关闭课程按钮
def set_course_time course
- id = "finish_course_#{course.id}"
- linkPath = course_endTime_timeout?(course) ? restartcourse_course_path(course) : finishcourse_course_path(course, format: :js)
- desc = course_endTime_timeout?(course) ? l(:label_course_reload) : l(:label_course_closed)
- link_to " #{desc}".html_safe, linkPath, :remote => true, :method => :post, :id => id, :confirm => l(:label_course_closed_tips, :desc => desc), :class => "pr_join_a"
+ # id = "finish_course_#{course.id}"
+ # linkPath = course_endTime_timeout?(course) ? restartcourse_course_path(course) : finishcourse_course_path(course, format: :js)
+ # desc = course_endTime_timeout?(course) ? l(:label_course_reload) : l(:label_course_closed)
+ # link_to " #{desc}".html_safe, linkPath, :remote => true, :method => :post, :id => id, :confirm => l(:label_course_closed_tips, :desc => desc), :class => "pr_join_a"
end
#加入课程、退出课程按钮
diff --git a/app/helpers/organizations_helper.rb b/app/helpers/organizations_helper.rb
index 10321ba16..24cc9a80e 100644
--- a/app/helpers/organizations_helper.rb
+++ b/app/helpers/organizations_helper.rb
@@ -1,2 +1,2 @@
-module EnterprisesHelper
+module OrganizationsHelper
end
diff --git a/app/helpers/owner_type_helper.rb b/app/helpers/owner_type_helper.rb
index c03f2d19e..7119d4f60 100644
--- a/app/helpers/owner_type_helper.rb
+++ b/app/helpers/owner_type_helper.rb
@@ -7,4 +7,5 @@ module OwnerTypeHelper
BID = 6
JOURNALSFORMESSAGE = 7
HOMEWORKCOMMON = 8
+ BLOGCOMMENT=9
end
\ No newline at end of file
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index 710b7488f..f32bef51b 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -25,6 +25,7 @@ module RepositoriesHelper
end
PROJECT_PATH_CUT = 40
REPO_IP_ADDRESS = Setting.host_repository
+ REPO_GITLAB_ADDRESS = "git.trustie.net"
def format_revision(revision)
if revision.respond_to? :format_identifier
@@ -34,12 +35,21 @@ module RepositoriesHelper
end
end
+ def repository_creater rep
+ repository_creater = User.find_by_login(rep.login) unless rep.login.nil?
+ end
+
def truncate_at_line_break(text, length = 255)
if text
text.gsub(%r{^(.{#{length}}[^\n]*)\n.+$}m, '\\1...')
end
end
+ def user_commit_rep(mail)
+ user = User.find_by_mail(mail)
+ user.nil? ? User.find(2) : User.find_by_mail(mail)
+ end
+
def render_properties(properties)
unless properties.nil? || properties.empty?
content = ''
diff --git a/app/models/blog.rb b/app/models/blog.rb
new file mode 100644
index 000000000..bd338cdad
--- /dev/null
+++ b/app/models/blog.rb
@@ -0,0 +1,16 @@
+class Blog < ActiveRecord::Base
+ # attr_accessible :title, :body
+ include Redmine::SafeAttributes
+ belongs_to :user
+ has_many :articles, :class_name => 'BlogComment', :conditions => "#{BlogComment.table_name}.parent_id IS NULL ", :order => "#{BlogComment.table_name}.created_on DESC"
+ has_many :blog_comments, :dependent => :destroy, :order => "#{BlogComment.table_name}.created_on DESC"
+ belongs_to :last_comment, :class_name => 'BlogComment', :foreign_key => :last_comment_id
+ acts_as_tree :dependent => :nullify
+ #acts_as_list :scope => '(user_id = #{user_id} AND parent_id #{user_id ? = "#{parent_id}" : "IS NULL"})'
+ acts_as_watchable
+
+ validates :name, presence: true, length: {maximum: 30}
+ validates :description, length: {maximum: 255}
+
+ safe_attributes 'name', 'description'
+end
diff --git a/app/models/blog_comment.rb b/app/models/blog_comment.rb
new file mode 100644
index 000000000..27da33121
--- /dev/null
+++ b/app/models/blog_comment.rb
@@ -0,0 +1,59 @@
+class BlogComment < ActiveRecord::Base
+ # attr_accessible :title, :body
+ include Redmine::SafeAttributes
+ belongs_to :blog
+ belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
+
+ acts_as_tree :counter_cache => :comments_count, :order => "#{BlogComment.table_name}.sticky desc ,#{BlogComment.table_name}.created_on ASC"
+ acts_as_attachable
+ belongs_to :last_reply, :class_name => 'BlogComment', :foreign_key => 'last_comment_id'
+ # 虚拟关联
+ has_many :user_acts, :class_name => 'UserAcivity',:as =>:act
+ acts_as_watchable
+
+ validates_presence_of :title, :content
+ validates_length_of :title, :maximum => 255
+ #validate :cannot_reply_to_locked_comment, :on => :create
+ safe_attributes 'title', 'content',"sticky", "locked"
+
+ after_save :add_user_activity
+ before_destroy :destroy_user_activity
+
+ scope :like, lambda {|arg|
+ if arg.blank?
+ where(nil)
+ else
+ pattern = "%#{arg.to_s.strip.downcase}%"
+ where(" LOWER(title) LIKE :p ", :p => pattern)
+ end
+ }
+
+ #在个人动态里面增加当前动态
+ def add_user_activity
+ if self.parent_id.nil? #只有发博文才插入动态
+ user_activity = UserActivity.where("act_type = '#{self.class.to_s}' and act_id = '#{self.id}'").first
+ if user_activity
+ user_activity.save
+ else
+ user_activity = UserActivity.new
+ user_activity.act_id = self.id
+ user_activity.act_type = self.class.to_s
+ user_activity.container_type = "Blog"
+ user_activity.container_id = self.blog_id
+ user_activity.user_id = self.author_id
+ user_activity.save
+ end
+ end
+ end
+
+ def destroy_user_activity
+ user_activity = UserActivity.where("act_type = '#{self.class.to_s}' and act_id = '#{self.id}'")
+ user_activity.destroy_all
+ end
+ def deleted_attach_able_by? user
+ (user && user.logged? && (self.author == user) ) || user.admin?
+ end
+
+ def project
+ end
+end
diff --git a/app/models/homework_common.rb b/app/models/homework_common.rb
index 796080645..8d421a98f 100644
--- a/app/models/homework_common.rb
+++ b/app/models/homework_common.rb
@@ -12,6 +12,7 @@ class HomeworkCommon < ActiveRecord::Base
has_many :homework_tests, :dependent => :destroy
has_many :student_works, :dependent => :destroy, :conditions => "is_test=0"
has_many :student_works_evaluation_distributions, :through => :student_works #一个作业的分配的匿评列表
+ has_many :journals_for_messages, :as => :jour, :dependent => :destroy
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy #用户活动
# 课程动态
has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
@@ -22,7 +23,8 @@ class HomeworkCommon < ActiveRecord::Base
:description => :description,
:author => :author,
:url => Proc.new {|o| {:controller => 'student_work', :action => 'index', :homework => o.id}}
- after_create :act_as_activity, :send_mail, :act_as_course_activity, :act_as_course_message
+ after_create :act_as_activity, :send_mail, :act_as_course_message
+ after_save :act_as_course_activity
after_destroy :delete_kindeditor_assets
def act_as_activity
@@ -32,17 +34,27 @@ class HomeworkCommon < ActiveRecord::Base
#课程动态公共表记录
def act_as_course_activity
if self.course
- self.course_acts << CourseActivity.new(:user_id => self.user_id,:course_id => self.course_id)
+ if self.homework_detail_manual.comment_status == 0
+ self.course_acts.destroy_all
+ else
+ if self.course_acts.size == 0
+ self.course_acts << CourseActivity.new(:user_id => self.user_id,:course_id => self.course_id)
+ end
+ end
end
end
#课程作业消息记录
def act_as_course_message
if self.course
- self.course.members.each do |m|
- # if m.user_id != self.user_id
+ if self.homework_detail_manual.comment_status == 0
+ self.course_messages.destroy_all
+ else
+ self.course.members.each do |m|
+ # if m.user_id != self.user_id
self.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => self.course_id, :viewed => false)
- # end
+ # end
+ end
end
end
end
@@ -53,13 +65,27 @@ class HomeworkCommon < ActiveRecord::Base
end
def send_mail
- Mailer.run.homework_added(self)
+ if self.homework_detail_manual.comment_status != 0
+ Mailer.run.homework_added(self)
+ end
end
def is_program_homework?
self.homework_type == 2 && self.homework_detail_programing
end
+ ###添加回复
+ def self.add_homework_jour(user, notes, id , options = {})
+ homework = HomeworkCommon.find(id)
+ if options.count == 0
+ jfm = homework.journals_for_messages.build(:user_id => user.id, :notes => notes, :reply_id => 0)
+ else
+ jfm = homework.journals_for_messages.build(options)
+ end
+ jfm.save
+ jfm
+ end
+
delegate :language_name, :language, :to => :homework_detail_programing
end
diff --git a/app/models/mailer.rb b/app/models/mailer.rb
index d797f1ce1..8891e6552 100644
--- a/app/models/mailer.rb
+++ b/app/models/mailer.rb
@@ -1009,6 +1009,16 @@ class Mailer < ActionMailer::Base
end
end
+ def join_course_request(course, user, role)
+ @receive = User.find(course.tea_id)
+ @course = course
+ @user = user
+ @role = role
+ @subject = "#{@user.show_name} #{l(:label_apply_join_course)} #{@course.name} "
+ mail :to => @receive.mail,
+ :subject => @subject
+ end
+
private
@@ -1066,4 +1076,5 @@ class Mailer < ActionMailer::Base
1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
return newpass
end
+
end
diff --git a/app/models/member.rb b/app/models/member.rb
index 655c79895..ed7ee81e6 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -34,6 +34,7 @@ class Member < ActiveRecord::Base
after_destroy :delete_ivite_list
+
def role
end
diff --git a/app/models/member_role.rb b/app/models/member_role.rb
index 67122a636..4d493cb27 100644
--- a/app/models/member_role.rb
+++ b/app/models/member_role.rb
@@ -35,8 +35,11 @@ class MemberRole < ActiveRecord::Base
!inherited_from.nil?
end
+ include Trustie::Gitlab::ManageMember
+
private
+
def remove_member_if_empty
if member.roles.empty?
member.destroy
diff --git a/app/models/org_member.rb b/app/models/org_member.rb
new file mode 100644
index 000000000..c4be034fe
--- /dev/null
+++ b/app/models/org_member.rb
@@ -0,0 +1,4 @@
+class OrgMember < ActiveRecord::Base
+ attr_accessible :organization_id, :role, :user_id
+ belongs_to :organization
+end
diff --git a/app/models/organization.rb b/app/models/organization.rb
index 5f52dee98..39b5900d9 100644
--- a/app/models/organization.rb
+++ b/app/models/organization.rb
@@ -1,5 +1,5 @@
class Organization < ActiveRecord::Base
- attr_accessible :logo_link, :name
-
+ attr_accessible :name, :description, :creator_id, :home_id, :domain, :is_public
+ has_many :org_members, :dependent => :destroy
has_many :projects
end
diff --git a/app/models/project.rb b/app/models/project.rb
index fcc96c404..fd1012fa0 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -770,7 +770,8 @@ class Project < ActiveRecord::Base
'project_type',
'dts_test',
'attachmenttype',
- 'enterprise_name'
+ 'enterprise_name',
+ 'gpid'
@@ -853,6 +854,10 @@ class Project < ActiveRecord::Base
end
end
+ def owner
+ User.find(self.user_id)
+ end
+
private
def after_parent_changed(parent_was)
@@ -1167,5 +1172,7 @@ class Project < ActiveRecord::Base
:forge_act_id => self.id,:forge_act_type => "ProjectCreateInfo")
fa.save!
end
+
+
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index 5680f05a7..94b7905c6 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -57,6 +57,11 @@ class Repository < ActiveRecord::Base
safe_attributes 'url',
:if => lambda {|repository, user| repository.new_record?}
+
+ def gitlab?
+ self.type == 'Repository::Gitlab'
+ end
+
def repo_create_validation
unless Setting.enabled_scm.include?(self.class.name.demodulize)
errors.add(:type, :invalid)
diff --git a/app/models/repository/gitlab.rb b/app/models/repository/gitlab.rb
new file mode 100644
index 000000000..5ec725660
--- /dev/null
+++ b/app/models/repository/gitlab.rb
@@ -0,0 +1,259 @@
+#coding=utf-8
+
+require 'redmine/scm/adapters/git_adapter'
+
+class Repository::Gitlab < Repository
+
+ attr_protected :root_url
+ validates_presence_of :url
+
+ def self.human_attribute_name(attribute_key_name, *args)
+ attr_name = attribute_key_name.to_s
+ if attr_name == "url"
+ attr_name = "path_to_repository"
+ end
+ super(attr_name, *args)
+ end
+
+ def self.scm_adapter_class
+ Redmine::Scm::Adapters::GitlabAdapter
+ end
+
+ def self.scm_name
+ 'Gitlab'
+ end
+
+ def commits(authors, start_date, end_date, branch='master')
+ scm.commits(authors, start_date, end_date,branch).map {|commit|
+ [commit[:author], commit[:num]]
+ }
+ end
+
+ def report_last_commit
+ extra_report_last_commit
+ end
+
+ def extra_report_last_commit
+ return false if extra_info.nil?
+ v = extra_info["extra_report_last_commit"]
+ return false if v.nil?
+ v.to_s != '0'
+ end
+
+ def supports_directory_revisions?
+ true
+ end
+
+ def supports_revision_graph?
+ true
+ end
+
+ def repo_log_encoding
+ 'UTF-8'
+ end
+
+ # Returns the identifier for the given git changeset
+ def self.changeset_identifier(changeset)
+ changeset.scmid
+ end
+
+ # Returns the readable identifier for the given git changeset
+ def self.format_changeset_identifier(changeset)
+ changeset.revision[0, 8]
+ end
+
+ def branches
+ scm.branches
+ end
+
+ def tags
+ scm.tags
+ end
+
+ def default_branch
+ scm.default_branch
+ rescue Exception => e
+ logger.error "git: error during get default branch: #{e.message}"
+ nil
+ end
+
+ def find_changeset_by_name(name)
+ if name.present?
+ changesets.where(:revision => name.to_s).first ||
+ changesets.where('scmid LIKE ?', "#{name}%").first
+ end
+ end
+
+ def entries(path=nil, identifier=nil)
+ entries = scm.entries(path, identifier, :report_last_commit => extra_report_last_commit)
+ load_entries_changesets(entries)
+ entries
+ end
+
+ # With SCMs that have a sequential commit numbering,
+ # such as Subversion and Mercurial,
+ # Redmine is able to be clever and only fetch changesets
+ # going forward from the most recent one it knows about.
+ #
+ # However, Git does not have a sequential commit numbering.
+ #
+ # In order to fetch only new adding revisions,
+ # Redmine needs to save "heads".
+ #
+ # In Git and Mercurial, revisions are not in date order.
+ # Redmine Mercurial fixed issues.
+ # * Redmine Takes Too Long On Large Mercurial Repository
+ # http://www.redmine.org/issues/3449
+ # * Sorting for changesets might go wrong on Mercurial repos
+ # http://www.redmine.org/issues/3567
+ #
+ # Database revision column is text, so Redmine can not sort by revision.
+ # Mercurial has revision number, and revision number guarantees revision order.
+ # Redmine Mercurial model stored revisions ordered by database id to database.
+ # So, Redmine Mercurial model can use correct ordering revisions.
+ #
+ # Redmine Mercurial adapter uses "hg log -r 0:tip --limit 10"
+ # to get limited revisions from old to new.
+ # But, Git 1.7.3.4 does not support --reverse with -n or --skip.
+ #
+ # The repository can still be fully reloaded by calling #clear_changesets
+ # before fetching changesets (eg. for offline resync)
+ def fetch_changesets
+ scm_brs = branches
+ return if scm_brs.nil? || scm_brs.empty?
+
+ h1 = extra_info || {}
+ h = h1.dup
+ repo_heads = scm_brs.map{ |br| br.scmid }
+ h["heads"] ||= []
+ prev_db_heads = h["heads"].dup
+ if prev_db_heads.empty?
+ prev_db_heads += heads_from_branches_hash
+ end
+ return if prev_db_heads.sort == repo_heads.sort
+
+ h["db_consistent"] ||= {}
+ if changesets.count == 0
+ h["db_consistent"]["ordering"] = 1
+ merge_extra_info(h)
+ self.save
+ elsif ! h["db_consistent"].has_key?("ordering")
+ h["db_consistent"]["ordering"] = 0
+ merge_extra_info(h)
+ self.save
+ end
+ save_revisions(prev_db_heads, repo_heads)
+ end
+
+ def save_revisions(prev_db_heads, repo_heads)
+ h = {}
+ opts = {}
+ opts[:reverse] = true
+ opts[:excludes] = prev_db_heads
+ opts[:includes] = repo_heads
+
+ revisions = scm.revisions('', nil, nil, opts)
+ return if revisions.blank?
+
+ # Make the search for existing revisions in the database in a more sufficient manner
+ #
+ # Git branch is the reference to the specific revision.
+ # Git can *delete* remote branch and *re-push* branch.
+ #
+ # $ git push remote :branch
+ # $ git push remote branch
+ #
+ # After deleting branch, revisions remain in repository until "git gc".
+ # On git 1.7.2.3, default pruning date is 2 weeks.
+ # So, "git log --not deleted_branch_head_revision" return code is 0.
+ #
+ # After re-pushing branch, "git log" returns revisions which are saved in database.
+ # So, Redmine needs to scan revisions and database every time.
+ #
+ # This is replacing the one-after-one queries.
+ # Find all revisions, that are in the database, and then remove them from the revision array.
+ # Then later we won't need any conditions for db existence.
+ # Query for several revisions at once, and remove them from the revisions array, if they are there.
+ # Do this in chunks, to avoid eventual memory problems (in case of tens of thousands of commits).
+ # If there are no revisions (because the original code's algorithm filtered them),
+ # then this part will be stepped over.
+ # We make queries, just if there is any revision.
+ limit = 100
+ offset = 0
+ revisions_copy = revisions.clone # revisions will change
+ while offset < revisions_copy.size
+ recent_changesets_slice = changesets.find(
+ :all,
+ :conditions => [
+ 'scmid IN (?)',
+ revisions_copy.slice(offset, limit).map{|x| x.scmid}
+ ]
+ )
+ # Subtract revisions that redmine already knows about
+ recent_revisions = recent_changesets_slice.map{|c| c.scmid}
+ revisions.reject!{|r| recent_revisions.include?(r.scmid)}
+ offset += limit
+ end
+
+ revisions.each do |rev|
+ transaction do
+ # There is no search in the db for this revision, because above we ensured,
+ # that it's not in the db.
+ save_revision(rev)
+ end
+ end
+ h["heads"] = repo_heads.dup
+ merge_extra_info(h)
+ self.save
+ end
+ private :save_revisions
+
+ def save_revision(rev)
+ parents = (rev.parents || []).collect{|rp| find_changeset_by_name(rp)}.compact
+ changeset = Changeset.create(
+ :repository => self,
+ :revision => rev.identifier,
+ :scmid => rev.scmid,
+ :committer => rev.author,
+ :committed_on => rev.time,
+ :comments => rev.message,
+ :parents => parents
+ )
+ unless changeset.new_record?
+ rev.paths.each { |change| changeset.create_change(change) }
+ end
+ changeset
+ end
+ private :save_revision
+
+ def heads_from_branches_hash
+ h1 = extra_info || {}
+ h = h1.dup
+ h["branches"] ||= {}
+ h['branches'].map{|br, hs| hs['last_scmid']}
+ end
+
+ def latest_changesets(path,rev,limit=10)
+ revisions = scm.revisions(path, nil, rev, :limit => limit, :all => false)
+ return [] if revisions.nil? || revisions.empty?
+
+ changesets.find(
+ :all,
+ :conditions => [
+ "scmid IN (?)",
+ revisions.map!{|c| c.scmid}
+ ]
+ )
+ end
+
+ def clear_extra_info_of_changesets
+ return if extra_info.nil?
+ v = extra_info["extra_report_last_commit"]
+ write_attribute(:extra_info, nil)
+ h = {}
+ h["extra_report_last_commit"] = v
+ merge_extra_info(h)
+ self.save
+ end
+ private :clear_extra_info_of_changesets
+end
diff --git a/app/models/role.rb b/app/models/role.rb
index f363b52bf..8bf5ebc05 100644
--- a/app/models/role.rb
+++ b/app/models/role.rb
@@ -77,6 +77,27 @@ class Role < ActiveRecord::Base
self.givable[3..5]
end
+ GUEST = 10
+ REPORTER = 20
+ DEVELOPER = 30
+ MASTER = 40
+ OWNER = 50
+ def to_gitlab_role
+ case self.position
+ when 1,2
+ GUEST
+ when 5
+ REPORTER
+ when 4
+ DEVELOPER
+ when 3
+ MASTER
+ else
+ GUEST
+ end
+ end
+
+
# Copies attributes from another role, arg can be an id or a Role
def copy_from(arg, options={})
return unless arg.present?
diff --git a/app/models/user.rb b/app/models/user.rb
index d66785460..edc29c015 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -93,6 +93,7 @@ class User < Principal
has_many :changesets, :dependent => :nullify
has_one :preference, :dependent => :destroy, :class_name => 'UserPreference'
has_one :rss_token, :class_name => 'Token', :conditions => "action='feeds'"
+ has_one :blog, :class_name => 'Blog', :foreign_key => "author_id"
has_one :api_token, :class_name => 'Token', :conditions => "action='api'"
belongs_to :auth_source
belongs_to :ucourse, :class_name => 'Course', :foreign_key => :id #huang
@@ -217,6 +218,8 @@ class User < Principal
# 更新邮箱用户或用户名的同事,同步更新邀请信息
after_update :update_invite_list
+ include Trustie::Gitlab::ManageUser
+
scope :in_group, lambda {|group|
group_id = group.is_a?(Group) ? group.id : group.to_i
where("#{User.table_name}.id IN (SELECT gu.user_id FROM #{table_name_prefix}groups_users#{table_name_suffix} gu WHERE gu.group_id = ?)", group_id)
@@ -255,6 +258,18 @@ class User < Principal
# count = self.journals_for_messages(:conditions => ["status=? and is_readed = ? " ,1, 0]).count
end
+ def blog
+ @blog = Blog.where("author_id = #{self.id}").all[0]
+ if @blog.nil?
+ #如果某个user的blog不存在,那么就创建一条,并且跳转
+ @blog = Blog.create(:name=>(User.find(self.id).realname.blank? ? User.find(self.id).login : User.find(self.id).realname ),
+ :description=>'',
+ :author_id=>self.id)
+ @blog.save
+ end
+ @blog
+ end
+
# 查询指派给我的缺陷记录
def count_new_issue_assign_to
self.issue_assigns
@@ -345,7 +360,7 @@ class User < Principal
name
end
## end
-
+
#added by nie
def count_new_journal_reply
count = self.journal_reply.count
@@ -1066,6 +1081,17 @@ class User < Principal
end
+ private
+ def sync_gitlab_user
+ user = self
+ g = Gitlab.client
+ u = g.get("/users?search=#{user.mail}").first
+ unless u
+ u = g.create_user(user.mail, user.password, name: user.show_name, username: user.login, confirm: "true")
+ self.gid = u.id
+ puts "create user #{user.login}"
+ end
+ end
end
diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb
index 4639f1c2b..74580632f 100644
--- a/app/services/courses_service.rb
+++ b/app/services/courses_service.rb
@@ -15,11 +15,11 @@ class CoursesService
page_no = params[:page] || 1
if @school_id == "0" || @school_id.nil?
@courses_all = Course.active.visible.
- joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
+ joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
else
@courses_all = Course.active.visible.
- joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
- where("#{Course.table_name}.school_id = ?", @school_id)
+ joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
+ where("#{Course.table_name}.school_id = ?", @school_id)
end
@course_count = @courses_all.count
@course_pages = Redmine::Pagination::Paginator.new @course_count, per_page_option,page_no
@@ -300,26 +300,72 @@ class CoursesService
#@state == 4 您加入的课程不存在
#@state == 5 您还未登录
#@state == 6 申请成功,请等待审核完毕
+ #@state == 7 您已经发送过申请了,请耐心等待
+ #@state == 8 您已经是该课程的教师了
+ #@state == 9 您已经是该课程的教辅了
#@state 其他 未知错误,请稍后再试
def join_course params,current_user
course = Course.find_by_id params[:object_id]
+
@state = 10
if course
if course_endTime_timeout? course
@state = 2
else
- if current_user.member_of_course?(course)
- @state = 3
- else
+ if current_user.member_of_course?(course) #如果已经是成员
+ member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0]
+ roleName = member.roles[0].name if member
if params[:course_password] == course.password
- members = []
- members << Member.new(:role_ids => [10], :user_id => current_user.id)
- course.members << members
- StudentsForCourse.create(:student_id => current_user.id, :course_id => params[:object_id])
- @state = 0
+ #如果加入角色为学生 并且当前是学生
+ if params[:role] == "10" && roleName == "Student"
+ @state = 3
+ #如果加入的角色为老师,并且当前已经是老师
+ elsif params[:role] == "9" && roleName == "Teacher"
+ @state = 8
+ #如果加入的角色教辅并且当前为教辅
+ elsif params[:role] == "7" && roleName == "TeachingAsistant"
+ @state = 9
+ #如果加入角色为教师或者教辅,并且当前是学生,或者是要成为教辅,当前不是教辅,或者要成为教师,当前不是教师。那么要发送请求
+ elsif (params[:role] != "10" && roleName == "Student") || (params[:role] == "7" && roleName != "TeachingAsistant" ) || (params[:role] == "9" && roleName != "Teacher" )
+ #如果已经发送过消息了,那么就要给个提示
+ if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = #{params[:role]} and course_message_id = #{User.current.id} and course_id = #{course.id} and status = 0 ").count != 0
+ @state = 7
+ else
+ Mailer.run.join_course_request(course, User.current, params[:role])
+ CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest',:status=>0)
+ @state = 6
+ end
+ #如果加入角色是学生,但是是当前课程的教师或者教辅
+ elsif params[:role] == "10" && roleName != "Student"
+ member.role_ids = [params[:role]]
+ member.save
+ StudentsForCourse.create(:student_id => current_user.id, :course_id => params[:object_id])
+ @state = 0
+ end
else
@state = 1
end
+ else
+ if params[:course_password] == course.password
+ if params[:role] == "10" || params[:role] == nil
+ members = []
+ members << Member.new(:role_ids => [10], :user_id => current_user.id)
+ course.members << members
+ StudentsForCourse.create(:student_id => current_user.id, :course_id => params[:object_id])
+ @state = 0
+ else
+ #如果已经发送过消息了,那么就要给个提示
+ if CourseMessage.where("course_message_type = 'JoinCourseRequest' and user_id = #{course.tea_id} and content = #{params[:role]} and course_message_id = #{User.current.id} and course_id = #{course.id} and status = 0").count != 0
+ @state = 7
+ else
+ Mailer.run.join_course_request(course, User.current, params[:role])
+ CourseMessage.create(:user_id => course.tea_id, :course_id => course.id, :viewed => false,:content=> params[:role],:course_message_id=>User.current.id,:course_message_type=>'JoinCourseRequest',:status=>0)
+ @state = 6
+ end
+ end
+ else
+ @state = 1
+ end
end
end
else
@@ -336,11 +382,11 @@ class CoursesService
if course.is_public != 0 || current_user.member_of_course?(course)
bids = course.homework_commons.page(params[:page] || 1).per(20).order('created_at DESC')
bids = bids.like(params[:name]) if params[:name].present?
- homeworks = []
- bids.each do |bid|
- homeworks << show_homework_info(course,bid,current_user,is_course_teacher(current_user,course))
- end
- homeworks
+ homeworks = []
+ bids.each do |bid|
+ homeworks << show_homework_info(course,bid,current_user,is_course_teacher(current_user,course))
+ end
+ homeworks
else
raise '403'
end
@@ -411,10 +457,10 @@ class CoursesService
#每个作业中学生最后提交的作业
homeworks = []
course.homework_commons.each do |bid|
- homework_attach = bid.student_works.order('updated_at DESC').first
- unless homework_attach.nil?
- homeworks << homework_attach
- end
+ homework_attach = bid.student_works.order('updated_at DESC').first
+ unless homework_attach.nil?
+ homeworks << homework_attach
+ end
end
unless homeworks.count == 0
homeworks.sort!{|order,newer| newer.updated_at <=> order.updated_at}
@@ -433,21 +479,21 @@ class CoursesService
result
end
- # 课程课件
- def course_attachments params
- result = []
- course = Course.find(params[:course_id])
- attachments = course.attachments.order("created_on ")
- if !params[:name].nil? && params[:name] != ""
- attachments.each do |atta|
- result << atta if atta.filename.include?(params[:name])
+ # 课程课件
+ def course_attachments params
+ result = []
+ course = Course.find(params[:course_id])
+ attachments = course.attachments.order("created_on ")
+ if !params[:name].nil? && params[:name] != ""
+ attachments.each do |atta|
+ result << atta if atta.filename.include?(params[:name])
- end
- else
- result = attachments
- end
- result
- end
+ end
+ else
+ result = attachments
+ end
+ result
+ end
# 课程学生列表
def course_members params
@@ -488,20 +534,20 @@ class CoursesService
end
def del_assitant_teacher params
- member = Member.where("user_id = ? and course_id = ?",params[:user_id],params[:course_id])
- member.each do |m|
- m.destroy
- end
- user_admin = CourseInfos.where("user_id = ? and course_id = ?",params[:user_id], params[:course_id])
- if user_admin.size > 0
- user_admin.each do |user|
- user.destroy
- end
- end
- joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id],params[:course_id])
- joined.each do |join|
- join.delete
- end
+ member = Member.where("user_id = ? and course_id = ?",params[:user_id],params[:course_id])
+ member.each do |m|
+ m.destroy
+ end
+ user_admin = CourseInfos.where("user_id = ? and course_id = ?",params[:user_id], params[:course_id])
+ if user_admin.size > 0
+ user_admin.each do |user|
+ user.destroy
+ end
+ end
+ joined = StudentsForCourse.where('student_id = ? and course_id = ?', params[:user_id],params[:course_id])
+ joined.each do |join|
+ join.delete
+ end
end
def create_course_notice params ,current_user
@@ -570,11 +616,11 @@ class CoursesService
:open_anonymous_evaluation => open_anonymous_evaluation,
#:homework_for_anonymous_comments => homework_for_anonymous_comments,
:created_on => bid.created_at,:deadline => bid.end_time,
- :homework_notsubmit_num => bid.course.members.count - bid.student_works.count,
- :homework_submit_num => bid.student_works.count,
- :homework_status_student => get_homework_status( bid),:homework_status_teacher => homework_status_desc( bid),
- :student_evaluation_part => get_evaluation_part( bid ,3),
- :ta_evaluation_part => get_evaluation_part( bid ,2),:homework_anony_type => bid.homework_type == 1 && !bid.homework_detail_manual.nil?}
+ :homework_notsubmit_num => bid.course.members.count - bid.student_works.count,
+ :homework_submit_num => bid.student_works.count,
+ :homework_status_student => get_homework_status( bid),:homework_status_teacher => homework_status_desc( bid),
+ :student_evaluation_part => get_evaluation_part( bid ,3),
+ :ta_evaluation_part => get_evaluation_part( bid ,2),:homework_anony_type => bid.homework_type == 1 && !bid.homework_detail_manual.nil?}
end
@@ -586,9 +632,9 @@ class CoursesService
homework_count = bid.homeworks.count #已提交的作业数量
student_questions_count = bid.journals_for_messages.where('m_parent_id IS NULL').count
description = bid.description
- #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2
+ #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2
state = bid.comment_status
- #end
+ #end
open_anonymous_evaluation = bid.open_anonymous_evaluation
{:course_name => course.name,:id => bid.id, :course_teacher => author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
:description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation}
@@ -685,12 +731,12 @@ class CoursesService
latest_course_dynamics << {:time => latest_news.first.created_on }
end
# 课程讨论区
- latest_message = course.boards.first.topics.page(1).per(2)
- unless latest_message.first.nil?
- topic_count = course.boards.nil? ? 0 : course.boards.first.topics.count
- topics = latest_message.all
- latest_course_dynamics << {:time => latest_message.first.created_on}
- end
+ latest_message = course.boards.first.topics.page(1).per(2)
+ unless latest_message.first.nil?
+ topic_count = course.boards.nil? ? 0 : course.boards.first.topics.count
+ topics = latest_message.all
+ latest_course_dynamics << {:time => latest_message.first.created_on}
+ end
# 课程资源
# latest_attachment = course.attachments.order("created_on desc").page(1).per(2)
# unless latest_attachment.first.nil?
@@ -727,29 +773,29 @@ class CoursesService
unless active_students.empty?
latest_course_dynamics <<{:time=>"1970-01-01 0:0:0 +0800"}
end
- latest_course_dynamic = latest_course_dynamics.first
- unless latest_course_dynamic.nil?
- result << {:course_name => course.name,
- :current_user_is_member => current_user.member_of_course?(course),
- :current_user_is_teacher => is_course_teacher(current_user,course),
- :course_id => course.id,
- :course_img_url => url_to_avatar(course),
- :course_time => course.time,
- :course_term => course.term,
- :news_count => notices_count,
- :homework_count => homework_count,
- :topic_count => topic_count,
- :news => notices,
- :homeworks => homeworkss,
- :topics => topics,
- :better_students => better_students,
- :active_students => active_students,
- :message => "",
- :course_student_num=>course ? course.members.count : 0,
- #:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前",
- :time_from_now=>time_from_now(latest_course_dynamic[:time].to_time), #.strftime('%Y-%m-%d %H:%M:%S').to_s,
- :time=>latest_course_dynamic[:time].to_time}
- end
+ latest_course_dynamic = latest_course_dynamics.first
+ unless latest_course_dynamic.nil?
+ result << {:course_name => course.name,
+ :current_user_is_member => current_user.member_of_course?(course),
+ :current_user_is_teacher => is_course_teacher(current_user,course),
+ :course_id => course.id,
+ :course_img_url => url_to_avatar(course),
+ :course_time => course.time,
+ :course_term => course.term,
+ :news_count => notices_count,
+ :homework_count => homework_count,
+ :topic_count => topic_count,
+ :news => notices,
+ :homeworks => homeworkss,
+ :topics => topics,
+ :better_students => better_students,
+ :active_students => active_students,
+ :message => "",
+ :course_student_num=>course ? course.members.count : 0,
+ #:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前",
+ :time_from_now=>time_from_now(latest_course_dynamic[:time].to_time), #.strftime('%Y-%m-%d %H:%M:%S').to_s,
+ :time=>latest_course_dynamic[:time].to_time}
+ end
end
#返回数组集合
@@ -768,9 +814,9 @@ class CoursesService
sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" <<
" where homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) GROUP BY student_works.user_id ORDER BY score desc limit #{page*10},10"
sql_count = " select count(distinct(student_works.user_id) ) " <<
- " from student_works left outer join users on student_works.user_id = users.id " <<
- " where homework_common_id in " <<
- " ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) "
+ " from student_works left outer join users on student_works.user_id = users.id " <<
+ " where homework_common_id in " <<
+ " ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) "
max_size = ActiveRecord::Base.connection().select_value(sql_count)
user_list = User.find_by_sql(sql)
else
diff --git a/app/views/blog_comments/_attachments_links.html.erb b/app/views/blog_comments/_attachments_links.html.erb
new file mode 100644
index 000000000..ca0f41d16
--- /dev/null
+++ b/app/views/blog_comments/_attachments_links.html.erb
@@ -0,0 +1,41 @@
+
+ <% for attachment in attachments %>
+
+
+
+ <% if options[:length] %>
+
+ <%= link_to_short_attachment attachment, :class => 'fl FilesName02', :download => true,:length => options[:length] -%>
+
(<%= number_to_human_size attachment.filesize , :precision => 0 %>)
+ <% if options[:deletable] %>
+ <%#= link_to image_tag('delete.png'), attachment_path(attachment),
+ :data => {:confirm => l(:text_are_you_sure)},
+ :method => :delete,
+ :class => 'delete',
+ #:remote => true,
+ #:id => "attachments_" + attachment.id.to_s,
+ :title => l(:button_delete) %>
+
+ <% end %>
+
+ <% else %>
+
+ <%= link_to_short_attachment attachment, :class => 'fl FilesName02', :download => true, :length => 45 -%>
+
(<%= number_to_human_size attachment.filesize , :precision => 0 %>)
+ <% if options[:deletable] %>
+
+ <% end %>
+
+ <% end %>
+ <% end %>
+ <% if defined?(thumbnails) && thumbnails %>
+ <% images = attachments.select(&:thumbnailable?) %>
+ <% if images.any? %>
+
+ <% images.each do |attachment| %>
+
<%= thumbnail_tag(attachment) %>
+ <% end %>
+
+ <% end %>
+ <% end %>
+
diff --git a/app/views/blog_comments/_blog_attachments.erb b/app/views/blog_comments/_blog_attachments.erb
new file mode 100644
index 000000000..48fe91099
--- /dev/null
+++ b/app/views/blog_comments/_blog_attachments.erb
@@ -0,0 +1,78 @@
+
+
+
+<% if defined?(container) && container && container.saved_attachments %>
+ <% container.attachments.each_with_index do |attachment, i| %>
+
+ <%= text_field_tag("attachments[p#{i}][filename]", attachment.filename, :class => 'filename readonly', :readonly => 'readonly') %><%= text_field_tag("attachments[p#{i}][description]", attachment.description, :maxlength => 254, :placeholder => l(:label_optional_description), :class => 'description', :style => "display: inline-block;") %><%= l(:field_is_public) %>:
+ <%= check_box_tag("attachments[p#{i}][is_public_checkbox]", attachment.is_public, attachment.is_public == 1 ? true : false, :class => 'is_public') %>
+ <%= if attachment.id.nil?
+ #待补充代码
+ else
+ link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload')
+ end
+ %>
+ <%#= render :partial => 'tags/tag', :locals => {:obj => attachment, :object_flag => "6"} %>
+
+ <%= hidden_field_tag "attachments[p#{i}][token]", "#{attachment.token}" %>
+
+
+ <% end %>
+ <% container.saved_attachments.each_with_index do |attachment, i| %>
+
+ <%= text_field_tag("attachments[p#{i}][filename]", attachment.filename, :class => 'filename readonly', :readonly => 'readonly') %>
+ <%= text_field_tag("attachments[p#{i}][description]", attachment.description, :maxlength => 254, :placeholder => l(:label_optional_description), :class => 'description', :style => "display: inline-block;") %>
+ <%= l(:field_is_public) %>:
+ <%= check_box_tag("attachments[p#{i}][is_public_checkbox]", attachment.is_public, attachment.is_public == 1 ? true : false, :class => 'is_public') %>
+ <%= if attachment.id.nil?
+ #待补充代码
+ else
+ link_to(' '.html_safe, attachment_path(attachment, :attachment_id => "p#{i}", :format => 'js'), :method => 'delete', :remote => true, :class => 'remove-upload')
+ end
+ %>
+ <%#= render :partial => 'tags/tag', :locals => {:obj => attachment, :object_flag => "6"} %>
+
+ <%= hidden_field_tag "attachments[p#{i}][token]", "#{attachment.token}" %>
+
+
+ <% end %>
+<% end %>
+
+
+
+ <%#= button_tag "浏览", :type=>"button", :onclick=>"CompatibleSend();" %>
+
+ <%#= button_tag "文件浏览", :type=>"button", :onclick=>"$('#_file').click();",:onmouseover => 'this.focus()',:class => 'sub_btn' %>
+ 上传附件
+ <%= file_field_tag 'attachments[dummy][file]',
+ :id => '_file',
+ :class => 'file_selector',
+ :multiple => true,
+ :onchange => 'addInputFiles(this);',
+ :style => ie8? ? '' : 'display:none',
+ :data => {
+ :max_file_size => Setting.attachment_max_size.to_i.kilobytes,
+ :max_file_size_message => l(:error_attachment_too_big, :max_size => number_to_human_size(Setting.attachment_max_size.to_i.kilobytes)),
+ :max_concurrent_uploads => Redmine::Configuration['max_concurrent_ajax_uploads'].to_i,
+ :upload_path => uploads_path(:format => 'js', :project => container),
+ :description_placeholder => l(:label_optional_description),
+ :field_is_public => l(:field_is_public),
+ :are_you_sure => l(:text_are_you_sure),
+ :file_count => l(:label_file_count),
+ :delete_all_files => l(:text_are_you_sure_all)
+ } %>
+
+ <%= l(:label_no_file_uploaded) %>
+
+ (<%= l(:label_max_size) %>:
+ <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
+
+
+ <% content_for :header_tags do %>
+ <%= javascript_include_tag 'attachments' %>
+ <% end %>
+
+
diff --git a/app/views/blog_comments/_edit.html.erb b/app/views/blog_comments/_edit.html.erb
new file mode 100644
index 000000000..d56557ce7
--- /dev/null
+++ b/app/views/blog_comments/_edit.html.erb
@@ -0,0 +1,53 @@
+<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' ,'blog' %>
+
+
+
+
+
+ <%if User.current.id == user.id%>
+
+ <%= f.check_box :sticky%>
+ <%= label_tag 'message_sticky', l(:label_board_sticky) %>
+ <%= f.check_box :locked%>
+ <%= label_tag 'message_locked', l(:label_board_locked) %>
+
+
+ <% end %>
+
+
+ <%= text_area :quote,:quote,:style => 'display:none' %>
+ <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %>
+
+ <%= f.kindeditor :content,:editor_id => 'message_content_editor',
+ :owner_id => article.nil? ? 0: article.id,
+ :owner_type => OwnerTypeHelper::BLOGCOMMENT,
+ :width => '100%',
+ :height => 300,
+ :minHeight=>300,
+ :class => 'talk_text fl',
+ :input_html => { :id => 'message_content',
+ :class => 'talk_text fl',
+ :maxlength => 5000 }%>
+
+
+
+
+
+
+ <%= render :partial => 'blog_comments/blog_attachments', :locals => {:container => article} %>
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/blog_comments/_new.html.erb b/app/views/blog_comments/_new.html.erb
new file mode 100644
index 000000000..2a2281a40
--- /dev/null
+++ b/app/views/blog_comments/_new.html.erb
@@ -0,0 +1,62 @@
+<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' ,'blog' %>
+
+
+
+
+
+ <%if User.current.id == user.id%>
+
+ <%= f.check_box :sticky%>
+ <%= label_tag 'message_sticky', l(:label_board_sticky) %>
+ <%= f.check_box :locked%>
+ <%= label_tag 'message_locked', l(:label_board_locked) %>
+
+
+ <% end %>
+
+
+ <%= text_area :quote,:quote,:style => 'display:none' %>
+ <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %>
+
+ <%= f.kindeditor :content, :editor_id => 'message_content_editor',
+ :owner_id => article.nil? ? 0: article.id,
+ :owner_type => OwnerTypeHelper::BLOGCOMMENT,
+ :width => '100%',
+ :height => 300,
+ :minHeight=>300,
+ :class => 'talk_text fl',
+ :input_html => { :id => 'message_content',
+ :class => 'talk_text fl',
+ :maxlength => 5000 }%>
+
+
+
+
+
+
+ <%= render :partial => 'blog_comments/blog_attachments', :locals => {:container => article} %>
+
+
+
+
+
+
+
+ <%#= render :partial => 'course_new_topic', :locals => {:f => f, :topic => @message} %>
+
+
+
\ No newline at end of file
diff --git a/app/views/blog_comments/_reply_form.html.erb b/app/views/blog_comments/_reply_form.html.erb
new file mode 100644
index 000000000..cc4c0e952
--- /dev/null
+++ b/app/views/blog_comments/_reply_form.html.erb
@@ -0,0 +1,35 @@
+<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' %>
+
+ * <%= l(:field_subject) %> :
+ <%= f.text_field :title, { size: 60, id: "message_subject",:class=>"talk_input w585 fl" }.merge({ hidden: "hidden"}) %>
+
+
+
+
+
+
+
+
+
+ <%= text_area :quote,:quote,:style => 'display:none' %>
+ <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %>
+
+
+
+ <%= f.kindeditor :content, :editor_id => 'message_content_editor',
+ :width => '99%',
+ :height => 100,
+ :minHeight=>100,
+ :input_html => { :id => 'message_content',
+ :class => 'talk_text fl',
+ :maxlength => 5000 }%>
+
+
+
+
+
+
+
diff --git a/app/views/blog_comments/_simple_ke_reply_form.html.erb b/app/views/blog_comments/_simple_ke_reply_form.html.erb
new file mode 100644
index 000000000..61669058b
--- /dev/null
+++ b/app/views/blog_comments/_simple_ke_reply_form.html.erb
@@ -0,0 +1,34 @@
+
+
+
+
<%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(User.current), :alt => "用户头像" %>
+
+
+
\ No newline at end of file
diff --git a/app/views/blog_comments/edit.html.erb b/app/views/blog_comments/edit.html.erb
new file mode 100644
index 000000000..a878063db
--- /dev/null
+++ b/app/views/blog_comments/edit.html.erb
@@ -0,0 +1,6 @@
+<% if User.current.logged? && User.current.id == @user.id %>
+ <%= form_for @article, :url =>{:controller=>'blog_comments',:action => 'update',:user_id=>@user.id , :blog_id => @article.id},:method=>'PUT',
+ :html => {:nhname=>'form',:multipart => true, :id => 'message-form'} do |f| %>
+ <%= render :partial => 'blog_comments/edit', :locals => {:f => f, :article => @article, :edit_mode => true, :user => @user} %>
+ <% end %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/blog_comments/quote.js.erb b/app/views/blog_comments/quote.js.erb
new file mode 100644
index 000000000..088b2cf67
--- /dev/null
+++ b/app/views/blog_comments/quote.js.erb
@@ -0,0 +1,10 @@
+if($("#reply_message_<%= @blogComment.id%>").length > 0) {
+ $("#reply_message_<%= @blogComment.id%>").replaceWith("<%= escape_javascript(render :partial => 'blog_comments/simple_ke_reply_form', :locals => {:reply => @blogComment,:temp =>@temp,:subject =>@subject,:course_id=>@course_id}) %>");
+ $(function(){
+ $('#reply_subject').val("<%= raw escape_javascript(@subject) %>");
+ $('#quote_quote').val("<%= raw escape_javascript(@temp.content.html_safe) %>");
+ init_activity_KindEditor_data(<%= @blogComment.id%>,null,"85%");
+ });
+}else if($("#reply_to_message_<%= @blogComment.id%>").length >0) {
+ $("#reply_to_message_<%= @blogComment.id%>").replaceWith("");
+}
\ No newline at end of file
diff --git a/app/views/blog_comments/reply.js.erb b/app/views/blog_comments/reply.js.erb
new file mode 100644
index 000000000..f8ed4bb24
--- /dev/null
+++ b/app/views/blog_comments/reply.js.erb
@@ -0,0 +1,7 @@
+<% if @in_user_center%>
+ $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/user_blog', :locals => {:activity => @article,:user_activity_id =>@user_activity_id}) %>");
+ init_activity_KindEditor_data(<%= @user_activity_id%>,"","87%");
+<% else%>
+$("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'blogs/article', :locals => {:activity => @article,:user_activity_id =>@user_activity_id,:first_user_activity =>@first_user_activity,:page => @page}) %>");
+init_activity_KindEditor_data(<%= @user_activity_id%>,"","87%");
+<% end %>
\ No newline at end of file
diff --git a/app/views/blog_comments/show.html.erb b/app/views/blog_comments/show.html.erb
new file mode 100644
index 000000000..2d4754a0a
--- /dev/null
+++ b/app/views/blog_comments/show.html.erb
@@ -0,0 +1,175 @@
+<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg',"init_activity_KindEditor",'blog' %>
+
+
+
+
+
+
+ <%= link_to image_tag(url_to_avatar(@article.author),:width=>50,:height => 50,:alt=>'图像' ),user_path(@article.author) %>
+
+
+ <% if @article.author.id == User.current.id%>
+
+
+
+
+
+ <%= link_to(
+ l(:button_edit),
+ {:action => 'edit', :id => @article.id},
+ :class => 'postOptionLink'
+ ) if User.current && User.current.id == @article.author.id %>
+
+
+ <%= link_to(
+ l(:button_delete),
+ {:action => 'destroy', :id => @article.id},
+ :method => :delete,
+ :data => {:confirm => l(:text_are_you_sure)},
+ :class => 'postOptionLink'
+ ) if User.current && User.current.id == @article.author.id %>
+
+
+
+
+
+ <%end%>
+
+
+
+
+ <% if @article.try(:author).try(:realname) == ' ' %>
+ <%= link_to @article.try(:author), user_path(@article.author,:host=>Setting.host_user), :class => "linkBlue2", :target=> "_blank" %>
+ <% else %>
+ <%= link_to @article.try(:author).try(:realname), user_path(@article.author,:host=>Setting.host_user), :class => "linkBlue2", :target=> "_blank" %>
+ <% end %>
+
+
<%= format_time( @article.created_on)%>
+
+
+ <%= @article.content.html_safe%>
+
+
+
+ <%#= link_to_attachments_course @topic, :author => false %>
+ <% if @article.attachments.any?%>
+ <% options = {:author => true, :deletable => false} %>
+ <%= render :partial => 'blog_comments/attachments_links', :locals => {:attachments => @article.attachments, :options => options, :is_float => true} %>
+ <% end %>
+
+
+
+
+
+ <% count=0 %>
+ <% if @article.parent %>
+ <% count=@article.parent.children.count%>
+ <% else %>
+ <% count=@article.children.count%>
+ <% end %>
+
+ <% unless count == 0 %>
+
+
+ <%@article.children.reorder('created_on desc').each_with_index do |reply,i| %>
+
+
+
+ <%= link_to image_tag(url_to_avatar(reply.author), :width => 33,:height => 33), user_path(reply.author) %>
+
+
+
+ <% if reply.try(:author).try(:realname) == ' ' %>
+ <%= link_to reply.try(:author), user_path(reply.author_id,:host=>Setting.host_user), :class => "newsBlue mr10 f14" %>
+ <% else %>
+ <%= link_to reply.try(:author).try(:realname), user_path(reply.author_id,:host=>Setting.host_user), :class => "newsBlue mr10 f14" %>
+ <% end %>
+
+
+ <%= reply.content.html_safe%>
+
+
+ <%= format_time(reply.created_on) %>
+
+
+
+
+
+
+ <% end %>
+
+
+ <% end %>
+
+ <% if !@article.locked? && User.current.logged?%>
+
+
+
+
+ <%= form_for :blog_comment, :url => {:action => 'reply',:controller => 'blog_comments',:user_id=>@article.author.id,:blog_id=>@article.blog_id, :id => @article.id}, :html => {:multipart => true, :id => 'message_form'} do |f| %>
+ <%= render :partial => 'blog_comments/reply_form', :locals => {:f => f,:user=>@user,:article=>@article} %>
+ <%= link_to l(:button_cancel), "javascript:void(0)", :onclick => 'canel_message_replay();', :class => " grey_btn fr c_white mt10 mr5" %>
+ <%= link_to l(:button_submit), "javascript:void(0)", :onclick => 'submit_message_replay();', :class => "blue_btn fr c_white mt10", :style => "margin-right: 5px;" %>
+ <% end %>
+
+
+
+ <% end %>
+
+
\ No newline at end of file
diff --git a/app/views/blogs/_article.html.erb b/app/views/blogs/_article.html.erb
new file mode 100644
index 000000000..33a3201c0
--- /dev/null
+++ b/app/views/blogs/_article.html.erb
@@ -0,0 +1,172 @@
+
+
+
+ <%= link_to image_tag(url_to_avatar(activity.author), :width => "50", :height => "50"), user_path(activity.author_id,:host=>Setting.host_user), :alt => "用户头像" %>
+
+
+ <% if activity.author.id == User.current.id%>
+
+
+
+
+
+ <%= link_to(
+ l(:button_edit),
+ {:controller => 'blog_comments',:action => 'edit',:user_id=>activity.author_id,:blog_id=>activity.blog_id, :id => activity.id},
+ :class => 'postOptionLink'
+ ) if User.current && User.current.id == activity.author.id %>
+
+
+ <%= link_to(
+ l(:button_delete),
+ {:controller => 'blog_comments',:action => 'destroy',:user_id=>activity.author_id,:blog_id=>activity.blog_id, :id => activity.id},
+ :method => :delete,
+ :data => {:confirm => l(:text_are_you_sure)},
+ :class => 'postOptionLink'
+ ) if User.current && User.current.id == activity.author.id %>
+
+
+
+
+
+ <%end%>
+
+ <% if activity.try(:author).try(:realname) == ' ' %>
+ <%= link_to activity.try(:author), user_path(activity.author_id,:host=>Setting.host_user), :class => "newsBlue mr15" %>
+ <% else %>
+ <%= link_to activity.try(:author).try(:realname), user_path(activity.author_id,:host=>Setting.host_user), :class => "newsBlue mr15" %>
+ <% end %>
+ TO
+ <%= link_to activity.blog.name+" | 博客", user_blogs_path(:user_id=>activity.author_id,:host=>Setting.host_user), :class => "newsBlue ml15 mr5"%>
+
+
+
+ <% if activity.parent_id.nil? %>
+ <%= link_to activity.title.to_s.html_safe, user_blog_blog_comment_path(:user_id=>activity.author_id, :blog_id=>activity.blog.id,:id=>activity), :class=> "postGrey" %>
+ <% else %>
+ <%= link_to activity.title.subject.to_s.html_safe, user_blog_blog_comment_path(:user_id=>activity.author_id, :blog_id=>activity.blog.id,:id=>activity), :class=> "postGrey"%>
+ <% end %>
+
+ <% if activity.sticky == 1%>
+
置顶
+ <% end%>
+ <% if activity.locked%>
+
+ <% end%>
+
+
+ 发帖时间:<%= format_time(activity.created_on) %>
+
+
+
+ <% if activity.parent_id.nil? %>
+ <%= activity.content.to_s.html_safe%>
+ <% else %>
+ <%= activity.parent.content.to_s.html_safe%>
+ <% end %>
+
+
+
+ <% if activity.attachments.any?%>
+ <% options = {:author => true, :deletable => false } %>
+ <%= render :partial => 'blog_comments/attachments_links', :locals => {:attachments => activity.attachments, :options => options, :is_float => true} %>
+ <% end %>
+
+
+
+
+
+ <% count=0 %>
+ <% if activity.parent %>
+ <% count=activity.parent.children.count%>
+ <% else %>
+ <% count=activity.children.count%>
+ <% end %>
+
+
+
+
回复(
+ <%= count %>
+ )
+
<%#=format_date(activity.updated_on)%>
+ <%if count > 3 %>
+
+ <% end %>
+
+
+ <% activity= activity.parent ? activity.parent : activity%>
+ <% replies_all_i = 0 %>
+ <% if count > 0 %>
+
+
+ <% activity.children.reorder("created_on desc").each do |reply|%>
+
+ <% replies_all_i=replies_all_i+1 %>
+
+
+ <%= link_to image_tag(url_to_avatar(reply.author), :width => "33", :height => "33"), user_path(reply.author_id,:host=>Setting.host_user), :alt => "用户头像" %>
+
+
+
+ <% if reply.try(:author).try(:realname) == ' ' %>
+ <%= link_to reply.try(:author), user_path(reply.author_id,:host=>Setting.host_user), :class => "newsBlue mr10 f14" %>
+ <% else %>
+ <%= link_to reply.try(:author).try(:realname), user_path(reply.author_id,:host=>Setting.host_user), :class => "newsBlue mr10 f14" %>
+ <% end %>
+ <%= format_time(reply.created_on) %>
+
+
+ <%= reply.content.html_safe %>
+
+
+
+
+ <% end %>
+
+
+ <% end %>
+
+ <% if !activity.locked? %>
+
+
<%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(activity.author_id), :alt => "用户头像" %>
+
+
+ <%= form_for('new_form',:url => {:controller=>'blog_comments',:action => 'reply', :id => activity.id, :blog_id => activity.blog.id, :user_id => activity.author_id},:method => "post",:remote=>true) do |f|%>
+
+
+
+
+
+
+
+
发送
+
+
+ <% end%>
+
+
+
+
+
+
+ <% end %>
+
+
diff --git a/app/views/blogs/_article_list.html.erb b/app/views/blogs/_article_list.html.erb
new file mode 100644
index 000000000..e397da2cc
--- /dev/null
+++ b/app/views/blogs/_article_list.html.erb
@@ -0,0 +1,101 @@
+<%= javascript_include_tag "/assets/kindeditor/kindeditor", '/assets/kindeditor/pasteimg', "init_activity_KindEditor" %>
+
+
+
+
+
+
diff --git a/app/views/blogs/index.html.erb b/app/views/blogs/index.html.erb
new file mode 100644
index 000000000..0e69d1654
--- /dev/null
+++ b/app/views/blogs/index.html.erb
@@ -0,0 +1,187 @@
+
+
+<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' %>
+<%#= javascript_include_tag "/assets/kindeditor/kindeditor-min" %>
+
+
+<%= render :partial => 'blogs/article_list', :locals => {:blog=>@user.blog,:topics => @user.blog.articles.reorder("#{BlogComment.table_name}.sticky desc,#{BlogComment.table_name}.created_on desc"), :page => 0, :user => @user} %>
+
+
+
diff --git a/app/views/blogs/show.html.erb b/app/views/blogs/show.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/common/_file.html.erb b/app/views/common/_file.html.erb
index d4c0875c2..97443beea 100644
--- a/app/views/common/_file.html.erb
+++ b/app/views/common/_file.html.erb
@@ -8,7 +8,7 @@
<%= line_num %>
- <%= line.html_safe %>
+ <%= line.html_safe %>
<% line_num += 1 %>
diff --git a/app/views/courses/_course_activity.html.erb b/app/views/courses/_course_activity.html.erb
index aa99236df..4a7cb900d 100644
--- a/app/views/courses/_course_activity.html.erb
+++ b/app/views/courses/_course_activity.html.erb
@@ -68,13 +68,24 @@
}
}
- function expand_reply_input(id) {
- $(id).toggle();
- }
-
$(function () {
init_activity_KindEditor_data(<%= activity.id%>, null, "87%");
showNormalImage('activity_description_<%= activity.id %>');
+ if($("#intro_content_<%= activity.id %>").height() > 360) {
+ $("#intro_content_show_<%= activity.id %>").show();
+ }
+ $("#intro_content_show_<%= activity.id %>").click(function(){
+ $("#activity_description_<%= activity.id %>").toggleClass("maxh360");
+ $("#activity_description_<%= activity.id%>").toggleClass("lh18");
+ $("#intro_content_show_<%= activity.id %>").hide();
+ $("#intro_content_hide_<%= activity.id %>").show();
+ });
+ $("#intro_content_hide_<%= activity.id %>").click(function(){
+ $("#activity_description_<%= activity.id %>").toggleClass("maxh360");
+ $("#activity_description_<%= activity.id%>").toggleClass("lh18");
+ $("#intro_content_hide_<%= activity.id %>").hide();
+ $("#intro_content_show_<%= activity.id %>").show();
+ });
});
<% if activity && activity.course_act%>
diff --git a/app/views/courses/_course_outlines_list.html.erb b/app/views/courses/_course_outlines_list.html.erb
new file mode 100644
index 000000000..42ce30113
--- /dev/null
+++ b/app/views/courses/_course_outlines_list.html.erb
@@ -0,0 +1,32 @@
+
+请选择课程大纲
+
+
+ 未搜索到对应大纲,请重新输入
+ <%= form_tag(url_for(:controller=>'courses',:action=>'set_course_outline',:id=>course.id),:method=>'post',:remote=>'true') do %>
+
+
+ <% unless articles.blank? %>
+ <% articles.each do |article|%>
+
+
发布时间:<%= format_date(article.created_at)%>
+ <% end %>
+ <% end %>
+
+
+
+<% end %>
diff --git a/app/views/courses/_join_private_course.html.erb b/app/views/courses/_join_private_course.html.erb
index 4122a7105..d37feeb57 100644
--- a/app/views/courses/_join_private_course.html.erb
+++ b/app/views/courses/_join_private_course.html.erb
@@ -4,33 +4,33 @@
快速进入课程通道
+
+
+
+
+ <%= link_to image_tag(url_to_avatar(@article.author),:width=>50,:height => 50,:alt=>'图像' ),user_path(@article.author) %>
+
+
+ <% if User.current && @article.author.id == User.current.id%>
+
+
+
+
+
+ 重设大纲
+
+
+ <%= link_to(
+ '取消大纲',
+ {:controller => 'blog_comments',:action => 'destroy',:user_id=>BlogComment.find(@course.outline).author_id,:blog_id=>BlogComment.find(@course.outline).blog_id, :id => @course.outline,:course_id=>@course.id},
+ :method => :delete,
+ :data => {:confirm => '确定取消么'},
+ :class => 'postOptionLink'
+ ) if User.current && User.current.id == @article.author.id %>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <%end%>
+
+
+
+
+ <% if @article.try(:author).try(:realname) == ' ' %>
+ <%= link_to @article.try(:author), user_path(@article.author,:host=>Setting.host_user), :class => "linkBlue2", :target=> "_blank" %>
+ <% else %>
+ <%= link_to @article.try(:author).try(:realname), user_path(@article.author,:host=>Setting.host_user), :class => "linkBlue2", :target=> "_blank" %>
+ <% end %>
+
+
<%= format_time( @article.created_on)%>
+
+
+ <%= @article.content.html_safe%>
+
+
+
+ <%#= link_to_attachments_course @topic, :author => false %>
+ <% if @article.attachments.any?%>
+ <% options = {:author => true, :deletable => false} %>
+ <%= render :partial => 'blog_comments/attachments_links', :locals => {:attachments => @article.attachments, :options => options, :is_float => true} %>
+ <% end %>
+
+
+
+
+
+ <% count=0 %>
+ <% if @article.parent %>
+ <% count=@article.parent.children.count%>
+ <% else %>
+ <% count=@article.children.count%>
+ <% end %>
+
+ <% unless count == 0 %>
+
+
+ <%@article.children.reorder('created_on desc').each_with_index do |reply,i| %>
+
+
+
+ <%= link_to image_tag(url_to_avatar(reply.author), :width => 33,:height => 33), user_path(reply.author) %>
+
+
+
+ <% if reply.try(:author).try(:realname) == ' ' %>
+ <%= link_to reply.try(:author), user_path(reply.author_id,:host=>Setting.host_user), :class => "newsBlue mr10 f14" %>
+ <% else %>
+ <%= link_to reply.try(:author).try(:realname), user_path(reply.author_id,:host=>Setting.host_user), :class => "newsBlue mr10 f14" %>
+ <% end %>
+
+
+ <%= reply.content.html_safe%>
+
+
+ <%= format_time(reply.created_on) %>
+
+
+
+
+
+
+ <% end %>
+
+
+ <% end %>
+
+ <% if !@article.locked? && User.current.logged?%>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
<%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(@article.author_id), :alt => "用户头像" %>
+
+
+ <%= form_for 'blog_comment',:url => {:action => 'reply',:controller => 'blog_comments',:user_id=>@article.author.id,:blog_id=>@article.blog_id, :id => @article.id},:method => "post",:html => {:multipart => true, :id => 'message_form'} do |f|%>
+
+
+
+
+
+
+
发送
+
+
+ <% end%>
+
+
+
+
+
+ <% end %>
+
+
\ No newline at end of file
diff --git a/app/views/homework_common/_set_evalutation_att.html.erb b/app/views/homework_common/_set_evalutation_att.html.erb
index 01d9351ee..d51713e9a 100644
--- a/app/views/homework_common/_set_evalutation_att.html.erb
+++ b/app/views/homework_common/_set_evalutation_att.html.erb
@@ -7,7 +7,7 @@
开启匿评
- <%= calendar_for('evaluation_start_time')%>
+ <%#= calendar_for('evaluation_start_time')%>
@@ -18,7 +18,7 @@
关闭匿评
- <%= calendar_for('evaluation_end_time')%>
+ <%#= calendar_for('evaluation_end_time')%>
diff --git a/app/views/homework_common/edit.html.erb b/app/views/homework_common/edit.html.erb
index 5fc11728b..79692207f 100644
--- a/app/views/homework_common/edit.html.erb
+++ b/app/views/homework_common/edit.html.erb
@@ -1,6 +1,7 @@