Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

init engine registrations

  • Loading branch information...
commit 0b7a3b4f68c3be28aaf23f7779698cc56433adaa 0 parents
@keram keram authored
Showing with 721 additions and 0 deletions.
  1. +72 −0 app/controllers/admin/registrations_controller.rb
  2. +43 −0 app/controllers/registrations_controller.rb
  3. +20 −0 app/mailers/registration_mailer.rb
  4. +43 −0 app/models/registration.rb
  5. +28 −0 app/views/admin/registrations/_actions.html.erb
  6. +18 −0 app/views/admin/registrations/_records.html.erb
  7. +28 −0 app/views/admin/registrations/_registration.html.erb
  8. +8 −0 app/views/admin/registrations/_registrations.html.erb
  9. +6 −0 app/views/admin/registrations/index.html.erb
  10. +11 −0 app/views/registrations/index.html.erb
  11. +45 −0 app/views/registrations/show.html.erb
  12. +25 −0 config/locales/en.yml
  13. +19 −0 config/routes.rb
  14. +37 −0 db/migrate/create_registrations.rb
  15. +8 −0 db/seeds/registrations.rb
  16. +30 −0 features/manage_registrations.feature
  17. +17 −0 features/new_registration.feature
  18. +154 −0 features/step_definitions/registration_steps.rb
  19. +17 −0 features/support/paths.rb
  20. +6 −0 lib/generators/refinerycms_registrations_generator.rb
  21. +21 −0 lib/refinerycms-registrations.rb
  22. +13 −0 lib/tasks/registrations.rake
  23. +10 −0 readme.md
  24. +10 −0 refinerycms-registrations.gemspec
  25. +32 −0 spec/models/registration_spec.rb
72 app/controllers/admin/registrations_controller.rb
@@ -0,0 +1,72 @@
+module Admin
+ class RegistrationsController < Admin::BaseController
+
+ crudify :registration,
+ :title_attribute => 'username', :xhr_paging => true
+
+ helper_method :group_by_date
+
+ before_filter :find_all_ham, :only => [:index, :approved, :rejected]
+ before_filter :find_all_spam, :only => [:spam]
+ before_filter :get_spam_count, :only => [:index, :spam, :approved, :rejected]
+
+ def index
+ @registrations = @registrations.new
+ @registrations = @registrations.with_query(params[:search]) if searching?
+ @registrations = @registrations.paginate({:page => params[:page]})
+ end
+
+ def approved
+ unless params[:id].present?
+ @registrations = @registrations.approved
+ @registrations = @registrations.paginate({:page => params[:page]})
+ render :action => 'index'
+ else
+ @registration = Registration.find(params[:id])
+ @registration.approve!
+ flash[:notice] = t('approved', :scope => 'admin.registration', :author => @registration.username)
+ redirect_to :action => 'index'
+ end
+ end
+
+ def rejected
+ unless params[:id].present?
+ @registrations = @registrations.rejected
+ @registrations = @registrations.paginate({:page => params[:page]})
+ render :action => 'index'
+ else
+ @registration = Registration.find(params[:id])
+ @registration.reject!
+ flash[:notice] = t('rejected', :scope => 'admin.registration', :author => @registration.username)
+ redirect_to :action => 'index'
+ end
+ end
+
+ def spam
+ self.index
+ render :action => 'index'
+ end
+
+ def toggle_spam
+ find_registration
+ @registration.toggle!(:spam)
+
+ redirect_to :back
+ end
+
+ protected
+
+ def find_all_ham
+ @registrations = Registration.ham
+ end
+
+ def find_all_spam
+ @registrations = Registration.spam
+ end
+
+ def get_spam_count
+ @spam_count = Registration.count(:conditions => {:spam => true})
+ end
+
+ end
+end
43 app/controllers/registrations_controller.rb
@@ -0,0 +1,43 @@
+class RegistrationsController < ApplicationController
+
+ before_filter :find_page, :set_form
+
+ def index
+ render 'pages/join'
+ end
+
+ def create
+ if @registration.valid? && @registration.save
+ flash[:success] = t('.thank_you_for_registration')
+ if @registration.ham?
+ begin
+ RegistrationMailer.notification(@registration, request).deliver
+ rescue
+ logger.warn "There was an error delivering an registration notification.\n#{$!}\n"
+ end
+
+ begin
+ RegistrationMailer.confirmation(@registration, request).deliver
+ rescue
+ logger.warn "There was an error delivering an registration confirmation:\n#{$!}\n"
+ end
+ end
+
+ redirect_to '/join-us'
+ else
+ flash[:error] = t('.problems_on_registration')
+ render 'pages/join'
+ end
+ end
+
+ protected
+
+ def find_page
+ @page = Page.find_by_title('Pridaj sa')
+ end
+
+ def set_form
+ @registration = Registration.new(params[:registration])
+ end
+
+end
20 app/mailers/registration_mailer.rb
@@ -0,0 +1,20 @@
+class RegistrationMailer < ActionMailer::Base
+
+ def confirmation(registration, request)
+ subject RegistrationSetting.confirmation_subject(Globalize.locale)
+ recipients registration.email
+ from "\"#{RefinerySetting[:site_name]}\" <no-reply@#{request.domain(RefinerySetting.find_or_set(:tld_length, 1))}>"
+ reply_to RegistrationSetting.notification_recipients.split(',').first
+ sent_on Time.now
+ @registration = registration
+ end
+
+ def notification(registration, request)
+ subject RegistrationSetting.notification_subject
+ recipients RegistrationSetting.notification_recipients
+ from "\"#{RefinerySetting[:site_name]}\" <no-reply@#{request.domain(RefinerySetting.find_or_set(:tld_length, 1))}>"
+ sent_on Time.now
+ @registration = registration
+ end
+
+end
43 app/models/registration.rb
@@ -0,0 +1,43 @@
+class Registration < ActiveRecord::Base
+
+ acts_as_indexed :fields => [:username, :email, :personal_info, :state]
+
+ validates :username, :presence => true, :length => { :in => 6..20 }
+ validates :email, :presence => true, :uniqueness => true, :length => { :in => 6..42 }
+ validates :personal_info, :presence => true, :length => { :in => 6..250 }
+ validates :state, :presence => true, :format => { :with => /new|approved|rejected/ }
+
+ filters_spam :message_field => :personal_info,
+ :email_field => :email,
+ :author_field => :username,
+ :extra_spam_words => %w()
+
+
+ scope :new, :conditions => {:state => 'new'}
+ scope :approved, :conditions => {:state => 'approved'}
+ scope :rejected, :conditions => {:state => 'rejected'}
+
+ def approve!
+ self.update_attribute(:state, 'approved')
+ end
+
+ def reject!
+ self.update_attribute(:state, 'rejected')
+ end
+
+ def rejected?
+ self.state == 'rejected'
+ end
+
+ def approved?
+ self.state == 'approved'
+ end
+
+ def new?
+ self.state == 'new'
+ end
+
+ def self.latest(number = 7, include_spam = false)
+ include_spam ? limit(number) : ham.limit(number)
+ end
+end
28 app/views/admin/registrations/_actions.html.erb
@@ -0,0 +1,28 @@
+<ul>
+ <% if Admin::RegistrationsController.searchable? %>
+ <li>
+ <%= render :partial => "/shared/admin/search",
+ :locals => {
+ :url => admin_registrations_path
+ } %>
+ </li>
+ <% end %>
+ <li <%= "class='selected'" if params[:action] == "index" %>>
+ <%= link_to t('.new_registrations'), admin_registrations_url, :class => "email_icon" %>
+ </li>
+ <li <%= "class='selected'" if params[:action] == "rejected" %>>
+ <%= link_to t('.rejected_registrations'), rejected_admin_registrations_url, :class => "email_icon" %>
+ </li>
+ <li <%= "class='selected'" if params[:action] == "approved" %>>
+ <%= link_to t('.approved_registrations'), approved_admin_registrations_url, :class => "email_icon" %>
+ </li>
+ <li <%= "class='selected'" if params[:action] == "spam" %>>
+ <% if @spam_count > 0 %>
+ <%= link_to "#{t('.spam')} (#{@spam_count})", spam_admin_registrations_url, :class => "spam_icon" %>
+ <% else %>
+ <%= link_to t('.spam'), spam_admin_registrations_url, :class => "spam_empty_icon" %>
+ <% end %>
+ </li>
+
+ </ul>
+</div>
18 app/views/admin/registrations/_records.html.erb
@@ -0,0 +1,18 @@
+<% if searching? %>
+ <h2><%= t('results_for', :scope => 'shared.admin.search', :query => params[:search]) %></h2>
+<% end %>
+<% if @registrations.any? %>
+ <div class='pagination_container'>
+ <%= render :partial => 'registrations' %>
+ </div>
+<% else %>
+ <p>
+ <% unless searching? %>
+ <strong>
+ <%= t(".no_#{action_name == 'index' ? 'new' : action_name}_registrations") %>
+ </strong>
+ <% else %>
+ <%= t('no_results', :scope => 'shared.admin.search') %>
+ <% end %>
+ </p>
+<% end %>
28 app/views/admin/registrations/_registration.html.erb
@@ -0,0 +1,28 @@
+<li class='clearfix record <%= cycle("on", "on-hover") %>' id="<%= dom_id(registration) -%>">
+ <span class='title'>
+ <%= link_to "#{registration.username}, #{registration.email}", admin_registration_url(registration),
+ :title => t('.read_registration') -%>
+ <span class="preview">&nbsp;</span>
+ </span>
+ <span class='actions'>
+ <% if registration.spam? %>
+ <%= link_to refinery_icon_tag('email.png'), toggle_spam_admin_registration_url(registration),
+ :title => t('.mark_as_ham') -%>
+ <% else %>
+ <%= link_to refinery_icon_tag('bin_closed.png'), toggle_spam_admin_registration_url(registration),
+ :title => t('.mark_as_spam') -%>
+ <% end %>
+ <%= link_to refinery_icon_tag("delete.png"), admin_registration_path(registration),
+ :class => "cancel confirm-delete",
+ :title => t('.delete'),
+ :confirm => t('message', :scope => 'shared.admin.delete', :title => registration.username),
+ :method => :delete %>
+
+ <%= link_to refinery_icon_tag("cross.png"),
+ rejected_admin_registration_path(registration),
+ :title => t('.reject') unless registration.rejected? %>
+ <%= link_to refinery_icon_tag("tick.png"),
+ approved_admin_registration_path(registration),
+ :title => t('.approve') unless registration.approved? %>
+ </span>
+</li>
8 app/views/admin/registrations/_registrations.html.erb
@@ -0,0 +1,8 @@
+<%= will_paginate @registrations %>
+<% group_by_date(@registrations).each do |container| %>
+ <h3><%= l((registration_group = container.last).first.created_at, :format => :short) %></h3>
+ <ul>
+ <%= render :partial => 'registration', :collection => registration_group %>
+ </ul>
+<% end %>
+<%= will_paginate @registrations %>
6 app/views/admin/registrations/index.html.erb
@@ -0,0 +1,6 @@
+<section id='records'>
+ <%= render :partial => 'records' %>
+</section>
+<aside id='actions'>
+ <%= render :partial => 'actions' %>
+</aside>
11 app/views/registrations/index.html.erb
@@ -0,0 +1,11 @@
+<% content_for :body_content_left do %>
+ <ul id="registrations">
+ <% @registrations.each do |registration| %>
+ <li>
+ <%= link_to registration.username, registration_path(registration) %>
+ </li>
+ <% end %>
+ </ul>
+<% end %>
+
+<%= render :partial => "/shared/content_page" %>
45 app/views/registrations/show.html.erb
@@ -0,0 +1,45 @@
+<% content_for :body_content_title do %>
+ <%= @registration.username %>
+<% end %>
+
+<% content_for :body_content_left do %>
+ <section>
+ <h1>Username</h1>
+ <p>
+ <%=raw @registration.username %>
+ </p>
+ </section>
+ <section>
+ <h1>Email</h1>
+ <p>
+ <%=raw @registration.email %>
+ </p>
+ </section>
+ <section>
+ <h1>Personal Info</h1>
+ <p>
+ <%=raw @registration.personal_info %>
+ </p>
+ </section>
+ <section>
+ <h1>State</h1>
+ <p>
+ <%=raw @registration.state %>
+ </p>
+ </section>
+<% end %>
+
+<% content_for :body_content_right do %>
+ <aside>
+ <h2><%= t('.other') %></h2>
+ <ul id="registrations">
+ <% @registrations.each do |registration| %>
+ <li>
+ <%= link_to registration.username, registration_path(registration) %>
+ </li>
+ <% end %>
+ </ul>
+ </aside>
+<% end %>
+
+<%= render :partial => "/shared/content_page" %>
25 config/locales/en.yml
@@ -0,0 +1,25 @@
+en:
+ shared:
+ admin:
+ image_picker:
+ image: image
+ plugins:
+ registrations:
+ title: Registrations
+ admin:
+ registrations:
+ actions:
+ create_new: Add New Registration
+ reorder: Reorder Registrations
+ reorder_done: Done Reordering Registrations
+ records:
+ title: Registrations
+ sorry_no_results: Sorry! There are no results found.
+ no_items_yet: There are no Registrations yet. Click "Add New Registration" to add your first registration.
+ registration:
+ view_live_html: View this registration live <br/><em>(opens in a new window)</em>
+ edit: Edit this registration
+ delete: Remove this registration forever
+ registrations:
+ show:
+ other: Other Registrations
19 config/routes.rb
@@ -0,0 +1,19 @@
+::Refinery::Application.routes.draw do
+
+ resources :registrations
+
+ scope(:path => 'refinery', :as => 'admin', :module => 'admin') do
+ resources :registrations, :only => [:index, :show, :destroy, :accept, :reject] do
+ collection do
+ get :spam
+ get :approved
+ get :rejected
+ end
+ member do
+ get :toggle_spam
+ get :approved
+ get :rejected
+ end
+ end
+ end
+end
37 db/migrate/create_registrations.rb
@@ -0,0 +1,37 @@
+class CreateRegistrations < ActiveRecord::Migration
+
+ def self.up
+ # in devel
+ drop_table :registrations if ::Registration.table_exists? && 1 == 1
+
+ create_table :registrations do |t|
+ t.string :username, :null => false
+ t.string :email, :null => false
+ t.text :personal_info, :null => false
+ t.string :state, :null => false, :default => 'new'
+
+ t.integer :position
+ t.boolean :spam, :default => false
+
+ t.timestamps
+ end
+
+ add_index :registrations, :id
+ add_index :registrations, :email
+
+ load(Rails.root.join('db', 'seeds', 'registrations.rb'))
+ end
+
+ def self.down
+ if defined?(UserPlugin)
+ UserPlugin.destroy_all({:name => "registrations"})
+ end
+
+ if defined?(Page)
+ Page.delete_all({:link_url => "/registrations"})
+ end
+
+ drop_table :registrations
+ end
+
+end
8 db/seeds/registrations.rb
@@ -0,0 +1,8 @@
+if defined?(User)
+ User.all.each do |user|
+ if user.plugins.where(:name => 'registrations').blank?
+ user.plugins.create(:name => 'registrations',
+ :position => (user.plugins.maximum(:position) || -1) +1)
+ end
+ end
+end
30 features/manage_registrations.feature
@@ -0,0 +1,30 @@
+@registrations
+Feature: Registrations
+ In order to have registrations on my website
+ As an administrator
+ I want to manage registrations
+
+ Background:
+ Given I am a logged in refinery user
+ And I have no registrations
+
+ @registrations-list @list
+ Scenario: Registrations List
+ Given I have registrations titled UniqueTitleOne, UniqueTitleTwo
+ When I go to the list of registrations
+ Then I should see "UniqueTitleOne"
+ And I should see "UniqueTitleTwo"
+
+
+#
+#When /^I go to the list of registrations$/ do
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I should see "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#When /^I follow "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
17 features/new_registration.feature
@@ -0,0 +1,17 @@
+@registrations
+Feature: Registration
+ In order to be member
+ As an visitor
+ I want to create an registration
+
+ Background:
+ Given I am a visitor
+ And I have no registration
+ And I have a page titled "Join us" with a custom url "/join-us"
+ And I have a page titled "Thank You" with a custom url "/join-us/thank-you"
+
+ Scenario: Join us page
+ When I go to the join us page
+ Then I should see "Name"
+ And I should see "E-mail"
+ And I should see "Personal info"
154 features/step_definitions/registration_steps.rb
@@ -0,0 +1,154 @@
+Given /^I have no registrations$/ do
+ Registration.delete_all
+end
+
+Given /^I (only )?have registrations titled "?([^\"]*)"?$/ do |only, titles|
+ Registration.delete_all if only
+ titles.split(', ').each do |title|
+ Registration.create(:username => title)
+ end
+end
+
+Then /^I should have ([0-9]+) registrations?$/ do |count|
+ Registration.count.should == count.to_i
+end
+
+###
+# new registration
+###
+
+Given /^I am a visitor$/ do
+ pending # express the regexp above with the code you wish you had
+end
+
+Given /^I have no registration$/ do
+ pending # express the regexp above with the code you wish you had
+end
+
+Given /^I have a page titled "([^"]*)" with a custom url "([^"]*)"$/ do |arg1, arg2|
+ pending # express the regexp above with the code you wish you had
+end
+
+When /^I go to the join us page$/ do
+ pending # express the regexp above with the code you wish you had
+end
+
+Then /^I should see "([^"]*)"$/ do |arg1|
+ pending # express the regexp above with the code you wish you had
+end
+
+
+#
+#Given /^I am a logged in refinery user$/ do
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#When /^I go to the list of registrations$/ do
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I should see "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#When /^I follow "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#When /^I fill in "([^"]*)" with "([^"]*)"$/ do |arg1, arg2|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#When /^I press "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+
+#
+#When /^I follow "([^"]*)" within "([^"]*)"$/ do |arg1, arg2|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I fill in "([^"]*)" with "([^"]*)"$/ do |arg1, arg2|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I press "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I should be on the list of registrations$/ do
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I should not see "([^"]*)"$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Given /^I only have (\d+) new registration titled UniqueTitleOne$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I should have (\d+) accepted registrations$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+#
+#Then /^I should have (\d+) rejected registrations$/ do |arg1|
+# pending # express the regexp above with the code you wish you had
+#end
+
+#
+#----
+#
+# @registrations-valid @valid
+# Scenario: Create Valid Registration
+# When I go to the list of registrations
+# And I follow "Add New Registration"
+# And I fill in "Username" with "This is a test of the first string field"
+# And I press "Save"
+# Then I should see "'This is a test of the first string field' was successfully added."
+# And I should have 1 registration
+#
+# @registrations-invalid @invalid
+# Scenario: Create Invalid Registration (without username)
+# When I go to the list of registrations
+# And I follow "Add New Registration"
+# And I press "Save"
+# Then I should see "Username can't be blank"
+# And I should have 0 registrations
+#
+# @registrations-edit @edit
+# Scenario: Edit Existing Registration
+# Given I have registrations titled "A username"
+# When I go to the list of registrations
+# And I follow "Edit this registration" within ".actions"
+# Then I fill in "Username" with "A different username"
+# And I press "Save"
+# Then I should see "'A different username' was successfully updated."
+# And I should be on the list of registrations
+# And I should not see "A username"
+#
+# @registrations-duplicate @duplicate
+# Scenario: Create Duplicate Registration
+# Given I only have registrations titled UniqueTitleOne, UniqueTitleTwo
+# When I go to the list of registrations
+# And I follow "Add New Registration"
+# And I fill in "Username" with "UniqueTitleTwo"
+# And I press "Save"
+# Then I should see "There were problems"
+# And I should have 2 registrations
+#
+# @registrations-accept @accept
+# Scenario: Accept Registration
+# Given I only have 1 new registration titled UniqueTitleOne
+# When I go to the list of registrations
+# And I follow "Accept this registration"
+# Then I should see "'UniqueTitleOne' was successfully accepted."
+# And I should have 1 accepted registrations
+#
+# @registrations-reject @reject
+# Scenario: Reject Registration
+# Given I only have registrations titled UniqueTitleOne
+# When I go to the list of registrations
+# And I follow "Reject this registration"
+# Then I should see "'UniqueTitleOne' was rejected."
+# And I should have 1 rejected registrations
17 features/support/paths.rb
@@ -0,0 +1,17 @@
+module NavigationHelpers
+ module Refinery
+ module Registrations
+ def path_to(page_name)
+ case page_name
+ when /the list of registrations/
+ admin_registrations_path
+
+ when /the new registration form/
+ new_admin_registration_path
+ else
+ nil
+ end
+ end
+ end
+ end
+end
6 lib/generators/refinerycms_registrations_generator.rb
@@ -0,0 +1,6 @@
+class RefinerycmsRegistrations < Refinery::Generators::EngineInstaller
+
+ source_root File.expand_path('../../../', __FILE__)
+ engine_name "registrations"
+
+end
21 lib/refinerycms-registrations.rb
@@ -0,0 +1,21 @@
+require 'refinerycms-base'
+
+module Refinery
+ module Registrations
+ class Engine < Rails::Engine
+ config.to_prepare do
+ require 'filters_spam'
+ end
+
+ config.after_initialize do
+ Refinery::Plugin.register do |plugin|
+ plugin.name = "registrations"
+ plugin.activity = {
+ :class => Registration,
+ :title => 'username'
+ }
+ end
+ end
+ end
+ end
+end
13 lib/tasks/registrations.rake
@@ -0,0 +1,13 @@
+namespace :refinery do
+
+ namespace :registrations do
+
+ # call this task my running: rake refinery:registrations:my_task
+ # desc "Description of my task below"
+ # task :my_task => :environment do
+ # # add your logic here
+ # end
+
+ end
+
+end
10 readme.md
@@ -0,0 +1,10 @@
+# Registrations engine for Refinery CMS.
+
+## How to build this engine as a gem
+
+ cd vendor/engines/registrations
+ gem build refinerycms-registrations.gemspec
+ gem install refinerycms-registrations.gem
+
+ # Sign up for a http://rubygems.org/ account and publish the gem
+ gem push refinerycms-registrations.gem
10 refinerycms-registrations.gemspec
@@ -0,0 +1,10 @@
+Gem::Specification.new do |s|
+ s.platform = Gem::Platform::RUBY
+ s.name = 'refinerycms-registrations'
+ s.version = '1.0'
+ s.description = 'Ruby on Rails Registrations engine for Refinery CMS'
+ s.date = '2011-07-24'
+ s.summary = 'Registrations engine for Refinery CMS'
+ s.require_paths = %w(lib)
+ s.files = Dir['lib/**/*', 'config/**/*', 'app/**/*']
+end
32 spec/models/registration_spec.rb
@@ -0,0 +1,32 @@
+require 'spec_helper'
+
+describe Registration do
+
+ def reset_registration(options = {})
+ @valid_attributes = {
+ :id => 1,
+ :username => "RSpec is great for testing too"
+ }
+
+ @registration.destroy! if @registration
+ @registration = Registration.create!(@valid_attributes.update(options))
+ end
+
+ before(:each) do
+ reset_registration
+ end
+
+ context "validations" do
+
+ it "rejects empty username" do
+ Registration.new(@valid_attributes.merge(:username => "")).should_not be_valid
+ end
+
+ it "rejects non unique username" do
+ # as one gets created before each spec by reset_registration
+ Registration.new(@valid_attributes).should_not be_valid
+ end
+
+ end
+
+end
Please sign in to comment.
Something went wrong with that request. Please try again.