kete_trackable_items 0.0.1

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 (70) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/.specification +146 -0
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +27 -0
  6. data/LICENSE +20 -0
  7. data/README.rdoc +24 -0
  8. data/Rakefile +53 -0
  9. data/VERSION +1 -0
  10. data/app/controllers/repositories_controller.rb +70 -0
  11. data/app/controllers/shelf_locations_controller.rb +98 -0
  12. data/app/controllers/trackable_item_shelf_locations_controller.rb +64 -0
  13. data/app/controllers/tracked_items_controller.rb +44 -0
  14. data/app/controllers/tracking_lists_controller.rb +88 -0
  15. data/app/helpers/trackable_item_shelf_locations_helper.rb +17 -0
  16. data/app/helpers/trackable_items_helper.rb +52 -0
  17. data/app/models/on_loan_organization.rb +8 -0
  18. data/app/models/repository.rb +11 -0
  19. data/app/models/shelf_location.rb +69 -0
  20. data/app/models/trackable_item_shelf_location.rb +58 -0
  21. data/app/models/tracked_item.rb +18 -0
  22. data/app/models/tracking_list.rb +50 -0
  23. data/app/views/repositories/_form.html.erb +14 -0
  24. data/app/views/repositories/edit.html.erb +9 -0
  25. data/app/views/repositories/index.html.erb +22 -0
  26. data/app/views/repositories/new.html.erb +9 -0
  27. data/app/views/repositories/show.html.erb +30 -0
  28. data/app/views/shelf_locations/_event_button.html.erb +1 -0
  29. data/app/views/shelf_locations/_form.html.erb +34 -0
  30. data/app/views/shelf_locations/_shelf_location.html.erb +17 -0
  31. data/app/views/shelf_locations/_shelf_locations.html.erb +14 -0
  32. data/app/views/shelf_locations/_trackable_item.html.erb +12 -0
  33. data/app/views/shelf_locations/edit.html.erb +9 -0
  34. data/app/views/shelf_locations/index.html.erb +7 -0
  35. data/app/views/shelf_locations/new.html.erb +9 -0
  36. data/app/views/shelf_locations/show.html.erb +48 -0
  37. data/app/views/trackable_item_shelf_locations/new.html.erb +70 -0
  38. data/app/views/tracked_items/_tracked_item.html.erb +18 -0
  39. data/app/views/tracking_lists/_event_button.html.erb +1 -0
  40. data/app/views/tracking_lists/_form.html.erb +27 -0
  41. data/app/views/tracking_lists/_trackable_item_search_form.html.erb +28 -0
  42. data/app/views/tracking_lists/_tracking_list.html.erb +11 -0
  43. data/app/views/tracking_lists/_tracking_lists.html.erb +14 -0
  44. data/app/views/tracking_lists/edit.html.erb +9 -0
  45. data/app/views/tracking_lists/index.html.erb +11 -0
  46. data/app/views/tracking_lists/show.html.erb +45 -0
  47. data/app/views/tracking_lists/show.xls.builder +48 -0
  48. data/config/locales/en.yml +151 -0
  49. data/config/routes.rb +6 -0
  50. data/generators/kete_trackable_items_migrations/USAGE +2 -0
  51. data/generators/kete_trackable_items_migrations/kete_trackable_items_migrations_generator.rb +19 -0
  52. data/generators/kete_trackable_items_migrations/templates/add_trackable_item_columns_to_topics.rb +15 -0
  53. data/generators/kete_trackable_items_migrations/templates/create_on_loan_organizations.rb +14 -0
  54. data/generators/kete_trackable_items_migrations/templates/create_repositories.rb +14 -0
  55. data/generators/kete_trackable_items_migrations/templates/create_shelf_locations.rb +15 -0
  56. data/generators/kete_trackable_items_migrations/templates/create_trackable_item_shelf_locations.rb +16 -0
  57. data/generators/kete_trackable_items_migrations/templates/create_tracked_items.rb +15 -0
  58. data/generators/kete_trackable_items_migrations/templates/create_tracking_lists.rb +15 -0
  59. data/kete_trackable_items.gemspec +25 -0
  60. data/lib/kete_trackable_items.rb +0 -0
  61. data/lib/kete_trackable_items/controller_helpers.rb +7 -0
  62. data/lib/kete_trackable_items/extensions/helpers/application_helper.rb +29 -0
  63. data/lib/kete_trackable_items/extensions/models/basket.rb +4 -0
  64. data/lib/kete_trackable_items/extensions/models/topic.rb +6 -0
  65. data/lib/kete_trackable_items/matching_trackable_items_controller_helpers.rb +42 -0
  66. data/lib/kete_trackable_items/trackable_item.rb +80 -0
  67. data/lib/kete_trackable_items/version.rb +3 -0
  68. data/lib/kete_trackable_items/workflow_utilities.rb +91 -0
  69. data/rails/init.rb +68 -0
  70. metadata +166 -0
@@ -0,0 +1,4 @@
1
+ # extensions to the kete basket model
2
+ Basket.class_eval do
3
+ has_many :repositories, :dependent => :destroy
4
+ end
@@ -0,0 +1,6 @@
1
+ # extensions to the kete topic model
2
+ Topic.class_eval do
3
+ # adding trackable item functionality
4
+ include KeteTrackableItems::TrackableItem
5
+ set_up_as_trackable_item :described_as => :reference_title_date_range
6
+ end
@@ -0,0 +1,42 @@
1
+ module KeteTrackableItems
2
+ module MatchingTrackableItemsControllerHelpers
3
+ def set_matching_trackable_items
4
+ # do we have a search for trackable_items to add?
5
+ if params[:trackable_type_param_key].present?
6
+ # compose our find based on input and Kete.trackable_item_scopes
7
+ type_key_plural = params[:trackable_type_param_key]
8
+
9
+ type_key = type_key_plural.singularize
10
+ class_name = type_key.camelize
11
+ klass = class_name.constantize
12
+
13
+ always_scopes = Kete.trackable_item_scopes[type_key]['search_scopes']['always_within_scopes'].keys
14
+
15
+ # a trackable_item has to be allocated a shelf before it can be added to a tracking_list
16
+ always_scopes << 'with_state_on_shelf' if params[:controller] == 'tracking_lists'
17
+
18
+ scope_value_pairs = params[type_key_plural].select { |k, v| v.present? }
19
+
20
+ scope_value_pairs << ['in_basket', @current_basket.id] unless @current_basket == @site_basket
21
+
22
+ relevent_scopes = always_scopes + scope_value_pairs
23
+
24
+ @matching_trackable_items = relevent_scopes.inject(klass) do |model_class, relevent_scope|
25
+ if relevent_scope.is_a?(Array)
26
+ model_class.send(relevent_scope.first, relevent_scope.last)
27
+ else
28
+ model_class.send(relevent_scope)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ def build_items_for_matching_trackable_items_for(target, collection_name)
35
+ if @matching_trackable_items.present?
36
+ @matching_trackable_items.each do |trackable_item|
37
+ target.send(collection_name).build(:trackable_item => trackable_item)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,80 @@
1
+ require "active_record"
2
+
3
+ module KeteTrackableItems
4
+ module TrackableItem
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+ def set_up_as_trackable_item(*args)
11
+ options = args.last.is_a?(Hash) ? args.pop : Hash.new
12
+
13
+ # don't allow multiple calls
14
+ return if self.included_modules.include?(KeteTrackableItems::TrackableItem::InstanceMethods)
15
+
16
+ send :include, KeteTrackableItems::TrackableItem::InstanceMethods
17
+
18
+ # associations to support allocating a trackable_item to a shelf_location or shelf_locations
19
+ send :has_many, :trackable_item_shelf_locations, :as => :trackable_item, :dependent => :delete_all
20
+ send :has_many, :shelf_locations, :through => :trackable_item_shelf_locations, :conditions => "trackable_item_shelf_locations.workflow_state = 'active'"
21
+ # associations to support adding a trackable_item to a tracking_list
22
+ send :has_many, :tracked_items, :as => :trackable_item, :dependent => :delete_all
23
+ send :has_many, :tracking_lists, :through => :tracked_items
24
+
25
+ # when a trackable_item is in 'on_loan' state, which on_loan_organization is it on loan to?
26
+ send :belongs_to, :on_loan_organization
27
+
28
+ self.non_versioned_columns << "on_loan_organization_id"
29
+
30
+ cattr_accessor :described_as_in_tracking_list
31
+ self.described_as_in_tracking_list = options[:described_as] || :title
32
+
33
+ # set up our states and events through workflow gem
34
+ send :include, KeteTrackableItems::WorkflowUtilities
35
+
36
+ class_eval do
37
+ shared_code_as_string = shared_tracking_workflow_specs_as_string
38
+
39
+ specification = Proc.new {
40
+ state :unallocated do
41
+ event :allocate, :transitions_to => :on_shelf
42
+ end
43
+
44
+ eval(shared_code_as_string)
45
+
46
+ state :to_be_refiled do
47
+ event :refile, :transitions_to => :on_shelf
48
+ end
49
+ }
50
+
51
+ workflow(&specification)
52
+
53
+ set_up_workflow_named_scopes.call
54
+ end
55
+
56
+ self.non_versioned_columns << "workflow_state"
57
+ end
58
+ end
59
+
60
+ module InstanceMethods
61
+ # could be called is_allocated_to_shelf ?
62
+ def has_shelf_locations?
63
+ shelf_locations.size > 0
64
+ end
65
+
66
+ def description_for_tracked_item
67
+ send(self.class.described_as_in_tracking_list)
68
+ end
69
+
70
+ # add workflow triggered methods that run when corresponding event is triggered as necessary
71
+ def new_allocation
72
+ allocate!
73
+ end
74
+
75
+ def mapping_deactivated_or_destroyed
76
+ unassign_location! if on_shelf? && !has_shelf_locations?
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,3 @@
1
+ module KeteTrackableItems
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,91 @@
1
+ module KeteTrackableItems
2
+ module WorkflowUtilities
3
+ def self.included(base)
4
+ base.send :include, Workflow
5
+ base.extend(ClassMethods)
6
+ base.send :include, InstanceMethods
7
+ end
8
+
9
+ # mostly grabbed from trollied, would be nice if split into shared lib
10
+ module ClassMethods
11
+ # returns a Hash where keys are event name and values are event object
12
+ def workflow_events
13
+ events = workflow_spec.states.values.collect &:events
14
+
15
+ # skip blank values
16
+ events = events.select { |e| e.present? }
17
+
18
+ # flatten
19
+ events_hash = Hash.new
20
+ events.each do |v|
21
+ v.each do |key,value|
22
+ events_hash[key] = value
23
+ end
24
+ end
25
+
26
+ events_hash
27
+ end
28
+
29
+ def workflow_event_names
30
+ workflow_events.keys
31
+ end
32
+
33
+ # kete_trackable_items specific stuff starts
34
+ def shared_tracking_workflow_specs_as_string
35
+ '
36
+ state :on_shelf do
37
+ event :unassign_location, :transitions_to => :unallocated
38
+ event :display, :transitions_to => :displayed
39
+ event :hold_out, :transitions_to => :held_out
40
+ event :loan, :transitions_to => :on_loan_to_organization
41
+ end
42
+
43
+ state :displayed do
44
+ event :hold_out, :transitions_to => :held_out
45
+ event :loan, :transitions_to => :on_loan_to_organization
46
+ event :queue_for_refiling, :transitions_to => :to_be_refiled
47
+ end
48
+
49
+ state :held_out do
50
+ event :loan, :transitions_to => :on_loan_to_organization
51
+ event :queue_for_refiling, :transitions_to => :to_be_refiled
52
+ end
53
+
54
+ state :on_loan_to_organization do
55
+ event :display, :transitions_to => :displayed
56
+ event :hold_out, :transitions_to => :held_out
57
+ event :queue_for_refiling, :transitions_to => :to_be_refiled
58
+ end
59
+ '
60
+ end
61
+
62
+ def set_up_workflow_named_scopes
63
+ Proc.new {
64
+ # create a named_scope for each of our declared states
65
+ workflow_spec.state_names.each do |name|
66
+ scope_name = "with_state_#{name}".to_sym
67
+ named_scope scope_name, :conditions => { :workflow_state => name.to_s }, :order => 'updated_at DESC'
68
+ end
69
+
70
+ # workflow_in(state_name)
71
+ named_scope :workflow_in, lambda { |*args|
72
+ options = args.last.is_a?(Hash) ? args.pop : Hash.new
73
+ state = args.is_a?(Array) ? args.first : args
74
+
75
+ if state == 'all'
76
+ options
77
+ else
78
+ { :conditions => { :workflow_state => state.to_s }.merge(options) }
79
+ end
80
+ }
81
+ }
82
+ end
83
+ end
84
+
85
+ module InstanceMethods
86
+ def current_state_humanized
87
+ current_state.name.to_s.humanize
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,68 @@
1
+ ActionController::Base.send(:include, KeteTrackableItems::ControllerHelpers)
2
+ ActionController::Base.send(:helper, TrackableItemsHelper)
3
+
4
+ config.to_prepare do
5
+ # load our locales
6
+ I18n.load_path += Dir[File.join(File.dirname(__FILE__), '../config/locales/*.{rb,yml}')]
7
+
8
+ # override some controllers and helpers to be kete gets trollied aware
9
+ exts = File.join(File.dirname(__FILE__), '../lib/kete_trackable_items/extensions/{controllers,helpers}/*')
10
+ # use Kernel.load here so that changes to the extensions are reloaded on each request in development
11
+ Dir[exts].each { |ext_path| Kernel.load(ext_path) }
12
+
13
+ # models we extend
14
+ Dir[File.join(File.dirname(__FILE__), '../lib/kete_trackable_items/extensions/models/*')].each do |ext_path|
15
+ key = File.basename(ext_path, '.rb').to_sym
16
+ Kete.add_code_to_extensions_for(key, Proc.new { Kernel.load(ext_path) })
17
+ end
18
+
19
+ # this is for site specific defined search scopes
20
+ # i.e. you can place your own Kete site's extended fields set up dependent search definitions
21
+ # in a config and have them available to kete_trackable_items code
22
+ Kete.define_reader_method_as('trackable_item_scopes',
23
+ YAML.load(IO.read(File.join(Rails.root, 'config/trackable_item_scopes.yml'))))
24
+
25
+ Kete.trackable_item_scopes.each do |key, options|
26
+ klass = key.camelize.constantize
27
+ key = key.to_sym
28
+
29
+ if options['prerequisite_extensions'].present?
30
+ options['prerequisite_extensions'].each do |code|
31
+ extension = Proc.new {
32
+ klass.class_eval do
33
+ eval(code)
34
+ end
35
+ }
36
+
37
+ Kete.add_code_to_extensions_for(key, extension)
38
+ end
39
+ end
40
+
41
+ if options['search_scopes'].present?
42
+ if options['search_scopes']['always_within_scopes'].present?
43
+ options['search_scopes']['always_within_scopes'].each do |scope_key, scope_code|
44
+ extension = Proc.new {
45
+ klass.class_eval do
46
+ named_scope(scope_key.to_sym, eval(scope_code))
47
+ end
48
+ }
49
+
50
+ Kete.add_code_to_extensions_for(key, extension)
51
+ end
52
+ end
53
+
54
+ if options['search_scopes']['text_searches'].present?
55
+ options['search_scopes']['text_searches'].each do |search_specs|
56
+ search_specs.each do |scope_key, scope_code|
57
+ extension = Proc.new {
58
+ klass.class_eval do
59
+ named_scope(scope_key.to_sym, eval(scope_code))
60
+ end
61
+ }
62
+ Kete.add_code_to_extensions_for(key, extension)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kete_trackable_items
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Walter McGinnis
14
+ - Noel Gomez
15
+ - Chris Toynbee
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2012-05-31 00:00:00 +12:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: thoughtbot-shoulda
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ hash: 3
32
+ segments:
33
+ - 0
34
+ version: "0"
35
+ type: :development
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: jeweler
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ type: :development
50
+ version_requirements: *id002
51
+ description: A Kete application add-on that allows for tracking the location of an item in a physical archive that corresponds to the item in the Kete application.
52
+ email:
53
+ - ctoynbee@gmail.com
54
+ - walter@katipo.co.nz
55
+ executables: []
56
+
57
+ extensions: []
58
+
59
+ extra_rdoc_files: []
60
+
61
+ files:
62
+ - .document
63
+ - .gitignore
64
+ - .specification
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - LICENSE
68
+ - README.rdoc
69
+ - Rakefile
70
+ - VERSION
71
+ - app/controllers/repositories_controller.rb
72
+ - app/controllers/shelf_locations_controller.rb
73
+ - app/controllers/trackable_item_shelf_locations_controller.rb
74
+ - app/controllers/tracked_items_controller.rb
75
+ - app/controllers/tracking_lists_controller.rb
76
+ - app/helpers/trackable_item_shelf_locations_helper.rb
77
+ - app/helpers/trackable_items_helper.rb
78
+ - app/models/on_loan_organization.rb
79
+ - app/models/repository.rb
80
+ - app/models/shelf_location.rb
81
+ - app/models/trackable_item_shelf_location.rb
82
+ - app/models/tracked_item.rb
83
+ - app/models/tracking_list.rb
84
+ - app/views/repositories/_form.html.erb
85
+ - app/views/repositories/edit.html.erb
86
+ - app/views/repositories/index.html.erb
87
+ - app/views/repositories/new.html.erb
88
+ - app/views/repositories/show.html.erb
89
+ - app/views/shelf_locations/_event_button.html.erb
90
+ - app/views/shelf_locations/_form.html.erb
91
+ - app/views/shelf_locations/_shelf_location.html.erb
92
+ - app/views/shelf_locations/_shelf_locations.html.erb
93
+ - app/views/shelf_locations/_trackable_item.html.erb
94
+ - app/views/shelf_locations/edit.html.erb
95
+ - app/views/shelf_locations/index.html.erb
96
+ - app/views/shelf_locations/new.html.erb
97
+ - app/views/shelf_locations/show.html.erb
98
+ - app/views/trackable_item_shelf_locations/new.html.erb
99
+ - app/views/tracked_items/_tracked_item.html.erb
100
+ - app/views/tracking_lists/_event_button.html.erb
101
+ - app/views/tracking_lists/_form.html.erb
102
+ - app/views/tracking_lists/_trackable_item_search_form.html.erb
103
+ - app/views/tracking_lists/_tracking_list.html.erb
104
+ - app/views/tracking_lists/_tracking_lists.html.erb
105
+ - app/views/tracking_lists/edit.html.erb
106
+ - app/views/tracking_lists/index.html.erb
107
+ - app/views/tracking_lists/show.html.erb
108
+ - app/views/tracking_lists/show.xls.builder
109
+ - config/locales/en.yml
110
+ - config/routes.rb
111
+ - generators/kete_trackable_items_migrations/USAGE
112
+ - generators/kete_trackable_items_migrations/kete_trackable_items_migrations_generator.rb
113
+ - generators/kete_trackable_items_migrations/templates/add_trackable_item_columns_to_topics.rb
114
+ - generators/kete_trackable_items_migrations/templates/create_on_loan_organizations.rb
115
+ - generators/kete_trackable_items_migrations/templates/create_repositories.rb
116
+ - generators/kete_trackable_items_migrations/templates/create_shelf_locations.rb
117
+ - generators/kete_trackable_items_migrations/templates/create_trackable_item_shelf_locations.rb
118
+ - generators/kete_trackable_items_migrations/templates/create_tracked_items.rb
119
+ - generators/kete_trackable_items_migrations/templates/create_tracking_lists.rb
120
+ - kete_trackable_items.gemspec
121
+ - lib/kete_trackable_items.rb
122
+ - lib/kete_trackable_items/controller_helpers.rb
123
+ - lib/kete_trackable_items/extensions/helpers/application_helper.rb
124
+ - lib/kete_trackable_items/extensions/models/basket.rb
125
+ - lib/kete_trackable_items/extensions/models/topic.rb
126
+ - lib/kete_trackable_items/matching_trackable_items_controller_helpers.rb
127
+ - lib/kete_trackable_items/trackable_item.rb
128
+ - lib/kete_trackable_items/version.rb
129
+ - lib/kete_trackable_items/workflow_utilities.rb
130
+ - rails/init.rb
131
+ has_rdoc: true
132
+ homepage: https://github.com/kete/kete_trackable_items
133
+ licenses: []
134
+
135
+ post_install_message:
136
+ rdoc_options: []
137
+
138
+ require_paths:
139
+ - lib
140
+ required_ruby_version: !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ hash: 3
146
+ segments:
147
+ - 0
148
+ version: "0"
149
+ required_rubygems_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ hash: 3
155
+ segments:
156
+ - 0
157
+ version: "0"
158
+ requirements: []
159
+
160
+ rubyforge_project: kete_trackable_items
161
+ rubygems_version: 1.3.7
162
+ signing_key:
163
+ specification_version: 3
164
+ summary: A Rails engine gem that works in conjunction with kete_gets_trollied to track where an item (with a corresponding physical archive) is physically located.
165
+ test_files: []
166
+