mirror of
https://github.com/openSUSE/osem.git
synced 2026-08-17 05:34:04 +00:00
Merge pull request #1516 from siddhantbajaj/PhysicalTicket
Created PhysicalTicket model
This commit is contained in:
commit
702edef3a0
20 changed files with 123 additions and 12 deletions
2
Gemfile
2
Gemfile
|
|
@ -20,7 +20,7 @@ gem 'responders', '~> 2.0'
|
|||
# as the database for Active Record
|
||||
# choose only one
|
||||
gem 'mysql2'
|
||||
#gem 'pg'
|
||||
# gem 'pg'
|
||||
|
||||
# for observing records
|
||||
gem 'rails-observers'
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class PaymentsController < ApplicationController
|
|||
|
||||
if @payment.purchase && @payment.save
|
||||
update_purchased_ticket_purchases
|
||||
redirect_to conference_conference_registration_path(@conference.short_title),
|
||||
redirect_to conference_physical_ticket_index_path,
|
||||
notice: 'Thanks! Your ticket is booked successfully.'
|
||||
else
|
||||
@total_amount_to_pay = Ticket.total_price(@conference, current_user, paid: false)
|
||||
|
|
@ -38,6 +38,8 @@ class PaymentsController < ApplicationController
|
|||
end
|
||||
|
||||
def update_purchased_ticket_purchases
|
||||
current_user.ticket_purchases.by_conference(@conference).unpaid.update_all(paid: true, payment_id: @payment.id)
|
||||
current_user.ticket_purchases.by_conference(@conference).unpaid.each do |ticket_purchase|
|
||||
ticket_purchase.pay(@payment)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
12
app/controllers/physical_ticket_controller.rb
Normal file
12
app/controllers/physical_ticket_controller.rb
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
class PhysicalTicketController < ApplicationController
|
||||
before_action :authenticate_user!
|
||||
load_resource :conference, find_by: :short_title
|
||||
load_and_authorize_resource
|
||||
authorize_resource :conference_registrations, class: Registration
|
||||
|
||||
def index
|
||||
@physical_tickets = current_user.physical_tickets.by_conference(@conference)
|
||||
end
|
||||
|
||||
def show; end
|
||||
end
|
||||
|
|
@ -11,7 +11,7 @@ class TicketPurchasesController < ApplicationController
|
|||
redirect_to new_conference_payment_path,
|
||||
notice: 'Please pay here to get tickets.'
|
||||
elsif current_user.ticket_purchases.by_conference(@conference).paid.any?
|
||||
redirect_to conference_conference_registration_path(@conference.short_title),
|
||||
redirect_to conference_physical_ticket_index_path,
|
||||
notice: 'You have free tickets for the conference.'
|
||||
else
|
||||
redirect_to conference_tickets_path(@conference.short_title),
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ class Ability
|
|||
can :index, Ticket
|
||||
can :manage, TicketPurchase, user_id: user.id
|
||||
can [:new, :create], Payment, user_id: user.id
|
||||
can [:index, :show], PhysicalTicket, user_id: user.id
|
||||
|
||||
can [:create, :destroy], Subscription, user_id: user.id
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ class Conference < ActiveRecord::Base
|
|||
has_one :email_settings, dependent: :destroy
|
||||
has_one :program, dependent: :destroy
|
||||
has_one :venue, dependent: :destroy
|
||||
has_many :physical_tickets, through: :ticket_purchases
|
||||
has_many :ticket_purchases, dependent: :destroy
|
||||
has_many :payments, dependent: :destroy
|
||||
has_many :supporters, through: :ticket_purchases, source: :user
|
||||
|
|
|
|||
6
app/models/physical_ticket.rb
Normal file
6
app/models/physical_ticket.rb
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
class PhysicalTicket < ActiveRecord::Base
|
||||
belongs_to :ticket_purchase
|
||||
has_one :ticket, through: :ticket_purchase
|
||||
has_one :conference, through: :ticket_purchase
|
||||
has_one :user, through: :ticket_purchase
|
||||
end
|
||||
|
|
@ -2,6 +2,7 @@ class TicketPurchase < ActiveRecord::Base
|
|||
belongs_to :ticket
|
||||
belongs_to :user
|
||||
belongs_to :conference
|
||||
belongs_to :payment
|
||||
|
||||
validates :ticket_id, :user_id, :conference_id, :quantity, presence: true
|
||||
|
||||
|
|
@ -13,6 +14,8 @@ class TicketPurchase < ActiveRecord::Base
|
|||
delegate :price_cents, to: :ticket
|
||||
delegate :price_currency, to: :ticket
|
||||
|
||||
has_many :physical_tickets
|
||||
|
||||
scope :paid, -> { where(paid: true) }
|
||||
scope :unpaid, -> { where(paid: false) }
|
||||
scope :by_conference, ->(conference) { where(conference_id: conference.id) }
|
||||
|
|
@ -45,8 +48,8 @@ class TicketPurchase < ActiveRecord::Base
|
|||
purchase = new(ticket_id: ticket.id,
|
||||
conference_id: conference.id,
|
||||
user_id: user.id,
|
||||
quantity: quantity,
|
||||
paid: ticket.price_cents.zero?)
|
||||
quantity: quantity)
|
||||
purchase.pay(nil) if ticket.price_cents.zero?
|
||||
end
|
||||
purchase
|
||||
end
|
||||
|
|
@ -60,6 +63,13 @@ class TicketPurchase < ActiveRecord::Base
|
|||
purchase.quantity = quantity if quantity > 0
|
||||
purchase
|
||||
end
|
||||
|
||||
def pay(payment)
|
||||
update_attributes(paid: true, payment: payment)
|
||||
PhysicalTicket.transaction do
|
||||
quantity.times { physical_tickets.create }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -6,6 +6,11 @@ end
|
|||
|
||||
class User < ActiveRecord::Base
|
||||
rolify
|
||||
has_many :physical_tickets, through: :ticket_purchases do
|
||||
def by_conference(conference)
|
||||
where('ticket_purchases.conference_id = ?', conference)
|
||||
end
|
||||
end
|
||||
has_many :users_roles
|
||||
has_many :roles, through: :users_roles, dependent: :destroy
|
||||
|
||||
|
|
|
|||
|
|
@ -38,3 +38,5 @@
|
|||
= link_to 'Subscribe', conference_subscriptions_path(conference.short_title), method: :post, class: 'btn btn-default'
|
||||
- else
|
||||
= link_to 'Unsubscribe', conference_subscriptions_path(conference.short_title), method: :delete, class: 'btn btn-default'
|
||||
- if current_user && current_user.physical_tickets.by_conference(conference).any?
|
||||
= link_to "My Tickets", conference_physical_ticket_index_path(conference.short_title), class: 'btn btn-default'
|
||||
|
|
|
|||
35
app/views/physical_ticket/index.html.haml
Normal file
35
app/views/physical_ticket/index.html.haml
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
.container
|
||||
.row
|
||||
.col-md-12.page-header
|
||||
%h2
|
||||
Tickets
|
||||
.text-muted
|
||||
Your tickets for the conference
|
||||
|
||||
.col-md-12
|
||||
- if @physical_tickets.present?
|
||||
%table.table.table-bordered.table-striped.table-hover#roles
|
||||
%thead
|
||||
%th ID
|
||||
%th Type
|
||||
%th User
|
||||
%th Actions
|
||||
%tbody
|
||||
- @physical_tickets.each do |physical_ticket|
|
||||
%tr
|
||||
%td= physical_ticket.id
|
||||
%td= physical_ticket.ticket.title
|
||||
%td= physical_ticket.user.name
|
||||
%td
|
||||
.btn-group
|
||||
= link_to 'Show',
|
||||
conference_physical_ticket_path(@conference.short_title,
|
||||
physical_ticket.id),
|
||||
class: 'btn btn-primary'
|
||||
= link_to 'Generate PDF',
|
||||
conference_physical_ticket_path(@conference.short_title,
|
||||
physical_ticket.id,
|
||||
format: :pdf),
|
||||
class: 'button btn btn-default btn-info'
|
||||
- else
|
||||
%h5 No Tickets found!
|
||||
0
app/views/physical_ticket/show.html.haml
Normal file
0
app/views/physical_ticket/show.html.haml
Normal file
|
|
@ -126,6 +126,7 @@ Osem::Application.routes.draw do
|
|||
resources :tickets, only: [:index]
|
||||
resources :ticket_purchases, only: [:create, :destroy]
|
||||
resources :payments, only: [:index, :new, :create]
|
||||
resources :physical_ticket, only: [:index, :show]
|
||||
resource :subscriptions, only: [:create, :destroy]
|
||||
resource :schedule, only: [:show] do
|
||||
member do
|
||||
|
|
|
|||
9
db/migrate/20170603095900_create_physical_tickets.rb
Normal file
9
db/migrate/20170603095900_create_physical_tickets.rb
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
class CreatePhysicalTickets < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :physical_tickets do |t|
|
||||
t.integer :ticket_purchase_id, null: false
|
||||
|
||||
t.timestamps null: false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended that you check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(version: 20170531094819) do
|
||||
ActiveRecord::Schema.define(version: 20170603095900) do
|
||||
|
||||
# These are extensions that must be enabled in order to support this database
|
||||
enable_extension "plpgsql"
|
||||
|
|
@ -289,6 +289,12 @@ ActiveRecord::Schema.define(version: 20170531094819) do
|
|||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "physical_tickets", force: :cascade do |t|
|
||||
t.integer "ticket_purchase_id", null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "programs", force: :cascade do |t|
|
||||
t.integer "conference_id"
|
||||
t.integer "rating", default: 0
|
||||
|
|
|
|||
5
spec/factories/physical_ticket.rb
Normal file
5
spec/factories/physical_ticket.rb
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
FactoryGirl.define do
|
||||
factory :physical_ticket do
|
||||
ticket_purchase
|
||||
end
|
||||
end
|
||||
|
|
@ -4,5 +4,11 @@ FactoryGirl.define do
|
|||
conference
|
||||
ticket
|
||||
quantity 10
|
||||
factory :paid_ticket_purchase do
|
||||
after(:build) do |ticket_purchase|
|
||||
payment = create(:payment)
|
||||
ticket_purchase.pay(payment)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -101,12 +101,10 @@ feature Registration do
|
|||
|
||||
click_button 'Continue'
|
||||
|
||||
expect(current_path).to eq(conference_conference_registration_path(conference.short_title))
|
||||
expect(current_path).to eq(conference_physical_ticket_index_path(conference.short_title))
|
||||
purchase = TicketPurchase.where(user_id: participant.id, ticket_id: free_ticket.id).first
|
||||
expect(purchase.quantity).to eq(5)
|
||||
expect(purchase.paid).to be true
|
||||
|
||||
expect(page.has_content?("5 #{free_ticket.title} Tickets for $ 0")).to be true
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
14
spec/models/physical_ticket_spec.rb
Normal file
14
spec/models/physical_ticket_spec.rb
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe PhysicalTicket do
|
||||
|
||||
describe 'association' do
|
||||
it { is_expected.to belong_to :ticket_purchase }
|
||||
end
|
||||
|
||||
describe 'validations' do
|
||||
it 'has a valid factory' do
|
||||
expect(build(:physical_ticket)).to be_valid
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -34,7 +34,6 @@ describe TicketPurchase do
|
|||
it 'is valid with a quantity greater than zero' do
|
||||
should allow_value(1).for(:quantity)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe 'self#purchase' do
|
||||
|
|
@ -54,7 +53,6 @@ describe TicketPurchase do
|
|||
expect(TicketPurchase.count).to eq(1)
|
||||
expect(purchase.quantity).to eq(10)
|
||||
expect(message.blank?).to be true
|
||||
|
||||
end
|
||||
|
||||
it 'creates a purchase for one ticket' do
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue