trollied 0.1.0
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +294 -0
- data/README.rdoc +96 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/app/controllers/line_items_controller.rb +168 -0
- data/app/controllers/notes_controller.rb +121 -0
- data/app/controllers/orders_controller.rb +210 -0
- data/app/controllers/trolleys_controller.rb +26 -0
- data/app/helpers/gets_trollied_helper.rb +31 -0
- data/app/helpers/line_items_helper.rb +5 -0
- data/app/helpers/orders_helper.rb +184 -0
- data/app/models/line_item.rb +14 -0
- data/app/models/note.rb +15 -0
- data/app/models/order.rb +29 -0
- data/app/models/trolley.rb +51 -0
- data/app/views/line_items/_form.html.erb +8 -0
- data/app/views/line_items/_line_item.html.erb +12 -0
- data/app/views/line_items/new.html.erb +11 -0
- data/app/views/notes/_form.html.erb +7 -0
- data/app/views/notes/_new.html.erb +14 -0
- data/app/views/notes/_note.html.erb +4 -0
- data/app/views/notes/index.html.erb +13 -0
- data/app/views/notes/new.html.erb +5 -0
- data/app/views/orders/_date_pickers.html.erb +15 -0
- data/app/views/orders/_order.html.erb +53 -0
- data/app/views/orders/index.html.erb +22 -0
- data/app/views/orders/show.html.erb +14 -0
- data/app/views/trolleys/_orders.html.erb +13 -0
- data/app/views/trolleys/show.html.erb +16 -0
- data/config/locales/en.yml +115 -0
- data/config/routes.rb +8 -0
- data/generators/trollied_migrations/USAGE +2 -0
- data/generators/trollied_migrations/templates/line_items_migration.rb +16 -0
- data/generators/trollied_migrations/templates/notes_migration.rb +15 -0
- data/generators/trollied_migrations/templates/orders_migration.rb +15 -0
- data/generators/trollied_migrations/templates/trolleys_migration.rb +14 -0
- data/generators/trollied_migrations/trollied_migrations_generator.rb +13 -0
- data/lib/gets_trollied.rb +38 -0
- data/lib/gets_trollied_controller_helpers.rb +29 -0
- data/lib/has_trolley.rb +42 -0
- data/lib/has_trolley_controller_helpers.rb +43 -0
- data/lib/order_status.rb +121 -0
- data/lib/trollied.rb +5 -0
- data/rails/init.rb +10 -0
- data/test/full_2_3_5_app_with_tests/.gitignore +27 -0
- data/test/full_2_3_5_app_with_tests/README +1 -0
- data/test/full_2_3_5_app_with_tests/Rakefile +10 -0
- data/test/full_2_3_5_app_with_tests/app/controllers/application_controller.rb +14 -0
- data/test/full_2_3_5_app_with_tests/app/controllers/items_controller.rb +85 -0
- data/test/full_2_3_5_app_with_tests/app/controllers/user_controller.rb +2 -0
- data/test/full_2_3_5_app_with_tests/app/helpers/application_helper.rb +3 -0
- data/test/full_2_3_5_app_with_tests/app/helpers/items_helper.rb +2 -0
- data/test/full_2_3_5_app_with_tests/app/helpers/user_helper.rb +2 -0
- data/test/full_2_3_5_app_with_tests/app/models/item.rb +4 -0
- data/test/full_2_3_5_app_with_tests/app/models/user.rb +3 -0
- data/test/full_2_3_5_app_with_tests/app/views/items/edit.html.erb +20 -0
- data/test/full_2_3_5_app_with_tests/app/views/items/index.html.erb +22 -0
- data/test/full_2_3_5_app_with_tests/app/views/items/new.html.erb +19 -0
- data/test/full_2_3_5_app_with_tests/app/views/items/show.html.erb +13 -0
- data/test/full_2_3_5_app_with_tests/app/views/layouts/application.html.erb +19 -0
- data/test/full_2_3_5_app_with_tests/app/views/layouts/items.html.erb +19 -0
- data/test/full_2_3_5_app_with_tests/config/boot.rb +110 -0
- data/test/full_2_3_5_app_with_tests/config/database.yml +22 -0
- data/test/full_2_3_5_app_with_tests/config/environment.rb +57 -0
- data/test/full_2_3_5_app_with_tests/config/environments/development.rb +17 -0
- data/test/full_2_3_5_app_with_tests/config/environments/production.rb +28 -0
- data/test/full_2_3_5_app_with_tests/config/environments/test.rb +28 -0
- data/test/full_2_3_5_app_with_tests/config/initializers/backtrace_silencers.rb +7 -0
- data/test/full_2_3_5_app_with_tests/config/initializers/inflections.rb +10 -0
- data/test/full_2_3_5_app_with_tests/config/initializers/mime_types.rb +5 -0
- data/test/full_2_3_5_app_with_tests/config/initializers/new_rails_defaults.rb +21 -0
- data/test/full_2_3_5_app_with_tests/config/initializers/session_store.rb +15 -0
- data/test/full_2_3_5_app_with_tests/config/locales/en.yml +4 -0
- data/test/full_2_3_5_app_with_tests/config/locales/fr.yml +4 -0
- data/test/full_2_3_5_app_with_tests/config/locales/zh.yml +4 -0
- data/test/full_2_3_5_app_with_tests/config/locales.yml +5 -0
- data/test/full_2_3_5_app_with_tests/config/routes.rb +8 -0
- data/test/full_2_3_5_app_with_tests/config.ru +6 -0
- data/test/full_2_3_5_app_with_tests/db/migrate/20100407010602_create_items.rb +13 -0
- data/test/full_2_3_5_app_with_tests/db/migrate/20110426030509_create_users.rb +13 -0
- data/test/full_2_3_5_app_with_tests/db/migrate/20110426033906_create_trolleys.rb +14 -0
- data/test/full_2_3_5_app_with_tests/db/migrate/20110426033907_create_orders.rb +15 -0
- data/test/full_2_3_5_app_with_tests/db/migrate/20110426033908_create_line_items.rb +16 -0
- data/test/full_2_3_5_app_with_tests/db/migrate/20110615234040_create_notes.rb +15 -0
- data/test/full_2_3_5_app_with_tests/db/schema.rb +56 -0
- data/test/full_2_3_5_app_with_tests/db/seeds.rb +7 -0
- data/test/full_2_3_5_app_with_tests/doc/README_FOR_APP +2 -0
- data/test/full_2_3_5_app_with_tests/public/404.html +30 -0
- data/test/full_2_3_5_app_with_tests/public/422.html +30 -0
- data/test/full_2_3_5_app_with_tests/public/500.html +30 -0
- data/test/full_2_3_5_app_with_tests/public/favicon.ico +0 -0
- data/test/full_2_3_5_app_with_tests/public/images/rails.png +0 -0
- data/test/full_2_3_5_app_with_tests/public/index.html +275 -0
- data/test/full_2_3_5_app_with_tests/public/javascripts/application.js +2 -0
- data/test/full_2_3_5_app_with_tests/public/javascripts/controls.js +963 -0
- data/test/full_2_3_5_app_with_tests/public/javascripts/dragdrop.js +973 -0
- data/test/full_2_3_5_app_with_tests/public/javascripts/effects.js +1128 -0
- data/test/full_2_3_5_app_with_tests/public/javascripts/prototype.js +4320 -0
- data/test/full_2_3_5_app_with_tests/public/robots.txt +5 -0
- data/test/full_2_3_5_app_with_tests/public/stylesheets/scaffold.css +54 -0
- data/test/full_2_3_5_app_with_tests/script/about +4 -0
- data/test/full_2_3_5_app_with_tests/script/console +3 -0
- data/test/full_2_3_5_app_with_tests/script/dbconsole +3 -0
- data/test/full_2_3_5_app_with_tests/script/destroy +3 -0
- data/test/full_2_3_5_app_with_tests/script/generate +3 -0
- data/test/full_2_3_5_app_with_tests/script/performance/benchmarker +3 -0
- data/test/full_2_3_5_app_with_tests/script/performance/profiler +3 -0
- data/test/full_2_3_5_app_with_tests/script/plugin +3 -0
- data/test/full_2_3_5_app_with_tests/script/runner +3 -0
- data/test/full_2_3_5_app_with_tests/script/server +3 -0
- data/test/full_2_3_5_app_with_tests/test/factories.rb +22 -0
- data/test/full_2_3_5_app_with_tests/test/functional/line_items_controller_test.rb +69 -0
- data/test/full_2_3_5_app_with_tests/test/functional/orders_controller_test.rb +75 -0
- data/test/full_2_3_5_app_with_tests/test/integration/gets_trollied_test.rb +38 -0
- data/test/full_2_3_5_app_with_tests/test/integration/order_test.rb +79 -0
- data/test/full_2_3_5_app_with_tests/test/integration/trolley_test.rb +71 -0
- data/test/full_2_3_5_app_with_tests/test/performance/browsing_test.rb +9 -0
- data/test/full_2_3_5_app_with_tests/test/selenium.rb +83 -0
- data/test/full_2_3_5_app_with_tests/test/test_helper.rb +54 -0
- data/test/full_2_3_5_app_with_tests/test/unit/gets_trollied_test.rb +29 -0
- data/test/full_2_3_5_app_with_tests/test/unit/helpers/gets_trollied_helper_test.rb +75 -0
- data/test/full_2_3_5_app_with_tests/test/unit/helpers/orders_helper_test.rb +34 -0
- data/test/full_2_3_5_app_with_tests/test/unit/line_item_test.rb +28 -0
- data/test/full_2_3_5_app_with_tests/test/unit/note_test.rb +14 -0
- data/test/full_2_3_5_app_with_tests/test/unit/order_test.rb +65 -0
- data/test/full_2_3_5_app_with_tests/test/unit/trolley_test.rb +80 -0
- data/test/full_2_3_5_app_with_tests/tmp/restart.txt +0 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/init.rb +1 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/base.rb +31 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/force_extension.rb +57 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/locale.rb +70 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/pagination.rb +33 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter/uuid_token.rb +78 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/lib/routing_filter.rb +94 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/force_extension_spec.rb +65 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/generation_spec.rb +367 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/pagination_extension_spec.rb +19 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/recognition_spec.rb +76 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/routing_filter_spec.rb +114 -0
- data/test/full_2_3_5_app_with_tests/vendor/plugins/routing-filter/spec/spec_helper.rb +108 -0
- data/test/helper.rb +10 -0
- metadata +345 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<tr>
|
|
2
|
+
<td><%= link_to_purchasable_in(line_item) -%></td>
|
|
3
|
+
<% if can_delete_line_item?(order) -%>
|
|
4
|
+
<td>
|
|
5
|
+
<%= link_to t('line_items.line_item.delete'), { :controller => :orders,
|
|
6
|
+
:action => :destroy,
|
|
7
|
+
:id => line_item,
|
|
8
|
+
:order_id => order,
|
|
9
|
+
:trolley_id => trolley },
|
|
10
|
+
:confirm => t('line_items.line_item.are_you_sure'), :method => :delete %></td>
|
|
11
|
+
<% end -%>
|
|
12
|
+
</tr>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<% note ||= order.notes.new
|
|
2
|
+
add_note_msg = t('.add_note_to_order_for_user')
|
|
3
|
+
add_note_msg = t('.add_note_to_order_for_admin') unless current_user == order.user -%>
|
|
4
|
+
|
|
5
|
+
<div class="note-form" id="note-form-for-<%= order.id -%>">
|
|
6
|
+
|
|
7
|
+
<h4><%= add_note_msg -%></h4>
|
|
8
|
+
|
|
9
|
+
<% form_for([order, note]) do |f| %>
|
|
10
|
+
|
|
11
|
+
<%= render :partial => 'notes/form', :locals => { :form => f, :user => current_user } -%>
|
|
12
|
+
|
|
13
|
+
<% end %>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<% if Order.count > 0 -%>
|
|
2
|
+
<div class="date-form">
|
|
3
|
+
<% form_tag url_for_options_for_orders_index, :method => 'get' do %>
|
|
4
|
+
<%= hidden_field_tag 'state', @state if @state %>
|
|
5
|
+
<%= hidden_field_tag 'user', @user if @user %>
|
|
6
|
+
<%= hidden_field_tag 'trolley_id', @trolley.id if @trolley %>
|
|
7
|
+
|
|
8
|
+
<label><%= t '.from' -%></label>
|
|
9
|
+
<%= text_field_tag 'from', @from, :class => 'date-picker' %>
|
|
10
|
+
<label><%= t '.until' -%></label>
|
|
11
|
+
<%= text_field_tag 'until', @until, :class => 'date-picker' %>
|
|
12
|
+
<%= submit_tag t '.update' %>
|
|
13
|
+
<% end %>
|
|
14
|
+
</div>
|
|
15
|
+
<% end -%>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<% trolley ||= order.trolley -%>
|
|
2
|
+
|
|
3
|
+
<fieldset class="order">
|
|
4
|
+
|
|
5
|
+
<% if params[:controller] == 'orders' -%>
|
|
6
|
+
<h3><%= t '.user' -%> <%= link_to_orders_for(order.user) -%></h3>
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<table class="order">
|
|
10
|
+
<tr>
|
|
11
|
+
<th abbr="Line Item"><%= t '.purchasable_item_description' %></th>
|
|
12
|
+
</tr>
|
|
13
|
+
|
|
14
|
+
<%= render :partial => 'line_items/line_item', :collection => order.line_items, :locals => { :order => order, :trolley => trolley } -%>
|
|
15
|
+
|
|
16
|
+
<% if order.current? -%>
|
|
17
|
+
<tr>
|
|
18
|
+
<td><%= button_to_checkout order -%></td>
|
|
19
|
+
<td><%= button_to_clear order -%></td>
|
|
20
|
+
</tr>
|
|
21
|
+
<% end -%>
|
|
22
|
+
|
|
23
|
+
<% if order.in_process? -%>
|
|
24
|
+
<tr>
|
|
25
|
+
<td><%= button_to_cancel order -%></td>
|
|
26
|
+
|
|
27
|
+
<% if can_trigger_fulfilled_without_acceptance? -%>
|
|
28
|
+
<td><%= button_to_fulfilled_without_acceptance order -%></td>
|
|
29
|
+
<% end -%>
|
|
30
|
+
</tr>
|
|
31
|
+
<% end -%>
|
|
32
|
+
|
|
33
|
+
<% if order.ready? && can_trigger_finish? -%>
|
|
34
|
+
<tr>
|
|
35
|
+
<td><%= button_to_finish order -%></td>
|
|
36
|
+
</tr>
|
|
37
|
+
<% end -%>
|
|
38
|
+
|
|
39
|
+
</table>
|
|
40
|
+
|
|
41
|
+
</fieldset>
|
|
42
|
+
|
|
43
|
+
<% if order.notes.size != 0 -%>
|
|
44
|
+
<h3><%= t('.order_notes') -%></h3>
|
|
45
|
+
<% end -%>
|
|
46
|
+
|
|
47
|
+
<ul class="notes" id="notes-for-<%= order.id -%>">
|
|
48
|
+
<% if order.notes.size != 0 -%>
|
|
49
|
+
<%= render :partial => 'notes/note', :collection => order.notes -%>
|
|
50
|
+
<% end -%>
|
|
51
|
+
</ul>
|
|
52
|
+
|
|
53
|
+
<%= render :partial => 'notes/new', :locals => { :order => order, :user => current_user } if order.may_note? -%>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<% @title = t("orders.index.title") -%>
|
|
2
|
+
|
|
3
|
+
<h1><%= @title -%></h1>
|
|
4
|
+
|
|
5
|
+
<% if Order.count > 0 -%>
|
|
6
|
+
<h3><%= t '.filters' -%></h3>
|
|
7
|
+
<% end -%>
|
|
8
|
+
|
|
9
|
+
<%= state_links -%>
|
|
10
|
+
<%= render :partial => 'date_pickers' -%>
|
|
11
|
+
|
|
12
|
+
<% if @orders.size > 0 -%>
|
|
13
|
+
|
|
14
|
+
<h2><%= orders_state_headline -%><%= clear_extra_params -%></h2>
|
|
15
|
+
|
|
16
|
+
<%= render :partial => 'orders/order', :collection => @orders, :locals => { :trolley => @trolley, :status => @state } -%>
|
|
17
|
+
|
|
18
|
+
<div id="prev-next"><%= will_paginate @orders, :params => params %></div>
|
|
19
|
+
<% else -%>
|
|
20
|
+
<p><%= t("orders.index.no_orders") %></p>
|
|
21
|
+
<% end -%>
|
|
22
|
+
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%
|
|
2
|
+
if current_user == @order.user
|
|
3
|
+
@title = t(".your_order")
|
|
4
|
+
else
|
|
5
|
+
# TODO: interpolate user name
|
|
6
|
+
# (means name method has to be implemented for user model)
|
|
7
|
+
@title = t(".for_user_title", :name => @order.user.trolley_user_display_name)
|
|
8
|
+
end
|
|
9
|
+
-%>
|
|
10
|
+
|
|
11
|
+
<h1><%= @title -%></h1>
|
|
12
|
+
|
|
13
|
+
<%= render @order -%>
|
|
14
|
+
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<% if @trolley.orders.send("with_state_#{status}".to_sym).size > 0 -%>
|
|
2
|
+
|
|
3
|
+
<h2><%= t("trolleys.orders.#{status}") -%></h2>
|
|
4
|
+
|
|
5
|
+
<%= render :partial => 'orders/order',
|
|
6
|
+
:collection => @trolley.orders.send("with_state_#{status}"),
|
|
7
|
+
:locals => { :trolley => trolley, :status => status } -%>
|
|
8
|
+
|
|
9
|
+
<% elsif status == 'current' -%>
|
|
10
|
+
<h2><%= t("trolleys.orders.current") -%></h2>
|
|
11
|
+
<p><%= t("trolleys.orders.none_pending") %></p>
|
|
12
|
+
<% end -%>
|
|
13
|
+
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%
|
|
2
|
+
if current_user == @trollied_user
|
|
3
|
+
@title = t(".your_title")
|
|
4
|
+
else
|
|
5
|
+
# TODO: interpolate user name
|
|
6
|
+
# (means name method has to be implemented for user model)
|
|
7
|
+
@title = t(".for_user_title", :name => @trollied_user.trolley_user_display_name)
|
|
8
|
+
end
|
|
9
|
+
-%>
|
|
10
|
+
|
|
11
|
+
<h1><%= @title -%></h1>
|
|
12
|
+
|
|
13
|
+
<% %w(current user_review ready in_process completed).each do |status| -%>
|
|
14
|
+
<%= render :partial => 'orders', :locals => { :status => status, :trolley => @trolley } -%>
|
|
15
|
+
<% end -%>
|
|
16
|
+
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
en:
|
|
2
|
+
base:
|
|
3
|
+
cart: "cart"
|
|
4
|
+
shopping_cart: "shopping cart"
|
|
5
|
+
line_item:
|
|
6
|
+
already_in_order: "has already been placed"
|
|
7
|
+
line_items:
|
|
8
|
+
new:
|
|
9
|
+
confirm: "Confirm"
|
|
10
|
+
confirm_order: "Confirm Order"
|
|
11
|
+
edit:
|
|
12
|
+
update: "Update"
|
|
13
|
+
form:
|
|
14
|
+
helpers:
|
|
15
|
+
index:
|
|
16
|
+
are_you_sure: "Are you sure?"
|
|
17
|
+
back: "Back"
|
|
18
|
+
delete: "Delete"
|
|
19
|
+
edit: "Edit"
|
|
20
|
+
new: "New Line Item"
|
|
21
|
+
line_item:
|
|
22
|
+
delete: "Delete"
|
|
23
|
+
are_you_sure: "Are you sure?"
|
|
24
|
+
show:
|
|
25
|
+
edit: "Edit"
|
|
26
|
+
translations: "Translations"
|
|
27
|
+
controllers:
|
|
28
|
+
created: "Added to order"
|
|
29
|
+
updated: "Updated in order"
|
|
30
|
+
deleted: "Deleted from order"
|
|
31
|
+
notes:
|
|
32
|
+
controllers:
|
|
33
|
+
created: "Note created."
|
|
34
|
+
form:
|
|
35
|
+
send: "Send"
|
|
36
|
+
note:
|
|
37
|
+
said: "said"
|
|
38
|
+
new:
|
|
39
|
+
add_note_to_order_for_admin: "Add a note about this order for staff."
|
|
40
|
+
add_note_to_order_for_user: "Add a note about this order for the order's owner."
|
|
41
|
+
orders:
|
|
42
|
+
edit:
|
|
43
|
+
update: "Update"
|
|
44
|
+
date_pickers:
|
|
45
|
+
from: "From:"
|
|
46
|
+
until: "Until:"
|
|
47
|
+
update: "Update wth Date Filter"
|
|
48
|
+
form:
|
|
49
|
+
helpers:
|
|
50
|
+
by: "by"
|
|
51
|
+
cancelled_orders: "Cancelled Orders"
|
|
52
|
+
clear_params: "clear extra settings"
|
|
53
|
+
completed_orders: "Completed Orders"
|
|
54
|
+
current_orders: "Current Orders"
|
|
55
|
+
from: "from"
|
|
56
|
+
in_process_orders: "Orders Awaiting processing"
|
|
57
|
+
ready_orders: "Ready Orders"
|
|
58
|
+
until: "until"
|
|
59
|
+
user_review_orders: "Orders needing user attention"
|
|
60
|
+
index:
|
|
61
|
+
are_you_sure: "Are you sure?"
|
|
62
|
+
back: "Back"
|
|
63
|
+
cancelled: "cancelled"
|
|
64
|
+
completed: "completed"
|
|
65
|
+
current: "current"
|
|
66
|
+
delete: "Delete"
|
|
67
|
+
edit: "Edit"
|
|
68
|
+
filters: "Filters:"
|
|
69
|
+
in_process: "Awaiting processing"
|
|
70
|
+
new: "New Order"
|
|
71
|
+
no_orders: "No orders match your criteria."
|
|
72
|
+
ready: "ready"
|
|
73
|
+
title: "Orders"
|
|
74
|
+
user_review: "needing user attention"
|
|
75
|
+
new:
|
|
76
|
+
create: "Create"
|
|
77
|
+
order:
|
|
78
|
+
are_you_sure: "Are you sure?"
|
|
79
|
+
cancel: "Cancel"
|
|
80
|
+
checkout: "Checkout"
|
|
81
|
+
destroy: "Clear all"
|
|
82
|
+
finish: "Mark as completed"
|
|
83
|
+
fulfilled_without_acceptance: "Mark as ready"
|
|
84
|
+
order_notes: "Notes for this order:"
|
|
85
|
+
purchasable_item_description: "Item"
|
|
86
|
+
user: "User:"
|
|
87
|
+
show:
|
|
88
|
+
your_title: "Your Order"
|
|
89
|
+
for_user_title: "Order for {{name}}"
|
|
90
|
+
controllers:
|
|
91
|
+
change_to_cancel: "Order Cancelled"
|
|
92
|
+
change_to_checkout: "Order Checked Out"
|
|
93
|
+
change_to_finish: "Order Completed"
|
|
94
|
+
change_to_fulfilled_without_acceptance: "Order Ready"
|
|
95
|
+
created: "Created order"
|
|
96
|
+
updated: "Updated order"
|
|
97
|
+
deleted: "Deleted order"
|
|
98
|
+
checkout: "Your order has now been placed."
|
|
99
|
+
trolleys:
|
|
100
|
+
helpers:
|
|
101
|
+
orders:
|
|
102
|
+
cancelled: "Cancelled Orders"
|
|
103
|
+
completed: "Completed Orders"
|
|
104
|
+
current: "Current Orders"
|
|
105
|
+
in_process: "Awaiting processing"
|
|
106
|
+
none_pending: "No orders pending."
|
|
107
|
+
ready: "Ready Orders"
|
|
108
|
+
user_review: "Orders needing your attention"
|
|
109
|
+
show:
|
|
110
|
+
your_title: "Your Cart"
|
|
111
|
+
for_user_title: "Cart for {{name}}"
|
|
112
|
+
controllers:
|
|
113
|
+
gets_trollied_helper:
|
|
114
|
+
add_to_trolley: "+ Add to cart"
|
|
115
|
+
in_trolley: "Previously added to cart"
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
members = Order.workflow_event_names.inject(Hash.new) do |hash, event_name|
|
|
2
|
+
hash[event_name.to_sym] = :post
|
|
3
|
+
hash
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
ActionController::Routing::Routes.draw do |map|
|
|
7
|
+
map.resources :orders, :member => members, :except => [:new, :create], :has_many => :line_items, :has_many => :notes
|
|
8
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class CreateLineItems < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :line_items do |t|
|
|
4
|
+
t.integer :order_id, :null => false
|
|
5
|
+
t.integer :purchasable_item_id, :null => false #, :references => nil this may blow up
|
|
6
|
+
t.string :purchasable_item_type, :null => false
|
|
7
|
+
|
|
8
|
+
t.timestamps
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.down
|
|
14
|
+
drop_table :line_items
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class CreateNotes < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :notes do |t|
|
|
4
|
+
t.integer :order_id, :user_id, :null => false
|
|
5
|
+
t.string :body, :null => false
|
|
6
|
+
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.down
|
|
13
|
+
drop_table :notes
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class CreateOrders < ActiveRecord::Migration
|
|
2
|
+
def self.up
|
|
3
|
+
create_table :orders do |t|
|
|
4
|
+
t.integer :trolley_id, :null => false
|
|
5
|
+
t.string :workflow_state, :default => 'current', :null => false
|
|
6
|
+
|
|
7
|
+
t.timestamps
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.down
|
|
13
|
+
drop_table :orders
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class TrolliedMigrationsGenerator < Rails::Generator::Base
|
|
2
|
+
def manifest
|
|
3
|
+
record do |m|
|
|
4
|
+
m.migration_template 'trolleys_migration.rb', 'db/migrate', { :migration_file_name => "create_trolleys" }
|
|
5
|
+
m.sleep(1)
|
|
6
|
+
m.migration_template 'orders_migration.rb', 'db/migrate', { :migration_file_name => "create_orders" }
|
|
7
|
+
m.sleep(1)
|
|
8
|
+
m.migration_template 'line_items_migration.rb', 'db/migrate', { :migration_file_name => "create_line_items" }
|
|
9
|
+
m.sleep(1)
|
|
10
|
+
m.migration_template 'notes_migration.rb', 'db/migrate', { :migration_file_name => "create_notes" }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
require "active_record"
|
|
3
|
+
|
|
4
|
+
module GetsTrollied
|
|
5
|
+
def self.included(base)
|
|
6
|
+
base.extend(ClassMethods)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module ClassMethods
|
|
10
|
+
def set_up_to_get_trollied(*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?(GetsTrollied::InstanceMethods)
|
|
15
|
+
|
|
16
|
+
send :include, GetsTrollied::InstanceMethods
|
|
17
|
+
|
|
18
|
+
send :has_many, :line_items, :as => :purchasable_item, :dependent => :destroy
|
|
19
|
+
|
|
20
|
+
cattr_accessor :described_as_when_purchasing
|
|
21
|
+
self.described_as_when_purchasing = options[:described_as] || :name
|
|
22
|
+
|
|
23
|
+
cattr_accessor :as_foreign_key_sym
|
|
24
|
+
self.as_foreign_key_sym = self.name.foreign_key.to_sym
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
module InstanceMethods
|
|
30
|
+
def place_in(trolley)
|
|
31
|
+
trolley.add(self)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def description_for_purchasing
|
|
35
|
+
send(self.class.described_as_when_purchasing)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module GetsTrolliedControllerHelpers
|
|
2
|
+
def self.included(klass)
|
|
3
|
+
klass.send :helper_method, :url_for_purchasable_item, :target_action, :target_controller
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def target_controller(options = {})
|
|
7
|
+
purchasable_item_params_name = options.delete(:purchasable_item_params_name) || @purchasable_item_params_name
|
|
8
|
+
options.delete(:controller) || purchasable_item_params_name.pluralize || params[:controller]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def target_action(options = {})
|
|
12
|
+
options.delete(:action) || 'show'
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def target_id(options = {})
|
|
16
|
+
purchasable_item = options.delete(:purchasable_item) || @purchasable_item
|
|
17
|
+
options.delete(:id) || purchasable_item
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def url_for_purchasable_item(options = { })
|
|
21
|
+
defaults = {
|
|
22
|
+
:controller => target_controller(options),
|
|
23
|
+
:action => target_action(options),
|
|
24
|
+
:id => target_id(options)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
url_for(defaults.merge(options))
|
|
28
|
+
end
|
|
29
|
+
end
|
data/lib/has_trolley.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
require "active_record"
|
|
3
|
+
|
|
4
|
+
module HasTrolley
|
|
5
|
+
def self.included(klass)
|
|
6
|
+
klass.send :has_one, :trolley, :dependent => :destroy
|
|
7
|
+
klass.send :delegate, :correct_order, :to => :trolley
|
|
8
|
+
klass.send :after_create, :create_trolley
|
|
9
|
+
klass.extend ClassMethods
|
|
10
|
+
klass.send :include, InstanceMethods
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module ClassMethods
|
|
14
|
+
def add_trolleys_for_existing
|
|
15
|
+
all.each { |u| u.create_trolley }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module InstanceMethods
|
|
20
|
+
# implement in your application if you have another method name
|
|
21
|
+
# besides these common ones
|
|
22
|
+
# WARNING: potential security issue, definitely override
|
|
23
|
+
# if any of these options are sensitive
|
|
24
|
+
def trolley_user_display_name
|
|
25
|
+
if respond_to?(:display_name)
|
|
26
|
+
display_name
|
|
27
|
+
elsif respond_to?(:name)
|
|
28
|
+
name
|
|
29
|
+
elsif respond_to?(:username)
|
|
30
|
+
username
|
|
31
|
+
elsif respond_to?(:nickname)
|
|
32
|
+
nickname
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def create_trolley
|
|
39
|
+
Trolley.create!(:user => self)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module HasTrolleyControllerHelpers
|
|
2
|
+
def self.included(klass)
|
|
3
|
+
klass.send :helper_method, :url_for_trolley
|
|
4
|
+
klass.send :include, UrlFor
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module UrlFor
|
|
8
|
+
# expects user in options or @user or trolley being set
|
|
9
|
+
def url_for_trolley(options = { })
|
|
10
|
+
user = options[:user] || @user
|
|
11
|
+
user = @trolley.user if @trolley && user.blank?
|
|
12
|
+
|
|
13
|
+
trolley = options[:trolley] || @trolley || user.trolley
|
|
14
|
+
|
|
15
|
+
# TODO: Hack, not sure if this is 2.3.5 bug or my ignorance
|
|
16
|
+
# but url_for returns marshalled trolley, in addition to correct url
|
|
17
|
+
url = url_for(:user_id => user.id,
|
|
18
|
+
:controller => :trolleys,
|
|
19
|
+
:action => :show).split(".%23%")[0]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# expects order
|
|
23
|
+
# either as instance variables or in options
|
|
24
|
+
def url_for_order(options = { })
|
|
25
|
+
trolley = options[:trolley] || @trolley
|
|
26
|
+
trolley = @order.trolley if @order && trolley.blank?
|
|
27
|
+
|
|
28
|
+
order = options[:order] || @order || trolley.selected_order
|
|
29
|
+
|
|
30
|
+
url_for [trolley.user, trolley, order]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def url_for_order_or_trolley
|
|
34
|
+
raise unless @order
|
|
35
|
+
|
|
36
|
+
if @order.user == current_user
|
|
37
|
+
url_for_trolley :trolley => @order.trolley
|
|
38
|
+
else
|
|
39
|
+
url_for_order
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|