From 3b254a9f4f3495fb5f07cfd5a8c66a64c372099c Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Mon, 5 Oct 2009 00:38:23 -0500 Subject: [PATCH] support for opentransact with oauth --- app/controllers/transacts_controller.rb | 52 +++++++++++++++++-------- app/helpers/transacts_helper.rb | 12 ++++++ app/models/transact.rb | 28 ++++++------- app/views/shared/_transact.html.erb | 10 +++++ app/views/transacts/index.html.erb | 10 +++++ app/views/transacts/new.html.erb | 42 +++++++++----------- app/views/transacts/show.html.erb | 10 +++++ 7 files changed, 110 insertions(+), 54 deletions(-) create mode 100644 app/views/shared/_transact.html.erb create mode 100644 app/views/transacts/index.html.erb create mode 100644 app/views/transacts/show.html.erb diff --git a/app/controllers/transacts_controller.rb b/app/controllers/transacts_controller.rb index bf758a1b9..32e964d18 100644 --- a/app/controllers/transacts_controller.rb +++ b/app/controllers/transacts_controller.rb @@ -1,56 +1,76 @@ class TransactsController < ApplicationController skip_before_filter :require_activation before_filter :login_or_oauth_required + skip_before_filter :verify_authenticity_token, :if => :oauth? def index @transactions = current_person.transactions respond_to do |format| + format.html format.xml { render :xml => @transactions.to_xml(:root => "txns") } format.json { render :json => @transactions.to_json } end end + def show + @transact = current_person.transactions.find(params[:id]) + if nil == @transact + flash[:error] = "could not find transaction" + redirect_to home_url + return + end + respond_to do |format| + format.html + format.xml { render :xml => @transact.to_xml } + format.json { render :json => @transact.to_json } + end + end + def new @swp = params[:to] && params[:amount] - - @req = Req.new() - @req.name = params[:memo] - @transact = Transact.new(:to => params[:to], :amount => params[:amount], :callback_url => params[:callback_url], :redirect_url => params[:redirect_url]) if @swp - @worker = Person.find_by_email(@transact.to) + @worker = Person.find_by_email(params[:to]) + if nil == @worker + @swp = false + flash[:error] = "could not find payee" + render :action => "new" + return + end end end def create - @transact = Transact.new(params[:transact]) - @transact.customer = current_person - - @worker = Person.find_by_email(@transact.to) + @worker = Person.find_by_email(params[:to]) if nil == @worker + @swp = false flash[:error] = "could not find payee" render :action => "new" return end - + + # Transact.to and Transact.memo - makes @transact look opentransacty + # + @transact = Transact.new(:to => params[:to], :memo => params[:memo], :amount => params[:amount], :callback_url => params[:callback_url], :redirect_url => params[:redirect_url]) + @transact.customer = current_person @transact.worker = @worker - @req = Req.new(params[:req]) - @transact.save_req(@req) + @transact.metadata = @transact.create_req(params[:memo]) if @transact.save if @transact.redirect_url.blank? flash[:notice] = "Transfer succeeded." - redirect_to person_path(@worker) and return + respond_to do |format| + format.html { redirect_to person_path(@worker) } + format.json { render :json => @transact.to_json } + format.xml { render :xml => @transact.to_xml } + end else @transact.redirect_url << "?status=ok" redirect_to @transact.redirect_url end else flash[:error] = "Error with transfer." - req_name = @req.name @req.destroy - @req = Req.new - @req.name = req_name render :action => "new" end diff --git a/app/helpers/transacts_helper.rb b/app/helpers/transacts_helper.rb index c86a79ec4..52518d0f8 100644 --- a/app/helpers/transacts_helper.rb +++ b/app/helpers/transacts_helper.rb @@ -1,2 +1,14 @@ module TransactsHelper + def counterparty(t) + counterparty = current_person?(t.worker) ? t.customer : t.worker + end + + def counterparty_action(t) + units = t.group.nil? ? "hours" : t.group.unit + if current_person?(t.worker) + "+#{t.amount.to_s} #{units} (received from " + else + "-#{t.amount.to_s} #{units} (paid to " + end + end end diff --git a/app/models/transact.rb b/app/models/transact.rb index 97a7a0d4e..ec0c8dc27 100644 --- a/app/models/transact.rb +++ b/app/models/transact.rb @@ -1,18 +1,18 @@ class Transact < Exchange extend PreferencesHelper - attr_accessor :to, :callback_url, :redirect_url - attr_accessible :to, :callback_url, :redirect_url + attr_accessor :to, :memo, :callback_url, :redirect_url after_create :perform_callback - def save_req(req, person = self.customer) - req.name = 'miscellaneous' if req.name.blank? # XML creation might not set this - req.estimated_hours = self.amount + def create_req(memo) + req = Req.new + req.name = memo.blank? ? 'miscellaneous' : memo + req.person = customer + req.estimated_hours = amount req.due_date = Time.now - req.person = person req.active = false req.save! - self.req = req + req end def results @@ -23,12 +23,12 @@ def results } else { - :to => self.to, - :from => self.customer.email, - :amount => self.amount.to_s, + :to => worker.email, + :from => customer.email, + :amount => amount.to_s, :txn_date => created_at.iso8601, - :memo => self.metadata.name, - :txn_id => "http://" + Transact.global_prefs.server_name + "/transacts/#{self.id}", + :memo => metadata.name, + :txn_id => "http://" + Transact.global_prefs.server_name + "/transacts/#{id}", :status => 'ok' } end @@ -45,7 +45,7 @@ def to_json(options={}) protected def callback_uri - @callback_uri ||= URI.parse(self.callback_url) if self.callback_url + @callback_uri ||= URI.parse(callback_url) if callback_url end def http @@ -57,7 +57,7 @@ def http end def perform_callback - if self.callback_url + if callback_url request = Net::HTTP::Post.new(callback_uri.path+(callback_uri.query || '' )) request.set_form_data(results) response = http.request(request) diff --git a/app/views/shared/_transact.html.erb b/app/views/shared/_transact.html.erb new file mode 100644 index 000000000..174ee7375 --- /dev/null +++ b/app/views/shared/_transact.html.erb @@ -0,0 +1,10 @@ +
+ <%= image_link counterparty(transact), :image => :thumbnail %> + <%= image_tag "icons/switch.gif", :class => "icon", :alt => "Transaction" %> +
+

+ <%= counterparty_action(transact) %><%= person_link counterparty(transact) %>) for <%= link_to h(transact.metadata.name), transact.metadata %> +

+

+ <%= time_ago_in_words(transact.created_at).capitalize %> ago +

diff --git a/app/views/transacts/index.html.erb b/app/views/transacts/index.html.erb new file mode 100644 index 000000000..ed70bac55 --- /dev/null +++ b/app/views/transacts/index.html.erb @@ -0,0 +1,10 @@ +<%- column_div :type => :primary do -%> +

Transactions

+ +<%- end -%> + +<%- column_div :type => :secondary do -%> + <%= render :partial => 'shared/minifeed' %> +<%- end -%> diff --git a/app/views/transacts/new.html.erb b/app/views/transacts/new.html.erb index 402ae05da..79b1cc2a2 100644 --- a/app/views/transacts/new.html.erb +++ b/app/views/transacts/new.html.erb @@ -1,28 +1,24 @@ <%- column_div :type => :primary do -%> <% if @swp %> -

<%= @worker.name %> requested <%= @transact.amount %> hours

+

<%= h @worker.name %> requested <%= h params[:amount] %> hours

<% else %>

Pay someone

<% end %> - <%= error_messages_for :transact %> - <% if @swp %>
- <% form_for :transact, :url => transacts_path do |f| %> - <%= f.hidden_field :to %> - <%= f.hidden_field :amount %> - <%= f.hidden_field :callback_url %> - <%= f.hidden_field :redirect_url %> - <% fields_for :req do |r| %> - <%= r.hidden_field :name %> - <% end %> + <% form_tag :action => :create do %> + <%= hidden_field_tag(:to,params[:to]) %> + <%= hidden_field_tag(:amount,params[:amount]) %> + <%= hidden_field_tag(:memo,params[:memo]) %> + <%= hidden_field_tag(:callback_url,params[:callback_url]) %> + <%= hidden_field_tag(:redirect_url,params[:redirect_url]) %>
<%= image_tag @worker.main_photo, :class => "profile-image photo", :alt => h(@worker.name) %>
<%= display "This has been requested in return for:", :class => "meta" %> - <%= display @req.name %> + <%= display params[:memo] %>
@@ -30,24 +26,22 @@ <% end %>
<% else %> - <% form_for :transact, :url => transacts_path do |f| %> + <% form_tag :action => :create do %>
- <%= f.label :payee_email_address %> - <%= f.text_field :to %> + + <%= text_field_tag(:to,params[:to],:size => 40) %>
- <%= f.label :amount %> - <%= f.text_field :amount, :size => 2 %> hours + + <%= text_field_tag(:amount,params[:amount],:size => 3) %> hours
- <% fields_for :req do |r| %> -
- <%= r.label 'Service provided' %> - <%= r.text_field :name %> -
- <% end %>
- <%= f.submit "Submit" %> + + <%= text_field_tag(:memo,params[:memo],:size => 40) %>
+
+ +
<% end %> <% end %> <%- end -%> diff --git a/app/views/transacts/show.html.erb b/app/views/transacts/show.html.erb new file mode 100644 index 000000000..ee7b417bc --- /dev/null +++ b/app/views/transacts/show.html.erb @@ -0,0 +1,10 @@ +<%- column_div :type => :primary do -%> +

Transaction

+ +<%- end -%> + +<%- column_div :type => :secondary do -%> + <%= render :partial => 'shared/minifeed' %> +<%- end -%>