enju_purchase_request 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>