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 22 kB

​
​
​
​
​
13 years ago
13 years ago
​
​
​
​
​
13 years ago
13 years ago
​
​
​
13 years ago
​
13 years ago
​
13 years ago
13 years ago
​
​
​
​
​
​
13 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
13 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692
  1. class CoursesController < ApplicationController
  2. layout 'base_courses'
  3. include CoursesHelper
  4. helper :activities
  5. helper :members
  6. helper :words
  7. menu_item l(:label_sort_by_time), :only => :index
  8. menu_item l(:label_sort_by_active), :only => :index
  9. menu_item l(:label_sort_by_influence), :only => :index
  10. before_filter :find_course, :except => [ :index, :search,:list, :new,:join,:unjoin, :create, :copy, :statistics, :new_join, :course, :enterprise_course, :course_enterprise,:view_homework_attaches]
  11. before_filter :authorize_course, :only => [:show, :settings, :edit, :update, :modules, :close, :reopen, :view_homework_attaches, :course]
  12. before_filter :authorize_course_global, :only => [:view_homework_attaches, :new,:create]
  13. before_filter :require_admin, :only => [:copy, :archive, :unarchive, :destroy, :calendar]
  14. before_filter :toggleCourse, only: [:finishcourse, :restartcourse]
  15. before_filter :require_login, :only => [:join, :unjoin]
  16. before_filter :allow_join, :only => [:join]
  17. def join
  18. if User.current.logged?
  19. course = Course.find(params[:object_id])
  20. if params[:course_password] == course.password
  21. members = []
  22. members << Member.new(:role_ids => [10], :user_id => User.current.id)
  23. course.members << members
  24. StudentsForCourse.create(:student_id => User.current.id, :course_id => params[:object_id])
  25. @state = 0
  26. else
  27. @state = 1
  28. end
  29. end
  30. respond_to do |format|
  31. # format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
  32. format.js { render :partial => 'set_join', :locals => {:user => User.current, :course => Course.find(params[:object_id]), :object_id => params[:object_id]} }
  33. end
  34. end
  35. def unjoin
  36. if User.current.logged?
  37. @member = Member.where('course_id = ? and user_id = ?', params[:object_id], User.current.id)
  38. @member.first.destroy
  39. joined = StudentsForCourse.where('student_id = ? and course_id = ?', User.current.id, params[:object_id])
  40. joined.each do |join|
  41. join.delete
  42. end
  43. end
  44. respond_to do |format|
  45. # format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
  46. format.js { render :partial => 'set_join', :locals => {:user => User.current, :course => Course.find(params[:object_id]), :object_id => params[:object_id]} }
  47. end
  48. end
  49. #更新课程信息
  50. def update
  51. @course.safe_attributes = params[:course]
  52. @course.class_period = params[:class_period]
  53. if @course.save
  54. if params[:course][:is_public] == '0'
  55. course_status = CourseStatus.find_by_course_id(@course.id)
  56. course_status.destroy if course_status
  57. elsif params[:course][:is_public] == '1'
  58. course_status = CourseStatus.find_by_course_id(@course.id)
  59. course_status.destroy if course_status
  60. course_status = CourseStatus.create(:course_id => @course.id, :grade => 0)
  61. end
  62. respond_to do |format|
  63. format.html {
  64. flash[:notice] = l(:notice_successful_update)
  65. redirect_to settings_course_path(@course)
  66. }
  67. format.api { render_api_ok }
  68. end
  69. else
  70. respond_to do |format|
  71. format.html {
  72. settings
  73. render :action => 'settings'
  74. }
  75. format.api { render_validation_errors(@course) }
  76. end
  77. end
  78. end
  79. def new_join
  80. @course = Course.find(params[:object_id])
  81. end
  82. # 课程搜索
  83. # add by nwb
  84. def search
  85. courses_all = Course.all_course
  86. @courses = courses_all.visible
  87. if params[:name].present?
  88. @courses_all = @courses.like(params[:name])
  89. else
  90. @courses_all = @courses;
  91. end
  92. @course_count = @courses_all.count
  93. @course_pages = Paginator.new @course_count, per_page_option, params['page']
  94. # 课程的动态数
  95. @course_activity_count=Hash.new
  96. @courses_all.each do |course|
  97. @course_activity_count[course.id]=0
  98. end
  99. case params[:course_sort_type]
  100. when '0'
  101. @courses = @courses_all.order("created_at desc")
  102. @s_type = 0
  103. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  104. @course_activity_count=get_course_activity @courses,@course_activity_count
  105. when '1'
  106. @courses = @courses_all.order("course_ac_para desc")
  107. @s_type = 1
  108. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  109. @course_activity_count=get_course_activity @courses,@course_activity_count
  110. when '2'
  111. @courses = @courses_all.order("watchers_count desc")
  112. @s_type = 2
  113. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  114. @course_activity_count=get_course_activity @courses,@course_activity_count
  115. when '3'
  116. @course_activity_count=get_course_activity @courses_all,@course_activity_count_array
  117. @courses=handle_course @courses_all,@course_activity_count
  118. @s_type = 3
  119. @courses = @courses[@course_pages.offset, @course_pages.per_page]
  120. else
  121. @s_type = 0
  122. @courses = @courses_all.order("created_at desc")
  123. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  124. @course_activity_count=get_course_activity @courses,@course_activity_count
  125. end
  126. respond_to do |format|
  127. format.html {
  128. render :layout => 'base'
  129. scope = Course
  130. unless params[:closed]
  131. scope = scope.active
  132. end
  133. }
  134. format.atom {
  135. courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
  136. render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
  137. }
  138. end
  139. end
  140. def member
  141. ## 有角色参数的才是课程,没有的就是项目
  142. @render_file = 'member_list'
  143. @teachers= searchTeacherAndAssistant(@course)
  144. @canShowCode = isCourseTeacher(User.current.id)
  145. case params[:role]
  146. when '1'
  147. @subPage_title = l :label_teacher_list
  148. @members = searchTeacherAndAssistant(@course)
  149. when '2'
  150. @subPage_title = l :label_student_list
  151. @members = searchStudent(@course)
  152. else
  153. @subPage_title = ''
  154. @members = @course.member_principals.includes(:roles, :principal).all.sort
  155. end
  156. @members = paginateHelper @members
  157. render :layout => 'base_courses'
  158. end
  159. #判断指定用户是否为课程教师
  160. def isCourseTeacher(id)
  161. result = false
  162. if @teachers.find_by_user_id(id) != nil
  163. result = true
  164. end
  165. result
  166. end
  167. def handle_course courses, activities
  168. course_activity_count_array=activities.values()
  169. course_array=[]
  170. i=0;
  171. courses.each do |course|
  172. course_array[i]=course
  173. i=i+1
  174. end
  175. courses=desc_sort_course_by_avtivity(course_activity_count_array, course_array)
  176. return courses
  177. end
  178. def settings
  179. @issue_custom_fields = IssueCustomField.sorted.all
  180. @issue_category ||= IssueCategory.new
  181. @member ||= @course.members.new
  182. @trackers = Tracker.sorted.all
  183. end
  184. def create
  185. if User.current.user_extensions.identity
  186. @course = Course.new
  187. @course.extra='course' + DateTime.parse(Time.now.to_s).strftime('%Y-%m-%d_%H-%M-%S').to_s
  188. @course.safe_attributes = params[:course]
  189. @course.tea_id = User.current.id
  190. # added by bai
  191. @course.term = params[:term]
  192. @course.time = params[:time]
  193. #@course.school_id = params[:occupation]
  194. @course.school_id = User.current.user_extensions.school_id
  195. @course.setup_time = params[:setup_time]
  196. @course.endup_time = params[:endup_time]
  197. @course.class_period = params[:class_period]
  198. end
  199. @issue_custom_fields = IssueCustomField.sorted.all
  200. @trackers = Tracker.sorted.all
  201. if User.current.user_extensions.identity == 0
  202. if @course.save
  203. #unless User.current.admin?
  204. r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
  205. m = Member.new(:user => User.current, :roles => [r])
  206. m.project_id = -1
  207. course = CourseInfos.new(:user_id => User.current.id, :course_id => @course.id)
  208. #user_grades = UserGrade.create(:user_id => User.current.id, :course_id => @course.id)
  209. if params[:course][:is_public] == '1'
  210. course_status = CourseStatus.create(:course_id => @course.id, :watchers_count => 0, :changesets_count => 0, :grade => 0, :course_type => @course_tag)
  211. end
  212. @course.members << m
  213. @course.course_infos << course
  214. #end
  215. respond_to do |format|
  216. format.html {
  217. flash[:notice] = l(:notice_successful_create)
  218. if params[:continue]
  219. redirect_to new_course_path(attrs, :course => '0')
  220. elsif params[:course_continue]
  221. redirect_to new_course_path(:course => '1')
  222. else
  223. redirect_to settings_course_path(@course, :course_type => 1)
  224. end
  225. }
  226. format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) }
  227. end
  228. else
  229. @course.destroy
  230. respond_to do |format|
  231. format.html { render :action => 'new', :layout => 'base' } #Added by young
  232. format.api { render_validation_errors(@course) }
  233. end
  234. end
  235. end
  236. end
  237. def course
  238. @school_id = params[:school_id]
  239. per_page_option = 10
  240. if @school_id == "0" or @school_id.nil?
  241. @courses_all = Course.active.visible.
  242. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
  243. where("#{Course.table_name}.course_type = ? ", Course::CourseType_course)
  244. else
  245. @courses_all = Course.active.visible.
  246. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
  247. joins(:course_extra).
  248. where("#{Course.table_name}.course_type = ? AND #{Course.table_name}.school_id = ?", Course::CourseType_course, @school_id)
  249. end
  250. @course_count = @courses_all.count
  251. @course_pages = Paginator.new @course_count, per_page_option, params['page']
  252. #gcm activity count
  253. @course_activity_count=Hash.new
  254. #count initialize
  255. @courses_all.each do |course|
  256. @course_activity_count[course.id]=0
  257. end
  258. #@course_activity_count=get_course_activity @courses_all,@course_activity_count
  259. #gcm end
  260. case params[:course_sort_type]
  261. when '0'
  262. @courses = @courses_all.order("created_on desc")
  263. @s_type = 0
  264. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  265. #gcm
  266. @course_activity_count=get_course_activity @courses,@course_activity_count
  267. #gcmend
  268. when '1'
  269. @courses = @courses_all.order("course_ac_para desc")
  270. @s_type = 1
  271. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  272. #gcm
  273. @course_activity_count=get_course_activity @courses,@course_activity_count
  274. #gcmend
  275. when '2'
  276. @courses = @courses_all.order("watchers_count desc")
  277. @s_type = 2
  278. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  279. #gcm
  280. @course_activity_count=get_course_activity @courses,@course_activity_count
  281. #gcmend
  282. #gcm
  283. when '3'
  284. #gcm
  285. @course_activity_count=get_course_activity @courses_all,@course_activity_count
  286. #gcmend
  287. @courses=handle_course @courses_all,@course_activity_count
  288. @s_type = 3
  289. @courses = @courses[@course_pages.offset, @course_pages.per_page]
  290. else
  291. @s_type = 0
  292. @courses = @courses_all.order("created_on desc")
  293. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  294. #gcm
  295. @course_activity_count=get_course_activity @courses,@course_activity_count
  296. #gcmend
  297. end
  298. respond_to do |format|
  299. format.html {
  300. render :layout => 'base'
  301. }
  302. format.api {
  303. # @offset, @limit = api_offset_and_limit
  304. # @course_count = Course.visible.count
  305. # @courses = Course.visible.offset(@offset).limit(@limit).order('lft').all
  306. }
  307. format.atom {
  308. courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
  309. render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
  310. }
  311. end
  312. end
  313. def new
  314. @course_type = params[:course_type] ||= params[:course]
  315. @issue_custom_fields = IssueCustomField.sorted.all
  316. @trackers = Tracker.sorted.all
  317. @course = Course.new
  318. @course.safe_attributes = params[:course]
  319. render :layout => 'base'
  320. end
  321. def desc_sort_course_by_avtivity(activity_count, courses)
  322. return courses if activity_count.size<2
  323. (activity_count.size-2).downto(0) do |i|
  324. (0..i).each do |j|
  325. if activity_count[j]<activity_count[j+1]
  326. courses[j], courses[j+1]=courses[j+1], courses[j]
  327. activity_count[j], activity_count[j+1]=activity_count[j+1], activity_count[j]
  328. end
  329. end
  330. end
  331. return courses
  332. end
  333. def index
  334. @course_type = params[:course_type]
  335. @school_id = params[:school_id]
  336. per_page_option = 10
  337. if @school_id == "0" or @school_id.nil?
  338. @courses_all = Course.active.visible.
  339. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id")
  340. else
  341. @courses_all = Course.active.visible.
  342. joins("LEFT JOIN #{CourseStatus.table_name} ON #{Course.table_name}.id = #{CourseStatus.table_name}.course_id").
  343. joins(:course_extra).
  344. where("#{Course.table_name}.course_type = ? AND #{Course.table_name}.school_id = ?", Course::CourseType_course, @school_id)
  345. end
  346. @course_count = @courses_all.count
  347. @course_pages = Paginator.new @course_count, per_page_option, params['page']
  348. @course_activity_count=Hash.new
  349. @courses_all.each do |course|
  350. @course_activity_count[course.id]=0
  351. end
  352. case params[:course_sort_type]
  353. when '0'
  354. @courses = @courses_all.order("created_at desc")
  355. @s_type = 0
  356. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  357. @course_activity_count=get_course_activity @courses, @course_activity_count
  358. when '1'
  359. @courses = @courses_all.order("course_ac_para desc")
  360. @s_type = 1
  361. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  362. @course_activity_count=get_course_activity @courses, @course_activity_count
  363. when '2'
  364. @courses = @courses_all.order("watchers_count desc")
  365. @s_type = 2
  366. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  367. @course_activity_count=get_course_activity @courses, @course_activity_count
  368. when '3'
  369. @course_activity_count=get_course_activity @courses_all, @course_activity_count
  370. @courses=handle_course @courses_all, @course_activity_count
  371. @s_type = 3
  372. @courses = @courses[@course_pages.offset, @course_pages.per_page]
  373. else
  374. @s_type = 0
  375. @courses = @courses_all.order("created_at desc")
  376. @courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
  377. @course_activity_count=get_course_activity @courses, @course_activity_count
  378. end
  379. respond_to do |format|
  380. format.html {
  381. render :layout => 'base'
  382. }
  383. format.atom {
  384. courses = Course.visible.order('created_on DESC').limit(Setting.feeds_limit.to_i).all
  385. render_feed(courses, :title => "#{Setting.app_title}: #{l(:label_course_latest)}")
  386. }
  387. end
  388. end
  389. def homework
  390. @offset, @limit = api_offset_and_limit({:limit => 10})
  391. @bids = @course.homeworks.order('deadline DESC')
  392. @bids = @bids.like(params[:name]) if params[:name].present?
  393. @bid_count = @bids.count
  394. @bid_pages = Paginator.new @bid_count, @limit, params['page']
  395. @offset ||= @bid_pages.reverse_offset
  396. unless @offset == 0
  397. @bids = @bids.offset(@offset).limit(@limit).all.reverse
  398. else
  399. limit = @bid_count % @limit
  400. if limit == 0
  401. limit = 10
  402. end
  403. @bids = @bids.offset(@offset).limit(limit).all.reverse
  404. end
  405. render :layout => 'base_courses'
  406. end
  407. # 新建作业
  408. def new_homework
  409. if (User.current.logged? &&
  410. (User.current.admin? ||
  411. (
  412. !Member.where('user_id = ? and course_id = ?', User.current.id, @course.id).first.nil? &&
  413. (
  414. Member.where('user_id = ? and course_id = ?', User.current.id, @course.id).first.roles &&
  415. ( Role.where(id: [3, 4, 7, 9]).size > 0 )
  416. )
  417. )
  418. )
  419. )
  420. @homework = Bid.new
  421. @homework.safe_attributes = params[:bid]
  422. render :layout => 'base_courses'
  423. else
  424. render_404
  425. end
  426. end
  427. def get_course_activity courses, activities
  428. @course_ids=activities.keys()
  429. days = Setting.activity_days_default.to_i
  430. date_to ||= Date.today + 1
  431. date_from = date_to - days-1.years
  432. #file_count
  433. Attachment.where(container_id: @course_ids, container_type: Course).where("created_on>?", date_from).each do |attachment|
  434. activities[attachment.container_id]+=1
  435. end
  436. #message_count
  437. Board.where(course_id: @course_ids).each do |board|
  438. # activities[board.course_id]+=1
  439. activities[board.course_id]+=board.messages.where("updated_on>?", date_from).count
  440. end
  441. #news
  442. News.where(course_id: @course_ids).where("created_on>?",date_from).each do |news|
  443. activities[news.course_id]+=1
  444. end
  445. #feedbackc_count
  446. JournalsForMessage.where(jour_id: @course_ids, jour_type: Course).each do |jourformess|
  447. activities[jourformess.jour_id]+=1
  448. end
  449. #activities!=0
  450. i=0;
  451. courses.each do |course|
  452. id=course.id
  453. if activities[id]==0
  454. activities[id]=1
  455. end
  456. end
  457. return activities
  458. end
  459. def toggleCourse
  460. @course_prefs = Course.find_by_extra(@course.extra)
  461. unless (@course_prefs.teacher == User.current || User.current.admin?)
  462. render_403
  463. end
  464. end
  465. def finishcourse
  466. yesterday = Date.today.prev_day.to_time
  467. @course_prefs.endup_time = yesterday
  468. @save_flag = @course_prefs.save
  469. respond_to do |format|
  470. format.js
  471. end
  472. end
  473. def restartcourse
  474. day = Time.parse("3000-01-01")
  475. @course_prefs.endup_time = day
  476. @save_flag = @course_prefs.save
  477. respond_to do |format|
  478. format.js {
  479. render action:'finishcourse'
  480. }
  481. end
  482. end
  483. def show
  484. # try to redirect to the requested menu item
  485. if params[:jump] && redirect_to_course_menu_item(@course, params[:jump])
  486. return
  487. end
  488. @users_by_role = @course.users_by_role
  489. if(User.find_by_id(CourseInfos.find_by_course_id(@course.id).try(:user_id)))
  490. @user = User.find_by_id(CourseInfos.find_by_course_id(@course.id).user_id)
  491. end
  492. @key = User.current.rss_key
  493. #新增内容
  494. @days = Setting.activity_days_default.to_i
  495. if params[:from]
  496. begin; @date_to = params[:from].to_date + 1; rescue; end
  497. end
  498. has = {
  499. "show_course_files" => true,
  500. "show_course_news" => true,
  501. "show_course_messages" => true,
  502. "show_bids" => true,
  503. "show_course_journals_for_messages" => true
  504. }
  505. @date_to ||= Date.today + 1
  506. @date_from = @date_to - @days-1.years
  507. @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id]))
  508. # 决定显示所用用户或单个用户活动
  509. @activity = Redmine::Activity::Fetcher.new(User.current, :course => @course,
  510. :with_subprojects => false,
  511. :author => @author)
  512. @activity.scope_select {|t| has["show_#{t}"]}
  513. events = @activity.events(@date_from, @date_to)
  514. @offset, @limit = api_offset_and_limit({:limit => 10})
  515. @events_count = events.count
  516. @events_pages = Paginator.new @events_count, @limit, params['page']
  517. @offset ||= @events_pages.offset
  518. events = events.slice(@offset,@limit)
  519. @events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
  520. # documents
  521. @sort_by = %w(category date title author).include?(params[:sort_by]) ? params[:sort_by] : 'category'
  522. #
  523. @teachers= searchTeacherAndAssistant(@course)
  524. @canShowRealName = isCourseTeacher(User.current.id)
  525. if(User.find_by_id(CourseInfos.find_by_course_id(@course.id).try(:user_id)))
  526. @user = User.find_by_id(CourseInfos.find_by_course_id(@course.id).user_id)
  527. end
  528. respond_to do |format|
  529. format.html{render :layout => 'base_courses'}
  530. format.api
  531. end
  532. end
  533. #判断指定用户是否为课程教师
  534. def isCourseTeacher(id)
  535. result = false
  536. if @teachers && @teachers.find_by_user_id(id) != nil
  537. result = true
  538. end
  539. result
  540. end
  541. def feedback
  542. page = params[:page]
  543. # Find the page of the requested reply
  544. @jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
  545. @limit = 10
  546. if params[:r] && page.nil?
  547. offset = @jours.count(:conditions => ["#{JournalsForMessage.table_name}.id > ?", params[:r].to_i])
  548. page = 1 + offset / @limit
  549. end
  550. @feedback_count = @jours.count
  551. @feedback_pages = Paginator.new @feedback_count, @limit, page
  552. @offset ||= @feedback_pages.offset
  553. @jour = @jours[@offset, @limit]
  554. @state = false
  555. respond_to do |format|
  556. format.html{render :layout => 'base_courses'}
  557. format.api
  558. end
  559. end
  560. private
  561. def allow_join
  562. if course_endTime_timeout? Course.find(params[:object_id])
  563. respond_to do |format|
  564. format.js {
  565. @state = 2
  566. render :partial => 'set_join',
  567. :locals => {:user => User.current,
  568. :course => Course.find(params[:object_id]),
  569. :object_id => params[:object_id]
  570. }
  571. }
  572. end
  573. end
  574. end
  575. end

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