Skip to content

Commit

Permalink
Merge pull request #11 from alphagov/new_product_features_form
Browse files Browse the repository at this point in the history
New product features form
  • Loading branch information
jamiecobbett committed Nov 22, 2012
2 parents eadaf2f + 4c99e6a commit c196ced
Show file tree
Hide file tree
Showing 40 changed files with 511 additions and 144 deletions.
2 changes: 2 additions & 0 deletions Gemfile
Expand Up @@ -14,9 +14,11 @@ gem 'aws-ses', require: 'aws/ses'
gem 'exception_notification', '~> 2.4.1', require: 'exception_notifier'
gem 'gds-sso', '2.1.0'
gem 'jquery-rails'
gem 'jquery-ui-rails', '2.0.2'
gem 'plek', '0.5.0'
gem 'zendesk_api', '0.1.2'
gem 'formtastic-bootstrap', '2.0.0'
gem 'validates_timeliness', '3.0.14'

group :test do
gem "mocha", "0.12.6", require: false
Expand Down
8 changes: 8 additions & 0 deletions Gemfile.lock
Expand Up @@ -98,6 +98,9 @@ GEM
jquery-rails (2.1.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
jquery-ui-rails (2.0.2)
jquery-rails
railties (>= 3.1.0)
json (1.7.5)
jwt (0.1.5)
multi_json (>= 1.0)
Expand Down Expand Up @@ -192,6 +195,7 @@ GEM
libv8 (~> 3.3.10)
thor (0.16.0)
tilt (1.3.3)
timeliness (0.3.7)
treetop (1.4.11)
polyglot
polyglot (>= 0.3.1)
Expand All @@ -203,6 +207,8 @@ GEM
kgio (~> 2.6)
rack
raindrops (~> 0.7)
validates_timeliness (3.0.14)
timeliness (~> 0.3.6)
warden (1.2.1)
rack (>= 1.0)
webmock (1.8.11)
Expand Down Expand Up @@ -232,6 +238,7 @@ DEPENDENCIES
formtastic-bootstrap (= 2.0.0)
gds-sso (= 2.1.0)
jquery-rails
jquery-ui-rails (= 2.0.2)
mocha (= 0.12.6)
plek (= 0.5.0)
poltergeist (= 0.7.0)
Expand All @@ -241,5 +248,6 @@ DEPENDENCIES
therubyracer (~> 0.9.4)
uglifier (>= 1.0.3)
unicorn (= 4.3.1)
validates_timeliness (= 3.0.14)
webmock (= 1.8.11)
zendesk_api (= 0.1.2)
5 changes: 5 additions & 0 deletions app/assets/javascripts/application.js
Expand Up @@ -12,4 +12,9 @@
//
//= require jquery
//= require jquery_ujs
//= require jquery.ui.datepicker
//= require_tree .

$(document).ready(function() {
$('input[calendar-enabled=true]').datepicker({minDate: 0, dateFormat: 'dd-mm-yy'});
});
2 changes: 2 additions & 0 deletions app/assets/stylesheets/application.css
Expand Up @@ -11,4 +11,6 @@
*= require_self
*= require_tree .
*= require formtastic-bootstrap
*= require jquery.ui.datepicker
*= require forms
*/
4 changes: 4 additions & 0 deletions app/assets/stylesheets/forms.css
@@ -0,0 +1,4 @@
legend {
font-size: 1.2em;
font-weight: bold;
}
46 changes: 0 additions & 46 deletions app/controllers/application_controller.rb
@@ -1,53 +1,7 @@
require "zendesk_request"
require "zendesk_client"

class ApplicationController < ActionController::Base
include GDS::SSO::ControllerMethods

before_filter :authenticate_user!

protect_from_forgery

private

def on_get(template)
load_client_and_organisations("zendesk_error_upon_new_form")

@formdata = {}
render :"#{template}", :layout => "application"
end

def on_post(params, route)
load_client_and_organisations("zendesk_error_upon_submit")
@formdata = params

if @errors.empty?
ticket = ZendeskRequest.raise_zendesk_request(@client, params, route)
if ticket
redirect_to '/acknowledge'
else
return render :"support/zendesk_error", :locals => {:error_string => "zendesk_error_upon_submit"}
end
else
render :"#{@template}", :layout => "application", :status => 400
end
end

def load_client_and_organisations(error_string)
begin
@client = ZendeskClient.get_client(logger)
@organisations = ZendeskRequest.get_organisations(@client)
rescue ZendeskError
return render :"support/zendesk_error", :locals => {:error_string => error_string}
end
end

def prepopulate_organisation_list
begin
@client = ZendeskClient.get_client(logger)
@organisations = ZendeskRequest.get_organisations(@client)
rescue ZendeskError
return render :"support/zendesk_error", :locals => {:error_string => "zendesk_error_upon_new_form"}
end
end
end
2 changes: 1 addition & 1 deletion app/controllers/content_change_requests_controller.rb
@@ -1,6 +1,6 @@
require 'guard'

class ContentChangeRequestsController < ApplicationController
class ContentChangeRequestsController < RequestsController
def new
@formdata = {}
prepopulate_organisation_list
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/create_new_user_requests_controller.rb
@@ -1,4 +1,4 @@
class CreateNewUserRequestsController < ApplicationController
class CreateNewUserRequestsController < RequestsController
def new
@formdata = {}
prepopulate_organisation_list
Expand Down
30 changes: 11 additions & 19 deletions app/controllers/general_requests_controller.rb
@@ -1,26 +1,18 @@
require 'general_request_zendesk_ticket'

class GeneralRequestsController < ApplicationController
def new
@request = GeneralRequest.new(:requester => Requester.new)
prepopulate_organisation_list
end
class GeneralRequestsController < RequestsController

def create
@request = GeneralRequest.new(params[:general_request])
@request.user_agent = request.user_agent
def new_request
GeneralRequest.new(:requester => Requester.new)
end

load_client_and_organisations("zendesk_error_upon_submit")
def zendesk_ticket_class
GeneralRequestZendeskTicket
end

if @request.valid?
ticket = ZendeskRequest.raise_ticket(@client, GeneralRequestZendeskTicket.new(@request))
if ticket
redirect_to acknowledge_path
else
return render "support/zendesk_error", :locals => {:error_string => "zendesk_error_upon_submit"}
end
else
render :new, :status => 400
end
def parse_request_from_params
user_request = GeneralRequest.new(params[:general_request])
user_request.user_agent = request.user_agent
user_request
end
end
15 changes: 15 additions & 0 deletions app/controllers/new_feature_requests_controller.rb
@@ -0,0 +1,15 @@
require 'new_feature_request_zendesk_ticket'

class NewFeatureRequestsController < RequestsController
def new_request
NewFeatureRequest.new(:requester => Requester.new, :time_constraint => TimeConstraint.new)
end

def zendesk_ticket_class
NewFeatureRequestZendeskTicket
end

def parse_request_from_params
NewFeatureRequest.new(params[:new_feature_request])
end
end
2 changes: 1 addition & 1 deletion app/controllers/remove_user_requests_controller.rb
@@ -1,6 +1,6 @@
require 'guard'

class RemoveUserRequestsController < ApplicationController
class RemoveUserRequestsController < RequestsController
def new
@formdata = {}
prepopulate_organisation_list
Expand Down
77 changes: 77 additions & 0 deletions app/controllers/requests_controller.rb
@@ -0,0 +1,77 @@
require "zendesk_request"
require "zendesk_client"

class RequestsController < ApplicationController
def new
@request = new_request
prepopulate_organisation_list
end

def create
@request = parse_request_from_params
if @request.valid?
raise_ticket(zendesk_ticket_class.new(@request))
else
prepopulate_organisation_list
render :new, :status => 400
end
end

private

def on_get(template)
load_client_and_organisations("zendesk_error_upon_new_form")

@formdata = {}
render :"#{template}", :layout => "application"
end

def on_post(params, route)
load_client_and_organisations("zendesk_error_upon_submit")
@formdata = params

if @errors.empty?
ticket = ZendeskRequest.raise_zendesk_request(@client, params, route)
if ticket
redirect_to '/acknowledge'
else
return render :"support/zendesk_error", :locals => {:error_string => "zendesk_error_upon_submit"}
end
else
render :"#{@template}", :layout => "application", :status => 400
end
end

def raise_ticket(ticket)
load_client

ticket = ZendeskRequest.raise_ticket(@client, ticket)

if ticket
redirect_to acknowledge_path
else
return render "support/zendesk_error", :locals => {:error_string => "zendesk_error_upon_submit"}
end
end

def load_client_and_organisations(error_string)
load_client
load_organisations(error_string)
end

def load_client
@client = ZendeskClient.get_client(logger)
end

def load_organisations(error_string)
begin
@organisations = ZendeskRequest.get_organisations(@client)
rescue ZendeskError
return render :"support/zendesk_error", :locals => {:error_string => error_string}
end
end

def prepopulate_organisation_list
load_client_and_organisations("zendesk_error_upon_new_form")
end
end
2 changes: 1 addition & 1 deletion app/controllers/support_controller.rb
@@ -1,6 +1,6 @@
require "guard"

class SupportController < ApplicationController
class SupportController < RequestsController
def remove_user
if request.method == "GET"
on_get("useraccess/userremove")
Expand Down
15 changes: 3 additions & 12 deletions app/models/general_request.rb
@@ -1,17 +1,8 @@
require 'tableless_model'
require 'requester'
require 'with_requester'

class GeneralRequest < TablelessModel
attr_accessor :requester, :url, :additional, :user_agent
include WithRequester

validates_presence_of :requester
validate do |request|
if request.requester and not request.requester.valid?
errors[:base] << "Requester details are either not complete or invalid."
end
end

def requester_attributes=(attr)
self.requester = Requester.new(attr)
end
attr_accessor :url, :additional, :user_agent
end
11 changes: 11 additions & 0 deletions app/models/new_feature_request.rb
@@ -0,0 +1,11 @@
require 'tableless_model'
require 'with_requester'
require 'with_time_constraint'

class NewFeatureRequest < TablelessModel
include WithRequester
include WithTimeConstraint

attr_accessor :user_need, :url_of_example, :inside_government
validates_presence_of :user_need
end
9 changes: 9 additions & 0 deletions app/models/time_constraint.rb
@@ -0,0 +1,9 @@
require 'tableless_model'

class TimeConstraint < TablelessModel
attr_accessor :not_before_date, :needed_by_date, :time_constraint_reason

validates_date :needed_by_date, :allow_nil => true, :allow_blank => true, :on_or_after => :today
validates_date :not_before_date, :allow_nil => true, :allow_blank => true, :on_or_after => :today
validates_date :not_before_date, :before => :needed_by_date, :unless => Proc.new { |c| c.needed_by_date.nil? || c.needed_by_date.blank? }
end
17 changes: 17 additions & 0 deletions app/models/with_requester.rb
@@ -0,0 +1,17 @@
require 'requester'

module WithRequester
def self.included(base)
base.validates_presence_of :requester
base.validate do |request|
if request.requester and not request.requester.valid?
errors[:base] << "Requester details are either not complete or invalid."
end
end
end
attr_accessor :requester

def requester_attributes=(attr)
self.requester = Requester.new(attr)
end
end
16 changes: 16 additions & 0 deletions app/models/with_time_constraint.rb
@@ -0,0 +1,16 @@
require 'time_constraint'

module WithTimeConstraint
def self.included(base)
base.validate do |request|
if request.time_constraint and not request.time_constraint.valid?
errors[:base] << "Time constraint details are invalid."
end
end
end
attr_accessor :time_constraint

def time_constraint_attributes=(attr)
self.time_constraint = TimeConstraint.new(attr)
end
end
1 change: 1 addition & 0 deletions app/views/layouts/application.html.erb
Expand Up @@ -34,6 +34,7 @@
<ul class="nav nav-list">
<li class="nav-header">Content request</li>
<%= nav_link 'Content change', new_content_change_request_path %>
<%= nav_link 'New feature/need', new_new_feature_request_path %>
</ul>
<ul class="nav nav-list">
<li class="nav-header">User Access</li>
Expand Down

0 comments on commit c196ced

Please sign in to comment.