enju_purchase_request 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +3 -0
  3. data/Rakefile +45 -0
  4. data/app/controllers/order_lists_controller.rb +94 -0
  5. data/app/controllers/orders_controller.rb +129 -0
  6. data/app/controllers/purchase_requests_controller.rb +139 -0
  7. data/app/models/order.rb +35 -0
  8. data/app/models/order_list.rb +53 -0
  9. data/app/models/purchase_request.rb +89 -0
  10. data/app/views/order_lists/edit.html.erb +37 -0
  11. data/app/views/order_lists/index.atom.builder +11 -0
  12. data/app/views/order_lists/index.html.erb +34 -0
  13. data/app/views/order_lists/index.rss.builder +31 -0
  14. data/app/views/order_lists/new.html.erb +32 -0
  15. data/app/views/order_lists/show.html.erb +40 -0
  16. data/app/views/orders/edit.html.erb +30 -0
  17. data/app/views/orders/index.atom.builder +11 -0
  18. data/app/views/orders/index.html.erb +40 -0
  19. data/app/views/orders/index.rss.builder +38 -0
  20. data/app/views/orders/new.html.erb +34 -0
  21. data/app/views/orders/show.html.erb +23 -0
  22. data/app/views/purchase_requests/_index.html.erb +85 -0
  23. data/app/views/purchase_requests/_index_order_list.html.erb +76 -0
  24. data/app/views/purchase_requests/_new.html.erb +76 -0
  25. data/app/views/purchase_requests/_new_order_list.html.erb +74 -0
  26. data/app/views/purchase_requests/edit.html.erb +66 -0
  27. data/app/views/purchase_requests/index.atom.builder +15 -0
  28. data/app/views/purchase_requests/index.csv.erb +4 -0
  29. data/app/views/purchase_requests/index.html.erb +5 -0
  30. data/app/views/purchase_requests/index.rss.builder +38 -0
  31. data/app/views/purchase_requests/new.html.erb +5 -0
  32. data/app/views/purchase_requests/show.html.erb +94 -0
  33. data/config/routes.rb +18 -0
  34. data/db/migrate/123_create_purchase_requests.rb +30 -0
  35. data/db/migrate/126_create_orders.rb +18 -0
  36. data/db/migrate/20081009062129_create_order_lists.rb +21 -0
  37. data/lib/enju_purchase_request/bookmark_url.rb +45 -0
  38. data/lib/enju_purchase_request/bookstore.rb +3 -0
  39. data/lib/enju_purchase_request/engine.rb +14 -0
  40. data/lib/enju_purchase_request/url_validator.rb +10 -0
  41. data/lib/enju_purchase_request/version.rb +3 -0
  42. data/lib/enju_purchase_request.rb +7 -0
  43. data/lib/tasks/enju_purchase_request_tasks.rake +4 -0
  44. data/spec/controllers/order_lists_controller_spec.rb +476 -0
  45. data/spec/controllers/orders_controller_spec.rb +481 -0
  46. data/spec/controllers/purchase_requests_controller_spec.rb +537 -0
  47. data/spec/dummy/Rakefile +7 -0
  48. data/spec/dummy/app/assets/javascripts/application.js +9 -0
  49. data/spec/dummy/app/assets/stylesheets/application.css +7 -0
  50. data/spec/dummy/app/controllers/application_controller.rb +104 -0
  51. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  52. data/spec/dummy/app/models/ability.rb +25 -0
  53. data/spec/dummy/app/models/bookmark.rb +29 -0
  54. data/spec/dummy/app/models/bookstore.rb +31 -0
  55. data/spec/dummy/app/models/role.rb +5 -0
  56. data/spec/dummy/app/models/user.rb +29 -0
  57. data/spec/dummy/app/models/user_group.rb +2 -0
  58. data/spec/dummy/app/models/user_has_role.rb +4 -0
  59. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  60. data/spec/dummy/app/views/page/403.html.erb +9 -0
  61. data/spec/dummy/app/views/page/403.mobile.erb +5 -0
  62. data/spec/dummy/app/views/page/403.xml.erb +4 -0
  63. data/spec/dummy/app/views/page/404.html.erb +9 -0
  64. data/spec/dummy/app/views/page/404.mobile.erb +5 -0
  65. data/spec/dummy/app/views/page/404.xml.erb +4 -0
  66. data/spec/dummy/config/application.rb +45 -0
  67. data/spec/dummy/config/boot.rb +10 -0
  68. data/spec/dummy/config/database.yml +25 -0
  69. data/spec/dummy/config/environment.rb +5 -0
  70. data/spec/dummy/config/environments/development.rb +30 -0
  71. data/spec/dummy/config/environments/production.rb +60 -0
  72. data/spec/dummy/config/environments/test.rb +39 -0
  73. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  74. data/spec/dummy/config/initializers/devise.rb +209 -0
  75. data/spec/dummy/config/initializers/inflections.rb +10 -0
  76. data/spec/dummy/config/initializers/mime_types.rb +6 -0
  77. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  78. data/spec/dummy/config/initializers/session_store.rb +8 -0
  79. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  80. data/spec/dummy/config/locales/en.yml +5 -0
  81. data/spec/dummy/config/routes.rb +60 -0
  82. data/spec/dummy/config.ru +4 -0
  83. data/spec/dummy/db/migrate/006_create_items.rb +36 -0
  84. data/spec/dummy/db/migrate/124_create_bookstores.rb +21 -0
  85. data/spec/dummy/db/migrate/20111201121844_create_roles.rb +12 -0
  86. data/spec/dummy/db/migrate/20111201155456_create_users.rb +13 -0
  87. data/spec/dummy/db/migrate/20111201155513_add_devise_to_users.rb +31 -0
  88. data/spec/dummy/db/migrate/20111201163342_create_user_groups.rb +12 -0
  89. data/spec/dummy/db/migrate/20111201163718_create_user_has_roles.rb +10 -0
  90. data/spec/dummy/db/schema.rb +156 -0
  91. data/spec/dummy/db/test.sqlite3 +0 -0
  92. data/spec/dummy/log/development.log +0 -0
  93. data/spec/dummy/log/sunspot-solr-test.log +222 -0
  94. data/spec/dummy/log/test.log +137771 -0
  95. data/spec/dummy/public/404.html +26 -0
  96. data/spec/dummy/public/422.html +26 -0
  97. data/spec/dummy/public/500.html +26 -0
  98. data/spec/dummy/public/favicon.ico +0 -0
  99. data/spec/dummy/script/rails +6 -0
  100. data/spec/dummy/solr/conf/admin-extra.html +31 -0
  101. data/spec/dummy/solr/conf/elevate.xml +36 -0
  102. data/spec/dummy/solr/conf/mapping-ISOLatin1Accent.txt +246 -0
  103. data/spec/dummy/solr/conf/protwords.txt +21 -0
  104. data/spec/dummy/solr/conf/schema.xml +238 -0
  105. data/spec/dummy/solr/conf/scripts.conf +24 -0
  106. data/spec/dummy/solr/conf/solrconfig.xml +934 -0
  107. data/spec/dummy/solr/conf/spellings.txt +2 -0
  108. data/spec/dummy/solr/conf/stopwords.txt +58 -0
  109. data/spec/dummy/solr/conf/synonyms.txt +31 -0
  110. data/spec/dummy/solr/data/test/index/segments.gen +0 -0
  111. data/spec/dummy/solr/data/test/index/segments_1 +0 -0
  112. data/spec/dummy/solr/data/test/spellchecker/segments.gen +0 -0
  113. data/spec/dummy/solr/data/test/spellchecker/segments_1 +0 -0
  114. data/spec/factories/bookstore.rb +5 -0
  115. data/spec/factories/order.rb +6 -0
  116. data/spec/factories/order_list.rb +7 -0
  117. data/spec/factories/purchase_request.rb +6 -0
  118. data/spec/factories/user.rb +34 -0
  119. data/spec/fixtures/order_lists.yml +40 -0
  120. data/spec/fixtures/orders.yml +50 -0
  121. data/spec/fixtures/purchase_requests.yml +129 -0
  122. data/spec/fixtures/roles.yml +21 -0
  123. data/spec/fixtures/user_has_roles.yml +41 -0
  124. data/spec/fixtures/users.yml +69 -0
  125. data/spec/models/order_list_spec.rb +24 -0
  126. data/spec/models/order_spec.rb +21 -0
  127. data/spec/models/purchase_request_spec.rb +31 -0
  128. data/spec/spec_helper.rb +44 -0
  129. data/spec/support/controller_macros.rb +48 -0
  130. data/spec/support/devise.rb +4 -0
  131. metadata +394 -0
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 YOURNAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,3 @@
1
+ = EnjuPurchaseRequest
2
+
3
+ This project rocks and uses MIT-LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env rake
2
+ begin
3
+ require 'bundler/setup'
4
+ rescue LoadError
5
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
+ end
7
+ begin
8
+ require 'rdoc/task'
9
+ rescue LoadError
10
+ require 'rdoc/rdoc'
11
+ require 'rake/rdoctask'
12
+ RDoc::Task = Rake::RDocTask
13
+ end
14
+
15
+ RDoc::Task.new(:rdoc) do |rdoc|
16
+ rdoc.rdoc_dir = 'rdoc'
17
+ rdoc.title = 'EnjuPurchaseRequest'
18
+ rdoc.options << '--line-numbers'
19
+ rdoc.rdoc_files.include('README.rdoc')
20
+ rdoc.rdoc_files.include('lib/**/*.rb')
21
+ end
22
+
23
+ APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
25
+
26
+
27
+ Bundler::GemHelper.install_tasks
28
+
29
+ require 'rake/testtask'
30
+
31
+ Rake::TestTask.new(:test) do |t|
32
+ t.libs << 'lib'
33
+ t.libs << 'test'
34
+ t.pattern = 'test/**/*_test.rb'
35
+ t.verbose = false
36
+ end
37
+
38
+ require 'rspec/core'
39
+ require 'rspec/core/rake_task'
40
+
41
+ RSpec::Core::RakeTask.new(:spec) do |spec|
42
+ spec.pattern = FileList['spec/**/*_spec.rb']
43
+ end
44
+
45
+ task :default => :spec
@@ -0,0 +1,94 @@
1
+ class OrderListsController < ApplicationController
2
+ load_and_authorize_resource
3
+ before_filter :get_bookstore
4
+
5
+ # GET /order_lists
6
+ # GET /order_lists.json
7
+ def index
8
+ if @bookstore
9
+ @order_lists = @bookstore.order_lists.page(params[:page])
10
+ else
11
+ @order_lists = OrderList.page(params[:page])
12
+ end
13
+
14
+ respond_to do |format|
15
+ format.html # index.html.erb
16
+ format.json { render :json => @order_lists }
17
+ format.rss { render :layout => false }
18
+ format.atom
19
+ end
20
+ end
21
+
22
+ # GET /order_lists/1
23
+ # GET /order_lists/1.json
24
+ def show
25
+ respond_to do |format|
26
+ format.html # show.html.erb
27
+ format.json { render :json => @order_list }
28
+ end
29
+ end
30
+
31
+ # GET /order_lists/new
32
+ # GET /order_lists/new.json
33
+ def new
34
+ @order_list = OrderList.new
35
+ @bookstores = Bookstore.all
36
+
37
+ respond_to do |format|
38
+ format.html # new.html.erb
39
+ format.json { render :json => @order_list }
40
+ end
41
+ end
42
+
43
+ # GET /order_lists/1/edit
44
+ def edit
45
+ @bookstores = Bookstore.all
46
+ end
47
+
48
+ # POST /order_lists
49
+ # POST /order_lists.json
50
+ def create
51
+ @order_list = OrderList.new(params[:order_list])
52
+ @order_list.user = current_user
53
+
54
+ respond_to do |format|
55
+ if @order_list.save
56
+ flash[:notice] = t('controller.successfully_created', :model => t('activerecord.models.order_list'))
57
+ format.html { redirect_to(@order_list) }
58
+ format.json { render :json => @order_list, :status => :created, :location => @order_list }
59
+ else
60
+ @bookstores = Bookstore.all
61
+ format.html { render :action => "new" }
62
+ format.json { render :json => @order_list.errors, :status => :unprocessable_entity }
63
+ end
64
+ end
65
+ end
66
+
67
+ # PUT /order_lists/1
68
+ # PUT /order_lists/1.json
69
+ def update
70
+ respond_to do |format|
71
+ if @order_list.update_attributes(params[:order_list])
72
+ @order_list.sm_order! if params[:mode] == 'order'
73
+ flash[:notice] = t('controller.successfully_updated', :model => t('activerecord.models.order_list'))
74
+ format.html { redirect_to(@order_list) }
75
+ format.json { head :ok }
76
+ else
77
+ @bookstores = Bookstore.all
78
+ format.html { render :action => "edit" }
79
+ format.json { render :json => @order_list.errors, :status => :unprocessable_entity }
80
+ end
81
+ end
82
+ end
83
+
84
+ # DELETE /order_lists/1
85
+ # DELETE /order_lists/1.json
86
+ def destroy
87
+ @order_list.destroy
88
+
89
+ respond_to do |format|
90
+ format.html { redirect_to(order_lists_url) }
91
+ format.json { head :ok }
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,129 @@
1
+ class OrdersController < ApplicationController
2
+ load_and_authorize_resource
3
+ before_filter :get_order_list
4
+ before_filter :get_purchase_request
5
+
6
+ # GET /orders
7
+ # GET /orders.json
8
+ def index
9
+ case
10
+ when @order_list
11
+ @orders = @order_list.orders.page(params[:page])
12
+ else
13
+ @orders = Order.page(params[:page])
14
+ end
15
+ @count = {}
16
+ @count[:query_result] = @orders.size
17
+
18
+ respond_to do |format|
19
+ format.html # index.html.erb
20
+ format.json { render :json => @orders }
21
+ format.rss
22
+ format.atom
23
+ format.csv
24
+ end
25
+ end
26
+
27
+ # GET /orders/1
28
+ # GET /orders/1.json
29
+ def show
30
+ @order = Order.find(params[:id])
31
+
32
+ respond_to do |format|
33
+ format.html # show.html.erb
34
+ format.json { render :json => @order }
35
+ end
36
+ end
37
+
38
+ # GET /orders/new
39
+ # GET /orders/new.json
40
+ def new
41
+ @order_lists = OrderList.not_ordered
42
+ if @order_lists.blank?
43
+ flash[:notice] = t('order.create_order_list')
44
+ redirect_to new_order_list_url
45
+ return
46
+ end
47
+ unless @purchase_request
48
+ flash[:notice] = t('order.specify_purchase_request')
49
+ redirect_to purchase_requests_url
50
+ return
51
+ end
52
+ @order = Order.new(params[:order])
53
+
54
+ respond_to do |format|
55
+ format.html # new.html.erb
56
+ format.json { render :json => @order }
57
+ end
58
+ end
59
+
60
+ # GET /orders/1/edit
61
+ def edit
62
+ @order = Order.find(params[:id])
63
+ @order_lists = OrderList.not_ordered
64
+ end
65
+
66
+ # POST /orders
67
+ # POST /orders.json
68
+ def create
69
+ @order = Order.new(params[:order])
70
+
71
+ respond_to do |format|
72
+ if @order.save
73
+ flash[:notice] = t('controller.successfully_created', :model => t('activerecord.models.order'))
74
+ if @purchase_request
75
+ format.html { redirect_to purchase_request_order_url(@order.purchase_request, @order) }
76
+ format.json { render :json => @order, :status => :created, :location => @order }
77
+ else
78
+ format.html { redirect_to(@order) }
79
+ format.json { render :json => @order, :status => :created, :location => @order }
80
+ end
81
+ else
82
+ @order_lists = OrderList.not_ordered
83
+ format.html { render :action => "new" }
84
+ format.json { render :json => @order.errors, :status => :unprocessable_entity }
85
+ end
86
+ end
87
+ end
88
+
89
+ # PUT /orders/1
90
+ # PUT /orders/1.json
91
+ def update
92
+ @order = Order.find(params[:id])
93
+
94
+ respond_to do |format|
95
+ if @order.update_attributes(params[:order])
96
+ flash[:notice] = t('controller.successfully_updated', :model => t('activerecord.models.order'))
97
+ if @purchase_request
98
+ format.html { redirect_to purchase_request_order_url(@order.purchase_request, @order) }
99
+ format.json { head :ok }
100
+ else
101
+ format.html { redirect_to(@order) }
102
+ format.json { head :ok }
103
+ end
104
+ else
105
+ @order_lists = OrderList.not_ordered
106
+ format.html { render :action => "edit" }
107
+ format.json { render :json => @order.errors, :status => :unprocessable_entity }
108
+ end
109
+ end
110
+ end
111
+
112
+ # DELETE /orders/1
113
+ # DELETE /orders/1.json
114
+ def destroy
115
+ @order = Order.find(params[:id])
116
+
117
+ @order.destroy
118
+
119
+ respond_to do |format|
120
+ if @order_list
121
+ format.html { redirect_to order_list_purchase_requests_url(@order_list) }
122
+ format.json { head :ok }
123
+ else
124
+ format.html { redirect_to(orders_url) }
125
+ format.json { head :ok }
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,139 @@
1
+ class PurchaseRequestsController < ApplicationController
2
+ load_and_authorize_resource :except => :index
3
+ authorize_resource :only => :index
4
+ before_filter :get_user_if_nil
5
+ before_filter :get_order_list
6
+ before_filter :store_page, :only => :index
7
+ after_filter :solr_commit, :only => [:create, :update, :destroy]
8
+ after_filter :convert_charset, :only => :index
9
+
10
+ # GET /purchase_requests
11
+ # GET /purchase_requests.json
12
+ def index
13
+ @count = {}
14
+ if params[:format] == 'csv'
15
+ per_page = 65534
16
+ else
17
+ per_page = PurchaseRequest.per_page
18
+ end
19
+
20
+ query = params[:query].to_s.strip
21
+ @query = query.dup
22
+ mode = params[:mode]
23
+
24
+ user = @user
25
+ unless current_user.has_role?('Librarian')
26
+ if user and user != current_user
27
+ access_denied; return
28
+ end
29
+ if current_user == @user
30
+ redirect_to purchase_requests_url(:format => params[:format])
31
+ return
32
+ end
33
+ end
34
+
35
+ order_list = @order_list
36
+ search = Sunspot.new_search(PurchaseRequest)
37
+ search.build do
38
+ fulltext query if query.present?
39
+ if user
40
+ with(:user_id).equal_to user.id
41
+ else
42
+ with(:user_id).equal_to current_user.id
43
+ end
44
+ with(:order_list_id).equal_to order_list.id if order_list
45
+ case mode
46
+ when 'not_ordered'
47
+ with(:ordered).equal_to false
48
+ when 'ordered'
49
+ with(:ordered).equal_to true
50
+ end
51
+ order_by(:created_at, :desc)
52
+ end
53
+
54
+ page = params[:page] || "1"
55
+ flash[:page] = page if page.to_i >= 1
56
+ search.query.paginate(page.to_i, per_page)
57
+ @purchase_requests = search.execute!.results
58
+
59
+ @count[:query_result] = @purchase_requests.size
60
+
61
+ respond_to do |format|
62
+ format.html # index.html.erb
63
+ format.json { render :json => @purchase_requests }
64
+ format.rss { render :layout => false }
65
+ format.atom
66
+ format.csv
67
+ end
68
+ end
69
+
70
+ # GET /purchase_requests/1
71
+ # GET /purchase_requests/1.json
72
+ def show
73
+ respond_to do |format|
74
+ format.html # show.html.erb
75
+ format.json { render :json => @purchase_request }
76
+ end
77
+ end
78
+
79
+ # GET /purchase_requests/new
80
+ # GET /purchase_requests/new.json
81
+ def new
82
+ @purchase_request = current_user.purchase_requests.new(params[:purchase_request])
83
+ @purchase_request.title = Bookmark.get_title_from_url(@purchase_request.url) unless @purchase_request.title?
84
+
85
+ respond_to do |format|
86
+ format.html # new.html.erb
87
+ format.json { render :json => @purchase_request }
88
+ end
89
+ end
90
+
91
+ # GET /purchase_requests/1/edit
92
+ def edit
93
+ end
94
+
95
+ # POST /purchase_requests
96
+ # POST /purchase_requests.json
97
+ def create
98
+ @purchase_request = current_user.purchase_requests.new(params[:purchase_request])
99
+
100
+ respond_to do |format|
101
+ if @purchase_request.save
102
+ @order_list.purchase_requests << @purchase_request if @order_list
103
+ flash[:notice] = t('controller.successfully_created', :model => t('activerecord.models.purchase_request'))
104
+ format.html { redirect_to(@purchase_request) }
105
+ format.json { render :json => @purchase_request, :status => :created, :location => @purchase_request }
106
+ else
107
+ format.html { render :action => "new" }
108
+ format.json { render :json => @purchase_request.errors, :status => :unprocessable_entity }
109
+ end
110
+ end
111
+ end
112
+
113
+ # PUT /purchase_requests/1
114
+ # PUT /purchase_requests/1.json
115
+ def update
116
+ respond_to do |format|
117
+ if @purchase_request.update_attributes(params[:purchase_request])
118
+ @order_list.purchase_requests << @purchase_request if @order_list
119
+ flash[:notice] = t('controller.successfully_updated', :model => t('activerecord.models.purchase_request'))
120
+ format.html { redirect_to(@purchase_request) }
121
+ format.json { head :ok }
122
+ else
123
+ format.html { render :action => "edit" }
124
+ format.json { render :json => @purchase_request.errors, :status => :unprocessable_entity }
125
+ end
126
+ end
127
+ end
128
+
129
+ # DELETE /purchase_requests/1
130
+ # DELETE /purchase_requests/1.json
131
+ def destroy
132
+ @purchase_request.destroy
133
+
134
+ respond_to do |format|
135
+ format.html { redirect_to(purchase_requests_url) }
136
+ format.json { head :ok }
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,35 @@
1
+ class Order < ActiveRecord::Base
2
+ belongs_to :order_list, :validate => true
3
+ belongs_to :purchase_request, :validate => true
4
+
5
+ validates_associated :order_list, :purchase_request
6
+ validates_presence_of :order_list, :purchase_request
7
+ validates_uniqueness_of :purchase_request_id, :scope => :order_list_id
8
+
9
+ after_save :reindex
10
+ after_destroy :reindex
11
+
12
+ acts_as_list :scope => :order_list
13
+
14
+ def self.per_page
15
+ 10
16
+ end
17
+
18
+ def reindex
19
+ purchase_request.try(:index)
20
+ end
21
+ end
22
+
23
+ # == Schema Information
24
+ #
25
+ # Table name: orders
26
+ #
27
+ # id :integer not null, primary key
28
+ # order_list_id :integer not null
29
+ # purchase_request_id :integer not null
30
+ # position :integer
31
+ # state :string(255)
32
+ # created_at :datetime
33
+ # updated_at :datetime
34
+ #
35
+
@@ -0,0 +1,53 @@
1
+ class OrderList < ActiveRecord::Base
2
+ scope :not_ordered, where(:state => 'pending')
3
+
4
+ has_many :orders, :dependent => :destroy
5
+ has_many :purchase_requests, :through => :orders
6
+ belongs_to :user, :validate => true
7
+ belongs_to :bookstore, :validate => true
8
+ has_many :subscriptions
9
+
10
+ validates_presence_of :title, :user, :bookstore
11
+ validates_associated :user, :bookstore
12
+
13
+ state_machine :initial => :pending do
14
+ before_transition :pending => :ordered, :do => :order
15
+
16
+ event :sm_order do
17
+ transition :pending => :ordered
18
+ end
19
+ end
20
+
21
+ def self.per_page
22
+ 10
23
+ end
24
+
25
+ def total_price
26
+ self.purchase_requests.sum(:price)
27
+ end
28
+
29
+ def order
30
+ self.ordered_at = Time.zone.now
31
+ end
32
+
33
+ def ordered?
34
+ true if self.ordered_at.present?
35
+ end
36
+ end
37
+
38
+ # == Schema Information
39
+ #
40
+ # Table name: order_lists
41
+ #
42
+ # id :integer not null, primary key
43
+ # user_id :integer not null
44
+ # bookstore_id :integer not null
45
+ # title :text not null
46
+ # note :text
47
+ # ordered_at :datetime
48
+ # deleted_at :datetime
49
+ # state :string(255)
50
+ # created_at :datetime
51
+ # updated_at :datetime
52
+ #
53
+
@@ -0,0 +1,89 @@
1
+ class PurchaseRequest < ActiveRecord::Base
2
+ scope :not_ordered, includes(:order_list).where('order_lists.ordered_at IS NULL')
3
+ scope :ordered, includes(:order_list).where('order_lists.ordered_at IS NOT NULL')
4
+
5
+ belongs_to :user, :validate => true
6
+ has_one :order, :dependent => :destroy
7
+ has_one :order_list, :through => :order
8
+
9
+ validates_associated :user
10
+ validates_presence_of :user, :title
11
+ validate :check_price
12
+ validates :url, :url => true, :allow_blank => true, :length => {:maximum => 255}
13
+ after_save :index!
14
+ after_destroy :index!
15
+ before_save :set_date_of_publication
16
+ attr_protected :user_id
17
+
18
+ normalize_attributes :url, :pub_date
19
+
20
+ searchable do
21
+ text :title, :author, :publisher, :url
22
+ string :isbn
23
+ string :url
24
+ integer :price
25
+ integer :user_id
26
+ integer :order_list_id do
27
+ order_list.id if order_list
28
+ end
29
+ time :pub_date do
30
+ date_of_publication
31
+ end
32
+ time :created_at
33
+ time :accepted_at
34
+ time :denied_at
35
+ boolean :ordered do
36
+ order_list.try(:ordered_at).present? ? true : false
37
+ end
38
+ end
39
+
40
+ def self.per_page
41
+ 10
42
+ end
43
+
44
+ def check_price
45
+ errors.add(:price) unless self.price.nil? || self.price > 0
46
+ end
47
+
48
+ def set_date_of_publication
49
+ return if pub_date.blank?
50
+ begin
51
+ date = Time.zone.parse("#{pub_date}")
52
+ rescue ArgumentError
53
+ begin
54
+ date = Time.zone.parse("#{pub_date}-01")
55
+ rescue ArgumentError
56
+ begin
57
+ date = Time.zone.parse("#{pub_date}-01-01")
58
+ rescue ArgumentError
59
+ nil
60
+ end
61
+ end
62
+ end
63
+ self.date_of_publication = date
64
+ end
65
+ end
66
+
67
+ # == Schema Information
68
+ #
69
+ # Table name: purchase_requests
70
+ #
71
+ # id :integer not null, primary key
72
+ # user_id :integer not null
73
+ # title :text not null
74
+ # author :text
75
+ # publisher :text
76
+ # isbn :string(255)
77
+ # date_of_publication :datetime
78
+ # price :integer
79
+ # url :string(255)
80
+ # note :text
81
+ # accepted_at :datetime
82
+ # denied_at :datetime
83
+ # created_at :datetime
84
+ # updated_at :datetime
85
+ # deleted_at :datetime
86
+ # state :string(255)
87
+ # pub_date :string(255)
88
+ #
89
+
@@ -0,0 +1,37 @@
1
+ <div id="content_detail" class="ui-corner-all">
2
+ <h1 class="title"><%= t('page.editing', :model => t('activerecord.models.order_list')) -%></h1>
3
+ <div id="content_list">
4
+
5
+ <%= form_for(@order_list) do |f| -%>
6
+ <%= f.error_messages -%>
7
+
8
+ <div class="field">
9
+ <%= f.label :title -%><br />
10
+ <%= f.text_field :title, :class => 'resource_title' -%>
11
+ </div>
12
+ <div class="field">
13
+ <%= f.label t('activerecord.models.bookstore') -%><br />
14
+ <%= f.select(:bookstore_id, @bookstores.collect{|b| [b.name, b.id]}, :include_blank => true) -%>
15
+ </div>
16
+ <div class="field">
17
+ <%= f.label :ordered_at -%><br />
18
+ <%= f.text_field :ordered_at, :value => @order_list.ordered_at.try(:strftime, "%Y-%m-%d"), :class => 'date_field' -%>
19
+ </div>
20
+ <div class="field">
21
+ <%= f.label :note -%><br />
22
+ <%= f.text_area :note, :class => 'resource_textarea' -%>
23
+ </div>
24
+ <div class="actions">
25
+ <%= f.submit %>
26
+ </div>
27
+ <%- end -%>
28
+
29
+ </div>
30
+ </div>
31
+
32
+ <div id="submenu" class="ui-corner-all">
33
+ <ul>
34
+ <li><%= link_to t('page.show'), @order_list -%></li>
35
+ <li><%= link_to t('page.back'), order_lists_path -%></li>
36
+ </ul>
37
+ </div>
@@ -0,0 +1,11 @@
1
+ atom_feed(:url => order_lists_url(:format => :atom)) do |feed|
2
+ feed.title t('order_list.library_group_order_list', :library_group_name => @library_group.display_name.localize)
3
+ feed.updated(@order_lists.first ? @order_lists.first.created_at : Time.zone.now)
4
+
5
+ @order_lists.each do |order_list|
6
+ feed.entry(order_list) do |entry|
7
+ entry.title(order_list.title)
8
+ entry.author(@library_group.display_name.localize)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,34 @@
1
+ <div id="content_detail" class="ui-corner-all">
2
+ <h1 class="title"><%= t('page.listing', :model => t('activerecord.models.order_list')) -%></h1>
3
+ <div id="content_list">
4
+
5
+ <table class="index">
6
+ <tr>
7
+ <th><%= t('activerecord.attributes.order_list.title') -%></th>
8
+ <th><%= t('activerecord.models.bookstore') -%></th>
9
+ <th><%= t('activerecord.attributes.order_list.note') -%></th>
10
+ <th id="edit_icons"></th>
11
+ </tr>
12
+
13
+ <%- @order_lists.each do |order_list| -%>
14
+ <tr class="line<%= cycle("0", "1") -%>">
15
+ <td><%= link_to order_list.title, order_list -%></td>
16
+ <td><%= link_to order_list.bookstore.name, order_list.bookstore -%></td>
17
+ <td><%= order_list.note -%></td>
18
+ <td>
19
+ <%= link_to image_tag('icons/page_white_edit.png', :size => '16x16', :alt => t('page.edit')), edit_order_list_path(order_list) -%>
20
+ <%= link_to t('page.destroy'), order_list, :confirm => t('page.are_you_sure'), :method => :delete -%>
21
+ </tr>
22
+ <%- end -%>
23
+ </table>
24
+
25
+ <%= will_paginate(@order_lists) -%>
26
+
27
+ </div>
28
+ </div>
29
+
30
+ <div id="submenu" class="ui-corner-all">
31
+ <ul>
32
+ <li><%= link_to t('page.new', :model => t('activerecord.models.order_list')), new_order_list_path -%></li>
33
+ </ul>
34
+ </div>