rfcommerce_core 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 (863) hide show
  1. data/Gemfile +34 -0
  2. data/LICENSE +26 -0
  3. data/README.md +15 -0
  4. data/app/controllers/admin/adjustments_controller.rb +10 -0
  5. data/app/controllers/admin/base_controller.rb +63 -0
  6. data/app/controllers/admin/configurations_controller.rb +2 -0
  7. data/app/controllers/admin/general_settings_controller.rb +22 -0
  8. data/app/controllers/admin/images_controller.rb +49 -0
  9. data/app/controllers/admin/inventory_settings_controller.rb +13 -0
  10. data/app/controllers/admin/inventory_units_controller.rb +2 -0
  11. data/app/controllers/admin/line_items_controller.rb +60 -0
  12. data/app/controllers/admin/mail_methods_controller.rb +8 -0
  13. data/app/controllers/admin/mail_settings_controller.rb +14 -0
  14. data/app/controllers/admin/option_types_controller.rb +65 -0
  15. data/app/controllers/admin/orders_controller.rb +136 -0
  16. data/app/controllers/admin/overview_controller.rb +14 -0
  17. data/app/controllers/admin/payment_methods_controller.rb +43 -0
  18. data/app/controllers/admin/payments_controller.rb +107 -0
  19. data/app/controllers/admin/product_groups_controller.rb +46 -0
  20. data/app/controllers/admin/product_properties_controller.rb +10 -0
  21. data/app/controllers/admin/product_scopes_controller.rb +35 -0
  22. data/app/controllers/admin/products_controller.rb +113 -0
  23. data/app/controllers/admin/products_controller.rb~ +114 -0
  24. data/app/controllers/admin/properties_controller.rb +11 -0
  25. data/app/controllers/admin/prototypes_controller.rb +26 -0
  26. data/app/controllers/admin/reports_controller.rb +50 -0
  27. data/app/controllers/admin/resource_controller.rb +232 -0
  28. data/app/controllers/admin/return_authorizations_controller.rb +17 -0
  29. data/app/controllers/admin/shipments_controller.rb +117 -0
  30. data/app/controllers/admin/shipping_categories_controller.rb +2 -0
  31. data/app/controllers/admin/shipping_methods_controller.rb +14 -0
  32. data/app/controllers/admin/states_controller.rb +25 -0
  33. data/app/controllers/admin/tax_categories_controller.rb +2 -0
  34. data/app/controllers/admin/tax_rates_controller.rb +22 -0
  35. data/app/controllers/admin/tax_settings_controller.rb +13 -0
  36. data/app/controllers/admin/taxonomies_controller.rb +20 -0
  37. data/app/controllers/admin/taxons_controller.rb +161 -0
  38. data/app/controllers/admin/trackers_controller.rb +2 -0
  39. data/app/controllers/admin/users_controller.rb +65 -0
  40. data/app/controllers/admin/variants_controller.rb +51 -0
  41. data/app/controllers/admin/zones_controller.rb +23 -0
  42. data/app/controllers/checkout_controller.rb +97 -0
  43. data/app/controllers/content_controller.rb +21 -0
  44. data/app/controllers/locale_controller.rb +14 -0
  45. data/app/controllers/orders_controller.rb +64 -0
  46. data/app/controllers/products_controller.rb +39 -0
  47. data/app/controllers/spree/base_controller.rb +4 -0
  48. data/app/controllers/states_controller.rb +16 -0
  49. data/app/controllers/taxons_controller.rb +22 -0
  50. data/app/helpers/account_helper.rb +2 -0
  51. data/app/helpers/admin/base_helper.rb +194 -0
  52. data/app/helpers/admin/inventory_settings_helper.rb +5 -0
  53. data/app/helpers/admin/navigation_helper.rb +162 -0
  54. data/app/helpers/admin/orders_helper.rb +22 -0
  55. data/app/helpers/admin/overview_helper.rb +12 -0
  56. data/app/helpers/admin/payments_helper.rb +7 -0
  57. data/app/helpers/admin/product_groups_helper.rb +11 -0
  58. data/app/helpers/admin/product_properties_helper.rb +21 -0
  59. data/app/helpers/admin/products_helper.rb +11 -0
  60. data/app/helpers/admin/taxons_helper.rb +18 -0
  61. data/app/helpers/admin/users_helper.rb +8 -0
  62. data/app/helpers/admin/zones_helper.rb +11 -0
  63. data/app/helpers/checkout_helper.rb +31 -0
  64. data/app/helpers/hook_helper.rb +20 -0
  65. data/app/helpers/orders_helper.rb +3 -0
  66. data/app/helpers/products_helper.rb +30 -0
  67. data/app/helpers/search_helper.rb +10 -0
  68. data/app/helpers/spree/base_helper.rb +119 -0
  69. data/app/helpers/taxons_helper.rb +32 -0
  70. data/app/helpers/trackers_helper.rb +2 -0
  71. data/app/mailers/order_mailer.rb +19 -0
  72. data/app/mailers/shipment_mailer.rb +11 -0
  73. data/app/models/address.rb +115 -0
  74. data/app/models/adjustment.rb +47 -0
  75. data/app/models/app_configuration.rb +44 -0
  76. data/app/models/asset.rb +4 -0
  77. data/app/models/billing_integration.rb +23 -0
  78. data/app/models/calculator.rb +46 -0
  79. data/app/models/calculator/flat_percent_item_total.rb +19 -0
  80. data/app/models/calculator/flat_rate.rb +16 -0
  81. data/app/models/calculator/flexi_rate.rb +32 -0
  82. data/app/models/calculator/per_item.rb +16 -0
  83. data/app/models/calculator/price_bucket.rb +30 -0
  84. data/app/models/calculator/sales_tax.rb +48 -0
  85. data/app/models/calculator/vat.rb +63 -0
  86. data/app/models/configuration.rb +3 -0
  87. data/app/models/country.rb +16 -0
  88. data/app/models/creditcard.rb +267 -0
  89. data/app/models/gateway.rb +48 -0
  90. data/app/models/gateway/authorize_net.rb +19 -0
  91. data/app/models/gateway/authorize_net_cim.rb +132 -0
  92. data/app/models/gateway/beanstream.rb +187 -0
  93. data/app/models/gateway/bogus.rb +80 -0
  94. data/app/models/gateway/braintree.rb +88 -0
  95. data/app/models/gateway/eway.rb +11 -0
  96. data/app/models/gateway/linkpoint.rb +8 -0
  97. data/app/models/gateway/pay_pal.rb +11 -0
  98. data/app/models/gateway/sage_pay.rb +9 -0
  99. data/app/models/image.rb +31 -0
  100. data/app/models/inventory_unit.rb +119 -0
  101. data/app/models/line_item.rb +95 -0
  102. data/app/models/log_entry.rb +3 -0
  103. data/app/models/mail_method.rb +23 -0
  104. data/app/models/option_type.rb +9 -0
  105. data/app/models/option_value.rb +5 -0
  106. data/app/models/order.rb +484 -0
  107. data/app/models/payment.rb +119 -0
  108. data/app/models/payment_method.rb +56 -0
  109. data/app/models/payment_method/check.rb +27 -0
  110. data/app/models/preference.rb +51 -0
  111. data/app/models/product.rb +258 -0
  112. data/app/models/product_group.rb +216 -0
  113. data/app/models/product_option_type.rb +5 -0
  114. data/app/models/product_property.rb +15 -0
  115. data/app/models/product_scope.rb +78 -0
  116. data/app/models/property.rb +18 -0
  117. data/app/models/prototype.rb +5 -0
  118. data/app/models/return_authorization.rb +79 -0
  119. data/app/models/role.rb +3 -0
  120. data/app/models/shipment.rb +157 -0
  121. data/app/models/shipping_category.rb +3 -0
  122. data/app/models/shipping_method.rb +25 -0
  123. data/app/models/spree/alert.rb +13 -0
  124. data/app/models/state.rb +16 -0
  125. data/app/models/state_event.rb +16 -0
  126. data/app/models/tax_category.rb +15 -0
  127. data/app/models/tax_rate.rb +16 -0
  128. data/app/models/taxon.rb +52 -0
  129. data/app/models/taxonomy.rb +20 -0
  130. data/app/models/taxonomy.rb~ +22 -0
  131. data/app/models/tracker.rb +5 -0
  132. data/app/models/user.rb +21 -0
  133. data/app/models/variant.rb +104 -0
  134. data/app/models/zone.rb +84 -0
  135. data/app/models/zone_member.rb +10 -0
  136. data/app/stylesheets/_buttons.less +80 -0
  137. data/app/stylesheets/_cart.less +24 -0
  138. data/app/stylesheets/_checkout.less +76 -0
  139. data/app/stylesheets/_checkout_progress.less +62 -0
  140. data/app/stylesheets/_colors.less +16 -0
  141. data/app/stylesheets/_forms.less +50 -0
  142. data/app/stylesheets/_layout.less +77 -0
  143. data/app/stylesheets/_messages.less +32 -0
  144. data/app/stylesheets/_mixins.less +71 -0
  145. data/app/stylesheets/_navigation.less +130 -0
  146. data/app/stylesheets/_prices.less +18 -0
  147. data/app/stylesheets/_product_details.less +56 -0
  148. data/app/stylesheets/_product_lists.less +66 -0
  149. data/app/stylesheets/_registration.less +24 -0
  150. data/app/stylesheets/_reset.less +69 -0
  151. data/app/stylesheets/_typography.less +158 -0
  152. data/app/stylesheets/screen.less +13 -0
  153. data/app/views/admin/adjustments/_adjustments_table.html.erb +24 -0
  154. data/app/views/admin/adjustments/_form.html.erb +12 -0
  155. data/app/views/admin/adjustments/edit.html.erb +13 -0
  156. data/app/views/admin/adjustments/index.html.erb +4 -0
  157. data/app/views/admin/adjustments/new.html.erb +14 -0
  158. data/app/views/admin/configurations/index.html.erb +66 -0
  159. data/app/views/admin/extensions/index.html.erb +23 -0
  160. data/app/views/admin/general_settings/edit.html.erb +46 -0
  161. data/app/views/admin/general_settings/show.html.erb +36 -0
  162. data/app/views/admin/images/_form.html.erb +16 -0
  163. data/app/views/admin/images/edit.html.erb +19 -0
  164. data/app/views/admin/images/index.html.erb +69 -0
  165. data/app/views/admin/images/new.html.erb +22 -0
  166. data/app/views/admin/images/new.html.erb~ +22 -0
  167. data/app/views/admin/inventory_settings/edit.html.erb +27 -0
  168. data/app/views/admin/inventory_settings/show.html.erb +9 -0
  169. data/app/views/admin/inventory_units/adjust.html.erb +33 -0
  170. data/app/views/admin/mail_methods/_form.html.erb +96 -0
  171. data/app/views/admin/mail_methods/edit.html.erb +9 -0
  172. data/app/views/admin/mail_methods/index.html.erb +41 -0
  173. data/app/views/admin/mail_methods/new.html.erb +9 -0
  174. data/app/views/admin/option_types/_available.html.erb +27 -0
  175. data/app/views/admin/option_types/_form.html.erb +11 -0
  176. data/app/views/admin/option_types/_option_value_fields.html.erb +5 -0
  177. data/app/views/admin/option_types/_selected.html.erb +26 -0
  178. data/app/views/admin/option_types/available.js.erb +2 -0
  179. data/app/views/admin/option_types/edit.html.erb +32 -0
  180. data/app/views/admin/option_types/index.html.erb +33 -0
  181. data/app/views/admin/option_types/new.erb +11 -0
  182. data/app/views/admin/option_types/select.js.erb +3 -0
  183. data/app/views/admin/option_types/selected.html.erb +6 -0
  184. data/app/views/admin/orders/_add_product.html.erb +20 -0
  185. data/app/views/admin/orders/_form.html.erb +67 -0
  186. data/app/views/admin/orders/_line_item.html.erb +17 -0
  187. data/app/views/admin/orders/_user_form.html.erb +42 -0
  188. data/app/views/admin/orders/edit.html.erb +31 -0
  189. data/app/views/admin/orders/history.html.erb +29 -0
  190. data/app/views/admin/orders/index.html.erb +103 -0
  191. data/app/views/admin/orders/new.html.erb +20 -0
  192. data/app/views/admin/orders/show.html.erb +28 -0
  193. data/app/views/admin/orders/user.html.erb +24 -0
  194. data/app/views/admin/payment_methods/_form.html.erb +50 -0
  195. data/app/views/admin/payment_methods/edit.html.erb +10 -0
  196. data/app/views/admin/payment_methods/index.html.erb +49 -0
  197. data/app/views/admin/payment_methods/new.html.erb +11 -0
  198. data/app/views/admin/payments/_bill_address_form.html.erb +9 -0
  199. data/app/views/admin/payments/_form.html.erb +15 -0
  200. data/app/views/admin/payments/_list.html.erb +22 -0
  201. data/app/views/admin/payments/_transaction_list.html.erb +24 -0
  202. data/app/views/admin/payments/credit.html.erb +14 -0
  203. data/app/views/admin/payments/index.html.erb +22 -0
  204. data/app/views/admin/payments/new.html.erb +19 -0
  205. data/app/views/admin/payments/show.html.erb +10 -0
  206. data/app/views/admin/payments/source_forms/_check.html.erb +0 -0
  207. data/app/views/admin/payments/source_forms/_gateway.html.erb +43 -0
  208. data/app/views/admin/payments/source_views/_check.html.erb +0 -0
  209. data/app/views/admin/payments/source_views/_gateway.html.erb +34 -0
  210. data/app/views/admin/product_groups/_preview.html.erb +34 -0
  211. data/app/views/admin/product_groups/_product_scope.html.erb +24 -0
  212. data/app/views/admin/product_groups/edit.html.erb +56 -0
  213. data/app/views/admin/product_groups/index.html.erb +37 -0
  214. data/app/views/admin/product_groups/new.html.erb +12 -0
  215. data/app/views/admin/product_groups/show.html.erb +32 -0
  216. data/app/views/admin/product_groups/update.js.erb +8 -0
  217. data/app/views/admin/product_properties/_product_property_fields.html.erb +11 -0
  218. data/app/views/admin/product_properties/index.html.erb +55 -0
  219. data/app/views/admin/product_scopes/_form.html.erb +106 -0
  220. data/app/views/admin/product_scopes/create.js.erb +3 -0
  221. data/app/views/admin/product_scopes/destroy.js.erb +3 -0
  222. data/app/views/admin/product_scopes/new.html.erb +1 -0
  223. data/app/views/admin/products/_form.html.erb +112 -0
  224. data/app/views/admin/products/_option_types.html.erb +40 -0
  225. data/app/views/admin/products/_properties_form.erb +7 -0
  226. data/app/views/admin/products/edit.html.erb +10 -0
  227. data/app/views/admin/products/edit.html.erb~ +10 -0
  228. data/app/views/admin/products/index.html.erb +81 -0
  229. data/app/views/admin/products/index.html.erb~ +81 -0
  230. data/app/views/admin/products/new.erb +58 -0
  231. data/app/views/admin/products/new.erb~ +53 -0
  232. data/app/views/admin/products/show.html.erb +4 -0
  233. data/app/views/admin/products/show.html.erb~ +4 -0
  234. data/app/views/admin/properties/_form.html.erb +12 -0
  235. data/app/views/admin/properties/edit.html.erb +10 -0
  236. data/app/views/admin/properties/filtered.html.erb +1 -0
  237. data/app/views/admin/properties/index.html.erb +40 -0
  238. data/app/views/admin/properties/new.erb +11 -0
  239. data/app/views/admin/prototypes/_form.html.erb +44 -0
  240. data/app/views/admin/prototypes/available.html.erb +22 -0
  241. data/app/views/admin/prototypes/edit.html.erb +9 -0
  242. data/app/views/admin/prototypes/index.html.erb +37 -0
  243. data/app/views/admin/prototypes/new.erb +11 -0
  244. data/app/views/admin/prototypes/select.js.erb +4 -0
  245. data/app/views/admin/reports/index.html.erb +19 -0
  246. data/app/views/admin/reports/sales_total.html.erb +23 -0
  247. data/app/views/admin/return_authorizations/_form.html.erb +78 -0
  248. data/app/views/admin/return_authorizations/edit.html.erb +27 -0
  249. data/app/views/admin/return_authorizations/index.html.erb +45 -0
  250. data/app/views/admin/return_authorizations/new.html.erb +13 -0
  251. data/app/views/admin/shared/_additional_field.html.erb +5 -0
  252. data/app/views/admin/shared/_address.html.erb +5 -0
  253. data/app/views/admin/shared/_address_form.html.erb +79 -0
  254. data/app/views/admin/shared/_alert.html.erb +6 -0
  255. data/app/views/admin/shared/_calculator_fields.html.erb +19 -0
  256. data/app/views/admin/shared/_configuration_menu.html.erb +22 -0
  257. data/app/views/admin/shared/_destroy.js.erb +16 -0
  258. data/app/views/admin/shared/_edit_resource_links.html.erb +4 -0
  259. data/app/views/admin/shared/_group_from_products_form.html.erb +12 -0
  260. data/app/views/admin/shared/_new_adjustment_button.html.erb +8 -0
  261. data/app/views/admin/shared/_new_resource_links.html.erb +4 -0
  262. data/app/views/admin/shared/_order_details.html.erb +3 -0
  263. data/app/views/admin/shared/_order_sub_menu.html.erb +0 -0
  264. data/app/views/admin/shared/_order_tabs.html.erb +64 -0
  265. data/app/views/admin/shared/_product_sub_menu.html.erb +11 -0
  266. data/app/views/admin/shared/_product_tabs.html.erb +34 -0
  267. data/app/views/admin/shared/_report_criteria.html.erb +15 -0
  268. data/app/views/admin/shared/_show_resource_links.html.erb +5 -0
  269. data/app/views/admin/shared/_tabs.html.erb +6 -0
  270. data/app/views/admin/shared/_update_order_state.js +6 -0
  271. data/app/views/admin/shipments/_form.html.erb +77 -0
  272. data/app/views/admin/shipments/edit.html.erb +40 -0
  273. data/app/views/admin/shipments/index.html.erb +47 -0
  274. data/app/views/admin/shipments/new.html.erb +18 -0
  275. data/app/views/admin/shipping_categories/_form.html.erb +6 -0
  276. data/app/views/admin/shipping_categories/edit.html.erb +6 -0
  277. data/app/views/admin/shipping_categories/index.html.erb +29 -0
  278. data/app/views/admin/shipping_categories/new.html.erb +8 -0
  279. data/app/views/admin/shipping_methods/_form.html.erb +26 -0
  280. data/app/views/admin/shipping_methods/edit.html.erb +16 -0
  281. data/app/views/admin/shipping_methods/index.html.erb +49 -0
  282. data/app/views/admin/shipping_methods/new.html.erb +17 -0
  283. data/app/views/admin/states/_form.html.erb +9 -0
  284. data/app/views/admin/states/_state_list.html.erb +34 -0
  285. data/app/views/admin/states/edit.html.erb +10 -0
  286. data/app/views/admin/states/index.html.erb +16 -0
  287. data/app/views/admin/states/new.erb +8 -0
  288. data/app/views/admin/tax_categories/_form.html.erb +12 -0
  289. data/app/views/admin/tax_categories/edit.html.erb +10 -0
  290. data/app/views/admin/tax_categories/index.html.erb +44 -0
  291. data/app/views/admin/tax_categories/new.html.erb +10 -0
  292. data/app/views/admin/tax_categories/show.html.erb +1 -0
  293. data/app/views/admin/tax_rates/_form.html.erb +16 -0
  294. data/app/views/admin/tax_rates/edit.html.erb +6 -0
  295. data/app/views/admin/tax_rates/index.html.erb +34 -0
  296. data/app/views/admin/tax_rates/new.html.erb +8 -0
  297. data/app/views/admin/tax_settings/edit.html.erb +17 -0
  298. data/app/views/admin/tax_settings/show.html.erb +14 -0
  299. data/app/views/admin/taxonomies/_form.html.erb +10 -0
  300. data/app/views/admin/taxonomies/_form.html.erb~ +11 -0
  301. data/app/views/admin/taxonomies/_js_head.html.erb +9 -0
  302. data/app/views/admin/taxonomies/_list.html.erb +19 -0
  303. data/app/views/admin/taxonomies/_list.html.erb~ +20 -0
  304. data/app/views/admin/taxonomies/_taxon.html.erb +12 -0
  305. data/app/views/admin/taxonomies/edit.erb +49 -0
  306. data/app/views/admin/taxonomies/get_children.json.erb +9 -0
  307. data/app/views/admin/taxonomies/index.html.erb +16 -0
  308. data/app/views/admin/taxonomies/new.html.erb +12 -0
  309. data/app/views/admin/taxons/_form.html.erb +23 -0
  310. data/app/views/admin/taxons/_taxon_table.html.erb +23 -0
  311. data/app/views/admin/taxons/available.js.erb +33 -0
  312. data/app/views/admin/taxons/edit.html.erb +11 -0
  313. data/app/views/admin/taxons/remove.html.erb +1 -0
  314. data/app/views/admin/taxons/select.js.erb +2 -0
  315. data/app/views/admin/taxons/selected.html.erb +43 -0
  316. data/app/views/admin/trackers/_form.html.erb +26 -0
  317. data/app/views/admin/trackers/edit.html.erb +8 -0
  318. data/app/views/admin/trackers/index.html.erb +41 -0
  319. data/app/views/admin/trackers/new.html.erb +9 -0
  320. data/app/views/admin/users/_form.html.erb +35 -0
  321. data/app/views/admin/users/edit.html.erb +14 -0
  322. data/app/views/admin/users/index.html.erb +63 -0
  323. data/app/views/admin/users/new.html.erb +14 -0
  324. data/app/views/admin/users/show.html.erb +21 -0
  325. data/app/views/admin/variants/_form.html.erb +40 -0
  326. data/app/views/admin/variants/edit.html.erb +13 -0
  327. data/app/views/admin/variants/index.html.erb +66 -0
  328. data/app/views/admin/variants/new.erb +11 -0
  329. data/app/views/admin/zones/_country_member.html.erb +5 -0
  330. data/app/views/admin/zones/_form.html.erb +29 -0
  331. data/app/views/admin/zones/_member_type.html.erb +15 -0
  332. data/app/views/admin/zones/_state_member.html.erb +5 -0
  333. data/app/views/admin/zones/_zone_member.html.erb +5 -0
  334. data/app/views/admin/zones/edit.html.erb +10 -0
  335. data/app/views/admin/zones/index.html.erb +41 -0
  336. data/app/views/admin/zones/new.html.erb +10 -0
  337. data/app/views/checkout/_address.html.erb +163 -0
  338. data/app/views/checkout/_confirm.html.erb +11 -0
  339. data/app/views/checkout/_delivery.html.erb +25 -0
  340. data/app/views/checkout/_payment.html.erb +30 -0
  341. data/app/views/checkout/_summary.html.erb +21 -0
  342. data/app/views/checkout/edit.html.erb +20 -0
  343. data/app/views/checkout/payment/_check.html.erb +0 -0
  344. data/app/views/checkout/payment/_gateway.html.erb +31 -0
  345. data/app/views/checkout/registration.html.erb +20 -0
  346. data/app/views/content/cvv.html.erb +13 -0
  347. data/app/views/layouts/admin.html.erb +75 -0
  348. data/app/views/layouts/spree_application.html.erb +52 -0
  349. data/app/views/order_mailer/cancel_email.text.erb +16 -0
  350. data/app/views/order_mailer/confirm_email.text.erb +19 -0
  351. data/app/views/orders/_form.html.erb +19 -0
  352. data/app/views/orders/_line_item.html.erb +41 -0
  353. data/app/views/orders/edit.html.erb +41 -0
  354. data/app/views/orders/new.html.erb +9 -0
  355. data/app/views/orders/show.html.erb +14 -0
  356. data/app/views/products/_cart_form.html.erb +54 -0
  357. data/app/views/products/_cart_form.html.erb~ +54 -0
  358. data/app/views/products/_image.html.erb +5 -0
  359. data/app/views/products/_image.html.erb~ +5 -0
  360. data/app/views/products/_properties.html.erb +8 -0
  361. data/app/views/products/_taxons.html.erb +16 -0
  362. data/app/views/products/_thumbnails.html.erb +40 -0
  363. data/app/views/products/index.html.erb +37 -0
  364. data/app/views/products/show.html.erb +31 -0
  365. data/app/views/shared/_additional_field.html.erb +7 -0
  366. data/app/views/shared/_admin_head.html.erb +34 -0
  367. data/app/views/shared/_basic_layout.html.erb +44 -0
  368. data/app/views/shared/_edit_resource_links.html.erb +1 -0
  369. data/app/views/shared/_end_soon.html.erb +43 -0
  370. data/app/views/shared/_error_messages.html.erb +11 -0
  371. data/app/views/shared/_filters.html.erb +27 -0
  372. data/app/views/shared/_footer.html.erb +13 -0
  373. data/app/views/shared/_google_analytics.html.erb +40 -0
  374. data/app/views/shared/_head.html.erb +10 -0
  375. data/app/views/shared/_method_error_message.html.erb +4 -0
  376. data/app/views/shared/_nav_bar.html.erb +5 -0
  377. data/app/views/shared/_new_release.html.erb +42 -0
  378. data/app/views/shared/_new_resource_links.html.erb +1 -0
  379. data/app/views/shared/_order_details.html.erb +50 -0
  380. data/app/views/shared/_products.html.erb +42 -0
  381. data/app/views/shared/_search.html.erb +9 -0
  382. data/app/views/shared/_show_resource_links.html.erb +3 -0
  383. data/app/views/shared/_store_menu.html.erb +3 -0
  384. data/app/views/shared/_taxonomies.html.erb +19 -0
  385. data/app/views/shared/_test_hook.html.erb +1 -0
  386. data/app/views/shared/_upcoming_products.html.erb +42 -0
  387. data/app/views/shipment_mailer/shipped_email.text.erb +15 -0
  388. data/app/views/states/index.js.erb +1 -0
  389. data/app/views/taxons/_taxon.html.erb +4 -0
  390. data/app/views/taxons/show.html.erb +19 -0
  391. data/config/cucumber.yml +10 -0
  392. data/config/initializers/form_builder.rb +19 -0
  393. data/config/initializers/load_unobtrusive_date_picker.rb +8 -0
  394. data/config/initializers/spree.rb +29 -0
  395. data/config/initializers/workarounds_for_ruby19.rb +72 -0
  396. data/config/locales/en.yml +1015 -0
  397. data/config/routes.rb +207 -0
  398. data/db/default/countries.yml +1583 -0
  399. data/db/default/roles.yml +7 -0
  400. data/db/default/states.yml +256 -0
  401. data/db/default/zone_members.yml +169 -0
  402. data/db/default/zones.yml +13 -0
  403. data/db/migrate/20090823005402_spree_zero_nine_zero.rb +442 -0
  404. data/db/migrate/20090904192342_create_indexes_for_inventory_units.rb +12 -0
  405. data/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb +36 -0
  406. data/db/migrate/20091007134354_change_taxons_to_nested_set.rb +40 -0
  407. data/db/migrate/20091008091614_move_to_configurable_gateways.rb +55 -0
  408. data/db/migrate/20091012120519_product_groups_and_scopes.rb +25 -0
  409. data/db/migrate/20091015110842_add_open_id_authentication_tables.rb +20 -0
  410. data/db/migrate/20091015153048_add_openid_field_to_users.rb +19 -0
  411. data/db/migrate/20091016174634_change_preference_value_type.rb +10 -0
  412. data/db/migrate/20091017175558_create_billing_integrations.rb +16 -0
  413. data/db/migrate/20091021133257_charge_refactoring.rb +35 -0
  414. data/db/migrate/20091104151730_add_some_indexes.rb +21 -0
  415. data/db/migrate/20091126190904_checkout_state_machine.rb +13 -0
  416. data/db/migrate/20091209153045_state_for_shipments.rb +9 -0
  417. data/db/migrate/20091209202200_make_state_events_polymorphic.rb +12 -0
  418. data/db/migrate/20091211203813_ship_address_id_for_checkouts.rb +9 -0
  419. data/db/migrate/20091212161118_shipping_method_id_for_checkouts.rb +9 -0
  420. data/db/migrate/20091213222815_creditcard_last_four_digits.rb +19 -0
  421. data/db/migrate/20091214183826_populate_legacy_shipment_state.rb +19 -0
  422. data/db/migrate/20100105090147_add_cost_price.rb +9 -0
  423. data/db/migrate/20100105132138_shipment_id_for_inventory_units.rb +21 -0
  424. data/db/migrate/20100111205525_cim_fields_for_creditcards.rb +11 -0
  425. data/db/migrate/20100112151511_create_return_authorizations.rb +16 -0
  426. data/db/migrate/20100113090919_add_return_authorization_to_inventory_units.rb +9 -0
  427. data/db/migrate/20100113203104_create_trackers.rb +14 -0
  428. data/db/migrate/20100121160010_creditcard_id_for_creditcard_txns.rb +9 -0
  429. data/db/migrate/20100121183934_original_creditcard_txn_id_for_creditcard_txns.rb +9 -0
  430. data/db/migrate/20100125145351_add_test_mode_to_billing_integration.rb +11 -0
  431. data/db/migrate/20100126103714_create_products_product_groups.rb +12 -0
  432. data/db/migrate/20100209025806_create_payment_methods.rb +20 -0
  433. data/db/migrate/20100209144531_polymorphic_payments.rb +29 -0
  434. data/db/migrate/20100213103131_change_payments_payment_method_to_belongs_to.rb +11 -0
  435. data/db/migrate/20100214212536_assign_creditcard_txns_to_payment.rb +16 -0
  436. data/db/migrate/20100223170312_sti_for_transactions.rb +14 -0
  437. data/db/migrate/20100223183812_drop_billing_integrations.rb +16 -0
  438. data/db/migrate/20100224153127_deleted_at_for_payment_methods.rb +13 -0
  439. data/db/migrate/20100301163454_add_adjustments_index.rb +10 -0
  440. data/db/migrate/20100306153445_fix_by_popularity.rb +8 -0
  441. data/db/migrate/20100317120946_add_alt_text_to_images.rb +9 -0
  442. data/db/migrate/20100427121301_add_display_to_payment_methods.rb +9 -0
  443. data/db/migrate/20100504142133_add_addresses_checkouts_indexes.rb +16 -0
  444. data/db/migrate/20100506180619_add_icon_to_taxons.rb +18 -0
  445. data/db/migrate/20100506185838_add_description_to_taxons.rb +11 -0
  446. data/db/migrate/20100528155333_index_for_shipments_number.rb +9 -0
  447. data/db/migrate/20100528185820_add_index_on_users_persistence_token.rb +9 -0
  448. data/db/migrate/20100605152042_add_default_to_tax_categories.rb +9 -0
  449. data/db/migrate/20100624110730_add_display_to_shipping_methods.rb +9 -0
  450. data/db/migrate/20100624123336_rename_payment_method_display.rb +9 -0
  451. data/db/migrate/20100624175547_rename_preferences_field.rb +8 -0
  452. data/db/migrate/20100811163637_add_guest_flag.rb +13 -0
  453. data/db/migrate/20100811205836_drop_order_token.rb +11 -0
  454. data/db/migrate/20100812162326_payments_state_and_assigned_to_order_only.rb +11 -0
  455. data/db/migrate/20100813023502_create_address_keys_for_order.rb +15 -0
  456. data/db/migrate/20100813185745_payment_total_for_orders.rb +9 -0
  457. data/db/migrate/20100816212146_shipping_method_id_for_orders.rb +9 -0
  458. data/db/migrate/20100817152723_add_shipment_and_payment_state.rb +15 -0
  459. data/db/migrate/20100819170125_refactor_adjustments.rb +19 -0
  460. data/db/migrate/20100820135707_response_code_and_avs_response_for_payments.rb +11 -0
  461. data/db/migrate/20100901171814_change_guest_flag_to_anonymous.rb +13 -0
  462. data/db/migrate/20100903203949_email_for_orders.rb +9 -0
  463. data/db/migrate/20100923162011_create_mail_methods.rb +12 -0
  464. data/db/migrate/20100929151905_rename_frozen_to_locked.rb +8 -0
  465. data/db/migrate/20101008190536_move_special_instructions_to_orders.rb +11 -0
  466. data/db/migrate/20101026184700_create_log_entries.rb +15 -0
  467. data/db/migrate/20101026184714_migrate_transactions_to_payment_state.rb +94 -0
  468. data/db/migrate/20101026184746_delete_in_progress_orders.rb +18 -0
  469. data/db/migrate/20101026184808_migrate_checkout_to_orders.rb +27 -0
  470. data/db/migrate/20101026184833_migrate_adjustments.rb +9 -0
  471. data/db/migrate/20101026184855_remove_shipped_state.rb +14 -0
  472. data/db/migrate/20101026184916_prevent_nil_payment_total.rb +8 -0
  473. data/db/migrate/20101026184932_prevent_nil_email.rb +9 -0
  474. data/db/migrate/20101026184959_generate_anonymous_users.rb +14 -0
  475. data/db/migrate/20101026185022_update_order_state.rb +8 -0
  476. data/db/migrate/20101026192225_cleanup_legacy_tables.rb +11 -0
  477. data/db/migrate/20101028151745_remove_number_and_cvv_from_credicard.rb +9 -0
  478. data/db/migrate/20101103212716_drop_anonymous_field_for_user.rb +8 -0
  479. data/db/migrate/20101111133551_renamed_rma_cancelled_state.rb +10 -0
  480. data/db/migrate/20101117031806_fix_problematic_index_names.rb +13 -0
  481. data/db/migrate/20101223215658_add_position_to_variants.rb +9 -0
  482. data/db/migrate/20110110130847_add_next_state_to_state_events.rb +9 -0
  483. data/db/migrate/20110111122537_add_position_to_option_types.rb +9 -0
  484. data/db/migrate/20110314192118_remove_trailing_slashes_in_taxon_permalinks.rb +17 -0
  485. data/db/sample/users.rb +61 -0
  486. data/db/seeds.rb +3 -0
  487. data/lib/custom_fixtures.rb +7 -0
  488. data/lib/generators/spree_core/upgrade_generator.rb +23 -0
  489. data/lib/generators/templates/config/initializers/%file_name%.rb.tt +1 -0
  490. data/lib/generators/templates/config/locales/%current_locale%.yml.tt +2 -0
  491. data/lib/generators/templates/config/routes.rb +3 -0
  492. data/lib/middleware/seo_assist.rb +44 -0
  493. data/lib/product_filters.rb +179 -0
  494. data/lib/redirect_legacy_product_url.rb +13 -0
  495. data/lib/scopes.rb +69 -0
  496. data/lib/scopes/dynamic.rb +31 -0
  497. data/lib/scopes/product.rb +266 -0
  498. data/lib/scopes/variant.rb +18 -0
  499. data/lib/spree/calculated_adjustments.rb +69 -0
  500. data/lib/spree/config.rb +33 -0
  501. data/lib/spree/current_order.rb +30 -0
  502. data/lib/spree/file_utilz.rb +73 -0
  503. data/lib/spree/gateway_error.rb +3 -0
  504. data/lib/spree/mail_interceptor.rb +23 -0
  505. data/lib/spree/mail_settings.rb +33 -0
  506. data/lib/spree/preference_access.rb +27 -0
  507. data/lib/spree/search/base.rb +64 -0
  508. data/lib/spree_base.rb +116 -0
  509. data/lib/spree_core.rb +94 -0
  510. data/lib/spree_core/action_callbacks.rb +26 -0
  511. data/lib/spree_core/authorize_net_cim_hack.rb +871 -0
  512. data/lib/spree_core/delegate_belongs_to.rb +89 -0
  513. data/lib/spree_core/enumerable_constants.rb +209 -0
  514. data/lib/spree_core/ext/active_record.rb +15 -0
  515. data/lib/spree_core/ext/array.rb +14 -0
  516. data/lib/spree_core/ext/hash.rb +75 -0
  517. data/lib/spree_core/ext/string.rb +10 -0
  518. data/lib/spree_core/preferences/model_hooks.rb +293 -0
  519. data/lib/spree_core/preferences/preference_definition.rb +53 -0
  520. data/lib/spree_core/railtie.rb +63 -0
  521. data/lib/spree_core/spree_custom_responder.rb +29 -0
  522. data/lib/spree_core/spree_respond_with.rb +57 -0
  523. data/lib/spree_core/ssl_requirement.rb +104 -0
  524. data/lib/spree_core/testing_support/factories.rb +13 -0
  525. data/lib/spree_core/testing_support/factories/address_factory.rb +20 -0
  526. data/lib/spree_core/testing_support/factories/adjustment_factory.rb +6 -0
  527. data/lib/spree_core/testing_support/factories/calculator_factory.rb +5 -0
  528. data/lib/spree_core/testing_support/factories/configuraion_factory.rb +4 -0
  529. data/lib/spree_core/testing_support/factories/country_factory.rb +7 -0
  530. data/lib/spree_core/testing_support/factories/creditcard_factory.rb +11 -0
  531. data/lib/spree_core/testing_support/factories/inventory_unit_factory.rb +7 -0
  532. data/lib/spree_core/testing_support/factories/line_item_factory.rb +8 -0
  533. data/lib/spree_core/testing_support/factories/mail_method_factory.rb +4 -0
  534. data/lib/spree_core/testing_support/factories/options_factory.rb +10 -0
  535. data/lib/spree_core/testing_support/factories/order_factory.rb +18 -0
  536. data/lib/spree_core/testing_support/factories/payment_factory.rb +26 -0
  537. data/lib/spree_core/testing_support/factories/payment_method_factory.rb +17 -0
  538. data/lib/spree_core/testing_support/factories/product_factory.rb +16 -0
  539. data/lib/spree_core/testing_support/factories/product_group_factory.rb +3 -0
  540. data/lib/spree_core/testing_support/factories/product_option_type_factory.rb +4 -0
  541. data/lib/spree_core/testing_support/factories/product_property_factory.rb +4 -0
  542. data/lib/spree_core/testing_support/factories/product_scope_factory.rb +6 -0
  543. data/lib/spree_core/testing_support/factories/property_factory.rb +4 -0
  544. data/lib/spree_core/testing_support/factories/prototype_factory.rb +4 -0
  545. data/lib/spree_core/testing_support/factories/return_authorization_factory.rb +8 -0
  546. data/lib/spree_core/testing_support/factories/role_factory.rb +9 -0
  547. data/lib/spree_core/testing_support/factories/shipment_factory.rb +9 -0
  548. data/lib/spree_core/testing_support/factories/shipping_category_factory.rb +5 -0
  549. data/lib/spree_core/testing_support/factories/shipping_method_factory.rb +11 -0
  550. data/lib/spree_core/testing_support/factories/state_factory.rb +11 -0
  551. data/lib/spree_core/testing_support/factories/tax_category_factory.rb +8 -0
  552. data/lib/spree_core/testing_support/factories/tax_rate_factory.rb +5 -0
  553. data/lib/spree_core/testing_support/factories/taxon_factory.rb +5 -0
  554. data/lib/spree_core/testing_support/factories/taxonomy_factory.rb +3 -0
  555. data/lib/spree_core/testing_support/factories/tracker_factory.rb +5 -0
  556. data/lib/spree_core/testing_support/factories/user_factory.rb +15 -0
  557. data/lib/spree_core/testing_support/factories/variant_factory.rb +14 -0
  558. data/lib/spree_core/testing_support/factories/zone_factory.rb +18 -0
  559. data/lib/spree_core/theme_support.rb +4 -0
  560. data/lib/spree_core/theme_support/hook.rb +51 -0
  561. data/lib/spree_core/theme_support/hook_listener.rb +68 -0
  562. data/lib/spree_core/theme_support/hook_modifier.rb +35 -0
  563. data/lib/spree_core/theme_support/more_patches.rb +118 -0
  564. data/lib/spree_core/version.rb +5 -0
  565. data/lib/store_helpers.rb +10 -0
  566. data/lib/tasks/common.rb +30 -0
  567. data/lib/tasks/core.rake +105 -0
  568. data/lib/tasks/install.rake +26 -0
  569. data/lib/tasks/rake_util.rb +19 -0
  570. data/lib/tasks/taxon.rake +14 -0
  571. data/lib/tasks/themes.rake +34 -0
  572. data/public/images/add-to-cart.png +0 -0
  573. data/public/images/admin/bg/active-tab.png +0 -0
  574. data/public/images/admin/bg/admin_tab_back.png +0 -0
  575. data/public/images/admin/bg/admin_tab_selected_back.png +0 -0
  576. data/public/images/admin/bg/content-back-blue.png +0 -0
  577. data/public/images/admin/bg/content-back-green.png +0 -0
  578. data/public/images/admin/bg/content-back.png +0 -0
  579. data/public/images/admin/bg/flash-error.png +0 -0
  580. data/public/images/admin/bg/flash-notice.png +0 -0
  581. data/public/images/admin/bg/green-stripes.gif +0 -0
  582. data/public/images/admin/bg/green-stripes.png +0 -0
  583. data/public/images/admin/bg/grid_header_back.png +0 -0
  584. data/public/images/admin/bg/grid_header_back_green.png +0 -0
  585. data/public/images/admin/bg/header-bg.png +0 -0
  586. data/public/images/admin/bg/header.png +0 -0
  587. data/public/images/admin/bg/header_bg.jpg +0 -0
  588. data/public/images/admin/bg/menu-current.png +0 -0
  589. data/public/images/admin/bg/red-stripes.gif +0 -0
  590. data/public/images/admin/bg/red-stripes.png +0 -0
  591. data/public/images/admin/bg/spree_50.png +0 -0
  592. data/public/images/admin/bg/subnav-divider.png +0 -0
  593. data/public/images/admin/bg/subnav.png +0 -0
  594. data/public/images/admin/bg/tab-back.png +0 -0
  595. data/public/images/admin/buttons/blue/left_01.png +0 -0
  596. data/public/images/admin/buttons/blue/right_01.png +0 -0
  597. data/public/images/admin/buttons/drag-handle-green.png +0 -0
  598. data/public/images/admin/buttons/green/left_01.png +0 -0
  599. data/public/images/admin/buttons/green/right_01.png +0 -0
  600. data/public/images/admin/buttons/left_01.png +0 -0
  601. data/public/images/admin/buttons/left_01_small.png +0 -0
  602. data/public/images/admin/buttons/orange/left_03.png +0 -0
  603. data/public/images/admin/buttons/orange/right_03.png +0 -0
  604. data/public/images/admin/buttons/right_01.png +0 -0
  605. data/public/images/admin/buttons/right_01_small.png +0 -0
  606. data/public/images/admin/icons/16x16/1.png +0 -0
  607. data/public/images/admin/icons/16x16/10.png +0 -0
  608. data/public/images/admin/icons/16x16/2.png +0 -0
  609. data/public/images/admin/icons/16x16/3.png +0 -0
  610. data/public/images/admin/icons/16x16/4.png +0 -0
  611. data/public/images/admin/icons/16x16/5.png +0 -0
  612. data/public/images/admin/icons/16x16/6.png +0 -0
  613. data/public/images/admin/icons/16x16/7.png +0 -0
  614. data/public/images/admin/icons/16x16/8.png +0 -0
  615. data/public/images/admin/icons/16x16/9.png +0 -0
  616. data/public/images/admin/icons/32x32/1.png +0 -0
  617. data/public/images/admin/icons/32x32/10.png +0 -0
  618. data/public/images/admin/icons/32x32/11.png +0 -0
  619. data/public/images/admin/icons/32x32/2.png +0 -0
  620. data/public/images/admin/icons/32x32/3.png +0 -0
  621. data/public/images/admin/icons/32x32/4.png +0 -0
  622. data/public/images/admin/icons/32x32/5.png +0 -0
  623. data/public/images/admin/icons/32x32/6.png +0 -0
  624. data/public/images/admin/icons/32x32/7.png +0 -0
  625. data/public/images/admin/icons/32x32/8.png +0 -0
  626. data/public/images/admin/icons/32x32/9.png +0 -0
  627. data/public/images/admin/icons/accept.png +0 -0
  628. data/public/images/admin/icons/add.gif +0 -0
  629. data/public/images/admin/icons/add.png +0 -0
  630. data/public/images/admin/icons/arrow-down.gif +0 -0
  631. data/public/images/admin/icons/cross.png +0 -0
  632. data/public/images/admin/icons/delete.gif +0 -0
  633. data/public/images/admin/icons/delete.png +0 -0
  634. data/public/images/admin/icons/drag.gif +0 -0
  635. data/public/images/admin/icons/edit.gif +0 -0
  636. data/public/images/admin/icons/edit.png +0 -0
  637. data/public/images/admin/icons/email.png +0 -0
  638. data/public/images/admin/icons/error.png +0 -0
  639. data/public/images/admin/icons/exclamation.png +0 -0
  640. data/public/images/admin/icons/feed.png +0 -0
  641. data/public/images/admin/icons/pdf.png +0 -0
  642. data/public/images/admin/icons/reorder.gif +0 -0
  643. data/public/images/admin/icons/search.gif +0 -0
  644. data/public/images/admin/icons/send-email.png +0 -0
  645. data/public/images/admin/icons/stop.png +0 -0
  646. data/public/images/admin/icons/tick.png +0 -0
  647. data/public/images/admin/icons/up.gif +0 -0
  648. data/public/images/admin/icons/xls.png +0 -0
  649. data/public/images/admin/tabs/off-left.png +0 -0
  650. data/public/images/admin/tabs/off-right.png +0 -0
  651. data/public/images/admin/tabs/on-left.png +0 -0
  652. data/public/images/admin/tabs/on-right.png +0 -0
  653. data/public/images/ajax_loader.gif +0 -0
  654. data/public/images/amex_cid.gif +0 -0
  655. data/public/images/bg-button-hover.png +0 -0
  656. data/public/images/bg-button-pressed.png +0 -0
  657. data/public/images/bg-button.gif +0 -0
  658. data/public/images/bg-button.png +0 -0
  659. data/public/images/blue/left_01.png +0 -0
  660. data/public/images/blue/right_01.png +0 -0
  661. data/public/images/body-back.png +0 -0
  662. data/public/images/bottom_shine.png +0 -0
  663. data/public/images/breadcrumb.gif +0 -0
  664. data/public/images/button-dark-hover.png +0 -0
  665. data/public/images/button-dark.png +0 -0
  666. data/public/images/buttons/bg-button-hover.png +0 -0
  667. data/public/images/buttons/bg-button-pressed.png +0 -0
  668. data/public/images/buttons/bg-button.gif +0 -0
  669. data/public/images/buttons/bg-button.png +0 -0
  670. data/public/images/buttons/blue/left_01.png +0 -0
  671. data/public/images/buttons/blue/right_01.png +0 -0
  672. data/public/images/buttons/button-dark-hover.png +0 -0
  673. data/public/images/buttons/button-dark.png +0 -0
  674. data/public/images/buttons/drag-handle-green.png +0 -0
  675. data/public/images/buttons/green/left_01.png +0 -0
  676. data/public/images/buttons/green/right_01.png +0 -0
  677. data/public/images/buttons/left_01.png +0 -0
  678. data/public/images/buttons/left_01_small.png +0 -0
  679. data/public/images/buttons/orange/left_03.png +0 -0
  680. data/public/images/buttons/orange/right_03.png +0 -0
  681. data/public/images/buttons/right_01.png +0 -0
  682. data/public/images/buttons/right_01_small.png +0 -0
  683. data/public/images/buttons/sxsw-ribbon-v1.png +0 -0
  684. data/public/images/buttons/top-shine.png +0 -0
  685. data/public/images/calendar_date_select/calendar.gif +0 -0
  686. data/public/images/cart-empty.png +0 -0
  687. data/public/images/cart-empty_x32.png +0 -0
  688. data/public/images/cart-full.png +0 -0
  689. data/public/images/cart-full_x32.png +0 -0
  690. data/public/images/checkout.png +0 -0
  691. data/public/images/creditcard.gif +0 -0
  692. data/public/images/datepicker/backstripes.gif +0 -0
  693. data/public/images/datepicker/bg_header.jpg +0 -0
  694. data/public/images/datepicker/bullet1.gif +0 -0
  695. data/public/images/datepicker/bullet2.gif +0 -0
  696. data/public/images/datepicker/cal.gif +0 -0
  697. data/public/images/datepicker/gradient-e5e5e5-ffffff.gif +0 -0
  698. data/public/images/discover_cid.gif +0 -0
  699. data/public/images/drag-handle-green.png +0 -0
  700. data/public/images/favicon.ico +0 -0
  701. data/public/images/green/left_01.png +0 -0
  702. data/public/images/green/right_01.png +0 -0
  703. data/public/images/grid.png +0 -0
  704. data/public/images/left_01.png +0 -0
  705. data/public/images/left_01_small.png +0 -0
  706. data/public/images/master_cid.jpg +0 -0
  707. data/public/images/menu-current.png +0 -0
  708. data/public/images/menu-hover.png +0 -0
  709. data/public/images/noimage/mini.jpg +0 -0
  710. data/public/images/noimage/product.jpg +0 -0
  711. data/public/images/noimage/small.jpg +0 -0
  712. data/public/images/openid-inputicon.gif +0 -0
  713. data/public/images/orange/left_03.png +0 -0
  714. data/public/images/orange/right_03.png +0 -0
  715. data/public/images/progress.gif +0 -0
  716. data/public/images/reorder.jpg +0 -0
  717. data/public/images/right_01.png +0 -0
  718. data/public/images/right_01_small.png +0 -0
  719. data/public/images/separator.png +0 -0
  720. data/public/images/shadow-top.png +0 -0
  721. data/public/images/shadow_top.png +0 -0
  722. data/public/images/spinner.gif +0 -0
  723. data/public/images/spree.jpg +0 -0
  724. data/public/images/spree/progress.gif +0 -0
  725. data/public/images/spree/spinner.gif +0 -0
  726. data/public/images/spree/spree.jpg +0 -0
  727. data/public/images/step-progress/completed-completed.gif +0 -0
  728. data/public/images/step-progress/completed-current.gif +0 -0
  729. data/public/images/step-progress/completed-first.gif +0 -0
  730. data/public/images/step-progress/current-first.gif +0 -0
  731. data/public/images/step-progress/current-incomplete.gif +0 -0
  732. data/public/images/step-progress/current-right.gif +0 -0
  733. data/public/images/step-progress/incomplete-incomplete.gif +0 -0
  734. data/public/images/step-progress/incomplete-right.gif +0 -0
  735. data/public/images/steps/1.png +0 -0
  736. data/public/images/steps/1_small.png +0 -0
  737. data/public/images/steps/2.png +0 -0
  738. data/public/images/steps/2_small.png +0 -0
  739. data/public/images/steps/3.png +0 -0
  740. data/public/images/steps/3_small.png +0 -0
  741. data/public/images/steps/4.png +0 -0
  742. data/public/images/steps/4_small.png +0 -0
  743. data/public/images/steps/5.png +0 -0
  744. data/public/images/steps/5_small.png +0 -0
  745. data/public/images/steps/6.png +0 -0
  746. data/public/images/steps/6_small.png +0 -0
  747. data/public/images/sxsw-ribbon-v1.png +0 -0
  748. data/public/images/tab_bottom.gif +0 -0
  749. data/public/images/tile-header.png +0 -0
  750. data/public/images/tile-slider.png +0 -0
  751. data/public/images/top-shine.png +0 -0
  752. data/public/images/tree-nav-icons/bullet.gif +0 -0
  753. data/public/images/tree-nav-icons/minus.gif +0 -0
  754. data/public/images/tree-nav-icons/plus.gif +0 -0
  755. data/public/images/tree-nav-icons/treeview-loading.gif +0 -0
  756. data/public/images/tree-nav-icons/treeview-sprite.gif +0 -0
  757. data/public/images/update.png +0 -0
  758. data/public/images/visa_cid.gif +0 -0
  759. data/public/images/wrapper-back-2.png +0 -0
  760. data/public/images/wrapper-back.png +0 -0
  761. data/public/images/yui-menubaritem_submenuindicator.png +0 -0
  762. data/public/images/yui-menubaritem_submenuindicator_disabled.png +0 -0
  763. data/public/images/yui-menuitem_checkbox.png +0 -0
  764. data/public/images/yui-menuitem_checkbox_disabled.png +0 -0
  765. data/public/images/yui-menuitem_submenuindicator.png +0 -0
  766. data/public/images/yui-menuitem_submenuindicator_disabled.png +0 -0
  767. data/public/images/yui-sprite.png +0 -0
  768. data/public/javascripts/additional-methods.js +236 -0
  769. data/public/javascripts/admin.js +232 -0
  770. data/public/javascripts/admin/address_states.js +25 -0
  771. data/public/javascripts/admin/checkouts/edit.js +130 -0
  772. data/public/javascripts/admin/orders/edit.js +23 -0
  773. data/public/javascripts/admin/orders/edit_form.js +16 -0
  774. data/public/javascripts/admin/payments/new.js +9 -0
  775. data/public/javascripts/admin/unobtrusive_handlers.js +43 -0
  776. data/public/javascripts/application.js +12 -0
  777. data/public/javascripts/calculator.js +15 -0
  778. data/public/javascripts/checkout.js +75 -0
  779. data/public/javascripts/datepicker.js +1445 -0
  780. data/public/javascripts/gateway.js +13 -0
  781. data/public/javascripts/jquery-1.4.2.min.js +154 -0
  782. data/public/javascripts/jquery-ui.js +188 -0
  783. data/public/javascripts/jquery.alerts/images/help.gif +0 -0
  784. data/public/javascripts/jquery.alerts/images/important.gif +0 -0
  785. data/public/javascripts/jquery.alerts/images/info.gif +0 -0
  786. data/public/javascripts/jquery.alerts/images/title.gif +0 -0
  787. data/public/javascripts/jquery.alerts/jquery.alerts.css +57 -0
  788. data/public/javascripts/jquery.alerts/jquery.alerts.js +235 -0
  789. data/public/javascripts/jquery.alerts/jquery.alerts.spree.css +30 -0
  790. data/public/javascripts/jquery.autocomplete.min.js +13 -0
  791. data/public/javascripts/jquery.cookie.js +96 -0
  792. data/public/javascripts/jquery.delayedobserver.js +35 -0
  793. data/public/javascripts/jquery.suggest.js +276 -0
  794. data/public/javascripts/jquery.template.js +255 -0
  795. data/public/javascripts/jquery.tokeninput.js +618 -0
  796. data/public/javascripts/jquery.validate.min.js +16 -0
  797. data/public/javascripts/jsTree/jquery.jstree.js +3510 -0
  798. data/public/javascripts/jsTree/themes/apple/bg.jpg +0 -0
  799. data/public/javascripts/jsTree/themes/apple/d.png +0 -0
  800. data/public/javascripts/jsTree/themes/apple/dot_for_ie.gif +0 -0
  801. data/public/javascripts/jsTree/themes/apple/style.css +60 -0
  802. data/public/javascripts/jsTree/themes/apple/throbber.gif +0 -0
  803. data/public/javascripts/lang/af.js +40 -0
  804. data/public/javascripts/lang/ar.js +50 -0
  805. data/public/javascripts/lang/de.js +40 -0
  806. data/public/javascripts/lang/du.js +40 -0
  807. data/public/javascripts/lang/en.js +42 -0
  808. data/public/javascripts/lang/es.js +41 -0
  809. data/public/javascripts/lang/fi.js +40 -0
  810. data/public/javascripts/lang/fr.js +44 -0
  811. data/public/javascripts/lang/gr.js +40 -0
  812. data/public/javascripts/lang/he.js +49 -0
  813. data/public/javascripts/lang/it.js +13 -0
  814. data/public/javascripts/lang/nl.js +40 -0
  815. data/public/javascripts/lang/no.js +40 -0
  816. data/public/javascripts/lang/pt.js +50 -0
  817. data/public/javascripts/lang/ro.js +40 -0
  818. data/public/javascripts/lang/ru.js +40 -0
  819. data/public/javascripts/lang/sp.js +40 -0
  820. data/public/javascripts/lang/sv.js +41 -0
  821. data/public/javascripts/lang/ua.js +40 -0
  822. data/public/javascripts/localization/messages_cn.js +24 -0
  823. data/public/javascripts/localization/messages_cs.js +23 -0
  824. data/public/javascripts/localization/messages_da.js +21 -0
  825. data/public/javascripts/localization/messages_de.js +21 -0
  826. data/public/javascripts/localization/messages_es.js +24 -0
  827. data/public/javascripts/localization/messages_fr.js +23 -0
  828. data/public/javascripts/localization/messages_hu.js +21 -0
  829. data/public/javascripts/localization/messages_it.js +26 -0
  830. data/public/javascripts/localization/messages_kk.js +23 -0
  831. data/public/javascripts/localization/messages_nl.js +23 -0
  832. data/public/javascripts/localization/messages_no.js +23 -0
  833. data/public/javascripts/localization/messages_pl.js +23 -0
  834. data/public/javascripts/localization/messages_ptbr.js +30 -0
  835. data/public/javascripts/localization/messages_ro.js +24 -0
  836. data/public/javascripts/localization/messages_ru.js +23 -0
  837. data/public/javascripts/localization/messages_se.js +23 -0
  838. data/public/javascripts/localization/messages_sk.js +21 -0
  839. data/public/javascripts/localization/messages_tr.js +24 -0
  840. data/public/javascripts/localization/messages_tw.js +24 -0
  841. data/public/javascripts/localization/messages_ua.js +24 -0
  842. data/public/javascripts/nested-attribute.js +26 -0
  843. data/public/javascripts/open_id.js +15 -0
  844. data/public/javascripts/product.js +49 -0
  845. data/public/javascripts/rails.js +127 -0
  846. data/public/javascripts/taxonomy.js +201 -0
  847. data/public/javascripts/zone.js +39 -0
  848. data/public/stylesheets/admin/admin-forms.css +154 -0
  849. data/public/stylesheets/admin/admin-reset.css +69 -0
  850. data/public/stylesheets/admin/admin-tables.css +39 -0
  851. data/public/stylesheets/admin/admin-typography.css +117 -0
  852. data/public/stylesheets/admin/admin.css +614 -0
  853. data/public/stylesheets/admin/autocomplete.css +73 -0
  854. data/public/stylesheets/admin/dashboard.css +143 -0
  855. data/public/stylesheets/admin/edit_checkouts.css +57 -0
  856. data/public/stylesheets/admin/grids.css +314 -0
  857. data/public/stylesheets/admin/reset-fonts-grids-2-6-0.css +7 -0
  858. data/public/stylesheets/admin/token-input.css +109 -0
  859. data/public/stylesheets/admin/yui-includes.css +14 -0
  860. data/public/stylesheets/datepicker.css +263 -0
  861. data/public/stylesheets/jquery.autocomplete.css +48 -0
  862. data/public/stylesheets/screen.css +916 -0
  863. metadata +1072 -0
@@ -0,0 +1,89 @@
1
+ ##
2
+ # Creates methods on object which delegate to an association proxy.
3
+ # see delegate_belongs_to for two uses
4
+ #
5
+ # Todo - integrate with ActiveRecord::Dirty to make sure changes to delegate object are noticed
6
+ # Should do
7
+ # class User < ActiveRecord::Base; delegate_belongs_to :contact, :firstname; end
8
+ # class Contact < ActiveRecord::Base; end
9
+ # u = User.first
10
+ # u.changed? # => false
11
+ # u.firstname = 'Bobby'
12
+ # u.changed? # => true
13
+ #
14
+ # Right now the second call to changed? would return false
15
+ #
16
+ # Todo - add has_one support. fairly straightforward addition
17
+ ##
18
+ module DelegateBelongsTo
19
+ extend ActiveSupport::Concern
20
+
21
+ module ClassMethods
22
+
23
+ @@default_rejected_delegate_columns = ['created_at','created_on','updated_at','updated_on','lock_version','type','id','position','parent_id','lft','rgt']
24
+ mattr_accessor :default_rejected_delegate_columns
25
+
26
+ ##
27
+ # Creates methods for accessing and setting attributes on an association. Uses same
28
+ # default list of attributes as delegates_to_association.
29
+ # @todo Integrate this with ActiveRecord::Dirty, so if you set a property through one of these setters and then call save on this object, it will save the associated object automatically.
30
+ # delegate_belongs_to :contact
31
+ # delegate_belongs_to :contact, [:defaults] ## same as above, and useless
32
+ # delegate_belongs_to :contact, [:defaults, :address, :fullname], :class_name => 'VCard'
33
+ ##
34
+ def delegate_belongs_to(association, *attrs)
35
+ opts = attrs.extract_options!
36
+ initialize_association :belongs_to, association, opts
37
+ attrs = get_association_column_names(association) if attrs.empty?
38
+ attrs.concat get_association_column_names(association) if attrs.delete :defaults
39
+ attrs.each do |attr|
40
+ class_def attr do |*args|
41
+ if args.empty?
42
+ send(:delegator_for, association).send(attr)
43
+ else
44
+ send(:delegator_for, association).send(attr, *args)
45
+ end
46
+ end
47
+ class_def "#{attr}=" do |val|
48
+ send(:delegator_for, association).send("#{attr}=", val)
49
+ end
50
+ end
51
+ end
52
+
53
+ protected
54
+
55
+ def get_association_column_names(association, without_default_rejected_delegate_columns=true)
56
+ begin
57
+ association_klass = reflect_on_association(association).klass
58
+ methods = association_klass.column_names
59
+ methods.reject!{|x|default_rejected_delegate_columns.include?(x.to_s)} if without_default_rejected_delegate_columns
60
+ return methods
61
+ rescue
62
+ return []
63
+ end
64
+ end
65
+
66
+ ##
67
+ # initialize_association :belongs_to, :contact
68
+ def initialize_association(type, association, opts={})
69
+ raise 'Illegal or unimplemented association type.' unless [:belongs_to].include?(type.to_s.to_sym)
70
+ send type, association, opts if reflect_on_association(association).nil?
71
+ end
72
+
73
+ private
74
+
75
+ def class_def(name, method=nil, &blk)
76
+ class_eval { method.nil? ? define_method(name, &blk) : define_method(name, method) }
77
+ end
78
+
79
+ end
80
+
81
+ module InstanceMethods
82
+ protected
83
+ def delegator_for(association)
84
+ send("#{association}=", self.class.reflect_on_association(association).klass.new) if send(association).nil?
85
+ send(association)
86
+ end
87
+ end
88
+
89
+ end
@@ -0,0 +1,209 @@
1
+
2
+ module EnumerableConstant
3
+
4
+ # default (overridable) value for any
5
+ def self.any_value
6
+ -1
7
+ end
8
+
9
+ def self.any
10
+ [any_value, '[any]']
11
+ end
12
+
13
+ class Tupple
14
+
15
+ include Comparable
16
+
17
+ attr_accessor :name, :value, :display_name
18
+
19
+ def initialize(name, value=nil, display_name=nil)
20
+ @name = name
21
+ @value = value
22
+ @display_name = display_name
23
+ end
24
+
25
+ def <=> other
26
+ self.display_name <=> other.display_name
27
+ end
28
+
29
+ def title_translated
30
+ t("order_status_#{self.name.downcase}")
31
+ end
32
+
33
+ def title
34
+ if @display_name
35
+ self.display_name
36
+ else
37
+ self.name.titleize.strip
38
+ end
39
+ end
40
+
41
+ def id
42
+ self.value
43
+ end
44
+
45
+ end
46
+
47
+ class Base
48
+
49
+ include Comparable
50
+
51
+ def <=>
52
+
53
+ end
54
+
55
+ def self.class_var_prefix
56
+ self.name.gsub!('::', '_').underscore
57
+ end
58
+
59
+ def self.base=(value)
60
+ class_eval("@@#{self.class_var_prefix}_base = value")
61
+ end
62
+
63
+ def self.base(value)
64
+ class_eval("@@#{self.class_var_prefix}_base = value")
65
+ end
66
+
67
+ def self.constant(name, value=nil, display_name=nil)
68
+ # puts "name: #{name}"
69
+ # puts "value: #{value}"
70
+ # puts "display_name: #{display_name}"
71
+ class_eval("@@#{self.class_var_prefix}_constants ||= []")
72
+ class_eval("@@#{self.class_var_prefix}_base ||= 0 ")
73
+ if value == nil and class_eval("@@#{self.class_var_prefix}_constants.size == 0")
74
+ value = class_eval("@@#{self.class_var_prefix}_base")
75
+ end
76
+ if value == nil and class_eval("@@#{self.class_var_prefix}_constants.size > 0")
77
+ begin
78
+ value = class_eval("@@#{self.class_var_prefix}_constants.last.value.succ")
79
+ rescue
80
+ value = nil
81
+ end
82
+ end
83
+ # puts "eval : " + "#{name.to_s.underscore.upcase} = #{value}"
84
+ class_eval "#{name.to_s.underscore.upcase} = #{value}"
85
+ # class_eval "A_STUFF = 25"
86
+ # puts "display_name: #{display_name}" if display_name
87
+ class_eval("@@#{self.class_var_prefix}_constants << EnumerableConstant::Tupple.new(name, value, display_name)")
88
+ end
89
+
90
+ # TODO: add method_missing for class methods so you can do stuff like:
91
+ # :my_constant = 2
92
+ # :my_constant 2
93
+ # MY_CONSTANT = 2
94
+ # MY_CONSTANT 2
95
+ # def self.method_missing(symbol, *params)
96
+ #
97
+ # end
98
+ def self.from_value value
99
+ self.constants.each do |constant|
100
+ return constant.title if constant.value == value
101
+ end
102
+ nil
103
+ end
104
+
105
+ def self.constants
106
+ class_eval("@@#{self.class_var_prefix}_constants")
107
+ end
108
+
109
+ def self.constant_names
110
+ result = []
111
+ class_eval("@@#{self.class_var_prefix}_constants").map do |tupple|
112
+ result << tupple.name
113
+ end
114
+ result
115
+ end
116
+
117
+ def self.names
118
+ result = []
119
+ class_eval("@@#{self.class_var_prefix}_constants").map do |tupple|
120
+ result << tupple.title
121
+ end
122
+ result
123
+ end
124
+
125
+ def self.values
126
+ result = []
127
+ class_eval("@@#{self.class_var_prefix}_constants").map do |tupple|
128
+ result << tupple.value
129
+ end
130
+ result
131
+ end
132
+
133
+ end
134
+
135
+ module VERSION
136
+ MAJOR = 1
137
+ MINOR = 0
138
+ TINY = 0
139
+ STRING = [MAJOR, MINOR, TINY].join('.')
140
+ end
141
+
142
+ end
143
+
144
+ class ActiveRecord::Base
145
+
146
+ def self.enumerable_constant(attribute_name, options={})
147
+ raise ArgumentError, "you must specify a list of constants" unless options[:constants]
148
+ set_name = attribute_name.to_s.camelize
149
+ set_class = "#{self.name}::#{set_name}"
150
+
151
+ constant_definitions = ""
152
+ options[:constants].each do |constant|
153
+ if constant.is_a? Hash
154
+ # puts "hash"
155
+ constant_name = constant.to_a[0][0]
156
+ display_name = constant.to_a[0][1]
157
+ # puts "constant name: #{constant_name}"
158
+ # puts "display name: #{display_name}"
159
+ # puts "c name: #{constant_name.to_s.underscore.upcase}"
160
+ constant_definitions << "constant '#{constant_name.to_s.underscore.upcase}', nil, '#{display_name}'\n"
161
+ else
162
+ # puts "constant '#{constant.to_s.underscore.upcase}'\n"
163
+ constant_definitions << "constant '#{constant.to_s.underscore.upcase}'\n"
164
+ end
165
+ end
166
+
167
+ # allow for :connector and :skip_last_comma as used in Array#to_sentence
168
+ if options[:connector]
169
+ connector = options[:connector]
170
+ else
171
+ connector = 'or'
172
+ end
173
+ unless options[:skip_last_comma].kind_of? NilClass
174
+ skip_last_comma = options[:skip_last_comma]
175
+ else
176
+ skip_last_comma = true
177
+ end
178
+
179
+ if options[:base]
180
+ use_base = options[:base]
181
+ else
182
+ use_base = 1
183
+ end
184
+
185
+ # keep glue_text for back compat
186
+ if options[:glue_text]
187
+ connector = options[:glue_text].strip
188
+ end
189
+
190
+ class_eval <<-EOF
191
+ class #{set_name} < EnumerableConstant::Base
192
+ base #{use_base}
193
+ #{constant_definitions}
194
+ end
195
+ EOF
196
+
197
+ should_be_in_text = set_class.constantize.names.to_sentence :words_connector => connector, :last_word_connector => skip_last_comma
198
+
199
+ unless options[:no_validation]
200
+ class_eval <<-EOF
201
+ validates :#{attribute_name.to_s}, :presence => {
202
+ :in => #{set_name}::values,
203
+ :message => "should be #{should_be_in_text}"
204
+ }
205
+ EOF
206
+ end
207
+ end
208
+
209
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord::Persistence
2
+
3
+ # Update attributes of a record in the database without callbacks, validations etc.
4
+ def update_attributes_without_callbacks(attributes)
5
+ self.send(:attributes=, attributes, false)
6
+ self.class.update_all(attributes, { :id => id })
7
+ end
8
+
9
+ # Update a single attribute in the database
10
+ def update_attribute_without_callbacks(name, value)
11
+ send("#{name}=", value)
12
+ update_attributes_without_callbacks(name => value)
13
+ end
14
+
15
+ end
@@ -0,0 +1,14 @@
1
+ # RAILS3 TODO (likely not needed - it was commented out before rails3 branch)
2
+ # module SpreeCore::Ext::Array
3
+ # def to_hash_keys(&block)
4
+ # Hash[*self.collect { |v|
5
+ # [v, block.call(v)]
6
+ # }.flatten]
7
+ # end
8
+ #
9
+ # def to_hash_values(&block)
10
+ # Hash[*self.collect { |v|
11
+ # [block.call(v), v]
12
+ # }.flatten]
13
+ # end
14
+ # end
@@ -0,0 +1,75 @@
1
+ #
2
+ # = Hash Recursive Merge
3
+ #
4
+ # Merges a Ruby Hash recursively, Also known as deep merge.
5
+ # Recursive version of Hash#merge and Hash#merge!.
6
+ #
7
+ # Category:: Ruby
8
+ # Package:: Hash
9
+ # Author:: Simone Carletti <weppos@weppos.net>
10
+ # Copyright:: 2007-2008 The Authors
11
+ # License:: MIT License
12
+ # Link:: http://www.simonecarletti.com/
13
+ # Source:: http://gist.github.com/gists/6391/
14
+ #
15
+ module HashRecursiveMerge
16
+
17
+ #
18
+ # Recursive version of Hash#merge!
19
+ #
20
+ # Adds the contents of +other_hash+ to +hsh+,
21
+ # merging entries in +hsh+ with duplicate keys with those from +other_hash+.
22
+ #
23
+ # Compared with Hash#merge!, this method supports nested hashes.
24
+ # When both +hsh+ and +other_hash+ contains an entry with the same key,
25
+ # it merges and returns the values from both arrays.
26
+ #
27
+ # h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
28
+ # h2 = {"b" => 254, "c" => 300, "c" => {"c1" => 16, "c3" => 94}}
29
+ # h1.rmerge!(h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
30
+ #
31
+ # Simply using Hash#merge! would return
32
+ #
33
+ # h1.merge!(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
34
+ #
35
+ def rmerge!(other_hash)
36
+ merge!(other_hash) do |key, oldval, newval|
37
+ oldval.class == self.class ? oldval.rmerge!(newval) : newval
38
+ end
39
+ end
40
+
41
+ #
42
+ # Recursive version of Hash#merge
43
+ #
44
+ # Compared with Hash#merge!, this method supports nested hashes.
45
+ # When both +hsh+ and +other_hash+ contains an entry with the same key,
46
+ # it merges and returns the values from both arrays.
47
+ #
48
+ # Compared with Hash#merge, this method provides a different approch
49
+ # for merging nasted hashes.
50
+ # If the value of a given key is an Hash and both +other_hash+ abd +hsh
51
+ # includes the same key, the value is merged instead replaced with
52
+ # +other_hash+ value.
53
+ #
54
+ # h1 = {"a" => 100, "b" => 200, "c" => {"c1" => 12, "c2" => 14}}
55
+ # h2 = {"b" => 254, "c" => 300, "c" => {"c1" => 16, "c3" => 94}}
56
+ # h1.rmerge(h2) #=> {"a" => 100, "b" => 254, "c" => {"c1" => 16, "c2" => 14, "c3" => 94}}
57
+ #
58
+ # Simply using Hash#merge would return
59
+ #
60
+ # h1.merge(h2) #=> {"a" => 100, "b" = >254, "c" => {"c1" => 16, "c3" => 94}}
61
+ #
62
+ def rmerge(other_hash)
63
+ r = {}
64
+ merge(other_hash) do |key, oldval, newval|
65
+ r[key] = oldval.class == self.class ? oldval.rmerge(newval) : newval
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+
72
+ class Hash
73
+ include HashRecursiveMerge
74
+ end
75
+
@@ -0,0 +1,10 @@
1
+ module SpreeCore::Ext::String
2
+ def is_integer?
3
+ begin
4
+ Integer(self.to_s)
5
+ return true
6
+ rescue ArgumentError
7
+ return false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,293 @@
1
+ # Most of this code is from the preferences plugin available at
2
+ # http://github.com/pluginaweek/preferences/tree/master
3
+
4
+ module Spree
5
+ module Preferences
6
+ # Adds support for defining preferences on ActiveRecord models.
7
+ #
8
+ # == Saving preferences
9
+ #
10
+ # Preferences are not automatically saved when they are set. You must save
11
+ # the record that the preferences were set on.
12
+ #
13
+ # For example,
14
+ #
15
+ # class User < ActiveRecord::Base
16
+ # preference :notifications
17
+ # end
18
+ #
19
+ # u = User.new(:login => 'admin', :prefers_notifications => false)
20
+ # u.save!
21
+ #
22
+ # u = User.find_by_login('admin')
23
+ # u.attributes = {:prefers_notifications => true}
24
+ # u.save!
25
+ module ModelHooks
26
+ def self.included(base) #:nodoc:
27
+ base.class_eval do
28
+ extend Spree::Preferences::ModelHooks::MacroMethods
29
+ end
30
+ end
31
+
32
+ module MacroMethods
33
+ # Defines a new preference for all records in the model. By default, preferences
34
+ # are assumed to have a boolean data type, so all values will be typecasted
35
+ # to true/false based on ActiveRecord rules.
36
+ #
37
+ # Configuration options:
38
+ # * +default+ - The default value for the preference. Default is nil.
39
+ #
40
+ # == Examples
41
+ #
42
+ # The example below shows the various ways to define a preference for a
43
+ # particular model.
44
+ #
45
+ # class User < ActiveRecord::Base
46
+ # preference :notifications, :default => false
47
+ # preference :color, :string, :default => 'red'
48
+ # preference :favorite_number, :integer
49
+ # preference :data, :any # Allows any data type to be stored
50
+ # end
51
+ #
52
+ # All preferences are also inherited by subclasses.
53
+ #
54
+ # == Associations
55
+ #
56
+ # After the first preference is defined, the following associations are
57
+ # created for the model:
58
+ # * +stored_preferences+ - A collection of all the custom preferences specified for a record
59
+ #
60
+ # == Generated shortcut methods
61
+ #
62
+ # In addition to calling <tt>prefers?</tt> and +preferred+ on a record, you
63
+ # can also use the shortcut methods that are generated when a preference is
64
+ # defined. For example,
65
+ #
66
+ # class User < ActiveRecord::Base
67
+ # preference :notifications
68
+ # end
69
+ #
70
+ # ...generates the following methods:
71
+ # * <tt>prefers_notifications?</tt> - The same as calling <tt>record.prefers?(:notifications)</tt>
72
+ # * <tt>prefers_notifications=(value)</tt> - The same as calling <tt>record.set_preference(:notifications, value)</tt>
73
+ # * <tt>preferred_notifications</tt> - The same as called <tt>record.preferred(:notifications)</tt>
74
+ # * <tt>preferred_notifications=(value)</tt> - The same as calling <tt>record.set_preference(:notifications, value)</tt>
75
+ #
76
+ # Notice that there are two tenses used depending on the context of the
77
+ # preference. Conventionally, <tt>prefers_notifications?</tt> is better
78
+ # for boolean preferences, while +preferred_color+ is better for non-boolean
79
+ # preferences.
80
+ #
81
+ # Example:
82
+ #
83
+ # user = User.find(:first)
84
+ # user.prefers_notifications? # => false
85
+ # user.prefers_color? # => true
86
+ # user.preferred_color # => 'red'
87
+ # user.preferred_color = 'blue' # => 'blue'
88
+ #
89
+ # user.prefers_notifications = true
90
+ #
91
+ # car = Car.find(:first)
92
+ # user.preferred_color = 'red', car # => 'red'
93
+ # user.preferred_color(car) # => 'red'
94
+ # user.prefers_color?(car) # => true
95
+ #
96
+ # user.save! # => true
97
+ def preference(name, *args)
98
+ unless included_modules.include?(InstanceMethods)
99
+ class_inheritable_hash :preference_definitions
100
+ self.preference_definitions = {}
101
+
102
+ class_inheritable_hash :default_preferences
103
+ self.default_preferences = {}
104
+
105
+ has_many :stored_preferences, :as => :owner, :class_name => 'Preference'
106
+
107
+ after_save :update_preferences
108
+
109
+ include Spree::Preferences::ModelHooks::InstanceMethods
110
+ end
111
+
112
+ # Create the definition
113
+ name = name.to_s
114
+ definition = PreferenceDefinition.new(name, *args)
115
+ self.preference_definitions[name] = definition
116
+ self.default_preferences[name] = definition.default_value
117
+
118
+ # Create short-hand helper methods, making sure that the attribute
119
+ # is method-safe in terms of what characters are allowed
120
+ name = name.gsub(/[^A-Za-z0-9_-]/, '').underscore
121
+
122
+ # Query lookup
123
+ define_method("prefers_#{name}?") do |*group|
124
+ prefers?(name, group.first)
125
+ end
126
+
127
+ # Writer
128
+ define_method("prefers_#{name}=") do |*args|
129
+ set_preference(*([name] + [args].flatten))
130
+ end
131
+ alias_method "preferred_#{name}=", "prefers_#{name}="
132
+
133
+ # Reader
134
+ define_method("preferred_#{name}") do |*group|
135
+ preferred(name, group.first)
136
+ end
137
+
138
+ definition
139
+ end
140
+ end
141
+
142
+ module InstanceMethods
143
+ def self.included(base) #:nodoc:
144
+ base.class_eval do
145
+ alias_method :prefs, :preferences
146
+ end
147
+ end
148
+
149
+ # Finds all preferences, including defaults, for the current record. If
150
+ # any custom group preferences have been stored, then this will include
151
+ # all default preferences within that particular group.
152
+ #
153
+ # == Examples
154
+ #
155
+ # A user with no stored values:
156
+ # user = User.find(:first)
157
+ # user.preferences
158
+ # => {"language"=>"English", "color"=>nil}
159
+ #
160
+ # A user with stored values for a particular group:
161
+ # user.preferred_color = 'red', 'cars'
162
+ # user.preferences
163
+ # => {"language"=>"English", "color"=>nil, "cars"=>{"language=>"English", "color"=>"red"}}
164
+ #
165
+ # Getting preference values for the owning record:
166
+ # user.preferences(nil)
167
+ # => {"language"=>"English", "color"=>nil}
168
+ #
169
+ # Getting preference values for a particular group:
170
+ # user.preferences('cars')
171
+ # => {"language"=>"English", "color"=>"red"}
172
+ def preferences(*args)
173
+ if args.empty?
174
+ group = nil
175
+ conditions = {}
176
+ else
177
+ group = args.first
178
+ group_id, group_type = Preference.split_group(group)
179
+ conditions = {:group_id => group_id, :group_type => group_type}
180
+ end
181
+
182
+ # Find all of the stored preferences
183
+ stored_preferences = self.stored_preferences.where(conditions)
184
+
185
+ # Hashify attribute -> value or group -> attribute -> value
186
+ stored_preferences.inject(self.class.default_preferences.dup) do |all_preferences, preference|
187
+ if !group && (preference_group = preference.group)
188
+ preferences = all_preferences[preference_group] ||= self.class.default_preferences.dup
189
+ else
190
+ preferences = all_preferences
191
+ end
192
+
193
+ preferences[preference.name] = preference.value
194
+ all_preferences
195
+ end
196
+ end
197
+
198
+ # Queries whether or not a value has been specified for the given attribute.
199
+ # This is dependent on how the value is type-casted.
200
+ #
201
+ # == Examples
202
+ #
203
+ # user = User.find(:first)
204
+ # user.prefers?(:notifications) # => true
205
+ #
206
+ # user.prefers(:notifications, 'error') # => true
207
+ #
208
+ # newsgroup = Newsgroup.find(:first)
209
+ # user.prefers?(:notifications, newsgroup) # => false
210
+ def prefers?(name, group = nil)
211
+ name = name.to_s
212
+
213
+ value = preferred(name, group)
214
+ preference_definitions[name].query(value)
215
+ end
216
+
217
+ # Gets the preferred value for the given attribute.
218
+ #
219
+ # == Examples
220
+ #
221
+ # user = User.find(:first)
222
+ # user.preferred(:color) # => 'red'
223
+ #
224
+ # user.preferred(:color, 'cars') # => 'blue'
225
+ #
226
+ # car = Car.find(:first)
227
+ # user.preferred(:color, car) # => 'black'
228
+ def preferred(name, group = nil)
229
+ name = name.to_s
230
+
231
+ if @preference_values && @preference_values[name] && @preference_values[name].include?(group)
232
+ value = @preference_values[name][group]
233
+ else
234
+ group_id, group_type = Preference.split_group(group)
235
+ preference = stored_preferences.find(:first, :conditions => {:name => name, :group_id => group_id, :group_type => group_type})
236
+ value = preference ? preference.value : preference_definitions[name].default_value
237
+ end
238
+
239
+ value
240
+ end
241
+
242
+ # Sets a new value for the given attribute. The actual Preference record
243
+ # is *not* created until the actual record is saved.
244
+ #
245
+ # == Examples
246
+ #
247
+ # user = User.find(:first)
248
+ # user.set_preference(:notifications, false) # => false
249
+ # user.save!
250
+ #
251
+ # newsgroup = Newsgroup.find(:first)
252
+ # user.set_preference(:notifications, true, newsgroup) # => true
253
+ # user.save!
254
+ def set_preference(name, value, group = nil)
255
+ name = name.to_s
256
+
257
+ @preference_values ||= {}
258
+ @preference_values[name] ||= {}
259
+ @preference_values[name][group] = value
260
+
261
+ value
262
+ end
263
+
264
+ private
265
+
266
+ # Updates any preferences that have been changed/added since the record
267
+ # was last saved
268
+ def update_preferences
269
+ if @preference_values
270
+ @preference_values.each do |name, grouped_records|
271
+ grouped_records.each do |group, value|
272
+ group_id, group_type = Preference.split_group(group)
273
+ attributes = {:name => name, :group_id => group_id, :group_type => group_type}
274
+
275
+ # Find an existing preference or build a new one
276
+ preference = stored_preferences.find(:first, :conditions => attributes)
277
+ if preference.nil?
278
+ attribute = attributes.delete(:attribute)
279
+ preference = stored_preferences.build(attributes)
280
+ preference['attribute'] = attribute
281
+ end
282
+ preference.value = value
283
+ preference.save!
284
+ end
285
+ end
286
+
287
+ @preference_values = nil
288
+ end
289
+ end
290
+ end
291
+ end
292
+ end
293
+ end