diff --git a/.gitignore b/.gitignore
index af337a4e7..93c7eb248 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@
.rbenv-gemsets
.DS_Store
public/api_doc/
+/.metadata
diff --git a/Gemfile b/Gemfile
index 037c606c8..299af4509 100644
--- a/Gemfile
+++ b/Gemfile
@@ -21,7 +21,8 @@ gem 'acts-as-taggable-on', '2.4.1'
gem 'spreadsheet'
gem 'ruby-ole'
#gem 'email_verifier', path: 'lib/email_verifier'
-
+gem 'rufus-scheduler'
+#gem 'dalli', path: 'lib/dalli-2.7.2'
group :development do
gem 'grape-swagger'
gem 'grape-swagger-ui', git: 'https://github.com/guange2015/grape-swagger-ui.git'
diff --git a/Gemfile.lock b/Gemfile.lock
deleted file mode 100644
index 355ca422d..000000000
--- a/Gemfile.lock
+++ /dev/null
@@ -1,348 +0,0 @@
-GIT
- remote: https://github.com/guange2015/grape-swagger-ui.git
- revision: 4c33439f236c174ae0e774b3435ef2547995c21d
- specs:
- grape-swagger-ui (0.0.4)
- railties (>= 3.1)
-
-PATH
- remote: lib/better_errors
- specs:
- better_errors (1.1.0)
- coderay (>= 1.0.0)
- erubis (>= 2.6.6)
-
-PATH
- remote: lib/rack-mini-profiler
- specs:
- rack-mini-profiler (0.9.1)
- rack (>= 1.1.3)
-
-PATH
- remote: lib/seems_rateable
- specs:
- seems_rateable (1.0.13)
- jquery-rails
- rails
-
-GEM
- remote: http://rubygems.org/
- remote: https://rubygems.org/
- specs:
- actionmailer (3.2.13)
- actionpack (= 3.2.13)
- mail (~> 2.5.3)
- actionpack (3.2.13)
- activemodel (= 3.2.13)
- activesupport (= 3.2.13)
- builder (~> 3.0.0)
- erubis (~> 2.7.0)
- journey (~> 1.0.4)
- rack (~> 1.4.5)
- rack-cache (~> 1.2)
- rack-test (~> 0.6.1)
- sprockets (~> 2.2.1)
- activemodel (3.2.13)
- activesupport (= 3.2.13)
- builder (~> 3.0.0)
- activerecord (3.2.13)
- activemodel (= 3.2.13)
- activesupport (= 3.2.13)
- arel (~> 3.0.2)
- tzinfo (~> 0.3.29)
- activeresource (3.2.13)
- activemodel (= 3.2.13)
- activesupport (= 3.2.13)
- activesupport (3.2.13)
- i18n (= 0.6.1)
- multi_json (~> 1.0)
- acts-as-taggable-on (2.4.1)
- rails (>= 3, < 5)
- arel (3.0.3)
- axiom-types (0.1.1)
- descendants_tracker (~> 0.0.4)
- ice_nine (~> 0.11.0)
- thread_safe (~> 0.3, >= 0.3.1)
- builder (3.0.0)
- capybara (2.4.1)
- mime-types (>= 1.16)
- nokogiri (>= 1.3.3)
- rack (>= 1.0.0)
- rack-test (>= 0.5.4)
- xpath (~> 2.0)
- celluloid (0.16.0)
- timers (~> 4.0.0)
- childprocess (0.5.3)
- ffi (~> 1.0, >= 1.0.11)
- climate_control (0.0.3)
- activesupport (>= 3.0)
- cocaine (0.5.4)
- climate_control (>= 0.0.3, < 1.0)
- coderay (1.0.9)
- coercible (1.0.0)
- descendants_tracker (~> 0.0.1)
- coffee-rails (3.2.2)
- coffee-script (>= 2.2.0)
- railties (~> 3.2.0)
- coffee-script (2.3.0)
- coffee-script-source
- execjs
- coffee-script-source (1.7.1)
- descendants_tracker (0.0.4)
- thread_safe (~> 0.3, >= 0.3.1)
- diff-lcs (1.2.5)
- equalizer (0.0.9)
- erubis (2.7.0)
- execjs (2.2.1)
- factory_girl (4.4.0)
- activesupport (>= 3.0.0)
- faker (1.4.3)
- i18n (~> 0.5)
- fastercsv (1.5.5)
- ffi (1.9.3)
- ffi (1.9.3-x86-mingw32)
- formatador (0.2.5)
- grape (0.9.0)
- activesupport
- builder
- hashie (>= 2.1.0)
- multi_json (>= 1.3.2)
- multi_xml (>= 0.5.2)
- rack (>= 1.3.0)
- rack-accept
- rack-mount
- virtus (>= 1.0.0)
- grape-entity (0.4.4)
- activesupport
- multi_json (>= 1.3.2)
- grape-swagger (0.8.0)
- grape
- grape-entity
- guard (2.11.1)
- formatador (>= 0.2.4)
- listen (~> 2.7)
- lumberjack (~> 1.0)
- nenv (~> 0.1)
- notiffany (~> 0.0)
- pry (>= 0.9.12)
- shellany (~> 0.0)
- thor (>= 0.18.1)
- guard-rspec (2.5.0)
- guard (>= 1.1)
- rspec (~> 2.11)
- hashie (3.3.1)
- hike (1.2.3)
- hitimes (1.2.2)
- hitimes (1.2.2-x86-mingw32)
- htmlentities (4.3.2)
- i18n (0.6.1)
- ice_nine (0.11.0)
- journey (1.0.4)
- jquery-rails (2.0.3)
- railties (>= 3.1.0, < 5.0)
- thor (~> 0.14)
- json (1.8.1)
- kaminari (0.16.1)
- actionpack (>= 3.0.0)
- activesupport (>= 3.0.0)
- libv8 (3.16.14.3)
- listen (2.8.5)
- celluloid (>= 0.15.2)
- rb-fsevent (>= 0.9.3)
- rb-inotify (>= 0.9)
- lumberjack (1.0.9)
- mail (2.5.4)
- mime-types (~> 1.16)
- treetop (~> 1.4.8)
- metaclass (0.0.4)
- method_source (0.8.2)
- mime-types (1.25.1)
- mini_portile (0.6.0)
- mocha (1.1.0)
- metaclass (~> 0.0.1)
- multi_json (1.10.1)
- multi_xml (0.5.5)
- mysql2 (0.3.11)
- mysql2 (0.3.11-x86-mingw32)
- nenv (0.2.0)
- net-ldap (0.3.1)
- nokogiri (1.6.3)
- mini_portile (= 0.6.0)
- nokogiri (1.6.3-x86-mingw32)
- mini_portile (= 0.6.0)
- notiffany (0.0.3)
- nenv (~> 0.1)
- shellany (~> 0.0)
- paperclip (3.5.4)
- activemodel (>= 3.0.0)
- activesupport (>= 3.0.0)
- cocaine (~> 0.5.3)
- mime-types
- polyglot (0.3.5)
- pry (0.9.12.6)
- coderay (~> 1.0)
- method_source (~> 0.8)
- slop (~> 3.4)
- pry (0.9.12.6-x86-mingw32)
- coderay (~> 1.0)
- method_source (~> 0.8)
- slop (~> 3.4)
- win32console (~> 1.3)
- rack (1.4.5)
- rack-accept (0.4.5)
- rack (>= 0.4)
- rack-cache (1.2)
- rack (>= 0.4)
- rack-mount (0.8.3)
- rack (>= 1.0.0)
- rack-openid (1.4.2)
- rack (>= 1.1.0)
- ruby-openid (>= 2.1.8)
- rack-raw-upload (1.1.1)
- multi_json
- rack-ssl (1.3.4)
- rack
- rack-test (0.6.2)
- rack (>= 1.0)
- rails (3.2.13)
- actionmailer (= 3.2.13)
- actionpack (= 3.2.13)
- activerecord (= 3.2.13)
- activeresource (= 3.2.13)
- activesupport (= 3.2.13)
- bundler (~> 1.0)
- railties (= 3.2.13)
- railties (3.2.13)
- actionpack (= 3.2.13)
- activesupport (= 3.2.13)
- rack-ssl (~> 1.3.2)
- rake (>= 0.8.7)
- rdoc (~> 3.4)
- thor (>= 0.14.6, < 2.0)
- rake (10.3.2)
- rb-fsevent (0.9.4)
- rb-inotify (0.9.5)
- ffi (>= 0.5.0)
- rdoc (3.12.2)
- json (~> 1.4)
- ref (1.0.5)
- rich (1.4.6)
- jquery-rails
- kaminari
- mime-types
- paperclip
- rack-raw-upload
- rails (>= 3.2.0)
- sass-rails
- rspec (2.13.0)
- rspec-core (~> 2.13.0)
- rspec-expectations (~> 2.13.0)
- rspec-mocks (~> 2.13.0)
- rspec-core (2.13.1)
- rspec-expectations (2.13.0)
- diff-lcs (>= 1.1.3, < 2.0)
- rspec-mocks (2.13.1)
- rspec-rails (2.13.1)
- actionpack (>= 3.0)
- activesupport (>= 3.0)
- railties (>= 3.0)
- rspec-core (~> 2.13.0)
- rspec-expectations (~> 2.13.0)
- rspec-mocks (~> 2.13.0)
- ruby-ole (1.2.11.7)
- ruby-openid (2.1.8)
- rubyzip (1.1.6)
- sass (3.3.10)
- sass-rails (3.2.6)
- railties (~> 3.2.0)
- sass (>= 3.1.10)
- tilt (~> 1.3)
- selenium-webdriver (2.42.0)
- childprocess (>= 0.5.0)
- multi_json (~> 1.0)
- rubyzip (~> 1.0)
- websocket (~> 1.0.4)
- shellany (0.0.1)
- shoulda (3.5.0)
- shoulda-context (~> 1.0, >= 1.0.1)
- shoulda-matchers (>= 1.4.1, < 3.0)
- shoulda-context (1.2.1)
- shoulda-matchers (2.6.1)
- activesupport (>= 3.0.0)
- slop (3.6.0)
- spreadsheet (1.0.0)
- ruby-ole (>= 1.0)
- sprockets (2.2.2)
- hike (~> 1.2)
- multi_json (~> 1.0)
- rack (~> 1.0)
- tilt (~> 1.1, != 1.3.0)
- therubyracer (0.12.1)
- libv8 (~> 3.16.14.0)
- ref
- thor (0.19.1)
- thread_safe (0.3.4)
- tilt (1.4.1)
- timers (4.0.1)
- hitimes
- treetop (1.4.15)
- polyglot
- polyglot (>= 0.3.1)
- tzinfo (0.3.40)
- uglifier (2.5.1)
- execjs (>= 0.3.0)
- json (>= 1.8.0)
- virtus (1.0.3)
- axiom-types (~> 0.1)
- coercible (~> 1.0)
- descendants_tracker (~> 0.0, >= 0.0.3)
- equalizer (~> 0.0, >= 0.0.9)
- websocket (1.0.7)
- win32console (1.3.2-x86-mingw32)
- xpath (2.0.0)
- nokogiri (~> 1.3)
-
-PLATFORMS
- ruby
- x86-mingw32
-
-DEPENDENCIES
- activerecord-jdbc-adapter (= 1.2.5)
- activerecord-jdbcmysql-adapter
- acts-as-taggable-on (= 2.4.1)
- better_errors!
- builder (= 3.0.0)
- capybara (~> 2.4.1)
- coderay (~> 1.0.6)
- coffee-rails (~> 3.2.1)
- factory_girl (~> 4.4.0)
- faker
- fastercsv (~> 1.5.0)
- grape (~> 0.9.0)
- grape-entity
- grape-swagger
- grape-swagger-ui!
- guard-rspec (= 2.5.0)
- htmlentities
- i18n (~> 0.6.0)
- jquery-rails (~> 2.0.2)
- kaminari
- mocha (~> 1.1.0)
- mysql2 (= 0.3.11)
- net-ldap (~> 0.3.1)
- nokogiri (~> 1.6.3)
- paperclip (~> 3.5.4)
- rack-mini-profiler!
- rack-openid
- rails (= 3.2.13)
- rich (= 1.4.6)
- rspec-rails (= 2.13.1)
- ruby-ole
- ruby-openid (~> 2.1.4)
- sass-rails (~> 3.2.3)
- seems_rateable!
- selenium-webdriver (~> 2.42.0)
- shoulda (~> 3.5.0)
- spreadsheet
- therubyracer
- uglifier (>= 1.0.3)
diff --git a/app/api/mobile/apis/comments.rb b/app/api/mobile/apis/comments.rb
index a7eea735d..75932d60f 100644
--- a/app/api/mobile/apis/comments.rb
+++ b/app/api/mobile/apis/comments.rb
@@ -72,6 +72,31 @@ module Mobile
present :status, 0
end
+ desc ' 意见反馈'
+ params do
+ requires :token, type: String
+ requires :subject,type: String,desc: '意见'
+ end
+ post do
+ cs_params = {
+ memo: {:subject => params[:subject],:content => '该贴来自手机App意见反馈'},
+ }
+ cs = CommentService.new
+ memo = cs.create_feedback cs_params, current_user
+ raise "commit failed #{memo.errors.full_messages}" if memo.new_record?
+ present :status, 0
+ end
+
+ desc '课程留言列表'
+ params do
+ optional :token, type: String
+ end
+ get ':id/course_message' do
+ cs = CommentService.new
+ jours = cs.course_messages params,(current_user.nil? ? User.find(2):current_user)
+ present :data, jours, with: Mobile::Entities::Jours
+ present :status, 0
+ end
end
end
diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb
index 7dbfaffb0..6d68d549a 100644
--- a/app/api/mobile/apis/courses.rb
+++ b/app/api/mobile/apis/courses.rb
@@ -8,10 +8,11 @@ module Mobile
optional :school_id, type: Integer, desc: '传入学校id,返回该学校课程列表'
requires :per_page_count, type: Integer, desc: '每页总数'
requires :page, type: Integer, desc: '当前页码'
+ optional :token, type: String
end
get do
cs = CoursesService.new
- courses = cs.course_list(params)
+ courses = cs.course_list(params,current_user.nil? ? User.find(2):current_user)
present :data, courses, with: Mobile::Entities::Course
present :status, 0
end
@@ -130,10 +131,11 @@ module Mobile
desc "搜索课程"
params do
requires :name, type: String, desc: "课程名"
+ optional :token, type: String
end
get 'search' do
cs = CoursesService.new
- courses = cs.search_course(params)
+ courses = cs.search_course(params,current_user.nil? ? User.find(2):current_user)
present :data, courses, with: Mobile::Entities::Course
present :status, 0
end
@@ -165,13 +167,15 @@ module Mobile
desc "返回单个课程"
params do
requires :id, type: Integer
+ optional :token, type: String
end
route_param :id do
get do
cs = CoursesService.new
course = cs.show_course(params,(current_user.nil? ? User.find(2):current_user))
#course = Course.find(params[:id])
- {status: 0, data: course}
+ present :data, course, with: Mobile::Entities::Course
+ present :status, 0
end
end
@@ -209,7 +213,7 @@ module Mobile
present :status, 0
end
- desc '课程动态'
+ desc '用户课程动态'
params do
requires :token, type: String
end
diff --git a/app/api/mobile/entities/anonymous_works_params.rb b/app/api/mobile/entities/anonymous_works_params.rb
index 95cf9215d..e6bc8f346 100644
--- a/app/api/mobile/entities/anonymous_works_params.rb
+++ b/app/api/mobile/entities/anonymous_works_params.rb
@@ -15,6 +15,7 @@ module Mobile
anonymous_works_params_expose :m_score
anonymous_works_params_expose :is_anonymous_comments
anonymous_works_params_expose :cur_type
+ anonymous_works_params_expose :cur_page
expose :jours ,using: Mobile::Entities::Jours do |f, opt|
if f.is_a?(Hash) && f.key?(:jours)
f[:jours]
diff --git a/app/api/mobile/entities/course.rb b/app/api/mobile/entities/course.rb
index ec00579ce..4c91738c1 100644
--- a/app/api/mobile/entities/course.rb
+++ b/app/api/mobile/entities/course.rb
@@ -1,6 +1,7 @@
module Mobile
module Entities
class Course < Grape::Entity
+ include Redmine::I18n
def self.course_expose(field)
expose field do |f,opt|
c = nil
@@ -9,9 +10,11 @@ module Mobile
else
c = f[:course]
end
- if field == :img_url
+ if f.is_a?(Hash) && f.key?(field)
f[field] if f.is_a?(Hash) && f.key?(field)
#f.img_url if f.respond_to?(:img_url)
+ elsif field == :created_at || field == :updated_at
+ (format_time(c[field]) if (c.is_a?(Hash) && c.key?(field))) || (format_time(c.send(field)) if c.respond_to?(field))
else
(c[field] if (c.is_a?(Hash) && c.key?(field))) || (c.send(field) if c.respond_to?(field))
end
@@ -50,9 +53,11 @@ module Mobile
c[:course].teacher
end
end
- expose :my_homework,using: Mobile::Entities::HomeworkAttach do |f, opt|
+ expose :my_homework,using: Mobile::Entities::Homework do |f, opt|
f[:my_homework] if f.is_a?(Hash) && f.key?(:my_homework)
end
+ course_expose :current_user_is_member
+ course_expose :current_user_is_teacher
end
end
end
diff --git a/app/api/mobile/entities/course_dynamic.rb b/app/api/mobile/entities/course_dynamic.rb
index 11f8c2682..aa8aadbb6 100644
--- a/app/api/mobile/entities/course_dynamic.rb
+++ b/app/api/mobile/entities/course_dynamic.rb
@@ -1,17 +1,24 @@
module Mobile
module Entities
class CourseDynamic < Grape::Entity
+ include Redmine::I18n
def self.course_dynamic_expose(field)
expose field do |c,opt|
- c[field] if (c.is_a?(Hash) && c.key?(field))
+ if field == :update_time
+ (format_time(c[field]) if (c.is_a?(Hash) && c.key?(field)))
+ else
+ c[field] if (c.is_a?(Hash) && c.key?(field))
+ end
+
end
end
-
+ course_dynamic_expose :type
+ course_dynamic_expose :count
course_dynamic_expose :course_name
- course_dynamic_expose :need_anonymous_comments_count
- course_dynamic_expose :student_commit_number
- course_dynamic_expose :news_count
- course_dynamic_expose :message_count
+ course_dynamic_expose :course_id
+ course_dynamic_expose :course_img_url
+ course_dynamic_expose :message
+ course_dynamic_expose :update_time
end
end
end
\ No newline at end of file
diff --git a/app/api/mobile/entities/homework.rb b/app/api/mobile/entities/homework.rb
index 9be9bc53e..d4c34ffec 100644
--- a/app/api/mobile/entities/homework.rb
+++ b/app/api/mobile/entities/homework.rb
@@ -1,10 +1,15 @@
module Mobile
module Entities
class Homework < Grape::Entity
+ include Redmine::I18n
def self.homework_expose(field)
expose field do |f,opt|
if f.is_a?(Hash) && f.key?(field)
- f[field]
+ if field == :created_on
+ format_time(f[field])
+ else
+ f[field]
+ end
elsif f.is_a?(::Bid)
if f.respond_to?(field)
f.send(field)
@@ -18,8 +23,16 @@ module Mobile
homework_expose :id
#课程名称
homework_expose :course_name
- #课程老师
- homework_expose :course_teacher
+
+ homework_expose :course_id
+ #作业发布者
+ expose :author,using: Mobile::Entities::User do |f, opt|
+ f[:author]
+ end
+
+ #作业发布者真名
+ homework_expose :author_real_name
+
#作业次数
homework_expose :homework_times
#作业名称
@@ -36,6 +49,13 @@ module Mobile
#只有作业启用了匿评功能且当前用户是课程老师且已提交的作品数量大于或等于2才能开启匿评
homework_expose :homework_state
+ homework_expose :created_on
+ homework_expose :deadline
+
+ expose :jours,using: Mobile::Entities::Jours do |f, opt|
+ f[:jours] if f.is_a?(Hash) && f.key?(:jours)
+ end
+
expose :homework_for_anonymous_comments,using: Mobile::Entities::HomeworkAttach do |f, opt|
f[:homework_for_anonymous_comments] if f.is_a?(Hash) && f.key?(:homework_for_anonymous_comments)
end
diff --git a/app/api/mobile/entities/homework_jours.rb b/app/api/mobile/entities/homework_jours.rb
index 63c6997fd..0b9defe67 100644
--- a/app/api/mobile/entities/homework_jours.rb
+++ b/app/api/mobile/entities/homework_jours.rb
@@ -6,7 +6,11 @@ module Mobile
def self.homework_jours_expose(field)
expose field do |f,opt|
if f.is_a?(Hash) && f.key?(field)
- f[field]
+ if field == :created_at
+ format_time(f[field])
+ else
+ f[field]
+ end
elsif f.is_a?(::SeemsRateableRates)
end
diff --git a/app/api/mobile/entities/news.rb b/app/api/mobile/entities/news.rb
index 406db59e4..f189771e3 100644
--- a/app/api/mobile/entities/news.rb
+++ b/app/api/mobile/entities/news.rb
@@ -1,6 +1,7 @@
module Mobile
module Entities
class News < Grape::Entity
+ include Redmine::I18n
def self.news_expose(field)
expose field do |f,opt|
if f.is_a?(Hash) && f.key?(field)
@@ -9,13 +10,18 @@ module Mobile
n = f[:news]
comments = f[:comments]
if n.is_a?(::News)
- n.send(field) if n.respond_to?(field)
+ if field == :created_on
+ format_time(n.send(field)) if n.respond_to?(field)
+ else
+ n.send(field) if n.respond_to?(field)
+ end
+
end
end
end
end
-
+ news_expose :id
#新闻标题
news_expose :title
diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb
index ff66b8d46..2cf404ffb 100644
--- a/app/controllers/account_controller.rb
+++ b/app/controllers/account_controller.rb
@@ -125,7 +125,7 @@ class AccountController < ApplicationController
#register_by_email_activation(@user)
unless @user.new_record?
flash[:notice] = l(:notice_account_register_done)
- render action: 'email_valid', locals: {:mail => user.mail}
+ render action: 'email_valid', locals: {:mail => @user.mail}
end
when '3'
#register_automatically(@user)
@@ -315,7 +315,7 @@ class AccountController < ApplicationController
code = /\d*/
#根据home_url生产正则表达式
eval("code = " + "/^" + home_url.gsub(/\//,"\\\/") + "\\\/*(welcome)?\\\/*(\\\/index\\\/*.*)?\$/")
- if code=~params[:back_url] && last_login_on != ''
+ if (code=~params[:back_url] || params[:back_url].to_s.include?('lost_password')) && last_login_on != ''
redirect_to user_activities_path(user)
else
if last_login_on == ''
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index aab9d7b69..c77ebe704 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -322,4 +322,22 @@ class AdminController < ApplicationController
end
end
+ #组织
+ def organization
+ @organizations = Organization.all
+ respond_to do |format|
+ format.html
+ end
+ end
+ #移动端版本管理
+ def mobile_version
+ @versions = PhoneAppVersion.reorder('created_at desc')
+ @new_version = PhoneAppVersion.new
+
+ end
+
+ def create_version
+
+ end
+
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 06e5dac30..1c26ec07e 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -177,6 +177,22 @@ class ApplicationController < ActionController::Base
end
end
+ def logged_user_by_apptoken
+ #从手机端传来apptoken则将当前登陆用户变为对应的用户
+ if params[:apptoken]
+ token = ApiKey.where(access_token: params[:apptoken]).first
+ if token && !token.expired?
+ @current_user = User.find(token.user_id)
+ end
+ unless @current_user.nil?
+ self.logged_user = @current_user
+ if @current_user
+ @current_user.update_column(:last_login_on, Time.now)
+ end
+ end
+ end
+ end
+
# Logs out current user
def logout_user
if User.current.logged?
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 2c6a002b4..252d823e9 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -186,6 +186,10 @@ class AttachmentsController < ApplicationController
@attachment = Attachment.new(:file => request.raw_post)
@attachment.author = User.current
+ if !params[:project].nil?
+ @attachment.container_type = 'Project'
+ @attachment.container_id = params[:project].split("?")[0]
+ end
@attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16)
saved = @attachment.save
diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb
index 7e5894b83..a22012390 100644
--- a/app/controllers/bids_controller.rb
+++ b/app/controllers/bids_controller.rb
@@ -9,7 +9,7 @@ class BidsController < ApplicationController
menu_item :homework_statistics, :only => :homework_statistics
menu_item :edit, :only => :edit
-
+ before_filter :auth_login1, :only => [:show_courseEx]
before_filter :can_show_course,only: []
before_filter :can_show_contest,only: []
diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb
index 383da0bbe..67355fdfa 100644
--- a/app/controllers/boards_controller.rb
+++ b/app/controllers/boards_controller.rb
@@ -57,6 +57,7 @@ class BoardsController < ApplicationController
def show
respond_to do |format|
+ format.js
format.html {
sort_init 'updated_on', 'desc'
sort_update 'created_on' => "#{Message.table_name}.created_on",
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index 61944ca2c..9b66c047f 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -5,6 +5,7 @@ class CoursesController < ApplicationController
helper :members
helper :words
+ before_filter :auth_login1, :only => [:show, :feedback]
menu_item :overview
menu_item :feedback, :only => :feedback
menu_item :homework, :only => :homework
@@ -16,6 +17,7 @@ class CoursesController < ApplicationController
menu_item l(:label_sort_by_influence), :only => :index
before_filter :can_show_course, :except => []
+ before_filter :logged_user_by_apptoken,:only => [:show,:new_homework,:feedback]
before_filter :find_course, :except => [ :index, :search,:list, :new,:join,:unjoin, :create, :copy, :statistics, :new_join, :course, :enterprise_course, :course_enterprise,:view_homework_attaches,:join_private_courses]
before_filter :authorize_course, :only => [:show, :settings, :edit, :update, :modules, :close, :reopen, :view_homework_attaches, :course]
before_filter :authorize_course_global, :only => [:view_homework_attaches, :new,:create]
@@ -98,7 +100,8 @@ class CoursesController < ApplicationController
#更新课程信息
def update
cs = CoursesService.new
- @course = cs.edit_course params,@course,User.current
+ c = cs.edit_course params,@course,User.current
+ @course = c[:course]
if @course.errors.full_messages.count <= 0
respond_to do |format|
format.html {
@@ -498,7 +501,7 @@ class CoursesController < ApplicationController
def create
cs = CoursesService.new
- @course = cs.create_course params,User.current
+ @course = cs.create_course(params,User.current)[:course]
if @course.new_record?
respond_to do |format|
format.html { render :action => 'new', :layout => 'base' } #Added by young
@@ -955,10 +958,34 @@ class CoursesController < ApplicationController
else
render_403
end
-
end
-
+ #根据已有课程复制课程
+ #param id:已有课程ID
+ def copy_course
+ if @course
+ @new_course = Course.new @course.attributes
+ @new_course.tea_id = User.current.id
+ @new_course.created_at = DateTime.now
+ @new_course.updated_at = DateTime.now
+ @new_course.endup_time = nil
+ if @new_course.save
+ r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first
+ m = Member.new(:user => User.current, :roles => [r])
+ m.project_id = -1
+ course = CourseInfos.new(:user_id => User.current.id, :course_id => @new_course.id)
+ #user_grades = UserGrade.create(:user_id => User.current.id, :course_id => @course.id)
+ if @new_course.is_public == 1
+ course_status = CourseStatus.create(:course_id => @new_course.id, :watchers_count => 0, :changesets_count => 0, :grade => 0, :course_type => 1)
+ end
+ @new_course.members << m
+ @new_course.course_infos << course
+ redirect_to settings_course_url @new_course
+ end
+ else
+ render_404
+ end
+ end
private
diff --git a/app/controllers/documents_controller.rb b/app/controllers/documents_controller.rb
index 932ffaa7a..545d61155 100644
--- a/app/controllers/documents_controller.rb
+++ b/app/controllers/documents_controller.rb
@@ -61,6 +61,10 @@ class DocumentsController < ApplicationController
if @project.project_type ==1
render :action => 'show', :layout => 'base_courses'
end
+ respond_to do |format|
+ format.html
+ format.api
+ end
end
def new
diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb
index 56f760e13..474f199a2 100644
--- a/app/controllers/files_controller.rb
+++ b/app/controllers/files_controller.rb
@@ -20,7 +20,7 @@ class FilesController < ApplicationController
layout 'base_projects' #by young
menu_item :files
-
+ before_filter :auth_login1, :only => [:index]
before_filter :find_project_by_project_id#, :except => [:getattachtype]
before_filter :authorize, :except => [:getattachtype,:quote_resource_show,:search]
@@ -148,7 +148,11 @@ class FilesController < ApplicationController
show_attachments @containers
- render :layout => !request.xhr?
+
+ respond_to do |format|
+ format.html
+ format.js
+ end
elsif params[:course_id]
@isproject = false
diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb
index 54b8c6305..2f7092d9a 100644
--- a/app/controllers/forums_controller.rb
+++ b/app/controllers/forums_controller.rb
@@ -15,12 +15,14 @@ class ForumsController < ApplicationController
PageLimit = 20
def create_feedback
if User.current.logged?
- @memo = Memo.new(params[:memo])
- @memo.forum_id = "1"
- @memo.author_id = User.current.id
+ #@memo = Memo.new(params[:memo])
+ #@memo.forum_id = "1"
+ #@memo.author_id = User.current.id
#@forum = @memo.forum
+ cs = CommentService.new
+ @memo = cs.create_feedback params,User.current
respond_to do |format|
- if @memo.save
+ if !@memo.new_record?
format.html { redirect_to forum_path(@memo.forum) }
else
sort_init 'updated_at', 'desc'
diff --git a/app/controllers/homework_attach_controller.rb b/app/controllers/homework_attach_controller.rb
index 2c943e778..ba7e92467 100644
--- a/app/controllers/homework_attach_controller.rb
+++ b/app/controllers/homework_attach_controller.rb
@@ -6,7 +6,7 @@ class HomeworkAttachController < ApplicationController
###############################
before_filter :can_show_course,except: []
#判断当前角色权限时需先找到当前操作的project
- before_filter :find_course_by_bid_id, :only => [:new]
+ before_filter :logged_user_by_apptoken,:find_course_by_bid_id, :only => [:new]
before_filter :find_bid_and_course,:only => [:get_not_batch_homework,:get_batch_homeworks,:get_homeworks,:get_homework_jours, :get_student_batch_homework, :get_my_homework]
before_filter :find_course_by_hoemwork_id, :only => [:edit,:update,:destroy,:show,:add_homework_users,:destory_homework_users, :praise_homework]
#判断当前角色是否有操作权限
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index c0d83fdcd..6a251a80c 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -90,6 +90,7 @@ class IssuesController < ApplicationController
respond_to do |format|
+ format.js
format.html { render :template => 'issues/index', :layout => @project_base_tag }#by young
format.api {
Issue.load_visible_relations(@issues) if include_in_api_response?('relations')
@@ -103,6 +104,7 @@ class IssuesController < ApplicationController
format.html { render(:template => 'issues/index', :layout => @project_base_tag) }#by young
format.any(:atom, :csv, :pdf) { render(:nothing => true) }
format.api { render_validation_errors(@query) }
+ format.js
end
end
rescue ActiveRecord::RecordNotFound
@@ -153,6 +155,8 @@ class IssuesController < ApplicationController
def create
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
@issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads]))
+ # 给该issue在它所在的项目中所有的issues中所在的位置给一个序号
+ @issue.project_issues_index = @issue.project.issues.last.nil? ? 1 : @issue.project.issues.last.project_issues_index + 1
if @issue.save
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format|
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 8d6943f02..d2a253c2a 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -17,6 +17,7 @@
class MessagesController < ApplicationController
include ApplicationHelper
+ before_filter :authorize1, :only => [:show]
menu_item :boards
default_search_scope :messages
before_filter :find_board, :only => [:new, :preview,:edit]
diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb
index 2df17d73f..b44e8a348 100644
--- a/app/controllers/news_controller.rb
+++ b/app/controllers/news_controller.rb
@@ -17,6 +17,7 @@
class NewsController < ApplicationController
layout 'base_projects'# by young
+ before_filter :authorize1, :only => [:show]
default_search_scope :news
model_object News
before_filter :find_model_object, :except => [:new, :create, :index]
diff --git a/app/controllers/organization_controller.rb b/app/controllers/organization_controller.rb
new file mode 100644
index 000000000..db8295e44
--- /dev/null
+++ b/app/controllers/organization_controller.rb
@@ -0,0 +1,55 @@
+class OrganizationController < ApplicationController
+ layout 'project_base'
+ before_filter :require_admin, :except => [:index]
+
+ def index
+ #@projects = Project.find_by_sql("SELECT * FROM projects WHERE id IN (select MAX(id) from projects GROUP BY enterprise_name)")
+ @organizations = Organization.all
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ def new
+ @organizations = Organization.new
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ def create
+ @organizations = Organization.new
+ @organizations.name = params[:organization][:name]
+ if @organizations.save
+ redirect_to admin_organization_url
+ end
+ end
+
+ def edit
+ @organization = Organization.find params[:id]
+ respond_to do |format|
+ format.html
+ end
+ rescue Exception => e
+ render_404
+ end
+
+ def update
+ @organization = Organization.find params[:id]
+ @organization.name = params[:organization][:name]
+ if @organization.save
+ redirect_to admin_organization_url
+ end
+ rescue Exception => e
+ render_404
+ end
+
+ def destroy
+ @organization = Organization.find params[:id]
+ if @organization.destroy
+ redirect_to admin_organization_url
+ end
+ rescue Exception => e
+ render_404
+ end
+end
diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb
deleted file mode 100644
index c9cce5752..000000000
--- a/app/controllers/organizations_controller.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class OrganizationsController < ApplicationController
- layout 'project_base'
- def index
- @projects = Project.find_by_sql("SELECT * FROM projects WHERE id IN (select MAX(id) from projects GROUP BY enterprise_name)")
- end
-end
diff --git a/app/controllers/poll_controller.rb b/app/controllers/poll_controller.rb
index 1b2794034..b897d039a 100644
--- a/app/controllers/poll_controller.rb
+++ b/app/controllers/poll_controller.rb
@@ -23,6 +23,10 @@ class PollController < ApplicationController
def show
@poll = Poll.find params[:id]
+ if @poll.polls_status != 2 && !User.current.allowed_to?(:as_teacher,@course)
+ render_403
+ return
+ end
#已提交问卷的用户不能再访问该界面
if has_commit_poll?(@poll.id,User.current.id) && (!User.current.admin?)
render_403
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 02bfc9e19..052df384e 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -19,7 +19,7 @@
# Description 封装代码,简化代码,格式化代码,
class ProjectsController < ApplicationController
layout :select_project_layout
-
+ before_filter :authorize1, :only => [:show]
menu_item :overview, :only => :show
menu_item :roadmap, :only => :roadmap
menu_item :settings, :only => :settings
@@ -179,6 +179,7 @@ class ProjectsController < ApplicationController
@trackers = Tracker.sorted.all
@project = Project.new
@project.safe_attributes = params[:project]
+ @project.organization_id = params[:organization_id]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
@@ -248,11 +249,23 @@ class ProjectsController < ApplicationController
# Author lizanle
# Description 项目动态展示方法,删除了不必要的代码
def show
+
# 试图跳转到请求的按钮
+ if params[:login]
+ login = params[:login]
+ login = login.sub(/%40/,'@')
+ mail = params[:login]
+ password = params[:password]
+ us = UsersService.new
+ user = us.register_auto(login,mail, password)
+ Member.create(:role_ids => [4], :user_id => user.id,:project_id => @project.id)
+ UserGrade.create(:user_id => user.id, :project_id => @project.id)
+ User.current = user unless User.current.nil?
+ end
if params[:jump] && redirect_to_project_menu_item(@project, params[:jump])
return
end
-
+=begin
cond = @project.project_condition(Setting.display_subprojects_issues?)
has = {
"show_issues" => true ,
@@ -271,35 +284,43 @@ class ProjectsController < ApplicationController
# 时间跨度不能太大,不然很慢,所以删掉了-1.years
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
+=end
+
@author = params[:user_id].blank? ? nil : User.active.find(params[:user_id])
# 决定显示所用用户或单个用户活动
+=begin
@activity = Redmine::Activity::Fetcher.new(User.current,
:project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !has["show_#{t}"].nil?}
+=end
# 根据私密性,取出符合条件的所有数据
if User.current.member_of?(@project) || User.current.admin?
- events = @activity.events(@date_from, @date_to)
+ @events_pages = ForgeActivity.where("project_id = ?",@project).order("created_at desc").page(params['page'|| 1]).per(20);
+ #events = @activity.events(@date_from, @date_to)
else
- events = @activity.events(@date_from, @date_to, :is_public => 1)
+ @events_pages = ForgeActivity.includes(:project).where("forge_activities.project_id = ? and projects.is_public
+ = ?",@project,1).order("created_at desc")
+ .page(params['page'|| 1]).per(10);
+ # @events = @activity.events(@date_from, @date_to, :is_public => 1)
end
-
- @offset, @limit = api_offset_and_limit({:limit => 10})
- @events_count = events.count
- @events_pages = Paginator.new @events_count, @limit, params['page']
- @offset ||= @events_pages.offset
+=begin
+ @events_pages = Paginator.new events.count, 10, params['page']
# 总的数据中取出某一页
- events = events.slice(@offset,@limit)
+ events = events.slice(@events_pages.offset,10)
# 按天分组
@events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
-
+=end
+ boards = @project.boards.includes(:last_message => :author).all
+ @topic_count = @project.boards.count
# 根据对应的请求,返回对应的数据
respond_to do |format|
format.html
format.api
+ format.js
end
end
@@ -311,6 +332,33 @@ class ProjectsController < ApplicationController
@wiki ||= @project.wiki
end
+ def send_mail_to_member
+
+ if !params[:mail].nil? && User.find_by_mail(params[:mail].to_s).nil?
+ email = params[:mail]
+ Mailer.send_invite_in_project(email, @project, User.current).deliver
+ @is_zhuce =false
+ else
+ @is_zhuce = true
+ end
+ respond_to do |format|
+ format.js
+ end
+ end
+ #发送邮件邀请新用户
+ def invite_members_by_mail
+ @is_zhuce =false
+ respond_to do |format|
+ format.html
+ format.js
+ end
+ end
+
+ # 邀请Trustie注册用户
+ def invite_members
+ @member ||= @project.members.new
+ end
+
def edit
end
@@ -393,6 +441,7 @@ class ProjectsController < ApplicationController
def update
@project.safe_attributes = params[:project]
+ @project.organization_id = params[:organization_id]
#@project.dts_test = params[:project][:dts_test]
if validate_parent_id && @project.save
@course = Course.find_by_extra(@project.identifier)
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index a2933c577..e6171bf81 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -18,7 +18,8 @@ class UsersController < ApplicationController
layout :setting_layout
#Added by young
- before_filter :auth_login1, :only => [:show, :user_activities]
+ before_filter :auth_login1, :only => [:show, :user_activities, :user_newfeedback]
+ before_filter :logged_user_by_apptoken, :only => [:show,:user_newfeedback]
menu_item :activity
menu_item :user_information, :only => :info
menu_item :user_course, :only => :user_courses
@@ -408,6 +409,9 @@ class UsersController < ApplicationController
def show
pre_count = 10 #limit
+ # Time 2015-02-04 11:46:34
+ # Author lizanle
+ # Description type 1 :所有动态包括我关注的人 type 2:我的动态 type 3:关于我的回复
case params[:type]
when "1"
if @user == User.current
@@ -428,26 +432,35 @@ class UsersController < ApplicationController
messages = message.sort {|x,y| y.created_on <=> x.created_on }
@message = messages[@info_pages.offset, @info_pages.per_page]
@state = 2
- else
+ else
+ # Time 2015-02-04 10:50:49
+ # Author lizanle
+ # Description 所有动态
where_condition = nil;
# where_condition = "act_type <> 'JournalsForMessage'"
if @user == User.current
watcher = User.watched_by(@user)
watcher.push(User.current)
- activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
+ activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
else
- activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc')
+ activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc')
end
-
+ activity = activity.reject { |e|
+ !User.current.admin? &&
+ (((e.act_type == "Issue") && !e.act.project.visible?(User.current)) ||
+ (e.act_type == "Bid" && !e.act.courses.first.nil? && e.act.courses.first.is_public == 0 && !User.current.member_of_course?(e.act.courses.first)) ||
+ (e.act_type == "Journal" && e.act.respond_to?("Project") && !e.act.project.visible?(User.current)) ||
+ (e.act_type == "News" && ((!e.act.project.nil? && !e.act.project.visible?(User.current)) || (!e.act.course.nil? && e.act.course.is_public == 0 && !User.current.member_of_course?(e.act.course)))) ||
+ (e.act_type == "Message" && !e.act.board.nil? && ((!e.act.board.project.nil? && !e.act.board.project.visible?(User.current)) || (!e.act.board.course.nil? && e.act.board.course.is_public == 0 && !User.current.member_of_course?(e.act.board.course)))))
+ }
@activity_count = activity.count
@activity_pages = Paginator.new @activity_count, pre_count, params['page']
- activity_page = activity.slice(@activity_pages.offset,@activity_pages.per_page * 2)
- activity_page = activity_page.reject { |e|
- ((e.act_type=="Issue") && ( !e.act.visible?(User.current))) ||
- ((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) ||
- ((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?)))
- }
- @activity = activity.slice(0,@activity_pages.per_page)
+ @activity = activity.slice(@activity_pages.offset,@activity_pages.per_page)
+ # @activity = @activity.reject { |e|
+ # ((e.act_type=="Issue") && ( !e.act.visible?(User.current))) ||
+ # ((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) ||
+ # ((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?)))
+ # }
@state = 0
end
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index 3ae5538e9..290af0068 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -27,28 +27,31 @@ class WelcomeController < ApplicationController
def index
# 企业版定制: params[:project]为传过来的参数
unless params[:organization].nil?
- @cur_projects = Project.find(params[:organization])
- @organization = @cur_projects.enterprise_name
- @organization_projects = (current_user.admin? || User.current.member_of?(@cur_projects)) ? Project.where("enterprise_name =? ", @organization) : Project.all_public.where("enterprise_name =? ", @organization)
- @e_count = @organization_projects.count
- @part_projects = []
- # 取十个
- @organization_projects.each do |obj|
- break if(@organization_projects[10] == obj)
- @part_projects << Project.visible.find_by_id("#{obj.id}") unless obj.id.nil?
- end
- # 不够十个的用最火项目替代
- @e_count < 9 ? @part_projects = find_miracle_project( 9 - @e_count, 3,"score desc") : @part_projects
- # 配置文件首页定制
+ @organization = Organization.find params[:organization]
+ @organization_projects = Project.visible.joins(:project_status).joins("LEFT JOIN project_scores ON projects.id = project_scores.project_id").where("projects.organization_id = ?", @organization.id).order("score DESC").limit(10).all
+ @part_projects = @organization_projects.count < 9 ? find_miracle_project( 9 - @organization_projects.count, 3,"score desc") : []
+ # @cur_projects = Project.find(params[:organization])
+ # @organization = @cur_projects.enterprise_name
+ # @organization_projects = (current_user.admin? || User.current.member_of?(@cur_projects)) ? Project.where("enterprise_name =? ", @organization) : Project.all_public.where("enterprise_name =? ", @organization)
+ # @e_count = @organization_projects.count
+ # @part_projects = []
+ # # 取十个
+ # @organization_projects.each do |obj|
+ # break if(@organization_projects[10] == obj)
+ # @part_projects << Project.visible.find_by_id("#{obj.id}") unless obj.id.nil?
+ # end
+ # # 不够十个的用最火项目替代
+ # @e_count < 9 ? @part_projects = find_miracle_project( 9 - @e_count, 3,"score desc") : @part_projects
+ # # 配置文件首页定制
@enterprise_page = FirstPage.find_by_page_type('enterprise')
if @enterprise_page.nil?
@enterprise_page = FirstPage.new
@enterprise_page.page_type = 'enterprise'
end
- # 主页配置部分结束
-
+ # 主页配置部分结束
end
# end 企业版定制结束
+
if @first_page.nil? || @first_page.sort_type.nil?
@projects = find_miracle_project(10, 3,"score desc")
else
@@ -74,7 +77,8 @@ class WelcomeController < ApplicationController
@projects = @projects_all.order("score desc")
end
end
-
+ rescue Exception => e
+ render_404
end
def robots
@@ -84,7 +88,7 @@ class WelcomeController < ApplicationController
def course
@course_page = FirstPage.find_by_page_type('course')
- @school_id = params[:school_id] || User.current.user_extensions.school.try(:id)
+ @school_id = params[:school_id] || User.current.user_extensions.school.try(:id) || 117
@logoLink ||= logolink()
##3-8月份为查找春季课程,9-2月份为查找秋季课程
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 5579fe79b..30b2e7a21 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -48,7 +48,7 @@ module ApplicationHelper
def authorize_for(controller, action)
User.current.allowed_to?({:controller => controller, :action => action}, @project)
end
-
+
# add by nwb
def authorize_for_course(controller, action)
User.current.allowed_to?({:controller => controller, :action => action}, @course)
@@ -1841,7 +1841,7 @@ module ApplicationHelper
# course_all_course_link = link_to l(:label_course_all), {:controller => 'courses', :action => 'index'}
course_teacher_all_link = link_to l(:label_teacher_all), {:controller => 'users', :action => 'index', :role => 'teacher', :host => Setting.course_domain}
# courses_link = link_to l(:label_course_practice), {:controller => 'courses', :action => 'index'}
- users_link = link_to l(:label_software_user), {:controller => 'users', :action => 'index', :host => Setting.user_domain}
+ #users_link = link_to l(:label_software_user), {:controller => 'users', :action => 'index', :host => Setting.user_domain}
# contest_link = link_to l(:label_contest_innovate), {:controller => 'contests', :action => 'index'}
bids_link = link_to l(:label_requirement_enterprise), {:controller => 'bids', :action => 'index'}
forum_link = link_to l(:label_forum_all), {:controller => "forums", :action => "index"}
@@ -1860,7 +1860,7 @@ module ApplicationHelper
nav_list.push(courses_link) if @nav_dispaly_course_label && @show_course == 1
# nav_list.push(projects_link) if @nav_dispaly_project_label
- nav_list.push(users_link) if @nav_dispaly_user_label
+ #nav_list.push(users_link) if @nav_dispaly_user_label
# nav_list.push(contest_link) if @nav_dispaly_contest_label && @show_contest == 1
nav_list.push(bids_link) if @nav_dispaly_bid_label
nav_list.push(forum_link) if @nav_dispaly_forum_label
diff --git a/app/helpers/expire_helper.rb b/app/helpers/expire_helper.rb
deleted file mode 100644
index 0a9cab69c..000000000
--- a/app/helpers/expire_helper.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-module ExpireHelper
- #index.html 中 “projects”塊 緩存過期
- def expire_project_cache
- ActionController::Base.new.expire_fragment('projects')
- end
-
- #index.html 中 “activities”塊 緩存過期
- def expire_activitie_cache
- ActionController::Base.new.expire_fragment('activities')
- end
-
- #welcome/index.html 中 “forums”塊 緩存過期
- def expire_forum_cache
- ActionController::Base.new.expire_fragment('forums')
- end
-end
diff --git a/app/helpers/homework_attach_helper.rb b/app/helpers/homework_attach_helper.rb
index 0b98283ff..72d381b28 100644
--- a/app/helpers/homework_attach_helper.rb
+++ b/app/helpers/homework_attach_helper.rb
@@ -140,8 +140,6 @@ module HomeworkAttachHelper
#######################################################
def get_student_not_batch_homework_list bid,user
HomeworkAttach.find_by_sql("SELECT * FROM(SELECT homework_attaches.*,
- (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1) AS t_score,
- (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score,
(SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{user.id} AND is_teacher_score = 0) AS m_score
FROM homework_attaches
INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index fe6714186..3c1663fcb 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -371,4 +371,19 @@ module ProjectsHelper
return projects
end
+
+ def project_organizations_id_option
+ type = []
+ option1 = []
+ option1 << l(:label_organization_choose)
+ option1 << 0
+ type << option1
+ Organization.all.each do |org|
+ option = []
+ option << org.name
+ option << org.id
+ type << option
+ end
+ type
+ end
end
diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb
index 842e1f1b7..971bf603d 100644
--- a/app/helpers/watchers_helper.rb
+++ b/app/helpers/watchers_helper.rb
@@ -31,7 +31,7 @@ module WatchersHelper
watched = objects.any? {|object| object.watched_by?(user)}
@watch_flag = (objects.first.instance_of?(User) or objects.first.instance_of?(Project) or objects.first.instance_of?(Contest) or (objects.first.instance_of?(Bid)))
- css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) :
+ css = @watch_flag ? ([watcher_css(objects), watched ? 'icon ' : 'icon '].join(' ') << options[0].to_s) :
([watcher_css(objects), watched ? 'icon icon-fav ' : 'icon icon-fav-off '].join(' ') << options[0].to_s)
text = @watch_flag ?
@@ -283,6 +283,6 @@ module WatchersHelper
def exit_project_link(project)
link_to(l(:label_exit_project),exit_cur_project_path(project.id),
- :remote => true, :confirm => l(:lable_sure_exit_project) )
+ :remote => true, :confirm => l(:lable_sure_exit_project), :style => "color: #fff; display:block; padding: 0px 5px;margin-right:10px;height:22px;background:none repeat scroll 0% 0% #64BDD9;TES" )
end
end
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index de7912667..7ac7d786d 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -25,7 +25,9 @@ class Attachment < ActiveRecord::Base
belongs_to :softapplication, foreign_key: 'container_id', conditions: "attachments.container_type = 'Softapplication'"
belongs_to :author, :class_name => "User", :foreign_key => "author_id"
belongs_to :attachmentstype, :foreign_key => "attachtype",:primary_key => "id"
-
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # end
include UserScoreHelper
validates :filename, presence: true, length: {maximum: 254}
@@ -70,7 +72,7 @@ class Attachment < ActiveRecord::Base
@@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails")
before_save :files_to_final_location
- after_create :be_user_score # user_score
+ after_create :be_user_score ,:act_as_forge_activity# user_score
after_update :be_user_score
after_destroy :delete_from_disk,:down_user_score
@@ -529,4 +531,14 @@ class Attachment < ActiveRecord::Base
end
end
+ # Time 2015-03-02 17:42:48
+ # Author lizanle
+ # Description 上传该项目的文档资料也要保存一份在公共表中
+ def act_as_forge_activity
+ if self.container_type == 'Project'
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.container_id)
+ end
+ end
+
end
diff --git a/app/models/bid.rb b/app/models/bid.rb
index eb7e5d83f..e5de47b24 100644
--- a/app/models/bid.rb
+++ b/app/models/bid.rb
@@ -17,7 +17,6 @@ class Bid < ActiveRecord::Base
HomeworkProject = 2
attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type, :password
include Redmine::SafeAttributes
- include ExpireHelper
belongs_to :author, :class_name => 'User', :foreign_key => :author_id
belongs_to :course
@@ -33,12 +32,6 @@ class Bid < ActiveRecord::Base
has_many :join_in_contests, :dependent => :destroy
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
# has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}"
-
-
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
-
acts_as_attachable
NAME_LENGTH_LIMIT = 60
diff --git a/app/models/changeset.rb b/app/models/changeset.rb
index 101647824..e05a7d2da 100644
--- a/app/models/changeset.rb
+++ b/app/models/changeset.rb
@@ -16,7 +16,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Changeset < ActiveRecord::Base
- include ExpireHelper
belongs_to :repository
belongs_to :user
include UserScoreHelper
@@ -65,9 +64,8 @@ class Changeset < ActiveRecord::Base
includes(:repository => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args))
}
- after_create :scan_for_issues,:refresh_changests,:expire_activitie_cache#:be_user_score # user_score
- after_update :be_user_score,:expire_activitie_cache
- before_destroy :expire_activitie_cache
+ after_create :scan_for_issues,:refresh_changests#:be_user_score # user_score
+ after_update :be_user_score
after_destroy :down_user_score
before_create :before_create_cs
diff --git a/app/models/contest_notification.rb b/app/models/contest_notification.rb
index 0ccd0d5a7..71c448f65 100644
--- a/app/models/contest_notification.rb
+++ b/app/models/contest_notification.rb
@@ -1,10 +1,6 @@
class ContestNotification < ActiveRecord::Base
- include ExpireHelper
attr_accessible :content, :title
validates :title, length: {maximum: 30}
- after_create :expire_forum_cache
- after_update :expire_forum_cache
- before_destroy :expire_forum_cache
end
diff --git a/app/models/document.rb b/app/models/document.rb
index 48a0151eb..33ffdaa2f 100644
--- a/app/models/document.rb
+++ b/app/models/document.rb
@@ -17,18 +17,16 @@
class Document < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
belongs_to :project
belongs_to :user
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
include UserScoreHelper
after_save :be_user_score # user_score
after_destroy :down_user_score
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
acts_as_attachable :delete_permission => :delete_documents
-
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # end
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"},
#:author => Proc.new {|o| o.attachments.reorder("#{Attachment.table_name}.created_on ASC").first.try(:author) },
@@ -39,7 +37,7 @@ class Document < ActiveRecord::Base
validates_presence_of :project, :title, :category
validates_length_of :title, :maximum => 60
-
+ after_create :act_as_forge_activity
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_documents, *args))
}
@@ -81,5 +79,12 @@ class Document < ActiveRecord::Base
update_document(self.user,2,self.project)
end
+ # Time 2015-03-02 10:51:16
+ # Author lizanle
+ # Description 新创建的document要在公共表ForgeActivity中记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
+ :project_id => self.project_id)
+ end
end
diff --git a/app/models/forge_activity.rb b/app/models/forge_activity.rb
new file mode 100644
index 000000000..e94a29867
--- /dev/null
+++ b/app/models/forge_activity.rb
@@ -0,0 +1,22 @@
+# Time 2015-02-06 10:42:34
+# Author lizanle
+# Description 这是保存Project相关的动态的公共表
+class ForgeActivity < ActiveRecord::Base
+ # 公共表中活动类型,命名规则:TYPE_OF_{类名}_ACT
+ TYPE_OF_ISSUE_ACT = "Issue"
+ TYPE_OF_MESSAGE_ACT = "Message"
+ TYPE_OF_ATTACHMENT_ACT = "Attachment"
+ TYPE_OF_DOCUMENT_ACT = "Document"
+ TYPE_OF_JOURNAL_ACT = "Journal"
+ TYPE_OF_WIKI_ACT = "Wiki"
+ TYPE_OF_NEWS_ACT = "News"
+ attr_accessible :forge_act_id, :forge_act_type,:project_id,:user_id,:org_id
+ # 虚拟关联
+ belongs_to :forge_act ,:polymorphic => true
+ belongs_to :project
+ belongs_to :user
+ validates :user_id,presence: true
+ validates :project_id,presence: true
+ validates :forge_act_id,presence: true
+ validates :forge_act_type, presence: true
+end
diff --git a/app/models/forum.rb b/app/models/forum.rb
index baa8e6260..878937ea7 100644
--- a/app/models/forum.rb
+++ b/app/models/forum.rb
@@ -1,13 +1,8 @@
class Forum < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
has_many :topics, :class_name => 'Memo', :conditions => "#{Memo.table_name}.parent_id IS NULL", :order => "#{Memo.table_name}.created_at DESC", :dependent => :destroy
has_many :memos, :dependent => :destroy, conditions: "parent_id IS NULL"
belongs_to :creator, :class_name => "User", :foreign_key => 'creator_id'
-
- after_create :expire_forum_cache
- after_update :expire_forum_cache
- before_destroy :expire_forum_cache
safe_attributes 'name',
'description',
'topic_count',
diff --git a/app/models/forum_observer.rb b/app/models/forum_observer.rb
index 1c514d6ab..6afcac824 100644
--- a/app/models/forum_observer.rb
+++ b/app/models/forum_observer.rb
@@ -1,8 +1,8 @@
class ForumObserver < ActiveRecord::Observer
- def after_create(forum)
- Thread.start do
- Mailer.forum_add(forum).deliver if Setting.notified_events.include?('forum_add')
- end
-
- end
+ # def after_create(forum)
+ # Thread.start do
+ # Mailer.forum_add(forum).deliver if Setting.notified_events.include?('forum_add')
+ # end
+ #
+ # end
end
diff --git a/app/models/issue.rb b/app/models/issue.rb
index a7b1a5943..c2670a0cc 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -19,7 +19,6 @@ class Issue < ActiveRecord::Base
include Redmine::SafeAttributes
include Redmine::Utils::DateCalculation
include UserScoreHelper
- include ExpireHelper
belongs_to :project
belongs_to :tracker
belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
@@ -46,6 +45,8 @@ class Issue < ActiveRecord::Base
# added by fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
@@ -64,7 +65,9 @@ class Issue < ActiveRecord::Base
},
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o}},
:type => Proc.new {|o| 'issue' + (o.closed? ? ' closed' : '') }
-
+ # Time 2015-01-31 13:52:53
+ # Author lizanle
+ # Description 将hash传进去
acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]},
:author_key => :author_id
@@ -77,12 +80,9 @@ class Issue < ActiveRecord::Base
attr_reader :current_journal
# fq
- after_create :act_as_activity,:be_user_score_new_issue
+ after_create :act_as_activity,:be_user_score_new_issue,:act_as_forge_activity
after_update :be_user_score
after_destroy :down_user_score
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
# after_create :be_user_score
# end
@@ -129,7 +129,15 @@ class Issue < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.author_id)
end
# end
-
+
+ # Time 2015-02-26 10:51:16
+ # Author lizanle
+ # Description 新创建的issue要在公共表ForgeActivity中记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.project_id)
+ end
+ # end
# Returns a SQL conditions string used to find all issues visible by the specified user
@@ -1168,13 +1176,13 @@ class Issue < ActiveRecord::Base
# back string obj which is belong to project.
def source_from
- "" << self.project.name.to_s <<
- "#" << project_index
+ "" << self.project.name.to_s
end
def project_index
if self.project.issues.include?(self)
(self.project.issues.index(self).to_i + 1).to_s
+
else
issue_index = 1
self.project.issues.each do |issue|
@@ -1185,8 +1193,10 @@ class Issue < ActiveRecord::Base
issue_index = issue_index+1
end
end
+
issue_index.to_s
end
+
end
private
diff --git a/app/models/journal.rb b/app/models/journal.rb
index a386c2b80..3b660132e 100644
--- a/app/models/journal.rb
+++ b/app/models/journal.rb
@@ -27,6 +27,8 @@ class Journal < ActiveRecord::Base
# added by fq
has_one :journal_reply
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
attr_accessor :indice
@@ -46,7 +48,7 @@ class Journal < ActiveRecord::Base
before_create :split_private_notes
# fq
- after_save :act_as_activity,:be_user_score
+ after_save :act_as_activity,:be_user_score,:act_as_forge_activity
# end
#after_destroy :down_user_score
#before_save :be_user_score
@@ -156,6 +158,15 @@ class Journal < ActiveRecord::Base
end
# end
+ # Time 2015-02-27 13:30:19
+ # Author lizanle
+ # Description 公共表中需要保存一份该记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
+ :project_id => self.issue.project.id)
+
+ end
+
# 更新用户分数 -by zjc
def be_user_score
#新建了缺陷留言且留言不为空,不为空白
diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb
index c71fbaf47..23d9c7753 100644
--- a/app/models/journals_for_message.rb
+++ b/app/models/journals_for_message.rb
@@ -4,7 +4,6 @@
class JournalsForMessage < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
- include ExpireHelper
safe_attributes "jour_type", # 留言所属类型
"jour_id", # 留言所属类型的id
"notes", # 留言内容
@@ -22,8 +21,8 @@ class JournalsForMessage < ActiveRecord::Base
:foreign_key => 'jour_id',
:conditions => "#{self.table_name}.jour_type = 'Project' "
belongs_to :course,
- :foreign_key => 'jour_id',
- :conditions => "#{self.table_name}.jour_type = 'Course' "
+ :foreign_key => 'jour_id'
+
belongs_to :jour, :polymorphic => true
belongs_to :user
@@ -55,9 +54,7 @@ class JournalsForMessage < ActiveRecord::Base
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
validates :notes, presence: true
- after_create :act_as_activity ,:expire_activitie_cache#huang
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
+ after_create :act_as_activity #huang
after_create :reset_counters!
after_destroy :reset_counters!
after_save :be_user_score
diff --git a/app/models/mailer.rb b/app/models/mailer.rb
index 2cae982a7..b404ea531 100644
--- a/app/models/mailer.rb
+++ b/app/models/mailer.rb
@@ -27,21 +27,105 @@ class Mailer < ActionMailer::Base
{ :host => Setting.host_name, :protocol => Setting.protocol }
end
- # 贴吧新建贴吧发送邮件
- # example Mailer.forum(forum).deliver
- def forum_add(forum)
+ # author: alan
+ # 发送邀请未注册用户加入项目邮件
+ # 功能: 在加入项目的同时自动注册用户
+ def send_invite_in_project(email, project, invitor)
+ @email = email
+ @subject = "#{invitor.name} #{l(:label_invite_project)} #{project.name} "
+ @password = newpass(6)
+ @project_url = url_for(:controller => 'projects', :action => 'show', :id => project.id,
+ :password => @password, :login => email)
+ mail :to => email, :subject => @subject
+ end
- redmine_headers 'Forum' => forum.id
- @forum = forum
- @author = forum.creator
- recipients = forum.creator.mail
- # cc = wiki_content.page.wiki.watcher_recipients - recipients
- @issue_author_url = url_for(user_activities_url(@author))
- @forum_url = url_for(:controller => 'forums', :action => 'show', :id => forum.id)
- mail :to => recipients,:subject => "[ #{l(:label_forum)} : #{forum.name} #{l(:notice_successful_create)}]"
+ # author: alan
+ # 根据用户选择发送个人日报或周报
+ # 发送内容: 项目【缺陷,讨论区,新闻】,课程【通知,留言,新闻】, 贴吧, 个人留言
+ def send_for_user_activities(user, date_to, days)
+ date_from = date_to - days.days
+
+ # 生成token用于直接点击登录
+ @user = user
+ token = Token.new(:user =>user , :action => 'autologin')
+ token.save
+ @token = token
+
+ @user_url = url_for(my_account_url(user,:token => @token.value))
+ # 查询user参加的项目及课程
+ projects = user.projects
+ courses = user.courses
+ project_ids = projects.map{|project| project.id}.join(",")
+ course_ids = courses.map {|course| course.id}.join(",")
+
+ # 查询user的缺陷,包括发布的,跟踪的以及被指派的缺陷
+ @issues = Issue.find_by_sql("select DISTINCT i.* from issues i, watchers w
+ where (i.assigned_to_id = #{user.id} or i.author_id = #{user.id}
+ or (w.watchable_type = 'Issue' and w.watchable_id = i.id and w.user_id = #{user.id}))
+ and (i.created_on between '#{date_from}' and '#{date_to}') order by i.created_on desc")
+
+ # @bids 查询课程作业,包括老师发布的作业,以及user提交作业
+ # @attachments查询课程课件更新
+ @attachments ||= []
+
+ @bids ||= [] # 老师发布的作业
+
+ unless courses.first.nil?
+ count = courses.count
+ count = count - 1
+ for i in 0..count do
+ bids = courses[i].homeworks.where("bids.created_on between '#{date_from}' and '#{date_to}'").order("bids.created_on desc")
+ attachments = courses[i].attachments.where("attachments.created_on between '#{date_from}' and '#{date_to}'").order('attachments.created_on DESC')
+ @bids += bids if bids.count > 0
+ @attachments += attachments if attachments.count > 0
+ end
+ end
+ # user 提交的作业
+ @homeworks = HomeworkAttach.where("user_id=#{user.id} and (created_at between '#{date_from}' and '#{date_to}')").order("created_at desc")
+
+ # 查询user在课程。项目中发布的讨论帖子
+ messages = Message.find_by_sql("select DISTINCT * from messages where author_id = #{user.id} and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc")
+ @course_messages ||= []
+ @project_messages ||= []
+ unless messages.first.nil?
+ messages.each do |msg|
+ if msg.project
+ @project_messages << msg
+ elsif msg.course
+ @course_messages << msg
+ end
+ end
+ end
+ # 查询user在课程中发布的通知,项目中发的新闻
+ @course_news = News.find_by_sql("select DISTINCT n.* from news n
+ where n.course_id in (#{course_ids})
+ and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc")
+ @project_news = News.find_by_sql("select DISTINCT n.* from news n where n.project_id in (#{project_ids})
+ and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc")
+
+ # 查询user在课程及个人中留言
+ @course_journal_messages = JournalsForMessage.find_by_sql("select DISTINCT * from journals_for_messages where
+ jour_type='Course' and user_id = #{user.id}
+ and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc")
+ @user_journal_messages = user.journals_for_messages.where("m_parent_id IS NULL and (created_on between '#{date_from}' and '#{date_to}')").order('created_on DESC')
+
+
+ # 查询user新建贴吧或发布帖子
+ @forums = Forum.find_by_sql("select DISTINCT * from forums where creator_id = #{user.id} and (created_at between '#{date_from}' and '#{date_to}') order by created_at desc")
+ @memos = Memo.find_by_sql("select DISTINCT m.* from memos m, forums f where (m.author_id = #{user.id} or (m.forum_id = f.id and f.creator_id = #{user.id}))
+ and (m.created_at between '#{date_from}' and '#{date_to}') order by m.created_at desc")
+ if days == 1
+ subject = "[ #{user.show_name} : #{l(:label_day_mail)}]"
+ @subject = " #{user.show_name} : #{date_to - 1.days} #{l(:label_day_mail)}"
+ else
+ subject = "[ #{user.show_name} : #{l(:label_week_mail)}]"
+ @subject = "#{user.show_name} : #{l(:label_week_mail)}"
+ end
+ mail :to => user.mail,:subject => subject
end
+
def forum_message_added(memo)
@memo = memo
redmine_headers 'Memo' => memo.id
@@ -50,15 +134,12 @@ class Mailer < ActionMailer::Base
@forum_url = url_for(:controller => 'forums', :action => 'show', :id => @forum.id)
@issue_author_url = url_for(user_activities_url(@author))
recipients ||= []
- # if !memo.parent_id.nil?
- # mems = memo.self_and_siblings
- # mems.each do |mem|
- # recipients << mem.author.mail unless recipients.include? mem.author.mail
- # end
- # else
- # recipients << memo.author.mail
- # end
- recipients << @author.mail
+ if @forum.author.mail_notification != 'day' && @forum.author.mail_notification != 'week'
+ recipients << @forum.creator.mail
+ end
+ if @author.mail_notification != 'day' && @author.mail_notification != 'week'
+ recipients << @author.mail
+ end
# cc = wiki_content.page.wiki.watcher_recipients - recipients
@memo_url = url_for(forum_memo_url(@forum, (@memo.parent_id.nil? ? @memo : @memo.parent_id)))
@@ -93,6 +174,17 @@ class Mailer < ActionMailer::Base
Rails.logger.error "[Builds a Mail::Message ERROR] journalsForMessage's jour is unkown type, journalsForMessage.id = #{journals_for_message.id}"
return -1
end
+
+ # 验证用户的收取邮件的方式
+ recipients ||= []
+ recipients1 ||= []
+ if @mail.mail_notification != 'week' && @mail.mail_notification != 'day'
+ recipients1 = @mail.mail
+ end
+ if journals_for_message.jour.author.mail_notification != 'week' && journals_for_message.jour.author.mail_notification != 'day'
+ recipients = journals_for_message.jour.author.mail
+ end
+
# modify by nwb
#如果是直接留言并且留言对象是课程
if !journals_for_message.at_user && journals_for_message.jour.class.to_s.to_sym == :Course
@@ -103,7 +195,9 @@ class Mailer < ActionMailer::Base
#收件人邮箱
@recipients ||= []
@members.each do |teacher|
+ if teacher.user.mail_notification != 'week' && teacher.user.mail_notification != 'day'
@recipients << teacher.user.mail
+ end
end
mail :to => @recipients,
:subject => "#{l(:label_your_course)}#{journals_for_message.jour.name}#{l(:label_have_message)} "
@@ -111,14 +205,15 @@ class Mailer < ActionMailer::Base
if !journals_for_message.jour.author.notify_about? journals_for_message
return -1
end
- mail :to => journals_for_message.jour.author.mail, :subject => @title
+
+ mail :to => recipients, :subject => @title
elsif journals_for_message.jour.class.to_s.to_sym == :Contest
if !journals_for_message.jour.author.notify_about? journals_for_message
return -1
end
- mail :to => journals_for_message.jour.author.mail, :subject => @title
+ mail :to => recipients, :subject => @title
else
- mail :to => @mail.mail, :subject => @title
+ mail :to => recipients1, :subject => @title
end
@@ -140,7 +235,6 @@ class Mailer < ActionMailer::Base
@author = issue.author
@issue = issue
user = User.find_by_mail(recipients)
-
token = Token.new(:user =>user , :action => 'autologin')
token.save
@token = token
@@ -196,12 +290,6 @@ class Mailer < ActionMailer::Base
@user_url = url_for(my_account_url(user,:token => @token.value))
@issue_url = url_for(:controller => 'issues', :action => 'show', :id => issue.id, :anchor => "change-#{journal.id}", :token => @token.value)
-
-
-
-
-
-
s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue_id}] "
s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
s << issue.subject
@@ -752,4 +840,13 @@ class Mailer < ActionMailer::Base
end
end
end
+
+ # author: alan
+ # 功能: 生成len位随机字符串
+ def newpass(len)
+ chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
+ newpass = ""
+ 1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
+ return newpass
+ end
end
diff --git a/app/models/memo.rb b/app/models/memo.rb
index 7d463c28b..052ca03db 100644
--- a/app/models/memo.rb
+++ b/app/models/memo.rb
@@ -1,13 +1,8 @@
class Memo < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
- include ExpireHelper
belongs_to :forum
belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
-
- after_create :expire_cache
- after_update :expire_cache
- before_destroy :expire_cache
validates_presence_of :author_id, :forum_id, :subject,:content
# 若是主题帖,则内容可以是空
#validates :content, presence: true, if: Proc.new{|o| !o.parent_id.nil? }
@@ -174,8 +169,5 @@ class Memo < ActiveRecord::Base
update_memo_number(User.current,1)
update_replay_for_memo(User.current,1)
end
- def expire_cache
- expire_forum_cache
- expire_activitie_cache
- end
+
end
diff --git a/app/models/message.rb b/app/models/message.rb
index 9ce4d583a..85a87132d 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -18,7 +18,6 @@
class Message < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
- include ExpireHelper
belongs_to :board
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
@@ -29,6 +28,8 @@ class Message < ActiveRecord::Base
# added by fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
acts_as_searchable :columns => ['subject', 'content'],
@@ -59,13 +60,12 @@ class Message < ActiveRecord::Base
validates_length_of :subject, :maximum => 255
validate :cannot_reply_to_locked_topic, :on => :create
- after_create :add_author_as_watcher, :reset_counters!,:expire_activitie_cache
- after_update :update_messages_board,:expire_activitie_cache
- before_destroy :expire_activitie_cache
+ after_create :add_author_as_watcher, :reset_counters!
+ after_update :update_messages_board
after_destroy :reset_counters!,:down_user_score
# fq
- after_create :act_as_activity,:be_user_score
+ after_create :act_as_activity,:be_user_score,:act_as_forge_activity
#before_save :be_user_score
# end
@@ -160,6 +160,17 @@ class Message < ActiveRecord::Base
end
# end
+ # Time 2015-02-27 14:32:25
+ # Author lizanle
+ # Description
+ def act_as_forge_activity
+ # 如果project为空,那么就是课程相关的消息
+ if !self.board.project.nil?
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.board.project.id)
+ end
+ end
+
#更新用户分数 -by zjc
def be_user_score
#新建message且无parent的为发帖
diff --git a/app/models/news.rb b/app/models/news.rb
index 9c37719f3..d2547fc02 100644
--- a/app/models/news.rb
+++ b/app/models/news.rb
@@ -17,7 +17,6 @@
class News < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
belongs_to :project
#added by nwb
belongs_to :course
@@ -25,7 +24,9 @@ class News < ActiveRecord::Base
has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
# fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
- #end
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # end
validates_presence_of :title, :description
validates_length_of :title, :maximum => 60
@@ -46,11 +47,8 @@ class News < ActiveRecord::Base
after_create :add_author_as_watcher
# fq
- after_create :act_as_activity
+ after_create :act_as_activity,:act_as_forge_activity
# end
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_news, *args))
@@ -96,5 +94,15 @@ class News < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.author_id)
end
+ # Time 2015-02-27 15:48:17
+ # Author lizanle
+ # Description 公用表中也要记录
+ def act_as_forge_activity
+ # 如果是project为空,那么是课程相关的,不需要保存
+ if !self.project.nil?
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.project.id)
+ end
+ end
end
diff --git a/app/models/organization.rb b/app/models/organization.rb
new file mode 100644
index 000000000..5f52dee98
--- /dev/null
+++ b/app/models/organization.rb
@@ -0,0 +1,5 @@
+class Organization < ActiveRecord::Base
+ attr_accessible :logo_link, :name
+
+ has_many :projects
+end
diff --git a/app/models/phone_app_version.rb b/app/models/phone_app_version.rb
new file mode 100644
index 000000000..abf4c54e3
--- /dev/null
+++ b/app/models/phone_app_version.rb
@@ -0,0 +1,3 @@
+class PhoneAppVersion < ActiveRecord::Base
+ attr_accessible :description, :version
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index df403bb5c..099870bc7 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -17,7 +17,6 @@
class Project < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
ProjectType_project = 0
ProjectType_course = 1
@@ -90,7 +89,9 @@ class Project < ActiveRecord::Base
:association_foreign_key => 'custom_field_id'
has_many :tags, :through => :project_tags, :class_name => 'Tag'
- has_many :project_tags, :class_name => 'ProjectTags'
+ has_many :project_tags, :class_name => 'ProjectTags'
+
+ belongs_to :organization
# has_many :journals
@@ -130,9 +131,8 @@ class Project < ActiveRecord::Base
#ActiveModel::Dirty 这里有一个changed方法。对任何对象都可以用
after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}
# 创建project之后默认创建一个board,之后的board去掉了board的概念
- after_create :create_board_sync,:expire_project_cache
- after_update :expire_project_cache
- before_destroy :delete_all_members,:expire_project_cache
+ after_create :create_board_sync
+ before_destroy :delete_all_members
def remove_references_before_destroy
return if self.id.nil?
Watcher.delete_all ['watchable_id = ?', id]
diff --git a/app/models/tracker.rb b/app/models/tracker.rb
index 6a0069975..af56d23bf 100644
--- a/app/models/tracker.rb
+++ b/app/models/tracker.rb
@@ -16,7 +16,9 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Tracker < ActiveRecord::Base
-
+ # Time 2015-02-6 09:34:44
+ # Author lizanle
+ # Description freeze方法让字符串不可变
CORE_FIELDS_UNDISABLABLE = %w(project_id tracker_id subject description priority_id is_private).freeze
# Fields that can be disabled
# Other (future) fields should be appended, not inserted!
diff --git a/app/models/user.rb b/app/models/user.rb
index 06f59c764..83e08254c 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -24,7 +24,7 @@ class User < Principal
DEVELOPER = 3
include Redmine::SafeAttributes
-
+ seems_rateable_rater
# Different ways of displaying/sorting users
USER_FORMATS = {
:firstname_lastname => {
@@ -66,10 +66,8 @@ class User < Principal
MAIL_NOTIFICATION_OPTIONS = [
['all', :label_user_mail_option_all],
- ['selected', :label_user_mail_option_selected],
- ['only_my_events', :label_user_mail_option_only_my_events],
- ['only_assigned', :label_user_mail_option_only_assigned],
- ['only_owner', :label_user_mail_option_only_owner],
+ ['week', :label_user_mail_option_week],
+ ['day', :label_user_mail_option_day],
['none', :label_user_mail_option_none]
]
@@ -149,7 +147,7 @@ class User < Principal
scope :by_join_date, order("created_on DESC")
############################# added by liuping 关注
acts_as_watchable
- seems_rateable_rater
+
has_one :user_extensions,:dependent => :destroy
## end
@@ -188,7 +186,7 @@ class User < Principal
validates_confirmation_of :password, :allow_nil => true
validates_inclusion_of :mail_notification, :in => MAIL_NOTIFICATION_OPTIONS.collect(&:first), :allow_blank => true
validate :validate_password_length
- #validates_email_realness_of :mail
+ # validates_email_realness_of :mail
before_create :set_mail_notification
before_save :update_hashed_password
before_destroy :remove_references_before_destroy
diff --git a/app/services/comment_service.rb b/app/services/comment_service.rb
index 42dc8c415..e74cc902b 100644
--- a/app/services/comment_service.rb
+++ b/app/services/comment_service.rb
@@ -78,4 +78,24 @@ class CommentService
@jfm
end
+ #发贴,用于意见反馈
+ def create_feedback params,current_user
+ @memo = Memo.new(params[:memo])
+ @memo.forum_id = "1"
+ @memo.author_id = current_user.id
+ @memo.save
+ @memo
+ end
+
+ #课程留言列表
+ def course_messages params,current_user
+ @course = ::Course.find(params[:id])
+ if (current_user.admin? || @course.is_public == 1 || (@course.is_public == 0 && current_user.member_of_course?(@course)))
+ @jours = @course.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
+ else
+ raise '403'
+ end
+ @jours
+ end
+
end
\ No newline at end of file
diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb
index f4201774a..c0d3d2f83 100644
--- a/app/services/courses_service.rb
+++ b/app/services/courses_service.rb
@@ -1,13 +1,14 @@
+#coding=utf-8
class CoursesService
include ApplicationHelper
include CoursesHelper
include HomeworkAttachHelper
include ApiHelper
- #TODO:尚未整合权限系统
+
#参数school_id为0或不传时返回所有课程,否则返回对应学校的课程
#参数per_page_count分页功能,每页显示的课程数
#参数page分页功能,当前页码
- def course_list params
+ def course_list params,current_user
@school_id = params[:school_id]
per_page_option = params[:per_page_count] || 10
page_no = params[:page] || 1
@@ -25,13 +26,13 @@ class CoursesService
@courses = @courses.offset(@course_pages.offset).limit(@course_pages.per_page)
course_list = []
@courses.each do |course|
- course_list << {:course => course,:img_url => url_to_avatar(course)}
+ course_list << {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
end
course_list
end
#搜索课程
- def search_course params
+ def search_course params,current_user
courses_all = Course.all_course
name = params[:name]
if name.blank?
@@ -44,6 +45,11 @@ class CoursesService
@courses_all = @courses;
end
@courses_all
+ course_list = []
+ @courses_all.each do |course|
+ course_list << {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
+ end
+ course_list
end
#获取头像
@@ -117,7 +123,7 @@ class CoursesService
scope = @course ? @course.news.course_visible(current_user) : News.course_visible(current_user)
news = []
scope.each do |n|
- news << {:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count}
+ news << {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count}
end
news
end
@@ -153,12 +159,12 @@ class CoursesService
#显示课程
- def show_course(params,currnet_user)
+ def show_course(params,current_user)
course = Course.find(params[:id])
- unless (course.is_public == 1 || currnet_user.member_of_course?(@course)|| currnet_user.admin?)
+ unless (course.is_public == 1 || current_user.member_of_course?(course) || current_user.admin?)
raise '403'
end
- course
+ {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
end
#创建课程
@@ -206,7 +212,7 @@ class CoursesService
@course.members << m
@course.course_infos << course
end
- @course
+ {:course => @course,:img_url => url_to_avatar(@course),:current_user_is_member => current_user.member_of_course?(@course),:current_user_is_teacher => is_course_teacher(current_user,@course)}
end
#验证编辑课程的权限
@@ -243,7 +249,7 @@ class CoursesService
course_status = CourseStatus.create(:course_id => course.id, :grade => 0)
end
end
- course
+ {:course => course,:img_url => url_to_avatar(course),:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course)}
end
#退出课程
@@ -328,24 +334,84 @@ class CoursesService
end
def course_dynamic(params,current_user)
- course = Course.find(params[:id])
- if current_user.nil? || !(current_user.admin? || course.is_public == 1 || (course.is_public == 0 && current_user.member_of_course?(course)))
- raise '403'
+
+ @user = User.find(params[:id])
+ if !current_user.admin? && !@user.active?
+ raise '404'
+ return
end
- count,is_teacher = get_course_anonymous_evaluation current_user,course
- if is_teacher
- student_commit_number = count
+ if current_user == @user || current_user.admin?
+ membership = @user.coursememberships.all
else
- need_anonymous_comments_count = count
+ membership = @user.coursememberships.all(:conditions => Course.visible_condition(current_user))
end
- news_count = course.news.count
- message_count = course.journals_for_messages.count
- {:course_name => course.name,:need_anonymous_comments_count=>need_anonymous_comments_count,:student_commit_number=>student_commit_number,:news_count=> news_count,:message_count=>message_count}
+ if membership.nil? || membership.count == 0
+ raise l(:label_no_courses,:locale => current_user.language.nil? ? 'zh':current_user.language)
+ end
+ membership.sort! {|older, newer| newer.created_on <=> older.created_on }
+ result = []
+ membership.each do |mp|
+ course = mp.course
+ latest_course_dynamics = []
+ latest_news = course.news.order("created_on desc").first
+ unless latest_news.nil?
+ latest_course_dynamics << {:type => 1,:time => latest_news.created_on,:message => '最近更新了通知' }#l(:label_recently_updated_notification,:locale => current_user.language.nil? ? 'zh':current_user.language)}
+ end
+ latest_message = course.journals_for_messages.order("created_on desc").first
+ unless latest_message.nil?
+ latest_course_dynamics << {:type => 2,:time => latest_message.created_on,:message => '最近更新了留言'}#l(:label_recently_updated_message,:locale => current_user.language.nil? ? 'zh':current_user.language)}
+ end
+ latest_attachment = course.attachments.order("created_on desc").first
+ unless latest_attachment.nil?
+ latest_course_dynamics << {:type => 3,:time => latest_attachment.created_on,:message => '最近更新了课件'}#l(:label_recently_updated_courseware,:locale => current_user.language.nil? ? 'zh':current_user.language)}
+ end
+ latest_bid = course.homeworks.order('updated_on DESC').first
+ unless latest_bid.nil?
+ latest_course_dynamics << {:type => 4,:time => latest_bid.updated_on,:message => '最近更新了作业'}#l(:label_recently_updated_homework,:locale => current_user.language.nil? ? 'zh':current_user.language)}
+ end
+ #每个作业中的最新留言
+ messages = []
+ course.homeworks.each do |bid|
+ jour = bid.journals_for_messages.order("created_on desc").first
+ unless jour.nil?
+ messages << jour
+ end
+ end
+ unless messages.count == 0
+ messages.sort!{|order,newer| newer.created_on <=> order.created_on}
+ end
+ latest_bid_message = messages.first
+ unless latest_bid_message.nil?
+ latest_course_dynamics << {:type => 2,:time => latest_bid_message.created_on,:message => '最近更新了留言'}#l(:label_recently_updated_message,:locale => current_user.language.nil? ? 'zh':current_user.language)}
+ end
+ #每个作业中学生最后提交的作业
+ homeworks = []
+ course.homeworks.each do |bid|
+ homework_attach = bid.homeworks.order('updated_at DESC').first
+ unless homework_attach.nil?
+ homeworks << homework_attach
+ end
+ end
+ unless homeworks.count == 0
+ homeworks.sort!{|order,newer| newer.updated_at <=> order.updated_at}
+ end
+ latest_homework_attach = homeworks.first
+ unless latest_homework_attach.nil?
+ latest_course_dynamics << {:type => 4,:time => latest_homework_attach.updated_at,:message => '最近更新了作业'}#l(:label_recently_updated_homework,:locale => current_user.language.nil? ? 'zh':current_user.language)}
+ end
+ latest_course_dynamics.sort!{|order,newer| newer[:time] <=> order[:time]}
+ latest_course_dynamic = latest_course_dynamics.first
+ unless latest_course_dynamic.nil?
+ result << {:course_name => course.name,:course_id => course.id,:course_img_url => url_to_avatar(course),:type => latest_course_dynamic[:type],:update_time => latest_course_dynamic[:time],:message => latest_course_dynamic[:message],:count => nil}
+ end
+ end
+ result.sort!{|order,newer| newer[:update_time] <=> order[:update_time]}
+ result
end
private
def show_homework_info course,bid,current_user,is_course_teacher
- author = bid.author.lastname + bid.author.firstname
+ author_real_name = bid.author.lastname + bid.author.firstname
many_times = course.homeworks.index(bid) + 1
name = bid.name
homework_count = bid.homeworks.count #已提交的作业数量
@@ -358,8 +424,9 @@ class CoursesService
end
#end
open_anonymous_evaluation = bid.open_anonymous_evaluation
- {:course_name => course.name,:id => bid.id, :course_teacher => author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
- :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation,:homework_for_anonymous_comments => homework_for_anonymous_comments}
+ {:course_name => course.name,:course_id => course.id,:id => bid.id, :author => bid.author,:author_real_name => author_real_name, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
+ :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation,:homework_for_anonymous_comments => homework_for_anonymous_comments,:created_on => bid.created_on,:deadline => bid.deadline}
+
end
#显示作业列表的同时显示分配给当前学生匿评的作业
diff --git a/app/services/homework_service.rb b/app/services/homework_service.rb
index b468e1110..f9be6f79d 100644
--- a/app/services/homework_service.rb
+++ b/app/services/homework_service.rb
@@ -6,6 +6,7 @@ class HomeworkService
include WordsHelper
include ApiHelper
include HomeworkAttachHelper
+ include CoursesHelper
# 作业详情(老师才显示启动匿评,学生不显示 )
# many_times 第几次(作业)
@@ -25,8 +26,9 @@ class HomeworkService
state = @bid.comment_status
#end
open_anonymous_evaluation = @bid.open_anonymous_evaluation
- {:course_name => course.name,:id => @bid.id, :course_teacher => author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
- :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation}
+ jours = @bid.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
+ {:course_name => course.name,:course_id => course.id,:id => @bid.id, :author => @bid.author,:author_real_name =>author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
+ :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation,:created_on => @bid.created_on,:deadline => @bid.deadline,:jours => jours}
end
# 启动作业匿评前提示信息
@@ -115,7 +117,7 @@ class HomeworkService
@is_anonymous_comments = @bid.comment_status == 1 && !@homework.users.include?(current_user) && @homework.user != current_user && !@is_teacher #判断是不是匿评(开启匿评,当前用户不是作业的创建者或者参与者,不是老师)
jours = @homework.journals_for_messages.where("is_comprehensive_evaluation = 3 or is_comprehensive_evaluation is null").order("created_on DESC")#jours留言 is null条件用以兼容历史数据
#@jour = paginateHelper jours,5 #留言
- #@cur_page = params[:cur_page] || 1
+ @cur_page = params[:cur_page] || 1
@cur_type = params[:cur_type] || 5
teacher_stars_json_like = stars_to_json_like(@teacher_stars,true,@homework,true)
student_stars_json_like = stars_to_json_like(@student_stars,false,@homework,(false || @is_teacher))
@@ -124,7 +126,7 @@ class HomeworkService
end
[@homework,{:is_teacher => @is_teacher,:m_score => @m_score,:jours => jours,:teacher_stars => teacher_stars_json_like,
- :student_stars => student_stars_json_like,:is_anonymous_comments => @is_anonymous_comments,:cur_type => @cur_type}]
+ :student_stars => student_stars_json_like,:is_anonymous_comments => @is_anonymous_comments,:cur_type => @cur_type,:cur_page => @cur_page}]
#name = @homework.name
#desc = @homework.description
#datetime = @homework.created_at
@@ -273,10 +275,26 @@ class HomeworkService
membership.each do |mp|
my_homeworks = []
mp.course.homeworks.each do |bid|
- hw = bid.homeworks.where("user_id = #{current_user.id}")
- my_homeworks << hw[0] unless (hw.nil? || hw[0].nil?)
+ #hw = bid.homeworks.where("user_id = #{current_user.id}")
+ @bid = bid
+ course = @bid.courses.first
+ author = @bid.author.lastname + @bid.author.firstname
+ many_times = course.homeworks.index(@bid) + 1
+ name = @bid.name
+ homework_count = @bid.homeworks.count #已提交的作业数量
+ student_questions_count = @bid.commit.nil? ? 0 : @bid.commit
+ description = @bid.description
+ #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2
+ state = @bid.comment_status
+ #end
+ open_anonymous_evaluation = @bid.open_anonymous_evaluation
+
+ my_homeworks << {:course_name => course.name,:id => @bid.id, :author => @bid.author,:author_real_name =>author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
+ :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation}
+ end
+ if mp.course.homeworks.count != 0
+ course_list << {:course => mp.course,:img_url => url_to_avatar(mp.course),:my_homework => my_homeworks,:current_user_is_member => current_user.member_of_course?(mp.course),:current_user_is_teacher => is_course_teacher(current_user,mp.course)}
end
- course_list << {:course => mp.course,:img_url => url_to_avatar(mp.course),:my_homework => my_homeworks}
end
course_list
end
diff --git a/app/services/users_service.rb b/app/services/users_service.rb
index 897171b55..8cadf031c 100644
--- a/app/services/users_service.rb
+++ b/app/services/users_service.rb
@@ -44,7 +44,31 @@ class UsersService
#location = get_user_location @user
#{:id => @user.id, :img_url => img_url, :nickname => @user.login, :gender => gender, :work_unit => work_unit, :mail => @user.mail, :location => location, :brief_introduction => @user.user_extensions.brief_introduction}
end
+ def register_auto(login,mail,password)
+ @user = User.new
+ @user.admin = false
+ @user.register
+ @user.login = login
+ @user.mail =mail
+ password_confirmation = password
+ should_confirmation_password = true
+ if !password.blank? && !password_confirmation.blank? && should_confirmation_password
+ @user.password, @user.password_confirmation = password, password_confirmation
+ elsif !password.blank? && !should_confirmation_password
+ @user.password = password
+ else
+ @user.password = ""
+ end
+ @user = automatically_register(@user)
+
+ if @user.id != nil
+ ue = @user.user_extensions ||= UserExtensions.new
+ ue.user_id = @user.id
+ ue.save
+ end
+ @user
+ end
#显示用户
#id用户id
def show_user(params)
@@ -134,7 +158,7 @@ class UsersService
membership.sort! {|older, newer| newer.created_on <=> older.created_on }
course_list = []
membership.each do |mp|
- course_list << {:course => mp.course,:img_url => url_to_avatar(mp.course)}
+ course_list << {:course => mp.course,:img_url => url_to_avatar(mp.course),:current_user_is_member => current_user.member_of_course?(mp.course),:current_user_is_teacher => is_course_teacher(current_user,mp.course)}
end
course_list
end
diff --git a/app/services/watches_service.rb b/app/services/watches_service.rb
index 2b9bed3cd..2aab7de81 100644
--- a/app/services/watches_service.rb
+++ b/app/services/watches_service.rb
@@ -1,7 +1,12 @@
+#coding=utf-8
class WatchesService
def watch params
@current_user = User.find(params[:current_user_id])
+ if params[:object_type] == 'user' && params[:current_user_id] == params[:object_id]
+ raise '不能关注自己!'
+ end
@watchables = find_watchables params
+
if @watchables.nil?
raise '404'
end
diff --git a/app/views/admin/enterprise_page_made.html.erb b/app/views/admin/enterprise_page_made.html.erb
index 566f09bb8..607017f59 100644
--- a/app/views/admin/enterprise_page_made.html.erb
+++ b/app/views/admin/enterprise_page_made.html.erb
@@ -33,7 +33,4 @@
<%= submit_tag l(:button_save), :class => "small", :name => nil %>
<% end %>
-
-
-
\ No newline at end of file
diff --git a/app/views/admin/mobile_version.html.erb b/app/views/admin/mobile_version.html.erb
new file mode 100644
index 000000000..293b0ec46
--- /dev/null
+++ b/app/views/admin/mobile_version.html.erb
@@ -0,0 +1,55 @@
+<%= l(:label_mobile_version) %>
+发布新版本
+
+
+
+
+当前版本:
+
+
+
+ <%=l(:label_version_number)%>
+ <%=l(:label_version_description)%>
+
+
+
+ <% if @versions.count > 0 %>
+ ">
+ <%= @versions.first.version %>
+
+ <%= @versions.first.description %>
+
+
+ <% end %>
+
+
+
+
+
+历史版本:
+
+
+
+ <%=l(:label_version_number)%>
+ <%=l(:label_version_description)%>
+
+
+
+ <% if @versions.count > 0 %>
+ <% for version in @versions %>
+ ">
+ <%= version.version %>
+
+ <%= version.description %>
+
+
+ <% end %>
+ <% end %>
+
+
+
+
+
+<% html_title(l(:label_mobile_version)) -%>
\ No newline at end of file
diff --git a/app/views/admin/organization.html.erb b/app/views/admin/organization.html.erb
new file mode 100644
index 000000000..582b8b44a
--- /dev/null
+++ b/app/views/admin/organization.html.erb
@@ -0,0 +1,43 @@
+
+ <%= link_to l(:label_organization_new), new_organization_path, :class => 'icon icon-add' %>
+
+
+
+ <%=l(:label_organization_list)%>
+
+
+
+
+<% html_title(l(:label_project_plural)) -%>
diff --git a/app/views/admin/projects.html.erb b/app/views/admin/projects.html.erb
index 762ceae9e..4c9479a6d 100644
--- a/app/views/admin/projects.html.erb
+++ b/app/views/admin/projects.html.erb
@@ -2,16 +2,25 @@
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %>
-<%=l(:label_project_plural)%>
+
+ <%=l(:label_project_plural)%>
+
<%= form_tag({}, :method => :get) do %>
-<%= l(:label_filter_plural) %>
-<%= l(:field_status) %> :
-<%= select_tag 'status', project_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
-<%= l(:label_project) %>:
-<%= text_field_tag 'name', params[:name], :size => 30 %>
-<%= submit_tag l(:button_apply), :class => "small", :name => nil %>
-<%= link_to l(:button_clear), {:controller => 'admin', :action => 'projects'}, :class => 'icon icon-reload' %>
+
+
+ <%= l(:label_filter_plural) %>
+
+
+ <%= l(:field_status) %> :
+
+ <%= select_tag 'status', project_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %>
+
+ <%= l(:label_project) %>:
+
+ <%= text_field_tag 'name', params[:name], :size => 30 %>
+ <%= submit_tag l(:button_apply), :class => "small", :name => nil %>
+ <%= link_to l(:button_clear), {:controller => 'admin', :action => 'projects'}, :class => 'icon icon-reload' %>
<% end %>
@@ -19,17 +28,31 @@
+