Merge branch 'develop' of http://repository.trustie.net/xianbo/trustie2 into develop

This commit is contained in:
cxt 2015-12-04 17:29:55 +08:00
commit 8b160b1c38
32 changed files with 355 additions and 102 deletions

View File

@ -374,6 +374,7 @@ class CoursesController < ApplicationController
def settings def settings
if User.current.allowed_to?(:as_teacher,@course) if User.current.allowed_to?(:as_teacher,@course)
@select_tab = params[:tab]
@issue_custom_fields = IssueCustomField.sorted.all @issue_custom_fields = IssueCustomField.sorted.all
@issue_category ||= IssueCategory.new @issue_category ||= IssueCategory.new
@member ||= @course.members.new @member ||= @course.members.new

View File

@ -9,6 +9,10 @@ class ExerciseController < ApplicationController
publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now) publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
publish_exercises.each do |exercise| publish_exercises.each do |exercise|
exercise.update_column('exercise_status', 2) exercise.update_column('exercise_status', 2)
course = exercise.course
course.members.each do |m|
exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
end
end end
end_exercises = Exercise.where("end_time <=? and exercise_status = 2",Time.now) end_exercises = Exercise.where("end_time <=? and exercise_status = 2",Time.now)
end_exercises.each do |exercise| end_exercises.each do |exercise|
@ -35,6 +39,10 @@ class ExerciseController < ApplicationController
publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now) publish_exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
publish_exercises.each do |exercise| publish_exercises.each do |exercise|
exercise.update_column('exercise_status', 2) exercise.update_column('exercise_status', 2)
course = exercise.course
course.members.each do |m|
exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
end
end end
end_exercises = Exercise.where("end_time <=? and exercise_status = 2",Time.now) end_exercises = Exercise.where("end_time <=? and exercise_status = 2",Time.now)
end_exercises.each do |exercise| end_exercises.each do |exercise|
@ -332,6 +340,9 @@ class ExerciseController < ApplicationController
@exercise.exercise_status = 2 @exercise.exercise_status = 2
@exercise.publish_time = Time.now @exercise.publish_time = Time.now
if @exercise.save if @exercise.save
@exercise.course.members.each do |m|
@exercise.course_messages << CourseMessage.create(:user_id =>m.user_id, :course_id => @exercise.course.id, :viewed => false,:status=>2)
end
#redirect_to exercise_index_url(:course_id=> @course.id) #redirect_to exercise_index_url(:course_id=> @course.id)
respond_to do |format| respond_to do |format|
format.js format.js
@ -347,6 +358,7 @@ class ExerciseController < ApplicationController
@exercise.exercise_questions.each do |exercise_question| @exercise.exercise_questions.each do |exercise_question|
exercise_question.exercise_answers.destroy_all exercise_question.exercise_answers.destroy_all
end end
@exercise.course_messages.destroy_all
@exercise.exercise_users.destroy_all @exercise.exercise_users.destroy_all
@exercise.exercise_status = 1 @exercise.exercise_status = 1
@exercise.publish_time = nil @exercise.publish_time = nil
@ -500,6 +512,10 @@ class ExerciseController < ApplicationController
@exercise.update_attributes(:show_result => params[:show_result]) @exercise.update_attributes(:show_result => params[:show_result])
@exercise.update_attributes(:exercise_status => 2) @exercise.update_attributes(:exercise_status => 2)
@exercise.update_attributes(:publish_time => Time.now) @exercise.update_attributes(:publish_time => Time.now)
course = @exercise.course
course.members.each do |m|
@exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
end
redirect_to exercise_url(@exercise) redirect_to exercise_url(@exercise)
return return
elsif @exercise.publish_time > Time.now elsif @exercise.publish_time > Time.now

View File

@ -73,6 +73,7 @@ class MemosController < ApplicationController
end end
end end
#end #end
format.js
format.html { redirect_to back_memo_url, notice: "#{l :label_memo_create_succ}" } format.html { redirect_to back_memo_url, notice: "#{l :label_memo_create_succ}" }
format.json { render json: @memo, status: :created, location: @memo } format.json { render json: @memo, status: :created, location: @memo }
else else
@ -152,6 +153,7 @@ class MemosController < ApplicationController
end end
def update def update
@flag = false
respond_to do |format| respond_to do |format|
if( #@memo.update_column(:subject, params[:memo][:subject]) && if( #@memo.update_column(:subject, params[:memo][:subject]) &&
@memo.update_column(:content, params[:memo][:content]) && @memo.update_column(:content, params[:memo][:content]) &&
@ -159,10 +161,12 @@ class MemosController < ApplicationController
@memo.update_column(:lock, params[:memo][:lock]) && @memo.update_column(:lock, params[:memo][:lock]) &&
@memo.update_column(:subject,params[:memo][:subject])) @memo.update_column(:subject,params[:memo][:subject]))
@memo.save_attachments(params[:attachments] || (params[:memo] && params[:memo][:uploads])) @memo.save_attachments(params[:attachments] || (params[:memo] && params[:memo][:uploads]))
@memo.save @flag = @memo.save
# @memo.root.update_attribute(:updated_at, @memo.updated_at) # @memo.root.update_attribute(:updated_at, @memo.updated_at)
format.js
format.html {redirect_to back_memo_url, notice: "#{l :label_memo_create_succ}"} format.html {redirect_to back_memo_url, notice: "#{l :label_memo_create_succ}"}
else else
format.js
format.html { render action: "edit" } format.html { render action: "edit" }
format.json { render json: @person.errors, status: :unprocessable_entity } format.json { render json: @person.errors, status: :unprocessable_entity }
end end

View File

@ -64,32 +64,53 @@ class RepositoriesController < ApplicationController
end end
def forked def forked
# 被forked的标识如果不满足单个用户唯一性则不执行fork # 如果当前用户已经fork过该项目不会新fork项目则跳至已fork的项
if is_sigle_identifier?(User.current, @repository.identifier) unless has_forked?(@project, User.current)
# REDO: 那些人有权限forked项目 project = project_from_current_project(@project.id, User.current.id)
g = Gitlab.client redirect_to project_path(project)
gproject = g.post ("/projects/fork/#{@project.gpid}?user_id=#{User.current.gid}")
if gproject
copy_project(@project, gproject)
end
else else
flash[:notice] = l(:project_gitlab_fork_double_message) # 单个用户只能拥有一个名字一样的版本库否则不能fork
redirect_to settings_project_url(@project, :tab => 'repositories') # if is_sigle_identifier?(User.current, @repository.identifier)
# REDO: 那些人有权限forked项目
g = Gitlab.client
gproject = g.fork(@project.gpid, User.current.gid)
if gproject
copy_project(@project, gproject)
forked_count = @project.forked_count.to_i + 1
@project.update_attributes(:forked_count => forked_count)
end
# else
# flash[:notice] = l(:project_gitlab_fork_double_message)
# redirect_to settings_project_url(@project, :tab => 'repositories')
# end
end end
end
# 判断用户是否已经fork过该项目
def has_forked?(project, user)
projects = Project.where("user_id =?", user)
projects.map(&:forked_from_project_id).detect{|s| s == @project.id}.nil? ? true : false
end
# 获取当前用户fork过的项目
def project_from_current_project(project, user)
project = Project.where("user_id =? and forked_from_project_id =?",user, project).first
end end
# copy a project for fork # copy a project for fork
def copy_project(project, gproject) def copy_project(tproject, gproject)
project = Project.new project = Project.new
project.name = @project.name project.name = tproject.name
project.is_public = @project.is_public project.is_public = tproject.is_public
project.status = @project.status project.status = tproject.status
project.description = @project.description project.description = tproject.description
project.hidden_repo = @project.hidden_repo project.hidden_repo = tproject.hidden_repo
project.user_id = User.current.id project.user_id = User.current.id
project.project_type = 0 project.project_type = 0
project.project_new_type = @project.project_new_type project.project_new_type = tproject.project_new_type
project.gpid = gproject.id project.gpid = gproject.id
project.forked_from_project_id = tproject.id
if project.save if project.save
r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
m = Member.new(:user => User.current, :roles => [r]) m = Member.new(:user => User.current, :roles => [r])
@ -124,16 +145,16 @@ class RepositoriesController < ApplicationController
def copy_repository(project, gproject) def copy_repository(project, gproject)
# 避免 # 避免
if is_sigle_identifier?(project.user_id, gproject.name) # if is_sigle_identifier?(project.user_id, gproject.name)
repository = Repository.factory('Git') repository = Repository.factory('Git')
repository.project_id = project.id repository.project_id = project.id
repository.type = 'Repository::Gitlab' repository.type = 'Repository::Gitlab'
repository.url = gproject.name repository.url = gproject.name
repository.identifier = gproject.name repository.identifier = gproject.name
repository = repository.save repository = repository.save
else # else
flash[:notice] = l(:project_gitlab_create_double_message) # flash[:notice] = l(:project_gitlab_create_double_message)
end # end
end end
def newrepo def newrepo

View File

@ -92,7 +92,7 @@ class UsersController < ApplicationController
end end
# 用户消息 # 用户消息
# 说明: homework 发布作业message讨论区 news新闻 poll问卷works_reviewers作品评阅works_reply:作品回复 # 说明: homework 发布作业message讨论区 news新闻 poll问卷works_reviewers作品评阅works_reply:作品回复,exercise:课程测验
# issue问题journal缺陷状态更新 forum公共贴吧: user_feedback: 用户留言; new_reply:新闻回复comment # issue问题journal缺陷状态更新 forum公共贴吧: user_feedback: 用户留言; new_reply:新闻回复comment
def user_messages def user_messages
if !User.current.logged? if !User.current.logged?
@ -128,7 +128,7 @@ class UsersController < ApplicationController
#课程相关消息 #课程相关消息
when 'homework' when 'homework'
@message_alls = CourseMessage.where("course_message_type in ('HomeworkCommon','StudentWorksScore','JournalsForMessage','StudentWork') and user_id =?", @user).order("created_at desc") @message_alls = CourseMessage.where("course_message_type in ('HomeworkCommon','StudentWorksScore','JournalsForMessage','StudentWork','Exercise') and user_id =?", @user).order("created_at desc")
when 'course_message' when 'course_message'
@message_alls = CourseMessage.where("course_message_type =? and user_id =?", "Message", @user).order("created_at desc") @message_alls = CourseMessage.where("course_message_type =? and user_id =?", "Message", @user).order("created_at desc")
when 'course_news' when 'course_news'
@ -1429,6 +1429,7 @@ class UsersController < ApplicationController
@course = @user.courses @course = @user.courses
.select { |course| @user.allowed_to?(:as_teacher,course)} .select { |course| @user.allowed_to?(:as_teacher,course)}
end end
@search = params[:search]
#这里仅仅是传递需要发送的资源id #这里仅仅是传递需要发送的资源id
@send_id = params[:send_id] @send_id = params[:send_id]
@send_ids = params[:checkbox1] || params[:send_ids] @send_ids = params[:checkbox1] || params[:send_ids]
@ -1445,6 +1446,7 @@ class UsersController < ApplicationController
else else
@projects = @user.projects @projects = @user.projects
end end
@search = params[:search]
#这里仅仅是传递需要发送的资源id #这里仅仅是传递需要发送的资源id
@send_id = params[:send_id] @send_id = params[:send_id]
@send_ids = params[:checkbox1] || params[:send_ids] #搜索的时候 和 直接 用表格提交的时候的send_ids @send_ids = params[:checkbox1] || params[:send_ids] #搜索的时候 和 直接 用表格提交的时候的send_ids

View File

@ -6,4 +6,18 @@ class Exercise < ActiveRecord::Base
has_many :exercise_questions, :dependent => :destroy,:order => "#{ExerciseQuestion.table_name}.question_number" has_many :exercise_questions, :dependent => :destroy,:order => "#{ExerciseQuestion.table_name}.question_number"
has_many :exercise_users, :dependent => :destroy has_many :exercise_users, :dependent => :destroy
has_many :users, :through => :exercise_users #该测试被哪些用户提交答案过 has_many :users, :through => :exercise_users #该测试被哪些用户提交答案过
# 课程消息
has_many :course_messages, :class_name =>'CourseMessage', :as => :course_message, :dependent => :destroy
after_create :acts_as_course_message
def acts_as_course_message
if self.course
if self.exercise_status == 2 #未发布
#self.course.members.each do |m|
self.course_messages << CourseMessage.create(:user_id => User.current.id, :course_id => self.course_id, :viewed => false,:status=>2)
#end
# else
# self.course_messages.destroy_all 这里的destory_all值得商榷。因为我这里是通过status来控制不同的status的
end
end
end
end end

View File

@ -1,5 +1,10 @@
<div class="project_r_h"> <div class="project_r_h">
<h2 class="project_h2"><%= @subPage_title%></h2> <h2 class="project_h2 fl"><%= @subPage_title%></h2>
<% if User.current.allowed_to?(:as_teacher,@course) %>
<span class="fr f14 fontGrey2" style="height: 40px; line-height: 40px; margin-right: 15px;">
<%=link_to "修改角色", :controller => 'courses', :action => 'settings', :id => @course.id, :tab=>'member' %>
</span>
<% end %>
</div> </div>
<% if @subPage_title == l(:label_student_list)%> <% if @subPage_title == l(:label_student_list)%>
<%= render :partial => 'course_student', :locals => {:members => @members} %> <%= render :partial => 'course_student', :locals => {:members => @members} %>

View File

@ -1,6 +1,13 @@
<div class="project_r_h"> <div class="project_r_h">
<h2 class="project_h2"><%= l(:label_course_modify_settings)%></h2> <h2 class="project_h2"><%= l(:label_course_modify_settings)%></h2>
</div> </div>
<script>
$(function(){
<% if @select_tab == 'member'%>
$("#tb_2").click();
<% end %>
})
</script>
<div class="hwork_new"> <div class="hwork_new">
<div id="tb_" class="hwork_tb_"> <div id="tb_" class="hwork_tb_">
<ul> <ul>

View File

@ -16,7 +16,7 @@
<div class="postDetailCreater">最后回复:<a href="<%= user_path(author) %>" class="linkBlue2" target="_blank"><%= author.name%></a></div> <div class="postDetailCreater">最后回复:<a href="<%= user_path(author) %>" class="linkBlue2" target="_blank"><%= author.name%></a></div>
<div class="postDetailDate"><%= format_date(topic.last_reply.created_at)%></div> <div class="postDetailDate"><%= format_date(topic.last_reply.created_at)%></div>
<% end%> <% end%>
<span class=" fr" style="color: #888888; font-size: 12px;">更新时间:<%= format_date(topic.updated_at)%></span>
</div> </div>
<div class="postDetailReply"> <div class="postDetailReply">
<a href="<%= forum_memo_path(topic.forum, topic)%>" class="postReplyIcon mr5" target="_blank"></a> <a href="<%= forum_memo_path(topic.forum, topic)%>" class="postReplyIcon mr5" target="_blank"></a>

View File

@ -3,7 +3,7 @@
<div class="postRightContainer"> <div class="postRightContainer">
<div id="create_memo_div" style="display: none"> <div id="create_memo_div" style="display: none">
<div id="error" class="red fl mb10" style="display: none">error</div> <div id="error" class="red fl mb10" style="display: none">error</div>
<%= labelled_form_for(@memo, :url => forum_memos_path(@forum)) do |f| %> <%= labelled_form_for(@memo, :url => forum_memos_path(@forum),:remote=>true) do |f| %>
<div> <div>
<textarea type="text" name="memo[subject]" id="memo_subject" maxlength="50" onblur="check_memo_name();" onfocus="$('#error').hide();" onmouseover="this.style.borderColor='#d9d9d9'" class="postDetailInput" placeholder="输入帖子标题" ></textarea> <textarea type="text" name="memo[subject]" id="memo_subject" maxlength="50" onblur="check_memo_name();" onfocus="$('#error').hide();" onmouseover="this.style.borderColor='#d9d9d9'" class="postDetailInput" placeholder="输入帖子标题" ></textarea>
<script> <script>
@ -112,7 +112,21 @@
} }
if($("textarea[name='memo[subject]']").val().trim() != "" && !memo_content.isEmpty() ){ if($("textarea[name='memo[subject]']").val().trim() != "" && !memo_content.isEmpty() ){
memo_content.sync(); memo_content.sync();
$("#new_memo").submit(); $.ajax({
url:'/forums/'+'<%= @forum.id.to_s%>'+'/memos',
type:'post',
data:{
'memo[content]':$("#memo_content").val(),
'memo[subject]':$("#memo_subject").val()
},
success:function(data){
},
error:function(){
alert('请检查当前网络连接')
}
});
//$("#new_memo").submit();
}else if($("textarea[name='memo[subject]']").val().trim() == "" && memo_content.isEmpty()){ }else if($("textarea[name='memo[subject]']").val().trim() == "" && memo_content.isEmpty()){
$("#error").html("主题和内容不能为空").show(); $("#error").html("主题和内容不能为空").show();
} }

View File

@ -7,5 +7,5 @@
remote: data-remote remote: data-remote
-%> -%>
<li> <li>
<%= link_to_unless current_page.last?, t('views.pagination.next').html_safe, url, :rel => 'next', :remote => remote, :class => "next c_blue" %> <%= link_to_unless false, t('views.pagination.next').html_safe, url, :rel => 'next', :remote => remote, :class => "next c_blue" %>
</li> </li>

View File

@ -208,7 +208,7 @@
<div class="cl"></div> <div class="cl"></div>
<% unless contributor_course_scor(@course.id).count == 0 %> <% unless contributor_course_scor(@course.id).count == 0 %>
<ul class="rankList"> <ul class="rankList">
<h4>课程贡献榜</h4> <h4>课程活跃度</h4>
<% contributor_course_scor(@course.id).each do |contributor_score| %> <% contributor_course_scor(@course.id).each do |contributor_score| %>
<% unless contributor_score.total_score ==0 %> <% unless contributor_score.total_score ==0 %>
<li> <a href="javascript:void:(0);"><%=link_to image_tag(url_to_avatar(contributor_score.user), :width => "35", :height => "35", :class=> "rankPortrait"),user_path(contributor_score.user) %></a> <li> <a href="javascript:void:(0);"><%=link_to image_tag(url_to_avatar(contributor_score.user), :width => "35", :height => "35", :class=> "rankPortrait"),user_path(contributor_score.user) %></a>

View File

@ -9,7 +9,7 @@
<%= favicon %> <%= favicon %>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','application','prettify', 'nyan','leftside', :media => 'all' %> <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','application','prettify', 'nyan','leftside', :media => 'all' %>
<%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %> <%= stylesheet_link_tag 'rtl', :media => 'all' if l(:direction) == 'rtl' %>
<%= javascript_heads %> <%= javascript_include_tag('jquery-1.8.3-ui-1.9.2-ujs-2.0.3', 'application', 'jquery.colorbox-min') %>
<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' ,'prettify' %> <%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' ,'prettify' %>
<%= heads_for_theme %> <%= heads_for_theme %>
@ -241,7 +241,8 @@
</div> </div>
</div> </div>
</div> </div>
<div id="ajax-indicator" style="display:none;"><span><%= l(:label_loading) %></span></div>
<div id="ajax-modal" style="display:none;"></div>
<div class="cl"></div> <div class="cl"></div>
<%= render :partial => 'layouts/footer' %> <%= render :partial => 'layouts/footer' %>
<div class="cl"></div> <div class="cl"></div>

View File

@ -0,0 +1 @@
window.location.href='<%= forum_memo_path(:forum_id=>@memo.forum_id,:id=>@memo.id ) %>'

View File

@ -13,7 +13,21 @@
return false; return false;
} }
memo_content.sync(); memo_content.sync();
$("#edit_memo").submit(); $.ajax({
url:' /forums/'+'<%= @memo.forum_id.to_s %>'+'/memos/<%= @memo.id.to_s%>',
type:'put',
data:{
'memo[subject]':$("#memo_subject").val(),
'memo[content]':$("#memo_content").val()
},
success:function(data){
},
error:function(){
alert('请检查当前网络连接')
}
});
//$("#edit_memo").submit();
}else if($("textarea[name='memo[subject]']").val().trim() == "" && !memo_content.isEmpty() ){ }else if($("textarea[name='memo[subject]']").val().trim() == "" && !memo_content.isEmpty() ){
$("#error").html("主题不能为空").show(); $("#error").html("主题不能为空").show();
}else if($("textarea[name='memo[subject]']").val().trim() != "" && memo_content.isEmpty()){ }else if($("textarea[name='memo[subject]']").val().trim() != "" && memo_content.isEmpty()){

View File

@ -79,6 +79,8 @@
<%= render :partial => 'attachments_links', :locals => {:attachments => @memo.attachments, :options => options, :is_float => true} %> <%= render :partial => 'attachments_links', :locals => {:attachments => @memo.attachments, :options => options, :is_float => true} %>
<% end %> <% end %>
</div> </div>
<div class="cl"></div>
<span class=" fr" style="color: #888888; font-size: 12px;">更新时间:<%= format_date(@memo.updated_at)%></span>
</div> </div>
<div class="cl"></div> <div class="cl"></div>
</div> </div>

View File

@ -0,0 +1,5 @@
<% if @flag%>
window.location.href='<%= forum_memo_path(:forum_id=>@memo.forum_id,:id=>@memo.id ) %>'
<%else%>
$("#error").html('内容填写存在错误');
<% end %>

View File

@ -15,7 +15,7 @@
版本库地址:<%= @repos_url %> 版本库地址:<%= @repos_url %>
<% else %> <% else %>
版本库地址:<%= h @repository.url %> 版本库地址:<%= h @repository.url %>
<% end %> <% end %>-
<!-- added by bai --> <!-- added by bai -->
<div class="cl"></div> <div class="cl"></div>
</div> </div>
@ -25,8 +25,10 @@
<textarea id="copy_rep_content" class="cloneUrl mt5 fl" type="input" placeholder="http://xianbo_trustie2@repository.trustie.net/xianbo/trustie2.git"><%=@repository.type.to_s=="Repository::Gitlab" ? @repos_url.to_s.lstrip : @repository.url %></textarea> <textarea id="copy_rep_content" class="cloneUrl mt5 fl" type="input" placeholder="http://xianbo_trustie2@repository.trustie.net/xianbo/trustie2.git"><%=@repository.type.to_s=="Repository::Gitlab" ? @repos_url.to_s.lstrip : @repository.url %></textarea>
<a href="javascript:void(0);" class="clone_btn mt5" onclick="jsCopy()"><span class="vl_copy" title="点击复制版本库地址"></span></a> <a href="javascript:void(0);" class="clone_btn mt5" onclick="jsCopy()"><span class="vl_copy" title="点击复制版本库地址"></span></a>
<div class="fl mt5 ml15"><a href="javascript:void(0);" class="vl_btn fb" onclick="zip()"><span class="vl_zip"></span>ZIP</a> </div> <div class="fl mt5 ml15"><a href="javascript:void(0);" class="vl_btn fb" onclick="zip()"><span class="vl_zip"></span>ZIP</a> </div>
<div class="fr mt5"><a href="javascript:void(0);" class="vl_btn fb" onclick="zip()"><span class="vl_fork"></span>Fork</a> <span href="javascript:void(0);" class="vl_btn_2 fb">0</span> </div> <!--<div class="fr mt5"><a href="javascript:void(0);" class="vl_btn fb" onclick="zip()"><span class="vl_fork"></span>Fork</a> <span href="javascript:void(0);" class="vl_btn_2 fb">0</span> </div>-->
<!--<div class="fr mt5"><a href="javascript:void(0);" class="vl_btn fb" onclick="zip()"><span class="vl_fork"></span><%= link_to "Fork", :controller => 'repositories', :action => 'forked' %></a> <span href="javascript:void(0);" class="vl_btn_2 fb">0</span> </div>-->
<div class="fr mt5"><span class="vl_fork"></span><%= link_to "Fork", :controller => 'repositories', :action => 'forked'%>
<span href="javascript:void(0);" class="vl_btn_2 fb"><%= @project.forked_count.to_i %></span> </div>
<div class="cl"></div> <div class="cl"></div>
<div class="recordBanner mt10"> <div class="recordBanner mt10">
<% if @changesets && !@changesets.empty? %> <% if @changesets && !@changesets.empty? %>

View File

@ -17,7 +17,10 @@
:remote=>true,:id=>'search_user_project_form',:class=>'resourcesSearchBox' do %> :remote=>true,:id=>'search_user_project_form',:class=>'resourcesSearchBox' do %>
<%= hidden_field_tag(:send_id, send_id) %> <%= hidden_field_tag(:send_id, send_id) %>
<%= hidden_field_tag(:send_ids, send_ids) %> <%= hidden_field_tag(:send_ids, send_ids) %>
<input type="text" name="search" placeholder="输入项目ID或者名称搜索" class="searchResourcePopup" /> <input type="text" id="search_project_input" value="<%= @search %>" name="search" placeholder="输入项目ID或者名称搜索" class="searchResourcePopup" />
<script>
observeSearchfieldOnInput('search_project_input','<%= search_user_project_user_path(user)%>','<%= send_id %>','<%= send_ids%>')
</script>
<!--<a href="javascript:void(0);" class="searchIconPopup"></a>--> <!--<a href="javascript:void(0);" class="searchIconPopup"></a>-->
<%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %> <%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %>
<% end %> <% end %>

View File

@ -17,7 +17,10 @@
:remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %> :remote=>true,:id=>'search_user_course_form',:class=>'resourcesSearchBox' do %>
<%= hidden_field_tag(:send_id, send_id) %> <%= hidden_field_tag(:send_id, send_id) %>
<%= hidden_field_tag(:send_ids, send_ids) %> <%= hidden_field_tag(:send_ids, send_ids) %>
<input type="text" name="search" placeholder="输入课程ID或者名称搜索" class="searchResourcePopup" /> <input type="text" id="search_course_input" value="<%= @search %>" name="search" placeholder="输入课程ID或者名称搜索" class="searchResourcePopup" />
<script>
observeSearchfieldOnInput('search_course_input','<%= search_user_course_user_path(user)%>','<%= send_id %>','<%= send_ids%>')
</script>
<!--<a href="javascript:void(0);" class="searchIconPopup"></a>--> <!--<a href="javascript:void(0);" class="searchIconPopup"></a>-->
<%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %> <%= submit_tag '',:class=>'searchIconPopup',:onfocus=>"this.blur();",:style=>'border-style:none' %>
<% end %> <% end %>

View File

@ -579,7 +579,7 @@
</ul> </ul>
<% end %> <% end %>
<!-被老师移出课程--> <!--被老师移出课程-->
<% if ma.course_message_type == "RemoveFromCourse" %> <% if ma.course_message_type == "RemoveFromCourse" %>
<ul class="homepageNewsList fl"> <ul class="homepageNewsList fl">
<li class="homepageNewsPortrait fl"> <li class="homepageNewsPortrait fl">
@ -612,4 +612,74 @@
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li> <li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
</ul> </ul>
<% end %> <% end %>
<!--老师发布测验 发给学生看-->
<% if ma.course_message_type == "Exercise" && ma.status == 2 %>
<ul class="homepageNewsList fl">
<li class="homepageNewsPortrait fl"><a href="javascript:void(0);"><%=link_to image_tag(url_to_avatar(ma.course_message.user), :width => "30", :height => "30"), user_path(ma.course_message.user) %></a></li>
<li class="homepageNewsPubType fl">
<span><%=link_to ma.course_message.user.lastname + ma.course_message.user.firstname + "老师",
user_path(ma.course_message.user), :class => "newsBlue homepageNewsPublisher" %></span><span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl":"homepageNewsType fl" %>">发布了课程测验 </span></li>
<li class="homepageNewsContent fl">
<%= link_to "测验题目:" + ma.course_message.exercise_name, exercise_path(:id => ma.course_message.id), :class =>"#{ma.viewed == 0 ? "newsBlack" : "newsGrey"}",
:onmouseover =>"message_titile_show($(this),event)",
:onmouseout => "message_titile_hide($(this))"%>
</li>
<div style="display: none" class="message_title_red system_message_style">
<p>
<%= User.current.lastname + User.current.firstname %><%= User.current.allowed_to?(:as_teacher,ma.course_message.course) ? '老师':'同学'%>您好!
<%= User.current.eql?(ma.course_message.user)?"您":(ma.course_message.user.lastname + ma.course_message.user.firstname+"老师") %>发布了课程测验 ,测验详情如下:
</p>
<ul class="ul_normal_color">
<li>课程名称:<%= ma.course_message.course.name %>(<%= ma.course_message.course.time.to_s + '年'+ ma.course_message.course.term %>)</li>
<li>测验标题:<%= ma.course_message.exercise_name %></li>
<!--<li>测验描述:<%#= ma.course_message.exercise_description %></li>-->
<!--<li>测验状态:<%#= ma.course_message.exercise_status == 1 ? '未发布':'已发布'%></li>-->
<!--<%# if ma.course_message.publish_time %>-->
<!--<li>发布时间:<%#= ma.course_message.publish_time.to_s.gsub("+0800","").to_datetime.strftime("%Y-%m-%d %H:%M:%S") %></li>-->
<!--<%# end %>-->
<li>截止时间:<%= ma.course_message.end_time.to_s.gsub("+0800","").to_datetime.strftime("%Y-%m-%d %H:%M:%S") %></li>
<li>答题时长:<%= ma.course_message.time == -1 ? '不限时' : ma.course_message.time.to_s + '分钟' %></li>
<% if !User.current.allowed_to?(:as_teacher,ma.course_message.course)%>
<p>请记得在截止时间前完成测验噢,辛苦啦!</p>
<% end %>
</ul>
</div>
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
</ul>
<% end %>
<% if ma.course_message_type == "Exercise" && ma.status == 3 %>
<ul class="homepageNewsList fl">
<li class="homepageNewsPortrait fl"><a href="javascript:void(0);"><%=link_to image_tag(url_to_avatar(ma.course_message.user), :width => "30", :height => "30"), user_path(ma.course_message.user) %></a></li>
<li class="homepageNewsPubType fl">
<span> <%=link_to ma.course_message.user.lastname + ma.course_message.user.firstname + "老师",
user_path(ma.course_message.user), :class => "newsBlue homepageNewsPublisher" %></span><span class="<%= ma.viewed == 0 ? "homepageNewsTypeNotRead fl":"homepageNewsType fl" %>">发布的测验:</span></li>
<li class="homepageHomeworkContent fl">
<%= link_to "测验题目:" + ma.course_message.exercise_name, exercise_path(:id => ma.course_message.id), :class =>"#{ma.viewed == 0 ? "newsBlack" : "newsGrey"}",
:onmouseover =>"message_titile_show($(this),event)",
:onmouseout => "message_titile_hide($(this))"%>
</li>
<div style="display: none" class="message_title_red system_message_style">
<p>
<%= User.current.lastname + User.current.firstname %><%= User.current.allowed_to?(:as_teacher,ma.course_message.course) ? '老师':'同学'%>您好!
<%= User.current.eql?(ma.course_message.user)?"您":(ma.course_message.user.lastname + ma.course_message.user.firstname+"老师") %>发布的课程测验截止时间快到了,测验详情如下:
</p>
<ul class="ul_normal_color">
<li>课程名称:<%= ma.course_message.course.name %>(<%= ma.course_message.course.time.to_s + '年'+ ma.course_message.course.term %>)</li>
<li>测验标题:<%= ma.course_message.exercise_name %></li>
<li>截止时间:<%= ma.course_message.end_time.to_s.gsub("+0800","").to_datetime.strftime("%Y-%m-%d %H:%M:%S") %></li>
<li>答题时长:<%= ma.course_message.time == -1 ? '无限制' : ma.course_message.time.to_s + '分钟' %></li>
<p>请及时完成课程测验,辛苦啦!</p>
</ul>
</div>
<li class="homepageHomeworkContentWarn fl">截止时间快到啦 </li>
<li class="homepageNewsTime fl"><%= time_tag(ma.created_at).html_safe %> </li>
</ul>
<% end %>
<% end %> <% end %>

View File

@ -5,5 +5,6 @@ $("#res_count").html(0);
$("#checkboxAll").attr('checked',false); $("#checkboxAll").attr('checked',false);
$("#res_all_count").html(<%= @atta_count%>); $("#res_all_count").html(<%= @atta_count%>);
closePopUp(); closePopUp();
alert("发送成功")
<% else%> <% else%>
<% end %> <% end %>

View File

@ -5,5 +5,6 @@ $("#res_count").html(0);
$("#checkboxAll").attr('checked',false); $("#checkboxAll").attr('checked',false);
$("#res_all_count").html(<%= @atta_count%>); $("#res_all_count").html(<%= @atta_count%>);
closePopUp(); closePopUp();
alert("发送成功")
<% else%> <% else%>
<% end %> <% end %>

View File

@ -143,7 +143,7 @@
//资源名称的链接 //资源名称的链接
var res_link; var res_link;
var id; //资源id var id; //资源id
var sendType; //发送到课程 1 发送到项目 2 var sendType = '1'; //发送到课程 1 发送到项目 2
var lastSendType; //保存上次发送的发送类型 var lastSendType; //保存上次发送的发送类型
$("#resources_list").mousedown(function(e) { $("#resources_list").mousedown(function(e) {
//如果是右键的话 //如果是右键的话
@ -309,15 +309,15 @@
document.oncontextmenu = function() {return true;} document.oncontextmenu = function() {return true;}
line.children().css("background-color",'white'); line.children().css("background-color",'white');
id = line.children().last().html(); id = line.children().last().html();
if (lastSendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 if (lastSendType === '2'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。
$.ajax({ $.ajax({
type: 'get', type: 'get',
url: '<%= search_user_course_user_path(@user)%>' + '?send_id=' + id url: '<%= search_user_project_user_path(@user)%>' + '?send_id=' + id
}); });
}else{ }else{
$.ajax({ $.ajax({
type: 'get', type: 'get',
url: '<%= search_user_project_user_path(@user)%>' + '?send_id=' + id url: '<%= search_user_course_user_path(@user)%>' + '?send_id=' + id
}); });
} }
} }
@ -327,16 +327,17 @@
alert('暂时不支持多页选择,您当前页没有选择任何资源'); alert('暂时不支持多页选择,您当前页没有选择任何资源');
return ; return ;
} }
if (lastSendType === '1'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。 if (lastSendType === '2'){ //如果已经发送过一次了,那么就应该沿用上次发送的类型。
$.ajax({
type: 'get',
url: '<%= search_user_course_user_path(@user)%>' + '?'+ $("#resources_list_form").serialize()
});
}else{
$.ajax({ $.ajax({
type: 'get', type: 'get',
url: '<%= search_user_project_user_path(@user)%>' + '?' + $("#resources_list_form").serialize() url: '<%= search_user_project_user_path(@user)%>' + '?' + $("#resources_list_form").serialize()
}); });
}else{
$.ajax({
type: 'get',
url: '<%= search_user_course_user_path(@user)%>' + '?'+ $("#resources_list_form").serialize()
});
} }
} }
@ -480,5 +481,36 @@
lastSendType = sendType; lastSendType = sendType;
} }
function observeSearchfieldOnInput(fieldId, url,send_id,send_ids) {
$('#'+fieldId).each(function() {
var $this = $(this);
$this.addClass('autocomplete');
$this.attr('data-value-was', $this.val());
var check = function() {
var val = $this.val();
if ($this.attr('data-value-was') != val){
$this.attr('data-value-was', val);
$.ajax({
url: url,
type: 'get',
data: {search: $this.val(),send_id:send_id,send_ids:send_ids},
success: function(data){ },
beforeSend: function(){ $this.addClass('ajax-loading'); },
complete: function(){ $this.removeClass('ajax-loading'); }
});
}
};
var reset = function() {
if (timer) {
clearInterval(timer);
timer = setInterval(check, 300);
}
};
var timer = setInterval(check, 300);
$this.bind('keyup click mousemove', reset);
});
}
</script> </script>

View File

@ -0,0 +1,5 @@
class AddForkedFromProjectIdToProjects < ActiveRecord::Migration
def change
add_column :projects, :forked_from_project_id, :integer
end
end

View File

@ -0,0 +1,5 @@
class AddForkedCountToProjects < ActiveRecord::Migration
def change
add_column :projects, :forked_count, :integer
end
end

View File

@ -11,7 +11,7 @@
# #
# It's strongly recommended to check this file into your version control system. # It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20151203030635) do ActiveRecord::Schema.define(:version => 20151204062220) do
create_table "activities", :force => true do |t| create_table "activities", :force => true do |t|
t.integer "act_id", :null => false t.integer "act_id", :null => false
@ -543,26 +543,23 @@ ActiveRecord::Schema.define(:version => 20151203030635) do
add_index "documents", ["created_on"], :name => "index_documents_on_created_on" add_index "documents", ["created_on"], :name => "index_documents_on_created_on"
add_index "documents", ["project_id"], :name => "documents_project_id" add_index "documents", ["project_id"], :name => "documents_project_id"
create_table "dts", :primary_key => "Num", :force => true do |t| create_table "dts", :force => true do |t|
t.string "Defect", :limit => 50 t.string "IPLineCode"
t.string "Category", :limit => 50
t.string "File"
t.string "Method"
t.string "Module", :limit => 20
t.string "Variable", :limit => 50
t.integer "StartLine"
t.integer "IPLine"
t.string "IPLineCode", :limit => 200
t.string "Judge", :limit => 15
t.integer "Review", :limit => 1
t.string "Description" t.string "Description"
t.text "PreConditions", :limit => 2147483647 t.string "Num"
t.text "TraceInfo", :limit => 2147483647 t.string "Variable"
t.text "Code", :limit => 2147483647 t.string "TraceInfo"
t.string "Method"
t.string "File"
t.string "IPLine"
t.string "Review"
t.string "Category"
t.string "Defect"
t.string "PreConditions"
t.string "StartLine"
t.integer "project_id" t.integer "project_id"
t.datetime "created_at" t.datetime "created_at", :null => false
t.datetime "updated_at" t.datetime "updated_at", :null => false
t.integer "id", :null => false
end end
create_table "enabled_modules", :force => true do |t| create_table "enabled_modules", :force => true do |t|
@ -738,17 +735,6 @@ ActiveRecord::Schema.define(:version => 20151203030635) do
add_index "homework_commons", ["course_id", "id"], :name => "index_homework_commons_on_course_id_and_id" add_index "homework_commons", ["course_id", "id"], :name => "index_homework_commons_on_course_id_and_id"
create_table "homework_detail_groups", :force => true do |t|
t.integer "homework_common_id"
t.integer "min_num"
t.integer "max_num"
t.integer "base_on_project"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
add_index "homework_detail_groups", ["homework_common_id"], :name => "index_homework_detail_groups_on_homework_common_id"
create_table "homework_detail_manuals", :force => true do |t| create_table "homework_detail_manuals", :force => true do |t|
t.float "ta_proportion" t.float "ta_proportion"
t.integer "comment_status" t.integer "comment_status"
@ -905,6 +891,16 @@ ActiveRecord::Schema.define(:version => 20151203030635) do
add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id"
create_table "journal_details_copy", :force => true do |t|
t.integer "journal_id", :default => 0, :null => false
t.string "property", :limit => 30, :default => "", :null => false
t.string "prop_key", :limit => 30, :default => "", :null => false
t.text "old_value"
t.text "value"
end
add_index "journal_details_copy", ["journal_id"], :name => "journal_details_journal_id"
create_table "journal_replies", :id => false, :force => true do |t| create_table "journal_replies", :id => false, :force => true do |t|
t.integer "journal_id" t.integer "journal_id"
t.integer "user_id" t.integer "user_id"
@ -974,6 +970,7 @@ ActiveRecord::Schema.define(:version => 20151203030635) do
t.integer "course_group_id", :default => 0 t.integer "course_group_id", :default => 0
end end
add_index "members", ["course_id"], :name => "index_members_on_course_id"
add_index "members", ["project_id"], :name => "index_members_on_project_id" add_index "members", ["project_id"], :name => "index_members_on_project_id"
add_index "members", ["user_id", "project_id", "course_id"], :name => "index_members_on_user_id_and_project_id", :unique => true add_index "members", ["user_id", "project_id", "course_id"], :name => "index_members_on_user_id_and_project_id", :unique => true
add_index "members", ["user_id"], :name => "index_members_on_user_id" add_index "members", ["user_id"], :name => "index_members_on_user_id"
@ -1307,27 +1304,29 @@ ActiveRecord::Schema.define(:version => 20151203030635) do
end end
create_table "projects", :force => true do |t| create_table "projects", :force => true do |t|
t.string "name", :default => "", :null => false t.string "name", :default => "", :null => false
t.text "description" t.text "description"
t.string "homepage", :default => "" t.string "homepage", :default => ""
t.boolean "is_public", :default => true, :null => false t.boolean "is_public", :default => true, :null => false
t.integer "parent_id" t.integer "parent_id"
t.datetime "created_on" t.datetime "created_on"
t.datetime "updated_on" t.datetime "updated_on"
t.string "identifier" t.string "identifier"
t.integer "status", :default => 1, :null => false t.integer "status", :default => 1, :null => false
t.integer "lft" t.integer "lft"
t.integer "rgt" t.integer "rgt"
t.boolean "inherit_members", :default => false, :null => false t.boolean "inherit_members", :default => false, :null => false
t.integer "project_type" t.integer "project_type"
t.boolean "hidden_repo", :default => false, :null => false t.boolean "hidden_repo", :default => false, :null => false
t.integer "attachmenttype", :default => 1 t.integer "attachmenttype", :default => 1
t.integer "user_id" t.integer "user_id"
t.integer "dts_test", :default => 0 t.integer "dts_test", :default => 0
t.string "enterprise_name" t.string "enterprise_name"
t.integer "organization_id" t.integer "organization_id"
t.integer "project_new_type" t.integer "project_new_type"
t.integer "gpid" t.integer "gpid"
t.integer "forked_from_project_id"
t.integer "forked_count"
end end
add_index "projects", ["lft"], :name => "index_projects_on_lft" add_index "projects", ["lft"], :name => "index_projects_on_lft"

View File

@ -241,8 +241,9 @@ class Gitlab::Client
# Forks a project into the user namespace of the authenticated user. # Forks a project into the user namespace of the authenticated user.
# @param [Integer] - The ID of the project to be forked # @param [Integer] - The ID of the project to be forked
def fork(id) def fork(gpid, gid)
post("/projects/fork/#{id}") post ("/projects/fork/#{gpid}?user_id=#{gid}")
# post("/projects/fork/#{id}")
end end
# Mark this project as forked from the other # Mark this project as forked from the other

View File

@ -0,0 +1,21 @@
#coding=utf-8
#需要在0点以后执行
namespace :exercise_deadline_warn do
desc "exercise deadline warn"
task :deadline_warn => :environment do
#exercise_status 1 未发布 2 已发布 3已截止
exercises = Exercise.where("exercise_status = 2 and date_format(end_time,'%Y-%m-%d')= '#{Date.today}'") #截止日期都是当天 23.59分,所以年月日相等的一定是今晚会截止的测验
exercises.each do |exercise|
course = exercise.course
course.members.each do |m|
#CourseMessage status 1 未发布 status 2 已发布 status 3 已发布快截止了
exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 3) unless m.user.allowed_to?(:as_teacher,m)
end
# if homework.course_acts.size == 0
# homework.course_acts << CourseActivity.new(:user_id => homework.user_id,:course_id => homework.course_id)
# end
# 邮件通知
#Mailer.run.homework_added(homework)
end
end
end

View File

@ -6,6 +6,10 @@ namespace :exercise_publish do
exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now) exercises = Exercise.where("publish_time is not null and exercise_status = 1 and publish_time <=?",Time.now)
exercises.each do |exercise| exercises.each do |exercise|
exercise.update_column('exercise_status', 2) exercise.update_column('exercise_status', 2)
course = exercise.course
course.members.each do |m|
exercise.course_messages << CourseMessage.new(:user_id => m.user_id, :course_id => course.id, :viewed => false, :status => 2)
end
end end
end end

View File

@ -34,7 +34,7 @@ function submit_article()
function regexTopicDescription() function regexTopicDescription()
{ {
var name = message_content_editor.html(); var name = message_content_editor.html();
if(name.length ==0) if(message_content_editor.isEmpty())
{ {
$("#message_content_span").text("描述不能为空"); $("#message_content_span").text("描述不能为空");
$("#message_content_span").css('color','#ff0000'); $("#message_content_span").css('color','#ff0000');
@ -55,7 +55,7 @@ function regexTopicDescription()
function MessageReplayVevify() { function MessageReplayVevify() {
var content = message_content_editor.html();//$.trim($("#message_content").val()); var content = message_content_editor.html();//$.trim($("#message_content").val());
if (content.length == 0) { if (message_content_editor.isEmpty()) {
$("#message_content_span").text("回复不能为空"); $("#message_content_span").text("回复不能为空");
$("#message_content_span").css('color', '#ff0000'); $("#message_content_span").css('color', '#ff0000');
return false; return false;

View File

@ -1214,4 +1214,3 @@ a.uploadIcon {background:url(images/resource_icon_list.png) 8px -60px no-repeat;
.mb10 {margin-bottom: 10px} .mb10 {margin-bottom: 10px}
.mb15 {margin-bottom: 15px} .mb15 {margin-bottom: 15px}
div.disable_link {background-color: #c1c1c1 !important;} div.disable_link {background-color: #c1c1c1 !important;}
div.disable_link :hover {background-color: #c1c1c1}