opensteam 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +78 -0
- data/LICENSE +345 -0
- data/{README.txt → README.rdoc} +20 -17
- data/Rakefile +40 -0
- data/generators/opensteam/opensteam_generator.rb +95 -194
- data/generators/opensteam/templates/{controllers/administration → app/controllers/admin}/inventories_controller.rb +4 -4
- data/generators/opensteam/templates/app/controllers/admin/invoices_controller.rb +106 -0
- data/generators/opensteam/templates/app/controllers/admin/orders_controller.rb +113 -0
- data/generators/opensteam/templates/app/controllers/admin/search_controller.rb +17 -0
- data/generators/opensteam/templates/app/controllers/admin/shipments_controller.rb +106 -0
- data/generators/opensteam/templates/app/controllers/admin/users_controller.rb +99 -0
- data/generators/opensteam/templates/app/controllers/admin_controller.rb +40 -0
- data/generators/opensteam/templates/app/controllers/cart_controller.rb +94 -0
- data/generators/opensteam/templates/app/controllers/checkout_controller.rb +139 -0
- data/generators/opensteam/templates/app/controllers/profile/infos_controller.rb +52 -0
- data/generators/opensteam/templates/app/controllers/profile/orders_controller.rb +105 -0
- data/generators/opensteam/templates/app/controllers/profile_controller.rb +37 -0
- data/generators/opensteam/templates/app/controllers/searches_controller.rb +23 -0
- data/generators/opensteam/templates/app/controllers/user_sessions_controller.rb +38 -0
- data/generators/opensteam/templates/app/controllers/users_controller.rb +40 -0
- data/generators/opensteam/templates/{controllers → app/controllers}/webshop_controller.rb +35 -13
- data/generators/opensteam/templates/app/helpers/admin_helper.rb +40 -0
- data/generators/opensteam/templates/app/helpers/users_helper.rb +53 -0
- data/generators/opensteam/templates/app/helpers/webshop_helper.rb +91 -0
- data/generators/opensteam/templates/app/models/search.rb +36 -0
- data/generators/opensteam/templates/{views/administration → app/views/admin}/_address.html.erb +0 -0
- data/generators/opensteam/templates/app/views/admin/_nav.html.erb +5 -0
- data/generators/opensteam/templates/app/views/admin/catalog.html.erb +5 -0
- data/generators/opensteam/templates/app/views/admin/index.html.erb +21 -0
- data/generators/opensteam/templates/{views/administration → app/views/admin}/inventories/edit.html.erb +10 -9
- data/generators/opensteam/templates/{views/administration → app/views/admin}/inventories/index.html.erb +3 -3
- data/generators/opensteam/templates/{views/administration → app/views/admin}/inventories/new.html.erb +3 -3
- data/generators/opensteam/templates/app/views/admin/inventories/show.html.erb +46 -0
- data/generators/opensteam/templates/app/views/admin/invoices/_invoice.html.erb +12 -0
- data/generators/opensteam/templates/app/views/admin/invoices/_invoices.html.erb +11 -0
- data/generators/opensteam/templates/app/views/admin/invoices/index.html.erb +6 -0
- data/generators/opensteam/templates/app/views/admin/invoices/new.html.erb +54 -0
- data/generators/opensteam/templates/app/views/admin/invoices/show.html.erb +55 -0
- data/generators/opensteam/templates/app/views/admin/orders/_event.html.erb +5 -0
- data/generators/opensteam/templates/app/views/admin/orders/_order.html.erb +11 -0
- data/generators/opensteam/templates/app/views/admin/orders/_order_item.html.erb +10 -0
- data/generators/opensteam/templates/app/views/admin/orders/_orders.html.erb +19 -0
- data/generators/opensteam/templates/app/views/admin/orders/index.html.erb +14 -0
- data/generators/opensteam/templates/app/views/admin/orders/livesearch.rjs +6 -0
- data/generators/opensteam/templates/app/views/admin/orders/show.html.erb +58 -0
- data/generators/opensteam/templates/app/views/admin/products.html.erb +8 -0
- data/generators/opensteam/templates/app/views/admin/properties.html.erb +7 -0
- data/generators/opensteam/templates/app/views/admin/sales.html.erb +5 -0
- data/generators/opensteam/templates/app/views/admin/shipments/_shipment.erb +11 -0
- data/generators/opensteam/templates/app/views/admin/shipments/_shipments.html.erb +11 -0
- data/generators/opensteam/templates/app/views/admin/shipments/index.html.erb +6 -0
- data/generators/opensteam/templates/app/views/admin/shipments/new.html.erb +51 -0
- data/generators/opensteam/templates/app/views/admin/shipments/show.html.erb +55 -0
- data/generators/opensteam/templates/app/views/admin/users/_admins.html.erb +26 -0
- data/generators/opensteam/templates/app/views/admin/users/_admins_header.html.erb +10 -0
- data/generators/opensteam/templates/app/views/admin/users/_customer.html.erb +32 -0
- data/generators/opensteam/templates/app/views/admin/users/_customers.html.erb +29 -0
- data/generators/opensteam/templates/app/views/admin/users/_customers_header.html.erb +11 -0
- data/generators/opensteam/templates/app/views/admin/users/_user_fields.html.erb +9 -0
- data/generators/opensteam/templates/app/views/admin/users/_users.html.erb +29 -0
- data/generators/opensteam/templates/app/views/admin/users/_users_header.html.erb +11 -0
- data/generators/opensteam/templates/app/views/admin/users/edit.html.erb +6 -0
- data/generators/opensteam/templates/app/views/admin/users/index.html.erb +7 -0
- data/generators/opensteam/templates/app/views/admin/users/new.html.erb +6 -0
- data/generators/opensteam/templates/app/views/admin/users/show.html.erb +34 -0
- data/generators/opensteam/templates/app/views/admin/users.html.erb +4 -0
- data/generators/opensteam/templates/{views → app/views}/administration_mailer/order_admin.erb +0 -0
- data/generators/opensteam/templates/{views → app/views}/administration_mailer/order_customer.erb +0 -0
- data/generators/opensteam/templates/app/views/cart/_cart.html.erb +8 -0
- data/generators/opensteam/templates/{views/webshop → app/views/cart}/_cart_content.html.erb +7 -10
- data/generators/opensteam/templates/app/views/cart/index.html.erb +5 -0
- data/generators/opensteam/templates/app/views/cart/update.rjs +1 -0
- data/generators/opensteam/templates/app/views/checkout/intro.html.erb +18 -0
- data/generators/opensteam/templates/{views → app/views}/checkout/outro.html.erb +0 -1
- data/generators/opensteam/templates/{views → app/views}/checkout/payment.html.erb +0 -0
- data/generators/opensteam/templates/app/views/checkout/shipping.html.erb +45 -0
- data/generators/opensteam/templates/app/views/checkout/show_cart.html.erb +13 -0
- data/generators/opensteam/templates/{views → app/views}/checkout/update_cart_content.rjs +0 -0
- data/generators/opensteam/templates/{views → app/views}/common/_cart.html.erb +2 -2
- data/generators/opensteam/templates/{views → app/views}/common/_cart_content.html.erb +1 -1
- data/generators/opensteam/templates/app/views/common/_footer.html.erb +1 -0
- data/generators/opensteam/templates/app/views/common/_header.html.erb +4 -0
- data/generators/opensteam/templates/app/views/common/_header_flash.html.erb +3 -0
- data/generators/opensteam/templates/app/views/common/_signup_fields.html.erb +16 -0
- data/generators/opensteam/templates/app/views/common/_top_links.html.erb +10 -0
- data/generators/opensteam/templates/app/views/layouts/admin.html.erb +45 -0
- data/generators/opensteam/templates/app/views/layouts/profile.html.erb +45 -0
- data/generators/opensteam/templates/app/views/layouts/webshop.html.erb +51 -0
- data/generators/opensteam/templates/app/views/profile/_customer_sidebar.html.erb +12 -0
- data/generators/opensteam/templates/app/views/profile/index.html.erb +11 -0
- data/generators/opensteam/templates/app/views/profile/infos/_customer.html.erb +5 -0
- data/generators/opensteam/templates/app/views/profile/infos/edit.html.erb +25 -0
- data/generators/opensteam/templates/app/views/profile/infos/edit_password.html.erb +26 -0
- data/generators/opensteam/templates/app/views/profile/orders/_order.html.erb +11 -0
- data/generators/opensteam/templates/app/views/profile/orders/_order_item.html.erb +10 -0
- data/generators/opensteam/templates/app/views/profile/orders/_orders.html.erb +19 -0
- data/generators/opensteam/templates/app/views/profile/orders/index.html.erb +14 -0
- data/generators/opensteam/templates/app/views/profile/orders/show.html.erb +48 -0
- data/generators/opensteam/templates/app/views/searches/_search_bar.html.erb +5 -0
- data/generators/opensteam/templates/app/views/searches/new.html.erb +23 -0
- data/generators/opensteam/templates/app/views/searches/show.html.erb +1 -0
- data/generators/opensteam/templates/app/views/user_sessions/new.html.erb +14 -0
- data/generators/opensteam/templates/app/views/users/_user_bar.html.erb +5 -0
- data/generators/opensteam/templates/app/views/users/index.html.erb +27 -0
- data/generators/opensteam/templates/app/views/users/new.html.erb +7 -0
- data/generators/opensteam/templates/app/views/users/show.html.erb +5 -0
- data/generators/opensteam/templates/{views → app/views}/webshop/_inventory_content.html.erb +0 -0
- data/generators/opensteam/templates/app/views/webshop/_nav.html.erb +6 -0
- data/generators/opensteam/templates/{views → app/views}/webshop/add_inventory_to_cart.rjs +0 -0
- data/generators/opensteam/templates/{views → app/views}/webshop/add_to_cart_with_parameters.rjs +0 -0
- data/generators/opensteam/templates/{views → app/views}/webshop/del_item.rjs +0 -0
- data/generators/opensteam/templates/app/views/webshop/index.html.erb +11 -0
- data/generators/opensteam/templates/{views → app/views}/webshop/inventory.rjs +0 -0
- data/generators/opensteam/templates/{views → app/views}/webshop/show.html.erb +15 -15
- data/generators/opensteam/templates/config/initializers/init_states.rb +68 -0
- data/generators/opensteam/templates/{init → config/initializers}/opensteam.rb +6 -0
- data/generators/opensteam/templates/config/initializers/opensteam_model_tables.rb +57 -0
- data/generators/opensteam/templates/db/migrate/20080609095714_create_profiles.rb +14 -0
- data/generators/opensteam/templates/{migrations/create_sessions.rb → db/migrate/20080609095720_create_sessions.rb} +0 -0
- data/generators/opensteam/templates/db/migrate/20080609095721_create_users.rb +29 -0
- data/generators/opensteam/templates/{migrations/create_addresses.rb → db/migrate/20080609095723_create_addresses.rb} +0 -0
- data/generators/opensteam/templates/{migrations/create_customers.rb → db/migrate/20080609095724_create_customers.rb} +0 -0
- data/generators/opensteam/templates/db/migrate/20080609095725_create_dummy_users.rb +21 -0
- data/generators/opensteam/templates/{migrations/create_inventories.rb → db/migrate/20080609095726_create_inventories.rb} +0 -0
- data/generators/opensteam/templates/{migrations/create_inventories_properties.rb → db/migrate/20080609095727_create_inventories_properties.rb} +0 -0
- data/generators/opensteam/templates/{migrations/create_order_items.rb → db/migrate/20080609095728_create_order_items.rb} +5 -0
- data/generators/opensteam/templates/db/migrate/20080609095729_create_orders.rb +32 -0
- data/generators/opensteam/templates/{migrations/create_payment_types.rb → db/migrate/20080609095730_create_payment_types.rb} +0 -0
- data/generators/opensteam/templates/{migrations/create_properties.rb → db/migrate/20080609095731_create_properties.rb} +0 -0
- data/generators/opensteam/templates/db/migrate/20080623075613_create_states.rb +13 -0
- data/generators/opensteam/templates/db/migrate/20080624132807_create_searches.rb +20 -0
- data/generators/opensteam/templates/db/migrate/20080630114155_create_state_histories.rb +14 -0
- data/generators/opensteam/templates/db/migrate/20080714131513_create_invoices.rb +20 -0
- data/generators/opensteam/templates/db/migrate/20080714131650_create_shipments.rb +19 -0
- data/generators/opensteam/templates/lib/authenticated_system.rb +201 -0
- data/generators/opensteam/templates/lib/authentication/by_cookie_token.rb +90 -0
- data/generators/opensteam/templates/lib/authentication/by_password.rb +68 -0
- data/generators/opensteam/templates/lib/authentication.rb +46 -0
- data/generators/opensteam/templates/lib/states/invoice/finished.rb +6 -0
- data/generators/opensteam/templates/lib/states/invoice/payment_received.rb +8 -0
- data/generators/opensteam/templates/lib/states/invoice/pending.rb +6 -0
- data/generators/opensteam/templates/lib/states/invoice/waiting_for_payment.rb +5 -0
- data/generators/opensteam/templates/lib/states/order/finished.rb +6 -0
- data/generators/opensteam/templates/lib/states/order/pending.rb +19 -0
- data/generators/opensteam/templates/lib/states/order/processing.rb +11 -0
- data/generators/opensteam/templates/lib/states/shipment/finished.rb +6 -0
- data/generators/opensteam/templates/lib/states/shipment/pending.rb +5 -0
- data/generators/opensteam/templates/lib/tasks/opensteam.rake +114 -0
- data/generators/opensteam/templates/public/images/athmo_background.jpg +0 -0
- data/generators/opensteam/templates/public/images/bg.jpg +0 -0
- data/generators/opensteam/templates/public/images/cart_big.gif +0 -0
- data/generators/opensteam/templates/public/images/cross.png +0 -0
- data/generators/opensteam/templates/public/images/enter.gif +0 -0
- data/generators/opensteam/templates/public/images/menu_background.jpg +0 -0
- data/generators/opensteam/templates/public/images/opensteam_background.jpg +0 -0
- data/generators/opensteam/templates/public/images/opensteam_logo1.jpg +0 -0
- data/generators/opensteam/templates/public/images/opensteam_petstore_logo1.jpg +0 -0
- data/generators/opensteam/templates/public/images/opensteam_store_logo.jpg +0 -0
- data/generators/opensteam/templates/public/images/os_logo.gif +0 -0
- data/generators/opensteam/templates/public/images/slogan.png +0 -0
- data/generators/opensteam/templates/public/images/tick.png +0 -0
- data/generators/opensteam/templates/public/images/zoom.png +0 -0
- data/generators/opensteam/templates/public/index.html +19 -36
- data/generators/opensteam/templates/public/javascripts/opensteam.js +30 -0
- data/generators/opensteam/templates/public/stylesheets/opensteam_newdesign.css +188 -0
- data/generators/opensteam/templates/public/stylesheets/opensteam_white.css +168 -0
- data/generators/opensteam/templates/public/stylesheets/webshop.css +0 -1
- data/generators/opensteam/templates/tasks/opensteam.rake +1 -1
- data/generators/opensteam/templates/{fixtures → test/fixtures}/inventories.yml +0 -0
- data/generators/opensteam/templates/{fixtures → test/fixtures}/inventories_properties.yml +0 -0
- data/generators/opensteam/templates/{fixtures → test/fixtures}/product_animals.yml +0 -0
- data/generators/opensteam/templates/{fixtures → test/fixtures}/product_dog_foods.yml +0 -0
- data/generators/opensteam/templates/{fixtures → test/fixtures}/properties.yml +0 -0
- data/generators/opensteam_product/opensteam_product_generator.rb +25 -9
- data/generators/opensteam_product/templates/controllers/product_controller.rb +5 -4
- data/generators/opensteam_product/templates/migration.rb +2 -1
- data/generators/opensteam_product/templates/models/product.rb +1 -0
- data/generators/opensteam_product/templates/views/{administration → admin}/_attributes.html.erb +1 -1
- data/generators/opensteam_product/templates/views/{administration → admin}/_get_products.html.erb +0 -0
- data/generators/opensteam_product/templates/views/{administration → admin}/_inventories.html.erb +2 -2
- data/generators/opensteam_product/templates/views/admin/edit.html.erb +13 -0
- data/generators/opensteam_product/templates/views/{administration → admin}/index.html.erb +5 -5
- data/generators/opensteam_product/templates/views/admin/new.html.erb +16 -0
- data/generators/opensteam_product/templates/views/{administration → admin}/show.html.erb +2 -2
- data/generators/opensteam_property/opensteam_property_generator.rb +8 -8
- data/generators/opensteam_property/templates/controllers/property_controller.rb +6 -4
- data/generators/opensteam_property/templates/migration.rb +2 -1
- data/generators/opensteam_property/templates/models/property.rb +1 -0
- data/generators/opensteam_property/templates/views/{administration → admin}/edit.html.erb +3 -3
- data/generators/opensteam_property/templates/views/admin/index.html.erb +24 -0
- data/generators/opensteam_property/templates/views/{administration → admin}/new.html.erb +2 -2
- data/generators/opensteam_property/templates/views/admin/show.html.erb +10 -0
- data/lib/opensteam/base.rb +16 -0
- data/lib/opensteam/cart_base.rb +227 -0
- data/lib/opensteam/checkout.rb +30 -3
- data/lib/opensteam/config.rb +37 -0
- data/lib/opensteam/extension_base.rb +76 -0
- data/lib/opensteam/finder.rb +36 -5
- data/lib/opensteam/helper/configurable_table.rb +228 -0
- data/lib/opensteam/history.rb +56 -0
- data/lib/opensteam/initializer.rb +127 -0
- data/lib/opensteam/inventory_base.rb +24 -1
- data/lib/opensteam/invoice_base.rb +61 -0
- data/lib/opensteam/order_base.rb +105 -14
- data/lib/opensteam/product_base.rb +31 -3
- data/lib/opensteam/property_base.rb +16 -0
- data/lib/opensteam/shipment_base.rb +60 -0
- data/lib/opensteam/shopping_cart.rb +32 -14
- data/lib/opensteam/state_logic.rb +218 -0
- data/lib/opensteam/state_machine.rb +216 -0
- data/lib/opensteam/user_base.rb +115 -131
- data/lib/opensteam/version.rb +17 -1
- data/lib/opensteam.rb +30 -35
- metadata +245 -146
- data/History.txt +0 -0
- data/License.txt +0 -4
- data/Manifest.txt +0 -131
- data/Manifest.txt.bak +0 -132
- data/generators/opensteam/templates/controllers/administration/customers_controller.rb +0 -23
- data/generators/opensteam/templates/controllers/administration/orders_controller.rb +0 -61
- data/generators/opensteam/templates/controllers/administration_controller.rb +0 -80
- data/generators/opensteam/templates/controllers/checkout_controller.rb +0 -142
- data/generators/opensteam/templates/helpers/webshop_helper.rb +0 -29
- data/generators/opensteam/templates/migrations/create_dummy_users.rb +0 -16
- data/generators/opensteam/templates/migrations/create_orders.rb +0 -18
- data/generators/opensteam/templates/migrations/create_users.rb +0 -19
- data/generators/opensteam/templates/models/administration_mailer.rb +0 -18
- data/generators/opensteam/templates/models/inventories_property.rb +0 -10
- data/generators/opensteam/templates/models/inventory.rb +0 -57
- data/generators/opensteam/templates/public/images/rails.png +0 -0
- data/generators/opensteam/templates/views/administration/_nav.html.erb +0 -11
- data/generators/opensteam/templates/views/administration/_update_tree.html.erb +0 -18
- data/generators/opensteam/templates/views/administration/admin_info.html.erb +0 -12
- data/generators/opensteam/templates/views/administration/customers/index.html.erb +0 -27
- data/generators/opensteam/templates/views/administration/customers/show.html.erb +0 -27
- data/generators/opensteam/templates/views/administration/customers.html.erb +0 -44
- data/generators/opensteam/templates/views/administration/index.html.erb +0 -9
- data/generators/opensteam/templates/views/administration/inventories/show.html.erb +0 -45
- data/generators/opensteam/templates/views/administration/login.html.erb +0 -16
- data/generators/opensteam/templates/views/administration/order.html.erb +0 -22
- data/generators/opensteam/templates/views/administration/orders/_order_item.html.erb +0 -22
- data/generators/opensteam/templates/views/administration/orders/index.html.erb +0 -32
- data/generators/opensteam/templates/views/administration/orders/show.html.erb +0 -25
- data/generators/opensteam/templates/views/administration/orders.html.erb +0 -32
- data/generators/opensteam/templates/views/administration/products.html.erb +0 -7
- data/generators/opensteam/templates/views/administration/properties.html.erb +0 -7
- data/generators/opensteam/templates/views/administration/show_order_item.html.erb +0 -5
- data/generators/opensteam/templates/views/administration/signup.html.erb +0 -65
- data/generators/opensteam/templates/views/administration/tree.html.erb +0 -15
- data/generators/opensteam/templates/views/administration/update_products.html.erb +0 -5
- data/generators/opensteam/templates/views/administration/update_properties.html.erb +0 -5
- data/generators/opensteam/templates/views/administration/update_tree.rjs +0 -3
- data/generators/opensteam/templates/views/checkout/intro.html.erb +0 -5
- data/generators/opensteam/templates/views/checkout/shipping.html.erb +0 -39
- data/generators/opensteam/templates/views/checkout/show_cart.html.erb +0 -13
- data/generators/opensteam/templates/views/common/_header.html.erb +0 -15
- data/generators/opensteam/templates/views/layouts/administration.html.erb +0 -29
- data/generators/opensteam/templates/views/layouts/webshop.html.erb +0 -36
- data/generators/opensteam/templates/views/webshop/_cart.html.erb +0 -11
- data/generators/opensteam/templates/views/webshop/_header.html.erb +0 -15
- data/generators/opensteam/templates/views/webshop/index.html.erb +0 -12
- data/generators/opensteam_product/templates/views/administration/edit.html.erb +0 -13
- data/generators/opensteam_product/templates/views/administration/new.html.erb +0 -16
- data/generators/opensteam_property/templates/views/administration/index.html.erb +0 -24
- data/generators/opensteam_property/templates/views/administration/show.html.erb +0 -10
@@ -1,3 +1,19 @@
|
|
1
|
+
# openSteam - http://www.opensteam.net
|
2
|
+
# Copyright (C) 2008 DiamondDogs Webconsulting
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; version 2 of the License.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
|
+
|
1
17
|
module Opensteam
|
2
18
|
|
3
19
|
=begin rdoc
|
@@ -49,7 +65,7 @@ Used to either be included into a model or injected with the
|
|
49
65
|
products = (self._has_product || []).inject({}) { |r,v|
|
50
66
|
r.merge!( { v => v.to_s.classify.constantize.find(:all) } ) } || {}
|
51
67
|
|
52
|
-
products.delete(self.to_s.tableize)
|
68
|
+
products.delete(self.to_s.tableize)
|
53
69
|
|
54
70
|
products
|
55
71
|
end
|
@@ -78,11 +94,23 @@ Used to either be included into a model or injected with the
|
|
78
94
|
|
79
95
|
|
80
96
|
|
97
|
+
|
98
|
+
|
81
99
|
# inventory association
|
82
100
|
has_many :inventories, :as => :product,
|
83
101
|
:extend => Opensteam::Base::ExistByPropertiesExtension,
|
84
102
|
:class_name => "Opensteam::InventoryBase::Inventory"
|
85
|
-
|
103
|
+
|
104
|
+
has_many :inventories_properties, :through => :inventories, :include => :property
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
86
114
|
|
87
115
|
# holds the properties the product is allowed to have
|
88
116
|
# used for view
|
@@ -136,7 +164,7 @@ Used to either be included into a model or injected with the
|
|
136
164
|
# inventoy-objects which are currently associated with the product and do not
|
137
165
|
# match the properties (p) are deleted.
|
138
166
|
#
|
139
|
-
# used in the
|
167
|
+
# used in the admin-views, to update the product-property associations.
|
140
168
|
#
|
141
169
|
def set_properties=(p)
|
142
170
|
save
|
@@ -1,3 +1,19 @@
|
|
1
|
+
# openSteam - http://www.opensteam.net
|
2
|
+
# Copyright (C) 2008 DiamondDogs Webconsulting
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; version 2 of the License.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
|
+
|
1
17
|
module Opensteam
|
2
18
|
|
3
19
|
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# openSteam - http://www.opensteam.net
|
2
|
+
# Copyright (C) 2008 DiamondDogs Webconsulting
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; version 2 of the License.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
|
+
|
17
|
+
module Opensteam
|
18
|
+
|
19
|
+
|
20
|
+
module ShipmentBase
|
21
|
+
|
22
|
+
|
23
|
+
# available States for an Shipment-Instance
|
24
|
+
module States
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
# Shipment Model
|
31
|
+
class Shipment < ActiveRecord::Base
|
32
|
+
|
33
|
+
include Opensteam::StateMachine
|
34
|
+
|
35
|
+
belongs_to :order, :class_name => 'Opensteam::OrderBase::Order'
|
36
|
+
belongs_to :customer, :class_name => 'Opensteam::UserBase::User'
|
37
|
+
belongs_to :address, :class_name => 'Opensteam::UserBase::Address'
|
38
|
+
|
39
|
+
has_many :order_items, :class_name => 'Opensteam::OrderBase::OrderItem'
|
40
|
+
|
41
|
+
def initialize(*args)
|
42
|
+
super(*args)
|
43
|
+
|
44
|
+
if order
|
45
|
+
self.address = order.shipping_address
|
46
|
+
self.customer = order.customer
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -1,3 +1,18 @@
|
|
1
|
+
# openSteam - http://www.opensteam.net
|
2
|
+
# Copyright (C) 2008 DiamondDogs Webconsulting
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; version 2 of the License.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
1
16
|
|
2
17
|
require 'opensteam/finder'
|
3
18
|
|
@@ -8,20 +23,23 @@ module Opensteam
|
|
8
23
|
module ShoppingCart
|
9
24
|
|
10
25
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
26
|
+
def self.included(base)
|
27
|
+
base.extend ClassMethods
|
28
|
+
|
29
|
+
base.class_eval do
|
30
|
+
include InstanceMethods
|
31
|
+
before_filter :set_instance_vars
|
32
|
+
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
module InstanceMethods
|
42
|
+
|
25
43
|
|
26
44
|
# delete item from cart
|
27
45
|
#
|
@@ -0,0 +1,218 @@
|
|
1
|
+
# openSteam - http://www.opensteam.net
|
2
|
+
# Copyright (C) 2008 DiamondDogs Webconsulting
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; version 2 of the License.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
|
+
|
17
|
+
|
18
|
+
module Opensteam
|
19
|
+
|
20
|
+
module StateLogic
|
21
|
+
|
22
|
+
|
23
|
+
# StateLogic Module
|
24
|
+
# included in State Modules
|
25
|
+
module Mod
|
26
|
+
|
27
|
+
@@states = []
|
28
|
+
mattr_accessor :states
|
29
|
+
|
30
|
+
def self.included(base)
|
31
|
+
@@states << base
|
32
|
+
base.extend(ClassMethods) if base.is_a?(Module)
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
|
38
|
+
def name ; self.to_s.demodulize.downcase.to_sym ; end
|
39
|
+
|
40
|
+
def respond_to?( method )
|
41
|
+
self.protected_instance_methods.include?( method )
|
42
|
+
end
|
43
|
+
|
44
|
+
def state_module? ; true ; end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
# included method
|
50
|
+
# called when the state-module is included into the receiver-class (like Order, Shipment, Invoice)
|
51
|
+
#
|
52
|
+
# for each instance-method of the state-module, it creates an alias (in the receiver-klass) and delegates it
|
53
|
+
# to the corresponding state-module (based on receiver.state -> StatePattern) through the fire_event method.
|
54
|
+
#
|
55
|
+
|
56
|
+
def included(receiver)
|
57
|
+
self.instance_methods(false).each do |m|
|
58
|
+
|
59
|
+
receiver.class_eval do
|
60
|
+
define_method(m) { |*args| fire_event( m, *args ) }
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
state_name = self.to_s.demodulize.downcase
|
66
|
+
receiver.class_eval do
|
67
|
+
define_method("#{state_name}?") { self.state == state_name }
|
68
|
+
named_scope state_name, :conditions => ["#{self.table_name}.state = ?", state_name ]
|
69
|
+
|
70
|
+
class << self ;
|
71
|
+
def available_states
|
72
|
+
self.included_modules.select { |s|
|
73
|
+
s.ancestors.include?( Opensteam::StateLogic::Mod ) }.reject { |s|
|
74
|
+
s == Opensteam::StateLogic::Mod }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
require 'observer'
|
89
|
+
|
90
|
+
#
|
91
|
+
# class Base < ActiveRecord::Base
|
92
|
+
# self.table_name = "states"
|
93
|
+
#
|
94
|
+
#
|
95
|
+
# def self.state_type ; :state_base ; end
|
96
|
+
# def state_type ; self.class.state_type ; end
|
97
|
+
#
|
98
|
+
# Object.const_set "State", self
|
99
|
+
#
|
100
|
+
# @@sub_states = []
|
101
|
+
# class_inheritable_accessor :sub_states
|
102
|
+
#
|
103
|
+
#
|
104
|
+
# def self.inherited(base)
|
105
|
+
# ( self.sub_states ||= [] ) << base
|
106
|
+
#
|
107
|
+
# end
|
108
|
+
#
|
109
|
+
#
|
110
|
+
#
|
111
|
+
#
|
112
|
+
# def self.mod ; "#{self.to_s}Module".classify.constantize ; end
|
113
|
+
# def mod ; self.class.mod ; end
|
114
|
+
#
|
115
|
+
# def self.state_name
|
116
|
+
# self.to_s =~ /^(.+)State$/
|
117
|
+
# $1 ? $1.underscore.to_sym : self.to_s.to_sym
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# def state_name ; self.class.state_name ; end
|
121
|
+
#
|
122
|
+
# def to_s ; self.state_name ; end
|
123
|
+
#
|
124
|
+
#
|
125
|
+
# def self.events
|
126
|
+
# ( ( self.instance_methods(false) - self.generated_methods.to_a ).collect { |x|
|
127
|
+
# x =~ /!$/ ? x : nil }.compact.collect(&:to_sym) )
|
128
|
+
# end
|
129
|
+
#
|
130
|
+
#
|
131
|
+
# def events ; self.events ; end
|
132
|
+
#
|
133
|
+
#
|
134
|
+
# def self.instance_for_event( sym )
|
135
|
+
# "#{sym}State".classify.constantize.create
|
136
|
+
# end
|
137
|
+
#
|
138
|
+
#
|
139
|
+
#
|
140
|
+
#
|
141
|
+
#
|
142
|
+
#
|
143
|
+
#
|
144
|
+
#
|
145
|
+
#
|
146
|
+
# def self.state(name, &block)
|
147
|
+
# klass_name = "#{name}State".classify
|
148
|
+
# begin
|
149
|
+
# klass = klass_name.constantize
|
150
|
+
# raise NameError if klass.superclass != self
|
151
|
+
# puts "#{klass} is defined!!"
|
152
|
+
# rescue NameError
|
153
|
+
# klass = Class.new( self )
|
154
|
+
# Object.const_set klass_name, klass
|
155
|
+
# end
|
156
|
+
# klass.class_eval(&block) if block_given?
|
157
|
+
# end
|
158
|
+
#
|
159
|
+
#
|
160
|
+
# def self.event(name, *args, &block)
|
161
|
+
# self.class_eval { define_method(name) { block.call } if block_given? }
|
162
|
+
# Opensteam::StateMachine.inject_state_queries( self )
|
163
|
+
# Opensteam::StateMachine.inject_event_methods( self )
|
164
|
+
# end
|
165
|
+
#
|
166
|
+
#
|
167
|
+
# def self.transition_observer(*args, &block)
|
168
|
+
# if args.first.is_a?( Hash )
|
169
|
+
# from, to = args.first.keys.first, args.first.values.first
|
170
|
+
# else
|
171
|
+
# from, to = self.state_name, args.first
|
172
|
+
# end##
|
173
|
+
#
|
174
|
+
# if block_given?
|
175
|
+
# # Opensteam::StateMachine.transitions[from] ||= {}
|
176
|
+
# # ( Opensteam::StateMachine.transitions[from][to] ||= [] ) << block
|
177
|
+
# end
|
178
|
+
#
|
179
|
+
# end
|
180
|
+
#
|
181
|
+
# end
|
182
|
+
#
|
183
|
+
#
|
184
|
+
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
#if defined? RAILS_ROOT
|
194
|
+
#
|
195
|
+
# Dir.glob("#{RAILS_ROOT}/app/states/**/*.rb").collect { |f|
|
196
|
+
# puts f
|
197
|
+
# require f
|
198
|
+
# klass_name = "#{File.basename(f,'.rb')}State".classify
|
199
|
+
# begin
|
200
|
+
# klass = klass_name.constantize
|
201
|
+
# rescue NameError
|
202
|
+
# klass = Class.new( Opensteam::StateLogic::Base )
|
203
|
+
# Object.const_set klass_name, klass
|
204
|
+
# end
|
205
|
+
# }
|
206
|
+
#
|
207
|
+
#end
|
208
|
+
|
209
|
+
|
210
|
+
## if rails is runniny
|
211
|
+
#if defined? RAILS_ROOT
|
212
|
+
# ## init all states and create event methods for the Order-Instance
|
213
|
+
# Dir.glob("#{RAILS_ROOT}/app/models/*_states.rb").collect { |f|
|
214
|
+
# require Opensteam::State::Machine.create_event_methods_for_order( File.basename(f, ".rb").classify.constantize )
|
215
|
+
# }
|
216
|
+
#end
|
217
|
+
|
218
|
+
|
@@ -0,0 +1,216 @@
|
|
1
|
+
# openSteam - http://www.opensteam.net
|
2
|
+
# Copyright (C) 2008 DiamondDogs Webconsulting
|
3
|
+
#
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation; version 2 of the License.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
|
+
|
17
|
+
module Opensteam
|
18
|
+
|
19
|
+
|
20
|
+
# StateMachine Module
|
21
|
+
#
|
22
|
+
#
|
23
|
+
module StateMachine
|
24
|
+
|
25
|
+
|
26
|
+
class EventNotDefined < Opensteam::Config::Errors::OpensteamError
|
27
|
+
end
|
28
|
+
|
29
|
+
# raised when the event is not defined for current state
|
30
|
+
class EventNotDefinedForCurrentState < Opensteam::Config::Errors::OpensteamError
|
31
|
+
end
|
32
|
+
|
33
|
+
class EventExecutionError < Opensteam::Config::Errors::OpensteamError
|
34
|
+
end
|
35
|
+
|
36
|
+
module ClassMethods
|
37
|
+
|
38
|
+
def get_observer ; @@observer ||= [] ; end
|
39
|
+
|
40
|
+
def initial_state( state )
|
41
|
+
after_create { |record| record.state = state }
|
42
|
+
end
|
43
|
+
|
44
|
+
# observe state-changes -> calls given block after change_state
|
45
|
+
def observe( &block )
|
46
|
+
observers << Opensteam::StateMachine::Observer.new( self, &block )
|
47
|
+
end
|
48
|
+
|
49
|
+
# notify association on state-change
|
50
|
+
# calls the observers of the association
|
51
|
+
def notify(assoc)
|
52
|
+
observers << Opensteam::StateMachine::Observer.new( self ) do |record|
|
53
|
+
record.send( assoc ).class.observers.each { |o| o.exc( record.send( assoc ) ) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
def self.included(base)
|
62
|
+
base.extend(ClassMethods)
|
63
|
+
base.class_eval do
|
64
|
+
include InstanceMethods
|
65
|
+
|
66
|
+
# include the history module
|
67
|
+
include Opensteam::History
|
68
|
+
|
69
|
+
@observers = []
|
70
|
+
class << self ; attr_accessor :observers ; end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
class Observer
|
78
|
+
attr_accessor :receiver, :code
|
79
|
+
|
80
|
+
def initialize( receiver, &block )
|
81
|
+
@receiver = receiver
|
82
|
+
@code = block
|
83
|
+
end
|
84
|
+
|
85
|
+
def exc( instance )
|
86
|
+
@code.call( instance )
|
87
|
+
# @code.bind( instance ).call
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
module ClassMethods
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
module InstanceMethods
|
99
|
+
|
100
|
+
|
101
|
+
# returns an array of event-methods for the current state
|
102
|
+
# -> the instance_methods of the current +state_module+
|
103
|
+
def events ; (s = self.state_module ) ? s.instance_methods : [] ; end
|
104
|
+
|
105
|
+
|
106
|
+
# returns the corresponding module for the current state
|
107
|
+
#
|
108
|
+
# ex:
|
109
|
+
# o = Order.create
|
110
|
+
# o.state = :pending
|
111
|
+
# o.state_module # => OrderStates::Pending
|
112
|
+
#
|
113
|
+
def state_module
|
114
|
+
return nil unless state
|
115
|
+
"#{self.class.to_s.demodulize}States::#{self.state.to_s.classify}".constantize rescue nil
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
# overrides state-attribute setter
|
120
|
+
# calls +change_state+
|
121
|
+
def state=(new_state)
|
122
|
+
change_state(new_state)
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
# fire an event for current state
|
129
|
+
#
|
130
|
+
# if self.state is nil, returns false
|
131
|
+
# if +event+ is not defined for current state (not an instance method of +state_module+), an error is raised
|
132
|
+
# if an error occured during the event, an error-entry is saved into the history
|
133
|
+
# calls +change_state+ (return value of the event is used as next-state, if return value is a Symbol or a Module)
|
134
|
+
#
|
135
|
+
def fire_event(event, *args, &block )
|
136
|
+
|
137
|
+
return false unless self.state
|
138
|
+
|
139
|
+
add_history( "trying to fire event '#{event}' for state '#{self.state}'" )
|
140
|
+
|
141
|
+
return false unless event_scope = self.state_module
|
142
|
+
|
143
|
+
unless events.include?( event.to_s )
|
144
|
+
add_history( msg = "Error: event '#{event}' not defined for state '#{self.state}'")
|
145
|
+
raise EventNotDefined, msg
|
146
|
+
return false
|
147
|
+
end
|
148
|
+
|
149
|
+
begin
|
150
|
+
event_return = event_scope.instance_method( event ).bind( self ).call( *args, &block )
|
151
|
+
add_history( "Successfully executed event '#{event}' for state '#{self.state}'" )
|
152
|
+
rescue
|
153
|
+
add_history("Error: An error occured during event '#{event}' in state '#{self.state}' : '#{$!}'")
|
154
|
+
end
|
155
|
+
|
156
|
+
unless event_return == false
|
157
|
+
self.state = event_return if( event_return.is_a?(Symbol) || event_return.is_a?(Module) )
|
158
|
+
return event_return
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
|
164
|
+
# changes state to +new_state+
|
165
|
+
#
|
166
|
+
# if current_state is equal +new_state+, return false
|
167
|
+
#
|
168
|
+
def change_state( new_state )
|
169
|
+
if new_state.is_a?( Module )
|
170
|
+
new_state = new_state.name
|
171
|
+
end
|
172
|
+
|
173
|
+
current_state = state
|
174
|
+
|
175
|
+
add_history "starting transition from state '#{current_state}' to state '#{new_state}'"
|
176
|
+
|
177
|
+
if current_state == new_state
|
178
|
+
add_history "transition failed: current_state '#{current_state}' and new_state '#{new_state}' are the same!"
|
179
|
+
return false
|
180
|
+
end
|
181
|
+
|
182
|
+
write_attribute(:state, new_state.to_s)
|
183
|
+
ret = save
|
184
|
+
|
185
|
+
if ret
|
186
|
+
add_history( "Successfull: transition from state '#{current_state}' to state '#{new_state.to_s}'" )
|
187
|
+
else
|
188
|
+
add_history("Failed: transition from state '#{current_state}' to state '#{new_state.to_s}'")
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
self.execute_observers
|
193
|
+
# self.class.observers.each do |o|
|
194
|
+
# o.exc( self )
|
195
|
+
# end
|
196
|
+
|
197
|
+
ret
|
198
|
+
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
def execute_observers
|
203
|
+
self.class.observers.each do |o|
|
204
|
+
o.exc( self )
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
end
|
212
|
+
|
213
|
+
end
|
214
|
+
|
215
|
+
end
|
216
|
+
|