You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

courses_controller.rb 59 kB

11 years ago
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
12 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
12 years ago
​
12 years ago
12 years ago
​
12 years ago
​
​
​
​
​
​
​
​
​
12 years ago
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
12 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
12 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
12 years ago
​
​
​
​
​
​
​
​
​
​
12 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
11 years ago
​
​
​
​
​
11 years ago
​
​
​
11 years ago
​
​
​
11 years ago
11 years ago
​
​
​
11 years ago
​
​
​
11 years ago
​
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
12 years ago
11 years ago
11 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465
  1. #encoding: utf-8
  2. class CoursesController < ApplicationController
  3. # layout 'base_courses'
  4. include CoursesHelper
  5. include ActivitiesHelper
  6. helper :activities
  7. helper :members
  8. helper :words
  9. helper :attachments
  10. helper :files
  11. helper :activity_notifys
  12. before_filter :auth_login1, :only => [:show, :course_activity, :feedback]
  13. menu_item :overview
  14. menu_item :feedback, :only => :feedback
  15. menu_item :homework, :only => :homework
  16. menu_item :new_homework, :only => :new_homework
  17. menu_item l(:label_sort_by_time), :only => :index
  18. menu_item l(:label_sort_by_active), :only => :index
  19. menu_item l(:label_sort_by_influence), :only => :index
  20. before_filter :can_show_course, :except => []
  21. before_filter :logged_user_by_apptoken,:only => [:show,:feedback]
  22. before_filter :find_course, :except => [ :index, :search, :new,:join,:unjoin, :create, :new_join, :course,:join_private_courses, :join_course_multi_role]
  23. before_filter :authorize_course, :only => [:show, :settings, :update, :course]
  24. before_filter :authorize_course_global, :only => [:new,:create]
  25. before_filter :toggleCourse, :only => [:finishcourse, :restartcourse]
  26. before_filter :is_deleted, :only => [:show, :settings]
  27. before_filter :require_login, :only => [:join, :unjoin]
  28. #before_filter :allow_join, :only => [:join]
  29. #查找组织
  30. def search_public_orgs_not_in_course
  31. condition = '%%'
  32. if !params[:name].nil?
  33. condition = "%#{params[:name].strip}%".gsub(" ","")
  34. end
  35. limit = 15
  36. course_org_ids = OrgCourse.find_by_sql("select distinct organization_id from org_courses where course_id = #{params[:id]}").map(&:organization_id)
  37. #@orgs_not_in_course = User.current.organizations.where("organizations.id not in (#{course_org_ids.join(',')}) and organizations.name like ?", condition).page(params[:page].to_i || 1).per(limit)
  38. #@org_count = User.current.organizations.where("organizations.id not in (#{course_org_ids.join(',')}) and organizations.name like ?", condition).count
  39. if course_org_ids.empty?
  40. @orgs_not_in_course = User.current.organizations.where("name like ?",condition).page((params[:page].to_i || 1)).per(limit)
  41. @org_count = @orgs_not_in_course.count
  42. else
  43. course_org_ids = "(" + course_org_ids.join(',') + ")"
  44. @orgs_not_in_course = User.current.organizations.where("organizations.id not in #{course_org_ids} and organizations.name like ?", condition).page((params[:page].to_i || 1)).per(limit)
  45. @org_count = @orgs_not_in_course.empty? ? 0 : @orgs_not_in_course.count
  46. end
  47. @course_count = Project.course_entities.visible.like(params[:name]).page(params[:page]).count
  48. @orgs_page = Paginator.new @org_count, limit,params[:page]
  49. @hint_flag = params[:hint_flag]
  50. #render :json => {:orgs => @orgs_not_in_course, :count => @org_count}.to_json
  51. respond_to do |format|
  52. format.js
  53. end
  54. end
  55. def join
  56. if User.current.logged?
  57. cs = CoursesService.new
  58. @user = User.current
  59. join = cs.join_course params,@user
  60. @state = join[:state]
  61. @course = join[:course]
  62. # else
  63. # @course = Course.find_by_id params[:object_id]
  64. # 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')
  65. # @state = 6
  66. # end
  67. else
  68. @state = 5 #未登录
  69. end
  70. @object_id = @course.id if @course
  71. respond_to do |format|
  72. format.js #{ render :partial => 'set_join', :locals => {:user => @user, :course => @course, :object_id => params[:object_id]} }
  73. end
  74. end
  75. def join_course_multi_role
  76. if User.current.logged?
  77. cs = CoursesService.new
  78. @user = User.current
  79. join = cs.join_course_roles params,@user
  80. @state = join[:state]
  81. @course = join[:course]
  82. else
  83. @state = 5 #未登录
  84. end
  85. @object_id = @course.id if @course
  86. respond_to do |format|
  87. format.js
  88. end
  89. end
  90. def unjoin
  91. if User.current.logged?
  92. cs = CoursesService.new
  93. cs.exit_course params,User.current
  94. end
  95. respond_to do |format|
  96. format.js { render :partial => 'set_join', :locals => {:user => User.current, :course => Course.find(params[:object_id]), :object_id => params[:object_id]} }
  97. end
  98. end
  99. def join_private_courses
  100. respond_to do |format|
  101. format.js
  102. end
  103. end
  104. #更新课程信息
  105. def update
  106. cs = CoursesService.new
  107. c = cs.edit_course params,@course,User.current
  108. @course = c[:course]
  109. if @course.errors.full_messages.count <= 0
  110. respond_to do |format|
  111. format.html {
  112. # render :layout => 'base_courses'
  113. flash[:notice] = l(:notice_successful_update)
  114. redirect_to settings_course_url(@course)
  115. }
  116. format.api { render_api_ok }
  117. end
  118. else
  119. respond_to do |format|
  120. format.html {
  121. settings
  122. redirect_to settings_course_url(@course)
  123. }
  124. format.api { render_validation_errors(@course) }
  125. end
  126. end
  127. end
  128. def new_join
  129. @course = Course.find(params[:object_id])
  130. respond_to do |format|
  131. format.js
  132. end
  133. end
  134. # 课程搜索
  135. # add by nwb
  136. def search
  137. if params[:name].empty?
  138. courses = Course.visible
  139. @courses = paginateHelper courses,10
  140. else
  141. courses = Course.visible.where("LOWER(name) like '%#{params[:name].to_s.downcase}%'").order("time desc, created_at desc")
  142. @courses = paginateHelper courses,10
  143. end
  144. @name = params[:name]
  145. @type = 'courses'
  146. respond_to do |format|
  147. format.html {
  148. render :layout => 'course_base'
  149. }
  150. format.atom {
  151. courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
  152. render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
  153. }
  154. end
  155. rescue Exception => e
  156. if e.message == 'sumbit empty'
  157. (redirect_to courses_url, :notice => l(:label_sumbit_empty);return)
  158. end
  159. end
  160. def searchmembers
  161. @subPage_title = l :label_student_list
  162. @canShowCode = User.current.allowed_to?(:as_teacher,@course) && params[:role] != '1'
  163. # @is_remote = true
  164. @sort_type = 'score'
  165. @score_sort_by = "desc"
  166. q = "#{params[:name].strip}"
  167. if params[:incourse]
  168. results = searchmember_by_name(student_homework_score(0,0,0,"desc"), q)
  169. elsif params[:ingroup]
  170. @group = CourseGroup.find(params[:search_group_id])
  171. results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q)
  172. end
  173. @is_remote = true
  174. #@result_count = results.count
  175. #@results = paginateHelper results, 10
  176. @results = results
  177. @search_name = q
  178. end
  179. def addgroups
  180. @subPage_title = l :label_student_list
  181. if params[:group_name]
  182. group = CourseGroup.new
  183. group.name = params[:group_name]
  184. group.course_id = @course.id
  185. group.save
  186. end
  187. @sort_type = 'score'
  188. @score_sort_by = "desc"
  189. @canShowCode = User.current.allowed_to?(:as_teacher,@course) && params[:role] != '1'
  190. @is_remote = true
  191. @members = student_homework_score(0,0, 10,@score_sort_by)
  192. @course_groups = @course.course_groups
  193. end
  194. def deletegroup
  195. CourseGroup.delete(params[:group_id])
  196. @subPage_title = l :label_student_list
  197. @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
  198. @is_remote = true
  199. @sort_type = 'score'
  200. @score_sort_by = "desc"
  201. @members = student_homework_score(0,0, 10,@score_sort_by)
  202. @course_groups = @course.course_groups
  203. end
  204. def updategroupname
  205. @subPage_title = l :label_student_list
  206. if params[:group_name]
  207. group = CourseGroup.find(params[:group_id])
  208. group.name = params[:group_name]
  209. group.save
  210. end
  211. @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
  212. @is_remote = true
  213. @members = student_homework_score(0,0, 10,"desc")
  214. @course_groups = @course.course_groups
  215. end
  216. def valid_ajax
  217. req = Hash.new(false)
  218. req[:message] = ''
  219. valid_attr = params[:valid]
  220. valid_value = params[:value]
  221. group_id = params[:group_id]
  222. # faker = CourseGroup.new
  223. if valid_attr.eql?('name')
  224. course = Course.find params[:course_id]
  225. group_names = course.course_groups.map{|group| group.name unless group.id.to_s == group_id}.select{|group| !group.nil?}
  226. if group_names.include?(valid_value)
  227. req[:valid] = false
  228. req[:message] = l(:modal_valid_unpassing)
  229. else
  230. req[:valid] = true
  231. req[:message] = l(:modal_valid_passing)
  232. end
  233. # faker.name = valid_value
  234. # faker.course_id = params[:course_id]
  235. # faker.valid?
  236. # req[:valid] = faker.errors[:name].blank?
  237. # req[:message] = faker.errors[:name]
  238. end
  239. # req[:message] = l(:modal_valid_passing) if req[:message].blank?
  240. render :json => req
  241. end
  242. def teacher_assign_group
  243. member = Member.where(:course_id => @course.id, :user_id => params[:user_id]).first
  244. member.course_group_id = params[:course_group_id].to_i
  245. member.save
  246. @course_groups = @course.course_groups
  247. @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
  248. respond_to do |format|
  249. format.js
  250. end
  251. end
  252. def join_group
  253. @subPage_title = l :label_student_list
  254. group = CourseGroup.find(params[:object_id])
  255. member = Member.where(:course_id => @course.id, :user_id => User.current.id).first
  256. member.course_group_id = group.id
  257. member.save
  258. @group = group
  259. @course_groups = @course.course_groups
  260. search_group_members group
  261. end
  262. def unjoin_group
  263. @subPage_title = l :label_student_list
  264. group = CourseGroup.find(params[:object_id])
  265. member = Member.where(:course_id => @course.id, :user_id => User.current.id).first
  266. member.course_group_id = 0
  267. member.save
  268. @group = group
  269. @course_groups = @course.course_groups
  270. search_group_members group
  271. end
  272. def searchgroupmembers
  273. @subPage_title = l :label_student_list
  274. @render_file = 'new_member_list'
  275. @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
  276. @is_remote = true
  277. @sort_type = 'score'
  278. @score_sort_by = "desc"
  279. if params[:group_id] && params[:group_id] != "0"
  280. @group = CourseGroup.find(params[:group_id])
  281. @results = student_homework_score(@group.id,0, 0,"desc")
  282. # @results = paginateHelper @results, 10
  283. else
  284. page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1)
  285. @results = student_homework_score(0,page_from, 10,"desc")
  286. end
  287. end
  288. def member
  289. ## 有角色参数的才是课程,没有的就是项目
  290. if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course)))
  291. @render_file = 'new_member_list'
  292. @score_sort_by = "desc"
  293. @sort_type = params[:sort_type] ? params[:sort_type] : "score"
  294. @canShowCode = User.current.allowed_to?(:as_teacher,@course) && params[:role] != '1'
  295. @role = params[:role].nil? ? '2':params[:role]
  296. @is_remote = true
  297. @course_groups = @course.course_groups if @course.course_groups
  298. @show_serch = params[:role] == '2'
  299. case @role
  300. when '1'
  301. @subPage_title = l :label_teacher_list
  302. @all_members = searchTeacherAndAssistant(@course)
  303. @members = @all_members
  304. when '2'
  305. if @course.open_student == 1 || User.current.member_of_course?(@course)
  306. @subPage_title = l :label_student_list
  307. page = params[:page].nil? ? 0 : (params['page'].to_i - 1)
  308. @all_members = student_homework_score(0,page, 10,@score_sort_by,@sort_type)
  309. @members = @all_members
  310. else
  311. render_403
  312. return
  313. end
  314. end
  315. respond_to do |format|
  316. if params[:page]
  317. format.html {render :layout => 'base_courses'}
  318. format.js
  319. else
  320. format.html {render :layout => 'base_courses'}
  321. end
  322. end
  323. else
  324. render_403
  325. end
  326. end
  327. def export_course_member_excel
  328. @all_members = student_homework_score(0,0,0,"desc")
  329. @homeworks = @course.homework_commons.where("publish_time <= '#{Date.today}'").order("created_at asc")
  330. filename="#{@course.teacher.lastname.to_s + @course.teacher.firstname.to_s }_#{@course.name}_#{@course.time.to_s + @course.term}#{l(:excel_member_list)}";
  331. respond_to do |format|
  332. format.xls {
  333. send_data(member_to_xls(@homeworks,@course,@all_members,@course.course_groups), :type => "text/excel;charset=utf-8; header=present",
  334. :filename => filename_for_content_disposition("#{filename}.xls"))
  335. }
  336. end
  337. end
  338. def member_score_sort
  339. @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
  340. @subPage_title = l :label_student_list
  341. @render_file = 'new_member_list'
  342. @is_remote = true
  343. @sort_type = params[:sort_type] if params[:sort_type]
  344. @score_sort_by = params[:sort_by] if params[:sort_by]
  345. @search_name = params[:search_name] if params[:search_name]
  346. group_id = params[:group_id]
  347. if !@search_name.nil?
  348. if group_id == '0'
  349. page = params[:page].nil? ? 0 : (params['page'].to_i - 1)
  350. @results = searchmember_by_name(student_homework_score(0,0,0,@score_sort_by,@sort_type), @search_name)
  351. @result_count = @results.count
  352. # @results = paginateHelper @results, 10
  353. else
  354. @group = CourseGroup.find(group_id)
  355. @results = searchmember_by_name(student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type),@search_name)
  356. @result_count = @results.count
  357. # @results = paginateHelper @results, 10
  358. end
  359. else
  360. if group_id == '0'
  361. page = params[:page].nil? ? 0 : (params['page'].to_i - 1)
  362. @results = student_homework_score(0,page, 10,@score_sort_by,@sort_type)
  363. else
  364. @group = CourseGroup.find(group_id)
  365. @results = student_homework_score(group_id, 0, 0,@score_sort_by,@sort_type)
  366. end
  367. end
  368. end
  369. # 显示每个学生的作业评分详情
  370. def show_member_score
  371. @member_score = Member.find(params[:member_id]) if params[:member_id]
  372. respond_to do |format|
  373. format.html {render :layout => 'course_base'}
  374. format.js
  375. end
  376. end
  377. # 显示每个学生的作业评分详情
  378. def show_member_act_score
  379. @member = Member.find(params[:member_id]) if params[:member_id]
  380. respond_to do |format|
  381. format.html {render :layout => 'course_base'}
  382. format.js
  383. end
  384. end
  385. def handle_course courses, activities
  386. course_activity_count_array=activities.values()
  387. course_array=[]
  388. i=0;
  389. courses.each do |course|
  390. course_array[i]=course
  391. i=i+1
  392. end
  393. courses=desc_sort_course_by_avtivity(course_activity_count_array, course_array)
  394. return courses
  395. end
  396. def settings
  397. #添加成员消息状态
  398. join_course_messages = CourseMessage.where("user_id =? and course_message_type =? and course_id =? and status = ? and viewed =?", User.current.id, 'JoinCourse', @course.id, 1, 0)
  399. join_course_messages.update_all(:viewed => true)
  400. if User.current.allowed_to?(:as_teacher,@course)
  401. @select_tab = params[:tab]
  402. @issue_custom_fields = IssueCustomField.sorted.all
  403. @issue_category ||= IssueCategory.new
  404. @member ||= @course.members.new
  405. @trackers = Tracker.sorted.all
  406. @roles = Role.givable.all[3..5]
  407. @members = @course.member_principals.includes(:roles, :principal).all.sort
  408. respond_to do |format|
  409. format.html { render :layout => 'base_courses' }
  410. format.api { render_validation_errors(@course) }
  411. end
  412. else
  413. render_403
  414. end
  415. end
  416. def private_or_public
  417. if @course.is_public == 0
  418. @course.update_attributes(:is_public => 1)
  419. else
  420. @course.update_attributes(:is_public => 0)
  421. end
  422. if @course.is_public == 0
  423. course_status = CourseStatus.find_by_course_id(@course.id)
  424. course_status.destroy if course_status
  425. elsif @course.is_public == 1
  426. course_status = CourseStatus.find_by_course_id(@course.id)
  427. course_status.destroy if course_status
  428. course_status = CourseStatus.create(:course_id => @course.id, :grade => 0)
  429. end
  430. respond_to do |format|
  431. format.js
  432. end
  433. end
  434. def search_member
  435. if User.current.allowed_to?(:as_teacher,@course) || User.current.admin
  436. q = "#{params[:name].strip}"
  437. @roles = Role.givable.all[3..5]
  438. if q.nil? || q == ""
  439. @members = @course.member_principals.includes(:roles, :principal).all.sort
  440. else
  441. @members = searchmember_by_name(@course.member_principals.includes(:roles, :principal).all.sort,q)
  442. end
  443. else
  444. render_403
  445. end
  446. end
  447. def create
  448. cs = CoursesService.new
  449. @course = cs.create_course(params,User.current)[:course]
  450. if params[:copy_course]
  451. copy_course = Course.find params[:copy_course].to_i
  452. @course.is_copy = params[:copy_course].to_i
  453. @course.open_student = copy_course.open_student
  454. @course.publish_resource = copy_course.publish_resource
  455. @course.save
  456. #copy avatar
  457. copy_avatar(@course, copy_course)
  458. if params[:course_content_type]
  459. params[:course_content_type].each do |type|
  460. case type
  461. when "0"
  462. homeworks = copy_course.homework_commons
  463. homeworks.each do |homework|
  464. new_homework = HomeworkCommon.new
  465. new_homework.name = homework.name
  466. new_homework.user_id = User.current.id
  467. new_homework.description = homework.description
  468. new_homework.publish_time = Date.today + 30
  469. new_homework.end_time = Date.today + 60
  470. new_homework.homework_type = homework.homework_type
  471. new_homework.late_penalty = homework.late_penalty
  472. new_homework.course_id = @course.id
  473. new_homework.teacher_priority = homework.teacher_priority
  474. new_homework.anonymous_comment = homework.anonymous_comment
  475. new_homework.quotes = 0
  476. new_homework.is_open = homework.is_open
  477. homework.attachments.each do |attachment|
  478. att = attachment.copy
  479. att.container_id = nil
  480. att.container_type = nil
  481. att.copy_from = attachment.id
  482. att.save
  483. new_homework.attachments << att
  484. end
  485. homework_detail_manual = homework.homework_detail_manual
  486. homework_detail_programing = homework.homework_detail_programing
  487. homework_detail_group = homework.homework_detail_group
  488. if homework_detail_manual
  489. new_homework.homework_detail_manual = HomeworkDetailManual.new
  490. new_homework_detail_manual = new_homework.homework_detail_manual
  491. new_homework_detail_manual.ta_proportion = homework_detail_manual.ta_proportion
  492. new_homework_detail_manual.comment_status = 0
  493. new_homework_detail_manual.evaluation_start = Date.today + 67
  494. new_homework_detail_manual.evaluation_end = Date.today + 74
  495. new_homework_detail_manual.evaluation_num = homework_detail_manual.evaluation_num
  496. new_homework_detail_manual.absence_penalty = homework_detail_manual.absence_penalty
  497. end
  498. if homework_detail_programing
  499. new_homework.homework_detail_programing = HomeworkDetailPrograming.new
  500. new_homework.homework_detail_programing.ta_proportion = homework_detail_programing.ta_proportion
  501. new_homework.homework_detail_programing.language = homework_detail_programing.language
  502. homework.homework_tests.each_with_index do |homework_test|
  503. new_homework.homework_tests << HomeworkTest.new(
  504. input: homework_test.input,
  505. output: homework_test.output
  506. )
  507. end
  508. end
  509. if homework_detail_group
  510. new_homework.homework_detail_group = HomeworkDetailGroup.new
  511. new_homework.homework_detail_group.min_num = homework_detail_group.min_num
  512. new_homework.homework_detail_group.max_num = homework_detail_group.max_num
  513. new_homework.homework_detail_group.base_on_project = homework_detail_group.base_on_project
  514. end
  515. if new_homework.save
  516. new_homework_detail_manual.save if new_homework_detail_manual
  517. new_homework.homework_detail_programing.save if new_homework.homework_detail_programing
  518. new_homework.homework_detail_group.save if new_homework.homework_detail_group
  519. end
  520. homework.update_attribute(:quotes, homework.quotes+1)
  521. end
  522. when "1"
  523. attachments = copy_course.attachments
  524. attachments.each do |attachment|
  525. attach_copied_obj = attachment.copy
  526. attach_copied_obj.tag_list.add(attachment.tag_list) # tag关联
  527. attach_copied_obj.container = @course
  528. attach_copied_obj.created_on = Time.now
  529. attach_copied_obj.author_id = User.current.id
  530. attach_copied_obj.copy_from = attachment.copy_from.nil? ? attachment.id : attachment.copy_from
  531. attach_copied_obj.is_publish = 0
  532. attach_copied_obj.publish_time = Date.today + 30
  533. if attach_copied_obj.attachtype == nil
  534. attach_copied_obj.attachtype = 4
  535. end
  536. attach_copied_obj.save
  537. update_quotes attach_copied_obj
  538. end
  539. end
  540. end
  541. end
  542. =begin
  543. if params[:checkAll]
  544. attachments = copy_course.attachments
  545. attachments.each do |attachment|
  546. attach_copied_obj = attachment.copy
  547. attach_copied_obj.tag_list.add(attachment.tag_list) # tag关联
  548. attach_copied_obj.container = @course
  549. attach_copied_obj.created_on = Time.now
  550. attach_copied_obj.author_id = User.current.id
  551. attach_copied_obj.copy_from = attachment.copy_from.nil? ? attachment.id : attachment.copy_from
  552. if attach_copied_obj.attachtype == nil
  553. attach_copied_obj.attachtype = 4
  554. end
  555. attach_copied_obj.save
  556. update_quotes attach_copied_obj
  557. end
  558. elsif params[:course_attachment_type]
  559. copy_attachments = []
  560. params[:course_attachment_type].each do |type|
  561. case type
  562. when "1"
  563. tag_name = l(:label_courseware)
  564. when "2"
  565. tag_name = l(:label_software)
  566. when "3"
  567. tag_name = l(:label_media)
  568. when "4"
  569. tag_name = l(:label_code)
  570. when "6"
  571. tag_name = "论文"
  572. else
  573. tag_name = ""
  574. end
  575. if tag_name == ""
  576. tag_attachments = copy_course.attachments.select{|attachment|
  577. !attachment.tag_list.include?('课件') &&
  578. !attachment.tag_list.include?('软件') &&
  579. !attachment.tag_list.include?('媒体') &&
  580. !attachment.tag_list.include?('代码') &&
  581. !attachment.tag_list.include?('论文') }
  582. else
  583. tag_attachments = copy_course.attachments.select{|attachment| attachment.tag_list.include?(tag_name)}
  584. end
  585. tag_attachments.each do |attach|
  586. next if copy_attachments.include?(attach)
  587. copy_attachments << attach
  588. end
  589. end
  590. unless copy_attachments.blank?
  591. copy_attachments.each do |c_attach|
  592. attach_copied_obj = c_attach.copy
  593. attach_copied_obj.tag_list.add(c_attach.tag_list) # tag关联
  594. attach_copied_obj.container = @course
  595. attach_copied_obj.created_on = Time.now
  596. attach_copied_obj.author_id = User.current.id
  597. attach_copied_obj.copy_from = c_attach.copy_from.nil? ? c_attach.id : c_attach.copy_from
  598. if attach_copied_obj.attachtype == nil
  599. attach_copied_obj.attachtype = 4
  600. end
  601. attach_copied_obj.save
  602. update_quotes attach_copied_obj
  603. end
  604. end
  605. end
  606. =end
  607. end
  608. if @course
  609. #发送微信消息
  610. count = ShieldWechatMessage.where("container_type='User' and container_id=#{User.current.id} and shield_type='Course' and shield_id=#{@course.id}").count
  611. if count == 0
  612. ss = SyllabusesService.new
  613. ss.send_wechat_create_class_notice User.current,@course
  614. end
  615. respond_to do |format|
  616. flash[:notice] = l(:notice_successful_create)
  617. format.html {redirect_to course_url(@course)}
  618. format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) }
  619. end
  620. else
  621. respond_to do |format|
  622. flash[:notice] = l(:notice_create_failed)
  623. # @course = Course.new
  624. format.html { redirect_to new_course_path } #Added by young
  625. format.api { render_validation_errors(@course) }
  626. end
  627. end
  628. end
  629. def course
  630. @school_id = params[:school_id]
  631. per_page_option = 10
  632. if @school_id == "0" or @school_id.nil?
  633. @courses_all = Course.active.visible.
  634. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
  635. else
  636. @courses_all = Course.active.visible.
  637. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
  638. joins(:course_extra).
  639. where("#{Course.table_name}.school_id = ?", @school_id)
  640. end
  641. @course_count = @courses_all.count
  642. @course_pages = Paginator.new @course_count, per_page_option, params['page']
  643. @course_activity_count=Hash.new
  644. @courses_all.each do |course|
  645. @course_activity_count[course.id]=0
  646. end
  647. case params[:course_sort_type]
  648. when '0'
  649. @courses = @courses_all.order("created_on desc")
  650. @s_type = 0
  651. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  652. @course_activity_count=get_course_activity @courses,@course_activity_count
  653. when '1'
  654. @courses = @courses_all.order("course_ac_para desc")
  655. @s_type = 1
  656. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  657. @course_activity_count=get_course_activity @courses,@course_activity_count
  658. when '2'
  659. @courses = @courses_all.order("watchers_count desc")
  660. @s_type = 2
  661. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  662. @course_activity_count=get_course_activity @courses,@course_activity_count
  663. when '3'
  664. @course_activity_count=get_course_activity @courses_all,@course_activity_count
  665. @courses=handle_course @courses_all,@course_activity_count
  666. @s_type = 3
  667. @courses = @courses[@course_pages.offset, @course_pages.per_page]
  668. else
  669. @s_type = 0
  670. @courses = @courses_all.order("created_on desc")
  671. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  672. @course_activity_count=get_course_activity @courses,@course_activity_count
  673. end
  674. respond_to do |format|
  675. format.html {
  676. render :layout => 'new_base'
  677. }
  678. format.api {
  679. }
  680. format.atom {
  681. courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
  682. render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
  683. }
  684. end
  685. end
  686. def new
  687. if User.current.login?
  688. @course_type = params[:course_type] ||= params[:course]
  689. @issue_custom_fields = IssueCustomField.sorted.all
  690. @trackers = Tracker.sorted.all
  691. @course = Course.new
  692. @course.safe_attributes = params[:course]
  693. @syllabus = Syllabus.where("id = #{params[:syllabus_id].to_i}").first if params[:syllabus_id]
  694. # month = Time.now.month
  695. render :layout => 'new_base'
  696. else
  697. redirect_to signin_url
  698. end
  699. end
  700. def desc_sort_course_by_avtivity(activity_count, courses)
  701. return courses if activity_count.size<2
  702. (activity_count.size-2).downto(0) do |i|
  703. (0..i).each do |j|
  704. if activity_count[j]<activity_count[j+1]
  705. courses[j], courses[j+1]=courses[j+1], courses[j]
  706. activity_count[j], activity_count[j+1]=activity_count[j+1], activity_count[j]
  707. end
  708. end
  709. end
  710. return courses
  711. end
  712. def index
  713. if !User.current.admin?
  714. render_404
  715. return
  716. end
  717. @course_type = params[:course_type]
  718. @school_id = params[:school_id]
  719. per_page_option = 10
  720. if @school_id == "0" || @school_id.nil?
  721. @courses_all = Course.active.visible.
  722. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
  723. else
  724. @courses_all = Course.active.visible.
  725. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
  726. where("#{Course.table_name}.school_id = ?", @school_id)
  727. end
  728. @course_count = @courses_all.count
  729. @course_pages = Paginator.new @course_count, per_page_option, params['page']
  730. @course_activity_count=Hash.new
  731. @courses_all.each do |course|
  732. @course_activity_count[course.id]=0
  733. end
  734. case params[:course_sort_type]
  735. when '0'
  736. @courses = @courses_all.order("created_at desc")
  737. @s_type = 0
  738. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  739. @course_activity_count=get_course_activity @courses, @course_activity_count
  740. when '1'
  741. @courses = @courses_all.order("course_ac_para desc")
  742. @s_type = 1
  743. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  744. @course_activity_count=get_course_activity @courses, @course_activity_count
  745. when '2'
  746. @courses = @courses_all.order("watchers_count desc")
  747. @s_type = 2
  748. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  749. @course_activity_count=get_course_activity @courses, @course_activity_count
  750. when '3'
  751. @course_activity_count=get_course_activity @courses_all, @course_activity_count
  752. @courses=handle_course @courses_all, @course_activity_count
  753. @s_type = 3
  754. @courses = @courses[@course_pages.offset, @course_pages.per_page]
  755. else
  756. @s_type = 0
  757. @courses = @courses_all.order("created_at desc")
  758. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  759. @course_activity_count=get_course_activity @courses, @course_activity_count
  760. end
  761. respond_to do |format|
  762. format.html {
  763. render :layout => 'base'
  764. }
  765. format.atom {
  766. courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
  767. render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
  768. }
  769. end
  770. end
  771. def toggleCourse
  772. @course_prefs = Course.find_by_extra(@course.extra)
  773. unless (User.current.allowed_to?(:as_teacher,@course_prefs) || User.current.admin?)
  774. render_403
  775. end
  776. end
  777. def is_deleted
  778. if @course.is_delete == 1 and !User.current.admin?
  779. render_404
  780. return
  781. end
  782. end
  783. def get_courses
  784. @user = User.current
  785. membership = @user.coursememberships.all
  786. membership.sort! {|older, newer| newer.created_on <=> older.created_on }
  787. @memberships = []
  788. membership.collect { |e|
  789. @memberships.push(e)
  790. }
  791. @memberships_doing = []
  792. @memberships_done = []
  793. now_time = Time.now.year
  794. @memberships.map { |e|
  795. end_time = e.course.get_time.year
  796. isDone = course_endTime_timeout?(e.course)
  797. if isDone
  798. @memberships_done.push e
  799. else
  800. @memberships_doing.push e
  801. end
  802. }
  803. end
  804. def finishcourse
  805. yesterday = Date.today.prev_day.to_time
  806. @course_prefs.endup_time = yesterday
  807. @save_flag = @course_prefs.save
  808. get_courses
  809. respond_to do |format|
  810. format.js
  811. end
  812. end
  813. def restartcourse
  814. day = Time.parse("3000-01-01")
  815. @course_prefs.endup_time = day
  816. @save_flag = @course_prefs.save
  817. get_courses
  818. respond_to do |format|
  819. format.js {
  820. render action:'finishcourse'
  821. }
  822. end
  823. end
  824. def course_activity
  825. redirect_to course_url(@course, type: params[:type], page: params[:page])
  826. end
  827. def show
  828. # 被删除的课程只有超级管理员才能看到,is_delete为1的时候,标记课程被删除
  829. # if @course.is_delete == 1 && !User.current.admin?
  830. # render_403
  831. # return
  832. # end
  833. #更新创建课程消息状态
  834. 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)
  835. create_course_messages.update_all(:viewed => true)
  836. #更新申请结果反馈消息的状态
  837. course_request_messages = CourseMessage.where("user_id =? and course_id =? and course_message_type =? and viewed =?", User.current.id, @course.id, 'CourseRequestDealResult', false)
  838. course_request_messages.update_all(:viewed => true)
  839. course_activities = @course.course_activities
  840. @canShowRealName = User.current.member_of_course? @course
  841. @page = params[:page] ? params[:page].to_i + 1 : 0
  842. if params[:type].present?
  843. case params[:type]
  844. when "homework"
  845. @course_activities = course_activities.where("course_act_type = 'HomeworkCommon'").order('updated_at desc')
  846. when "news"
  847. @course_activities = course_activities.where("course_act_type = 'News'").order('updated_at desc')
  848. when "message"
  849. @course_activities = course_activities.where("course_act_type = 'Message'").order('updated_at desc')
  850. when "poll"
  851. @course_activities = course_activities.where("course_act_type = 'Poll'").order('updated_at desc')
  852. when "attachment"
  853. @course_activities = course_activities.where("course_act_type = 'Attachment'").order('updated_at desc')
  854. when "journalsForMessage"
  855. @course_activities = course_activities.where("course_act_type = 'JournalsForMessage'").order('updated_at desc')
  856. else
  857. @course_activities = course_activities.order('updated_at desc')
  858. end
  859. else
  860. @course_activities = course_activities.order('updated_at desc')
  861. end
  862. @course_activities_count = @course_activities.count
  863. @course_activities = @course_activities.limit(10).offset(@page * 10)
  864. @type = params[:type]
  865. @left_nav_type = 1
  866. respond_to do |format|
  867. format.js
  868. format.html{render :layout => 'base_courses'}
  869. format.api
  870. end
  871. end
  872. #判断指定用户是否为课程教师
  873. def isCourseTeacher(id,course)
  874. result = false
  875. user = User.find(id)
  876. if !user.nil? && user.allowed_to?(:as_teacher,course)
  877. result = true
  878. end
  879. result
  880. end
  881. def feedback
  882. CourseMessage.where("user_id = ? and course_id = ?", User.current, @course.id).update_all(:viewed => true)
  883. if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course)))
  884. page = params[:page]
  885. # Find the page of the requested reply
  886. @jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
  887. @limit = 10
  888. if params[:r] && page.nil?
  889. offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i])
  890. page = 1 + offset / @limit
  891. end
  892. @jour = paginateHelper @jours,10
  893. @state = false
  894. @left_nav_type = 6
  895. respond_to do |format|
  896. format.html{render :layout => 'base_courses'}
  897. format.api
  898. end
  899. else
  900. render_403
  901. end
  902. end
  903. def search_homework_member homeworks,name
  904. if name == ""
  905. select_homework = homeworks
  906. else
  907. name = name.downcase
  908. select_homework = homeworks.select{ |homework|
  909. homework.user[:login].to_s.downcase.include?(name) || homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name)
  910. }
  911. end
  912. select_homework
  913. end
  914. # 作业查重
  915. def code_repeat
  916. #代码查重新加的
  917. @order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name] || "",params[:group]
  918. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  919. if !@is_teacher
  920. render_403
  921. return
  922. end
  923. @homework = HomeworkCommon.find params[:homework]
  924. #order("#{@order} #{@b_sort}"
  925. @student_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,IF(final_score = 0, 0, final_score - absence_penalty - late_penalty)) as score").order("simi_value desc").has_committed,@name
  926. @works_hash = {}
  927. @student_works.each do |tmpwork|
  928. @works_hash[tmpwork.id] = tmpwork
  929. puts tmpwork.id
  930. end
  931. #respond_to do |format|
  932. #format.html {render :layout => 'base_courses'}
  933. #end
  934. end
  935. def show_comparecode
  936. src_id = params[:src_id]
  937. dst_id = params[:dst_id]
  938. @is_teacher = User.current.allowed_to?(:as_teacher,@course) || User.current.admin?
  939. if !@is_teacher
  940. render_403
  941. return
  942. end
  943. src_work = StudentWork.where("id =?", src_id).first
  944. @homework = HomeworkCommon.find params[:homework_id]
  945. @simi_value = src_work.simi_value.to_i
  946. @src_code = src_work.description
  947. src_user = User.where("id =?", src_work.user_id).first
  948. @src_username = src_user.try(:realname) != " " ? src_user.lastname + src_user.firstname : src_user.try(:login)
  949. #descriotion user name
  950. dst_work = StudentWork.where("id =?", dst_id).first
  951. @dst_code = dst_work.description
  952. dst_user = User.where("id =?", dst_work.user_id).first
  953. @dst_username = dst_user.try(:realname) != " " ? dst_user.lastname + dst_user.firstname : dst_user.try(:login)
  954. respond_to do |format|
  955. format.js
  956. end
  957. end
  958. #根据已有课程复制课程
  959. #param id:已有课程ID
  960. def copy_course
  961. if @course
  962. @new_course = Course.new
  963. respond_to do |format|
  964. format.js
  965. end
  966. =begin
  967. @new_course = Course.new @course.attributes
  968. @new_course.tea_id = User.current.id
  969. @new_course.created_at = DateTime.now
  970. @new_course.updated_at = DateTime.now
  971. @new_course.endup_time = nil
  972. if @new_course.save
  973. r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
  974. m = Member.new(:user => User.current, :roles => [r])
  975. m.project_id = -1
  976. course = CourseInfos.new(:user_id => User.current.id, :course_id => @new_course.id)
  977. #user_grades = UserGrade.create(:user_id => User.current.id, :course_id => @course.id)
  978. if @new_course.is_public == 1
  979. course_status = CourseStatus.create(:course_id => @new_course.id, :watchers_count => 0, :changesets_count => 0, :grade => 0, :course_type => 1)
  980. end
  981. @new_course.members << m
  982. @new_course.course_infos << course
  983. redirect_to settings_course_url @new_course
  984. end
  985. =end
  986. else
  987. render_404
  988. end
  989. end
  990. #从课程创建的老师那里选择课程大纲
  991. def course_outline
  992. @teacher = User.find(@course.tea_id)
  993. @blog_articles = @teacher.blog.articles
  994. @is_in_show_outline_page = params[:is_in_show_outline_page]
  995. respond_to do |format|
  996. format.js
  997. end
  998. end
  999. #根据关键字搜索,查找方法一样的,但返回内容不一样
  1000. def search_course_outline
  1001. @article_title = params[:title]
  1002. @teacher = User.find(@course.tea_id)
  1003. @blog_articles = @teacher.blog.articles.like(@article_title)
  1004. render :json=>@blog_articles.to_json
  1005. end
  1006. #设置或者更改课程的大纲
  1007. def set_course_outline
  1008. @course.outline = params[:outline_id]
  1009. @course.save
  1010. @is_in_show_outline_page = params[:is_in_show_outline_page]
  1011. respond_to do |format|
  1012. format.js
  1013. end
  1014. end
  1015. #显示课程大纲
  1016. def syllabus
  1017. @article = BlogComment.find(@course.outline)
  1018. respond_to do |format|
  1019. format.html {render :layout => 'base_courses'}
  1020. end
  1021. end
  1022. #删除课程
  1023. #删除课程只是将课程的is_deleted状态改为false,is_deleted为false状态的课程只有管理员可以看到
  1024. def destroy
  1025. @course.delete!
  1026. @course = nil
  1027. redirect_to user_url(User.current)
  1028. end
  1029. # 恢复已删除的课程
  1030. def renew
  1031. if User.current.admin?
  1032. @course.update_attributes(:is_delete => false)
  1033. redirect_to course_path(@course)
  1034. else
  1035. return 404
  1036. end
  1037. end
  1038. #搜索作业
  1039. def homework_search
  1040. @search = "%#{params[:search].strip.downcase}%"
  1041. @is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course))
  1042. @page = params[:page] ? params[:page].to_i + 1 : 0
  1043. if @is_teacher
  1044. @homeworks = @course.homework_commons.where("name like '%#{@search}%'").order("created_at desc").limit(10).offset(@page * 10)
  1045. else
  1046. @homeworks = @course.homework_commons.where("name like '%#{@search}%' and publish_time <= '#{Date.today}'").order("created_at desc").limit(10).offset(@page * 10)
  1047. end
  1048. end
  1049. #统计
  1050. def statistics_course
  1051. @left_nav_type = 9
  1052. respond_to do |format|
  1053. format.html {render :layout => 'base_courses'}
  1054. end
  1055. end
  1056. #切换身份
  1057. def switch_role
  1058. members = @course.members.where("user_id = #{params[:user_id]}")
  1059. unless members.blank?
  1060. #role = MemberRole.where("member_id = #{members.first.id} and role_id = #{params[:role]}").first
  1061. curr_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:curr_role])
  1062. tar_role = MemberRole.find_by_member_id_and_role_id(members.first.id, params[:tar_role])
  1063. unless (curr_role.nil? || tar_role.nil?)
  1064. curr_role.update_column('is_current', 0)
  1065. tar_role.update_column('is_current', 1)
  1066. end
  1067. end
  1068. redirect_to course_path(@course)
  1069. end
  1070. private
  1071. def update_quotes attachment
  1072. if attachment.copy_from
  1073. attachments = Attachment.find_by_sql("select * from attachments where copy_from = #{attachment.copy_from} or id = #{attachment.copy_from}")
  1074. else
  1075. attachments = Attachment.find_by_sql("select * from attachments where copy_from = #{attachment.id} or id = #{attachment.copy_from}")
  1076. end
  1077. attachment.quotes = get_qute_number attachment
  1078. attachment.save
  1079. attachments.each do |att|
  1080. att.quotes = attachment.quotes
  1081. att.save
  1082. end
  1083. end
  1084. def get_qute_number attachment
  1085. if attachment.copy_from
  1086. result = Attachment.find_by_sql("select count(*) as number from attachments where copy_from = #{attachment.copy_from}")
  1087. else
  1088. result = Attachment.find_by_sql("select count(*) as number from attachments where copy_from = #{attachment.id}")
  1089. end
  1090. if result.nil? || result.count <= 0
  1091. return 0
  1092. else
  1093. return result[0].number
  1094. end
  1095. end
  1096. def allow_join course
  1097. if course_endTime_timeout? course
  1098. respond_to do |format|
  1099. format.js {
  1100. @state = 2
  1101. render :partial => 'set_join',
  1102. :locals => {:user => User.current,
  1103. :course => Course.find(params[:object_id]),
  1104. :object_id => params[:object_id]
  1105. }
  1106. }
  1107. end
  1108. end
  1109. end
  1110. #验证是否显示课程
  1111. def can_show_course
  1112. @first_page = FirstPage.find_by_page_type('project')
  1113. if @first_page.try(:show_course) == 2
  1114. render_404
  1115. end
  1116. end
  1117. def student_homework_score(groupid,start_from, nums, score_sort_by, sort_type = 'score')
  1118. start_from = start_from * nums
  1119. sql_select = ""
  1120. if groupid == 0
  1121. sql_select = "SELECT members.*,(
  1122. SELECT SUM(student_works.work_score)
  1123. FROM student_works,homework_commons
  1124. WHERE student_works.homework_common_id = homework_commons.id
  1125. AND homework_commons.course_id = #{@course.id}
  1126. AND student_works.user_id = members.user_id
  1127. ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 +
  1128. resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id
  1129. ) AS act_score
  1130. FROM members
  1131. JOIN students_for_courses
  1132. ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
  1133. WHERE members.course_id = #{@course.id} ORDER BY #{sort_type} #{score_sort_by}"
  1134. else
  1135. sql_select = "SELECT members.*,(
  1136. SELECT SUM(student_works.work_score)
  1137. FROM student_works,homework_commons
  1138. WHERE student_works.homework_common_id = homework_commons.id
  1139. AND homework_commons.course_id = #{@course.id}
  1140. AND student_works.user_id = members.user_id
  1141. ) AS score,(SELECT (message_num*2 + message_reply_num*1 + news_reply_num*1 + news_num*1 +
  1142. resource_num*5 + journal_num*1 + homework_journal_num*1 ) FROM `course_contributor_scores` AS ccs WHERE ccs.course_id = #{@course.id} AND ccs.user_id = members.user_id
  1143. ) AS act_score
  1144. FROM members
  1145. JOIN students_for_courses
  1146. ON students_for_courses.student_id = members.user_id AND students_for_courses.course_id = members.course_id
  1147. WHERE members.course_id = #{@course.id} AND members.course_group_id = #{groupid} ORDER BY #{sort_type} #{score_sort_by}"
  1148. end
  1149. sql = ActiveRecord::Base.connection()
  1150. homework_scores = Member.find_by_sql(sql_select)
  1151. sql.close()
  1152. homework_scores
  1153. end
  1154. #获取课程的老师列表
  1155. def find_course_teachers course
  1156. searchTeacherAndAssistant(course).map{|teacher| teacher.user_id}.join(",")
  1157. end
  1158. #当加入,退出分班时查询分班的学生
  1159. def search_group_members group
  1160. @subPage_title = l :label_student_list
  1161. @render_file = 'new_member_list'
  1162. @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1'
  1163. @is_remote = true
  1164. @score_sort_by = "desc"
  1165. page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1)
  1166. @results = student_homework_score(group.id,0,0, "desc")
  1167. end
  1168. def member_to_xls homeworks, course, members,groups
  1169. xls_report = StringIO.new
  1170. book = Spreadsheet::Workbook.new
  1171. sheet1 = book.create_worksheet :name => "总成绩"
  1172. blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
  1173. #sheet1.row(0).default_format = blue
  1174. #sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_class),l(:excel_f_score),l(:excel_commit_time)])
  1175. sheet1[0,0] = "课程编号"
  1176. sheet1[0,1] = course.id
  1177. sheet1[1,0] = "课程学期"
  1178. sheet1[1,1] = course.time.to_s+"年"+course.term
  1179. sheet1[2,0] = "课程名称"
  1180. sheet1[2,1] = course.name
  1181. sheet1[3,0] = "教师团队"
  1182. sheet1[3,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_name}.join('、')
  1183. sheet1[4,0] = "主讲教师"
  1184. sheet1[4,1] = course.teacher.show_name
  1185. sheet1[5,0] = "排名"
  1186. sheet1[5,1] = "学生姓名"
  1187. sheet1[5,2] = "昵称"
  1188. sheet1[5,3] = "学号"
  1189. for i in 0 ... homeworks.count
  1190. sheet1[5,i+4] = "第"+(i+1).to_s+"次"
  1191. end
  1192. sheet1[5,homeworks.count+4] = "总成绩"
  1193. sheet1[5,homeworks.count+5] = "活跃度"
  1194. count_row = 6
  1195. members.each_with_index do |member, i|
  1196. sheet1[count_row,0]= i+1
  1197. sheet1[count_row,1] = member.user.lastname.to_s + member.user.firstname.to_s
  1198. sheet1[count_row,2] = member.user.login
  1199. sheet1[count_row,3] = member.user.user_extensions.student_id
  1200. homeworks.each_with_index do |homework, j|
  1201. student_works = homework.student_works.where("user_id = #{member.user.id}")
  1202. if student_works.empty?
  1203. sheet1[count_row,j+4] = 0
  1204. else
  1205. final_score = student_works.first.final_score.nil? ? 0 : student_works.first.final_score
  1206. score = final_score - student_works.first.absence_penalty - student_works.first.late_penalty
  1207. sheet1[count_row,j+4] = score <0 ? 0:score.round(2)
  1208. end
  1209. end
  1210. sheet1[count_row,homeworks.count+4] = member.score.nil? ? 0:member.score.round(2)
  1211. sheet1[count_row,homeworks.count+5] = member.act_score.nil? ? 0:member.act_score
  1212. count_row += 1
  1213. end
  1214. homeworks.each_with_index do |home, i|
  1215. sheet = book.create_worksheet :name => "第#{i+1}次作业"
  1216. sheet[0,0] = "课程编号"
  1217. sheet[0,1] = course.id
  1218. sheet[1,0] = "课程学期"
  1219. sheet[1,1] = course.time.to_s+"年"+course.term
  1220. sheet[2,0] = "课程名称"
  1221. sheet[2,1] = course.name
  1222. sheet[3,0] = "教师团队"
  1223. sheet[3,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_name}.join('、')
  1224. sheet[4,0] = "主讲教师"
  1225. sheet[4,1] = course.teacher.show_name
  1226. sheet[4,0] = "作业批次"
  1227. sheet[4,1] = "第#{i+1}次作业"
  1228. sheet[4,0] = "作业名称"
  1229. sheet[4,1] = home.name
  1230. if home.homework_type == 1 #普通作业
  1231. if home.anonymous_comment ==0
  1232. sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des),
  1233. l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1234. else
  1235. sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des),
  1236. l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1237. end
  1238. count_row = 6
  1239. items = home.student_works.order("work_score desc")
  1240. items.each_with_index do |stu, j|
  1241. sheet[count_row,0]= j + 1
  1242. sheet[count_row,1] = stu.user.show_name
  1243. sheet[count_row,2] = stu.user.login
  1244. sheet[count_row,3] = stu.user.user_extensions.student_id
  1245. sheet[count_row,4] = stu.name
  1246. sheet[count_row,5] = strip_html stu.description
  1247. sheet[count_row,6] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2)
  1248. sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2)
  1249. if home.anonymous_comment ==0
  1250. sheet[count_row,8] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2)
  1251. sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty
  1252. sheet[count_row,10] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
  1253. sheet[count_row,11] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
  1254. sheet[count_row,12] = format_time(stu.created_at)
  1255. else
  1256. sheet[count_row,8] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
  1257. sheet[count_row,9] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
  1258. sheet[count_row,10] = format_time(stu.created_at)
  1259. end
  1260. count_row += 1
  1261. end
  1262. elsif home.homework_type == 2 #编程作业
  1263. if home.anonymous_comment ==0
  1264. sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des),
  1265. l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1266. else
  1267. sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des),
  1268. l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1269. end
  1270. count_row = 6
  1271. items = home.student_works.order("work_score desc")
  1272. items.each_with_index do |stu, j|
  1273. sheet[count_row,0]= j + 1
  1274. sheet[count_row,1] = stu.user.show_name
  1275. sheet[count_row,2] = stu.user.login
  1276. sheet[count_row,3] = stu.user.user_extensions.student_id
  1277. sheet[count_row,4] = stu.name
  1278. sheet[count_row,5] = stu.description
  1279. sheet[count_row,6] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2)
  1280. sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2)
  1281. sheet[count_row,8] = stu.system_score.nil? ? l(:label_without_score) : stu.system_score.round(2)
  1282. if home.anonymous_comment ==0
  1283. sheet[count_row,9] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2)
  1284. sheet[count_row,10] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty
  1285. sheet[count_row,11] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
  1286. sheet[count_row,12] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
  1287. sheet[count_row,13] = format_time(stu.created_at)
  1288. else
  1289. sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
  1290. sheet[count_row,10] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
  1291. sheet[count_row,11] = format_time(stu.created_at)
  1292. end
  1293. count_row += 1
  1294. end
  1295. elsif home.homework_type == 3 #分组作业
  1296. if home.anonymous_comment ==0
  1297. sheet.row(5).concat([l(:excel_rank),l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des),
  1298. l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1299. else
  1300. sheet.row(5).concat([l(:excel_rank),l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des),
  1301. l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)])
  1302. end
  1303. count_row = 6
  1304. items = home.student_works.order("work_score desc")
  1305. items.each_with_index do |stu, j|
  1306. sheet[count_row,0] = j + 1
  1307. sheet[count_row,1] = get_group_member_names stu
  1308. sheet[count_row,2] = stu.name
  1309. sheet[count_row,3] = (stu.project_id == 0 || stu.project_id.nil?) ? l(:excel_no_project) : stu.project.name
  1310. sheet[count_row,4] = strip_html stu.description
  1311. sheet[count_row,5] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2)
  1312. sheet[count_row,6] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2)
  1313. if home.anonymous_comment ==0
  1314. sheet[count_row,7] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2)
  1315. sheet[count_row,8] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.absence_penalty
  1316. sheet[count_row,9] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
  1317. sheet[count_row,10] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
  1318. sheet[count_row,11] = format_time(stu.created_at)
  1319. else
  1320. sheet[count_row,7] = (home.teacher_priority == 1 && !stu.teacher_score.nil?) ? 0 : stu.late_penalty
  1321. sheet[count_row,8] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2)
  1322. sheet[count_row,9] = format_time(stu.created_at)
  1323. end
  1324. count_row += 1
  1325. end
  1326. end
  1327. end
  1328. =begin
  1329. group0 = CourseGroup.new();
  1330. group0.id = 0;
  1331. group0.name = l(:excel_member_with_out_class)
  1332. groups_dup = groups.dup
  1333. groups_dup << group0
  1334. groups_dup.each do |group|
  1335. sheet1[count_row,0] = l(:excel_class)
  1336. sheet1[count_row,1] = group.name
  1337. count_row += 1
  1338. members.each do |member|
  1339. if member.course_group_id == group.id
  1340. sheet1[count_row,0]= member.user.id
  1341. sheet1[count_row,1] = member.user.lastname.to_s + member.user.firstname.to_s
  1342. sheet1[count_row,2] = member.user.login
  1343. sheet1[count_row,3] = member.user.user_extensions.student_id
  1344. sheet1[count_row,4] = member.user.mail
  1345. sheet1[count_row,5] = format("%0.2f",member.score.nil? ? 0:member.score.to_s)
  1346. count_row += 1
  1347. end
  1348. end
  1349. end
  1350. =end
  1351. book.write xls_report
  1352. xls_report.string
  1353. end
  1354. end

软件技术创新是当今国家整体创新能力的重要基础和发展引擎。近年来,大众参与的软件创新与创业活动已经成为网络时代软件开发和应用的新形态,正在快速改变着全球软件创新模式和软件产业格局。 ...