diff --git a/app/controllers/rss/application_controller.rb b/app/controllers/rss/application_controller.rb new file mode 100644 index 00000000..b9886e5d --- /dev/null +++ b/app/controllers/rss/application_controller.rb @@ -0,0 +1,9 @@ +class Rss::ApplicationController < ApplicationController + before_filter :set_rss_format + + private + + def set_rss_format + request.format = :xml + end +end diff --git a/app/controllers/rss/articles_controller.rb b/app/controllers/rss/articles_controller.rb new file mode 100644 index 00000000..19411e6c --- /dev/null +++ b/app/controllers/rss/articles_controller.rb @@ -0,0 +1,5 @@ +class Rss::ArticlesController < Rss::ApplicationController + def index + @articles = Article.broadcasted.decorate + end +end diff --git a/app/controllers/rss/content_controller.rb b/app/controllers/rss/content_controller.rb new file mode 100644 index 00000000..14efdf1f --- /dev/null +++ b/app/controllers/rss/content_controller.rb @@ -0,0 +1,7 @@ +class Rss::ContentController < Rss::ApplicationController + def index + articles = Article.broadcasted.decorate + news = News.published + @content = Kaminari.paginate_array (articles + news).sort_by{ |post| post.created_at } + end +end diff --git a/app/controllers/rss/news_controller.rb b/app/controllers/rss/news_controller.rb new file mode 100644 index 00000000..3b4581b1 --- /dev/null +++ b/app/controllers/rss/news_controller.rb @@ -0,0 +1,5 @@ +class Rss::NewsController < Rss::ApplicationController + def index + @news = News.published.page params[:page] + end +end diff --git a/app/controllers/web/users_controller.rb b/app/controllers/web/users_controller.rb index 13e3ad5f..5cead44b 100644 --- a/app/controllers/web/users_controller.rb +++ b/app/controllers/web/users_controller.rb @@ -11,7 +11,7 @@ def create else if @user_form.save #TODO replace to observers - #send_notification @user_form.model, @user_form.model, :after_create + send_notification @user_form.model, @user_form.model, :after_create sign_in @user_form.model redirect_to account_path diff --git a/app/decorators/article_decorator.rb b/app/decorators/article_decorator.rb index 98f30d85..f3e72b24 100644 --- a/app/decorators/article_decorator.rb +++ b/app/decorators/article_decorator.rb @@ -8,4 +8,6 @@ def short_body def name title end + + alias :lead :short_body end diff --git a/app/helpers/rss/application_helper.rb b/app/helpers/rss/application_helper.rb new file mode 100644 index 00000000..995ecb34 --- /dev/null +++ b/app/helpers/rss/application_helper.rb @@ -0,0 +1,22 @@ +module Rss::ApplicationHelper + def next_page + params[:page].present? ? page = params[:page].to_i + 1 : page = 2 + send "#{params[:controller].gsub('/', '_')}_index_url", page: page + end + + def header(xml) + xml.title t('.title') + xml.description t('.description') + xml.link root_url + xml.language 'ru' + xml.image do + xml.url 'http://ulmic.ru/assets/apps/logo-mic-square.png' + xml.width 100 + xml.height 100 + end + end + + def rss_params + { version: '2.0', 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/', 'xmlns:ya' => 'http://blogs.yandex.ru/yarss/', 'xmlns:wfw' => 'http://wellformedweb.org/CommentAPI/' } + end +end diff --git a/app/mailers/concerns/message_constructor.rb b/app/mailers/concerns/message_constructor.rb index ac8148f8..ce828baa 100644 --- a/app/mailers/concerns/message_constructor.rb +++ b/app/mailers/concerns/message_constructor.rb @@ -1,5 +1,6 @@ module Concerns module MessageConstructor + def create_message(type, theme) messages_hash[type][theme] end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 4f2c701e..3ed13504 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -17,4 +17,5 @@ def just_message(user, message, subject) @message = message mail(to: user.email, subject: subject) end + end diff --git a/app/models/news.rb b/app/models/news.rb index 22c1ccaa..e192fe60 100644 --- a/app/models/news.rb +++ b/app/models/news.rb @@ -43,4 +43,9 @@ class << self transition :removed => :unviewed end end + + def category + activity_line_tag = tags.activity_lines.first + activity_line_tag.target.title if activity_line_tag + end end diff --git a/app/scopes/article_scopes.rb b/app/scopes/article_scopes.rb index d7e04390..2bfd8fcf 100644 --- a/app/scopes/article_scopes.rb +++ b/app/scopes/article_scopes.rb @@ -8,5 +8,6 @@ module ArticleScopes scope :confirmed, -> { where(state: :confirmed).order('id DESC') } scope :inactive, -> { where(state: :inactive).order('id DESC') } scope :unviewed, -> { where(state: :unviewed).order('id DESC') } + scope :broadcasted, -> { where('category_id != ?', Category.find_by_name('Контакты').id) } end end diff --git a/app/views/rss/articles/_item.xml.builder b/app/views/rss/articles/_item.xml.builder new file mode 100644 index 00000000..16ff0002 --- /dev/null +++ b/app/views/rss/articles/_item.xml.builder @@ -0,0 +1,9 @@ +xml.item do + xml.guid article_url(item), isPermaLink: true + xml.author root_url + xml.pubDate item.created_at.to_s(:rfc822) + xml.link article_url(item) + xml.description item.lead + xml.title item.title + xml.category item.category.name +end diff --git a/app/views/rss/articles/index.xml.builder b/app/views/rss/articles/index.xml.builder new file mode 100644 index 00000000..f7cc478e --- /dev/null +++ b/app/views/rss/articles/index.xml.builder @@ -0,0 +1,9 @@ +xml.rss rss_params do + xml.channel do + header xml + + for article in @articles + xml << render('item', xml: xml, item: article) + end + end +end diff --git a/app/views/rss/content/index.xml.builder b/app/views/rss/content/index.xml.builder new file mode 100644 index 00000000..f9b4b208 --- /dev/null +++ b/app/views/rss/content/index.xml.builder @@ -0,0 +1,10 @@ +xml.rss rss_params do + xml.channel do + header xml + + for post in @content + instance_name = post.model_name.name.underscore + xml << render("rss/#{instance_name.pluralize(:en)}/item", xml: xml, item: post) + end + end +end diff --git a/app/views/rss/news/_item.xml.builder b/app/views/rss/news/_item.xml.builder new file mode 100644 index 00000000..9a60d5e1 --- /dev/null +++ b/app/views/rss/news/_item.xml.builder @@ -0,0 +1,10 @@ +xml.item do + xml.guid news_url(item), isPermaLink: true + xml.author root_url + xml.pubDate item.published_at.to_s(:rfc822) + xml.link news_url(item) + xml.description item.lead + xml.title item.title + xml.category item.category + xml.tag! 'dc:creator', item.member.decorate.short_name +end diff --git a/app/views/rss/news/index.xml.builder b/app/views/rss/news/index.xml.builder new file mode 100644 index 00000000..a02d0947 --- /dev/null +++ b/app/views/rss/news/index.xml.builder @@ -0,0 +1,9 @@ +xml.rss rss_params do + xml.channel do + header xml + + for news in @news + xml<< render('item', xml: xml, item: news) + end + end +end diff --git a/config/environments/development.rb b/config/environments/development.rb index 487d01a6..77d3d682 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -14,7 +14,11 @@ config.action_controller.perform_caching = false # Don't care if the mailer can't send. - config.action_mailer.raise_delivery_errors = false + config.action_mailer.raise_delivery_errors = true + # output to tmp/mails directory + config.action_mailer.delivery_method = :sendmail + # ... and to specify output location + config.action_mailer.file_settings = { :location => Rails.root.join('tmp/mail') } # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log diff --git a/config/environments/staging.rb b/config/environments/staging.rb index fc5afcb6..a558dc3f 100644 --- a/config/environments/staging.rb +++ b/config/environments/staging.rb @@ -13,7 +13,6 @@ # 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 @@ -28,7 +27,19 @@ config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass + config.action_mailer.raise_delivery_errors = true + # output to tmp/mails directory + config.action_mailer.delivery_method = :sendmail + config.action_mailer.perform_deliveries = true + # and to specify output location + config.action_mailer.file_settings = { :location => Rails.root.join('tmp/mail') } # Do not fallback to assets pipeline if a precompiled asset is missed. + + config.action_mailer.sendmail_settings = { + location: '/usr/sbin/sendmail', + arguments: '-i -t' + } + config.assets.compile = false # Asset digests allow you to set far-future HTTP expiration dates on all assets, diff --git a/config/locales/ru/rss.yml b/config/locales/ru/rss.yml new file mode 100644 index 00000000..485134f5 --- /dev/null +++ b/config/locales/ru/rss.yml @@ -0,0 +1,14 @@ +ru: + rss: + news: + index: + title: Молодёжный инициативный центр + description: Новости Молодёжного инициативного центра + articles: + index: + title: Молодёжный инициативный центр + description: Статьи сайта Молодёжного инициативного центра + content: + index: + title: Молодёжный инициативный центр + description: Весь контент (новости, статьи) сайта Молодёжного инициативного центра diff --git a/config/routes.rb b/config/routes.rb index d3e4f184..818db308 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -97,6 +97,11 @@ resources :tags, only: [ :create, :destroy, :index ] end end + namespace :rss do + resources :news, only: :index + resources :articles, only: :index + resources :content, only: :index + end get '/:ticket' => 'web/members#show', constraints: { ticket: /\d*/ }, as: :member get '*unmatched_route', to: 'web/pages#show', slug: :not_found end diff --git a/db/schema.rb b/db/schema.rb index 94a5e533..bc9b0272 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -186,9 +186,9 @@ t.text "title" t.integer "member_id" t.datetime "begin_date" - t.text "end_date", default: "for_now" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.text "end_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end create_table "tags", force: :cascade do |t| @@ -238,9 +238,6 @@ t.integer "user_id" end - add_index "teams_users", ["team_id"], name: "index_teams_users_on_team_id", using: :btree - add_index "teams_users", ["user_id"], name: "index_teams_users_on_user_id", using: :btree - create_table "users", force: :cascade do |t| t.text "email" t.text "password_digest" diff --git a/test/controllers/rss/application_controller_test.rb b/test/controllers/rss/application_controller_test.rb new file mode 100644 index 00000000..ce3637e2 --- /dev/null +++ b/test/controllers/rss/application_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class Rss::ApplicationControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/controllers/rss/articles_controller_test.rb b/test/controllers/rss/articles_controller_test.rb new file mode 100644 index 00000000..449506d3 --- /dev/null +++ b/test/controllers/rss/articles_controller_test.rb @@ -0,0 +1,13 @@ +require 'test_helper' + +class Rss::ArticlesControllerTest < ActionController::TestCase + setup do + create :user + @article = create :article + end + + test 'should get index' do + get :index + assert_response :success, @response.body + end +end diff --git a/test/controllers/rss/content_controller_test.rb b/test/controllers/rss/content_controller_test.rb new file mode 100644 index 00000000..bd316b02 --- /dev/null +++ b/test/controllers/rss/content_controller_test.rb @@ -0,0 +1,15 @@ +require 'test_helper' + +class Rss::ContentControllerTest < ActionController::TestCase + setup do + create :user + create :member + create :article + create :news + end + + test 'should get index' do + get :index + assert_response :success, @response.body + end +end diff --git a/test/controllers/rss/news_controller_test.rb b/test/controllers/rss/news_controller_test.rb new file mode 100644 index 00000000..24b90afa --- /dev/null +++ b/test/controllers/rss/news_controller_test.rb @@ -0,0 +1,12 @@ +require 'test_helper' + +class Rss::NewsControllerTest < ActionController::TestCase + setup do + @news = create :news + end + + test 'should get index' do + get :index + assert_response :success, @response.body + end +end diff --git a/test/factories/articles.rb b/test/factories/articles.rb index 5cf59ff7..56074c4a 100644 --- a/test/factories/articles.rb +++ b/test/factories/articles.rb @@ -4,7 +4,7 @@ body { generate :string } view nil category_id { Category.first.id } + association :user user_id { User.last ? User.last.id : 1 } end - end diff --git a/test/mailers/user_mailer.rb b/test/mailers/user_mailer.rb new file mode 100644 index 00000000..1b2e5ff0 --- /dev/null +++ b/test/mailers/user_mailer.rb @@ -0,0 +1,20 @@ +require 'test_helper' +require 'redis' + +class UserMailerTest < ActionMailer::TestCase + setup do + @user = create :user + end + + test "check user email" do + Redis.new.ping + @user.generate_token + + assert_emails 1 do + email = UserMailer.confirmation_instructions(@user).deliver_now + end + ap email + end + + +end