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

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