From d82005a7f4d016d2271ec8b943f40215b6b1ce5e Mon Sep 17 00:00:00 2001 From: nccu Date: Fri, 7 Nov 2014 16:44:11 +0800 Subject: [PATCH] Initial commit --- .gitignore | 8 + Gemfile | 14 + Gemfile.lock | 106 ++++ MIT-LICENSE | 20 + README.rdoc | 3 + Rakefile | 32 ++ app/assets/images/news_alt.jpg | Bin 0 -> 21854 bytes app/assets/images/news_bulletin/.keep | 0 app/assets/javascripts/admin/news.js | 2 + app/assets/javascripts/news_bulletin/.keep | 0 app/assets/stylesheets/admin/news.css | 7 + app/assets/stylesheets/news_bulletin/.keep | 0 app/controllers/.keep | 0 .../admin/news_admins_controller.rb | 56 ++ app/controllers/admin/news_controller.rb | 225 ++++++++ app/controllers/news_controller.rb | 169 ++++++ app/helpers/.keep | 0 app/helpers/admin/news_helper.rb | 47 ++ app/mailers/.keep | 0 app/models/.keep | 0 app/models/department.rb | 14 + app/models/news_bulletin.rb | 79 +++ app/models/news_bulletin_file.rb | 14 + app/models/news_bulletin_link.rb | 25 + app/models/unit.rb | 24 + app/views/.keep | 0 app/views/admin/news/_form.html.erb | 483 ++++++++++++++++++ app/views/admin/news/_form_file.html.erb | 55 ++ app/views/admin/news/_form_link.html.erb | 26 + app/views/admin/news/_index.html.erb | 136 +++++ app/views/admin/news/edit.html.erb | 5 + app/views/admin/news/index.html.erb | 6 + app/views/admin/news/new.html.erb | 5 + .../admin/news_admins/_form_dept.html.erb | 32 ++ app/views/admin/news_admins/edit.html.erb | 145 ++++++ app/views/admin/news_admins/index.html.erb | 144 ++++++ app/views/news/email.html.erb | 19 + app/views/news/index.html.erb | 1 + app/views/news/show.html.erb | 1 + bin/rails | 18 + config/locales/en.yml | 62 +++ config/locales/zh_tw.yml | 90 ++++ config/routes.rb | 23 + lib/news.rb | 4 + lib/news/engine.rb | 55 ++ lib/news/version.rb | 3 + lib/tasks/news_bulletin_tasks.rake | 4 + news.gemspec | 19 + test/bulletin_test.rb | 7 + .../admin/announcements_controller_test.rb | 14 + test/dummy/README.rdoc | 28 + test/dummy/Rakefile | 6 + test/dummy/app/assets/images/.keep | 0 .../app/assets/javascripts/application.js | 13 + .../app/assets/stylesheets/application.css | 15 + .../app/controllers/application_controller.rb | 5 + test/dummy/app/controllers/concerns/.keep | 0 test/dummy/app/helpers/application_helper.rb | 2 + test/dummy/app/mailers/.keep | 0 test/dummy/app/models/.keep | 0 test/dummy/app/models/concerns/.keep | 0 .../app/views/layouts/application.html.erb | 14 + test/dummy/bin/bundle | 3 + test/dummy/bin/rails | 4 + test/dummy/bin/rake | 4 + test/dummy/config.ru | 4 + test/dummy/config/application.rb | 29 ++ test/dummy/config/boot.rb | 5 + test/dummy/config/environment.rb | 5 + test/dummy/config/environments/development.rb | 34 ++ test/dummy/config/environments/production.rb | 80 +++ test/dummy/config/environments/test.rb | 39 ++ .../initializers/backtrace_silencers.rb | 7 + .../config/initializers/cookies_serializer.rb | 3 + .../initializers/filter_parameter_logging.rb | 4 + test/dummy/config/initializers/inflections.rb | 16 + test/dummy/config/initializers/mime_types.rb | 5 + .../config/initializers/session_store.rb | 3 + .../config/initializers/wrap_parameters.rb | 9 + test/dummy/config/locales/en.yml | 23 + test/dummy/config/routes.rb | 56 ++ test/dummy/config/secrets.yml | 22 + test/dummy/lib/assets/.keep | 0 test/dummy/log/.keep | 0 test/dummy/public/404.html | 67 +++ test/dummy/public/422.html | 67 +++ test/dummy/public/500.html | 66 +++ test/dummy/public/favicon.ico | 0 .../admin/announcements_helper_test.rb | 4 + test/integration/navigation_test.rb | 9 + test/test_helper.rb | 15 + 91 files changed, 2868 insertions(+) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 MIT-LICENSE create mode 100644 README.rdoc create mode 100644 Rakefile create mode 100644 app/assets/images/news_alt.jpg create mode 100644 app/assets/images/news_bulletin/.keep create mode 100644 app/assets/javascripts/admin/news.js create mode 100644 app/assets/javascripts/news_bulletin/.keep create mode 100644 app/assets/stylesheets/admin/news.css create mode 100644 app/assets/stylesheets/news_bulletin/.keep create mode 100644 app/controllers/.keep create mode 100644 app/controllers/admin/news_admins_controller.rb create mode 100644 app/controllers/admin/news_controller.rb create mode 100644 app/controllers/news_controller.rb create mode 100644 app/helpers/.keep create mode 100644 app/helpers/admin/news_helper.rb create mode 100644 app/mailers/.keep create mode 100644 app/models/.keep create mode 100644 app/models/department.rb create mode 100644 app/models/news_bulletin.rb create mode 100644 app/models/news_bulletin_file.rb create mode 100644 app/models/news_bulletin_link.rb create mode 100644 app/models/unit.rb create mode 100644 app/views/.keep create mode 100644 app/views/admin/news/_form.html.erb create mode 100644 app/views/admin/news/_form_file.html.erb create mode 100644 app/views/admin/news/_form_link.html.erb create mode 100644 app/views/admin/news/_index.html.erb create mode 100644 app/views/admin/news/edit.html.erb create mode 100644 app/views/admin/news/index.html.erb create mode 100644 app/views/admin/news/new.html.erb create mode 100644 app/views/admin/news_admins/_form_dept.html.erb create mode 100644 app/views/admin/news_admins/edit.html.erb create mode 100644 app/views/admin/news_admins/index.html.erb create mode 100644 app/views/news/email.html.erb create mode 100644 app/views/news/index.html.erb create mode 100644 app/views/news/show.html.erb create mode 100755 bin/rails create mode 100644 config/locales/en.yml create mode 100644 config/locales/zh_tw.yml create mode 100644 config/routes.rb create mode 100644 lib/news.rb create mode 100644 lib/news/engine.rb create mode 100644 lib/news/version.rb create mode 100644 lib/tasks/news_bulletin_tasks.rake create mode 100644 news.gemspec create mode 100644 test/bulletin_test.rb create mode 100644 test/controllers/admin/announcements_controller_test.rb create mode 100644 test/dummy/README.rdoc create mode 100644 test/dummy/Rakefile create mode 100644 test/dummy/app/assets/images/.keep create mode 100644 test/dummy/app/assets/javascripts/application.js create mode 100644 test/dummy/app/assets/stylesheets/application.css create mode 100644 test/dummy/app/controllers/application_controller.rb create mode 100644 test/dummy/app/controllers/concerns/.keep create mode 100644 test/dummy/app/helpers/application_helper.rb create mode 100644 test/dummy/app/mailers/.keep create mode 100644 test/dummy/app/models/.keep create mode 100644 test/dummy/app/models/concerns/.keep create mode 100644 test/dummy/app/views/layouts/application.html.erb create mode 100755 test/dummy/bin/bundle create mode 100755 test/dummy/bin/rails create mode 100755 test/dummy/bin/rake create mode 100644 test/dummy/config.ru create mode 100644 test/dummy/config/application.rb create mode 100644 test/dummy/config/boot.rb create mode 100644 test/dummy/config/environment.rb create mode 100644 test/dummy/config/environments/development.rb create mode 100644 test/dummy/config/environments/production.rb create mode 100644 test/dummy/config/environments/test.rb create mode 100644 test/dummy/config/initializers/backtrace_silencers.rb create mode 100644 test/dummy/config/initializers/cookies_serializer.rb create mode 100644 test/dummy/config/initializers/filter_parameter_logging.rb create mode 100644 test/dummy/config/initializers/inflections.rb create mode 100644 test/dummy/config/initializers/mime_types.rb create mode 100644 test/dummy/config/initializers/session_store.rb create mode 100644 test/dummy/config/initializers/wrap_parameters.rb create mode 100644 test/dummy/config/locales/en.yml create mode 100644 test/dummy/config/routes.rb create mode 100644 test/dummy/config/secrets.yml create mode 100644 test/dummy/lib/assets/.keep create mode 100644 test/dummy/log/.keep create mode 100644 test/dummy/public/404.html create mode 100644 test/dummy/public/422.html create mode 100644 test/dummy/public/500.html create mode 100644 test/dummy/public/favicon.ico create mode 100644 test/helpers/admin/announcements_helper_test.rb create mode 100644 test/integration/navigation_test.rb create mode 100644 test/test_helper.rb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de5d954 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.bundle/ +log/*.log +pkg/ +test/dummy/db/*.sqlite3 +test/dummy/db/*.sqlite3-journal +test/dummy/log/*.log +test/dummy/tmp/ +test/dummy/.sass-cache diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..d15019e --- /dev/null +++ b/Gemfile @@ -0,0 +1,14 @@ +source "https://rubygems.org" + +# Declare your gem's dependencies in bulletin.gemspec. +# Bundler will treat runtime dependencies like base dependencies, and +# development dependencies will be added by default to the :development group. +gemspec + +# Declare any dependencies that are still in development here instead of in +# your gemspec. These might include edge Rails or gems from your path or +# Git. Remember to move these dependencies to your gemspec before releasing +# your gem to rubygems.org. + +# To use debugger +# gem 'debugger' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..41f03f3 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,106 @@ +PATH + remote: . + specs: + news (0.0.1) + mongoid (= 4.0.0.beta1) + rails (~> 4.1.0.rc2) + +GEM + remote: https://rubygems.org/ + specs: + actionmailer (4.1.0.rc2) + actionpack (= 4.1.0.rc2) + actionview (= 4.1.0.rc2) + mail (~> 2.5.4) + actionpack (4.1.0.rc2) + actionview (= 4.1.0.rc2) + activesupport (= 4.1.0.rc2) + rack (~> 1.5.2) + rack-test (~> 0.6.2) + actionview (4.1.0.rc2) + activesupport (= 4.1.0.rc2) + builder (~> 3.1) + erubis (~> 2.7.0) + activemodel (4.1.0.rc2) + activesupport (= 4.1.0.rc2) + builder (~> 3.1) + activerecord (4.1.0.rc2) + activemodel (= 4.1.0.rc2) + activesupport (= 4.1.0.rc2) + arel (~> 5.0.0) + activesupport (4.1.0.rc2) + i18n (~> 0.6, >= 0.6.9) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.1) + tzinfo (~> 1.1) + arel (5.0.0) + atomic (1.1.16) + bson (2.2.1) + builder (3.2.2) + connection_pool (2.0.0) + erubis (2.7.0) + hike (1.2.3) + i18n (0.6.9) + json (1.8.1) + mail (2.5.4) + mime-types (~> 1.16) + treetop (~> 1.4.8) + mime-types (1.25.1) + minitest (5.3.1) + mongoid (4.0.0.beta1) + activemodel (>= 4.0.0) + moped (~> 2.0.beta6) + origin (~> 2.1) + tzinfo (>= 0.3.37) + moped (2.0.0.rc1) + bson (~> 2.2) + connection_pool (~> 2.0) + optionable (~> 0.2.0) + multi_json (1.9.2) + optionable (0.2.0) + origin (2.1.1) + polyglot (0.3.4) + rack (1.5.2) + rack-test (0.6.2) + rack (>= 1.0) + rails (4.1.0.rc2) + actionmailer (= 4.1.0.rc2) + actionpack (= 4.1.0.rc2) + actionview (= 4.1.0.rc2) + activemodel (= 4.1.0.rc2) + activerecord (= 4.1.0.rc2) + activesupport (= 4.1.0.rc2) + bundler (>= 1.3.0, < 2.0) + railties (= 4.1.0.rc2) + sprockets-rails (~> 2.0.0) + railties (4.1.0.rc2) + actionpack (= 4.1.0.rc2) + activesupport (= 4.1.0.rc2) + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (10.2.2) + sprockets (2.12.0) + hike (~> 1.2) + multi_json (~> 1.0) + rack (~> 1.0) + tilt (~> 1.1, != 1.3.0) + sprockets-rails (2.0.1) + actionpack (>= 3.0) + activesupport (>= 3.0) + sprockets (~> 2.8) + thor (0.19.1) + thread_safe (0.3.1) + atomic (>= 1.1.7, < 2) + tilt (1.4.1) + treetop (1.4.15) + polyglot + polyglot (>= 0.3.1) + tzinfo (1.1.0) + thread_safe (~> 0.1) + +PLATFORMS + ruby + +DEPENDENCIES + news! diff --git a/MIT-LICENSE b/MIT-LICENSE new file mode 100644 index 0000000..ea966ec --- /dev/null +++ b/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright 2014 YOURNAME + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000..b237aa4 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,3 @@ += Bulletin + +This project rocks and uses MIT-LICENSE. \ No newline at end of file diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..dccbbb4 --- /dev/null +++ b/Rakefile @@ -0,0 +1,32 @@ +begin + require 'bundler/setup' +rescue LoadError + puts 'You must `gem install bundler` and `bundle install` to run rake tasks' +end + +require 'rdoc/task' + +RDoc::Task.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'News' + rdoc.options << '--line-numbers' + rdoc.rdoc_files.include('README.rdoc') + rdoc.rdoc_files.include('lib/**/*.rb') +end + + + + +Bundler::GemHelper.install_tasks + +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.libs << 'test' + t.pattern = 'test/**/*_test.rb' + t.verbose = false +end + + +task default: :test diff --git a/app/assets/images/news_alt.jpg b/app/assets/images/news_alt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a7b1fb329b2c448e18c6553eeea5f614c4e0a47a GIT binary patch literal 21854 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/news_bulletin/.keep b/app/assets/images/news_bulletin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/javascripts/admin/news.js b/app/assets/javascripts/admin/news.js new file mode 100644 index 0000000..dee720f --- /dev/null +++ b/app/assets/javascripts/admin/news.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/news_bulletin/.keep b/app/assets/javascripts/news_bulletin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/assets/stylesheets/admin/news.css b/app/assets/stylesheets/admin/news.css new file mode 100644 index 0000000..2c22c38 --- /dev/null +++ b/app/assets/stylesheets/admin/news.css @@ -0,0 +1,7 @@ +/* + Place all the styles related to the matching controller here. + They will automatically be included in application.css. +*/ +.table .expired{ + color: #BE2E2E; +} \ No newline at end of file diff --git a/app/assets/stylesheets/news_bulletin/.keep b/app/assets/stylesheets/news_bulletin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/.keep b/app/controllers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/controllers/admin/news_admins_controller.rb b/app/controllers/admin/news_admins_controller.rb new file mode 100644 index 0000000..165eab6 --- /dev/null +++ b/app/controllers/admin/news_admins_controller.rb @@ -0,0 +1,56 @@ +# encoding: utf-8 +class Admin::NewsAdminsController < OrbitAdminController + def initialize + super + @app_title = 'news_admin' + end + + def index + @unit_table_fields = ['news.unit','news.department'] + @unit = Unit.new + @units = Unit.order_by(sort) + end + + def create + unit = Unit.new(unit_params) + unit.save + redirect_to admin_news_admins_path + end + + def edit + @unit = Unit.find(params[:id]) + @unit_table_fields = ['news.unit','news.department'] + @units = Unit.order_by(sort) + + @url = admin_news_admin_path(@unit) + end + + def update + @unit = Unit.find(params[:id]) + @unit.update_attributes(unit_params) + + redirect_to admin_news_admins_path + end + + def destroy + unit = Unit.find(params[:id]) + unit.destroy + redirect_to admin_news_admins_path + end + + def unit_params + params.require(:unit).permit! + end + + def get_departments + unit = Unit.find(Sanitize.clean(params[:unit])) + departments = unit.departments.collect do |d| + { + "name" => d.name, + "id" => d.id.to_s + } + end + render :json => {"departments" => departments}.to_json + end + +end diff --git a/app/controllers/admin/news_controller.rb b/app/controllers/admin/news_controller.rb new file mode 100644 index 0000000..075516e --- /dev/null +++ b/app/controllers/admin/news_controller.rb @@ -0,0 +1,225 @@ +# encoding: utf-8 +class Admin::NewsController < OrbitAdminController + include Admin::NewsHelper + before_action ->(module_app = @app_title) { set_variables module_app } + before_action :set_news_bulletin, only: [:edit, :destroy] + before_action :load_access_level + + def initialize + super + @app_title = "news" + end + + def index + @tags = @module_app.tags + @categories = @module_app.categories.enabled + @filter_fields = filter_fields(@categories, @tags) + @table_fields = [:status, :category, :title, :start_date, :end_date, :image, "news.unit", :view_count] + + @news_bulletin = NewsBulletin.where(:is_preview.in=>[false,nil]) + .order_by(sort) + .with_categories(filters("category")) + .with_tags(filters("tag")) + .with_status(filters("status")) + + @news_bulletin = search_data(@news_bulletin,[:title]).page(params[:page]).per(10) + + if request.xhr? + render :partial => "index" + end + end + + def new + @tags = @module_app.tags + @statuses = [] + @news_bulletin = NewsBulletin.new + @news_bulletin.email_sentdate = Time.now + @unit = Unit.all + end + + def create + if !news_bulletin_params['news_bulletin_links_attributes'].nil? + news_bulletin_params['news_bulletin_links_attributes'].each do |idx,link| + news_bulletin_params['news_bulletin_links_attributes'].delete(idx.to_s) if link['url'].blank? + end + end + news_bulletin = NewsBulletin.new(news_bulletin_params) + news_bulletin.create_user_id = current_user.id + news_bulletin.update_user_id = current_user.id + if user_can_approve? + news_bulletin.approved = true + end + news_bulletin.save + build_email(news_bulletin) + redirect_to params['referer_url'] + end + + def approve_news_bulletin + id = params[:id] + news_bulletin = NewsBulletin.find(id) + news_bulletin.approved = true + news_bulletin.save + redirect_to admin_news_path + end + + def edit + if can_edit_or_delete?(@news_bulletin) + @unit = Unit.all + @department = Department.where(:unit_id => @news_bulletin.unit_id) + @tags = @module_app.tags + @categories = @module_app.categories.enabled + @statuses = [] + @news_bulletin.email_sentdate = Time.now if @news_bulletin.email_sent == false + @selected = nil + else + render_401 + end + end + + def update + uid = params[:id].split('-').last + news_bulletin = NewsBulletin.find_by(:uid=>uid) + news_bulletin_params[:tags] = news_bulletin_params[:tags].blank? ? [] : news_bulletin_params[:tags] + news_bulletin_params[:email_member_ids] = news_bulletin_params[:email_member_ids].blank? ? [] : news_bulletin_params[:email_member_ids] + + if !news_bulletin_params['news_bulletin_links_attributes'].nil? + news_bulletin_params['news_bulletin_links_attributes'].each do |idx,link| + news_bulletin_params['news_bulletin_links_attributes'].delete(idx.to_s) if link['url'].blank? + end + end + + news_bulletin.update_attributes(news_bulletin_params) + news_bulletin.save + build_email(news_bulletin) + redirect_to params['referer_url'] + end + + def destroy + @news_bulletin.destroy + redirect_to "/admin/news" + end + + def delete + if params[:ids] + NewsBulletin.any_in(:uid => params[:ids]).destroy_all + end + redirect_to "/admin/news" + end + + def preview + if params['preview_type'].eql?('edit') + news_bulletin_data = news_bulletin_params + org_news_bulletin = NewsBulletin.find(params['news_bulletin_id']) + news_bulletin = org_news_bulletin.clone + news_bulletin.generate_uid + news_bulletin.news_bulletin_files = [] + news_bulletin.news_bulletin_links = [] + if news_bulletin_data['image'].blank? + news_bulletin.image = org_news_bulletin.image + end + + if !news_bulletin_data['news_bulletin_files_attributes'].blank? + news_bulletin_data['news_bulletin_files_attributes'].each do |key, news_bulletin_file| + next if !news_bulletin_file['_destroy'].blank? + file = nil + if news_bulletin_file['id'].blank? + file = NewsBulletinFile.new(news_bulletin_file) + file.news_bulletin_id = news_bulletin.id + file.save + else + org_file = NewsBulletinFile.find(news_bulletin_file['id']) + file = org_file.clone + file.news_bulletin_id = news_bulletin.id + file.file = org_file.file + news_bulletin_file.delete('id') + news_bulletin_file.delete('_destroy') + file.update_attributes(news_bulletin_file) + end + + file.save + news_bulletin.news_bulletin_files << file + end + end + + if !news_bulletin_data['news_bulletin_links_attributes'].blank? + news_bulletin_data['news_bulletin_links_attributes'].each do |key, news_bulletin_link| + next if !news_bulletin_link['_destroy'].blank? + + if news_bulletin_link['id'].blank? + link = NewsBulletinLink.new(news_bulletin_link) + link.news_bulletin_id = news_bulletin.id + else + link = NewsBulletinLink.find(news_bulletin_link['id']).clone + link.news_bulletin_id = news_bulletin.id + news_bulletin_link.delete('id') + news_bulletin_link.delete('_destroy') + link.update_attributes(news_bulletin_link) + end + + link.save + news_bulletin.news_bulletin_links << link + end + end + + news_bulletin_data.delete('news_bulletin_files_attributes') + news_bulletin_data.delete('news_bulletin_links_attributes') + news_bulletin.update_attributes(news_bulletin_data) + else + news_bulletin = NewsBulletin.new(news_bulletin_params) + end + + news_bulletin.is_preview = true + news_bulletin.save + render :text=>page_for_news_bulletin(news_bulletin) + end + + def destroy_preview + news_bulletin = NewsBulletin.find_by(:uid=>params['uid']) + if news_bulletin.is_preview + news_bulletin.destroy + end + render :json=>{'destroy'=>news_bulletin.id.to_s} + end + + def build_email(news_bulletin) + if news_bulletin.email_sent and !news_bulletin.email_addresses.blank? + if news_bulletin.email.nil? + email = Email.new + email.save + news_bulletin.email_id = email.id + news_bulletin.save + end + + is_sent = news_bulletin.email.is_sent + is_sent = !params[:resend_mail].eql?("true") if !params[:resend_mail].blank? + + news_bulletin.email.update_attributes( + :create_user=>current_user, + :mail_sentdate=>news_bulletin.email_sentdate, + :module_app=>@module_app, + :mail_to=>news_bulletin.email_addresses, + :mail_subject=>news_bulletin.title, + :template=>'news/email', + :template_data=>{ + "host" => request.host_with_port, + "title" => news_bulletin.title, + "url" => page_for_news_bulletin(news_bulletin) + }, + :is_sent=>is_sent + ) + else + news_bulletin.email.destroy if !news_bulletin.email.nil? + end + end + + private + + def set_news_bulletin + @news_bulletin = NewsBulletin.find(params[:id]) + end + + def news_bulletin_params + params[:news_bulletin][:email_sent] = params[:news_bulletin][:email_sent].nil? ? 0 : params[:news_bulletin][:email_sent] + params.require(:news_bulletin).permit! + end +end diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb new file mode 100644 index 0000000..fdde9ee --- /dev/null +++ b/app/controllers/news_controller.rb @@ -0,0 +1,169 @@ +class NewsController < ApplicationController + + def index + params = OrbitHelper.params + news = nil + + if params[:keywords] + news = NewsBulletin.where(:title.ne => "").any_of(:title => /#{params[:keywords].to_s}/i).is_approved.order_by(:created_at=>'desc').filter_by_categories(["all"]).per(15) if !params[:keywords].nil? + news_count = news.count + keyword = params[:keywords] + elsif params["department"] + dept = Department.find_by(:uid => params["department"].split("-").last) rescue nil + news = NewsBulletin.where(:title.ne => "" ,:department => dept).is_approved.order_by(:created_at=>'desc').filter_by_categories(["all"]) if !dept.nil? + news_count = news.count + keyword = params[:department] + elsif params["unit"] + unit = Unit.find_by(:uid => params["unit"].split("-").last) rescue nil + news = NewsBulletin.where(:title.ne => "" ,:unit => unit).is_approved.order_by(:created_at=>'desc').filter_by_categories(["all"]) if !unit.nil? + news_count = news.count + keyword = params[:unit] + elsif params["category"] + category = Category.find_by(:uid => params["category"].split("-").last) rescue nil + news = NewsBulletin.all.where(:title.ne => "").is_approved.order_by(:created_at=>'desc').filter_by_categories([category.id.to_s]) if !category.nil? + news_count = news.count + keyword = params[:category] + end + news = NewsBulletin.where(:title.ne => "" ,:is_preview.in=>[false,nil]).is_approved.order_by(:created_at=>'desc').filter_by_categories.filter_by_tags(OrbitHelper.params['tags']) if news.nil? + page = Page.where(:module => "news").first rescue nil + ma = ModuleApp.find_by_key("news") rescue nil + categories = ma.categories.enabled.collect do |cat| + { + "category-name" => cat.title, + "category-link" => "/#{I18n.locale.to_s + page.url}/?category=#{cat.to_param}" + } + end + anns = news.collect do |a| + statuses = a.statuses_with_classname.collect do |status| + { + "status" => status["name"], + "status-class" => "status-#{status['classname']}" + } + end + { + "title" => a.title, + "subtitle" => a.subtitle, + "statuses" => statuses, + "category" => a.category.title, + "postdate" => a.postdate.strftime('%Y-%m-%d'), + "link_to_show" => OrbitHelper.url_to_show(a.to_param), + "img_src" => a.image.thumb.url || "http://placehold.it/100x100", + "more" => t(:more_plus) + } + end + { + "news" => anns, + "categories" => categories, + "extras" => { + "categories-title" => t("news.categories"), + "widget-title" =>t('news.news'), + "title-head" => t('news.table.title'), + "date-head" => t('news.table.date'), + "status-head" => t('news.table.status'), + "subtitle-head" => t('news.table.sub_title'), + "category-head" => t('news.table.category'), + "news_count" => news_count, + "keyword" => keyword + }, + "total_pages" => news.total_pages + } + + end + + def widget + news = NewsBulletin.where(:title.ne => "",:is_preview.in=>[false,nil]).is_approved.order_by(:created_at=>'desc').filter_by_widget_categories.filter_by_tags(OrbitHelper.widget_tags) + page = Page.where(:module => "news").first rescue nil + ma = ModuleApp.find_by_key("news") rescue nil + categories = ma.categories.enabled.collect do |cat| + { + "name" => cat.title, + "category-link" => "/#{I18n.locale.to_s + page.url}/?category=#{cat.to_param}" + } + end + + categories.unshift({"name" => t("news.all"), "category-link" => "/#{I18n.locale.to_s + page.url}/"}) + + anns = news.collect do |a| + statuses = a.statuses_with_classname.collect do |status| + { + "status" => status["name"], + "status-class" => "status-#{status['classname']}" + } + end + { + "title" => a.title, + "subtitle" => a.subtitle, + "statuses" => statuses, + "category" => a.category.title, + "postdate" => a.postdate, + "link_to_show" => OrbitHelper.widget_item_url(a.to_param), + "img_src" => a.image.thumb.url || "http://placehold.it/100x100", + } + end + { + "news" => anns, + "categories" => categories, + "extras" => { + "more_url"=>OrbitHelper.widget_more_url, + "title-head" => t('news.table.title'), + "date-head" => t('news.table.date'), + "status-head" => t('news.table.status'), + "subtitle-head" => t('news.table.sub_title'), + "category-head" => t('news.table.category') + } + } + end + + def show + params = OrbitHelper.params + news = NewsBulletin.find_by(:uid=>params[:uid]) + url_to_edit = OrbitHelper.user_can_edit?(news) ? "/admin/news/#{news.id.to_s}/edit" : "" + + access_level = OrbitHelper.user_access_level? + page = Page.where(:module => "news").first rescue nil + + if !news.approved && (access_level != "manager" && access_level != "admin") + return {} + end + ma = ModuleApp.find_by_key("news") rescue nil + categories = ma.categories.enabled.collect do |cat| + { + "category-name" => cat.title, + "category-link" => "/#{I18n.locale.to_s + page.url}/?category=#{cat.to_param}" + } + end + + tags = news.tags.map{|tag| { + "tag" => tag.name , + "url" => OrbitHelper.page_for_tag(tag) + } } rescue [] + files = news.news_bulletin_files.collect{|file| { "file_url" => file.file.url, "file_title" => (file.title.blank? ? File.basename(file.file.path) : file.title) } } rescue [] + links = news.news_bulletin_links.collect{|link| { "link_url" => link.url, "link_title" => (link.title.blank? ? link.url : link.title) } } rescue [] + update_user = news.update_user.member_profile.name rescue "" + department = news.department rescue "" + { + "tags" => tags, + "news_bulletin_files" => files, + "news_bulletin_links" => links, + "categories" => categories, + "data" => { + "categories-title" => t("news.categories"), + "title" => news.title, + "category" => news.category.title, + "category-link" => "/#{I18n.locale.to_s + page.url}/?category=#{news.category.to_param}", + "unit" => news.unit.name, + "unit-link" => "/#{I18n.locale.to_s + page.url}/?unit=#{news.unit.to_param}", + "department" => (department.name rescue ""), + "department-link" => "/#{I18n.locale.to_s + page.url}/?department=#{(department.to_param rescue "")}", + "update_user" => update_user, + "updated_at" => news.updated_at.strftime('%Y-%m-%d %H:%M'), + "body" =>news.text, + "image" => news.image.url, + "view_count" =>news.view_count + }, + "impressionist" => (news.is_preview ? nil : news), + "url_to_edit"=>url_to_edit + } + end + +end diff --git a/app/helpers/.keep b/app/helpers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/helpers/admin/news_helper.rb b/app/helpers/admin/news_helper.rb new file mode 100644 index 0000000..df8da0f --- /dev/null +++ b/app/helpers/admin/news_helper.rb @@ -0,0 +1,47 @@ +module Admin::NewsHelper + def page_for_news_bulletin(news_bulletin) + ann_page = nil + pages = Page.where(:module=>'news') + + pages.each do |page| + if page.categories.count ==1 + if page.categories.include?(news_bulletin.category.id.to_s) + ann_page = page + end + end + break if !ann_page.nil? + end + + if ann_page.nil? + pages.each do |page| + if page.categories.include?(news_bulletin.category.id.to_s) + ann_page = page + end + break if !ann_page.nil? + end + end + + ann_page = pages.first if ann_page.nil? + request.protocol+(request.host_with_port+ann_page.url+'/'+news_bulletin.to_param).gsub('//','/') rescue "/" + end + + def load_access_level + if current_user.is_admin? + @access_level = "admin" + elsif current_user.is_manager?(@module_app) + @access_level = "manager" + end + end + + def user_can_approve? + case @access_level + when "admin" + return true + when "manager" + return true + else + return false + end + end + +end diff --git a/app/mailers/.keep b/app/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/.keep b/app/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/models/department.rb b/app/models/department.rb new file mode 100644 index 0000000..c4bc905 --- /dev/null +++ b/app/models/department.rb @@ -0,0 +1,14 @@ +# encoding: utf-8 +class Department + + include Mongoid::Document + include Mongoid::Timestamps + include Slug + + field :name, as: :slug_title, :localize => true + field :sort_number, :type => Integer + field :should_destroy, :type => Boolean + + belongs_to :unit + +end \ No newline at end of file diff --git a/app/models/news_bulletin.rb b/app/models/news_bulletin.rb new file mode 100644 index 0000000..120235c --- /dev/null +++ b/app/models/news_bulletin.rb @@ -0,0 +1,79 @@ +class NewsBulletin + include Mongoid::Document + include Mongoid::Timestamps + + include OrbitModel::Status + include OrbitModel::Impression + # encoding: utf-8 + include OrbitTag::Taggable + include OrbitCategory::Categorizable + include Slug + + field :title, as: :slug_title, type: String, localize: true + field :subtitle, localize: true + field :text, localize: true + + field :create_user_id + field :update_user_id + + field :public, :type => Boolean, :default => true + field :postdate , :type => DateTime, :default => Time.now + field :deadline , :type => DateTime + field :rss2_sn + field :approved, :type => Boolean, :default => false + field :is_preview, :type => Boolean, :default => false + + field :email_id + field :email_sent, :type => Boolean, :default => false + field :email_sentdate , :type => DateTime + field :email_member_ids + field :other_mailaddress + + mount_uploader :image, ImageUploader + + belongs_to :unit + belongs_to :department + + has_many :news_bulletin_links, :autosave => true, :dependent => :destroy + has_many :news_bulletin_files, :autosave => true, :dependent => :destroy + + accepts_nested_attributes_for :news_bulletin_files, :allow_destroy => true + accepts_nested_attributes_for :news_bulletin_links, :allow_destroy => true + + before_destroy :destroy_email + + scope :can_display, ->{where(:is_hidden=>false).any_of({:postdate.lt=>Time.now, :deadline.gt=>Time.now},{:postdate.lt=>Time.now, :deadline=>nil}).order_by([:is_top, :desc])} + scope :is_approved, ->{where(:approved => true)} + + def update_user + User.find(update_user_id) rescue nil + end + + def update_user=(user) + self.update_user_id = user.id + end + + def email_members + MemberProfile.find(self.email_member_ids) rescue [] + end + + def email_addresses + addresses = self.email_members.collect{|member| member.email} rescue [] + addresses = addresses +[self.other_mailaddress] if !self.other_mailaddress.blank? + addresses.flatten + end + + def email + mail = Email.find(self.email_id) rescue nil + end + + def expired? + (self.deadline < Time.now) rescue false + end + + def destroy_email + mail = Email.find(self.email_id) rescue nil + mail.destroy if !mail.nil? + end + +end diff --git a/app/models/news_bulletin_file.rb b/app/models/news_bulletin_file.rb new file mode 100644 index 0000000..65e3c4e --- /dev/null +++ b/app/models/news_bulletin_file.rb @@ -0,0 +1,14 @@ +# encoding: utf-8 +class NewsBulletinFile + + include Mongoid::Document + include Mongoid::Timestamps + + mount_uploader :file, AssetUploader + + field :description, localize: true + field :title, localize: true + + belongs_to :news_bulletin + +end diff --git a/app/models/news_bulletin_link.rb b/app/models/news_bulletin_link.rb new file mode 100644 index 0000000..3685fd2 --- /dev/null +++ b/app/models/news_bulletin_link.rb @@ -0,0 +1,25 @@ +# encoding: utf-8 +require 'uri' + +class NewsBulletinLink + include Mongoid::Document + include Mongoid::Timestamps + + field :url + field :title, localize: true + + belongs_to :news_bulletin + + before_validation :add_http + + validates :url, :presence => true, :format => /\A(http|https):\/\/(([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5})|((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(:[0-9]{1,5})?(\/.*)?\Z/i + + protected + + def add_http + unless self.url[/^http:\/\//] || self.url[/^https:\/\//] + self.url = 'http://' + self.url + end + end + +end \ No newline at end of file diff --git a/app/models/unit.rb b/app/models/unit.rb new file mode 100644 index 0000000..6393c06 --- /dev/null +++ b/app/models/unit.rb @@ -0,0 +1,24 @@ +# encoding: utf-8 +class Unit + include Mongoid::Document + include Mongoid::Timestamps + include Slug + + field :name, as: :slug_title, :localize => true + field :sort_number, type: Integer + + has_many :departments, :autosave => true, :dependent => :destroy + + accepts_nested_attributes_for :departments, :allow_destroy => true + + after_save :save_departments + + def save_departments + self.departments.each do |t| + if t.should_destroy + t.destroy + end + end + end + +end \ No newline at end of file diff --git a/app/views/.keep b/app/views/.keep new file mode 100644 index 0000000..e69de29 diff --git a/app/views/admin/news/_form.html.erb b/app/views/admin/news/_form.html.erb new file mode 100644 index 0000000..f400c19 --- /dev/null +++ b/app/views/admin/news/_form.html.erb @@ -0,0 +1,483 @@ + + +<% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> + <%= stylesheet_link_tag "lib/fileupload" %> + <%= stylesheet_link_tag "lib/main-list" %> +<% end %> +<% content_for :page_specific_javascript do %> + <%= javascript_include_tag "lib/bootstrap-fileupload" %> + <%= javascript_include_tag "lib/bootstrap-datetimepicker" %> + <%= javascript_include_tag "lib/datetimepicker/datetimepicker.js" %> + <%= javascript_include_tag "lib/file-type" %> + <%= javascript_include_tag "lib/module-area" %> +<% end %> + + +
+ + + + + + +
+ + +
+ + +
+ +
+ <% if request.params["action"] == "edit" %> + <%= f.select :unit_id, @unit.collect{|t| [ t.name, t.id ]} %> + <%= f.select :department_id, @department.collect{|t| [ t.name, t.id ]} %> + <% elsif request.params["action"]== "new" %> + <%= + select_tag "news_bulletin[unit_id]", + options_from_collection_for_select(@unit, "id", "name"), + :'data-remote' => 'true', + :'url' => "/admin/news/getdata", + :'prompt' => t("news_bulletin.ut_prompt"), + :'data-type' => 'json' + %> + <%= + select_tag "news_bulletin[department_id]" + %> + <% end %> +
+
+ + +
+ +
+ <%= select_category(f, @module_app) %> +
+
+ + +
+ +
+ <%= f.datetime_picker :postdate, :no_label => true %> +
+
+ +
+ +
+ <%= f.datetime_picker :deadline, :no_label => true %> +
+
+ +
+ + +
+ + +
+ +
+ + + +
+
+ +
+ <%# end %> + + +
+ + +
+ +
+
+
+ <% if @news_bulletin.image.file %> + <%= image_tag @news_bulletin.image %> + <% else %> + + <% end %> +
+
+ + <%= t(:select_image) %> + <%= t(:change) %> + <%= f.file_field :image %> + + <%= t(:cancel) %> +
+ +
+
+
+ +
+
+ ※<%= t("ad.widget_info_for_ad_image_size", :best_size=> "290px x 150px") %> +
+ ※<%= t("news.image_size_limit")%> +
+ ※<%= t("news.image_note")%> +
+ ※如何裁剪新聞刊頭圖片 +
+
+
+ + +
+
+ +
+ +
+ + + + + + +
+ + <% @site_in_use_locales.each_with_index do |locale, i| %> + +
"> + + +
+ +
+ <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, class: "input-block-level", placeholder: t(:title), value: (@news_bulletin.title_translations[locale] rescue nil) %> + <% end %> +
+
+ + +
+ +
+
+ <%= f.fields_for :subtitle_translations do |f| %> + <%= f.text_area locale, rows: 2, class: "input-block-level", value: (@news_bulletin.subtitle_translations[locale] rescue nil) %> + <% end %> +
+
+
+ + +
+ +
+
+ ※內文裡單一圖片大小為1MB以下。 +
+ ※內文裡單一圖片尺寸的最大寬度600px(滿版),如圖片要縮小,請依比例調整。 +
+ ※如何剪裁新聞圖片。 +
+
+ <%= f.fields_for :text_translations do |f| %> + <%= f.cktext_area locale, rows: 5, class: "input-block-level", :value => (@news_bulletin.text_translations[locale] rescue nil) %> + <% end %> +
+
+
+ +
+ + <% end %> + + +
+ +
+ + + <% if @news_bulletin && !@news_bulletin.news_bulletin_links.blank? %> +
+ <% @news_bulletin.news_bulletin_links.each_with_index do |news_bulletin_link, i| %> + <%= f.fields_for :news_bulletin_links, news_bulletin_link do |f| %> + <%= render :partial => 'form_link', :object => news_bulletin_link, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
+
+ <% end %> + + +
+
+

+ <%= hidden_field_tag 'news_bulletin_link_field_count', @news_bulletin.news_bulletin_links.count %> + <%= t(:add) %> +

+ +
+
+ + +
+ +
+ + + <% if @news_bulletin && !@news_bulletin.news_bulletin_files.blank? %> +
+ <% @news_bulletin.news_bulletin_files.each_with_index do |news_bulletin_file, i| %> + <%= f.fields_for :news_bulletin_files, news_bulletin_file do |f| %> + <%= render :partial => 'form_file', :object => news_bulletin_file, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
+
+ <% end %> + + +
+
+

+ <%= hidden_field_tag 'news_bulletin_file_field_count', @news_bulletin.news_bulletin_files.count %> + <%= t(:add) %> +

+ +
+
+ +
+ +
+ + +
+ <%= get_referer_url[:action] rescue "" %> + <%= f.submit t('submit'), class: 'btn btn-primary' %> + + <%= button_tag t("preview"), id: "button_for_preview", name: "commit", class: 'btn', type: :button %> + <%= link_to t('cancel'), admin_news_index_path, :class=>"btn" %> +
+ + + + + +<% content_for :page_specific_javascript do %> + +<% end %> \ No newline at end of file diff --git a/app/views/admin/news/_form_file.html.erb b/app/views/admin/news/_form_file.html.erb new file mode 100644 index 0000000..8628623 --- /dev/null +++ b/app/views/admin/news/_form_file.html.erb @@ -0,0 +1,55 @@ +<% if form_file.new_record? %> +
+<% else %> +
+ <% if form_file.file.blank? %> + <%= t(:no_file) %> + <% else %> + <%= link_to content_tag(:i) + form_file.file_identifier, form_file.file.url, {:class => 'file-link file-type', :target => '_blank', :title => form_file.file_identifier} %> + <% end %> +<% end %> +
+ + + + <% @site_in_use_locales.each_with_index do |locale, i| %> + <%= locale %>"> + <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, :class => "input-medium", placeholder: t(:alternative), :value => (form_file.title_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + + <% @site_in_use_locales.each_with_index do |locale, i| %> + <%= locale %>"> + <%= f.fields_for :description_translations do |f| %> + <%= f.text_field locale, :class => "input-medium", placeholder: t(:description), :value => (form_file.description_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + <% if form_file.new_record? %> + + + + <% else %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> +
+
\ No newline at end of file diff --git a/app/views/admin/news/_form_link.html.erb b/app/views/admin/news/_form_link.html.erb new file mode 100644 index 0000000..461a3fc --- /dev/null +++ b/app/views/admin/news/_form_link.html.erb @@ -0,0 +1,26 @@ +
+ + <%= f.text_field :url, class: "input-large", placeholder: t(:url) %> + + + <% @site_in_use_locales.each_with_index do |locale, i| %> + <%= locale %>"> + <%= f.fields_for :title_translations do |f| %> + <%= f.text_field locale, :class => "input-large", placeholder: t(:url_alt), :value => (form_link.title_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + <% if form_link.new_record? %> + + + + <% else %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> +
diff --git a/app/views/admin/news/_index.html.erb b/app/views/admin/news/_index.html.erb new file mode 100644 index 0000000..b14e829 --- /dev/null +++ b/app/views/admin/news/_index.html.erb @@ -0,0 +1,136 @@ + + + + + + <% @table_fields.each do |f| %> + <%= thead(f) %> + <% end %> + + + + <% @news_bulletin.each do |b| %> + + + + + + + + + + + + + + <% end %> + +
+ <%= b.status_for_table %> + <%= b.category.title %> + <% if b.expired? %> + <%= b.title %> <%= t(:expired) %> + <% elsif !b.approved? %> + <%= b.title %> <%= t(:pending) %> + <% else %> + <%= b.title %> + <% end %> +
+ +
+
<%= format_value b.postdate %>"><%= format_value b.deadline %> + <%= content_tag(:div, image_tag(b.image.file.blank? ? "/assets/news_alt.jpg" : b.image.url), {:class => "img-peview", :rel=>"popover", "data-content"=>"#{image_tag(b.image.file.blank? ? "/assets/news_alt.jpg" : b.image.url)}", "data-trigger"=>"hover", "data-placement"=>"left"}) %> + + <% Unit.where({:id => b.unit_id}).each do |u| %> + <%= u.name %> + <% end %> + <% Department.where({:id => b.department}).each do |d| %> + -<%= d.name %> + <% end %> + <%= b.view_count %>
+
" class="footable-row-detail-inner" style="display: none;"> +
+ <%= t(:tags) %> : + <% b.tags.each do |tag| %> + <%= tag.name %> + <% end %> +
+
+ <%= t("news.email_to") %> : + <% b.email_members.each do |member| %> + <%= member.name %> + <% end %> + <% unless b.other_mailaddress.nil? %> + <% b.other_mailaddress.split(',').each do |mailaddress| %> + <%= mailaddress %> + <% end %> + <% end %> +
+
+
+ +<%= + content_tag :div, class: "bottomnav clearfix" do + content_tag :div, paginate(@news_bulletin), class: "pagination pagination-centered" + end +%> + +<% content_for :page_specific_css do %> + +<% end %> +<% content_for :page_specific_javascript do %> + +<% end %> \ No newline at end of file diff --git a/app/views/admin/news/edit.html.erb b/app/views/admin/news/edit.html.erb new file mode 100644 index 0000000..1d57feb --- /dev/null +++ b/app/views/admin/news/edit.html.erb @@ -0,0 +1,5 @@ +<%= form_for @news_bulletin, url: admin_news_path(@news_bulletin), html: {class: "form-horizontal main-forms previewable"} do |f| %> +
+ <%= render :partial => 'form', locals: {f: f} %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/news/index.html.erb b/app/views/admin/news/index.html.erb new file mode 100644 index 0000000..1ad9a26 --- /dev/null +++ b/app/views/admin/news/index.html.erb @@ -0,0 +1,6 @@ +<%= render_filter @filter_fields, "index_table" %> + + <%= render 'index'%> + + +<%= render 'layouts/delete_modal', delete_options: @delete_options %> \ No newline at end of file diff --git a/app/views/admin/news/new.html.erb b/app/views/admin/news/new.html.erb new file mode 100644 index 0000000..24180f8 --- /dev/null +++ b/app/views/admin/news/new.html.erb @@ -0,0 +1,5 @@ +<%= form_for @news_bulletin, url: admin_news_index_path, html: {class: "form-horizontal main-forms previewable"} do |f| %> +
+ <%= render :partial => 'form', locals: {f: f} %> +
+<% end %> \ No newline at end of file diff --git a/app/views/admin/news_admins/_form_dept.html.erb b/app/views/admin/news_admins/_form_dept.html.erb new file mode 100644 index 0000000..e625f52 --- /dev/null +++ b/app/views/admin/news_admins/_form_dept.html.erb @@ -0,0 +1,32 @@ +
+
+ '> + + <% @site_in_use_locales.each_with_index do |locale, i| %> + + <%= locale %>"> + <%= f.fields_for :name_translations do |f| %> + <%= f.text_field locale, :class => "input-medium", placeholder: t('news.department'), :value => (form_dept.name_translations[locale] rescue nil) %> + <% end %> + + <% end %> + + + + + <%= f.text_field :sort_number , :class => "input-mini" %> + + + <% if form_dept.new_record? %> + + + + <% else %> + + <%= f.hidden_field :id %> + + <%= f.hidden_field :_destroy, :value => nil, :class => 'should_destroy' %> + + <% end %> +
+
diff --git a/app/views/admin/news_admins/edit.html.erb b/app/views/admin/news_admins/edit.html.erb new file mode 100644 index 0000000..7a15cdc --- /dev/null +++ b/app/views/admin/news_admins/edit.html.erb @@ -0,0 +1,145 @@ + +<%= render 'layouts/delete_modal', delete_options: @delete_options %> + + + + <% @unit_table_fields.each do |f| %> + <%= thead(f) %> + <% end %> + + + + <% @units.each do |a| %> + + + + + <% end %> + +
+ <%= a.name %> +
+ +
+
+ <% Department.where({:unit_id => a.id}).each do |d| %> + <%= d.name %>
+ <% end %> +
+<%= form_for @unit, :url => @url, html: {class: "form-horizontal main-forms previewable"} do |f| %> +
+
+ <% # encoding: utf-8 %> + <% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> + <%= stylesheet_link_tag "lib/main-list" %> + <% end %> + <% content_for :page_specific_javascript do %> + <%= javascript_include_tag "lib/module-area" %> + <% end %> + +

<%= @unit.new_record? ? t(:add) : t(:edit) %>

+ + + + + + +
+ + <% @site_in_use_locales.each_with_index do |locale, i| %> + +
"> + + +
+ +
+ <%= f.fields_for :name_translations do |f| %> + <%= f.text_field locale, class: "input-xxlarge", placeholder: t(:name), value: (@unit.name_translations[locale] rescue nil) %> + <% end %> +
+
+ +
+ + <% end %> + + +
+ +
+ + + <% if @unit && !@unit.departments.blank? %> +
+ <% @unit.departments.each_with_index do |department, i| %> + <%= f.fields_for :departments, department do |f| %> + <%= render :partial => 'form_dept', :object => department, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
+
+ <% end %> + + +
+
+

+ <%= hidden_field_tag 'department_field_count', @unit.departments.count %> + <%= t(:add) %> +

+
+
+
+
+ +
+ <%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %> + <%= f.submit t('submit'), class: 'btn btn-primary' %> + +
+ + <% content_for :page_specific_javascript do %> + + <% end %> + +
+<% end %> + diff --git a/app/views/admin/news_admins/index.html.erb b/app/views/admin/news_admins/index.html.erb new file mode 100644 index 0000000..a5a2abd --- /dev/null +++ b/app/views/admin/news_admins/index.html.erb @@ -0,0 +1,144 @@ +<%= render 'layouts/delete_modal', delete_options: @delete_options %> + + + + <% @unit_table_fields.each do |f| %> + <%= thead(f) %> + <% end %> + + + + <% @units.each do |a| %> + + + + + <% end %> + +
+ <%= a.name %> +
+ +
+
+ <% Department.where({:unit_id => a.id}).each do |d| %> + <%= d.name %>
+ <% end %> +
+<%= form_for @unit, :url => admin_news_admins_path, html: {class: "form-horizontal main-forms previewable"} do |f| %> +
+
+ <% # encoding: utf-8 %> + <% content_for :page_specific_css do %> + <%= stylesheet_link_tag "lib/main-forms" %> + <%= stylesheet_link_tag "lib/main-list" %> + <% end %> + <% content_for :page_specific_javascript do %> + <%= javascript_include_tag "lib/module-area" %> + <% end %> + +

<%= @unit.new_record? ? t(:add) : t(:edit) %>

+ + + + + + +
+ + <% @site_in_use_locales.each_with_index do |locale, i| %> + +
"> + + +
+ +
+ <%= f.fields_for :name_translations do |f| %> + <%= f.text_field locale, class: "input-xxlarge", placeholder: t('news.unit'), value: (@unit.name_translations[locale] rescue nil) %> + <% end %> +
+
+ +
+ + <% end %> + + +
+ +
+ + + <% if @unit && !@unit.departments.blank? %> +
+ <% @unit.departments.each_with_index do |department, i| %> + <%= f.fields_for :departments, department do |f| %> + <%= render :partial => 'form_dept', :object => department, :locals => {:f => f, :i => i} %> + <% end %> + <% end %> +
+
+ <% end %> + + +
+
+

+ <%= hidden_field_tag 'department_field_count', @unit.departments.count %> + <%= t(:add) %> +

+
+
+
+
+ + + +
+ <%= hidden_field_tag 'page', params[:page] if !params[:page].blank? %> + <%= f.submit t('submit'), class: 'btn btn-primary' %> +
+ + <% content_for :page_specific_javascript do %> + + <% end %> +
+<% end %> + diff --git a/app/views/news/email.html.erb b/app/views/news/email.html.erb new file mode 100644 index 0000000..5ceab4b --- /dev/null +++ b/app/views/news/email.html.erb @@ -0,0 +1,19 @@ + + + + + + +
+ + <%= t('news.mail_hi') %>

+ <%= t('news.mail_url_view') %>

+ " target="_blank"> <%= @data["title"] %>

+ + --
+ <%= t('news.mail_source') %> :" target="_blank"> <%= Site.first.title %>
+ <%= t('news.mail_time') %> <%= DateTime.now %> +
+ + + \ No newline at end of file diff --git a/app/views/news/index.html.erb b/app/views/news/index.html.erb new file mode 100644 index 0000000..648b75c --- /dev/null +++ b/app/views/news/index.html.erb @@ -0,0 +1 @@ +<%= render_view %> \ No newline at end of file diff --git a/app/views/news/show.html.erb b/app/views/news/show.html.erb new file mode 100644 index 0000000..648b75c --- /dev/null +++ b/app/views/news/show.html.erb @@ -0,0 +1 @@ +<%= render_view %> \ No newline at end of file diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000..08ba0ad --- /dev/null +++ b/bin/rails @@ -0,0 +1,18 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application. + +ENGINE_ROOT = File.expand_path('../..', __FILE__) +ENGINE_PATH = File.expand_path('../../lib/announcement/engine', __FILE__) + +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) + +# require 'rails/all' +# require 'rails/engine/commands' +require "action_controller/railtie" +require "action_mailer/railtie" +require "sprockets/railtie" +require "rails/test_unit/railtie" +require 'rails/engine/commands' +require "mongoid/railtie" diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000..48692d9 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,62 @@ +en: + + news: + admins: Unit Setting + unit: Unit + department: Department + all: All + table: + title : Title + date : Date + status : Status + sub_title: Sub Title + category: Category + add_new: Add New + approve: Approve + all_articles: All Articles + news: News + approval_setting: Approval Setting + approve_bulletin_fail: Approval Fail + approve_bulletin_success: Approve Successfully + bulletins: Bulletins + categories: Categories + create_bulletin_success: Create Bulletin Successfully + create_bulletin_category_success: Create Category Successfully + date: News Date + default_widget: + bulletin_category_with_title: Bulletin Category with Title + postdate: Post Date + subtitle: Subtitle + title: Title + editing_announcement: Edit News + editing_announcement_category: Edit Category + file: Attachment + file_description: File Description + file_name: File Name + frontend: + bulletins: News front-end + search_result: Search result + link_name: Link Name + new_bulletin_category: New Bulletin Category + picture: Cover Picture + search: Search + selected_file: Select File + update_bulletin_category_success: Update Category Successfully + url: URL + widget: + bulletins_and_web_links: Differential Nav. + index: Index + search: Search + email_reminder: Email Reminder + activate_email_reminder: Activate Email Reminder + email_sentdate: Email Time + email_to: Email To + mail_subject: this is an news reminder from【%{site_title}】 + other_mailaddress: Other Email + other_mailaddress_note: Divide different email accounts with "," + mail_hi: Hi + mail_url_view: This email is the reminder of an news, please click the link for the details + mail_source: Source + mail_time: Time + image_upload_size_note: The following recommendations %{image_upload_size} upload size + resend_mail: Re-send Email \ No newline at end of file diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml new file mode 100644 index 0000000..afe80ff --- /dev/null +++ b/config/locales/zh_tw.yml @@ -0,0 +1,90 @@ +zh_tw: + + module_name: + news: 新聞 + + news_bulletin: + user_default_image: 或使用預設圖片 + all_category: 全部類別 + campus_news: 校園新聞 + category: 分類 + create_news_bulletin_category_success: 新聞類別已成功建立 + create_news_bulletin_success: 新聞已成功建立 + department: 單位 + editing_news: 編輯新聞 + editing_news_category: 編輯類別 + error: + no_avilb_cate_for_posting: 新聞必需有一個類別才能發送,請與管理員聯絡 + hot: 頭版 + news_bulletins: 新聞 + new_news_category: 新增新聞類別 + search: 搜尋新聞 + update_news_bulletin_category_success: 新聞類別已成功建立 + update_news_bulletin_success: 新聞已成功更新 + ut_prompt: 請選擇單位 + news: + unit: 單位 + department: 系所 + add_new: 新建 + all_articles: 文章列表 + all: 全部類別 + news: 新聞 + admins: 單位設定 + append_note: 以下之附加連結與檔案,為使前台顯示名稱,建議您輸入註解。 + approval_setting: 審核設定 + approve_news_bulletin_fail: 審核失敗 + approve_news_bulletin_success: 審核成功 + news_bulletins: 新聞 + categories: 類別 + create_news_bulletin_success: 建立新聞成功 + create_news_bulletin_category_success: 建立類別成功 + date: 起迄日期 + default_widget: + news_bulletin_category_with_title: 類別 + postdate: 張貼日期 + subtitle: 副標題 + title: 標題 + news_bulletin_create_dept: 單位 + editing_news: 編輯類別 + editing_news_category: 編輯類別 + error: + no_avilb_cate_for_posting: 沒有可以張貼的類別 + file: 附加檔案 + file_description: 檔案描述 + file_name: 檔案名稱 + file_size: 檔案大小 + file_size_limit: 檔案大小上限 + file_size_exceed_limitation: 超過上限 + frontend: + news_bulletins: 新聞前台 + search_result: 搜尋結果頁 + index_by_unit: index_by_unit + image: 封面圖片 + image_note: 此處上傳的圖片不會在公告內文出現 + image_size_limit: 圖片大小為1MB以下 + link_name: 連結名稱 + new_news_bulletin_category: 新增新聞類別 + picture: 刊頭圖片 + search: 搜尋 + selected_file: 選擇檔案 + update_news_bulletin_category_success: 更新類別成功 + url: 連結位置 + widget: + news_bulletins_side_bar: News bulletins side bar + home_banner: Home banner + news_bulletins_and_web_links: 分眾頁籤 + index: 索引 + search: 搜尋 + more: 更多+ + email_reminder: 寄送提醒 + activate_email_reminder: 開啟寄送提醒 + email_sentdate: 寄送時間 + email_to: 寄送對象 + other_mailaddress: 其他Mail + other_mailaddress_note: 輸入多組mail時,請用","逗號隔開 + mail_subject: 來自【%{site_title}】的新聞事件提醒 + mail_hi: 您好 + mail_url_view: 此封信件為新聞事件提醒,請點選以下連結詳細觀看 + mail_source: 來源 + mail_time: 時間 + image_upload_size_note: 建議檔案小於%{image_upload_size} diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000..99fbf19 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,23 @@ +Rails.application.routes.draw do + + locales = Site.first.in_use_locales rescue I18n.available_locales + + scope "(:locale)", locale: Regexp.new(locales.join("|")) do + namespace :admin do + post 'news/preview', to: 'news#preview' + get 'news/destroy_preview/:slug_title-:uid', to: 'news#destroy_preview' + get 'news/approve_bulletin', to: 'news#approve_bulletin' + get 'news_admins/get_departments' => "news_admins#get_departments" + resources :news + resources :news_admins + end + + + resources :news do + collection do + get ':slug_title-:uid', to: 'news#show', as: :display + end + end + end + +end diff --git a/lib/news.rb b/lib/news.rb new file mode 100644 index 0000000..faf412b --- /dev/null +++ b/lib/news.rb @@ -0,0 +1,4 @@ +require "news/engine" + +module News +end diff --git a/lib/news/engine.rb b/lib/news/engine.rb new file mode 100644 index 0000000..834b852 --- /dev/null +++ b/lib/news/engine.rb @@ -0,0 +1,55 @@ +module News + class Engine < ::Rails::Engine + initializer "news" do + OrbitApp.registration "News", :type => "ModuleApp" do + module_label "news.news" + base_url File.expand_path File.dirname(__FILE__) + widget_methods ["widget"] + widget_settings [{"data_count"=>10}] + # taggable "NewsBulletin" + categorizable + authorizable + frontend_enabled + data_count 1..10 + + side_bar do + head_label_i18n 'news.news', icon_class: "icons-book-2" + available_for "users" + active_for_controllers (['admin/news']) + head_link_path "admin_news_index_path" + + context_link 'news.all_articles', + :link_path=>"admin_news_index_path" , + :priority=>1, + :active_for_action=>{'admin/news'=>'index'}, + :available_for => 'users' + context_link 'new_', + :link_path=>"new_admin_news_path" , + :priority=>2, + :active_for_action=>{'admin/news'=>'news'}, + :available_for => 'sub_managers' + context_link 'news.admins', + :link_path=>"admin_news_admins_path" , + :priority=>4, + :active_for_action=>{'admin/news'=>'admins'}, + :available_for => 'managers' + context_link 'categories', + :link_path=>"admin_module_app_categories_path" , + :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'news').id}", + :priority=>3, + :active_for_action=>{'admin/news'=>'categories'}, + :active_for_category => 'News', + :available_for => 'managers' + context_link 'tags', + :link_path=>"admin_module_app_tags_path" , + :link_arg=>"{:module_app_id=>ModuleApp.find_by(:key=>'news').id}", + :priority=>4, + :active_for_action=>{'admin/news'=>'tags'}, + :active_for_tag => 'News', + :available_for => 'managers' + end + + end + end + end +end \ No newline at end of file diff --git a/lib/news/version.rb b/lib/news/version.rb new file mode 100644 index 0000000..6cc85fe --- /dev/null +++ b/lib/news/version.rb @@ -0,0 +1,3 @@ +module News + VERSION = "0.0.1" +end diff --git a/lib/tasks/news_bulletin_tasks.rake b/lib/tasks/news_bulletin_tasks.rake new file mode 100644 index 0000000..cfe4f33 --- /dev/null +++ b/lib/tasks/news_bulletin_tasks.rake @@ -0,0 +1,4 @@ +# desc "Explaining what the task does" +# task :bulletin do +# # Task goes here +# end diff --git a/news.gemspec b/news.gemspec new file mode 100644 index 0000000..bc66dd0 --- /dev/null +++ b/news.gemspec @@ -0,0 +1,19 @@ +$:.push File.expand_path("../lib", __FILE__) + +# Maintain your gem's version: +require "news/version" + +# Describe your gem and declare its dependencies: +Gem::Specification.new do |s| + s.name = "news" + s.version = News::VERSION + s.authors = ["RulingDigital"] + s.email = ["orbit@rulingcom.com"] + s.homepage = "http://www.rulingcom.com" + s.summary = "News for Orbit" + s.description = "News for Orbit" + s.license = "MIT" + + s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] + s.test_files = Dir["test/**/*"] +end diff --git a/test/bulletin_test.rb b/test/bulletin_test.rb new file mode 100644 index 0000000..10cd840 --- /dev/null +++ b/test/bulletin_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class BulletinTest < ActiveSupport::TestCase + test "truth" do + assert_kind_of Module, Bulletin + end +end diff --git a/test/controllers/admin/announcements_controller_test.rb b/test/controllers/admin/announcements_controller_test.rb new file mode 100644 index 0000000..1bacec2 --- /dev/null +++ b/test/controllers/admin/announcements_controller_test.rb @@ -0,0 +1,14 @@ +require 'test_helper' + +class Admin::AnnouncementsControllerTest < ActionController::TestCase + test "should get new" do + get :new + assert_response :success + end + + test "should get create" do + get :create + assert_response :success + end + +end diff --git a/test/dummy/README.rdoc b/test/dummy/README.rdoc new file mode 100644 index 0000000..dd4e97e --- /dev/null +++ b/test/dummy/README.rdoc @@ -0,0 +1,28 @@ +== README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... + + +Please feel free to use a different markup language if you do not plan to run +rake doc:app. diff --git a/test/dummy/Rakefile b/test/dummy/Rakefile new file mode 100644 index 0000000..ba6b733 --- /dev/null +++ b/test/dummy/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Rails.application.load_tasks diff --git a/test/dummy/app/assets/images/.keep b/test/dummy/app/assets/images/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/assets/javascripts/application.js b/test/dummy/app/assets/javascripts/application.js new file mode 100644 index 0000000..5bc2e1c --- /dev/null +++ b/test/dummy/app/assets/javascripts/application.js @@ -0,0 +1,13 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. +// +// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require_tree . diff --git a/test/dummy/app/assets/stylesheets/application.css b/test/dummy/app/assets/stylesheets/application.css new file mode 100644 index 0000000..a443db3 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb new file mode 100644 index 0000000..d83690e --- /dev/null +++ b/test/dummy/app/controllers/application_controller.rb @@ -0,0 +1,5 @@ +class ApplicationController < ActionController::Base + # Prevent CSRF attacks by raising an exception. + # For APIs, you may want to use :null_session instead. + protect_from_forgery with: :exception +end diff --git a/test/dummy/app/controllers/concerns/.keep b/test/dummy/app/controllers/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/helpers/application_helper.rb b/test/dummy/app/helpers/application_helper.rb new file mode 100644 index 0000000..de6be79 --- /dev/null +++ b/test/dummy/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/test/dummy/app/mailers/.keep b/test/dummy/app/mailers/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/models/.keep b/test/dummy/app/models/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/models/concerns/.keep b/test/dummy/app/models/concerns/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/app/views/layouts/application.html.erb b/test/dummy/app/views/layouts/application.html.erb new file mode 100644 index 0000000..593a778 --- /dev/null +++ b/test/dummy/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + Dummy + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> + <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + + +<%= yield %> + + + diff --git a/test/dummy/bin/bundle b/test/dummy/bin/bundle new file mode 100755 index 0000000..66e9889 --- /dev/null +++ b/test/dummy/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/test/dummy/bin/rails b/test/dummy/bin/rails new file mode 100755 index 0000000..728cd85 --- /dev/null +++ b/test/dummy/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../../config/application', __FILE__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/test/dummy/bin/rake b/test/dummy/bin/rake new file mode 100755 index 0000000..1724048 --- /dev/null +++ b/test/dummy/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/test/dummy/config.ru b/test/dummy/config.ru new file mode 100644 index 0000000..5bc2a61 --- /dev/null +++ b/test/dummy/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Rails.application diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb new file mode 100644 index 0000000..091c8f5 --- /dev/null +++ b/test/dummy/config/application.rb @@ -0,0 +1,29 @@ +require File.expand_path('../boot', __FILE__) + +# Pick the frameworks you want: +# require "active_record/railtie" +require "action_controller/railtie" +require "action_mailer/railtie" +require "action_view/railtie" +require "sprockets/railtie" +require "rails/test_unit/railtie" + +Bundler.require(*Rails.groups) +require "bulletin" + +module Dummy + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + end +end + diff --git a/test/dummy/config/boot.rb b/test/dummy/config/boot.rb new file mode 100644 index 0000000..6266cfc --- /dev/null +++ b/test/dummy/config/boot.rb @@ -0,0 +1,5 @@ +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +$LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__) diff --git a/test/dummy/config/environment.rb b/test/dummy/config/environment.rb new file mode 100644 index 0000000..ee8d90d --- /dev/null +++ b/test/dummy/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require File.expand_path('../application', __FILE__) + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/test/dummy/config/environments/development.rb b/test/dummy/config/environments/development.rb new file mode 100644 index 0000000..a384d95 --- /dev/null +++ b/test/dummy/config/environments/development.rb @@ -0,0 +1,34 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Adds additional error checking when serving assets at runtime. + # Checks for improperly declared sprockets dependencies. + # Raises helpful error messages. + config.assets.raise_runtime_errors = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/test/dummy/config/environments/production.rb b/test/dummy/config/environments/production.rb new file mode 100644 index 0000000..4f67ce3 --- /dev/null +++ b/test/dummy/config/environments/production.rb @@ -0,0 +1,80 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid. + # config.action_dispatch.rack_cache = true + + # Disable Rails's static asset server (Apache or nginx will already do this). + config.serve_static_assets = false + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # Generate digests for assets URLs. + config.assets.digest = true + + # Version of your assets, change this if you want to expire all your assets. + config.assets.version = '1.0' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Set to :debug to see everything in the log. + config.log_level = :info + + # Prepend all log lines with the following tags. + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups. + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = "http://assets.example.com" + + # Precompile additional assets. + # application.js, application.css, and all non-JS/CSS in app/assets folder are already added. + # config.assets.precompile += %w( search.js ) + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Disable automatic flushing of the log to improve performance. + # config.autoflush_log = false + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new +end diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb new file mode 100644 index 0000000..053f5b6 --- /dev/null +++ b/test/dummy/config/environments/test.rb @@ -0,0 +1,39 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure static asset server for tests with Cache-Control for performance. + config.serve_static_assets = true + config.static_cache_control = 'public, max-age=3600' + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/test/dummy/config/initializers/backtrace_silencers.rb b/test/dummy/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000..59385cd --- /dev/null +++ b/test/dummy/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/test/dummy/config/initializers/cookies_serializer.rb b/test/dummy/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000..7a06a89 --- /dev/null +++ b/test/dummy/config/initializers/cookies_serializer.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.action_dispatch.cookies_serializer = :json \ No newline at end of file diff --git a/test/dummy/config/initializers/filter_parameter_logging.rb b/test/dummy/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000..4a994e1 --- /dev/null +++ b/test/dummy/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/test/dummy/config/initializers/inflections.rb b/test/dummy/config/initializers/inflections.rb new file mode 100644 index 0000000..ac033bf --- /dev/null +++ b/test/dummy/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/test/dummy/config/initializers/mime_types.rb b/test/dummy/config/initializers/mime_types.rb new file mode 100644 index 0000000..72aca7e --- /dev/null +++ b/test/dummy/config/initializers/mime_types.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone diff --git a/test/dummy/config/initializers/session_store.rb b/test/dummy/config/initializers/session_store.rb new file mode 100644 index 0000000..e766b67 --- /dev/null +++ b/test/dummy/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_dummy_session' diff --git a/test/dummy/config/initializers/wrap_parameters.rb b/test/dummy/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000..b81ea74 --- /dev/null +++ b/test/dummy/config/initializers/wrap_parameters.rb @@ -0,0 +1,9 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] if respond_to?(:wrap_parameters) +end diff --git a/test/dummy/config/locales/en.yml b/test/dummy/config/locales/en.yml new file mode 100644 index 0000000..0653957 --- /dev/null +++ b/test/dummy/config/locales/en.yml @@ -0,0 +1,23 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/test/dummy/config/routes.rb b/test/dummy/config/routes.rb new file mode 100644 index 0000000..3f66539 --- /dev/null +++ b/test/dummy/config/routes.rb @@ -0,0 +1,56 @@ +Rails.application.routes.draw do + # The priority is based upon order of creation: first created -> highest priority. + # See how all your routes lay out with "rake routes". + + # You can have the root of your site routed with "root" + # root 'welcome#index' + + # Example of regular route: + # get 'products/:id' => 'catalog#view' + + # Example of named route that can be invoked with purchase_url(id: product.id) + # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase + + # Example resource route (maps HTTP verbs to controller actions automatically): + # resources :products + + # Example resource route with options: + # resources :products do + # member do + # get 'short' + # post 'toggle' + # end + # + # collection do + # get 'sold' + # end + # end + + # Example resource route with sub-resources: + # resources :products do + # resources :comments, :sales + # resource :seller + # end + + # Example resource route with more complex sub-resources: + # resources :products do + # resources :comments + # resources :sales do + # get 'recent', on: :collection + # end + # end + + # Example resource route with concerns: + # concern :toggleable do + # post 'toggle' + # end + # resources :posts, concerns: :toggleable + # resources :photos, concerns: :toggleable + + # Example resource route within a namespace: + # namespace :admin do + # # Directs /admin/products/* to Admin::ProductsController + # # (app/controllers/admin/products_controller.rb) + # resources :products + # end +end diff --git a/test/dummy/config/secrets.yml b/test/dummy/config/secrets.yml new file mode 100644 index 0000000..e9213c0 --- /dev/null +++ b/test/dummy/config/secrets.yml @@ -0,0 +1,22 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rake secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +development: + secret_key_base: 51f457918fc204bef2280de08080b24d6289997cc1af905e47aead42b5e027b6bc27cd6cbd1cb11a34d8df4163d63db2a0ff973acfa11b239a5dd15d6bfb5bfd + +test: + secret_key_base: 1a2d31f4fb35a33e52a69eac67e125b9b1ba5b302e8d3468e60282061a8e74d1a8d977fb88f2eb001aecb99c9c3fbde29e0c7c5ac5d548e1458772ee50ed48e9 + +# Do not keep production secrets in the repository, +# instead read values from the environment. +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/test/dummy/lib/assets/.keep b/test/dummy/lib/assets/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/log/.keep b/test/dummy/log/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/dummy/public/404.html b/test/dummy/public/404.html new file mode 100644 index 0000000..b612547 --- /dev/null +++ b/test/dummy/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/422.html b/test/dummy/public/422.html new file mode 100644 index 0000000..a21f82b --- /dev/null +++ b/test/dummy/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/500.html b/test/dummy/public/500.html new file mode 100644 index 0000000..061abc5 --- /dev/null +++ b/test/dummy/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/favicon.ico b/test/dummy/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/test/helpers/admin/announcements_helper_test.rb b/test/helpers/admin/announcements_helper_test.rb new file mode 100644 index 0000000..a867b12 --- /dev/null +++ b/test/helpers/admin/announcements_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class Admin::AnnouncementsHelperTest < ActionView::TestCase +end diff --git a/test/integration/navigation_test.rb b/test/integration/navigation_test.rb new file mode 100644 index 0000000..eec8c0e --- /dev/null +++ b/test/integration/navigation_test.rb @@ -0,0 +1,9 @@ +require 'test_helper' + +class NavigationTest < ActionDispatch::IntegrationTest + + # test "the truth" do + # assert true + # end +end + diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..1e26a31 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,15 @@ +# Configure Rails Environment +ENV["RAILS_ENV"] = "test" + +require File.expand_path("../dummy/config/environment.rb", __FILE__) +require "rails/test_help" + +Rails.backtrace_cleaner.remove_silencers! + +# Load support files +Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } + +# Load fixtures from the engine +if ActiveSupport::TestCase.method_defined?(:fixture_path=) + ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__) +end