From fb70c10cb510e3bcbc6efca44e21a586b326c49e Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 12:05:16 -0700 Subject: [PATCH 001/348] Initial rails app setup --- .gitignore | 19 + Gemfile | 67 ++ Gemfile.lock | 232 +++++ Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 18 + app/assets/javascripts/cable.js | 13 + app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/_settings.scss | 863 ++++++++++++++++++ app/assets/stylesheets/application.css | 17 + .../stylesheets/foundation_and_overrides.scss | 57 ++ app/channels/application_cable/channel.rb | 4 + app/channels/application_cable/connection.rb | 4 + app/controllers/application_controller.rb | 3 + app/controllers/concerns/.keep | 0 app/helpers/application_helper.rb | 2 + app/jobs/application_job.rb | 2 + app/mailers/application_mailer.rb | 4 + app/models/application_record.rb | 3 + app/models/concerns/.keep | 0 app/views/layouts/application.html.erb | 19 + app/views/layouts/mailer.html.erb | 13 + app/views/layouts/mailer.text.erb | 1 + bin/bundle | 3 + bin/rails | 9 + bin/rake | 9 + bin/setup | 38 + bin/spring | 17 + bin/update | 29 + bin/yarn | 11 + config.ru | 5 + config/application.rb | 25 + config/boot.rb | 3 + config/cable.yml | 10 + config/database.yml | 85 ++ config/environment.rb | 5 + config/environments/development.rb | 54 ++ config/environments/production.rb | 91 ++ config/environments/test.rb | 42 + .../application_controller_renderer.rb | 8 + config/initializers/assets.rb | 14 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/cookies_serializer.rb | 5 + .../initializers/filter_parameter_logging.rb | 4 + config/initializers/inflections.rb | 16 + config/initializers/mime_types.rb | 4 + config/initializers/wrap_parameters.rb | 14 + config/locales/en.yml | 33 + config/puma.rb | 56 ++ config/routes.rb | 3 + config/secrets.yml | 32 + config/spring.rb | 6 + db/seeds.rb | 7 + lib/assets/.keep | 0 lib/tasks/.keep | 0 log/.keep | 0 package.json | 5 + public/404.html | 67 ++ public/422.html | 67 ++ public/500.html | 66 ++ public/apple-touch-icon-precomposed.png | 0 public/apple-touch-icon.png | 0 public/favicon.ico | 0 public/robots.txt | 1 + test/application_system_test_case.rb | 5 + test/controllers/.keep | 0 test/fixtures/.keep | 0 test/fixtures/files/.keep | 0 test/helpers/.keep | 0 test/integration/.keep | 0 test/mailers/.keep | 0 test/models/.keep | 0 test/system/.keep | 0 test/test_helper.rb | 25 + tmp/.keep | 0 vendor/.keep | 0 77 files changed, 2231 insertions(+) create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 Rakefile create mode 100644 app/assets/config/manifest.js create mode 100644 app/assets/images/.keep create mode 100644 app/assets/javascripts/application.js create mode 100644 app/assets/javascripts/cable.js create mode 100644 app/assets/javascripts/channels/.keep create mode 100644 app/assets/stylesheets/_settings.scss create mode 100644 app/assets/stylesheets/application.css create mode 100644 app/assets/stylesheets/foundation_and_overrides.scss create mode 100644 app/channels/application_cable/channel.rb create mode 100644 app/channels/application_cable/connection.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/concerns/.keep create mode 100644 app/helpers/application_helper.rb create mode 100644 app/jobs/application_job.rb create mode 100644 app/mailers/application_mailer.rb create mode 100644 app/models/application_record.rb create mode 100644 app/models/concerns/.keep create mode 100644 app/views/layouts/application.html.erb create mode 100644 app/views/layouts/mailer.html.erb create mode 100644 app/views/layouts/mailer.text.erb create mode 100755 bin/bundle create mode 100755 bin/rails create mode 100755 bin/rake create mode 100755 bin/setup create mode 100755 bin/spring create mode 100755 bin/update create mode 100755 bin/yarn create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/boot.rb create mode 100644 config/cable.yml create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/application_controller_renderer.rb create mode 100644 config/initializers/assets.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/cookies_serializer.rb create mode 100644 config/initializers/filter_parameter_logging.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/wrap_parameters.rb create mode 100644 config/locales/en.yml create mode 100644 config/puma.rb create mode 100644 config/routes.rb create mode 100644 config/secrets.yml create mode 100644 config/spring.rb create mode 100644 db/seeds.rb create mode 100644 lib/assets/.keep create mode 100644 lib/tasks/.keep create mode 100644 log/.keep create mode 100644 package.json create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/robots.txt create mode 100644 test/application_system_test_case.rb create mode 100644 test/controllers/.keep create mode 100644 test/fixtures/.keep create mode 100644 test/fixtures/files/.keep create mode 100644 test/helpers/.keep create mode 100644 test/integration/.keep create mode 100644 test/mailers/.keep create mode 100644 test/models/.keep create mode 100644 test/system/.keep create mode 100644 test/test_helper.rb create mode 100644 tmp/.keep create mode 100644 vendor/.keep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..82701fedc8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +/node_modules +/yarn-error.log + +.byebug_history diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..5ab86d9376 --- /dev/null +++ b/Gemfile @@ -0,0 +1,67 @@ +source 'https://rubygems.org' + +git_source(:github) do |repo_name| + repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") + "https://github.com/#{repo_name}.git" +end + + +# Bundle edge Rails instead: gem 'rails', github: 'rails/rails' +gem 'rails', '~> 5.1.4' +# Use postgresql as the database for Active Record +gem 'pg', '~> 0.18' +# Use Puma as the app server +gem 'puma', '~> 3.7' +# Use SCSS for stylesheets +gem 'sass-rails', '~> 5.0' +# Use Uglifier as compressor for JavaScript assets +gem 'uglifier', '>= 1.3.0' +# See https://github.com/rails/execjs#readme for more supported runtimes +# gem 'therubyracer', platforms: :ruby + +# Use CoffeeScript for .coffee assets and views +# gem 'coffee-rails', '~> 4.2' +# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks +gem 'turbolinks', '~> 5' +# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder +gem 'jbuilder', '~> 2.5' +# Use Redis adapter to run Action Cable in production +# gem 'redis', '~> 3.0' +# Use ActiveModel has_secure_password +# gem 'bcrypt', '~> 3.1.7' + +# Use Capistrano for deployment +# gem 'capistrano-rails', group: :development + +group :development, :test do + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] + # Adds support for Capybara system testing and selenium driver + gem 'capybara', '~> 2.13' + gem 'selenium-webdriver' +end + +group :development do + # Access an IRB console on exception pages or by using <%= console %> anywhere in the code. + gem 'web-console', '>= 3.3.0' + gem 'listen', '>= 3.0.5', '< 3.2' + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + gem 'spring-watcher-listen', '~> 2.0.0' +end + +# Windows does not include zoneinfo files, so bundle the tzinfo-data gem +gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] + +gem 'jquery-turbolinks' +gem 'foundation-rails', '6.4.1.2' +group :development do + gem 'better_errors' + gem 'pry-rails' + gem 'binding_of_caller' +end + +group :test do + gem 'minitest-rails' + gem 'minitest-reporters' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..67420367a1 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,232 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.1.4) + actionpack (= 5.1.4) + nio4r (~> 2.0) + websocket-driver (~> 0.6.1) + actionmailer (5.1.4) + actionpack (= 5.1.4) + actionview (= 5.1.4) + activejob (= 5.1.4) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.1.4) + actionview (= 5.1.4) + activesupport (= 5.1.4) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.1.4) + activesupport (= 5.1.4) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.1.4) + activesupport (= 5.1.4) + globalid (>= 0.3.6) + activemodel (5.1.4) + activesupport (= 5.1.4) + activerecord (5.1.4) + activemodel (= 5.1.4) + activesupport (= 5.1.4) + arel (~> 8.0) + activesupport (5.1.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (~> 0.7) + minitest (~> 5.1) + tzinfo (~> 1.1) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + ansi (1.5.0) + arel (8.0.0) + babel-source (5.8.35) + babel-transpiler (0.7.0) + babel-source (>= 4.0, < 6) + execjs (~> 2.0) + better_errors (2.4.0) + coderay (>= 1.0.0) + erubi (>= 1.0.0) + rack (>= 0.9.0) + bindex (0.5.0) + binding_of_caller (0.7.2) + debug_inspector (>= 0.0.1) + builder (3.2.3) + byebug (9.1.0) + capybara (2.15.4) + addressable + mini_mime (>= 0.1.3) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (~> 2.0) + childprocess (0.8.0) + ffi (~> 1.0, >= 1.0.11) + coderay (1.1.2) + concurrent-ruby (1.0.5) + crass (1.0.2) + debug_inspector (0.0.3) + erubi (1.7.0) + execjs (2.7.0) + ffi (1.9.18) + foundation-rails (6.4.1.2) + railties (>= 3.1.0) + sass (>= 3.3.0, < 3.5) + sprockets-es6 (>= 0.9.0) + globalid (0.4.0) + activesupport (>= 4.2.0) + i18n (0.9.0) + concurrent-ruby (~> 1.0) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-turbolinks (2.1.0) + railties (>= 3.1.0) + turbolinks + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) + loofah (2.1.1) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.6.6) + mime-types (>= 1.16, < 4) + method_source (0.9.0) + mime-types (3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2016.0521) + mini_mime (0.1.4) + mini_portile2 (2.3.0) + minitest (5.10.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.1.18) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + multi_json (1.12.2) + nio4r (2.1.0) + nokogiri (1.8.1) + mini_portile2 (~> 2.3.0) + pg (0.21.0) + pry (0.11.1) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + public_suffix (3.0.0) + puma (3.10.0) + rack (2.0.3) + rack-test (0.7.0) + rack (>= 1.0, < 3) + rails (5.1.4) + actioncable (= 5.1.4) + actionmailer (= 5.1.4) + actionpack (= 5.1.4) + actionview (= 5.1.4) + activejob (= 5.1.4) + activemodel (= 5.1.4) + activerecord (= 5.1.4) + activesupport (= 5.1.4) + bundler (>= 1.3.0) + railties (= 5.1.4) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.3) + loofah (~> 2.0) + railties (5.1.4) + actionpack (= 5.1.4) + activesupport (= 5.1.4) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.1.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + ruby-progressbar (1.9.0) + ruby_dep (1.5.0) + rubyzip (1.2.1) + sass (3.4.25) + sass-rails (5.0.6) + railties (>= 4.0.0, < 6) + sass (~> 3.1) + sprockets (>= 2.8, < 4.0) + sprockets-rails (>= 2.0, < 4.0) + tilt (>= 1.1, < 3) + selenium-webdriver (3.6.0) + childprocess (~> 0.5) + rubyzip (~> 1.0) + spring (2.0.2) + activesupport (>= 4.2) + spring-watcher-listen (2.0.1) + listen (>= 2.7, < 4.0) + spring (>= 1.2, < 3.0) + sprockets (3.7.1) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-es6 (0.9.2) + babel-source (>= 5.8.11) + babel-transpiler + sprockets (>= 3.0.0) + sprockets-rails (3.2.1) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) + thor (0.20.0) + thread_safe (0.3.6) + tilt (2.0.8) + turbolinks (5.0.1) + turbolinks-source (~> 5) + turbolinks-source (5.0.3) + tzinfo (1.2.3) + thread_safe (~> 0.1) + uglifier (3.2.0) + execjs (>= 0.3.0, < 3) + web-console (3.5.1) + actionview (>= 5.0) + activemodel (>= 5.0) + bindex (>= 0.4.0) + railties (>= 5.0) + websocket-driver (0.6.5) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.2) + xpath (2.1.0) + nokogiri (~> 1.3) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + byebug + capybara (~> 2.13) + foundation-rails (= 6.4.1.2) + jbuilder (~> 2.5) + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + pg (~> 0.18) + pry-rails + puma (~> 3.7) + rails (~> 5.1.4) + sass-rails (~> 5.0) + selenium-webdriver + spring + spring-watcher-listen (~> 2.0.0) + turbolinks (~> 5) + tzinfo-data + uglifier (>= 1.3.0) + web-console (>= 3.3.0) + +BUNDLED WITH + 1.16.0.pre.3 diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000000..e85f913914 --- /dev/null +++ b/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require_relative 'config/application' + +Rails.application.load_tasks diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 0000000000..b16e53d6d5 --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,3 @@ +//= link_tree ../images +//= link_directory ../javascripts .js +//= link_directory ../stylesheets .css diff --git a/app/assets/images/.keep b/app/assets/images/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js new file mode 100644 index 0000000000..4f2cc0f55a --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,18 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's +// vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. JavaScript code in this file should be added after the last require_* statement. +// +// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require rails-ujs +//= require foundation +//= require turbolinks +//= require_tree . + +$(function(){ $(document).foundation(); }); diff --git a/app/assets/javascripts/cable.js b/app/assets/javascripts/cable.js new file mode 100644 index 0000000000..739aa5f022 --- /dev/null +++ b/app/assets/javascripts/cable.js @@ -0,0 +1,13 @@ +// Action Cable provides the framework to deal with WebSockets in Rails. +// You can generate new channels where WebSocket features live using the `rails generate channel` command. +// +//= require action_cable +//= require_self +//= require_tree ./channels + +(function() { + this.App || (this.App = {}); + + App.cable = ActionCable.createConsumer(); + +}).call(this); diff --git a/app/assets/javascripts/channels/.keep b/app/assets/javascripts/channels/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss new file mode 100644 index 0000000000..b67ff00cdc --- /dev/null +++ b/app/assets/stylesheets/_settings.scss @@ -0,0 +1,863 @@ +// Foundation for Sites Settings +// ----------------------------- +// +// Table of Contents: +// +// 1. Global +// 2. Breakpoints +// 3. The Grid +// 4. Base Typography +// 5. Typography Helpers +// 6. Abide +// 7. Accordion +// 8. Accordion Menu +// 9. Badge +// 10. Breadcrumbs +// 11. Button +// 12. Button Group +// 13. Callout +// 14. Card +// 15. Close Button +// 16. Drilldown +// 17. Dropdown +// 18. Dropdown Menu +// 19. Flexbox Utilities +// 20. Forms +// 21. Label +// 22. Media Object +// 23. Menu +// 24. Meter +// 25. Off-canvas +// 26. Orbit +// 27. Pagination +// 28. Progress Bar +// 29. Prototype Arrow +// 30. Prototype Border-Box +// 31. Prototype Border-None +// 32. Prototype Bordered +// 33. Prototype Display +// 34. Prototype Font-Styling +// 35. Prototype List-Style-Type +// 36. Prototype Overflow +// 37. Prototype Position +// 38. Prototype Rounded +// 39. Prototype Separator +// 40. Prototype Shadow +// 41. Prototype Sizing +// 42. Prototype Spacing +// 43. Prototype Text-Decoration +// 44. Prototype Text-Transformation +// 45. Prototype Text-Utilities +// 46. Responsive Embed +// 47. Reveal +// 48. Slider +// 49. Switch +// 50. Table +// 51. Tabs +// 52. Thumbnail +// 53. Title Bar +// 54. Tooltip +// 55. Top Bar +// 56. Xy Grid + +@import 'util/util'; + +// 1. Global +// --------- + +$global-font-size: 100%; +$global-width: rem-calc(1200); +$global-lineheight: 1.5; +$foundation-palette: ( + primary: #1779ba, + secondary: #767676, + success: #3adb76, + warning: #ffae00, + alert: #cc4b37, +); +$light-gray: #e6e6e6; +$medium-gray: #cacaca; +$dark-gray: #8a8a8a; +$black: #0a0a0a; +$white: #fefefe; +$body-background: $white; +$body-font-color: $black; +$body-font-family: 'Helvetica Neue', Helvetica, Roboto, Arial, sans-serif; +$body-antialiased: true; +$global-margin: 1rem; +$global-padding: 1rem; +$global-position: 1rem; +$global-weight-normal: normal; +$global-weight-bold: bold; +$global-radius: 0; +$global-menu-padding: 0.7rem 1rem; +$global-menu-nested-margin: 1rem; +$global-text-direction: ltr; +$global-flexbox: true; +$global-prototype-breakpoints: false; +$global-color-pick-contrast-tolerance: 0; +$print-transparent-backgrounds: true; + +@include add-foundation-colors; + +// 2. Breakpoints +// -------------- + +$breakpoints: ( + small: 0, + medium: 640px, + large: 1024px, + xlarge: 1200px, + xxlarge: 1440px, +); +$print-breakpoint: large; +$breakpoint-classes: (small medium large); + +// 3. The Grid +// ----------- + +$grid-row-width: $global-width; +$grid-column-count: 12; +$grid-column-gutter: ( + small: 20px, + medium: 30px, +); +$grid-column-align-edge: true; +$grid-column-alias: 'columns'; +$block-grid-max: 8; + +// 4. Base Typography +// ------------------ + +$header-font-family: $body-font-family; +$header-font-weight: $global-weight-normal; +$header-font-style: normal; +$font-family-monospace: Consolas, 'Liberation Mono', Courier, monospace; +$header-color: inherit; +$header-lineheight: 1.4; +$header-margin-bottom: 0.5rem; +$header-styles: ( + small: ( + 'h1': ('font-size': 24), + 'h2': ('font-size': 20), + 'h3': ('font-size': 19), + 'h4': ('font-size': 18), + 'h5': ('font-size': 17), + 'h6': ('font-size': 16), + ), + medium: ( + 'h1': ('font-size': 48), + 'h2': ('font-size': 40), + 'h3': ('font-size': 31), + 'h4': ('font-size': 25), + 'h5': ('font-size': 20), + 'h6': ('font-size': 16), + ), +); +$header-text-rendering: optimizeLegibility; +$small-font-size: 80%; +$header-small-font-color: $medium-gray; +$paragraph-lineheight: 1.6; +$paragraph-margin-bottom: 1rem; +$paragraph-text-rendering: optimizeLegibility; +$code-color: $black; +$code-font-family: $font-family-monospace; +$code-font-weight: $global-weight-normal; +$code-background: $light-gray; +$code-border: 1px solid $medium-gray; +$code-padding: rem-calc(2 5 1); +$anchor-color: $primary-color; +$anchor-color-hover: scale-color($anchor-color, $lightness: -14%); +$anchor-text-decoration: none; +$anchor-text-decoration-hover: none; +$hr-width: $global-width; +$hr-border: 1px solid $medium-gray; +$hr-margin: rem-calc(20) auto; +$list-lineheight: $paragraph-lineheight; +$list-margin-bottom: $paragraph-margin-bottom; +$list-style-type: disc; +$list-style-position: outside; +$list-side-margin: 1.25rem; +$list-nested-side-margin: 1.25rem; +$defnlist-margin-bottom: 1rem; +$defnlist-term-weight: $global-weight-bold; +$defnlist-term-margin-bottom: 0.3rem; +$blockquote-color: $dark-gray; +$blockquote-padding: rem-calc(9 20 0 19); +$blockquote-border: 1px solid $medium-gray; +$cite-font-size: rem-calc(13); +$cite-color: $dark-gray; +$cite-pseudo-content: '\2014 \0020'; +$keystroke-font: $font-family-monospace; +$keystroke-color: $black; +$keystroke-background: $light-gray; +$keystroke-padding: rem-calc(2 4 0); +$keystroke-radius: $global-radius; +$abbr-underline: 1px dotted $black; + +// 5. Typography Helpers +// --------------------- + +$lead-font-size: $global-font-size * 1.25; +$lead-lineheight: 1.6; +$subheader-lineheight: 1.4; +$subheader-color: $dark-gray; +$subheader-font-weight: $global-weight-normal; +$subheader-margin-top: 0.2rem; +$subheader-margin-bottom: 0.5rem; +$stat-font-size: 2.5rem; + +// 6. Abide +// -------- + +$abide-inputs: true; +$abide-labels: true; +$input-background-invalid: get-color(alert); +$form-label-color-invalid: get-color(alert); +$input-error-color: get-color(alert); +$input-error-font-size: rem-calc(12); +$input-error-font-weight: $global-weight-bold; + +// 7. Accordion +// ------------ + +$accordion-background: $white; +$accordion-plusminus: true; +$accordion-title-font-size: rem-calc(12); +$accordion-item-color: $primary-color; +$accordion-item-background-hover: $light-gray; +$accordion-item-padding: 1.25rem 1rem; +$accordion-content-background: $white; +$accordion-content-border: 1px solid $light-gray; +$accordion-content-color: $body-font-color; +$accordion-content-padding: 1rem; + +// 8. Accordion Menu +// ----------------- + +$accordionmenu-padding: $global-menu-padding; +$accordionmenu-nested-margin: $global-menu-nested-margin; +$accordionmenu-submenu-padding: $accordionmenu-padding; +$accordionmenu-arrows: true; +$accordionmenu-arrow-color: $primary-color; +$accordionmenu-item-background: null; +$accordionmenu-border: null; +$accordionmenu-submenu-toggle-background: null; +$accordion-submenu-toggle-border: $accordionmenu-border; +$accordionmenu-submenu-toggle-width: 40px; +$accordionmenu-submenu-toggle-height: $accordionmenu-submenu-toggle-width; +$accordionmenu-arrow-size: 6px; + +// 9. Badge +// -------- + +$badge-background: $primary-color; +$badge-color: $white; +$badge-color-alt: $black; +$badge-palette: $foundation-palette; +$badge-padding: 0.3em; +$badge-minwidth: 2.1em; +$badge-font-size: 0.6rem; + +// 10. Breadcrumbs +// --------------- + +$breadcrumbs-margin: 0 0 $global-margin 0; +$breadcrumbs-item-font-size: rem-calc(11); +$breadcrumbs-item-color: $primary-color; +$breadcrumbs-item-color-current: $black; +$breadcrumbs-item-color-disabled: $medium-gray; +$breadcrumbs-item-margin: 0.75rem; +$breadcrumbs-item-uppercase: true; +$breadcrumbs-item-separator: true; +$breadcrumbs-item-separator-item: '/'; +$breadcrumbs-item-separator-item-rtl: '\\'; +$breadcrumbs-item-separator-color: $medium-gray; + +// 11. Button +// ---------- + +$button-font-family: inherit; +$button-padding: 0.85em 1em; +$button-margin: 0 0 $global-margin 0; +$button-fill: solid; +$button-background: $primary-color; +$button-background-hover: scale-color($button-background, $lightness: -15%); +$button-color: $white; +$button-color-alt: $black; +$button-radius: $global-radius; +$button-hollow-border-width: 1px; +$button-sizes: ( + tiny: 0.6rem, + small: 0.75rem, + default: 0.9rem, + large: 1.25rem, +); +$button-palette: $foundation-palette; +$button-opacity-disabled: 0.25; +$button-background-hover-lightness: -20%; +$button-hollow-hover-lightness: -50%; +$button-transition: background-color 0.25s ease-out, color 0.25s ease-out; + +// 12. Button Group +// ---------------- + +$buttongroup-margin: 1rem; +$buttongroup-spacing: 1px; +$buttongroup-child-selector: '.button'; +$buttongroup-expand-max: 6; +$buttongroup-radius-on-each: true; + +// 13. Callout +// ----------- + +$callout-background: $white; +$callout-background-fade: 85%; +$callout-border: 1px solid rgba($black, 0.25); +$callout-margin: 0 0 1rem 0; +$callout-padding: 1rem; +$callout-font-color: $body-font-color; +$callout-font-color-alt: $body-background; +$callout-radius: $global-radius; +$callout-link-tint: 30%; + +// 14. Card +// -------- + +$card-background: $white; +$card-font-color: $body-font-color; +$card-divider-background: $light-gray; +$card-border: 1px solid $light-gray; +$card-shadow: none; +$card-border-radius: $global-radius; +$card-padding: $global-padding; +$card-margin-bottom: $global-margin; + +// 15. Close Button +// ---------------- + +$closebutton-position: right top; +$closebutton-offset-horizontal: ( + small: 0.66rem, + medium: 1rem, +); +$closebutton-offset-vertical: ( + small: 0.33em, + medium: 0.5rem, +); +$closebutton-size: ( + small: 1.5em, + medium: 2em, +); +$closebutton-lineheight: 1; +$closebutton-color: $dark-gray; +$closebutton-color-hover: $black; + +// 16. Drilldown +// ------------- + +$drilldown-transition: transform 0.15s linear; +$drilldown-arrows: true; +$drilldown-padding: $global-menu-padding; +$drilldown-nested-margin: 0; +$drilldown-background: $white; +$drilldown-submenu-padding: $drilldown-padding; +$drilldown-submenu-background: $white; +$drilldown-arrow-color: $primary-color; +$drilldown-arrow-size: 6px; + +// 17. Dropdown +// ------------ + +$dropdown-padding: 1rem; +$dropdown-background: $body-background; +$dropdown-border: 1px solid $medium-gray; +$dropdown-font-size: 1rem; +$dropdown-width: 300px; +$dropdown-radius: $global-radius; +$dropdown-sizes: ( + tiny: 100px, + small: 200px, + large: 400px, +); + +// 18. Dropdown Menu +// ----------------- + +$dropdownmenu-arrows: true; +$dropdownmenu-arrow-color: $anchor-color; +$dropdownmenu-arrow-size: 6px; +$dropdownmenu-arrow-padding: 1.5rem; +$dropdownmenu-min-width: 200px; +$dropdownmenu-background: $white; +$dropdownmenu-submenu-background: $dropdownmenu-background; +$dropdownmenu-padding: $global-menu-padding; +$dropdownmenu-nested-margin: 0; +$dropdownmenu-submenu-padding: $dropdownmenu-padding; +$dropdownmenu-border: 1px solid $medium-gray; +$dropdown-menu-item-color-active: get-color(primary); +$dropdown-menu-item-background-active: transparent; + +// 19. Flexbox Utilities +// --------------------- + +$flex-source-ordering-count: 6; +$flexbox-responsive-breakpoints: true; + +// 20. Forms +// --------- + +$fieldset-border: 1px solid $medium-gray; +$fieldset-padding: rem-calc(20); +$fieldset-margin: rem-calc(18 0); +$legend-padding: rem-calc(0 3); +$form-spacing: rem-calc(16); +$helptext-color: $black; +$helptext-font-size: rem-calc(13); +$helptext-font-style: italic; +$input-prefix-color: $black; +$input-prefix-background: $light-gray; +$input-prefix-border: 1px solid $medium-gray; +$input-prefix-padding: 1rem; +$form-label-color: $black; +$form-label-font-size: rem-calc(14); +$form-label-font-weight: $global-weight-normal; +$form-label-line-height: 1.8; +$select-background: $white; +$select-triangle-color: $dark-gray; +$select-radius: $global-radius; +$input-color: $black; +$input-placeholder-color: $medium-gray; +$input-font-family: inherit; +$input-font-size: rem-calc(16); +$input-font-weight: $global-weight-normal; +$input-line-height: $global-lineheight; +$input-background: $white; +$input-background-focus: $white; +$input-background-disabled: $light-gray; +$input-border: 1px solid $medium-gray; +$input-border-focus: 1px solid $dark-gray; +$input-padding: $form-spacing / 2; +$input-shadow: inset 0 1px 2px rgba($black, 0.1); +$input-shadow-focus: 0 0 5px $medium-gray; +$input-cursor-disabled: not-allowed; +$input-transition: box-shadow 0.5s, border-color 0.25s ease-in-out; +$input-number-spinners: true; +$input-radius: $global-radius; +$form-button-radius: $global-radius; + +// 21. Label +// --------- + +$label-background: $primary-color; +$label-color: $white; +$label-color-alt: $black; +$label-palette: $foundation-palette; +$label-font-size: 0.8rem; +$label-padding: 0.33333rem 0.5rem; +$label-radius: $global-radius; + +// 22. Media Object +// ---------------- + +$mediaobject-margin-bottom: $global-margin; +$mediaobject-section-padding: $global-padding; +$mediaobject-image-width-stacked: 100%; + +// 23. Menu +// -------- + +$menu-margin: 0; +$menu-nested-margin: $global-menu-nested-margin; +$menu-items-padding: $global-menu-padding; +$menu-simple-margin: 1rem; +$menu-item-color-active: $white; +$menu-item-background-active: get-color(primary); +$menu-icon-spacing: 0.25rem; +$menu-item-background-hover: $light-gray; +$menu-state-back-compat: true; +$menu-centered-back-compat: true; + +// 24. Meter +// --------- + +$meter-height: 1rem; +$meter-radius: $global-radius; +$meter-background: $medium-gray; +$meter-fill-good: $success-color; +$meter-fill-medium: $warning-color; +$meter-fill-bad: $alert-color; + +// 25. Off-canvas +// -------------- + +$offcanvas-size: 250px; +$offcanvas-vertical-size: 250px; +$offcanvas-background: $light-gray; +$offcanvas-shadow: 0 0 10px rgba($black, 0.7); +$offcanvas-inner-shadow-size: 20px; +$offcanvas-inner-shadow-color: rgba($black, 0.25); +$offcanvas-overlay-zindex: 11; +$offcanvas-push-zindex: 12; +$offcanvas-overlap-zindex: 13; +$offcanvas-reveal-zindex: 12; +$offcanvas-transition-length: 0.5s; +$offcanvas-transition-timing: ease; +$offcanvas-fixed-reveal: true; +$offcanvas-exit-background: rgba($white, 0.25); +$maincontent-class: 'off-canvas-content'; + +// 26. Orbit +// --------- + +$orbit-bullet-background: $medium-gray; +$orbit-bullet-background-active: $dark-gray; +$orbit-bullet-diameter: 1.2rem; +$orbit-bullet-margin: 0.1rem; +$orbit-bullet-margin-top: 0.8rem; +$orbit-bullet-margin-bottom: 0.8rem; +$orbit-caption-background: rgba($black, 0.5); +$orbit-caption-padding: 1rem; +$orbit-control-background-hover: rgba($black, 0.5); +$orbit-control-padding: 1rem; +$orbit-control-zindex: 10; + +// 27. Pagination +// -------------- + +$pagination-font-size: rem-calc(14); +$pagination-margin-bottom: $global-margin; +$pagination-item-color: $black; +$pagination-item-padding: rem-calc(3 10); +$pagination-item-spacing: rem-calc(1); +$pagination-radius: $global-radius; +$pagination-item-background-hover: $light-gray; +$pagination-item-background-current: $primary-color; +$pagination-item-color-current: $white; +$pagination-item-color-disabled: $medium-gray; +$pagination-ellipsis-color: $black; +$pagination-mobile-items: false; +$pagination-mobile-current-item: false; +$pagination-arrows: true; + +// 28. Progress Bar +// ---------------- + +$progress-height: 1rem; +$progress-background: $medium-gray; +$progress-margin-bottom: $global-margin; +$progress-meter-background: $primary-color; +$progress-radius: $global-radius; + +// 29. Prototype Arrow +// ------------------- + +$prototype-arrow-directions: ( + down, + up, + right, + left +); +$prototype-arrow-size: 0.4375rem; +$prototype-arrow-color: $black; + +// 30. Prototype Border-Box +// ------------------------ + +$prototype-border-box-breakpoints: $global-prototype-breakpoints; + +// 31. Prototype Border-None +// ------------------------- + +$prototype-border-none-breakpoints: $global-prototype-breakpoints; + +// 32. Prototype Bordered +// ---------------------- + +$prototype-bordered-breakpoints: $global-prototype-breakpoints; +$prototype-border-width: rem-calc(1); +$prototype-border-type: solid; +$prototype-border-color: $medium-gray; + +// 33. Prototype Display +// --------------------- + +$prototype-display-breakpoints: $global-prototype-breakpoints; +$prototype-display: ( + inline, + inline-block, + block, + table, + table-cell +); + +// 34. Prototype Font-Styling +// -------------------------- + +$prototype-font-breakpoints: $global-prototype-breakpoints; +$prototype-wide-letter-spacing: rem-calc(4); +$prototype-font-normal: $global-weight-normal; +$prototype-font-bold: $global-weight-bold; + +// 35. Prototype List-Style-Type +// ----------------------------- + +$prototype-list-breakpoints: $global-prototype-breakpoints; +$prototype-style-type-unordered: ( + disc, + circle, + square +); +$prototype-style-type-ordered: ( + decimal, + lower-alpha, + lower-latin, + lower-roman, + upper-alpha, + upper-latin, + upper-roman +); + +// 36. Prototype Overflow +// ---------------------- + +$prototype-overflow-breakpoints: $global-prototype-breakpoints; +$prototype-overflow: ( + visible, + hidden, + scroll +); + +// 37. Prototype Position +// ---------------------- + +$prototype-position-breakpoints: $global-prototype-breakpoints; +$prototype-position: ( + static, + relative, + absolute, + fixed +); +$prototype-position-z-index: 975; + +// 38. Prototype Rounded +// --------------------- + +$prototype-rounded-breakpoints: $global-prototype-breakpoints; +$prototype-border-radius: rem-calc(3); + +// 39. Prototype Separator +// ----------------------- + +$prototype-separator-breakpoints: $global-prototype-breakpoints; +$prototype-separator-align: center; +$prototype-separator-height: rem-calc(2); +$prototype-separator-width: 3rem; +$prototype-separator-background: $primary-color; +$prototype-separator-margin-top: $global-margin; + +// 40. Prototype Shadow +// -------------------- + +$prototype-shadow-breakpoints: $global-prototype-breakpoints; +$prototype-box-shadow: 0 2px 5px 0 rgba(0,0,0,.16), + 0 2px 10px 0 rgba(0,0,0,.12); + +// 41. Prototype Sizing +// -------------------- + +$prototype-sizing-breakpoints: $global-prototype-breakpoints; +$prototype-sizing: ( + width, + height +); +$prototype-sizes: ( + 25: 25%, + 50: 50%, + 75: 75%, + 100: 100% +); + +// 42. Prototype Spacing +// --------------------- + +$prototype-spacing-breakpoints: $global-prototype-breakpoints; +$prototype-spacers-count: 3; + +// 43. Prototype Text-Decoration +// ----------------------------- + +$prototype-decoration-breakpoints: $global-prototype-breakpoints; +$prototype-text-decoration: ( + overline, + underline, + line-through, +); + +// 44. Prototype Text-Transformation +// --------------------------------- + +$prototype-transformation-breakpoints: $global-prototype-breakpoints; +$prototype-text-transformation: ( + lowercase, + uppercase, + capitalize +); + +// 45. Prototype Text-Utilities +// ---------------------------- + +$prototype-utilities-breakpoints: $global-prototype-breakpoints; +$prototype-text-overflow: ellipsis; + +// 46. Responsive Embed +// -------------------- + +$responsive-embed-margin-bottom: rem-calc(16); +$responsive-embed-ratios: ( + default: 4 by 3, + widescreen: 16 by 9, +); + +// 47. Reveal +// ---------- + +$reveal-background: $white; +$reveal-width: 600px; +$reveal-max-width: $global-width; +$reveal-padding: $global-padding; +$reveal-border: 1px solid $medium-gray; +$reveal-radius: $global-radius; +$reveal-zindex: 1005; +$reveal-overlay-background: rgba($black, 0.45); + +// 48. Slider +// ---------- + +$slider-width-vertical: 0.5rem; +$slider-transition: all 0.2s ease-in-out; +$slider-height: 0.5rem; +$slider-background: $light-gray; +$slider-fill-background: $medium-gray; +$slider-handle-height: 1.4rem; +$slider-handle-width: 1.4rem; +$slider-handle-background: $primary-color; +$slider-opacity-disabled: 0.25; +$slider-radius: $global-radius; + +// 49. Switch +// ---------- + +$switch-background: $medium-gray; +$switch-background-active: $primary-color; +$switch-height: 2rem; +$switch-height-tiny: 1.5rem; +$switch-height-small: 1.75rem; +$switch-height-large: 2.5rem; +$switch-radius: $global-radius; +$switch-margin: $global-margin; +$switch-paddle-background: $white; +$switch-paddle-offset: 0.25rem; +$switch-paddle-radius: $global-radius; +$switch-paddle-transition: all 0.25s ease-out; + +// 50. Table +// --------- + +$table-background: $white; +$table-color-scale: 5%; +$table-border: 1px solid smart-scale($table-background, $table-color-scale); +$table-padding: rem-calc(8 10 10); +$table-hover-scale: 2%; +$table-row-hover: darken($table-background, $table-hover-scale); +$table-row-stripe-hover: darken($table-background, $table-color-scale + $table-hover-scale); +$table-is-striped: true; +$table-striped-background: smart-scale($table-background, $table-color-scale); +$table-stripe: even; +$table-head-background: smart-scale($table-background, $table-color-scale / 2); +$table-head-row-hover: darken($table-head-background, $table-hover-scale); +$table-foot-background: smart-scale($table-background, $table-color-scale); +$table-foot-row-hover: darken($table-foot-background, $table-hover-scale); +$table-head-font-color: $body-font-color; +$table-foot-font-color: $body-font-color; +$show-header-for-stacked: false; +$table-stack-breakpoint: medium; + +// 51. Tabs +// -------- + +$tab-margin: 0; +$tab-background: $white; +$tab-color: $primary-color; +$tab-background-active: $light-gray; +$tab-active-color: $primary-color; +$tab-item-font-size: rem-calc(12); +$tab-item-background-hover: $white; +$tab-item-padding: 1.25rem 1.5rem; +$tab-expand-max: 6; +$tab-content-background: $white; +$tab-content-border: $light-gray; +$tab-content-color: $body-font-color; +$tab-content-padding: 1rem; + +// 52. Thumbnail +// ------------- + +$thumbnail-border: solid 4px $white; +$thumbnail-margin-bottom: $global-margin; +$thumbnail-shadow: 0 0 0 1px rgba($black, 0.2); +$thumbnail-shadow-hover: 0 0 6px 1px rgba($primary-color, 0.5); +$thumbnail-transition: box-shadow 200ms ease-out; +$thumbnail-radius: $global-radius; + +// 53. Title Bar +// ------------- + +$titlebar-background: $black; +$titlebar-color: $white; +$titlebar-padding: 0.5rem; +$titlebar-text-font-weight: bold; +$titlebar-icon-color: $white; +$titlebar-icon-color-hover: $medium-gray; +$titlebar-icon-spacing: 0.25rem; + +// 54. Tooltip +// ----------- + +$has-tip-cursor: help; +$has-tip-font-weight: $global-weight-bold; +$has-tip-border-bottom: dotted 1px $dark-gray; +$tooltip-background-color: $black; +$tooltip-color: $white; +$tooltip-padding: 0.75rem; +$tooltip-max-width: 10rem; +$tooltip-font-size: $small-font-size; +$tooltip-pip-width: 0.75rem; +$tooltip-pip-height: $tooltip-pip-width * 0.866; +$tooltip-radius: $global-radius; + +// 55. Top Bar +// ----------- + +$topbar-padding: 0.5rem; +$topbar-background: $light-gray; +$topbar-submenu-background: $topbar-background; +$topbar-title-spacing: 0.5rem 1rem 0.5rem 0; +$topbar-input-width: 200px; +$topbar-unstack-breakpoint: medium; + +// 56. Xy Grid +// ----------- + +$xy-grid: true; +$grid-container: $global-width; +$grid-columns: 12; +$grid-margin-gutters: ( + small: 20px, + medium: 30px +); +$grid-padding-gutters: $grid-margin-gutters; +$grid-container-padding: $grid-padding-gutters; +$grid-container-max: $global-width; +$block-grid-max: 8; + diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..a152282fce --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,17 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's + * vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS + * files in this directory. Styles in this file should be added after the last require_* statement. + * It is generally better to create a new file per style scope. + * + *= require_tree . + *= require_self + *= require foundation_and_overrides + + */ diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss new file mode 100644 index 0000000000..7b55083cfb --- /dev/null +++ b/app/assets/stylesheets/foundation_and_overrides.scss @@ -0,0 +1,57 @@ +@charset 'utf-8'; + +@import 'settings'; +@import 'foundation'; + +// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. +// +// @import 'motion-ui/motion-ui'; + +// We include everything by default. To slim your CSS, remove components you don't use. + +@include foundation-global-styles; +@include foundation-grid; +@include foundation-typography; +@include foundation-button; +@include foundation-forms; +@include foundation-visibility-classes; +@include foundation-float-classes; +@include foundation-accordion; +@include foundation-accordion-menu; +@include foundation-badge; +@include foundation-breadcrumbs; +@include foundation-button-group; +@include foundation-callout; +@include foundation-card; +@include foundation-close-button; +@include foundation-drilldown-menu; +@include foundation-dropdown; +@include foundation-dropdown-menu; +@include foundation-responsive-embed; +@include foundation-label; +@include foundation-media-object; +@include foundation-menu; +@include foundation-menu-icon; +@include foundation-off-canvas; +@include foundation-orbit; +@include foundation-pagination; +@include foundation-progress-bar; +@include foundation-slider; +@include foundation-sticky; +@include foundation-reveal; +@include foundation-switch; +@include foundation-table; +@include foundation-tabs; +@include foundation-thumbnail; +@include foundation-title-bar; +@include foundation-tooltip; +@include foundation-top-bar; + +// If you'd like to include motion-ui the foundation-rails gem comes prepackaged with it, uncomment the 3 @imports, if you are not using the gem you need to install the motion-ui sass package. +// +// @include motion-ui-transitions; +// @include motion-ui-animations; + @import 'motion-ui/motion-ui'; + @include motion-ui-transitions; + @include motion-ui-animations; + diff --git a/app/channels/application_cable/channel.rb b/app/channels/application_cable/channel.rb new file mode 100644 index 0000000000..d672697283 --- /dev/null +++ b/app/channels/application_cable/channel.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Channel < ActionCable::Channel::Base + end +end diff --git a/app/channels/application_cable/connection.rb b/app/channels/application_cable/connection.rb new file mode 100644 index 0000000000..0ff5442f47 --- /dev/null +++ b/app/channels/application_cable/connection.rb @@ -0,0 +1,4 @@ +module ApplicationCable + class Connection < ActionCable::Connection::Base + end +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 0000000000..1c07694e9d --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,3 @@ +class ApplicationController < ActionController::Base + protect_from_forgery with: :exception +end diff --git a/app/controllers/concerns/.keep b/app/controllers/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 0000000000..de6be7945c --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/app/jobs/application_job.rb b/app/jobs/application_job.rb new file mode 100644 index 0000000000..a009ace51c --- /dev/null +++ b/app/jobs/application_job.rb @@ -0,0 +1,2 @@ +class ApplicationJob < ActiveJob::Base +end diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb new file mode 100644 index 0000000000..286b2239d1 --- /dev/null +++ b/app/mailers/application_mailer.rb @@ -0,0 +1,4 @@ +class ApplicationMailer < ActionMailer::Base + default from: 'from@example.com' + layout 'mailer' +end diff --git a/app/models/application_record.rb b/app/models/application_record.rb new file mode 100644 index 0000000000..10a4cba84d --- /dev/null +++ b/app/models/application_record.rb @@ -0,0 +1,3 @@ +class ApplicationRecord < ActiveRecord::Base + self.abstract_class = true +end diff --git a/app/models/concerns/.keep b/app/models/concerns/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb new file mode 100644 index 0000000000..cd60004891 --- /dev/null +++ b/app/views/layouts/application.html.erb @@ -0,0 +1,19 @@ + + + + + + + <%= content_for?(:title) ? yield(:title) : "Untitled" %> + + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + + + + <%= yield %> + + + diff --git a/app/views/layouts/mailer.html.erb b/app/views/layouts/mailer.html.erb new file mode 100644 index 0000000000..cbd34d2e9d --- /dev/null +++ b/app/views/layouts/mailer.html.erb @@ -0,0 +1,13 @@ + + + + + + + + + <%= yield %> + + diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb new file mode 100644 index 0000000000..37f0bddbd7 --- /dev/null +++ b/app/views/layouts/mailer.text.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/bin/bundle b/bin/bundle new file mode 100755 index 0000000000..66e9889e8b --- /dev/null +++ b/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/bin/rails b/bin/rails new file mode 100755 index 0000000000..5badb2fde0 --- /dev/null +++ b/bin/rails @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +APP_PATH = File.expand_path('../config/application', __dir__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/bin/rake b/bin/rake new file mode 100755 index 0000000000..d87d5f5781 --- /dev/null +++ b/bin/rake @@ -0,0 +1,9 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000000..78c4e861dc --- /dev/null +++ b/bin/setup @@ -0,0 +1,38 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + # Install JavaScript dependencies if using Yarn + # system('bin/yarn') + + + # puts "\n== Copying sample files ==" + # unless File.exist?('config/database.yml') + # cp 'config/database.yml.sample', 'config/database.yml' + # end + + puts "\n== Preparing database ==" + system! 'bin/rails db:setup' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/spring b/bin/spring new file mode 100755 index 0000000000..fb2ec2ebb4 --- /dev/null +++ b/bin/spring @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file loads spring without using Bundler, in order to be fast. +# It gets overwritten when you run the `spring binstub` command. + +unless defined?(Spring) + require 'rubygems' + require 'bundler' + + lockfile = Bundler::LockfileParser.new(Bundler.default_lockfile.read) + spring = lockfile.specs.detect { |spec| spec.name == "spring" } + if spring + Gem.use_paths Gem.dir, Bundler.bundle_path.to_s, *Gem.path + gem 'spring', spring.version + require 'spring/binstub' + end +end diff --git a/bin/update b/bin/update new file mode 100755 index 0000000000..a8e4462f20 --- /dev/null +++ b/bin/update @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' +require 'fileutils' +include FileUtils + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +def system!(*args) + system(*args) || abort("\n== Command #{args} failed ==") +end + +chdir APP_ROOT do + # This script is a way to update your development environment automatically. + # Add necessary update steps to this file. + + puts '== Installing dependencies ==' + system! 'gem install bundler --conservative' + system('bundle check') || system!('bundle install') + + puts "\n== Updating database ==" + system! 'bin/rails db:migrate' + + puts "\n== Removing old logs and tempfiles ==" + system! 'bin/rails log:clear tmp:clear' + + puts "\n== Restarting application server ==" + system! 'bin/rails restart' +end diff --git a/bin/yarn b/bin/yarn new file mode 100755 index 0000000000..c2bacef836 --- /dev/null +++ b/bin/yarn @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +VENDOR_PATH = File.expand_path('..', __dir__) +Dir.chdir(VENDOR_PATH) do + begin + exec "yarnpkg #{ARGV.join(" ")}" + rescue Errno::ENOENT + $stderr.puts "Yarn executable was not detected in the system." + $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" + exit 1 + end +end diff --git a/config.ru b/config.ru new file mode 100644 index 0000000000..f7ba0b527b --- /dev/null +++ b/config.ru @@ -0,0 +1,5 @@ +# This file is used by Rack-based servers to start the application. + +require_relative 'config/environment' + +run Rails.application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 0000000000..af9b19982d --- /dev/null +++ b/config/application.rb @@ -0,0 +1,25 @@ +require_relative 'boot' + +require 'rails/all' + +# Require the gems listed in Gemfile, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(*Rails.groups) + +module Betsy + class Application < Rails::Application + config.generators do |g| + # Force new test files to be generated in the minitest-spec style + g.test_framework :minitest, spec: true + + # Always use .js files, never .coffee + g.javascript_engine :js + end + # Initialize configuration defaults for originally generated Rails version. + config.load_defaults 5.1 + + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + end +end diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000000..30f5120df6 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,3 @@ +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) + +require 'bundler/setup' # Set up gems listed in the Gemfile. diff --git a/config/cable.yml b/config/cable.yml new file mode 100644 index 0000000000..3cba994bb2 --- /dev/null +++ b/config/cable.yml @@ -0,0 +1,10 @@ +development: + adapter: async + +test: + adapter: async + +production: + adapter: redis + url: redis://localhost:6379/1 + channel_prefix: betsy_production diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 0000000000..6903bb6083 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,85 @@ +# PostgreSQL. Versions 9.1 and up are supported. +# +# Install the pg driver: +# gem install pg +# On OS X with Homebrew: +# gem install pg -- --with-pg-config=/usr/local/bin/pg_config +# On OS X with MacPorts: +# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config +# On Windows: +# gem install pg +# Choose the win32 build. +# Install PostgreSQL and put its /bin directory on your path. +# +# Configure Using Gemfile +# gem 'pg' +# +default: &default + adapter: postgresql + encoding: unicode + # For details on connection pooling, see Rails configuration guide + # http://guides.rubyonrails.org/configuring.html#database-pooling + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + +development: + <<: *default + database: betsy_development + + # The specified database role being used to connect to postgres. + # To create additional roles in postgres see `$ createuser --help`. + # When left blank, postgres will use the default role. This is + # the same name as the operating system user that initialized the database. + #username: betsy + + # The password associated with the postgres role (username). + #password: + + # Connect on a TCP socket. Omitted by default since the client uses a + # domain socket that doesn't need configuration. Windows does not have + # domain sockets, so uncomment these lines. + #host: localhost + + # The TCP port the server listens on. Defaults to 5432. + # If your server runs on a different port number, change accordingly. + #port: 5432 + + # Schema search path. The server defaults to $user,public + #schema_search_path: myapp,sharedapp,public + + # Minimum log levels, in increasing order: + # debug5, debug4, debug3, debug2, debug1, + # log, notice, warning, error, fatal, and panic + # Defaults to warning. + #min_messages: notice + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: betsy_test + +# As with config/secrets.yml, you never want to store sensitive information, +# like your database password, in your source code. If your source code is +# ever seen by anyone, they now have access to your database. +# +# Instead, provide the password as a unix environment variable when you boot +# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database +# for a full rundown on how to provide these environment variables in a +# production deployment. +# +# On Heroku and other platform providers, you may have a full connection URL +# available as an environment variable. For example: +# +# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase" +# +# You can use this database configuration with: +# +# production: +# url: <%= ENV['DATABASE_URL'] %> +# +production: + <<: *default + database: betsy_production + username: betsy + password: <%= ENV['BETSY_DATABASE_PASSWORD'] %> diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 0000000000..426333bb46 --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require_relative 'application' + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 0000000000..5187e22186 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,54 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports. + config.consider_all_requests_local = true + + # Enable/disable caching. By default caching is disabled. + if Rails.root.join('tmp/caching-dev.txt').exist? + config.action_controller.perform_caching = true + + config.cache_store = :memory_store + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{2.days.seconds.to_i}" + } + else + config.action_controller.perform_caching = false + + config.cache_store = :null_store + end + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + config.action_mailer.perform_caching = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Suppress logger output for asset requests. + config.assets.quiet = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true + + # Use an evented file watcher to asynchronously detect changes in source code, + # routes, locales, etc. This feature depends on the listen gem. + config.file_watcher = ActiveSupport::EventedFileUpdateChecker +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 0000000000..9284f84839 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,91 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Attempt to read encrypted secrets from `config/secrets.yml.enc`. + # Requires an encryption key in `ENV["RAILS_MASTER_KEY"]` or + # `config/secrets.yml.key`. + config.read_encrypted_secrets = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + config.log_tags = [ :request_id ] + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Use a real queuing backend for Active Job (and separate queues per environment) + # config.active_job.queue_adapter = :resque + # config.active_job.queue_name_prefix = "betsy_#{Rails.env}" + config.action_mailer.perform_caching = false + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Use a different logger for distributed setups. + # require 'syslog/logger' + # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') + + if ENV["RAILS_LOG_TO_STDOUT"].present? + logger = ActiveSupport::Logger.new(STDOUT) + logger.formatter = config.log_formatter + config.logger = ActiveSupport::TaggedLogging.new(logger) + end + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 0000000000..8e5cbde533 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure public file server for tests with Cache-Control for performance. + config.public_file_server.enabled = true + config.public_file_server.headers = { + 'Cache-Control' => "public, max-age=#{1.hour.seconds.to_i}" + } + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + config.action_mailer.perform_caching = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb new file mode 100644 index 0000000000..89d2efab2b --- /dev/null +++ b/config/initializers/application_controller_renderer.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +# ActiveSupport::Reloader.to_prepare do +# ApplicationController.renderer.defaults.merge!( +# http_host: 'example.org', +# https: false +# ) +# end diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb new file mode 100644 index 0000000000..4b828e80cb --- /dev/null +++ b/config/initializers/assets.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path. +# Rails.application.config.assets.paths << Emoji.images_path +# Add Yarn node_modules folder to the asset load path. +Rails.application.config.assets.paths << Rails.root.join('node_modules') + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in the app/assets +# folder are already added. +# Rails.application.config.assets.precompile += %w( admin.js admin.css ) diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 0000000000..59385cdf37 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb new file mode 100644 index 0000000000..5a6a32d371 --- /dev/null +++ b/config/initializers/cookies_serializer.rb @@ -0,0 +1,5 @@ +# Be sure to restart your server when you modify this file. + +# Specify a serializer for the signed and encrypted cookie jars. +# Valid options are :json, :marshal, and :hybrid. +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb new file mode 100644 index 0000000000..4a994e1e7b --- /dev/null +++ b/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 0000000000..ac033bf9dc --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 0000000000..dc1899682b --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb new file mode 100644 index 0000000000..bbfc3961bf --- /dev/null +++ b/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 0000000000..decc5a8573 --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,33 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# The following keys must be escaped otherwise they will not be retrieved by +# the default I18n backend: +# +# true, false, on, off, yes, no +# +# Instead, surround them with single quotes. +# +# en: +# 'true': 'foo' +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 0000000000..1e19380dcb --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,56 @@ +# Puma can serve each request in a thread from an internal thread pool. +# The `threads` method setting takes two numbers: a minimum and maximum. +# Any libraries that use thread pools should be configured to match +# the maximum value specified for Puma. Default is set to 5 threads for minimum +# and maximum; this matches the default thread size of Active Record. +# +threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +threads threads_count, threads_count + +# Specifies the `port` that Puma will listen on to receive requests; default is 3000. +# +port ENV.fetch("PORT") { 3000 } + +# Specifies the `environment` that Puma will run in. +# +environment ENV.fetch("RAILS_ENV") { "development" } + +# Specifies the number of `workers` to boot in clustered mode. +# Workers are forked webserver processes. If using threads and workers together +# the concurrency of the application would be max `threads` * `workers`. +# Workers do not work on JRuby or Windows (both of which do not support +# processes). +# +# workers ENV.fetch("WEB_CONCURRENCY") { 2 } + +# Use the `preload_app!` method when specifying a `workers` number. +# This directive tells Puma to first boot the application and load code +# before forking the application. This takes advantage of Copy On Write +# process behavior so workers use less memory. If you use this option +# you need to make sure to reconnect any threads in the `on_worker_boot` +# block. +# +# preload_app! + +# If you are preloading your application and using Active Record, it's +# recommended that you close any connections to the database before workers +# are forked to prevent connection leakage. +# +# before_fork do +# ActiveRecord::Base.connection_pool.disconnect! if defined?(ActiveRecord) +# end + +# The code in the `on_worker_boot` will be called if you are using +# clustered mode by specifying a number of `workers`. After each worker +# process is booted, this block will be run. If you are using the `preload_app!` +# option, you will want to use this block to reconnect to any threads +# or connections that may have been created at application boot, as Ruby +# cannot share connections between processes. +# +# on_worker_boot do +# ActiveRecord::Base.establish_connection if defined?(ActiveRecord) +# end +# + +# Allow puma to be restarted by `rails restart` command. +plugin :tmp_restart diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 0000000000..787824f888 --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,3 @@ +Rails.application.routes.draw do + # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html +end diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 0000000000..72b9e72e41 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,32 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rails secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +# Shared secrets are available across all environments. + +# shared: +# api_key: a1B2c3D4e5F6 + +# Environmental secrets are only available for that specific environment. + +development: + secret_key_base: d8797e95f21baa346e31bb4faa5dcea245a15a27f2ded487fc5d4ade2c6e74b160fb66be42573345b02d608424a56e6282b69803cb7236738bc220dd3cfa9905 + +test: + secret_key_base: 27c6cf01738639692c9961e53a4110dc2a2c272aed16e8db3e4dd109fd4d47f4d68a2008b12795a9b5b493ed29293839e838ed9ef597b85343941e1782a9f291 + +# Do not keep production secrets in the unencrypted secrets file. +# Instead, either read values from the environment. +# Or, use `bin/rails secrets:setup` to configure encrypted secrets +# and move the `production:` environment over there. + +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/config/spring.rb b/config/spring.rb new file mode 100644 index 0000000000..c9119b40c0 --- /dev/null +++ b/config/spring.rb @@ -0,0 +1,6 @@ +%w( + .ruby-version + .rbenv-vars + tmp/restart.txt + tmp/caching-dev.txt +).each { |path| Spring.watch(path) } diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 0000000000..1beea2accd --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,7 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). +# +# Examples: +# +# movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) +# Character.create(name: 'Luke', movie: movies.first) diff --git a/lib/assets/.keep b/lib/assets/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/tasks/.keep b/lib/tasks/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/log/.keep b/log/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package.json b/package.json new file mode 100644 index 0000000000..f874acf437 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "betsy", + "private": true, + "dependencies": {} +} diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000000..2be3af26fc --- /dev/null +++ b/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 0000000000..c08eac0d1d --- /dev/null +++ b/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 0000000000..78a030af22 --- /dev/null +++ b/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000..e69de29bb2 diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000000..37b576a4a0 --- /dev/null +++ b/public/robots.txt @@ -0,0 +1 @@ +# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb new file mode 100644 index 0000000000..d19212abd5 --- /dev/null +++ b/test/application_system_test_case.rb @@ -0,0 +1,5 @@ +require "test_helper" + +class ApplicationSystemTestCase < ActionDispatch::SystemTestCase + driven_by :selenium, using: :chrome, screen_size: [1400, 1400] +end diff --git a/test/controllers/.keep b/test/controllers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/.keep b/test/fixtures/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/fixtures/files/.keep b/test/fixtures/files/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/helpers/.keep b/test/helpers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/integration/.keep b/test/integration/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/mailers/.keep b/test/mailers/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/.keep b/test/models/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/system/.keep b/test/system/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000000..e2aed7c1a9 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,25 @@ +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../config/environment", __FILE__) +require "rails/test_help" +require "minitest/rails" require "minitest/reporters" # for Colorized output + + # For colorful output! + Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter + ) + + +# To add Capybara feature tests add `gem "minitest-rails-capybara"` +# to the test group in the Gemfile and uncomment the following: +# require "minitest/rails/capybara" + +# Uncomment for awesome colorful output +# require "minitest/pride" + +class ActiveSupport::TestCase + # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. + fixtures :all + # Add more helper methods to be used by all tests here... +end diff --git a/tmp/.keep b/tmp/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/vendor/.keep b/vendor/.keep new file mode 100644 index 0000000000..e69de29bb2 From 613c1e86cdeaadac70e2e5b78c96046bbc5f968e Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 16:04:26 -0700 Subject: [PATCH 002/348] Added Merchant model --- app/models/merchant.rb | 2 ++ db/migrate/20171017230149_create_merchants.rb | 9 +++++++ db/schema.rb | 25 +++++++++++++++++++ test/fixtures/merchants.yml | 11 ++++++++ test/models/merchant_test.rb | 9 +++++++ 5 files changed, 56 insertions(+) create mode 100644 app/models/merchant.rb create mode 100644 db/migrate/20171017230149_create_merchants.rb create mode 100644 db/schema.rb create mode 100644 test/fixtures/merchants.yml create mode 100644 test/models/merchant_test.rb diff --git a/app/models/merchant.rb b/app/models/merchant.rb new file mode 100644 index 0000000000..0440407160 --- /dev/null +++ b/app/models/merchant.rb @@ -0,0 +1,2 @@ +class Merchant < ApplicationRecord +end diff --git a/db/migrate/20171017230149_create_merchants.rb b/db/migrate/20171017230149_create_merchants.rb new file mode 100644 index 0000000000..262cacfc5e --- /dev/null +++ b/db/migrate/20171017230149_create_merchants.rb @@ -0,0 +1,9 @@ +class CreateMerchants < ActiveRecord::Migration[5.1] + def change + create_table :merchants do |t| + t.string :username + t.string :email + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..1388c5d254 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,25 @@ +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended that you check this file into your version control system. + +ActiveRecord::Schema.define(version: 20171017230149) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "merchants", force: :cascade do |t| + t.string "username" + t.string "email" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + +end diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb new file mode 100644 index 0000000000..1cc99d985f --- /dev/null +++ b/test/models/merchant_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Merchant do + let(:merchant) { Merchant.new } + + it "must be valid" do + value(merchant).must_be :valid? + end +end From adf39a3140b0a67d24b8f9d77c7b7fdb338ed9a1 Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 16:10:27 -0700 Subject: [PATCH 003/348] Added Order Model --- app/models/order.rb | 2 ++ db/migrate/20171017230651_create_orders.rb | 14 ++++++++++++++ db/schema.rb | 13 ++++++++++++- test/fixtures/orders.yml | 17 +++++++++++++++++ test/models/order_test.rb | 9 +++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 app/models/order.rb create mode 100644 db/migrate/20171017230651_create_orders.rb create mode 100644 test/fixtures/orders.yml create mode 100644 test/models/order_test.rb diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..10281b3450 --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,2 @@ +class Order < ApplicationRecord +end diff --git a/db/migrate/20171017230651_create_orders.rb b/db/migrate/20171017230651_create_orders.rb new file mode 100644 index 0000000000..8523638ae9 --- /dev/null +++ b/db/migrate/20171017230651_create_orders.rb @@ -0,0 +1,14 @@ +class CreateOrders < ActiveRecord::Migration[5.1] + def change + create_table :orders do |t| + t.string :cust_name + t.string :status + t.string :cust_email + t.string :cust_cc + t.string :cust_cc_exp + t.string :cust_addr + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 1388c5d254..6516752e7f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171017230149) do +ActiveRecord::Schema.define(version: 20171017230651) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -22,4 +22,15 @@ t.datetime "updated_at", null: false end + create_table "orders", force: :cascade do |t| + t.string "cust_name" + t.string "status" + t.string "cust_email" + t.string "cust_cc" + t.string "cust_cc_exp" + t.string "cust_addr" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 0000000000..1873a1cbe4 --- /dev/null +++ b/test/fixtures/orders.yml @@ -0,0 +1,17 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + string: + string: + string: + string: + string: + string: + +two: + string: + string: + string: + string: + string: + string: diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..df80f10fb6 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Order do + let(:order) { Order.new } + + it "must be valid" do + value(order).must_be :valid? + end +end From 747895d51cce5b14d9cd6c5e9e140435bb14a035 Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 16:14:55 -0700 Subject: [PATCH 004/348] Added Product Model --- app/models/product.rb | 2 ++ db/migrate/20171017231112_create_products.rb | 13 +++++++++++++ db/schema.rb | 13 ++++++++++++- test/fixtures/products.yml | 11 +++++++++++ test/models/product_test.rb | 9 +++++++++ 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 app/models/product.rb create mode 100644 db/migrate/20171017231112_create_products.rb create mode 100644 test/fixtures/products.yml create mode 100644 test/models/product_test.rb diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..35a85acab3 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,2 @@ +class Product < ApplicationRecord +end diff --git a/db/migrate/20171017231112_create_products.rb b/db/migrate/20171017231112_create_products.rb new file mode 100644 index 0000000000..05f78884a1 --- /dev/null +++ b/db/migrate/20171017231112_create_products.rb @@ -0,0 +1,13 @@ +class CreateProducts < ActiveRecord::Migration[5.1] + def change + create_table :products do |t| + t.string :name + t.string :image_url + t.string :category + t.float :price + t.integer :quantity + t.text :description + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 6516752e7f..445719e821 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171017230651) do +ActiveRecord::Schema.define(version: 20171017231112) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -33,4 +33,15 @@ t.datetime "updated_at", null: false end + create_table "products", force: :cascade do |t| + t.string "name" + t.string "image_url" + t.string "category" + t.float "price" + t.integer "quantity" + t.text "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/product_test.rb b/test/models/product_test.rb new file mode 100644 index 0000000000..a618b0a156 --- /dev/null +++ b/test/models/product_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Product do + let(:product) { Product.new } + + it "must be valid" do + value(product).must_be :valid? + end +end From 4921a4ab0956ba577b4acc1241c1c061c82150ea Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 16:18:03 -0700 Subject: [PATCH 005/348] add reviews model --- app/models/review.rb | 2 ++ db/migrate/20171017231524_create_reviews.rb | 10 ++++++++++ db/schema.rb | 9 ++++++++- test/fixtures/reviews.yml | 11 +++++++++++ test/models/review_test.rb | 9 +++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 app/models/review.rb create mode 100644 db/migrate/20171017231524_create_reviews.rb create mode 100644 test/fixtures/reviews.yml create mode 100644 test/models/review_test.rb diff --git a/app/models/review.rb b/app/models/review.rb new file mode 100644 index 0000000000..b2ca4935ed --- /dev/null +++ b/app/models/review.rb @@ -0,0 +1,2 @@ +class Review < ApplicationRecord +end diff --git a/db/migrate/20171017231524_create_reviews.rb b/db/migrate/20171017231524_create_reviews.rb new file mode 100644 index 0000000000..6952d5ad07 --- /dev/null +++ b/db/migrate/20171017231524_create_reviews.rb @@ -0,0 +1,10 @@ +class CreateReviews < ActiveRecord::Migration[5.1] + def change + create_table :reviews do |t| + t.integer :rating + t.string :description + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 445719e821..6f5f02fbe3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171017231112) do +ActiveRecord::Schema.define(version: 20171017231524) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -44,4 +44,11 @@ t.datetime "updated_at", null: false end + create_table "reviews", force: :cascade do |t| + t.integer "rating" + t.string "description" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/reviews.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/review_test.rb b/test/models/review_test.rb new file mode 100644 index 0000000000..ce8378a033 --- /dev/null +++ b/test/models/review_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Review do + let(:review) { Review.new } + + it "must be valid" do + value(review).must_be :valid? + end +end From f02c31128d259a331a4740c31fc2e57182b1a061 Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 16:21:03 -0700 Subject: [PATCH 006/348] Added OrderProduct model migration --- app/models/order_product.rb | 2 ++ db/migrate/20171017231907_create_order_products.rb | 9 +++++++++ db/schema.rb | 9 ++++++++- test/fixtures/order_products.yml | 11 +++++++++++ test/models/order_product_test.rb | 9 +++++++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 app/models/order_product.rb create mode 100644 db/migrate/20171017231907_create_order_products.rb create mode 100644 test/fixtures/order_products.yml create mode 100644 test/models/order_product_test.rb diff --git a/app/models/order_product.rb b/app/models/order_product.rb new file mode 100644 index 0000000000..5a1d864dff --- /dev/null +++ b/app/models/order_product.rb @@ -0,0 +1,2 @@ +class OrderProduct < ApplicationRecord +end diff --git a/db/migrate/20171017231907_create_order_products.rb b/db/migrate/20171017231907_create_order_products.rb new file mode 100644 index 0000000000..948b400eec --- /dev/null +++ b/db/migrate/20171017231907_create_order_products.rb @@ -0,0 +1,9 @@ +class CreateOrderProducts < ActiveRecord::Migration[5.1] + def change + create_table :order_products do |t| + t.string :status + t.integer :quantity + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 6f5f02fbe3..305b4c2f26 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171017231524) do +ActiveRecord::Schema.define(version: 20171017231907) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -22,6 +22,13 @@ t.datetime "updated_at", null: false end + create_table "order_products", force: :cascade do |t| + t.string "status" + t.integer "quantity" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "orders", force: :cascade do |t| t.string "cust_name" t.string "status" diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/order_products.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# This model initially had no columns defined. If you add columns to the +# model remove the "{}" from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/models/order_product_test.rb b/test/models/order_product_test.rb new file mode 100644 index 0000000000..47c6ee2a98 --- /dev/null +++ b/test/models/order_product_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe OrderProduct do + let(:order_product) { OrderProduct.new } + + it "must be valid" do + value(order_product).must_be :valid? + end +end From b4e685eb81edeaa79c8ce0676accd33aec7230a9 Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 17 Oct 2017 16:24:55 -0700 Subject: [PATCH 007/348] Added controllers for merchants, order_products, orders, products, reviews --- app/assets/javascripts/merchants.js | 2 ++ app/assets/javascripts/order_products.js | 2 ++ app/assets/javascripts/orders.js | 2 ++ app/assets/javascripts/products.js | 2 ++ app/assets/javascripts/reviews.js | 2 ++ app/assets/stylesheets/merchants.scss | 3 +++ app/assets/stylesheets/order_products.scss | 3 +++ app/assets/stylesheets/orders.scss | 3 +++ app/assets/stylesheets/products.scss | 3 +++ app/assets/stylesheets/reviews.scss | 3 +++ app/controllers/merchants_controller.rb | 2 ++ app/controllers/order_products_controller.rb | 2 ++ app/controllers/orders_controller.rb | 2 ++ app/controllers/products_controller.rb | 2 ++ app/controllers/reviews_controller.rb | 2 ++ app/helpers/merchants_helper.rb | 2 ++ app/helpers/order_products_helper.rb | 2 ++ app/helpers/orders_helper.rb | 2 ++ app/helpers/products_helper.rb | 2 ++ app/helpers/reviews_helper.rb | 2 ++ test/controllers/merchants_controller_test.rb | 7 +++++++ test/controllers/order_products_controller_test.rb | 7 +++++++ test/controllers/orders_controller_test.rb | 7 +++++++ test/controllers/products_controller_test.rb | 7 +++++++ test/controllers/reviews_controller_test.rb | 7 +++++++ 25 files changed, 80 insertions(+) create mode 100644 app/assets/javascripts/merchants.js create mode 100644 app/assets/javascripts/order_products.js create mode 100644 app/assets/javascripts/orders.js create mode 100644 app/assets/javascripts/products.js create mode 100644 app/assets/javascripts/reviews.js create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/assets/stylesheets/order_products.scss create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/controllers/order_products_controller.rb create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/controllers/products_controller.rb create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 app/helpers/order_products_helper.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 test/controllers/merchants_controller_test.rb create mode 100644 test/controllers/order_products_controller_test.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/controllers/reviews_controller_test.rb diff --git a/app/assets/javascripts/merchants.js b/app/assets/javascripts/merchants.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/merchants.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/order_products.js b/app/assets/javascripts/order_products.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/order_products.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/orders.js b/app/assets/javascripts/orders.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/orders.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/products.js b/app/assets/javascripts/products.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/products.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/javascripts/reviews.js b/app/assets/javascripts/reviews.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/reviews.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss new file mode 100644 index 0000000000..2327c00afe --- /dev/null +++ b/app/assets/stylesheets/merchants.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the merchants controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/order_products.scss b/app/assets/stylesheets/order_products.scss new file mode 100644 index 0000000000..d7da5d6766 --- /dev/null +++ b/app/assets/stylesheets/order_products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the order_products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss new file mode 100644 index 0000000000..3b0428a94e --- /dev/null +++ b/app/assets/stylesheets/orders.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss new file mode 100644 index 0000000000..89e2e8db07 --- /dev/null +++ b/app/assets/stylesheets/products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the products controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss new file mode 100644 index 0000000000..6ea2454d26 --- /dev/null +++ b/app/assets/stylesheets/reviews.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the reviews controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb new file mode 100644 index 0000000000..ae95f7677b --- /dev/null +++ b/app/controllers/merchants_controller.rb @@ -0,0 +1,2 @@ +class MerchantsController < ApplicationController +end diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb new file mode 100644 index 0000000000..8fc2a16bfe --- /dev/null +++ b/app/controllers/order_products_controller.rb @@ -0,0 +1,2 @@ +class OrderProductsController < ApplicationController +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..8a0e3659ae --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,2 @@ +class OrdersController < ApplicationController +end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 0000000000..f1ad12ddea --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,2 @@ +class ProductsController < ApplicationController +end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..b3d77cc1c3 --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,2 @@ +class ReviewsController < ApplicationController +end diff --git a/app/helpers/merchants_helper.rb b/app/helpers/merchants_helper.rb new file mode 100644 index 0000000000..5337747b0f --- /dev/null +++ b/app/helpers/merchants_helper.rb @@ -0,0 +1,2 @@ +module MerchantsHelper +end diff --git a/app/helpers/order_products_helper.rb b/app/helpers/order_products_helper.rb new file mode 100644 index 0000000000..fb2828b523 --- /dev/null +++ b/app/helpers/order_products_helper.rb @@ -0,0 +1,2 @@ +module OrderProductsHelper +end diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 0000000000..443227fd48 --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,2 @@ +module OrdersHelper +end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb new file mode 100644 index 0000000000..ab5c42b325 --- /dev/null +++ b/app/helpers/products_helper.rb @@ -0,0 +1,2 @@ +module ProductsHelper +end diff --git a/app/helpers/reviews_helper.rb b/app/helpers/reviews_helper.rb new file mode 100644 index 0000000000..682b7b1abc --- /dev/null +++ b/app/helpers/reviews_helper.rb @@ -0,0 +1,2 @@ +module ReviewsHelper +end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb new file mode 100644 index 0000000000..6eb57f7baa --- /dev/null +++ b/test/controllers/merchants_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MerchantsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb new file mode 100644 index 0000000000..868bc2929c --- /dev/null +++ b/test/controllers/order_products_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrderProductsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 0000000000..68784595f3 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe OrdersController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb new file mode 100644 index 0000000000..392a20e292 --- /dev/null +++ b/test/controllers/products_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ProductsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb new file mode 100644 index 0000000000..386065239a --- /dev/null +++ b/test/controllers/reviews_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe ReviewsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From 29b06c707ede3763b77d46e996dab606f72e016d Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 17 Oct 2017 16:35:15 -0700 Subject: [PATCH 008/348] add model relationships --- app/models/merchant.rb | 5 +++++ app/models/order.rb | 4 ++++ app/models/order_product.rb | 2 ++ app/models/product.rb | 4 ++++ app/models/review.rb | 2 ++ 5 files changed, 17 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 0440407160..9417460cc7 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,2 +1,7 @@ class Merchant < ApplicationRecord + has_many :reviews + has_many :products + has_many :orders + has_many :orderproducts, through: :orders + end diff --git a/app/models/order.rb b/app/models/order.rb index 10281b3450..4aab4fc7b8 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,2 +1,6 @@ class Order < ApplicationRecord + belongs_to :merchant + has_many :orderproducts + has_many :products, through: :orderproduct + end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 5a1d864dff..3ff23fb742 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -1,2 +1,4 @@ class OrderProduct < ApplicationRecord + belongs_to :product + belongs_to :order end diff --git a/app/models/product.rb b/app/models/product.rb index 35a85acab3..9457f628f3 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,2 +1,6 @@ class Product < ApplicationRecord + has_many :orderproducts + has_many :reviews + has_many :orders, through: :orderproducts, + belongs_to :merchant end diff --git a/app/models/review.rb b/app/models/review.rb index b2ca4935ed..f705ba32d3 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,2 +1,4 @@ class Review < ApplicationRecord + belongs_to :merchant + belongs_to :product end From 93067b7f0b2f5e0b2de4150f30b0bb8dfcd2136c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 17 Oct 2017 16:49:39 -0700 Subject: [PATCH 009/348] add model validations --- app/models/merchant.rb | 2 ++ app/models/order.rb | 1 - app/models/order_product.rb | 2 ++ app/models/product.rb | 4 ++++ app/models/review.rb | 2 ++ 5 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 9417460cc7..850566cd7a 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -4,4 +4,6 @@ class Merchant < ApplicationRecord has_many :orders has_many :orderproducts, through: :orders + validates :username, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true end diff --git a/app/models/order.rb b/app/models/order.rb index 4aab4fc7b8..2617bee657 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,5 +2,4 @@ class Order < ApplicationRecord belongs_to :merchant has_many :orderproducts has_many :products, through: :orderproduct - end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 3ff23fb742..1200944714 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -1,4 +1,6 @@ class OrderProduct < ApplicationRecord belongs_to :product belongs_to :order + + validates :quantity, presence: true, numericality: true, greater_than: 0 end diff --git a/app/models/product.rb b/app/models/product.rb index 9457f628f3..90dc18bba2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -3,4 +3,8 @@ class Product < ApplicationRecord has_many :reviews has_many :orders, through: :orderproducts, belongs_to :merchant + + validates :name, presence: true, uniqueness: true + validates :price, presence: true, numericality: true, greater_than: 0 + validates :quantity, presence: true, numericality: true, greater_than_or_equal_to: 0 end diff --git a/app/models/review.rb b/app/models/review.rb index f705ba32d3..b0fab475f4 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,4 +1,6 @@ class Review < ApplicationRecord belongs_to :merchant belongs_to :product + + validates :rating, presence: true, numericality: {only_integer: true}, inclusion: { in: 1..5 } end From 322c063a9386c6c8bb141e574f3bbcff74af82b8 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 17 Oct 2017 16:55:14 -0700 Subject: [PATCH 010/348] added email validation format --- app/models/merchant.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 850566cd7a..f971009786 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -5,5 +5,6 @@ class Merchant < ApplicationRecord has_many :orderproducts, through: :orders validates :username, presence: true, uniqueness: true - validates :email, presence: true, uniqueness: true + validates :email, presence: true, uniqueness:true + validates_format_of :email, :with => /\A\S+@.+\.\S+\z/ end From fd178db7992649fb12ea3bc45f6407b827ab048b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 17 Oct 2017 19:09:45 -0700 Subject: [PATCH 011/348] modify merchant.email to not accept non-word characters --- app/models/merchant.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index f971009786..dc85dc4bbd 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -6,5 +6,5 @@ class Merchant < ApplicationRecord validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness:true - validates_format_of :email, :with => /\A\S+@.+\.\S+\z/ + validates_format_of :email, :with => /\A\w+@\w+\.\w+\z/ end From de8248b2fda0ad551fea5b038e788d65fa936223 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 17 Oct 2017 19:13:37 -0700 Subject: [PATCH 012/348] fix 'numericality' syntax errors --- app/models/order_product.rb | 2 +- app/models/product.rb | 6 +++--- app/models/review.rb | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 1200944714..f049e4b074 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -2,5 +2,5 @@ class OrderProduct < ApplicationRecord belongs_to :product belongs_to :order - validates :quantity, presence: true, numericality: true, greater_than: 0 + validates :quantity, presence: true, numericality: {greater_than: 0} end diff --git a/app/models/product.rb b/app/models/product.rb index 90dc18bba2..3f3820f4af 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,10 +1,10 @@ class Product < ApplicationRecord has_many :orderproducts has_many :reviews - has_many :orders, through: :orderproducts, + has_many :orders, through: :orderproducts belongs_to :merchant validates :name, presence: true, uniqueness: true - validates :price, presence: true, numericality: true, greater_than: 0 - validates :quantity, presence: true, numericality: true, greater_than_or_equal_to: 0 + validates :price, presence: true, numericality: {greater_than: 0} + validates :quantity, presence: true, numericality: {greater_than_or_equal_to: 0} end diff --git a/app/models/review.rb b/app/models/review.rb index b0fab475f4..43074c29ba 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,5 +2,5 @@ class Review < ApplicationRecord belongs_to :merchant belongs_to :product - validates :rating, presence: true, numericality: {only_integer: true}, inclusion: { in: 1..5 } + validates :rating, presence: true, numericality: {only_integer: true, inclusion: { in: 1..5 }} end From d6f2d15d228e74b6770bdfb08ad3c751ebe2ffa2 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 17 Oct 2017 19:18:11 -0700 Subject: [PATCH 013/348] add foreign keys --- db/migrate/20171018021532_add_foreign_keys.rb | 13 ++++++++++++ db/schema.rb | 8 ++++++- db/seeds.rb | 21 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20171018021532_add_foreign_keys.rb diff --git a/db/migrate/20171018021532_add_foreign_keys.rb b/db/migrate/20171018021532_add_foreign_keys.rb new file mode 100644 index 0000000000..026fc5cd99 --- /dev/null +++ b/db/migrate/20171018021532_add_foreign_keys.rb @@ -0,0 +1,13 @@ +class AddForeignKeys < ActiveRecord::Migration[5.1] + def change + add_column :order_products, :order_id, :integer + add_column :order_products, :product_id, :integer + + add_column :products, :merchant_id, :integer + + add_column :orders, :merchant_id, :integer + + add_column :reviews, :merchant_id, :integer + add_column :reviews, :product_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 305b4c2f26..c53246f7a8 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171017231907) do +ActiveRecord::Schema.define(version: 20171018021532) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -27,6 +27,8 @@ t.integer "quantity" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "order_id" + t.integer "product_id" end create_table "orders", force: :cascade do |t| @@ -38,6 +40,7 @@ t.string "cust_addr" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "merchant_id" end create_table "products", force: :cascade do |t| @@ -49,6 +52,7 @@ t.text "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "merchant_id" end create_table "reviews", force: :cascade do |t| @@ -56,6 +60,8 @@ t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "merchant_id" + t.integer "product_id" end end diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..16e87e4e07 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,24 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + +# Merchants: 21, 22 +merchants = Merchant.create([ + { username: 'MagicBrian', email: 'brian@spider.com', id: 21, created_at: Time.now, updated_at: Time.now }, + { username: 'Taako', email: 'abra@cafu.com', id: 22, created_at: Time.now, updated_at: Time.now } + ]) + +# Orders: 21, 22, 23, 24 +orders = Order.create([ + { cust_name: 'Sar Squatch', status: 'completed', cust_email: 'big@feet.com', cust_cc: '1234567890', cust_cc_exp: '06/19', cust_addr: 'The Woods', id: 21, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Ponyboy', status: 'paid', cust_email: 'big@feet.com', cust_cc: '1234552567890', cust_cc_exp: '06/19', cust_addr: 'Cartoon Network', id: 22, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Maleficent', status: 'completed', cust_email: 'veryevilfairy@hotmail.com', cust_cc: '1234567823423490', cust_cc_exp: '04/25', cust_addr: '12345 Perceforest', id: 23, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Witchy Witcherson', status: 'completed', cust_email: 'witch@witch.com', cust_cc: '1234567890234234', cust_cc_exp: '06/22', cust_addr: '294 Witch St, Witchville', id: 24, created_at: Time.now, updated_at: Time.now } + ]) + +# Products: 21, 22, 23, 24 +products = Product.create([ + { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now }, + { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now }, + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 23, created_at: Time.now, updated_at: Time.now } + ]) From 4725fcbbe7fb65c772e3ef8ef4190513c8c4ff2b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 17 Oct 2017 19:20:47 -0700 Subject: [PATCH 014/348] optional validations --- app/models/order.rb | 2 +- app/models/review.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 2617bee657..3b4a0a095a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,5 +1,5 @@ class Order < ApplicationRecord - belongs_to :merchant + belongs_to :merchant, optional: true has_many :orderproducts has_many :products, through: :orderproduct end diff --git a/app/models/review.rb b/app/models/review.rb index 43074c29ba..19c92c359f 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,5 +1,5 @@ class Review < ApplicationRecord - belongs_to :merchant + belongs_to :merchant, optional: true belongs_to :product validates :rating, presence: true, numericality: {only_integer: true, inclusion: { in: 1..5 }} From d407540e2bb4b2b3a9555149b62d6a32ba2dcd6a Mon Sep 17 00:00:00 2001 From: sairagula Date: Tue, 17 Oct 2017 21:31:32 -0700 Subject: [PATCH 015/348] data for the seeds --- db/seeds.rb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/db/seeds.rb b/db/seeds.rb index 16e87e4e07..e07bc33096 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -26,3 +26,33 @@ { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now }, { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 23, created_at: Time.now, updated_at: Time.now } ]) + + + + + + +# Products: 11, 12, 13, 14 + products = Product.create([ + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now }, + { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now }, + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now } + ]) + + +# Products: 11, 12, 13, 14 + orders = Order.create([ + { cust_name: 'Elvy', status: 'paid', cust_email: 'elvii@gmail.com', cust_cc: '11111000000', cust_cc_exp: '02/18', cust_addr: 'Elves Land', id: 11, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Earthborn King', status: 'paid', cust_email: 'eking@something.com', cust_cc: '22222220000000', cust_cc_exp: '10/19', cust_addr: 'Magestic Castle VI', id: 12, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Eagle', status: 'completed', cust_email: 'watchingyou@gmail.com', cust_cc: '3333333000000', cust_cc_exp: '04/18', cust_addr: '2nd Rock ', id: 13, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Maeraly', status: 'completed', cust_email: 'maeraly@hotmail.com', cust_cc: '4444000000', cust_cc_exp: '02/21', cust_addr: '123 75th Line ', id: 14, created_at: Time.now, updated_at: Time.now } + ]) + +#Products: 11, 12, 13 + merchants = Merchant.create([ + { user_name: 'Eagle',cust_email: 'watchingyou@gmail.com', id: 11, created_at: Time.now, updated_at: Time.now }, + { username: 'Glimpie', email: 'mememe@hotmail.com', id: 12, created_at: Time.now, updated_at: Time.now }, + { username: 'Earthborn King', email: 'eking@something.com', id: 13, created_at: Time.now, updated_at: Time.now } + + ]) From 340133a330daf9a756823eecf5e77265d7b2fd3e Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 08:58:54 -0700 Subject: [PATCH 016/348] kate seeds --- db/seeds.rb | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 16e87e4e07..00c0d1a4d6 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -22,7 +22,20 @@ # Products: 21, 22, 23, 24 products = Product.create([ - { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now }, - { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 23, created_at: Time.now, updated_at: Time.now } + { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, + { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 } + ]) + +order_products = OrderProduct.create([ + { status: 'shipped', quantity: '1', order_id: 24, product_id: 21, created_at: Time.now, updated_at: Time.now, id: 21 }, + { status: 'shipped', quantity: '3', order_id: 24, product_id: 23, created_at: Time.now, updated_at: Time.now, id: 22 }, + { status: 'shipped', quantity: '1', order_id: 22, product_id: 22, created_at: Time.now, updated_at: Time.now, id: 23 }, + { status: 'shipped', quantity: '3', order_id: 21, product_id: 23, created_at: Time.now, updated_at: Time.now, id: 24 }, + { status: 'shipped', quantity: '1', order_id: 23, product_id: 21, created_at: Time.now, updated_at: Time.now, id: 25 } + ]) + +reviews = Review.create([ + { rating: 5, description: 'very nice and magic', product_id: 22, created_at: Time.now, updated_at: Time.now, id: 21 }, + { rating: 1, description: 'these are wizards tears, NOT witch\'s tears. seller should be ashamed', product_id: 23, created_at: Time.now, updated_at: Time.now, id: 22 } ]) From 6c283d8a446a6f9607f342bd41295eac20a964ad Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 09:15:44 -0700 Subject: [PATCH 017/348] added gitignore .env --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 82701fedc8..fd7861badf 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ /yarn-error.log .byebug_history +.env From a7fa35a83c42e6902e8140df8f29788b756d555a Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 11:34:13 -0700 Subject: [PATCH 018/348] added seeds 31-40 --- db/seeds.rb | 46 +++++++++++++--------------------------------- 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index e07bc33096..4268f837fc 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -9,7 +9,10 @@ # Merchants: 21, 22 merchants = Merchant.create([ { username: 'MagicBrian', email: 'brian@spider.com', id: 21, created_at: Time.now, updated_at: Time.now }, - { username: 'Taako', email: 'abra@cafu.com', id: 22, created_at: Time.now, updated_at: Time.now } + { username: 'Taako', email: 'abra@cafu.com', id: 22, created_at: Time.now, updated_at: Time.now }, + { username: 'Forest Nymph', email: 'inatree@treepeople.com', id: 31, created_at: Time.now, updated_at: Time.now }, + { username: 'Bridge Troll', email: 'trolltoll@bridge.com', id: 32, created_at: Time.now, updated_at: Time.now }, + { username: 'Puck', email: 'sneakyelf@shakespeare.com', id: 40, created_at: Time.now, updated_at: Time.now } ]) # Orders: 21, 22, 23, 24 @@ -17,42 +20,19 @@ { cust_name: 'Sar Squatch', status: 'completed', cust_email: 'big@feet.com', cust_cc: '1234567890', cust_cc_exp: '06/19', cust_addr: 'The Woods', id: 21, created_at: Time.now, updated_at: Time.now }, { cust_name: 'Ponyboy', status: 'paid', cust_email: 'big@feet.com', cust_cc: '1234552567890', cust_cc_exp: '06/19', cust_addr: 'Cartoon Network', id: 22, created_at: Time.now, updated_at: Time.now }, { cust_name: 'Maleficent', status: 'completed', cust_email: 'veryevilfairy@hotmail.com', cust_cc: '1234567823423490', cust_cc_exp: '04/25', cust_addr: '12345 Perceforest', id: 23, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Witchy Witcherson', status: 'completed', cust_email: 'witch@witch.com', cust_cc: '1234567890234234', cust_cc_exp: '06/22', cust_addr: '294 Witch St, Witchville', id: 24, created_at: Time.now, updated_at: Time.now } + { cust_name: 'Witchy Witcherson', status: 'completed', cust_email: 'witch@witch.com', cust_cc: '1234567890234234', cust_cc_exp: '06/22', cust_addr: '294 Witch St, Witchville', id: 24, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Angry Waitress', status: 'completed', cust_email: 'dontmesswithbess@restaurant.com', cust_cc: '1234567890', cust_cc_exp: '10/90', cust_addr: 'The Restaurant', id: 33, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'DND Master', status: 'paid', cust_email: 'dragon_person@email.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'Fantasy Land', id: 34, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Ialways Wearmask', status: 'completed', cust_email: 'standingoveryouwiththatcreepymask@yourhouse.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'Charbroiled Goodness St', id: 35, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Hermit Wizard', status: 'completed', cust_email: 'lookingforlove@lonelyville.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'The cave', id: 36, created_at: Time.now, updated_at: Time.now } ]) # Products: 21, 22, 23, 24 products = Product.create([ { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now }, { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 23, created_at: Time.now, updated_at: Time.now } + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 1, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 23, created_at: Time.now, updated_at: Time.now }, + { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now } ]) - - - - - - -# Products: 11, 12, 13, 14 - products = Product.create([ - { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now }, - { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now }, - { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now } - ]) - - -# Products: 11, 12, 13, 14 - orders = Order.create([ - { cust_name: 'Elvy', status: 'paid', cust_email: 'elvii@gmail.com', cust_cc: '11111000000', cust_cc_exp: '02/18', cust_addr: 'Elves Land', id: 11, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Earthborn King', status: 'paid', cust_email: 'eking@something.com', cust_cc: '22222220000000', cust_cc_exp: '10/19', cust_addr: 'Magestic Castle VI', id: 12, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Eagle', status: 'completed', cust_email: 'watchingyou@gmail.com', cust_cc: '3333333000000', cust_cc_exp: '04/18', cust_addr: '2nd Rock ', id: 13, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Maeraly', status: 'completed', cust_email: 'maeraly@hotmail.com', cust_cc: '4444000000', cust_cc_exp: '02/21', cust_addr: '123 75th Line ', id: 14, created_at: Time.now, updated_at: Time.now } - ]) - -#Products: 11, 12, 13 - merchants = Merchant.create([ - { user_name: 'Eagle',cust_email: 'watchingyou@gmail.com', id: 11, created_at: Time.now, updated_at: Time.now }, - { username: 'Glimpie', email: 'mememe@hotmail.com', id: 12, created_at: Time.now, updated_at: Time.now }, - { username: 'Earthborn King', email: 'eking@something.com', id: 13, created_at: Time.now, updated_at: Time.now } - - ]) From 99b3ac503b51a95b38c4d96472f2c422843fe2cb Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 18 Oct 2017 11:41:30 -0700 Subject: [PATCH 019/348] Added to the seeds.rb data file --- db/seeds.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 305613ed21..5dd9a2edb9 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -31,10 +31,14 @@ products = Product.create([ { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 } + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now }, { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now } + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now }, + { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now }, + { id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now }, + { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now }, + { id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg?resizeid=4&resizeh=399&resizew=399', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now } ]) order_products = OrderProduct.create([ From e5deba1a110a4c14fa2cb9e69a9199e4f1eea08c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 11:45:17 -0700 Subject: [PATCH 020/348] rescued saira's lost seeds --- db/seeds.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/db/seeds.rb b/db/seeds.rb index 5dd9a2edb9..1040adb4bd 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -8,6 +8,9 @@ # Merchants: 21, 22 merchants = Merchant.create([ + { username: 'Eagle', email: 'watchingyou@gmail.com', id: 11, created_at: Time.now, updated_at: Time.now }, + { username: 'Glimpie', email: 'mememe@hotmail.com', id: 12, created_at: Time.now, updated_at: Time.now }, + { username: 'Earthborn King', email: 'eking@something.com', id: 13, created_at: Time.now, updated_at: Time.now }, { username: 'MagicBrian', email: 'brian@spider.com', id: 21, created_at: Time.now, updated_at: Time.now }, { username: 'Taako', email: 'abra@cafu.com', id: 22, created_at: Time.now, updated_at: Time.now }, { username: 'Forest Nymph', email: 'inatree@treepeople.com', id: 31, created_at: Time.now, updated_at: Time.now }, @@ -17,6 +20,10 @@ # Orders: 21, 22, 23, 24 orders = Order.create([ + { cust_name: 'Elvy', status: 'paid', cust_email: 'elvii@gmail.com', cust_cc: '11111000000', cust_cc_exp: '02/18', cust_addr: 'Elves Land', id: 11, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Earthborn King', status: 'paid', cust_email: 'eking@something.com', cust_cc: '22222220000000', cust_cc_exp: '10/19', cust_addr: 'Magestic Castle VI', id: 12, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Eagle', status: 'completed', cust_email: 'watchingyou@gmail.com', cust_cc: '3333333000000', cust_cc_exp: '04/18', cust_addr: '2nd Rock ', id: 13, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Maeraly', status: 'completed', cust_email: 'maeraly@hotmail.com', cust_cc: '4444000000', cust_cc_exp: '02/21', cust_addr: '123 75th Line ', id: 14, created_at: Time.now, updated_at: Time.now }, { cust_name: 'Sar Squatch', status: 'completed', cust_email: 'big@feet.com', cust_cc: '1234567890', cust_cc_exp: '06/19', cust_addr: 'The Woods', id: 21, created_at: Time.now, updated_at: Time.now }, { cust_name: 'Ponyboy', status: 'paid', cust_email: 'big@feet.com', cust_cc: '1234552567890', cust_cc_exp: '06/19', cust_addr: 'Cartoon Network', id: 22, created_at: Time.now, updated_at: Time.now }, { cust_name: 'Maleficent', status: 'completed', cust_email: 'veryevilfairy@hotmail.com', cust_cc: '1234567823423490', cust_cc_exp: '04/25', cust_addr: '12345 Perceforest', id: 23, created_at: Time.now, updated_at: Time.now }, @@ -29,6 +36,10 @@ # Products: 21, 22, 23, 24 products = Product.create([ + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now }, + { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now }, + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now }, { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, From beb79c6950bbe9654387292967aae737e50ec71c Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 18 Oct 2017 11:53:09 -0700 Subject: [PATCH 021/348] Added omniauth related gems to Gemfile --- Gemfile | 3 +++ Gemfile.lock | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/Gemfile b/Gemfile index 5ab86d9376..053f348c30 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,8 @@ gem 'jbuilder', '~> 2.5' # gem 'redis', '~> 3.0' # Use ActiveModel has_secure_password # gem 'bcrypt', '~> 3.1.7' +gem "omniauth" +gem "omniauth-github" # Use Capistrano for deployment # gem 'capistrano-rails', group: :development @@ -48,6 +50,7 @@ group :development do # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' + gem 'dotenv-rails' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/Gemfile.lock b/Gemfile.lock index 67420367a1..030babfd88 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -68,8 +68,14 @@ GEM concurrent-ruby (1.0.5) crass (1.0.2) debug_inspector (0.0.3) + dotenv (2.2.1) + dotenv-rails (2.2.1) + dotenv (= 2.2.1) + railties (>= 3.2, < 5.2) erubi (1.7.0) execjs (2.7.0) + faraday (0.12.2) + multipart-post (>= 1.2, < 3) ffi (1.9.18) foundation-rails (6.4.1.2) railties (>= 3.1.0) @@ -77,6 +83,7 @@ GEM sprockets-es6 (>= 0.9.0) globalid (0.4.0) activesupport (>= 4.2.0) + hashie (3.5.6) i18n (0.9.0) concurrent-ruby (~> 1.0) jbuilder (2.7.0) @@ -85,6 +92,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + jwt (1.5.6) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -110,9 +118,26 @@ GEM minitest (>= 5.0) ruby-progressbar multi_json (1.12.2) + multi_xml (0.6.0) + multipart-post (2.0.0) nio4r (2.1.0) nokogiri (1.8.1) mini_portile2 (~> 2.3.0) + oauth2 (1.4.0) + faraday (>= 0.8, < 0.13) + jwt (~> 1.0) + multi_json (~> 1.3) + multi_xml (~> 0.5) + rack (>= 1.2, < 3) + omniauth (1.7.1) + hashie (>= 3.4.6, < 3.6.0) + rack (>= 1.6.2, < 3) + omniauth-github (1.3.0) + omniauth (~> 1.5) + omniauth-oauth2 (>= 1.4.0, < 2.0) + omniauth-oauth2 (1.4.0) + oauth2 (~> 1.0) + omniauth (~> 1.2) pg (0.21.0) pry (0.11.1) coderay (~> 1.1.0) @@ -209,12 +234,15 @@ DEPENDENCIES binding_of_caller byebug capybara (~> 2.13) + dotenv-rails foundation-rails (= 6.4.1.2) jbuilder (~> 2.5) jquery-turbolinks listen (>= 3.0.5, < 3.2) minitest-rails minitest-reporters + omniauth + omniauth-github pg (~> 0.18) pry-rails puma (~> 3.7) From 0ba374f83326f6c0340eb0acd76372c9429d6787 Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 18 Oct 2017 11:59:53 -0700 Subject: [PATCH 022/348] Added omniauth routes and added method to MerchantsController --- app/controllers/merchants_controller.rb | 3 +++ config/initializers/omniauth.rb | 3 +++ config/routes.rb | 2 ++ 3 files changed, 8 insertions(+) create mode 100644 config/initializers/omniauth.rb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ae95f7677b..6a2c1e879f 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,2 +1,5 @@ class MerchantsController < ApplicationController + def login + auth_hash = request.env['omniauth.auth'] + end end diff --git a/config/initializers/omniauth.rb b/config/initializers/omniauth.rb new file mode 100644 index 0000000000..fd4416122a --- /dev/null +++ b/config/initializers/omniauth.rb @@ -0,0 +1,3 @@ +Rails.application.config.middleware.use OmniAuth::Builder do + provider :github, ENV["GITHUB_CLIENT_ID"], ENV["GITHUB_CLIENT_SECRET"], scope: "user:email" +end diff --git a/config/routes.rb b/config/routes.rb index 787824f888..24e49b9aac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,5 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + + get "/auth/:provider/callback", to: "merchants#login" end From 72a4ea4a827fffa32fafe483a7001a11c03aca2c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 12:06:49 -0700 Subject: [PATCH 023/348] add oauth parameters to merchants --- db/migrate/20171018190422_add_oauth_data_to_merchants.rb | 6 ++++++ db/schema.rb | 4 +++- test/test_helper.rb | 9 ++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20171018190422_add_oauth_data_to_merchants.rb diff --git a/db/migrate/20171018190422_add_oauth_data_to_merchants.rb b/db/migrate/20171018190422_add_oauth_data_to_merchants.rb new file mode 100644 index 0000000000..1243f9d815 --- /dev/null +++ b/db/migrate/20171018190422_add_oauth_data_to_merchants.rb @@ -0,0 +1,6 @@ +class AddOauthDataToMerchants < ActiveRecord::Migration[5.1] + def change + add_column :merchants, :oauth_provider, :string + add_column :merchants, :oauth_uid, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index c53246f7a8..4ed9422a2b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171018021532) do +ActiveRecord::Schema.define(version: 20171018190422) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -20,6 +20,8 @@ t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "oauth_provider" + t.string "oauth_uid" end create_table "order_products", force: :cascade do |t| diff --git a/test/test_helper.rb b/test/test_helper.rb index e2aed7c1a9..9d61f02303 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,7 +2,7 @@ require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" require "minitest/rails" require "minitest/reporters" # for Colorized output - + # For colorful output! Minitest::Reporters.use!( Minitest::Reporters::SpecReporter.new, @@ -22,4 +22,11 @@ class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. fixtures :all # Add more helper methods to be used by all tests here... + + def setup + # Once you have enabled test mode, all requests + # to OmniAuth will be short circuited to use the mock authentication hash. + # A request to /auth/provider will redirect immediately to /auth/provider/callback. + OmniAuth.config.test_mode = true + end end From 6c6d55b319fa5791de52b35b9ccdfe042b348665 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 12:09:35 -0700 Subject: [PATCH 024/348] merchant oauth testing setup --- test/fixtures/merchants.yml | 17 ++++++++++++----- test/models/merchant_test.rb | 10 ++++++++-- test/test_helper.rb | 11 +++++++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index dc3ee79b5d..fee9544e95 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -4,8 +4,15 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value + +ada: + oauth_provider: github + oauth_uid: 12345 + email: ada@adadevelopersacademy.org + username: countess_ada + +grace: + oauth_provider: github + oauth_uid: 13371337 + email: grace@hooper.net + username: graceful_hoops diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1cc99d985f..997c498e3c 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -3,7 +3,13 @@ describe Merchant do let(:merchant) { Merchant.new } - it "must be valid" do - value(merchant).must_be :valid? + # it "must be valid" do + # value(merchant).must_be :valid? + # end + + describe 'oAuth login' do + it 'logs in existing user' do + + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 9d61f02303..da812257a8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -29,4 +29,15 @@ def setup # A request to /auth/provider will redirect immediately to /auth/provider/callback. OmniAuth.config.test_mode = true end + + def mock_auth_hash(user) + return { + provider: user.oauth_provider, + uid: user.oauth_uid, + info: { + email: user.email, + nickname: user.username + } + } + end end From 4befafe7bcb6a3139fb286436b55956e1e155ef8 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 12:14:40 -0700 Subject: [PATCH 025/348] added merchant id to products --- db/seeds.rb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 1040adb4bd..4ba010bc43 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -36,20 +36,20 @@ # Products: 21, 22, 23, 24 products = Product.create([ - { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now }, - { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now }, - { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now }, + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now, merchand_id: 21 }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now, merchand_id: 21 }, + { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now, merchand_id: 21 }, + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now , merchand_id: 11 }, { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now }, - { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now }, - { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now }, + { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchand_id: 11 }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, + { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, { id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now }, - { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now }, - { id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg?resizeid=4&resizeh=399&resizew=399', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now } + { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, + { id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg?resizeid=4&resizeh=399&resizew=399', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 12 } ]) order_products = OrderProduct.create([ From 7788e9330ad935f005a89582da0833f596354725 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 12:17:15 -0700 Subject: [PATCH 026/348] add mandatory oauth data to merchants --- ...131_require_oauth_parameters_for_merchants.rb | 6 ++++++ db/schema.rb | 6 +++--- db/seeds.rb | 16 ++++++++-------- test/models/merchant_test.rb | 10 ++++++---- 4 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 db/migrate/20171018191131_require_oauth_parameters_for_merchants.rb diff --git a/db/migrate/20171018191131_require_oauth_parameters_for_merchants.rb b/db/migrate/20171018191131_require_oauth_parameters_for_merchants.rb new file mode 100644 index 0000000000..252d41c8b9 --- /dev/null +++ b/db/migrate/20171018191131_require_oauth_parameters_for_merchants.rb @@ -0,0 +1,6 @@ +class RequireOauthParametersForMerchants < ActiveRecord::Migration[5.1] + def change + change_column_null :merchants, :oauth_uid, false + change_column_null :merchants, :oauth_provider, false + end +end diff --git a/db/schema.rb b/db/schema.rb index 4ed9422a2b..5f14de5263 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171018190422) do +ActiveRecord::Schema.define(version: 20171018191131) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -20,8 +20,8 @@ t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.string "oauth_provider" - t.string "oauth_uid" + t.string "oauth_provider", null: false + t.string "oauth_uid", null: false end create_table "order_products", force: :cascade do |t| diff --git a/db/seeds.rb b/db/seeds.rb index 1040adb4bd..be92141ded 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -8,14 +8,14 @@ # Merchants: 21, 22 merchants = Merchant.create([ - { username: 'Eagle', email: 'watchingyou@gmail.com', id: 11, created_at: Time.now, updated_at: Time.now }, - { username: 'Glimpie', email: 'mememe@hotmail.com', id: 12, created_at: Time.now, updated_at: Time.now }, - { username: 'Earthborn King', email: 'eking@something.com', id: 13, created_at: Time.now, updated_at: Time.now }, - { username: 'MagicBrian', email: 'brian@spider.com', id: 21, created_at: Time.now, updated_at: Time.now }, - { username: 'Taako', email: 'abra@cafu.com', id: 22, created_at: Time.now, updated_at: Time.now }, - { username: 'Forest Nymph', email: 'inatree@treepeople.com', id: 31, created_at: Time.now, updated_at: Time.now }, - { username: 'Bridge Troll', email: 'trolltoll@bridge.com', id: 32, created_at: Time.now, updated_at: Time.now }, - { username: 'Puck', email: 'sneakyelf@shakespeare.com', id: 40, created_at: Time.now, updated_at: Time.now } + { username: 'Eagle', email: 'watchingyou@gmail.com', id: 11, oauth_provider: 'github', oauth_uid: '123456', created_at: Time.now, updated_at: Time.now }, + { username: 'Glimpie', email: 'mememe@hotmail.com', id: 12, oauth_provider: 'github', oauth_uid: '123457', created_at: Time.now, updated_at: Time.now }, + { username: 'Earthborn King', email: 'eking@something.com', id: 13, oauth_provider: 'github', oauth_uid: '123458', created_at: Time.now, updated_at: Time.now }, + { username: 'MagicBrian', email: 'brian@spider.com', id: 21, oauth_provider: 'github', oauth_uid: '123459', created_at: Time.now, updated_at: Time.now }, + { username: 'Taako', email: 'abra@cafu.com', id: 22, oauth_provider: 'github', oauth_uid: '123460', created_at: Time.now, updated_at: Time.now }, + { username: 'Forest Nymph', email: 'inatree@treepeople.com', id: 31, oauth_provider: 'github', oauth_uid: '123461', created_at: Time.now, updated_at: Time.now }, + { username: 'Bridge Troll', email: 'trolltoll@bridge.com', id: 32, oauth_provider: 'github', oauth_uid: '123462', created_at: Time.now, updated_at: Time.now }, + { username: 'Puck', email: 'sneakyelf@shakespeare.com', id: 40, oauth_provider: 'github', oauth_uid: '123463', created_at: Time.now, updated_at: Time.now } ]) # Orders: 21, 22, 23, 24 diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 997c498e3c..37c14dedf7 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -7,9 +7,11 @@ # value(merchant).must_be :valid? # end - describe 'oAuth login' do - it 'logs in existing user' do - - end + describe 'validations' do + + end + + describe 'relationships' do + end end From eb776c68cf422f4aae961b3d697250431116d1c0 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 12:17:31 -0700 Subject: [PATCH 027/348] added merchant_id --- db/seeds.rb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 4ba010bc43..b5576c6037 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -36,19 +36,19 @@ # Products: 21, 22, 23, 24 products = Product.create([ - { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now, merchand_id: 21 }, - { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now, merchand_id: 21 }, - { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now, merchand_id: 21 }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now , merchand_id: 11 }, + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now , merchant_id: 11 }, { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchand_id: 11 }, - { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, - { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, - { id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now }, - { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchand_id: 31 }, + { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchant_id: 11 }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 13 }, + { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, { id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg?resizeid=4&resizeh=399&resizew=399', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 12 } ]) From 39574d672139f167fff3f513c96ff051c3c832e5 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 12:32:29 -0700 Subject: [PATCH 028/348] add initial tests --- app/models/merchant.rb | 2 ++ test/models/merchant_test.rb | 22 ++++++++++++++++++++-- test/test_helper.rb | 15 ++++++++------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index dc85dc4bbd..ea724e8b74 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -7,4 +7,6 @@ class Merchant < ApplicationRecord validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness:true validates_format_of :email, :with => /\A\w+@\w+\.\w+\z/ + validates :oauth_provider, presence: true + validates :oauth_uid, presence: true, uniqueness: true end diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 37c14dedf7..19954df89d 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,17 +1,35 @@ require "test_helper" describe Merchant do - let(:merchant) { Merchant.new } + let(:merchant) { Merchant.new( username: 'testman', + email: 'test@test.com', + oauth_provider: 'github', + oauth_uid: '1234567') + } # it "must be valid" do # value(merchant).must_be :valid? # end describe 'validations' do + it 'can be created with valid data' do + merchant.must_be :valid? + end + + describe 'username' do + it 'requires username' do + merchant.username = nil + merchant.email = 'test@test.com' + merchant.oauth_provider = 'github' + merchant.oauth_uid = '1234567' + + merchant.wont_be :valid? + end + end end describe 'relationships' do - + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index da812257a8..a122f05dbc 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,14 +1,15 @@ ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" -require "minitest/rails" require "minitest/reporters" # for Colorized output +require "minitest/rails" +require "minitest/reporters" # for Colorized output - # For colorful output! - Minitest::Reporters.use!( - Minitest::Reporters::SpecReporter.new, - ENV, - Minitest.backtrace_filter - ) +# For colorful output! +Minitest::Reporters.use!( + Minitest::Reporters::SpecReporter.new, + ENV, + Minitest.backtrace_filter +) # To add Capybara feature tests add `gem "minitest-rails-capybara"` From 7cf591def77cbb457906030573d018a2a265f866 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 12:33:14 -0700 Subject: [PATCH 029/348] comment out error data --- test/fixtures/orders.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 1873a1cbe4..5b5f506431 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -1,17 +1,17 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - string: - string: - string: - string: - string: - string: - -two: - string: - string: - string: - string: - string: - string: +# one: +# string: +# string: +# string: +# string: +# string: +# string: +# +# two: +# string: +# string: +# string: +# string: +# string: +# string: From 5ef32312d20812292ca06d8a03c323d7d17cb6f9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 12:34:25 -0700 Subject: [PATCH 030/348] comment out sample tests --- test/models/order_product_test.rb | 6 +++--- test/models/order_test.rb | 6 +++--- test/models/product_test.rb | 6 +++--- test/models/review_test.rb | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/models/order_product_test.rb b/test/models/order_product_test.rb index 47c6ee2a98..3318f5a52f 100644 --- a/test/models/order_product_test.rb +++ b/test/models/order_product_test.rb @@ -3,7 +3,7 @@ describe OrderProduct do let(:order_product) { OrderProduct.new } - it "must be valid" do - value(order_product).must_be :valid? - end + # it "must be valid" do + # value(order_product).must_be :valid? + # end end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index df80f10fb6..5bc605cfe8 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -3,7 +3,7 @@ describe Order do let(:order) { Order.new } - it "must be valid" do - value(order).must_be :valid? - end + # it "must be valid" do + # value(order).must_be :valid? + # end end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index a618b0a156..83fc950213 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -3,7 +3,7 @@ describe Product do let(:product) { Product.new } - it "must be valid" do - value(product).must_be :valid? - end + # it "must be valid" do + # value(product).must_be :valid? + # end end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index ce8378a033..177207604b 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -3,7 +3,7 @@ describe Review do let(:review) { Review.new } - it "must be valid" do - value(review).must_be :valid? - end + # it "must be valid" do + # value(review).must_be :valid? + # end end From f793525332b1004e48c9e07484675588eb760033 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 14:55:27 -0700 Subject: [PATCH 031/348] seeds, i guesss? --- db/seeds.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/seeds.rb b/db/seeds.rb index b5576c6037..92fe433c2e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -46,7 +46,7 @@ { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchant_id: 11 }, { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, { id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 13 }, { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, { id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg?resizeid=4&resizeh=399&resizew=399', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 12 } From 62b5e1ec926cf642e8a2e2c77391cf4ebe0fe9ae Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 15:14:56 -0700 Subject: [PATCH 032/348] merchant validations --- test/models/merchant_test.rb | 47 +++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 19954df89d..7b9f74fbac 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -2,10 +2,10 @@ describe Merchant do let(:merchant) { Merchant.new( username: 'testman', - email: 'test@test.com', - oauth_provider: 'github', - oauth_uid: '1234567') - } + email: 'test@test.com', + oauth_provider: 'github', + oauth_uid: '1234567') + } # it "must be valid" do # value(merchant).must_be :valid? @@ -22,11 +22,50 @@ merchant.email = 'test@test.com' merchant.oauth_provider = 'github' merchant.oauth_uid = '1234567' + merchant.save + merchant.errors.messages.must_include :username + merchant.wont_be :valid? + end + it "has a unique username" do + merchant.username = "countess_ada" + merchant.wont_be :valid? + merchant.errors.messages.must_include :username + end + end + + # + describe "username email validations" do + describe "tests for format of email" do + it "will reject a bad email" do + merchant.email = "I'm an email" + merchant.wont_be :valid? + merchant.errors.messages.must_include :email + end + end + describe "tests for presence of email" do + it "will reject missing email" do + merchant.email = nil + merchant.wont_be :valid? + merchant.errors.messages.must_include :email + end + end + end + describe "oauth validations" do + it "will reject not unique oauth_uid" do + merchant.oauth_uid = "12345" merchant.wont_be :valid? + merchant.errors.messages.must_include :oauth_uid end end + describe "oauth_provider" do + it "will be rejected if oauth_provider not present" do + merchant.oauth_provider = nil + merchant.wont_be :valid? + merchant.errors.messages.must_include :oauth_provider + end + end end describe 'relationships' do From 31a55f9ef5d4ba03c1026526c958bba28479ee0a Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 15:25:18 -0700 Subject: [PATCH 033/348] formatting tweaks --- test/models/merchant_test.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 7b9f74fbac..df5928e60d 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -33,7 +33,6 @@ end end - # describe "username email validations" do describe "tests for format of email" do @@ -43,6 +42,7 @@ merchant.errors.messages.must_include :email end end + describe "tests for presence of email" do it "will reject missing email" do merchant.email = nil @@ -51,6 +51,7 @@ end end end + describe "oauth validations" do it "will reject not unique oauth_uid" do merchant.oauth_uid = "12345" From 8f9e859491152d6d9bbef04d9248ce6aaecc2fcc Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 18 Oct 2017 15:28:46 -0700 Subject: [PATCH 034/348] fixed --- test/models/merchant_test.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 7b9f74fbac..df5928e60d 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -33,7 +33,6 @@ end end - # describe "username email validations" do describe "tests for format of email" do @@ -43,6 +42,7 @@ merchant.errors.messages.must_include :email end end + describe "tests for presence of email" do it "will reject missing email" do merchant.email = nil @@ -51,6 +51,7 @@ end end end + describe "oauth validations" do it "will reject not unique oauth_uid" do merchant.oauth_uid = "12345" From b88a40429535bf8695bf89927ed3e4d9ebab9160 Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 18 Oct 2017 15:53:22 -0700 Subject: [PATCH 035/348] Tested relationships of merchant model --- app/models/merchant.rb | 2 +- test/fixtures/order_products.yml | 14 +++++++++----- test/fixtures/orders.yml | 4 ++++ test/fixtures/products.yml | 10 +++++----- test/fixtures/reviews.yml | 14 +++++++++----- test/models/merchant_test.rb | 27 +++++++++++++++++++++++++++ 6 files changed, 55 insertions(+), 16 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index ea724e8b74..8517409112 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -2,7 +2,7 @@ class Merchant < ApplicationRecord has_many :reviews has_many :products has_many :orders - has_many :orderproducts, through: :orders + has_many :order_products, through: :orders validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness:true diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index dc3ee79b5d..1e2fe3ca21 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -4,8 +4,12 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +# one: {} +# # column: value +# # +# two: {} +# # column: value +order_products: + quantity: 6 + product_id: :mermaid_fin + order_id: :order diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 5b5f506431..8543674017 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -15,3 +15,7 @@ # string: # string: # string: +order: + cust_name: Mermaid + merchant_id: :ada + diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index dc3ee79b5d..7533a400a5 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -4,8 +4,8 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +mermaid_fin: + name: mermaid_fin + price: 3.45 + quantity: 3 + merchant_id: :ada diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index dc3ee79b5d..7f05e86d32 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -4,8 +4,12 @@ # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below # -one: {} -# column: value -# -two: {} -# column: value +# one: {} +# # column: value +# # +# two: {} +# # column: value +review: + rating: 4 + merchant_id: :ada + product_id: :mermaid_fin diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index df5928e60d..195e127322 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -70,6 +70,33 @@ end describe 'relationships' do + it "has a list of products" do + mermaid_fin = merchants(:ada) + mermaid_fin .must_respond_to :products + mermaid_fin.products.each do |product| + product.must_be_kind_of Product + end + end + + it "has a list of reviews" do + review = merchants(:ada) + review.must_respond_to :reviews + review.reviews.each do |review| + review.must_be_kind_of Review + end + end + it "has a list of orders" do + order = merchants(:ada) + order.must_respond_to :orders + order.orders.each do |order| + order.must_be_kind_of Order + end + end + + it "has a list of order products" do + order_product = merchants(:ada) + order_product.must_respond_to :order_products + end end end From 5e317e45465e43733ed46d2c20c659c3a289fcc1 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 18:09:08 -0700 Subject: [PATCH 036/348] added yaml for order_products --- test/fixtures/order_products.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index dc3ee79b5d..fe089d12da 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -3,9 +3,15 @@ # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below -# -one: {} -# column: value -# -two: {} -# column: value + +witch_tears: + status: complete + quantity: 2 + order_id: + product_id: + +broomstick: + status: pending + quantity: 1 + order_id: + product_id: From a217dc4b4742120f3ef3a8128cf95a61645fb341 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 18:17:04 -0700 Subject: [PATCH 037/348] changed orderproducts to order_products --- app/models/order.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/order.rb b/app/models/order.rb index 3b4a0a095a..4ec93638c3 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,5 +1,5 @@ class Order < ApplicationRecord belongs_to :merchant, optional: true - has_many :orderproducts + has_many :order_products has_many :products, through: :orderproduct end From 920159c5cc1af668290a70abd959ec8e97a7bc8f Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 18 Oct 2017 18:29:10 -0700 Subject: [PATCH 038/348] added validations to order model and fixed fixtures to be valid --- app/models/order.rb | 2 ++ test/fixtures/orders.yml | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/app/models/order.rb b/app/models/order.rb index 4ec93638c3..131eed0344 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,4 +2,6 @@ class Order < ApplicationRecord belongs_to :merchant, optional: true has_many :order_products has_many :products, through: :orderproduct + validates :cust_cc, :cust_cc_exp, :cust_addr, :cust_email, :status, :cust_name, presence: true + validates_format_of :cust_email, :with => /\A\w+@\w+\.\w+\z/ end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 4b62387613..746f26b8be 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,3 +4,9 @@ order: cust_name: Mermaid merchant_id: :ada + cust_cc: 12345 + cust_cc_exp: 11/22 + cust_addr: Sea World + cust_email: forkhair@mermaid.com + status: complete + From d585071094282d3a4f0bd664405d93fc01a66015 Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 18 Oct 2017 18:40:12 -0700 Subject: [PATCH 039/348] Edited review.rb model, reviews.yml data, and added tests to model/review_test.rb --- app/models/review.rb | 2 +- test/fixtures/reviews.yml | 11 +++------- test/models/review_test.rb | 44 ++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index 19c92c359f..a502b384c3 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -2,5 +2,5 @@ class Review < ApplicationRecord belongs_to :merchant, optional: true belongs_to :product - validates :rating, presence: true, numericality: {only_integer: true, inclusion: { in: 1..5 }} + validates :rating, presence: true, numericality: { only_integer: true }, inclusion: { in: 1..5 } end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index 7f05e86d32..925deefa27 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -3,13 +3,8 @@ # This model initially had no columns defined. If you add columns to the # model remove the "{}" from the fixture names and add the columns immediately # below each fixture, per the syntax in the comments below -# -# one: {} -# # column: value -# # -# two: {} -# # column: value + review: rating: 4 - merchant_id: :ada - product_id: :mermaid_fin + merchant: :ada + product: :mermaid_fin diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 177207604b..9150d63453 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,9 +1,45 @@ require "test_helper" describe Review do - let(:review) { Review.new } + let(:review) { reviews(:review) } - # it "must be valid" do - # value(review).must_be :valid? - # end + describe "validations" do + it "will return false without a rating" do + review.rating = nil + review.valid?.must_equal false + end + + it "will return false if rating is not an integer" do + review.rating = 3.1 + review.valid?.must_equal false + end + + it "will return false if rating is not in range of 1-5" do + review.rating = 6 + review.valid?.must_equal false + + review.rating = 0 + review.valid?.must_equal false + end + end + + describe "relations" do + it 'belongs to merchants' do + Review.reflect_on_association(:merchant) + end + + it "valid even if it does not belong to a merchant" do + review.merchant = nil + review.valid?.must_equal true + end + + it 'belongs to products' do + Review.reflect_on_association(:product) + end + + it "invalid if it has no product" do + review.product_id = nil + review.valid?.must_equal false + end + end end From fd7c28c395923f48c71b8c372620a53d55a245dc Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 19:33:20 -0700 Subject: [PATCH 040/348] test planning for product model --- test/models/product_test.rb | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 83fc950213..478f2aa69f 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,9 +1,37 @@ require "test_helper" describe Product do - let(:product) { Product.new } + let(:product) { products(:mermaid_fin) } - # it "must be valid" do - # value(product).must_be :valid? - # end + describe 'validations' do + decribe 'name' do + + end + + describe 'price' do + + end + + describe 'quantity' do + + end + end + + describe 'relationships' do + describe 'order_products' do + + end + + describe 'reviews' do + + end + + describe 'orders' do + + end + + describe 'merchant' do + + end + end end From b79bf5f4888eb633f26b78a2239f27aee4dfbbd3 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 19:46:00 -0700 Subject: [PATCH 041/348] removed '_id' from foreign key entries --- test/fixtures/order_products.yml | 4 ++-- test/fixtures/products.yml | 2 +- test/fixtures/reviews.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index c6dc27e062..b082f40af6 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -7,5 +7,5 @@ order_products: quantity: 6 - product_id: :mermaid_fin - order_id: :order + product: mermaid_fin + order: order diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 7533a400a5..4fcbe16502 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -8,4 +8,4 @@ mermaid_fin: name: mermaid_fin price: 3.45 quantity: 3 - merchant_id: :ada + merchant: ada diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index 7f05e86d32..69444d981f 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -11,5 +11,5 @@ # # column: value review: rating: 4 - merchant_id: :ada - product_id: :mermaid_fin + merchant: ada + product: mermaid_fin From 7dcf5a5ef81314900cd6dae1ef0b16fe0ff007ab Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 19:58:16 -0700 Subject: [PATCH 042/348] product validation tests --- test/fixtures/products.yml | 2 +- test/models/product_test.rb | 55 ++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 4fcbe16502..3745521cb5 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -5,7 +5,7 @@ # below each fixture, per the syntax in the comments below # mermaid_fin: - name: mermaid_fin + name: Mermaid Fin price: 3.45 quantity: 3 merchant: ada diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 478f2aa69f..8ed9e62a7d 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -4,16 +4,69 @@ let(:product) { products(:mermaid_fin) } describe 'validations' do - decribe 'name' do + it 'accepts valid data' do + product.must_be :valid? + end + + describe 'name' do + it 'requires name to be present' do + product.name = nil + + product.wont_be :valid? + product.errors.messages.must_include :name + end + + it 'requires name to be unique' do + prod2 = Product.new( + name: 'Mermaid Fin', + price: 1.11, + quantity: 10, + merchant_id: merchants(:grace).id + ) + prod2.wont_be :valid? + prod2.errors.messages.must_include :name + end end describe 'price' do + it 'requires price to be present' do + product.price = nil + product.wont_be :valid? + product.errors.messages.must_include :price + end + + it 'requires price to be a number greater than 0' do + # Rails automatically converts most invalid inputs to 0. This input would not be accepted. + # Potential issues: 'true' converts to 1 + # Does this require a custom validation? Is there a scenario in which a user could accidentally enter 'true'? + [-15, 'hey', false, nil, 0].each do |value| + product.price = value + + product.wont_be :valid? + product.errors.messages.must_include :price + end + end end describe 'quantity' do + it 'requires quantity to be present' do + product.quantity = nil + + product.wont_be :valid? + product.errors.messages.must_include :quantity + end + + it 'requires quantity to be an integer greater than or equal to 0' do + # Rails automatically converts most invalid inputs to 0. An item won't display with a quantity of 0, but it will save, which isn't ideal. + # Other potential issues: 'true' converts to 1, any float is just rounded down + # Does this require a custom validation? + product.quantity = -1 + product.wont_be :valid? + product.errors.messages.must_include :quantity + end end end From 6659b4bf8b6d48254b1a77ca7d427eb695ebc4cf Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 20:04:44 -0700 Subject: [PATCH 043/348] fixed typos in product relationships --- app/models/product.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 3f3820f4af..77750fe6bc 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,7 +1,7 @@ class Product < ApplicationRecord - has_many :orderproducts + has_many :order_products has_many :reviews - has_many :orders, through: :orderproducts + has_many :orders, through: :order_products belongs_to :merchant validates :name, presence: true, uniqueness: true From 7c58a6ec7f921eaf0dbf398d24a8bbac0b6c0b94 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 18 Oct 2017 20:07:47 -0700 Subject: [PATCH 044/348] product relationship tests --- test/models/product_test.rb | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 8ed9e62a7d..2114a17238 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -71,20 +71,30 @@ end describe 'relationships' do - describe 'order_products' do - + it 'has order_products' do + product.must_respond_to :order_products + product.order_products.each do |op| + op.must_be_kind_of OrderProduct + end end - describe 'reviews' do - + it 'has reviews' do + product.must_respond_to :reviews + product.reviews.each do |review| + review.must_be_kind_of Review + end end - describe 'orders' do - + it 'has orders' do + product.must_respond_to :orders + product.orders do |order| + order.must_be_kind_of Order + end end - describe 'merchant' do - + it 'has merchant' do + product.must_respond_to :merchant + product.merchant.must_be_kind_of Merchant end end end From 98a99a342452e32bc64b1bf7f812eef0bd23b696 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 09:08:32 -0700 Subject: [PATCH 045/348] added order fixtures and order test --- test/fixtures/orders.yml | 2 +- test/models/order_test.rb | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 746f26b8be..ad18857b1a 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -9,4 +9,4 @@ order: cust_addr: Sea World cust_email: forkhair@mermaid.com status: complete - + order_products: [:mermaid_fin] diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 5bc605cfe8..0e300cb922 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,9 +1,21 @@ require "test_helper" describe Order do - let(:order) { Order.new } + let(:bad_order) { Order.new( + merchant_id: :grace, + cust_name: "John", + cust_cc: "12345", + cust_cc_exp: "11/22", + cust_addr: "Sea World", + cust_email: "forkhair@mermaid.com", + status: "") + } - # it "must be valid" do - # value(order).must_be :valid? - # end + describe "validations" do + + end + + it "must be valid" do + good_order.must_be :valid? + end end From a25199422e19ec8a3a7850839acdb4802ded55e6 Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 19 Oct 2017 09:09:38 -0700 Subject: [PATCH 046/348] Test added for Order_product model --- test/models/order_product_test.rb | 51 ++++++++++++++++++++++++++++--- test/models/product_test.rb | 2 +- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/test/models/order_product_test.rb b/test/models/order_product_test.rb index 3318f5a52f..7018b75933 100644 --- a/test/models/order_product_test.rb +++ b/test/models/order_product_test.rb @@ -1,9 +1,52 @@ require "test_helper" describe OrderProduct do - let(:order_product) { OrderProduct.new } + let(:order_product) { order_products(:order_products)} - # it "must be valid" do - # value(order_product).must_be :valid? - # end + describe "validations" do + describe "quantity" do + it "should return false without a quantity" do + order_product.valid?.must_equal true + order_product.quantity = nil + order_product.valid?.must_equal false + end + + it "should return false if quantity is not greater than 0 " do + order_product.quantity = 0 + order_product.valid?.must_equal false + end + end + end + + describe "relationships" do + # it "should return false without a product" do + # order_product.product = nil + # order_product.valid?.must_equal false + # end + + # it "should return false without an order" do + # order_product.order = nil + # order_product.valid?.must_equal false + # end + + it "has a product" do + b = order_products(:order_products) + a = products(:mermaid_fin) + + b.must_respond_to :product + b.product.must_equal a + b.product_id.must_equal a.id + end + + it "has an order" do + b = order_products(:order_products) + a = orders(:order) + + b.must_respond_to :order + b.order.must_equal a + b.order_id.must_equal a.id + end + + + end end diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 478f2aa69f..016c174374 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -4,7 +4,7 @@ let(:product) { products(:mermaid_fin) } describe 'validations' do - decribe 'name' do + describe 'name' do end From a3aa4c6b7f93bfab32e3fa735097e5e0fb1261d7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 09:31:21 -0700 Subject: [PATCH 047/348] order validation for presence of order_products --- app/models/order.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/models/order.rb b/app/models/order.rb index 131eed0344..ffaddb7220 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,6 +2,12 @@ class Order < ApplicationRecord belongs_to :merchant, optional: true has_many :order_products has_many :products, through: :orderproduct + validates :cust_cc, :cust_cc_exp, :cust_addr, :cust_email, :status, :cust_name, presence: true validates_format_of :cust_email, :with => /\A\w+@\w+\.\w+\z/ + validate :has_order_products + + def has_order_products + errors.add(:products, 'must have at least one product') unless order_products.count > 0 + end end From eaa5153707e0c1fb91b321553e6eb9ef89cc2a38 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 09:42:07 -0700 Subject: [PATCH 048/348] order model validations test --- test/models/order_test.rb | 50 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 0e300cb922..4eb69e729f 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -12,10 +12,54 @@ } describe "validations" do - + it "can be created with valid data" do + orders(:order).must_be :valid? + end end - it "must be valid" do - good_order.must_be :valid? + it "won't be valid without status" do + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :status + end + it "won't be valid without cust_name" do + bad_order.status = "complete" + bad_order.cust_name = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_name + end + it "won't be valid without :cust_cc" do + bad_order.cust_cc = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_cc + end + it "won't be valid without :cust_cc_exp" do + bad_order.cust_cc_exp = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_cc_exp + end + it "won't be valid without :cust_addr" do + bad_order.cust_addr = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_addr + end + it "won't be valid without :cust_name" do + bad_order.cust_name = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_name + end + it "won't be valid without :cust_email" do + bad_order.cust_email = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_email + end + it "won't be valid without :cust_email" do + bad_order.cust_email = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_email + end + it "won't be valid if email format is bad" do + bad_order.cust_email = "Email" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_email end end From 7f2b46e8abb589dc347616841fa05e422bc73b0c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 10:14:12 -0700 Subject: [PATCH 049/348] add product categories to seeds --- db/seeds.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 7d0984a0a3..357c03008a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -36,20 +36,20 @@ # Products: 21, 22, 23, 24 products = Product.create([ - { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now , merchant_id: 11 }, - { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, - { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchant_id: 11 }, - { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg?1', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 13 }, - { id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg?resizeid=4&resizeh=399&resizew=399', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 12 } + { category: 'food', name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { category: 'legendary items', name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { category: 'alchemy ingredient', name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { category: 'apparel', name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now , merchant_id: 11 }, + { category: 'magic wands', name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, + { category: 'creatures', name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { category: 'alchemy ingredient', name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, + { category: 'alchemy ingredient', name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchant_id: 11 }, + { category: 'legendary items', name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { category: 'legendary items', name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { category: 'wish granting', id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { category: 'literature', id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 13 }, + { category: 'leather goods', id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, + { category: 'alchemy ingredient', id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 12 } ]) order_products = OrderProduct.create([ From b3b897995cfe9c913b99ed3ae53901b21247c694 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 10:28:48 -0700 Subject: [PATCH 050/348] added tests orders --- app/models/order.rb | 2 +- test/models/order_test.rb | 136 +++++++++++++++++++++++--------------- 2 files changed, 85 insertions(+), 53 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index ffaddb7220..13f6e35ef7 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,7 +1,7 @@ class Order < ApplicationRecord belongs_to :merchant, optional: true has_many :order_products - has_many :products, through: :orderproduct + has_many :products, through: :order_products validates :cust_cc, :cust_cc_exp, :cust_addr, :cust_email, :status, :cust_name, presence: true validates_format_of :cust_email, :with => /\A\w+@\w+\.\w+\z/ diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 4eb69e729f..e00c5defd4 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -2,64 +2,96 @@ describe Order do let(:bad_order) { Order.new( - merchant_id: :grace, - cust_name: "John", - cust_cc: "12345", - cust_cc_exp: "11/22", - cust_addr: "Sea World", - cust_email: "forkhair@mermaid.com", - status: "") + merchant_id: :grace, + cust_name: "John", + cust_cc: "12345", + cust_cc_exp: "11/22", + cust_addr: "Sea World", + cust_email: "forkhair@mermaid.com", + status: "") } describe "validations" do it "can be created with valid data" do - orders(:order).must_be :valid? + orders(:order).must_be :valid? end - end - it "won't be valid without status" do - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :status - end - it "won't be valid without cust_name" do - bad_order.status = "complete" - bad_order.cust_name = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_name - end - it "won't be valid without :cust_cc" do - bad_order.cust_cc = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_cc - end - it "won't be valid without :cust_cc_exp" do - bad_order.cust_cc_exp = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_cc_exp - end - it "won't be valid without :cust_addr" do - bad_order.cust_addr = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_addr - end - it "won't be valid without :cust_name" do - bad_order.cust_name = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_name - end - it "won't be valid without :cust_email" do - bad_order.cust_email = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_email - end - it "won't be valid without :cust_email" do - bad_order.cust_email = "" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_email + it "won't be valid without status" do + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :status + end + it "won't be valid without cust_name" do + bad_order.status = "complete" + bad_order.cust_name = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_name + end + it "won't be valid without :cust_cc" do + bad_order.cust_cc = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_cc + end + it "won't be valid without :cust_cc_exp" do + bad_order.cust_cc_exp = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_cc_exp + end + it "won't be valid without :cust_addr" do + bad_order.cust_addr = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_addr + end + it "won't be valid without :cust_name" do + bad_order.cust_name = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_name + end + it "won't be valid without :cust_email" do + bad_order.cust_email = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_email + end + it "won't be valid without :cust_email" do + bad_order.cust_email = "" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_email + end + it "won't be valid if email format is bad" do + bad_order.cust_email = "Email" + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :cust_email + end + it "won't be valid without order products" do + bad_order.wont_be :valid? + bad_order.errors.messages.must_include :products + end end - it "won't be valid if email format is bad" do - bad_order.cust_email = "Email" - bad_order.wont_be :valid? - bad_order.errors.messages.must_include :cust_email + describe "releationships" do + describe "order products" do + it "will be valid with order products" do + orders(:order).must_be :valid? + end + it "contains an array of Products" do + orders(:order).order_products.each do |product| + product.must_be_kind_of OrderProduct + end + end + it "won't be valid without order products" do + bad_order.products.must_equal [] + bad_order.wont_be :valid? + end + end + describe "merchant relationship" do + it "can have a merchant" do + orders(:order).must_respond_to :merchant + end + end end + # it "has a list of reviews" do + # review = merchants(:ada) + # review.must_respond_to :reviews + # review.reviews.each do |review| + # review.must_be_kind_of Review + # end + # end end From f5f5532f771d672d7cbd1bd576188c9c043ee4e8 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 12:42:44 -0700 Subject: [PATCH 051/348] add resources for all models --- config/routes.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 24e49b9aac..18ab60e235 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,4 +2,7 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html get "/auth/:provider/callback", to: "merchants#login" + + # temporary! Replace this with actual, thought out routes + resources :merchants, :orders, :order_products, :products, :reviews end From 111eae479f26357112174237808dd87573801425 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 13:47:49 -0700 Subject: [PATCH 052/348] added main controller --- app/assets/javascripts/main.js | 2 ++ app/assets/stylesheets/main.scss | 3 +++ app/controllers/main_controller.rb | 8 ++++++++ app/helpers/main_helper.rb | 2 ++ test/controllers/main_controller_test.rb | 7 +++++++ 5 files changed, 22 insertions(+) create mode 100644 app/assets/javascripts/main.js create mode 100644 app/assets/stylesheets/main.scss create mode 100644 app/controllers/main_controller.rb create mode 100644 app/helpers/main_helper.rb create mode 100644 test/controllers/main_controller_test.rb diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/main.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss new file mode 100644 index 0000000000..971b13c825 --- /dev/null +++ b/app/assets/stylesheets/main.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Main controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb new file mode 100644 index 0000000000..9df5ccc246 --- /dev/null +++ b/app/controllers/main_controller.rb @@ -0,0 +1,8 @@ +class MainController < ApplicationController + + def index + @products = Product.all + @merchants = Merchant.all + end + +end diff --git a/app/helpers/main_helper.rb b/app/helpers/main_helper.rb new file mode 100644 index 0000000000..826effed96 --- /dev/null +++ b/app/helpers/main_helper.rb @@ -0,0 +1,2 @@ +module MainHelper +end diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb new file mode 100644 index 0000000000..33c8140433 --- /dev/null +++ b/test/controllers/main_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe MainController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From 5b0d5896fc4af507d1889f03c4bf197f43c816c6 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 14:06:14 -0700 Subject: [PATCH 053/348] basic product tests --- test/controllers/products_controller_test.rb | 92 +++++++++++++++++++- 1 file changed, 89 insertions(+), 3 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 392a20e292..4b539690ed 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,7 +1,93 @@ require "test_helper" describe ProductsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + let(:p) { Product.first } + + before do + before_count = Product.count + end + + describe 'for logged in users' do + before do + # log in + end + + it 'can successfully access index of products' do + get products_path + + must_respond_with :success + end + + it 'can successfully access show product' do + get product_path(p.id) + + must_respond_with :success + end + + it 'can successfully access new product' do + skip + end + + it 'can successfully create valid product' do + skip + end + + it 'can successfully access edit for own product' do + skip + end + + it 'CANNOT successfully edit other users products' do + skip + end + + it 'can successfully update own product' do + skip + end + + it 'CANNOT successfully update other users product' do + skip + end + + it 'can successfully destroy own product' do + skip + end + + it 'CANNOT destroy other users products' do + skip + end + end + + describe 'for guest users' do + it 'can successfully access index of products' do + get products_path + + must_respond_with :success + end + + it 'can successfully access show product' do + get product_path(p.id) + + must_respond_with :success + end + + it 'CANNOT access new product' do + skip + end + + it 'CANNOT successfully create valid product' do + skip + end + + it 'CANNOT access edit for product' do + skip + end + + it 'CANNOT update product' do + skip + end + + it 'CANNOT destroy other users products' do + skip + end + end end From eb83525cd36af5a5cd360ff347c84011360b72b8 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 14:08:23 -0700 Subject: [PATCH 054/348] basic controller method definitions --- app/controllers/products_controller.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index f1ad12ddea..6cc58717c0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,2 +1,22 @@ class ProductsController < ApplicationController + def index + end + + def show + end + + def new + end + + def create + end + + def edit + end + + def update + end + + def destroy + end end From 7b965624820bb2e68218d6d847d101848508ec1e Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 14:13:19 -0700 Subject: [PATCH 055/348] write product controller tests (red) --- app/controllers/products_controller.rb | 13 +++++++++++++ test/controllers/products_controller_test.rb | 4 +++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6cc58717c0..4a0b7069c8 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,11 +1,15 @@ class ProductsController < ApplicationController + before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] + def index + @products = Product.all end def show end def new + @product = Product.new end def create @@ -19,4 +23,13 @@ def update def destroy end + + private + def find_product_by_params + @product = Product.find(params[:id]) + + unless @product + return head :not_found + end + end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 4b539690ed..0c484d24ad 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -25,7 +25,9 @@ end it 'can successfully access new product' do - skip + get new_product_path + + must_respond_with :success end it 'can successfully create valid product' do From 4020a770309b13b81c8a422fee16e1e5baff134a Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 14:14:16 -0700 Subject: [PATCH 056/348] create (blank) product view pages --- app/views/products/edit.html.erb | 0 app/views/products/index.html.erb | 0 app/views/products/new.html.erb | 0 app/views/products/show.html.erb | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/views/products/edit.html.erb create mode 100644 app/views/products/index.html.erb create mode 100644 app/views/products/new.html.erb create mode 100644 app/views/products/show.html.erb diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 From bfbc122ddabcd0a17915aad7150b2a62f3df4f85 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 14:19:27 -0700 Subject: [PATCH 057/348] added controller test for main --- app/controllers/main_controller.rb | 2 +- app/views/main/index.html.erb | 0 config/routes.rb | 2 +- test/controllers/main_controller_test.rb | 7 +++++++ 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 app/views/main/index.html.erb diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index 9df5ccc246..13f8279611 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -4,5 +4,5 @@ def index @products = Product.all @merchants = Merchant.all end - + end diff --git a/app/views/main/index.html.erb b/app/views/main/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/routes.rb b/config/routes.rb index 18ab60e235..776353ba1e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - + root "main#index" get "/auth/:provider/callback", to: "merchants#login" # temporary! Replace this with actual, thought out routes diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb index 33c8140433..9ed68e73c5 100644 --- a/test/controllers/main_controller_test.rb +++ b/test/controllers/main_controller_test.rb @@ -1,6 +1,13 @@ require "test_helper" describe MainController do + + describe "#index" do + it "should respond with success" do + get root_path + must_respond_with :success + end + end # it "must be a real test" do # flunk "Need real tests" # end From b5d356853b91f3c4216312f58c7d4dc612b18bc0 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 14:39:00 -0700 Subject: [PATCH 058/348] products#index layout --- app/assets/stylesheets/products.scss | 13 +++++++++++++ app/views/products/_product-list.html.erb | 11 +++++++++++ app/views/products/index.html.erb | 3 +++ 3 files changed, 27 insertions(+) create mode 100644 app/views/products/_product-list.html.erb diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 89e2e8db07..ac59851738 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -1,3 +1,16 @@ // Place all the styles related to the products controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ + +.product-img { + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + height: 15rem; + overflow: hidden; + width: 15rem; +} + +.product:last-of-type { + float: left !important; +} diff --git a/app/views/products/_product-list.html.erb b/app/views/products/_product-list.html.erb new file mode 100644 index 0000000000..8cf4fcb014 --- /dev/null +++ b/app/views/products/_product-list.html.erb @@ -0,0 +1,11 @@ +
+ <% products.each do |product| %> +
+
+

+ <%= link_to product.name, product_path(product.id) %> +

+
+ <% end %> +
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index e69de29bb2..4143d7a835 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -0,0 +1,3 @@ +

Popular Products

+ +<%= render partial: "product-list", locals: {products: @products} %> From 4148f7939f0dd49b9b6fb9b3b52f748b4a576243 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 14:41:05 -0700 Subject: [PATCH 059/348] main controller test --- test/controllers/main_controller_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb index 9ed68e73c5..dc3944cd9b 100644 --- a/test/controllers/main_controller_test.rb +++ b/test/controllers/main_controller_test.rb @@ -6,7 +6,7 @@ it "should respond with success" do get root_path must_respond_with :success - end + end end # it "must be a real test" do # flunk "Need real tests" From 81f01234085d03f8118e37c9a7d2d9fb190fb15b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 14:55:46 -0700 Subject: [PATCH 060/348] more product index formatting --- app/assets/stylesheets/products.scss | 35 +++++++++++++++++++---- app/views/products/_product-list.html.erb | 16 ++++++----- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index ac59851738..595eb4c96c 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -2,15 +2,40 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ -.product-img { +//////////////////// +// PRODUCTS LIST: // +//////////////////// + +.product { + height: 19rem; + margin: 1rem; + padding-top: 1.25rem; + text-align: center; + width: 19rem; +} + +.product:hover { + color: #3C7A89; +} + +.product a { + color: inherit; +} + +.product:last-of-type { + float: left !important; +} + +.product p { + margin-bottom: 0; +} + +.product-list .product-img { background-position: center center; background-repeat: no-repeat; background-size: cover; height: 15rem; + margin: auto auto .25rem auto; overflow: hidden; width: 15rem; } - -.product:last-of-type { - float: left !important; -} diff --git a/app/views/products/_product-list.html.erb b/app/views/products/_product-list.html.erb index 8cf4fcb014..4613ca8ccd 100644 --- a/app/views/products/_product-list.html.erb +++ b/app/views/products/_product-list.html.erb @@ -1,11 +1,13 @@
<% products.each do |product| %> -
-
-

- <%= link_to product.name, product_path(product.id) %> -

-
+
+ <%= link_to product_path(product.id) do %> +
+

+ <%= product.name %> +

+ <% end %> +
<% end %>
From 6dde9e0f71687728e857e3641971e4afe3538dff Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 15:33:15 -0700 Subject: [PATCH 061/348] product show page layout --- app/assets/stylesheets/products.scss | 57 +++++++++++++++++++++-- app/views/products/_product-list.html.erb | 2 +- app/views/products/_review.html.erb | 1 + app/views/products/show.html.erb | 30 ++++++++++++ 4 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 app/views/products/_review.html.erb diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 595eb4c96c..3a995d7987 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -2,6 +2,7 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ + //////////////////// // PRODUCTS LIST: // //////////////////// @@ -31,11 +32,61 @@ } .product-list .product-img { + height: 15rem; + margin: auto auto .25rem auto; + width: 15rem; +} + +.product-img { background-position: center center; background-repeat: no-repeat; background-size: cover; - height: 15rem; - margin: auto auto .25rem auto; + margin: auto; overflow: hidden; - width: 15rem; +} + +//////////////////// +// PRODUCTS PAGE: // +//////////////////// + +section.product-info { + margin: auto; + float: none; +} + +.product-info .row { + margin: 1rem auto; +} + +.product-info .product-img { + height: 20rem; + width: 20rem; +} + +.product-details { + padding: 2rem; +} + +.product-details p, .product-details label { + font-size: 1.25rem; +} + +.product-details label { + display: inline; + padding-left: 0; +} + +.product-details select { + display: inline; + // width: 30%; +} + +.product-details [type="submit"] { + display: block; + margin: auto; +} + +.product-details .button { + font-size: 1.5rem; + padding: 1rem 2rem; } diff --git a/app/views/products/_product-list.html.erb b/app/views/products/_product-list.html.erb index 4613ca8ccd..b44f922e99 100644 --- a/app/views/products/_product-list.html.erb +++ b/app/views/products/_product-list.html.erb @@ -3,7 +3,7 @@
<%= link_to product_path(product.id) do %>
+ style="background-image: url('<%= product.image_url %>');">

<%= product.name %>

diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb new file mode 100644 index 0000000000..c20552c9be --- /dev/null +++ b/app/views/products/_review.html.erb @@ -0,0 +1 @@ +

Placeholder review text

diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e69de29bb2..cdcd8265f1 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -0,0 +1,30 @@ +
+
+
+
+
+
+
+

<%= @product.name %>

+

$<%= '%.2f' % @product.price %>

+ <%= form_tag do %> + <%= label_tag :quantity, "Quantity:", class: 'small-6 columns' %> + <%= select_tag :quantity, options_for_select((1..@product.quantity)), class: 'small-6 columns' %> + <%= submit_tag "Add to Cart", class: 'button' %> + <% end %> +
+
+
+

Description:

+

+ <%= @product.description %> +

+
+ +
+

Average Review: <%= @product.reviews.average(:rating) %>

+ <% @product.reviews.each do |review| %> + <%= render partial: 'review', locals: {review: review} %> + <% end %> +
+
From 9c03a895c708170cf7224c7e64e6d88230da2c65 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 15:37:01 -0700 Subject: [PATCH 062/348] add merchant name/link to product#show page --- app/views/products/show.html.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index cdcd8265f1..db469cb5e4 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -6,6 +6,9 @@

<%= @product.name %>

+

From seller + <%= link_to @product.merchant.username, product_path(@product.id) %> +

$<%= '%.2f' % @product.price %>

<%= form_tag do %> <%= label_tag :quantity, "Quantity:", class: 'small-6 columns' %> From d8a26b111e3602c8e8174a0184937b848cf1b35d Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 15:41:11 -0700 Subject: [PATCH 063/348] tests for guest users on product#new and product#edit --- test/controllers/products_controller_test.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 0c484d24ad..305e1535da 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -73,7 +73,10 @@ end it 'CANNOT access new product' do - skip + get new_product_path(p.id) + + flash[:status].must_equal :failure + must_respond_with :bad_request end it 'CANNOT successfully create valid product' do @@ -81,7 +84,10 @@ end it 'CANNOT access edit for product' do - skip + get new_product_path(p.id) + + flash[:status].must_equal :failure + must_respond_with :bad_request end it 'CANNOT update product' do From 0edb036990c02cb87e3b7d725e2cf668c2a2d49f Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 15:48:49 -0700 Subject: [PATCH 064/348] basic forms for product#new and product#edit --- app/views/products/_product-form.html.erb | 21 +++++++++++++++++++++ app/views/products/edit.html.erb | 3 +++ app/views/products/new.html.erb | 3 +++ 3 files changed, 27 insertions(+) create mode 100644 app/views/products/_product-form.html.erb diff --git a/app/views/products/_product-form.html.erb b/app/views/products/_product-form.html.erb new file mode 100644 index 0000000000..9a8fb56b21 --- /dev/null +++ b/app/views/products/_product-form.html.erb @@ -0,0 +1,21 @@ +<%= form_for @product do |f| %> + <%= f.label :name, "Product Name" %> + <%= f.text_field :name %> + + <%= f.label :image_url, "Image URL" %> + <%= f.text_field :image_url %> + + <%= f.label :category %> + <%= f.text_field :category %> + + <%= f.label :price %> + <%= f.text_field :price %> + + <%= f.label :quantity %> + <%= f.text_field :quantity %> + + <%= f.label :description %> + <%= f.text_area :description %> + + <%= f.submit button, class: 'button' %> +<% end %> diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index e69de29bb2..237e27cceb 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -0,0 +1,3 @@ +

Edit Product Info

+ +<%= render partial: "product-form", locals: {button: "Update"} %> diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index e69de29bb2..e8d0e57489 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -0,0 +1,3 @@ +

Create New Product

+ +<%= render partial: "product-form", locals: {button: "Create"} %> From 3043c271d9e51790d7ca85143ccef8e4e24cf4a8 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 15:56:14 -0700 Subject: [PATCH 065/348] guest users cannot access products#new, #create, #edit, #update, #destroy --- app/controllers/products_controller.rb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4a0b7069c8..99a1892e26 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,10 @@ class ProductsController < ApplicationController before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] + before_action :confirm_login, only: [:new, :create, :edit, :update, :destroy] + + before_action :confirm_ownership, only: [:edit, :update, :destroy] + def index @products = Product.all end @@ -32,4 +36,20 @@ def find_product_by_params return head :not_found end end + + def confirm_login + if session[:user_id].nil? + flash[:status] = :failure + flash[:message] = "You must be logged in to do that." + return redirect_back(fallback_location: products_path) + end + end + + def confirm_ownership + unless session[:user_id] == @product.merchant_id + flash[:status] = :failure + flash[:message] = "Only a product's merchant can modify a product." + return redirect_back(fallback_location: products_path) + end + end end From 8a052b5f43ebc89ef5587738403b43f495bbd910 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 15:57:49 -0700 Subject: [PATCH 066/348] fix redirect tests --- test/controllers/products_controller_test.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 305e1535da..aff575fc0f 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -25,6 +25,7 @@ end it 'can successfully access new product' do + skip get new_product_path must_respond_with :success @@ -76,7 +77,7 @@ get new_product_path(p.id) flash[:status].must_equal :failure - must_respond_with :bad_request + must_respond_with :found end it 'CANNOT successfully create valid product' do @@ -87,7 +88,7 @@ get new_product_path(p.id) flash[:status].must_equal :failure - must_respond_with :bad_request + must_respond_with :found end it 'CANNOT update product' do From 285b0680ba9988f3c6607a2731fe2014e8cf4524 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 16:15:18 -0700 Subject: [PATCH 067/348] add fakey login for testing --- app/controllers/products_controller.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 99a1892e26..af09165e30 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,4 +1,6 @@ class ProductsController < ApplicationController + before_action :fakey_login # take this out later pleeeasseee + before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] before_action :confirm_login, only: [:new, :create, :edit, :update, :destroy] @@ -29,6 +31,10 @@ def destroy end private + def fakey_login + session[:user_id] = 21 + end + def find_product_by_params @product = Product.find(params[:id]) From 4e4d0ee20ef8c14dbee724d566f5048d7e293c0f Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 16:15:22 -0700 Subject: [PATCH 068/348] There were no merchant views so I added some --- app/views/merchants/index.html.erb | 0 app/views/merchants/show.html.erb | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/views/merchants/index.html.erb create mode 100644 app/views/merchants/show.html.erb diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 From 2128ee8031c5eae14cd1403bf965a6bd2e8a3b04 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 16:15:41 -0700 Subject: [PATCH 069/348] Added gem rails-pry --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 053f348c30..10e988ad3e 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,7 @@ git_source(:github) do |repo_name| "https://github.com/#{repo_name}.git" end - +gem 'pry-rails' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.1.4' # Use postgresql as the database for Active Record From 52cf10849260a433911a43205f55bfcecaaf74d1 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 16:16:01 -0700 Subject: [PATCH 070/348] remove category from form pending new implementation --- app/views/products/_product-form.html.erb | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/views/products/_product-form.html.erb b/app/views/products/_product-form.html.erb index 9a8fb56b21..993527abfc 100644 --- a/app/views/products/_product-form.html.erb +++ b/app/views/products/_product-form.html.erb @@ -5,9 +5,6 @@ <%= f.label :image_url, "Image URL" %> <%= f.text_field :image_url %> - <%= f.label :category %> - <%= f.text_field :category %> - <%= f.label :price %> <%= f.text_field :price %> From 4d1603165d7a93dfc1594dd22b0fa1b72cec0b02 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 16:16:10 -0700 Subject: [PATCH 071/348] added render_404 method to application file --- app/controllers/application_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c07694e9d..5745ea14c9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,8 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + + def render_404 + raise ActionController::RoutingError.new('Not Found') + end + end From 0183d8950eaef0fee164800e9cff5de8e4b89c4d Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 19 Oct 2017 16:16:57 -0700 Subject: [PATCH 072/348] testing merchants controller --- app/controllers/merchants_controller.rb | 49 +++++++++++++++++++ test/controllers/merchants_controller_test.rb | 31 ++++++++++++ 2 files changed, 80 insertions(+) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 6a2c1e879f..dfb018555d 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -2,4 +2,53 @@ class MerchantsController < ApplicationController def login auth_hash = request.env['omniauth.auth'] end + + def logout + session[:merchant_id] = nil + redirect_to root_path + end + #CRUD + + def new + @merchant = Merchant.new + end + + def create + @merchant = Merchant.new(merchant_params) + + if @merchant.save + #success message + redirect_to root_path + else + #I'm not sure how we're deciding to do error messages. Flash? + render :new + end + end + + def index + @merchants = Merchant.all + end + + def edit + @merchant = Merchant.find(params[:id]) + end + + def update + @merchant = Merchant.find(params[:id]) + end + + def show + @merchant = Merchant.find_by(id: params[:id]) + render_404 unless @merchant + end + + def destroy + end + + + private + + def merchant_params + return params.require(:merchant).permit(:username, :email, :oauth_uid, :oauth_provider) + end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 6eb57f7baa..8eb012c5c2 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,6 +1,37 @@ require "test_helper" describe MerchantsController do + describe "index" do + it "succeeds with many merchants" do + # Assumption: there are many merchants in the DB + # @merchants.count.must_be :>, 0 + get merchants_path + must_respond_with :success + end + + it "succeeds with no merchants" do + # Start with a clean slate + # binding.pry + Merchant.destroy_all + + get merchants_path + must_respond_with :success + end + end + + describe "show" do + it "succeeds for an extant merchant" do + get merchant_path(Merchant.first) + must_respond_with :success + end + + it "renders 404 not_found for a bogus merchant" do + bogus_merchant_id = Merchant.last.id + 1 + # binding.pry + get merchant_path(bogus_merchant_id) + must_respond_with :not_found + end + end # it "must be a real test" do # flunk "Need real tests" # end From ed63908a6a6ca57eaaa77c6f9b8c5be93a9b4db2 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 17:02:15 -0700 Subject: [PATCH 073/348] product#create --- app/controllers/products_controller.rb | 19 +++++++++++++++++ test/controllers/products_controller_test.rb | 22 ++++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index af09165e30..04f60ec366 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -19,6 +19,21 @@ def new end def create + @product = Product.new(prod_params) + @product.merchant_id = session[:user_id] + + result = @product.save + + if result + flash.now[:status] = :success + flash.now[:message] = "Successfully created #{@product.name}" + return redirect_to product_path(@product.id) + else + flash.now[:status] = :failure + flash.now[:message] = "Could not create new product" + flash.now[:details] = @product.errors.messages + return render :new, status: :bad_request + end end def edit @@ -58,4 +73,8 @@ def confirm_ownership return redirect_back(fallback_location: products_path) end end + + def prod_params + params.require(:product).permit(:name, :image_url, :price, :quantity, :description) + end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index aff575fc0f..674eae444d 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -2,9 +2,12 @@ describe ProductsController do let(:p) { Product.first } + let(:good_params) { { product: { + "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test"} + } } before do - before_count = Product.count + @before_count = Product.count end describe 'for logged in users' do @@ -25,14 +28,23 @@ end it 'can successfully access new product' do - skip + # skip get new_product_path must_respond_with :success end - it 'can successfully create valid product' do - skip + describe 'create' do + it 'can successfully create valid product' do + post products_path, params: good_params + + must_respond_with :success + Product.count.must_equal (@before_count + 1) + end + + it 'will not create new product with invalid data' do + + end end it 'can successfully access edit for own product' do @@ -74,6 +86,7 @@ end it 'CANNOT access new product' do + skip get new_product_path(p.id) flash[:status].must_equal :failure @@ -85,6 +98,7 @@ end it 'CANNOT access edit for product' do + skip get new_product_path(p.id) flash[:status].must_equal :failure From a7637387d6321d2491aca4a0e9e815df6223cab3 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 17:23:11 -0700 Subject: [PATCH 074/348] fixed weird seeds error --- app/views/products/_temp-errors.html.erb | 14 ++++ app/views/products/new.html.erb | 2 + db/seeds.rb | 97 +++++++++++++----------- 3 files changed, 69 insertions(+), 44 deletions(-) create mode 100644 app/views/products/_temp-errors.html.erb diff --git a/app/views/products/_temp-errors.html.erb b/app/views/products/_temp-errors.html.erb new file mode 100644 index 0000000000..b98f4e936b --- /dev/null +++ b/app/views/products/_temp-errors.html.erb @@ -0,0 +1,14 @@ +
+ <%= flash[:message] if flash[:message] %> + <% if flash[:details] %> +
    + <% flash[:details].each do |category, errors| %> + <% errors.each do |error| %> +
  • + <%= category %> <%= error %> +
  • + <% end %> + <% end %> +
+ <% end %> +
diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index e8d0e57489..1053daf4eb 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,3 +1,5 @@

Create New Product

+<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> + <%= render partial: "product-form", locals: {button: "Create"} %> diff --git a/db/seeds.rb b/db/seeds.rb index 357c03008a..9c3364430b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -6,61 +6,70 @@ # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) -# Merchants: 21, 22 merchants = Merchant.create([ - { username: 'Eagle', email: 'watchingyou@gmail.com', id: 11, oauth_provider: 'github', oauth_uid: '123456', created_at: Time.now, updated_at: Time.now }, - { username: 'Glimpie', email: 'mememe@hotmail.com', id: 12, oauth_provider: 'github', oauth_uid: '123457', created_at: Time.now, updated_at: Time.now }, - { username: 'Earthborn King', email: 'eking@something.com', id: 13, oauth_provider: 'github', oauth_uid: '123458', created_at: Time.now, updated_at: Time.now }, - { username: 'MagicBrian', email: 'brian@spider.com', id: 21, oauth_provider: 'github', oauth_uid: '123459', created_at: Time.now, updated_at: Time.now }, - { username: 'Taako', email: 'abra@cafu.com', id: 22, oauth_provider: 'github', oauth_uid: '123460', created_at: Time.now, updated_at: Time.now }, - { username: 'Forest Nymph', email: 'inatree@treepeople.com', id: 31, oauth_provider: 'github', oauth_uid: '123461', created_at: Time.now, updated_at: Time.now }, - { username: 'Bridge Troll', email: 'trolltoll@bridge.com', id: 32, oauth_provider: 'github', oauth_uid: '123462', created_at: Time.now, updated_at: Time.now }, - { username: 'Puck', email: 'sneakyelf@shakespeare.com', id: 40, oauth_provider: 'github', oauth_uid: '123463', created_at: Time.now, updated_at: Time.now } + { username: 'Eagle', email: 'watchingyou@gmail.com', id: 1, oauth_provider: 'github', oauth_uid: '123456', created_at: Time.now, updated_at: Time.now }, + { username: 'Glimpie', email: 'mememe@hotmail.com', id: 2, oauth_provider: 'github', oauth_uid: '123457', created_at: Time.now, updated_at: Time.now }, + { username: 'Earthborn King', email: 'eking@something.com', id: 3, oauth_provider: 'github', oauth_uid: '123458', created_at: Time.now, updated_at: Time.now }, + { username: 'MagicBrian', email: 'brian@spider.com', id: 4, oauth_provider: 'github', oauth_uid: '123459', created_at: Time.now, updated_at: Time.now }, + { username: 'Taako', email: 'abra@cafu.com', id: 5, oauth_provider: 'github', oauth_uid: '123460', created_at: Time.now, updated_at: Time.now }, + { username: 'Forest Nymph', email: 'inatree@treepeople.com', id: 6, oauth_provider: 'github', oauth_uid: '123461', created_at: Time.now, updated_at: Time.now }, + { username: 'Bridge Troll', email: 'trolltoll@bridge.com', id: 7, oauth_provider: 'github', oauth_uid: '123462', created_at: Time.now, updated_at: Time.now }, + { username: 'Puck', email: 'sneakyelf@shakespeare.com', id: 8, oauth_provider: 'github', oauth_uid: '123463', created_at: Time.now, updated_at: Time.now } ]) -# Orders: 21, 22, 23, 24 orders = Order.create([ - { cust_name: 'Elvy', status: 'paid', cust_email: 'elvii@gmail.com', cust_cc: '11111000000', cust_cc_exp: '02/18', cust_addr: 'Elves Land', id: 11, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Earthborn King', status: 'paid', cust_email: 'eking@something.com', cust_cc: '22222220000000', cust_cc_exp: '10/19', cust_addr: 'Magestic Castle VI', id: 12, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Eagle', status: 'completed', cust_email: 'watchingyou@gmail.com', cust_cc: '3333333000000', cust_cc_exp: '04/18', cust_addr: '2nd Rock ', id: 13, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Maeraly', status: 'completed', cust_email: 'maeraly@hotmail.com', cust_cc: '4444000000', cust_cc_exp: '02/21', cust_addr: '123 75th Line ', id: 14, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Sar Squatch', status: 'completed', cust_email: 'big@feet.com', cust_cc: '1234567890', cust_cc_exp: '06/19', cust_addr: 'The Woods', id: 21, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Ponyboy', status: 'paid', cust_email: 'big@feet.com', cust_cc: '1234552567890', cust_cc_exp: '06/19', cust_addr: 'Cartoon Network', id: 22, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Maleficent', status: 'completed', cust_email: 'veryevilfairy@hotmail.com', cust_cc: '1234567823423490', cust_cc_exp: '04/25', cust_addr: '12345 Perceforest', id: 23, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Witchy Witcherson', status: 'completed', cust_email: 'witch@witch.com', cust_cc: '1234567890234234', cust_cc_exp: '06/22', cust_addr: '294 Witch St, Witchville', id: 24, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Angry Waitress', status: 'completed', cust_email: 'dontmesswithbess@restaurant.com', cust_cc: '1234567890', cust_cc_exp: '10/90', cust_addr: 'The Restaurant', id: 33, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'DND Master', status: 'paid', cust_email: 'dragon_person@email.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'Fantasy Land', id: 34, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Ialways Wearmask', status: 'completed', cust_email: 'standingoveryouwiththatcreepymask@yourhouse.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'Charbroiled Goodness St', id: 35, created_at: Time.now, updated_at: Time.now }, - { cust_name: 'Hermit Wizard', status: 'completed', cust_email: 'lookingforlove@lonelyville.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'The cave', id: 36, created_at: Time.now, updated_at: Time.now } + { cust_name: 'Elvy', status: 'paid', cust_email: 'elvii@gmail.com', cust_cc: '11111000000', cust_cc_exp: '02/18', cust_addr: 'Elves Land', id: 1, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Earthborn King', status: 'paid', cust_email: 'eking@something.com', cust_cc: '22222220000000', cust_cc_exp: '10/19', cust_addr: 'Magestic Castle VI', id: 2, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Eagle', status: 'completed', cust_email: 'watchingyou@gmail.com', cust_cc: '3333333000000', cust_cc_exp: '04/18', cust_addr: '2nd Rock ', id: 3, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Maeraly', status: 'completed', cust_email: 'maeraly@hotmail.com', cust_cc: '4444000000', cust_cc_exp: '02/21', cust_addr: '123 75th Line ', id: 4, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Sar Squatch', status: 'completed', cust_email: 'big@feet.com', cust_cc: '1234567890', cust_cc_exp: '06/19', cust_addr: 'The Woods', id: 5, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Ponyboy', status: 'paid', cust_email: 'big@feet.com', cust_cc: '1234552567890', cust_cc_exp: '06/19', cust_addr: 'Cartoon Network', id: 6, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Maleficent', status: 'completed', cust_email: 'veryevilfairy@hotmail.com', cust_cc: '1234567823423490', cust_cc_exp: '04/25', cust_addr: '12345 Perceforest', id: 7, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Witchy Witcherson', status: 'completed', cust_email: 'witch@witch.com', cust_cc: '1234567890234234', cust_cc_exp: '06/22', cust_addr: '294 Witch St, Witchville', id: 8, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Angry Waitress', status: 'completed', cust_email: 'dontmesswithbess@restaurant.com', cust_cc: '1234567890', cust_cc_exp: '10/90', cust_addr: 'The Restaurant', id: 9, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'DND Master', status: 'paid', cust_email: 'dragon_person@email.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'Fantasy Land', id: 10, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Ialways Wearmask', status: 'completed', cust_email: 'standingoveryouwiththatcreepymask@yourhouse.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'Charbroiled Goodness St', id: 11, created_at: Time.now, updated_at: Time.now }, + { cust_name: 'Hermit Wizard', status: 'completed', cust_email: 'lookingforlove@lonelyville.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'The cave', id: 12, created_at: Time.now, updated_at: Time.now } ]) -# Products: 21, 22, 23, 24 products = Product.create([ - { category: 'food', name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 11, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { category: 'legendary items', name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 12, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { category: 'alchemy ingredient', name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 13, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { category: 'apparel', name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 14, created_at: Time.now, updated_at: Time.now , merchant_id: 11 }, - { category: 'magic wands', name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 21, created_at: Time.now, updated_at: Time.now, merchant_id: 22 }, - { category: 'creatures', name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 22, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { category: 'alchemy ingredient', name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 23, created_at: Time.now, updated_at: Time.now, merchant_id: 21 }, - { category: 'alchemy ingredient', name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 37, created_at: Time.now, updated_at: Time.now, merchant_id: 11 }, - { category: 'legendary items', name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 38, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { category: 'legendary items', name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 39, created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { category: 'wish granting', id: 1, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { category: 'literature', id: 2, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 13 }, - { category: 'leather goods', id: 3, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 31 }, - { category: 'alchemy ingredient', id: 4, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 12 } + { category: 'food', name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 1, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { category: 'legendary items', name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 2, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { category: 'alchemy ingredient', name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 3, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { category: 'apparel', name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 4, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, + { category: 'magic wands', name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { category: 'creatures', name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 6, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { category: 'alchemy ingredient', name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 7, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, + { category: 'alchemy ingredient', name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 8, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { category: 'legendary items', name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { category: 'legendary items', name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 10, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { category: 'wish granting', id: 11, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, + { category: 'literature', id: 12, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { category: 'leather goods', id: 13, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, + { category: 'alchemy ingredient', id: 14, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } ]) order_products = OrderProduct.create([ - { status: 'shipped', quantity: '1', order_id: 24, product_id: 21, created_at: Time.now, updated_at: Time.now, id: 21 }, - { status: 'shipped', quantity: '3', order_id: 24, product_id: 23, created_at: Time.now, updated_at: Time.now, id: 22 }, - { status: 'shipped', quantity: '1', order_id: 22, product_id: 22, created_at: Time.now, updated_at: Time.now, id: 23 }, - { status: 'shipped', quantity: '3', order_id: 21, product_id: 23, created_at: Time.now, updated_at: Time.now, id: 24 }, - { status: 'shipped', quantity: '1', order_id: 23, product_id: 21, created_at: Time.now, updated_at: Time.now, id: 25 } + { status: 'shipped', quantity: '1', order_id: 1, product_id: 13, created_at: Time.now, updated_at: Time.now, id: 1 }, + { status: 'shipped', quantity: '3', order_id: 2, product_id: 12, created_at: Time.now, updated_at: Time.now, id: 2 }, + { status: 'shipped', quantity: '1', order_id: 3, product_id: 11, created_at: Time.now, updated_at: Time.now, id: 3 }, + { status: 'shipped', quantity: '3', order_id: 4, product_id: 10, created_at: Time.now, updated_at: Time.now, id: 4 }, + { status: 'shipped', quantity: '1', order_id: 5, product_id: 8, created_at: Time.now, updated_at: Time.now, id: 1 }, + { status: 'shipped', quantity: '3', order_id: 6, product_id: 7, created_at: Time.now, updated_at: Time.now, id: 2 }, + { status: 'shipped', quantity: '1', order_id: 7, product_id: 9, created_at: Time.now, updated_at: Time.now, id: 3 }, + { status: 'shipped', quantity: '3', order_id: 8, product_id: 1, created_at: Time.now, updated_at: Time.now, id: 4 }, + { status: 'shipped', quantity: '1', order_id: 9, product_id: 2, created_at: Time.now, updated_at: Time.now, id: 1 }, + { status: 'shipped', quantity: '3', order_id: 10, product_id: 3, created_at: Time.now, updated_at: Time.now, id: 2 }, + { status: 'shipped', quantity: '1', order_id: 11, product_id: 4, created_at: Time.now, updated_at: Time.now, id: 3 }, + { status: 'shipped', quantity: '3', order_id: 12, product_id: 5, created_at: Time.now, updated_at: Time.now, id: 4 }, + { status: 'shipped', quantity: '1', order_id: 11, product_id: 6, created_at: Time.now, updated_at: Time.now, id: 1 }, + { status: 'shipped', quantity: '3', order_id: 10, product_id: 7, created_at: Time.now, updated_at: Time.now, id: 2 }, + { status: 'shipped', quantity: '1', order_id: 9, product_id: 8, created_at: Time.now, updated_at: Time.now, id: 3 }, + { status: 'shipped', quantity: '3', order_id: 8, product_id: 9, created_at: Time.now, updated_at: Time.now, id: 4 }, + { status: 'shipped', quantity: '1', order_id: 7, product_id: 14, created_at: Time.now, updated_at: Time.now, id: 5 } ]) reviews = Review.create([ - { rating: 5, description: 'very nice and magic', product_id: 22, created_at: Time.now, updated_at: Time.now, id: 21 }, - { rating: 1, description: 'these are wizards tears, NOT witch\'s tears. seller should be ashamed', product_id: 23, created_at: Time.now, updated_at: Time.now, id: 22 } + { rating: 5, description: 'very nice and magic', product_id: 6, created_at: Time.now, updated_at: Time.now, id: 1 }, + { rating: 1, description: 'these are wizards tears, NOT witch\'s tears. seller should be ashamed', product_id: 7, created_at: Time.now, updated_at: Time.now, id: 22 } ]) From 1c4ee75c97c519b35d55a07460b601138e87c01e Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 17:28:47 -0700 Subject: [PATCH 075/348] fix fakey login to account for db seed fix --- app/controllers/products_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 04f60ec366..1601c938cd 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -47,7 +47,7 @@ def destroy private def fakey_login - session[:user_id] = 21 + session[:user_id] = 4 end def find_product_by_params From 4f8ff0caeb64b0900df17c1aa6a75c0e4ba9780b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 17:40:18 -0700 Subject: [PATCH 076/348] product controller tests for #create --- app/controllers/products_controller.rb | 2 +- test/controllers/products_controller_test.rb | 29 ++++++++++++++++++-- test/fixtures/products.yml | 6 ++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 1601c938cd..af0e5bf63c 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -47,7 +47,7 @@ def destroy private def fakey_login - session[:user_id] = 4 + session[:user_id] = Merchant.first.id end def find_product_by_params diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 674eae444d..241ba55aed 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -2,9 +2,16 @@ describe ProductsController do let(:p) { Product.first } + let(:owned_product) { Product.find_by(merchant_id: Merchant.first.id) } let(:good_params) { { product: { "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test"} } } + let(:bad_params) { { product: { + "name"=>""} + } } + let(:tmi_params) { { product: { + "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test", "tmi"=>"uh oh", "id"=>1} + } } before do @before_count = Product.count @@ -38,17 +45,33 @@ it 'can successfully create valid product' do post products_path, params: good_params - must_respond_with :success + must_respond_with :found + flash[:status].must_equal :success Product.count.must_equal (@before_count + 1) end it 'will not create new product with invalid data' do + post products_path, params: bad_params + + must_respond_with :bad_request + flash[:status].must_equal :failure + Product.count.must_equal @before_count + end + + it 'uses strong params' do + post products_path, params: tmi_params + must_respond_with :found + flash[:status].must_equal :success + Product.last.id.wont_equal 1 + Product.count.must_equal (@before_count + 1) end end it 'can successfully access edit for own product' do - skip + get edit_product_path(p.id) + + must_respond_with :success end it 'CANNOT successfully edit other users products' do @@ -99,7 +122,7 @@ it 'CANNOT access edit for product' do skip - get new_product_path(p.id) + get edit_product_path(owned_product.id) flash[:status].must_equal :failure must_respond_with :found diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 3745521cb5..8fb6d72712 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -9,3 +9,9 @@ mermaid_fin: price: 3.45 quantity: 3 merchant: ada + +wand: + name: Magic Wand + price: 10.14 + quantity: 1 + merchant: grace From 3408f5a8eec1aaf52b192a81e77bac0ef29c204e Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 17:42:40 -0700 Subject: [PATCH 077/348] temporary error display --- app/views/products/edit.html.erb | 4 ++++ app/views/products/index.html.erb | 2 ++ app/views/products/show.html.erb | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index 237e27cceb..36c85c430e 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1,3 +1,7 @@

Edit Product Info

+ +<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> + + <%= render partial: "product-form", locals: {button: "Update"} %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 4143d7a835..174b9e477b 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,3 +1,5 @@

Popular Products

+<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> + <%= render partial: "product-list", locals: {products: @products} %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index db469cb5e4..552d1829da 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,3 +1,7 @@ + +<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> + +
From 8e48ed2072e6ddbc30c575b6623db91063d5ae4b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 18:17:40 -0700 Subject: [PATCH 078/348] guest user tests --- app/controllers/products_controller.rb | 27 +++- test/controllers/products_controller_test.rb | 122 +++++++++++++------ 2 files changed, 111 insertions(+), 38 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index af0e5bf63c..970400d41b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - before_action :fakey_login # take this out later pleeeasseee + # before_action :fakey_login # take this out later pleeeasseee before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] @@ -40,12 +40,37 @@ def edit end def update + result = @product.update(prod_params) + + if result + flash.now[:status] = :success + flash.now[:message] = "Successfully updated #{@product.name}" + return redirect_to product_path(@product.id) + else + flash.now[:status] = :failure + flash.now[:message] = "Could not update product" + flash.now[:details] = @product.errors.messages + return render :edit, status: :bad_request + end end def destroy + result = @product.destroy + + if result + flash.now[:status] = :success + flash.now[:message] = "Successfully deleted #{@product.name}" + return redirect_to products_path + else + flash.now[:status] = :failure + flash.now[:message] = "Could not delete product" + flash.now[:details] = @product.errors.messages + return redirect_back(fallback_location: products_path) + end end private + def fakey_login session[:user_id] = Merchant.first.id end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 241ba55aed..5e3dc40005 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,17 +1,11 @@ require "test_helper" describe ProductsController do - let(:p) { Product.first } - let(:owned_product) { Product.find_by(merchant_id: Merchant.first.id) } - let(:good_params) { { product: { - "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test"} - } } - let(:bad_params) { { product: { - "name"=>""} - } } - let(:tmi_params) { { product: { - "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test", "tmi"=>"uh oh", "id"=>1} - } } + let(:prod) { Product.first } + let(:good_params) { { product: { "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test" } } } + let(:bad_params) { { product: { "name"=>"" } } } + let(:tmi_params) { { product: { "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test", "tmi"=>"uh oh", "id"=>1 } } } + let(:new_params) { { product: { "name"=>"Updated Name" } } } before do @before_count = Product.count @@ -29,13 +23,13 @@ end it 'can successfully access show product' do - get product_path(p.id) + get product_path(prod.id) must_respond_with :success end it 'can successfully access new product' do - # skip + skip get new_product_path must_respond_with :success @@ -43,6 +37,7 @@ describe 'create' do it 'can successfully create valid product' do + skip post products_path, params: good_params must_respond_with :found @@ -51,6 +46,7 @@ end it 'will not create new product with invalid data' do + skip post products_path, params: bad_params must_respond_with :bad_request @@ -59,6 +55,7 @@ end it 'uses strong params' do + skip post products_path, params: tmi_params must_respond_with :found @@ -68,30 +65,74 @@ end end - it 'can successfully access edit for own product' do - get edit_product_path(p.id) + describe 'edit' do + # these tests will have to change when logging in actually works (dependent on fakey_login) + it 'can successfully access edit for own product' do + skip + owned_product = Product.find_by(merchant_id: Merchant.first.id) + get edit_product_path(owned_product.id) - must_respond_with :success - end + must_respond_with :success + end - it 'CANNOT successfully edit other users products' do - skip - end + it 'CANNOT successfully edit other users products' do + not_owned_product = Product.find_by(merchant_id: Merchant.last.id) + get edit_product_path(not_owned_product.id) - it 'can successfully update own product' do - skip + must_respond_with :found + flash[:status].must_equal :failure + end end - it 'CANNOT successfully update other users product' do - skip - end + describe 'update' do + it 'can successfully update own product with valid data' do + skip + owned_product = Product.find_by(merchant_id: Merchant.first.id) + patch product_path(owned_product.id), params: new_params - it 'can successfully destroy own product' do - skip + # WHY does only this not work? + # owned_product.name.must_equal "Updated Name" + flash[:status].must_equal :success + must_respond_with :found + end + + it 'CANNOT successfully update own product with invalid data' do + skip + owned_product = Product.find_by(merchant_id: Merchant.first.id) + patch product_path(owned_product.id), params: bad_params + + must_respond_with :bad_request + flash[:status].must_equal :failure + end + + it 'CANNOT successfully update other users product' do + not_owned_product = Product.find_by(merchant_id: Merchant.last.id) + patch product_path(not_owned_product.id), params: new_params + + must_respond_with :found + flash[:status].must_equal :failure + end end - it 'CANNOT destroy other users products' do - skip + describe 'destroy' do + it 'can successfully destroy own product' do + skip + owned_product = Product.find_by(merchant_id: Merchant.first.id) + delete product_path(owned_product.id) + + must_respond_with :found + flash[:status].must_equal :success + Product.count.must_equal (@before_count - 1) + end + + it 'CANNOT destroy other users products' do + not_owned_product = Product.find_by(merchant_id: Merchant.last.id) + delete product_path(not_owned_product.id) + + must_respond_with :found + flash[:status].must_equal :failure + Product.count.must_equal @before_count + end end end @@ -103,37 +144,44 @@ end it 'can successfully access show product' do - get product_path(p.id) + get product_path(prod.id) must_respond_with :success end it 'CANNOT access new product' do - skip - get new_product_path(p.id) + get new_product_path(prod.id) flash[:status].must_equal :failure must_respond_with :found end it 'CANNOT successfully create valid product' do - skip + post products_path(prod.id), params: good_params + + flash[:status].must_equal :failure + must_respond_with :found end it 'CANNOT access edit for product' do - skip - get edit_product_path(owned_product.id) + get edit_product_path(prod.id) flash[:status].must_equal :failure must_respond_with :found end it 'CANNOT update product' do - skip + patch product_path(prod.id), params: good_params + + flash[:status].must_equal :failure + must_respond_with :found end it 'CANNOT destroy other users products' do - skip + delete product_path(prod.id) + + flash[:status].must_equal :failure + must_respond_with :found end end end From 7ac2229c25df05900026cddb3b4d44714ebdc8d0 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 18:26:12 -0700 Subject: [PATCH 079/348] add sidebar to products#index --- app/assets/stylesheets/products.scss | 4 ++++ app/controllers/products_controller.rb | 1 + app/models/product.rb | 4 ++++ app/views/products/index.html.erb | 18 +++++++++++++++--- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 3a995d7987..41afa6c2f4 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -7,6 +7,10 @@ // PRODUCTS LIST: // //////////////////// +nav ul { + list-style: none; +} + .product { height: 19rem; margin: 1rem; diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index af0e5bf63c..aebe56dd03 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -9,6 +9,7 @@ class ProductsController < ApplicationController def index @products = Product.all + @categories = ['Magic', 'Witchcraft', 'Mythical Beasts', 'Food', 'Legendary Items'] end def show diff --git a/app/models/product.rb b/app/models/product.rb index 77750fe6bc..3a4d097a8c 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -7,4 +7,8 @@ class Product < ApplicationRecord validates :name, presence: true, uniqueness: true validates :price, presence: true, numericality: {greater_than: 0} validates :quantity, presence: true, numericality: {greater_than_or_equal_to: 0} + + def self.most_popular + Product.all.sort_by{|p| -p.orders.count}[0...3] + end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 174b9e477b..b9aeb29def 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,5 +1,17 @@ -

Popular Products

+ -<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> +
+

Popular Now

+ <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> -<%= render partial: "product-list", locals: {products: @products} %> + <%= render partial: "product-list", locals: {products: @products} %> +
From e8fd0cde171640372ce1b0117f7b79d3513f5311 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 19 Oct 2017 18:43:52 -0700 Subject: [PATCH 080/348] help my git is being weird --- db/seeds.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/db/seeds.rb b/db/seeds.rb index 357c03008a..ac3030b3eb 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -18,7 +18,6 @@ { username: 'Puck', email: 'sneakyelf@shakespeare.com', id: 40, oauth_provider: 'github', oauth_uid: '123463', created_at: Time.now, updated_at: Time.now } ]) -# Orders: 21, 22, 23, 24 orders = Order.create([ { cust_name: 'Elvy', status: 'paid', cust_email: 'elvii@gmail.com', cust_cc: '11111000000', cust_cc_exp: '02/18', cust_addr: 'Elves Land', id: 11, created_at: Time.now, updated_at: Time.now }, { cust_name: 'Earthborn King', status: 'paid', cust_email: 'eking@something.com', cust_cc: '22222220000000', cust_cc_exp: '10/19', cust_addr: 'Magestic Castle VI', id: 12, created_at: Time.now, updated_at: Time.now }, From b2edd6d3dee19d20b0466b6580b6f8555761ede7 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 00:15:18 -0700 Subject: [PATCH 081/348] Controller tests added to Review --- app/controllers/reviews_controller.rb | 84 ++++++++++++++++++ test/controllers/reviews_controller_test.rb | 94 ++++++++++++++++++++- 2 files changed, 176 insertions(+), 2 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index b3d77cc1c3..f830319d4d 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,2 +1,86 @@ class ReviewsController < ApplicationController + before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] + + def index + if params[:product] + product = Product.find_by(id: params[:product_id]) + if product + @reviews = product.reviews + else + head :not_found + end + else + @reviews = Review.all + end + end + + def new + @review = Review.new + end + + def create + # if params[:merchant] + # merchant = Merchant.find_by(id:session[:logged_in_merchant]) + # if merchant.product + # flash[:status] = :failure + # flash[:result_text] = "You can not review your own product" + # redirect_to product_path + # else + @review = Review.new(review_params) + if @review.save + flash[:status] = :success + flash[:message] = "Successfully created review " + redirect_to review_path(@review) + else + flash[:status] = :failure + flash[:message] = "Failed to create review" + flash[:details] = @review.errors.messages + render :new, status: :bad_request + end + # end + end + + def show ; end + + def edit ; end + + def update + #TODO add owner check + @review.update_attributes(review_params) + if save_and_flash(@review) + redirect_to review_path(@review) + else + render :edit, status: :bad_request + return + end + end + + def destroy + @review.destroy + flash[:status] = :success + flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" + redirect_to product_path + end + +private + + def review_params + @review =(params.require(:review).permit(:rating, :description, :merchant, :product)) + end + + def find_review_by_params_id + @review = Review.find_by(id: params[:id]) + unless @review + head :not_found + end + end + +# Do we need this method? + # def require_owner_check + # if @review.merchant_id != @login_user.id + # flash[:status] = :failure + # flash[:result_text] = "You must be owner of the review to do that!" + # redirect_to review_path(@review) + # end + # end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 386065239a..e0c2770aff 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,7 +1,97 @@ require "test_helper" describe ReviewsController do - # it "must be a real test" do - # flunk "Need real tests" + let(:review) { reviews(:review) } + + describe "index" do + it "returns success status for all reviews" do + get reviews_path + must_respond_with :success + end + + it "returns a failure status when there are no reviews" do + Review.destroy_all + get reviews_path + must_respond_with :failure + end + end + + # describe "new" do + # it " should work without a merchant id" do + # get new_book_path + # must_respond_with :success + # end + # + # it "should return failure if product belongs to merchant " do + # # arrange: login 'ada' user + # login(users(:ada)) + # # act: review (Mermaid Fin) + # review_data = { + # review: { + # rating: 5, + # product: (products(:mermaid_fin)) + # } + # } + # # assert: expect failure. + # must_respond_with :bad_request + # end + # end + + # describe "create" do + # it "adds the review to the product and redirects when the review data is valid" do + # # Arrange + # review_data = { + # review: { + # rating: 5, + # product: (products(:mermaid_fin)) + # } + # } + # Review.new(review_data[:review]).must_be :valid? + # + # start_review_count = Review.count + # + # # Act + # post reviews_path, params: review_data + # + # # Assert + # must_respond_with :redirect + # must_redirect_to reviews_path + # + # Review.count.must_equal start_review_count + 1 + # end + # # + # it "sends bad_request if review data is invalid" do + # # Arrange + # invalid_review_data = { + # review: { + # #No rating + # product: (reviews(:mermaid_fin)) + # } + # } + # # Double checking the data is truly invalid + # Review.new(invalid_review_data[:review]).wont_be :valid? + # + # start_review_count = Review.count + # + # # Act + # post reviews_path, params: invalid_review_data + # + # # Assert + # must_respond_with :bad_request + # # assert_template :new + # Review.count.must_equal start_review_count + # end + # end + + # describe "show" do + # it "succeeds for a review that exists" do + # get review_path(reviews(:review)) + # must_respond_with :success + # end + # + # it "returns 404 not_found for a review that does not exist" do + # get review_path(reviews(:bad_review)) + # must_respond_with :not_found + # end # end end From 6ca17c7a03b4abe2c74bd9555255aab75b458a3a Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 06:49:53 -0700 Subject: [PATCH 082/348] Added methods to OrderProducts and Orders controllers --- app/controllers/order_products_controller.rb | 65 ++++++++++++++++++++ app/controllers/orders_controller.rb | 65 ++++++++++++++++++++ 2 files changed, 130 insertions(+) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 8fc2a16bfe..586392ffdb 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,2 +1,67 @@ class OrderProductsController < ApplicationController + def index + @order_products = OrderProduct.all + end + + def new + @order_product = OrderProduct.new + end + + def create + @order_product = OrderProduct.new(order_product_params) + if @order_product.save + flash[:status] = :success + flash[:message] = "Successfully created order product #{@order_product.id}" + redirect_to order_product_path + else + flash.now[:status] = :failure + flash.now[:message] = "Failed to create order product" + flash.now[:details] = @order_product.errors.messages + render :new, status: :bad_request + end + end + + def show + find_order_product_by_params_id + end + + def edit + find_order_product_by_params_id + end + + def update + if find_order_product_by_params_id + @order_product.update_attributes(order_product_params) + if @order_product.save + redirect_to order_product_path(@order_product) + return + else + render :edit, status: :bad_request + return + end + end + end + + def destroy + if find_order_product_by_params_id + @order_product.destroy + flash[:status] = :success + flash[:message] = "Deleted order product #{@order_product.title}" + redirect_to order_products_path + end + end + + private + + def order_product_params + return params.require(:order_product).permit(:quantity, :status, :product_id, :order_id) + end + + def find_order_product_by_params_id + @order_product = OrderProduct.find_by(id: params[:id]) + unless @order_product + head :not_found + end + return @order_product + end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 8a0e3659ae..ddcbbdf209 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,2 +1,67 @@ class OrdersController < ApplicationController + def index + @orders = Order.all + end + + def new + @order = Order.new + end + + def create + @order = Order.new(order_params) + if @order.save + flash[:status] = :success + flash[:message] = "Successfully created order #{@order.id}" + redirect_to order_path + else + flash.now[:status] = :failure + flash.now[:message] = "Failed to create order" + flash.now[:details] = @order.errors.messages + render :new, status: :bad_request + end + end + + def show + find_order_by_params_id + end + + def edit + find_order_by_params_id + end + + def update + if find_order_by_params_id + @order.update_attributes(order_params) + if @order.save + redirect_to order_path(@order) + return + else + render :edit, status: :bad_request + return + end + end + end + + def destroy + if find_order_by_params_id + @order.destroy + flash[:status] = :success + flash[:message] = "Deleted order #{@order.title}" + redirect_to order_path + end + end + + private + + def order_params + return params.require(:order).permit(:cust_name, :status, :cust_email, :cust_cc, :cust_cc_exp, :cust_addr, :merchant_id) + end + + def find_order_by_params_id + @order = Order.find_by(id: params[:id]) + unless @order + head :not_found + end + return @order + end end From 1dc1ee5da472618a37df2a80189d40edd5742865 Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 07:26:37 -0700 Subject: [PATCH 083/348] Added tests to OrderProducts controllers --- .../order_products_controller_test.rb | 131 +++++++++++++++++- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index 868bc2929c..dc8f5c9e48 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -1,7 +1,132 @@ require "test_helper" describe OrderProductsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "index" do + it "returns success for all order products" do + get order_products_path + must_respond_with :success + end + end + + describe "new" do + it "returns success for a new order product" do + get new_order_product_path + must_respond_with :success + end + end + + describe "create" do + it "adds order product to the database and redirects when the data is valid" do + order_product = { + order_product: { + quantity: 2, + product: :mermaid_fin + } + } + OrderProduct.new(order_product[:order_product]).must_be :valid? + start_count = OrderProduct.count + + post order_products_path, params: order_product + + must_respond_with :redirect + must_redirect_to order_products_path + OrderProduct.count.must_equal start_count + 1 + end + + it "re-renders form when the order product data is invalid" do + order_product = { + order_product: { + quantity: 2 + } + } + OrderProduct.new(order_product[:order_product]).wont_be :valid? + start_count = OrderProduct.count + + post order_products_path, params: order_product + + must_respond_with :bad_request + OrderProduct.count.must_equal start_count + end + end + + describe "show" do + it "returns success with valid id" do + order_product_id = OrderProduct.first.id + get order_product_path(order_product_id) + must_respond_with :success + end + + it "returns not_found with invalid id" do + invalid_id = OrderProduct.last.id + 1 + get order_product_path(invalid_id) + must_respond_with :not_found + end + end + + describe "edit" do + it "returns success with valid id" do + order_product_id = OrderProduct.first.id + get edit_order_product_path(order_product_id) + must_respond_with :success + end + + it "returns not_found with invalid id" do + invalid_id = OrderProduct.last.id + 1 + get edit_order_product_path(invalid_id) + must_respond_with :not_found + end + end + + describe "update" do + it "returns success if order product exists and changes are valid" do + order_product = OrderProduct.first + changes = { + order_product: { + quantity: 2 + } + } + order_product.update_attributes(changes[:order_product]) + order_product.must_be :valid? + + patch order_product_path(order_product), params: changes + must_respond_with :redirect + must_redirect_to order_product_path(order_product) + + order_product.reload + order_product.quantity.must_equal changes[:order_product][:quantity] + end + + it "returns not_found if work does not exist" do + order_product = OrderProduct.first + changes = { + order_product: { + quantity: 2 + } + } + order_product.update_attributes(changes[:order_product]) + order_product.must_be :valid? + order_product.destroy + + patch order_product_path(order_product), params: changes + must_respond_with :not_found + end + end + + describe "destroy" do + it "returns success and destroys if work exists" do + order_product = OrderProduct.first + order_product.must_be :valid? + delete order_product_path(order_product) + must_respond_with :redirect + must_redirect_to order_products_path + end + + it "returns not_found if work does not exist" do + order_product = OrderProduct.first + order_product.must_be :valid? + delete order_product_path(order_product) + delete order_product_path(order_product) + must_respond_with :not_found + end + end end From df397028ffe9c565c8d037951e92a0f1750723b1 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 07:44:35 -0700 Subject: [PATCH 084/348] added views and tests to merchant controller --- app/controllers/merchants_controller.rb | 13 ++- app/views/merchants/edit.html.erb | 0 app/views/merchants/new.html.erb | 0 test/controllers/merchants_controller_test.rb | 85 ++++++++++++++++++- 4 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 app/views/merchants/edit.html.erb create mode 100644 app/views/merchants/new.html.erb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index dfb018555d..a88b9bbcba 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -30,11 +30,20 @@ def index end def edit - @merchant = Merchant.find(params[:id]) + @merchant = Merchant.find(params[:id]) + render_404 unless @merchant end def update @merchant = Merchant.find(params[:id]) + if @merchant.save + redirect_to merchant_path(@merchant) + #success message + else + render :edit, status: :bad_request + return + #fail message flash + end end def show @@ -43,6 +52,8 @@ def show end def destroy + @merchant.destroy + redirect_to root_path end diff --git a/app/views/merchants/edit.html.erb b/app/views/merchants/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/merchants/new.html.erb b/app/views/merchants/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 8eb012c5c2..ee06ca62b4 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -32,7 +32,86 @@ must_respond_with :not_found end end - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe "new" do + it "works" do + get new_merchant_path + must_respond_with :success + end + end + + describe "create" do + + end + + # + describe "edit" do + it "succeeds for an extant merchant ID" do + get edit_merchant_path(Merchant.first) + must_respond_with :success + end + + it "renders 404 not_found for a bogus merchant ID" do + bogus_merchant_id = Merchant.last.id + 1 + get edit_merchant_path(bogus_merchant_id) + must_respond_with :not_found + end + end + + describe "update" do + + it "returns success if the merchant ID is valid and the change is valid" do + merchant = Merchant.first + merchant_data = { + merchant: { + username: "changed username", + email: merchant.email + } + } + merchant.update_attributes(merchant_data[:merchant]) + merchant.must_be :valid?, "Test is invalid because the provided data will produce an invalid merchant" + + patch merchant_path(merchant), params: merchant_data + + must_respond_with :redirect + must_redirect_to merchant_path(merchant) + + # Check that the change went through + merchant.reload + merchant.username.must_equal merchant_data[:merchant][:username] + end + # + it "returns not_found if the merchant ID is invalid" do + invalid_merchant_id = Merchant.last.id + 1 + merchant_data = { + merchant: { + username: "Changed username", + merchant_id: Merchant.first.id + } + } + + patch merchant_path(invalid_merchant_id), params: merchant_data + + must_respond_with :not_found + end + # + it "returns bad_request if the change is invalid" do + merchant = Merchant.first + invalid_merchant_data = { + merchant: { + email: "" + } + } + # Check that the update is actually invalid + merchant.update_attributes(invalid_merchant_data[:merchant]) + merchant.wont_be :valid? + + patch merchant_path(merchant), params: invalid_merchant_data + + must_respond_with :bad_request + + merchant.reload + merchant.username.wont_equal invalid_merchant_data[:merchant][:username] + end + end end From 8ca9b454eaffc0c63b2e035b9ae673fc410186f0 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 07:46:27 -0700 Subject: [PATCH 085/348] CRUD for review controller --- app/controllers/reviews_controller.rb | 120 ++++++++++---------- test/controllers/reviews_controller_test.rb | 2 + 2 files changed, 62 insertions(+), 60 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index f830319d4d..a10f9f1b68 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -14,66 +14,66 @@ def index end end - def new - @review = Review.new - end - - def create - # if params[:merchant] - # merchant = Merchant.find_by(id:session[:logged_in_merchant]) - # if merchant.product - # flash[:status] = :failure - # flash[:result_text] = "You can not review your own product" - # redirect_to product_path - # else - @review = Review.new(review_params) - if @review.save - flash[:status] = :success - flash[:message] = "Successfully created review " - redirect_to review_path(@review) - else - flash[:status] = :failure - flash[:message] = "Failed to create review" - flash[:details] = @review.errors.messages - render :new, status: :bad_request - end - # end - end - - def show ; end - - def edit ; end - - def update - #TODO add owner check - @review.update_attributes(review_params) - if save_and_flash(@review) - redirect_to review_path(@review) - else - render :edit, status: :bad_request - return - end - end - - def destroy - @review.destroy - flash[:status] = :success - flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" - redirect_to product_path - end - -private - - def review_params - @review =(params.require(:review).permit(:rating, :description, :merchant, :product)) - end - - def find_review_by_params_id - @review = Review.find_by(id: params[:id]) - unless @review - head :not_found - end - end +# def new +# @review = Review.new +# end +# +# def create +# # if params[:merchant] +# # merchant = Merchant.find_by(id:session[:logged_in_merchant]) +# # if merchant.product +# # flash[:status] = :failure +# # flash[:result_text] = "You can not review your own product" +# # redirect_to product_path +# # else +# @review = Review.new(review_params) +# if @review.save +# flash[:status] = :success +# flash[:message] = "Successfully created review " +# redirect_to review_path(@review) +# else +# flash[:status] = :failure +# flash[:message] = "Failed to create review" +# flash[:details] = @review.errors.messages +# render :new, status: :bad_request +# end +# # end +# end +# +# def show ; end +# +# def edit ; end +# +# def update +# #TODO add owner check +# @review.update_attributes(review_params) +# if save_and_flash(@review) +# redirect_to review_path(@review) +# else +# render :edit, status: :bad_request +# return +# end +# end +# +# def destroy +# @review.destroy +# flash[:status] = :success +# flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" +# redirect_to product_path +# end +# +# private +# +# def review_params +# @review =(params.require(:review).permit(:rating, :description, :merchant, :product)) +# end +# +# def find_review_by_params_id +# @review = Review.find_by(id: params[:id]) +# unless @review +# head :not_found +# end +# end # Do we need this method? # def require_owner_check diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index e0c2770aff..a935869f20 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -94,4 +94,6 @@ # must_respond_with :not_found # end # end + + end From 0acc8bc5d880b7a194fd8ffec4dfcca8d69a6bcd Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 09:22:34 -0700 Subject: [PATCH 086/348] fix merchant links --- app/views/products/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 552d1829da..ec09add52b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -11,7 +11,7 @@

<%= @product.name %>

From seller - <%= link_to @product.merchant.username, product_path(@product.id) %> + <%= link_to @product.merchant.username, merchant_path(@product.merchant_id) %>

$<%= '%.2f' % @product.price %>

<%= form_tag do %> From 877bce614b252361561ea89cf2a4440ca9579f64 Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 09:27:54 -0700 Subject: [PATCH 087/348] Added to orders_controller_test.rb; need to check #create methods --- test/controllers/orders_controller_test.rb | 130 ++++++++++++++++++++- 1 file changed, 127 insertions(+), 3 deletions(-) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 68784595f3..399fb89bb6 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,7 +1,131 @@ require "test_helper" describe OrdersController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe "index" do + it "returns success for all orders" do + get order_path + must_respond_with :success + end + end + + describe "new" do + it "returns success for a new orders" do + get new_order_path + must_respond_with :success + end + end + + describe "create" do + xit "adds order to the database and redirects when the data is valid" do + order = { + order: { + cust_name: "Wienerschnitzel" + } + } + Order.new(order[:order]).must_be :valid? + start_count = Order.count + + post orders_path, params: order + + must_respond_with :redirect + must_redirect_to orders_path + Order.count.must_equal start_count + 1 + end + + xit "re-renders form when the order data is invalid" do + order = { + order: { + cust_name: "Wienerschnitzel" + } + } + Order.new(order[:order]).wont_be :valid? + start_count = Order.count + + post orders_path, params: order + + must_respond_with :bad_request + Order.count.must_equal start_count + end + end + + describe "show" do + it "returns success with valid id" do + order_id = Order.first.id + get order_path(order_id) + must_respond_with :success + end + + it "returns not_found with invalid id" do + invalid_id = Order.last.id + 1 + get order_path(invalid_id) + must_respond_with :not_found + end + end + + describe "edit" do + it "returns success with valid id" do + order_id = Order.first.id + get edit_order_path(order_id) + must_respond_with :success + end + + it "returns not_found with invalid id" do + invalid_id = Order.last.id + 1 + get edit_order_path(invalid_id) + must_respond_with :not_found + end + end + + describe "update" do + it "returns success if order product exists and changes are valid" do + order = Order.first + changes = { + order: { + cust_name: "Wienerschnitzel" + } + } + order.update_attributes(changes[:order]) + order.must_be :valid? + + patch order_path(order), params: changes + must_respond_with :redirect + must_redirect_to order_path(order) + + order.reload + order.cust_name.must_equal changes[:order][:cust_name] + end + + it "returns not_found if work does not exist" do + order = Order.first + changes = { + order: { + cust_name: "Wienerschnitzel" + } + } + order.update_attributes(changes[:order]) + order.must_be :valid? + order.destroy + + patch order_path(order), params: changes + must_respond_with :not_found + end + end + + describe "destroy" do + it "returns success and destroys if order exists" do + order = Order.first + order.must_be :valid? + delete order_path(order) + must_respond_with :redirect + must_redirect_to orders_path + end + + it "returns not_found if work does not exist" do + order = Order.first + order.must_be :valid? + delete order_path(order) + delete order_path(order) + must_respond_with :not_found + end + end end From 06f6a543fda696cc53f6582d777110e500acd0cb Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 09:32:20 -0700 Subject: [PATCH 088/348] fix typos in seeds' --- db/seeds.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 9c3364430b..c59a021037 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -54,22 +54,22 @@ { status: 'shipped', quantity: '3', order_id: 2, product_id: 12, created_at: Time.now, updated_at: Time.now, id: 2 }, { status: 'shipped', quantity: '1', order_id: 3, product_id: 11, created_at: Time.now, updated_at: Time.now, id: 3 }, { status: 'shipped', quantity: '3', order_id: 4, product_id: 10, created_at: Time.now, updated_at: Time.now, id: 4 }, - { status: 'shipped', quantity: '1', order_id: 5, product_id: 8, created_at: Time.now, updated_at: Time.now, id: 1 }, - { status: 'shipped', quantity: '3', order_id: 6, product_id: 7, created_at: Time.now, updated_at: Time.now, id: 2 }, - { status: 'shipped', quantity: '1', order_id: 7, product_id: 9, created_at: Time.now, updated_at: Time.now, id: 3 }, - { status: 'shipped', quantity: '3', order_id: 8, product_id: 1, created_at: Time.now, updated_at: Time.now, id: 4 }, - { status: 'shipped', quantity: '1', order_id: 9, product_id: 2, created_at: Time.now, updated_at: Time.now, id: 1 }, - { status: 'shipped', quantity: '3', order_id: 10, product_id: 3, created_at: Time.now, updated_at: Time.now, id: 2 }, - { status: 'shipped', quantity: '1', order_id: 11, product_id: 4, created_at: Time.now, updated_at: Time.now, id: 3 }, - { status: 'shipped', quantity: '3', order_id: 12, product_id: 5, created_at: Time.now, updated_at: Time.now, id: 4 }, - { status: 'shipped', quantity: '1', order_id: 11, product_id: 6, created_at: Time.now, updated_at: Time.now, id: 1 }, - { status: 'shipped', quantity: '3', order_id: 10, product_id: 7, created_at: Time.now, updated_at: Time.now, id: 2 }, - { status: 'shipped', quantity: '1', order_id: 9, product_id: 8, created_at: Time.now, updated_at: Time.now, id: 3 }, - { status: 'shipped', quantity: '3', order_id: 8, product_id: 9, created_at: Time.now, updated_at: Time.now, id: 4 }, - { status: 'shipped', quantity: '1', order_id: 7, product_id: 14, created_at: Time.now, updated_at: Time.now, id: 5 } + { status: 'shipped', quantity: '1', order_id: 5, product_id: 8, created_at: Time.now, updated_at: Time.now, id: 5 }, + { status: 'shipped', quantity: '3', order_id: 6, product_id: 7, created_at: Time.now, updated_at: Time.now, id: 6 }, + { status: 'shipped', quantity: '1', order_id: 7, product_id: 9, created_at: Time.now, updated_at: Time.now, id: 7 }, + { status: 'shipped', quantity: '3', order_id: 8, product_id: 1, created_at: Time.now, updated_at: Time.now, id: 8 }, + { status: 'shipped', quantity: '1', order_id: 9, product_id: 2, created_at: Time.now, updated_at: Time.now, id: 9 }, + { status: 'shipped', quantity: '3', order_id: 10, product_id: 3, created_at: Time.now, updated_at: Time.now, id: 10 }, + { status: 'shipped', quantity: '1', order_id: 11, product_id: 4, created_at: Time.now, updated_at: Time.now, id: 11 }, + { status: 'shipped', quantity: '3', order_id: 12, product_id: 5, created_at: Time.now, updated_at: Time.now, id: 12 }, + { status: 'shipped', quantity: '1', order_id: 11, product_id: 6, created_at: Time.now, updated_at: Time.now, id: 13 }, + { status: 'shipped', quantity: '3', order_id: 10, product_id: 7, created_at: Time.now, updated_at: Time.now, id: 14 }, + { status: 'shipped', quantity: '1', order_id: 9, product_id: 8, created_at: Time.now, updated_at: Time.now, id: 15 }, + { status: 'shipped', quantity: '3', order_id: 8, product_id: 9, created_at: Time.now, updated_at: Time.now, id: 16 }, + { status: 'shipped', quantity: '1', order_id: 7, product_id: 14, created_at: Time.now, updated_at: Time.now, id: 17 } ]) reviews = Review.create([ { rating: 5, description: 'very nice and magic', product_id: 6, created_at: Time.now, updated_at: Time.now, id: 1 }, - { rating: 1, description: 'these are wizards tears, NOT witch\'s tears. seller should be ashamed', product_id: 7, created_at: Time.now, updated_at: Time.now, id: 22 } + { rating: 1, description: 'these are wizards tears, NOT witch\'s tears. seller should be ashamed', product_id: 7, created_at: Time.now, updated_at: Time.now, id: 2 } ]) From 7ab136f8068018133c255b6b0fb5682757d39b0a Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 10:28:25 -0700 Subject: [PATCH 089/348] Review controller testing --- app/controllers/reviews_controller.rb | 142 ++++++++++---------- app/views/reviews/edit.html.erb | 0 app/views/reviews/index.html.erb | 0 app/views/reviews/new.html.erb | 0 app/views/reviews/show.html.erb | 0 test/controllers/reviews_controller_test.rb | 35 ++++- 6 files changed, 101 insertions(+), 76 deletions(-) create mode 100644 app/views/reviews/edit.html.erb create mode 100644 app/views/reviews/index.html.erb create mode 100644 app/views/reviews/new.html.erb create mode 100644 app/views/reviews/show.html.erb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index a10f9f1b68..0dc2ae2745 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -2,80 +2,80 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] def index - if params[:product] - product = Product.find_by(id: params[:product_id]) - if product - @reviews = product.reviews - else - head :not_found - end - else - @reviews = Review.all - end + # if params[:product] + # product = Product.find_by(id: params[:product_id]) + # if product + # @reviews = product.reviews + # else + # head :not_found + # end + # else + @reviews = Review.all + # end + end + + def new + @review = Review.new + end + + def create + # # if params[:merchant] + # # merchant = Merchant.find_by(id:session[:logged_in_merchant]) + # # if merchant.product + # # flash[:status] = :failure + # # flash[:result_text] = "You can not review your own product" + # # redirect_to product_path + # # else + # @review = Review.new(review_params) + # if @review.save + # flash[:status] = :success + # flash[:message] = "Successfully created review " + # redirect_to review_path(@review) + # else + # flash[:status] = :failure + # flash[:message] = "Failed to create review" + # flash[:details] = @review.errors.messages + # render :new, status: :bad_request + # end + # # end + end + # + def show ; end + # + def edit ; end + # + def update + # #TODO add owner check + # @review.update_attributes(review_params) + # if save_and_flash(@review) + # redirect_to review_path(@review) + # else + # render :edit, status: :bad_request + # return + # end + end + + def destroy + # @review.destroy + # flash[:status] = :success + # flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" + # redirect_to product_path + end + + private + + def review_params + @review =(params.require(:review).permit(:rating, :description, :merchant, :product)) end -# def new -# @review = Review.new -# end -# -# def create -# # if params[:merchant] -# # merchant = Merchant.find_by(id:session[:logged_in_merchant]) -# # if merchant.product -# # flash[:status] = :failure -# # flash[:result_text] = "You can not review your own product" -# # redirect_to product_path -# # else -# @review = Review.new(review_params) -# if @review.save -# flash[:status] = :success -# flash[:message] = "Successfully created review " -# redirect_to review_path(@review) -# else -# flash[:status] = :failure -# flash[:message] = "Failed to create review" -# flash[:details] = @review.errors.messages -# render :new, status: :bad_request -# end -# # end -# end -# -# def show ; end -# -# def edit ; end -# -# def update -# #TODO add owner check -# @review.update_attributes(review_params) -# if save_and_flash(@review) -# redirect_to review_path(@review) -# else -# render :edit, status: :bad_request -# return -# end -# end -# -# def destroy -# @review.destroy -# flash[:status] = :success -# flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" -# redirect_to product_path -# end -# -# private -# -# def review_params -# @review =(params.require(:review).permit(:rating, :description, :merchant, :product)) -# end -# -# def find_review_by_params_id -# @review = Review.find_by(id: params[:id]) -# unless @review -# head :not_found -# end -# end + def find_review_by_params_id + @review = Review.find_by(id: params[:id]) + unless @review + head :not_found + end + end -# Do we need this method? + # Do we need this method? # def require_owner_check # if @review.merchant_id != @login_user.id # flash[:status] = :failure diff --git a/app/views/reviews/edit.html.erb b/app/views/reviews/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/reviews/show.html.erb b/app/views/reviews/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index a935869f20..7855c62516 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -18,7 +18,7 @@ # describe "new" do # it " should work without a merchant id" do - # get new_book_path + # get new_review_path # must_respond_with :success # end # @@ -36,7 +36,7 @@ # must_respond_with :bad_request # end # end - + # # describe "create" do # it "adds the review to the product and redirects when the review data is valid" do # # Arrange @@ -82,7 +82,7 @@ # Review.count.must_equal start_review_count # end # end - + # # describe "show" do # it "succeeds for a review that exists" do # get review_path(reviews(:review)) @@ -94,6 +94,31 @@ # must_respond_with :not_found # end # end - - + # + # describe "edit" do + # it "will give error message if merchant owns the product" do + # arrange: login 'ada' user + # login(users(:ada)) + # # act: review (Mermaid Fin) + # review_data = { + # review: { + # rating: 5, + # product: (products(:mermaid_fin)) + # } + # } + # # assert: expect failure. + # must_respond_with :unauthorized + # end + # + # it "succeeds for an exact review ID" do + # get edit_review_path(reviews(:review)) + # must_respond_with :success + # end + # + # it "renders 404 not_found for a bogus review ID" do + # bogus_review_id = Review.last.id + 1 + # get edit_review_path(bogus_review_id) + # must_respond_with :not_found + # end + # end end From 905d4244b17dbe25e3b050232578dda049842b36 Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 10:33:42 -0700 Subject: [PATCH 090/348] Edited orders_controller_test.rb --- test/controllers/orders_controller_test.rb | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 399fb89bb6..b07e5ed8e5 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -16,10 +16,16 @@ end describe "create" do - xit "adds order to the database and redirects when the data is valid" do + it "adds order to the database and redirects when the data is valid" do order = { order: { - cust_name: "Wienerschnitzel" + cust_name: "Mermaid", + merchant_id: 21, + cust_cc: 12345, + cust_cc_exp: "11/22", + cust_addr: "Sea World", + cust_email: "forkhair@mermaid.com", + status: "complete" } } Order.new(order[:order]).must_be :valid? @@ -32,10 +38,16 @@ Order.count.must_equal start_count + 1 end - xit "re-renders form when the order data is invalid" do + it "re-renders form when the order data is invalid" do order = { order: { - cust_name: "Wienerschnitzel" + cust_name: "Mermaid", + merchant_id: 21, + cust_cc: 12345, + cust_cc_exp: "11/22", + cust_addr: "Sea World", + cust_email: "forkhair@mermaid.com", + status: "" } } Order.new(order[:order]).wont_be :valid? From 899651989bd5df0d8c0e1d03c2dce32defd72624 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 10:39:46 -0700 Subject: [PATCH 091/348] review controller tests pass for some methods --- app/controllers/reviews_controller.rb | 12 +++++------ test/controllers/reviews_controller_test.rb | 22 ++++++++++----------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 0dc2ae2745..3f3ffa10e8 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -13,7 +13,7 @@ def index @reviews = Review.all # end end - + def new @review = Review.new end @@ -26,18 +26,18 @@ def create # # flash[:result_text] = "You can not review your own product" # # redirect_to product_path # # else - # @review = Review.new(review_params) - # if @review.save + @review = Review.new(review_params) + if @review.save # flash[:status] = :success # flash[:message] = "Successfully created review " - # redirect_to review_path(@review) + redirect_to review_path(@review) # else # flash[:status] = :failure # flash[:message] = "Failed to create review" # flash[:details] = @review.errors.messages # render :new, status: :bad_request - # end - # # end + end + # end end # def show ; end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 7855c62516..8e24793319 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -9,18 +9,18 @@ must_respond_with :success end - it "returns a failure status when there are no reviews" do - Review.destroy_all - get reviews_path - must_respond_with :failure - end + # it "returns a failure status when there are no reviews" do + # Review.destroy_all + # get reviews_path + # must_respond_with :failure + # end end - # describe "new" do - # it " should work without a merchant id" do - # get new_review_path - # must_respond_with :success - # end + describe "new" do + it " should work without a merchant id" do + get new_review_path + must_respond_with :success + end # # it "should return failure if product belongs to merchant " do # # arrange: login 'ada' user @@ -35,7 +35,7 @@ # # assert: expect failure. # must_respond_with :bad_request # end - # end + end # # describe "create" do # it "adds the review to the product and redirects when the review data is valid" do From 91428c7718fc7cd1db7f5bd78599a42108b3ceee Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 11:18:00 -0700 Subject: [PATCH 092/348] changes for testing review controller --- app/controllers/reviews_controller.rb | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 0dc2ae2745..7f7a65abf9 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,7 +1,7 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] - def index + def index # might not need # if params[:product] # product = Product.find_by(id: params[:product_id]) # if product @@ -13,24 +13,24 @@ def index @reviews = Review.all # end end - + def new @review = Review.new end def create - # # if params[:merchant] - # # merchant = Merchant.find_by(id:session[:logged_in_merchant]) - # # if merchant.product - # # flash[:status] = :failure - # # flash[:result_text] = "You can not review your own product" - # # redirect_to product_path - # # else - # @review = Review.new(review_params) - # if @review.save + # if params[:merchant] + # merchant = Merchant.find_by(id:session[:logged_in_merchant]) + # if merchant.product + # flash[:status] = :failure + # flash[:result_text] = "You can not review your own product" + # redirect_to product_path + # else + @review = Review.new(review_params) + if @review.save # flash[:status] = :success # flash[:message] = "Successfully created review " - # redirect_to review_path(@review) + redirect_to review_path(@review) # else # flash[:status] = :failure # flash[:message] = "Failed to create review" @@ -40,7 +40,7 @@ def create # # end end # - def show ; end + def show ; end # don't need # def edit ; end # @@ -55,7 +55,7 @@ def update # end end - def destroy + def destroy # only for logged in person who owns it # @review.destroy # flash[:status] = :success # flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" From b9d079e3aecda5babb71dcc76fc141df73ef7b87 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 11:24:57 -0700 Subject: [PATCH 093/348] fixing routes and custom routes --- config/routes.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 776353ba1e..11f6d2eba1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,5 +4,14 @@ get "/auth/:provider/callback", to: "merchants#login" # temporary! Replace this with actual, thought out routes - resources :merchants, :orders, :order_products, :products, :reviews + resources :merchants, except: [:index, :new] do + resources :orders, only: [:index] + end + resources :orders, except: [:edit] + + resources :order_products, only: [:update, :destroy] + resources :products + resources :reviews, except: [:index, :show] + + end From 3aee947640bb332011d1d80d065e1d5bb17e0eaa Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 11:27:42 -0700 Subject: [PATCH 094/348] added merchant sold order product --- config/routes.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 11f6d2eba1..6915392ecb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,9 +6,10 @@ # temporary! Replace this with actual, thought out routes resources :merchants, except: [:index, :new] do resources :orders, only: [:index] + resources :order_products, only:[:index], as: 'sold' end - resources :orders, except: [:edit] + resources :orders, except: [:edit] resources :order_products, only: [:update, :destroy] resources :products resources :reviews, except: [:index, :show] From 4d1ffcf56cad73738f5db37c44cc7083f8727329 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 11:31:15 -0700 Subject: [PATCH 095/348] getting rid of comments --- config/routes.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 6915392ecb..4e026fdf82 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,6 +13,4 @@ resources :order_products, only: [:update, :destroy] resources :products resources :reviews, except: [:index, :show] - - end From 40d4e0edab8ee0fa5954b98f9ffc585cd741a28e Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 11:32:18 -0700 Subject: [PATCH 096/348] Added header and footer to application.html.erb --- app/views/layouts/application.html.erb | 27 ++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index cd60004891..a5dba68c5a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -11,9 +11,32 @@ <%= csrf_meta_tags %> - + +
+
+

+ <%= link_to "LoreStore", root_path %> +

+ +
- <%= yield %> +
+
+ <%= yield %> +
+
+

Copyright © 2017 LoreStore

+
From b7ef7f908692c7a9f9d4ae57a0d47daa428bd94b Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 11:34:45 -0700 Subject: [PATCH 097/348] added text to seed --- db/seeds.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/seeds.rb b/db/seeds.rb index c59a021037..efc5509f4d 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -41,7 +41,7 @@ { category: 'creatures', name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 6, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, { category: 'alchemy ingredient', name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 7, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, { category: 'alchemy ingredient', name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 8, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { category: 'legendary items', name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { category: 'legendary items', name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, { category: 'legendary items', name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 10, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, { category: 'wish granting', id: 11, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, { category: 'literature', id: 12, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, From 363221db59b76e052b091f9f3738b36d263ecd33 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 11:36:28 -0700 Subject: [PATCH 098/348] routes --- config/routes.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 4e026fdf82..fda0b9d37b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,7 +3,6 @@ root "main#index" get "/auth/:provider/callback", to: "merchants#login" - # temporary! Replace this with actual, thought out routes resources :merchants, except: [:index, :new] do resources :orders, only: [:index] resources :order_products, only:[:index], as: 'sold' From 7df6274b35ffff4e828aebcc610ae61221a47cca Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 11:46:12 -0700 Subject: [PATCH 099/348] adding logout route --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index fda0b9d37b..0568bd2273 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,7 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root "main#index" get "/auth/:provider/callback", to: "merchants#login" - + post '/logout', to: 'merchants#logout', as: 'logout' resources :merchants, except: [:index, :new] do resources :orders, only: [:index] resources :order_products, only:[:index], as: 'sold' From d23eb0bf5687b0297648ea34d579a3bd3b825f24 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 12:03:07 -0700 Subject: [PATCH 100/348] Oauth login added --- app/controllers/application_controller.rb | 1 + app/controllers/merchants_controller.rb | 19 +++++++++++++++++++ app/models/merchant.rb | 11 +++++++++++ app/views/layouts/application.html.erb | 6 +++--- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5745ea14c9..cad5d67c4f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,4 +5,5 @@ def render_404 raise ActionController::RoutingError.new('Not Found') end + end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index a88b9bbcba..6fee941cc5 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,6 +1,25 @@ class MerchantsController < ApplicationController def login auth_hash = request.env['omniauth.auth'] + merchant = Merchant.find_by(oauth_uid: auth_hash['uid'], oauth_provider: auth_hash['provider']) + + if merchant + flash[:status] = :success + flash[:result_text] = "Successfully logged in " + else + merchant = Merchant.by_auth_hash(auth_hash) + if merchant.save + flash[:status] = :success + flash[:result_text] = "Successfully created new merchant_params " + else + flash.now[:status] = :failure + flash.now[:result_text] = " Could not logged in" + flash.now[:messages] = merchant.errors.messages + return redirect_to root_path + end + end + session[:merchant] = merchant + redirect_to root_path end def logout diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 8517409112..c6b225d2cf 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -9,4 +9,15 @@ class Merchant < ApplicationRecord validates_format_of :email, :with => /\A\w+@\w+\.\w+\z/ validates :oauth_provider, presence: true validates :oauth_uid, presence: true, uniqueness: true + + def self.by_auth_hash(auth_hash) + merchant = Merchant.new + + merchant.oauth_provider = auth_hash['provider'] + merchant.oauth_uid = auth_hash['uid'] + merchant.email = auth_hash['info']['email'] + merchant.username = auth_hash['info']['nickname'] + + merchant + end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a5dba68c5a..7d0f147768 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,12 +20,12 @@
From 63dc0183960c50f7609d951afec2b031edeb0bc5 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 12:06:41 -0700 Subject: [PATCH 101/348] logout added --- app/controllers/merchants_controller.rb | 2 +- app/views/layouts/application.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 6fee941cc5..3721aff683 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -23,7 +23,7 @@ def login end def logout - session[:merchant_id] = nil + session[:merchant] = nil redirect_to root_path end #CRUD diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7d0f147768..c26085c544 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -22,7 +22,7 @@ <%= link_to "Shopping Cart", root_path, class: "button" %> <% if session[:merchant] %> <%= link_to "Sell", new_product_path, class: "button" %> - <%= link_to "Sign Out", root_path, class: "button" %> + <%= link_to "Sign Out", logout_path, class: "button" %> <% else %> <%= link_to "Sign Up", '/auth/github', class: "button" %> <%= link_to "Sign In", '/auth/github', class: "button" %> From 78716e021d369f0aaa6cbdcb3790bd3a789a1e3d Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 12:10:53 -0700 Subject: [PATCH 102/348] Signin/signout works --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 0568bd2273..6c78b7cc3d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,7 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root "main#index" get "/auth/:provider/callback", to: "merchants#login" - post '/logout', to: 'merchants#logout', as: 'logout' + get '/logout', to: 'merchants#logout', as: 'logout' resources :merchants, except: [:index, :new] do resources :orders, only: [:index] resources :order_products, only:[:index], as: 'sold' From a5a2a1c8546dba0d2e64f68114299193ea807ed9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 12:11:57 -0700 Subject: [PATCH 103/348] add debug css border (you can ignore this if you want) --- app/assets/stylesheets/application.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index a152282fce..742d601fc0 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -15,3 +15,7 @@ *= require foundation_and_overrides */ + +* { + /*border: 1px solid lawngreen;*/ +} From 2b0c57a843e0b41ff03b5a79027854d669d3db43 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 12:15:14 -0700 Subject: [PATCH 104/348] Error fixed for review controller --- app/controllers/reviews_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 7f7a65abf9..5a0c2a7914 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -36,8 +36,8 @@ def create # flash[:message] = "Failed to create review" # flash[:details] = @review.errors.messages # render :new, status: :bad_request - # end - # # end + end + # end end # def show ; end # don't need From 1df7d9bd64128c944f02f5081f9bcc7c2ecfdb3e Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 12:28:11 -0700 Subject: [PATCH 105/348] fixed flash message grammar --- app/controllers/application_controller.rb | 1 - app/controllers/merchants_controller.rb | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cad5d67c4f..5745ea14c9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -5,5 +5,4 @@ def render_404 raise ActionController::RoutingError.new('Not Found') end - end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 3721aff683..618275d5de 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -10,10 +10,10 @@ def login merchant = Merchant.by_auth_hash(auth_hash) if merchant.save flash[:status] = :success - flash[:result_text] = "Successfully created new merchant_params " + flash[:result_text] = "Successfully created new merchant " else flash.now[:status] = :failure - flash.now[:result_text] = " Could not logged in" + flash.now[:result_text] = "Not logged in" flash.now[:messages] = merchant.errors.messages return redirect_to root_path end From 31ff9561330e6c642c4de2b4e0c4a29323b31e87 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 13:52:59 -0700 Subject: [PATCH 106/348] unskip controller tests --- test/controllers/products_controller_test.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 5e3dc40005..fe5efe656a 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -29,7 +29,6 @@ end it 'can successfully access new product' do - skip get new_product_path must_respond_with :success @@ -37,7 +36,6 @@ describe 'create' do it 'can successfully create valid product' do - skip post products_path, params: good_params must_respond_with :found @@ -46,7 +44,6 @@ end it 'will not create new product with invalid data' do - skip post products_path, params: bad_params must_respond_with :bad_request @@ -55,7 +52,6 @@ end it 'uses strong params' do - skip post products_path, params: tmi_params must_respond_with :found @@ -68,7 +64,6 @@ describe 'edit' do # these tests will have to change when logging in actually works (dependent on fakey_login) it 'can successfully access edit for own product' do - skip owned_product = Product.find_by(merchant_id: Merchant.first.id) get edit_product_path(owned_product.id) @@ -86,7 +81,6 @@ describe 'update' do it 'can successfully update own product with valid data' do - skip owned_product = Product.find_by(merchant_id: Merchant.first.id) patch product_path(owned_product.id), params: new_params @@ -97,7 +91,6 @@ end it 'CANNOT successfully update own product with invalid data' do - skip owned_product = Product.find_by(merchant_id: Merchant.first.id) patch product_path(owned_product.id), params: bad_params @@ -116,7 +109,6 @@ describe 'destroy' do it 'can successfully destroy own product' do - skip owned_product = Product.find_by(merchant_id: Merchant.first.id) delete product_path(owned_product.id) @@ -179,7 +171,7 @@ it 'CANNOT destroy other users products' do delete product_path(prod.id) - + flash[:status].must_equal :failure must_respond_with :found end From 9a0cfc902ba86a8a0624c4a4caada86c36944a83 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 13:52:59 -0700 Subject: [PATCH 107/348] Some changes on controller review --- app/controllers/reviews_controller.rb | 28 +++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 5a0c2a7914..e974e5f401 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,7 +1,7 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] - def index # might not need + def index # if params[:product] # product = Product.find_by(id: params[:product_id]) # if product @@ -19,25 +19,25 @@ def new end def create - # if params[:merchant] - # merchant = Merchant.find_by(id:session[:logged_in_merchant]) - # if merchant.product - # flash[:status] = :failure - # flash[:result_text] = "You can not review your own product" - # redirect_to product_path - # else - @review = Review.new(review_params) - if @review.save + # # if params[:merchant] + # # merchant = Merchant.find_by(id:session[:logged_in_merchant]) + # # if merchant.product + # # flash[:status] = :failure + # # flash[:result_text] = "You can not review your own product" + # # redirect_to product_path + # # else + # @review = Review.new(review_params) + # if @review.save # flash[:status] = :success # flash[:message] = "Successfully created review " - redirect_to review_path(@review) + # redirect_to review_path(@review) # else # flash[:status] = :failure # flash[:message] = "Failed to create review" # flash[:details] = @review.errors.messages # render :new, status: :bad_request - end - # end + # end + # # end end # def show ; end # don't need @@ -55,7 +55,7 @@ def update # end end - def destroy # only for logged in person who owns it + def destroy # only for logged in person who owns # @review.destroy # flash[:status] = :success # flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" From 2d25fbe8d2d4e66ee28e586e7172603fbb011391 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:12:11 -0700 Subject: [PATCH 108/348] add route alias to login --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 6c78b7cc3d..356e6e924d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,7 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root "main#index" - get "/auth/:provider/callback", to: "merchants#login" + get "/auth/:provider/callback", to: "merchants#login", as: 'login' get '/logout', to: 'merchants#logout', as: 'logout' resources :merchants, except: [:index, :new] do resources :orders, only: [:index] From bee5e46f9a24b467b4cb934f6d59de2b5f6d9027 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:15:07 -0700 Subject: [PATCH 109/348] controller tests in the wrong repo :o --- app/controllers/products_controller.rb | 10 ++-------- test/controllers/products_controller_test.rb | 10 ++++++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 526ad5e18b..66fdd5fe65 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,4 @@ class ProductsController < ApplicationController - # before_action :fakey_login # take this out later pleeeasseee - before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] before_action :confirm_login, only: [:new, :create, :edit, :update, :destroy] @@ -72,10 +70,6 @@ def destroy private - def fakey_login - session[:user_id] = Merchant.first.id - end - def find_product_by_params @product = Product.find(params[:id]) @@ -85,7 +79,7 @@ def find_product_by_params end def confirm_login - if session[:user_id].nil? + if session[:merchant].nil? flash[:status] = :failure flash[:message] = "You must be logged in to do that." return redirect_back(fallback_location: products_path) @@ -93,7 +87,7 @@ def confirm_login end def confirm_ownership - unless session[:user_id] == @product.merchant_id + unless session[:merchant][:id] == @product.merchant_id flash[:status] = :failure flash[:message] = "Only a product's merchant can modify a product." return redirect_back(fallback_location: products_path) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index fe5efe656a..788261fa33 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe ProductsController do - let(:prod) { Product.first } + let(:prod) { products(:mermaid_fin) } let(:good_params) { { product: { "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test" } } } let(:bad_params) { { product: { "name"=>"" } } } let(:tmi_params) { { product: { "name"=>"New Test Item", "price"=>"11.00", "quantity"=>"1", "description"=>"This is a test", "tmi"=>"uh oh", "id"=>1 } } } @@ -13,7 +13,11 @@ describe 'for logged in users' do before do - # log in + user = merchants(:ada) + + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + + get login_path(:github) end it 'can successfully access index of products' do @@ -38,6 +42,8 @@ it 'can successfully create valid product' do post products_path, params: good_params + binding.pry + must_respond_with :found flash[:status].must_equal :success Product.count.must_equal (@before_count + 1) From 31508f62efb230a9c520b8754443a37bba9919d1 Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 14:16:05 -0700 Subject: [PATCH 110/348] Updated #index test for OrderProducts controller --- app/controllers/order_products_controller.rb | 28 ++----------------- app/views/order_products/index.html.erb | 1 + .../order_products_controller_test.rb | 5 ++-- 3 files changed, 6 insertions(+), 28 deletions(-) create mode 100644 app/views/order_products/index.html.erb diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 586392ffdb..8844973180 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,34 +1,10 @@ class OrderProductsController < ApplicationController def index - @order_products = OrderProduct.all - end - - def new - @order_product = OrderProduct.new - end - - def create - @order_product = OrderProduct.new(order_product_params) - if @order_product.save - flash[:status] = :success - flash[:message] = "Successfully created order product #{@order_product.id}" - redirect_to order_product_path - else - flash.now[:status] = :failure - flash.now[:message] = "Failed to create order product" - flash.now[:details] = @order_product.errors.messages - render :new, status: :bad_request + if session[:merchant] + @order_products = Merchant.find(params[:merchant]).order_products end end - def show - find_order_product_by_params_id - end - - def edit - find_order_product_by_params_id - end - def update if find_order_product_by_params_id @order_product.update_attributes(order_product_params) diff --git a/app/views/order_products/index.html.erb b/app/views/order_products/index.html.erb new file mode 100644 index 0000000000..818eae11cd --- /dev/null +++ b/app/views/order_products/index.html.erb @@ -0,0 +1 @@ +

order products index

diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index dc8f5c9e48..7ef9bdeaec 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -2,8 +2,9 @@ describe OrderProductsController do describe "index" do - it "returns success for all order products" do - get order_products_path + it "returns success for the order products of a specific merchant if given a merchant" do + merchant = :ada + get merchant_sold_index_path(merchant) must_respond_with :success end end From d0fe478507e8113af5d2dac479ee41826d02e158 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:33:03 -0700 Subject: [PATCH 111/348] remove rows width constraints --- app/assets/stylesheets/application.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 742d601fc0..729b02c20d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -19,3 +19,7 @@ * { /*border: 1px solid lawngreen;*/ } + +.row { + max-width: 100%; +} From 2cc606e6c1396ad99d6ab19c8900a4b1d566d126 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:39:26 -0700 Subject: [PATCH 112/348] fix logged in tests --- Gemfile | 2 +- app/controllers/products_controller.rb | 4 ++-- test/controllers/products_controller_test.rb | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 10e988ad3e..2f318fea7b 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,6 @@ git_source(:github) do |repo_name| "https://github.com/#{repo_name}.git" end -gem 'pry-rails' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.1.4' # Use postgresql as the database for Active Record @@ -40,6 +39,7 @@ group :development, :test do gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] # Adds support for Capybara system testing and selenium driver gem 'capybara', '~> 2.13' + gem 'pry-rails' gem 'selenium-webdriver' end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 66fdd5fe65..a4e6066c50 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -19,7 +19,7 @@ def new def create @product = Product.new(prod_params) - @product.merchant_id = session[:user_id] + @product.merchant_id = session[:merchant]['id'] result = @product.save @@ -87,7 +87,7 @@ def confirm_login end def confirm_ownership - unless session[:merchant][:id] == @product.merchant_id + unless session[:merchant]['id'] == @product.merchant_id flash[:status] = :failure flash[:message] = "Only a product's merchant can modify a product." return redirect_back(fallback_location: products_path) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 788261fa33..85ab02fb0d 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -42,8 +42,6 @@ it 'can successfully create valid product' do post products_path, params: good_params - binding.pry - must_respond_with :found flash[:status].must_equal :success Product.count.must_equal (@before_count + 1) From 1393b8ec5037d1458a11ac3522ead6ce93b5e607 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:45:26 -0700 Subject: [PATCH 113/348] add login controller filter to products and application controller --- app/controllers/application_controller.rb | 11 +++++++++++ app/controllers/products_controller.rb | 12 ++---------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5745ea14c9..7751afa8e1 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,19 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + before_action :confirm_login + def render_404 raise ActionController::RoutingError.new('Not Found') end + protected + + def confirm_login + if session[:merchant].nil? + flash[:status] = :failure + flash[:message] = "You must be logged in to do that." + return redirect_back(fallback_location: products_path) + end + end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a4e6066c50..ae729a23e9 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,10 +1,10 @@ class ProductsController < ApplicationController before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] - before_action :confirm_login, only: [:new, :create, :edit, :update, :destroy] - before_action :confirm_ownership, only: [:edit, :update, :destroy] + skip_before_action :confirm_login, only: [:index, :show] + def index @products = Product.all @categories = ['Magic', 'Witchcraft', 'Mythical Beasts', 'Food', 'Legendary Items'] @@ -78,14 +78,6 @@ def find_product_by_params end end - def confirm_login - if session[:merchant].nil? - flash[:status] = :failure - flash[:message] = "You must be logged in to do that." - return redirect_back(fallback_location: products_path) - end - end - def confirm_ownership unless session[:merchant]['id'] == @product.merchant_id flash[:status] = :failure From 15c07a0951ad2255a83c97830e4b2f5f134bf29d Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:46:32 -0700 Subject: [PATCH 114/348] does not automatically check login --- app/controllers/application_controller.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7751afa8e1..fc03400665 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,6 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception - before_action :confirm_login - def render_404 raise ActionController::RoutingError.new('Not Found') end From a5099aa193f8f9d3fa0bba5b12e335ab30dbb698 Mon Sep 17 00:00:00 2001 From: sairagula Date: Fri, 20 Oct 2017 14:47:21 -0700 Subject: [PATCH 115/348] Cleaning up reviews controller --- app/controllers/reviews_controller.rb | 34 ++--- test/controllers/reviews_controller_test.rb | 143 ++++++++------------ 2 files changed, 70 insertions(+), 107 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 3f3ffa10e8..75cbfa6785 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,18 +1,5 @@ class ReviewsController < ApplicationController - before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] - - def index - # if params[:product] - # product = Product.find_by(id: params[:product_id]) - # if product - # @reviews = product.reviews - # else - # head :not_found - # end - # else - @reviews = Review.all - # end - end + before_action :find_review_by_params_id, only: [:edit, :update, :destroy] def new @review = Review.new @@ -26,22 +13,21 @@ def create # # flash[:result_text] = "You can not review your own product" # # redirect_to product_path # # else + # if session[:login] @review = Review.new(review_params) if @review.save - # flash[:status] = :success - # flash[:message] = "Successfully created review " + flash[:status] = :success + flash[:message] = "Successfully created review " redirect_to review_path(@review) - # else - # flash[:status] = :failure - # flash[:message] = "Failed to create review" - # flash[:details] = @review.errors.messages - # render :new, status: :bad_request + else + flash[:status] = :failure + flash[:message] = "Failed to create review" + # flash[:details] = @review.errors.messages + render :new, status: :bad_request end # end end - # - def show ; end - # + def edit ; end # def update diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 8e24793319..c1125b5c99 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -3,19 +3,6 @@ describe ReviewsController do let(:review) { reviews(:review) } - describe "index" do - it "returns success status for all reviews" do - get reviews_path - must_respond_with :success - end - - # it "returns a failure status when there are no reviews" do - # Review.destroy_all - # get reviews_path - # must_respond_with :failure - # end - end - describe "new" do it " should work without a merchant id" do get new_review_path @@ -37,65 +24,55 @@ # end end # - # describe "create" do - # it "adds the review to the product and redirects when the review data is valid" do - # # Arrange - # review_data = { - # review: { - # rating: 5, - # product: (products(:mermaid_fin)) - # } - # } - # Review.new(review_data[:review]).must_be :valid? - # - # start_review_count = Review.count - # - # # Act - # post reviews_path, params: review_data - # - # # Assert - # must_respond_with :redirect - # must_redirect_to reviews_path - # - # Review.count.must_equal start_review_count + 1 - # end - # # - # it "sends bad_request if review data is invalid" do - # # Arrange - # invalid_review_data = { - # review: { - # #No rating - # product: (reviews(:mermaid_fin)) - # } - # } - # # Double checking the data is truly invalid - # Review.new(invalid_review_data[:review]).wont_be :valid? - # - # start_review_count = Review.count - # - # # Act - # post reviews_path, params: invalid_review_data - # - # # Assert - # must_respond_with :bad_request - # # assert_template :new - # Review.count.must_equal start_review_count - # end - # end - # - # describe "show" do - # it "succeeds for a review that exists" do - # get review_path(reviews(:review)) - # must_respond_with :success - # end - # - # it "returns 404 not_found for a review that does not exist" do - # get review_path(reviews(:bad_review)) - # must_respond_with :not_found - # end - # end - # - # describe "edit" do + describe "create" do + it "adds the review to the product and redirects when the review data is valid" do + # Arrange + review_data = { + review: { + rating: 5, + product: products(:mermaid_fin).attributes + } + } + start_review_count = Review.count + + # Act + post reviews_path, params: review_data + + # Assert + must_respond_with :bad_request + # must_redirect_to review_path + + Review.count.must_equal start_review_count + 1 + end + + + + + # + # it "sends bad_request if review data is invalid" do + # # Arrange + # invalid_review_data = { + # review: { + # #No rating + # product: (reviews(:mermaid_fin)) + # } + # } + # # Double checking the data is truly invalid + # Review.new(invalid_review_data[:review]).wont_be :valid? + # + # start_review_count = Review.count + # + # # Act + # post reviews_path, params: invalid_review_data + # + # # Assert + # must_respond_with :bad_request + # # assert_template :new + # Review.count.must_equal start_review_count + # end + end + + describe "edit" do # it "will give error message if merchant owns the product" do # arrange: login 'ada' user # login(users(:ada)) @@ -110,15 +87,15 @@ # must_respond_with :unauthorized # end # - # it "succeeds for an exact review ID" do - # get edit_review_path(reviews(:review)) - # must_respond_with :success - # end - # - # it "renders 404 not_found for a bogus review ID" do - # bogus_review_id = Review.last.id + 1 - # get edit_review_path(bogus_review_id) - # must_respond_with :not_found - # end - # end + it "succeeds for an exact review ID" do + get edit_review_path(reviews(:review)) + must_respond_with :success + end + + it "renders 404 not_found for a bogus review ID" do + bogus_review_id = Review.last.id + 1 + get edit_review_path(bogus_review_id) + must_respond_with :not_found + end + end end From b670b53b9e39e4664bb42aac9a3b64d5e885b6c7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:46:32 -0700 Subject: [PATCH 116/348] does not automatically check login --- app/controllers/application_controller.rb | 2 -- app/controllers/products_controller.rb | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7751afa8e1..fc03400665 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,6 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception - before_action :confirm_login - def render_404 raise ActionController::RoutingError.new('Not Found') end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index ae729a23e9..1700f385c9 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,9 +1,11 @@ class ProductsController < ApplicationController + before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] + before_action :confirm_login, except: [:index, :show] + before_action :confirm_ownership, only: [:edit, :update, :destroy] - skip_before_action :confirm_login, only: [:index, :show] def index @products = Product.all From 62780f8241bcc7be1465de8dbc3423fc54b80ded Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 14:51:12 -0700 Subject: [PATCH 117/348] Edited #update and #destroy tests for order_products_controller --- app/controllers/order_products_controller.rb | 4 +- .../order_products_controller_test.rb | 71 +------------------ 2 files changed, 3 insertions(+), 72 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 8844973180..fc84b1aff8 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -22,8 +22,8 @@ def destroy if find_order_product_by_params_id @order_product.destroy flash[:status] = :success - flash[:message] = "Deleted order product #{@order_product.title}" - redirect_to order_products_path + flash[:message] = "Deleted order product #{@order_product.product.name}" + redirect_to merchant_sold_index_path(@order_product.product.merchant) end end diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index 7ef9bdeaec..f44bdbfd41 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -9,75 +9,6 @@ end end - describe "new" do - it "returns success for a new order product" do - get new_order_product_path - must_respond_with :success - end - end - - describe "create" do - it "adds order product to the database and redirects when the data is valid" do - order_product = { - order_product: { - quantity: 2, - product: :mermaid_fin - } - } - OrderProduct.new(order_product[:order_product]).must_be :valid? - start_count = OrderProduct.count - - post order_products_path, params: order_product - - must_respond_with :redirect - must_redirect_to order_products_path - OrderProduct.count.must_equal start_count + 1 - end - - it "re-renders form when the order product data is invalid" do - order_product = { - order_product: { - quantity: 2 - } - } - OrderProduct.new(order_product[:order_product]).wont_be :valid? - start_count = OrderProduct.count - - post order_products_path, params: order_product - - must_respond_with :bad_request - OrderProduct.count.must_equal start_count - end - end - - describe "show" do - it "returns success with valid id" do - order_product_id = OrderProduct.first.id - get order_product_path(order_product_id) - must_respond_with :success - end - - it "returns not_found with invalid id" do - invalid_id = OrderProduct.last.id + 1 - get order_product_path(invalid_id) - must_respond_with :not_found - end - end - - describe "edit" do - it "returns success with valid id" do - order_product_id = OrderProduct.first.id - get edit_order_product_path(order_product_id) - must_respond_with :success - end - - it "returns not_found with invalid id" do - invalid_id = OrderProduct.last.id + 1 - get edit_order_product_path(invalid_id) - must_respond_with :not_found - end - end - describe "update" do it "returns success if order product exists and changes are valid" do order_product = OrderProduct.first @@ -119,7 +50,7 @@ order_product.must_be :valid? delete order_product_path(order_product) must_respond_with :redirect - must_redirect_to order_products_path + must_redirect_to merchant_sold_index_path(order_product.product.merchant) end it "returns not_found if work does not exist" do From a83ab8f77779fe133583a4175aa6525e4362e20c Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 14:54:58 -0700 Subject: [PATCH 118/348] added some merchant controller tests --- app/controllers/application_controller.rb | 4 ---- app/controllers/merchants_controller.rb | 23 ++++++++++++------- test/controllers/merchants_controller_test.rb | 3 +-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5745ea14c9..c2cdb17186 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,4 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception - def render_404 - raise ActionController::RoutingError.new('Not Found') - end - end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 618275d5de..6e8ea08a81 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -49,25 +49,32 @@ def index end def edit - @merchant = Merchant.find(params[:id]) - render_404 unless @merchant + @merchant = Merchant.find_by(id: params[:id]) + return head :not_found unless @merchant end def update - @merchant = Merchant.find(params[:id]) - if @merchant.save + @merchant = Merchant.find_by(id: params[:id]) + return head :not_found unless @merchant + if @merchant.valid? + @merchant.save + flash[:status] = :success + flash[:message] = "Successfully updated #{@merchant.username}" redirect_to merchant_path(@merchant) + return #success message else - render :edit, status: :bad_request - return - #fail message flash + flash.now[:status] = :failure + flash.now[:result_text] = "Could not update #{@merchant.username}" + flash.now[:messages] = @merchant.errors.messages + render :edit, status: :not_found + # return end end def show @merchant = Merchant.find_by(id: params[:id]) - render_404 unless @merchant + return head :not_found unless @merchant end def destroy diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index ee06ca62b4..7c5acf60d2 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -27,7 +27,6 @@ it "renders 404 not_found for a bogus merchant" do bogus_merchant_id = Merchant.last.id + 1 - # binding.pry get merchant_path(bogus_merchant_id) must_respond_with :not_found end @@ -53,6 +52,7 @@ it "renders 404 not_found for a bogus merchant ID" do bogus_merchant_id = Merchant.last.id + 1 + # binding.pry get edit_merchant_path(bogus_merchant_id) must_respond_with :not_found end @@ -105,7 +105,6 @@ # Check that the update is actually invalid merchant.update_attributes(invalid_merchant_data[:merchant]) merchant.wont_be :valid? - patch merchant_path(merchant), params: invalid_merchant_data must_respond_with :bad_request From fe955d145c8ee1765bb63d18d3041e1d563dc631 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 14:55:56 -0700 Subject: [PATCH 119/348] spacing --- test/controllers/products_controller_test.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 85ab02fb0d..a6adf8b68a 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -14,9 +14,7 @@ describe 'for logged in users' do before do user = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) - get login_path(:github) end From 0d998f76f2ff5ed0fd84e948bee32ae046da5eec Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 14:59:14 -0700 Subject: [PATCH 120/348] removed conflicting things in applications controller --- app/controllers/application_controller.rb | 3 --- app/controllers/merchants_controller.rb | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9638e86918..fc03400665 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,6 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception -<<<<<<< HEAD -======= def render_404 raise ActionController::RoutingError.new('Not Found') end @@ -16,5 +14,4 @@ def confirm_login return redirect_back(fallback_location: products_path) end end ->>>>>>> 8a8fabd4d3ac6d7fe0012efd4bc3ab4e32c08031 end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 6e8ea08a81..3ca07fd32f 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -49,8 +49,8 @@ def index end def edit - @merchant = Merchant.find_by(id: params[:id]) - return head :not_found unless @merchant + @merchant = Merchant.find_by(id: params[:id]) + return head :not_found unless @merchant end def update From 8519d9270eb2fd9d0d1ec173d1b1c641dc33ebb5 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 15:18:36 -0700 Subject: [PATCH 121/348] add category model & join table --- app/models/category.rb | 3 +++ app/models/product.rb | 1 + db/migrate/20171020221429_create_categories.rb | 9 +++++++++ .../20171020221607_create_categories_products.rb | 8 ++++++++ db/schema.rb | 13 ++++++++++++- test/fixtures/categories.yml | 7 +++++++ test/models/category_test.rb | 9 +++++++++ 7 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 app/models/category.rb create mode 100644 db/migrate/20171020221429_create_categories.rb create mode 100644 db/migrate/20171020221607_create_categories_products.rb create mode 100644 test/fixtures/categories.yml create mode 100644 test/models/category_test.rb diff --git a/app/models/category.rb b/app/models/category.rb new file mode 100644 index 0000000000..f3218758f1 --- /dev/null +++ b/app/models/category.rb @@ -0,0 +1,3 @@ +class Category < ApplicationRecord + has_and_belongs_to_many :products +end diff --git a/app/models/product.rb b/app/models/product.rb index 3a4d097a8c..13e9097fc9 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -3,6 +3,7 @@ class Product < ApplicationRecord has_many :reviews has_many :orders, through: :order_products belongs_to :merchant + has_and_belongs_to_many :categories validates :name, presence: true, uniqueness: true validates :price, presence: true, numericality: {greater_than: 0} diff --git a/db/migrate/20171020221429_create_categories.rb b/db/migrate/20171020221429_create_categories.rb new file mode 100644 index 0000000000..5bef4913b8 --- /dev/null +++ b/db/migrate/20171020221429_create_categories.rb @@ -0,0 +1,9 @@ +class CreateCategories < ActiveRecord::Migration[5.1] + def change + create_table :categories do |t| + t.string :name + + t.timestamps + end + end +end diff --git a/db/migrate/20171020221607_create_categories_products.rb b/db/migrate/20171020221607_create_categories_products.rb new file mode 100644 index 0000000000..b87a74eb79 --- /dev/null +++ b/db/migrate/20171020221607_create_categories_products.rb @@ -0,0 +1,8 @@ +class CreateCategoriesProducts < ActiveRecord::Migration[5.1] + def change + create_table :categories_products do |t| + t.integer :category_id + t.integer :product_id + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 5f14de5263..5576ce9df7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,22 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171018191131) do +ActiveRecord::Schema.define(version: 20171020221607) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "categories", force: :cascade do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + + create_table "categories_products", force: :cascade do |t| + t.integer "category_id" + t.integer "product_id" + end + create_table "merchants", force: :cascade do |t| t.string "username" t.string "email" diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..56066c68af --- /dev/null +++ b/test/fixtures/categories.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + +two: + name: MyString diff --git a/test/models/category_test.rb b/test/models/category_test.rb new file mode 100644 index 0000000000..781320ad8e --- /dev/null +++ b/test/models/category_test.rb @@ -0,0 +1,9 @@ +require "test_helper" + +describe Category do + let(:category) { Category.new } + + it "must be valid" do + value(category).must_be :valid? + end +end From fd964cac3ae801bd495522a24a24189dce6d5e9a Mon Sep 17 00:00:00 2001 From: kee nam Date: Fri, 20 Oct 2017 15:33:37 -0700 Subject: [PATCH 122/348] Working on orders_controllers tests --- app/controllers/orders_controller.rb | 9 ++++++--- app/views/orders/index.html.erb | 1 + app/views/orders/new.html.erb | 1 + app/views/orders/show.html.erb | 1 + test/controllers/orders_controller_test.rb | 5 +++-- 5 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 app/views/orders/index.html.erb create mode 100644 app/views/orders/new.html.erb create mode 100644 app/views/orders/show.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index ddcbbdf209..ee0554f9f3 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,6 +1,9 @@ class OrdersController < ApplicationController def index @orders = Order.all + if session[:merchant] + @orders = Merchant.find(params[:merchant]).orders + end end def new @@ -25,9 +28,9 @@ def show find_order_by_params_id end - def edit - find_order_by_params_id - end + # def edit + # find_order_by_params_id + # end def update if find_order_by_params_id diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..254c00295b --- /dev/null +++ b/app/views/orders/index.html.erb @@ -0,0 +1 @@ +

order index

diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb new file mode 100644 index 0000000000..2f85f7d69b --- /dev/null +++ b/app/views/orders/new.html.erb @@ -0,0 +1 @@ +

NEW order page

diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..3f2e0fffa4 --- /dev/null +++ b/app/views/orders/show.html.erb @@ -0,0 +1 @@ +

order SHOW page

diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index b07e5ed8e5..76d9d0a1a0 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -2,8 +2,9 @@ describe OrdersController do describe "index" do - it "returns success for all orders" do - get order_path + it "returns success for the orders of a specific merchant if given a merchant" do + merchant = :ada + get merchant_orders_path(merchant) must_respond_with :success end end From 6e5a9b76df9b0f0ed35335c9792377b3dccd4bf7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 20 Oct 2017 15:47:42 -0700 Subject: [PATCH 123/348] remove old 'category' attribute from products --- .../20171020222435_remove_column_products_category_string.rb | 5 +++++ db/schema.rb | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20171020222435_remove_column_products_category_string.rb diff --git a/db/migrate/20171020222435_remove_column_products_category_string.rb b/db/migrate/20171020222435_remove_column_products_category_string.rb new file mode 100644 index 0000000000..2410329855 --- /dev/null +++ b/db/migrate/20171020222435_remove_column_products_category_string.rb @@ -0,0 +1,5 @@ +class RemoveColumnProductsCategoryString < ActiveRecord::Migration[5.1] + def change + remove_column :products, :category, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 5576ce9df7..086373f22e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171020221607) do +ActiveRecord::Schema.define(version: 20171020222435) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -59,7 +59,6 @@ create_table "products", force: :cascade do |t| t.string "name" t.string "image_url" - t.string "category" t.float "price" t.integer "quantity" t.text "description" From 697856f9b2a6a5c4d3bd2d39f916d8967e232460 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Fri, 20 Oct 2017 16:03:55 -0700 Subject: [PATCH 124/348] all passing tests merchant controller --- app/controllers/merchants_controller.rb | 53 ++++++--- test/controllers/merchants_controller_test.rb | 110 ++++++++++++------ 2 files changed, 107 insertions(+), 56 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 3ca07fd32f..fbbf30bea7 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -37,16 +37,21 @@ def create if @merchant.save #success message + flash[:status] = :success + flash[:message] = "Successfully created merchant #{@merchant.id}" redirect_to root_path else #I'm not sure how we're deciding to do error messages. Flash? - render :new + flash.now[:status] = :failure + flash.now[:message] = "Failed to create Merchant" + flash.now[:details] = @merchant.errors.messages + render :new, status: :bad_request end end - def index - @merchants = Merchant.all - end + # def index + # @merchants = Merchant.all + # end def edit @merchant = Merchant.find_by(id: params[:id]) @@ -54,21 +59,22 @@ def edit end def update - @merchant = Merchant.find_by(id: params[:id]) - return head :not_found unless @merchant - if @merchant.valid? - @merchant.save - flash[:status] = :success - flash[:message] = "Successfully updated #{@merchant.username}" - redirect_to merchant_path(@merchant) - return - #success message - else - flash.now[:status] = :failure - flash.now[:result_text] = "Could not update #{@merchant.username}" - flash.now[:messages] = @merchant.errors.messages - render :edit, status: :not_found - # return + if find_merchant_by_params_id + @merchant.update_attributes(merchant_params) + + if @merchant.save + flash[:status] = :success + flash[:message] = "Successfully updated #{@merchant.username}" + redirect_to merchant_path(@merchant) + return + + else + flash.now[:status] = :failure + flash.now[:message] = "Could not update #{@merchant.username}" + # flash.now[:messages] = @merchant.errors.messages + render :edit, status: :bad_request + # return + end end end @@ -88,4 +94,13 @@ def destroy def merchant_params return params.require(:merchant).permit(:username, :email, :oauth_uid, :oauth_provider) end + + def find_merchant_by_params_id + @merchant = Merchant.find_by(id: params[:id]) + unless @merchant + head :not_found + end + return @merchant + end + end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 7c5acf60d2..4e53dd0f31 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,23 +1,6 @@ require "test_helper" describe MerchantsController do - describe "index" do - it "succeeds with many merchants" do - # Assumption: there are many merchants in the DB - # @merchants.count.must_be :>, 0 - get merchants_path - must_respond_with :success - end - - it "succeeds with no merchants" do - # Start with a clean slate - # binding.pry - Merchant.destroy_all - - get merchants_path - must_respond_with :success - end - end describe "show" do it "succeeds for an extant merchant" do @@ -32,30 +15,83 @@ end end - describe "new" do - it "works" do - get new_merchant_path - must_respond_with :success - end - end describe "create" do - - end - - # - describe "edit" do - it "succeeds for an extant merchant ID" do - get edit_merchant_path(Merchant.first) - must_respond_with :success + it "works" do + merchant = { + merchant: { + oauth_provider: "github", + oauth_uid: "99999", + email: "somebody@somesite.com", + username: "Somebody" + } + } + Merchant.new(merchant[:merchant]).must_be :valid? + start_count = Merchant.count + post merchants_path, params: merchant + flash[:status].must_equal :success + must_respond_with :redirect + must_redirect_to root_path + Merchant.count.must_equal start_count + 1 end - it "renders 404 not_found for a bogus merchant ID" do - bogus_merchant_id = Merchant.last.id + 1 - # binding.pry - get edit_merchant_path(bogus_merchant_id) - must_respond_with :not_found - end + # it "adds order to the database and redirects when the data is valid" do + # order = { + # order: { + # cust_name: "Mermaid", + # merchant_id: 21, + # cust_cc: 12345, + # cust_cc_exp: "11/22", + # cust_addr: "Sea World", + # cust_email: "forkhair@mermaid.com", + # status: "complete" + # } + # } + # Order.new(order[:order]).must_be :valid? + # start_count = Order.count + # + # post orders_path, params: order + # + # must_respond_with :redirect + # must_redirect_to orders_path + # Order.count.must_equal start_count + 1 + # end + # + # it "re-renders form when the order data is invalid" do + # order = { + # order: { + # cust_name: "Mermaid", + # merchant_id: 21, + # cust_cc: 12345, + # cust_cc_exp: "11/22", + # cust_addr: "Sea World", + # cust_email: "forkhair@mermaid.com", + # status: "" + # } + # } + # Order.new(order[:order]).wont_be :valid? + # start_count = Order.count + # + # post orders_path, params: order + # + # must_respond_with :bad_request + # Order.count.must_equal start_count + # end + # end + # + # # + # describe "edit" do + # it "succeeds for an extant merchant ID" do + # get edit_merchant_path(Merchant.first) + # must_respond_with :success + # end + # + # it "renders 404 not_found for a bogus merchant ID" do + # bogus_merchant_id = Merchant.last.id + 1 + # # binding.pry + # get edit_merchant_path(bogus_merchant_id) + # must_respond_with :not_found + # end end describe "update" do From fb44eb12ee71ee62676c9227ab7eb7246e9abba6 Mon Sep 17 00:00:00 2001 From: sairagula Date: Sat, 21 Oct 2017 14:14:05 -0700 Subject: [PATCH 125/348] Review controller tests pass for create function --- app/controllers/reviews_controller.rb | 68 ++++---- test/controllers/reviews_controller_test.rb | 168 +++++++++++++------- 2 files changed, 144 insertions(+), 92 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 75cbfa6785..e267139718 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,44 +1,37 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:edit, :update, :destroy] + before_action :check_for_product_owner, only: [:create] def new @review = Review.new end def create - # # if params[:merchant] - # # merchant = Merchant.find_by(id:session[:logged_in_merchant]) - # # if merchant.product - # # flash[:status] = :failure - # # flash[:result_text] = "You can not review your own product" - # # redirect_to product_path - # # else - # if session[:login] - @review = Review.new(review_params) - if @review.save - flash[:status] = :success - flash[:message] = "Successfully created review " - redirect_to review_path(@review) - else - flash[:status] = :failure - flash[:message] = "Failed to create review" - # flash[:details] = @review.errors.messages - render :new, status: :bad_request - end - # end + @review = Review.new(review_params) + if @review.save + flash[:status] = :success + flash[:message] = "Successfully created review " + redirect_to product_path(@product) + else + flash[:status] = :failure + flash[:message] = "Failed to create review" + render :new, status: :bad_request + end end def edit ; end # def update # #TODO add owner check - # @review.update_attributes(review_params) - # if save_and_flash(@review) - # redirect_to review_path(@review) - # else - # render :edit, status: :bad_request - # return - # end + @review.update_attributes(review_params) + if @review.save + flash[:status] = :success + flash[:message] = "Successfully created review " + redirect_to product_path(@product) + else + render :edit, status: :bad_request + return + end end def destroy @@ -51,7 +44,7 @@ def destroy private def review_params - @review =(params.require(:review).permit(:rating, :description, :merchant, :product)) + @review =(params.require(:review).permit(:rating, :description, :merchant_id, :product_id)) end def find_review_by_params_id @@ -61,12 +54,15 @@ def find_review_by_params_id end end - # Do we need this method? - # def require_owner_check - # if @review.merchant_id != @login_user.id - # flash[:status] = :failure - # flash[:result_text] = "You must be owner of the review to do that!" - # redirect_to review_path(@review) - # end - # end + def check_for_product_owner + @product = Product.find_by(id: params[:review][:product_id]) + unless @product + head :not_found + end + if session[:merchant] && @product.merchant_id == session[:merchant][:id] + flash[:status] = :failure + flash[:result_text] = "Owner can not review the product!" + redirect_to product_path(@product) + end + end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index c1125b5c99..3a3a6e2f49 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -2,35 +2,50 @@ describe ReviewsController do let(:review) { reviews(:review) } + let(:mermaid_fin) { products(:mermaid_fin) } describe "new" do it " should work without a merchant id" do get new_review_path must_respond_with :success end - # - # it "should return failure if product belongs to merchant " do - # # arrange: login 'ada' user - # login(users(:ada)) - # # act: review (Mermaid Fin) - # review_data = { - # review: { - # rating: 5, - # product: (products(:mermaid_fin)) - # } - # } - # # assert: expect failure. - # must_respond_with :bad_request - # end end - # + + def login_test_user + user = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + get login_path(:github) + end + describe "create" do + describe " logged in users" do + it "should return failure if product belongs to merchant " do + # arrange: login 'ada' user + login_test_user + review_data = { + review: { + rating: 5, + product_id: mermaid_fin.id + } + } + + # act: review (Mermaid Fin) + post reviews_path, params: review_data + + # assert: expect failure. + must_respond_with :redirect + must_redirect_to product_path(mermaid_fin) + end + + # it " should " + end it "adds the review to the product and redirects when the review data is valid" do # Arrange review_data = { review: { rating: 5, - product: products(:mermaid_fin).attributes + product_id: mermaid_fin.id + } } start_review_count = Review.count @@ -39,54 +54,48 @@ post reviews_path, params: review_data # Assert - must_respond_with :bad_request - # must_redirect_to review_path - + must_redirect_to product_path(mermaid_fin) Review.count.must_equal start_review_count + 1 end + it "sends bad_request if review data is invalid" do + # Arrange + invalid_review_data = { + review: { + #No rating + product_id: mermaid_fin.id + } + } + # Double checking the data is truly invalid + Review.new(invalid_review_data[:review]).wont_be :valid? + start_review_count = Review.count - # - # it "sends bad_request if review data is invalid" do - # # Arrange - # invalid_review_data = { - # review: { - # #No rating - # product: (reviews(:mermaid_fin)) - # } - # } - # # Double checking the data is truly invalid - # Review.new(invalid_review_data[:review]).wont_be :valid? - # - # start_review_count = Review.count - # - # # Act - # post reviews_path, params: invalid_review_data - # - # # Assert - # must_respond_with :bad_request - # # assert_template :new - # Review.count.must_equal start_review_count - # end - end + # Act + post reviews_path, params: invalid_review_data - describe "edit" do - # it "will give error message if merchant owns the product" do - # arrange: login 'ada' user - # login(users(:ada)) - # # act: review (Mermaid Fin) - # review_data = { - # review: { - # rating: 5, - # product: (products(:mermaid_fin)) - # } - # } - # # assert: expect failure. - # must_respond_with :unauthorized - # end + # Assert + must_respond_with :bad_request + Review.count.must_equal start_review_count + end + end # + describe "edit" do + # # it "will give error message if merchant owns the product" do + # # arrange: login 'ada' user + # # login(users(:ada)) + # # # act: review (Mermaid Fin) + # # review_data = { + # # review: { + # # rating: 5, + # # product: (products(:mermaid_fin)) + # # } + # # } + # # # assert: expect failure. + # # must_respond_with :unauthorized + # # end + # # it "succeeds for an exact review ID" do get edit_review_path(reviews(:review)) must_respond_with :success @@ -98,4 +107,51 @@ must_respond_with :not_found end end + + describe "update" do + it "will successfully update review" do + rev = Review.first + review_data = { + review: { + rating: 3, + product: products(:mermaid_fin).attributes + } + } + + patch review_path(rev), params: review_data + + must_respond_with :redirect + must_redirect_to review_path(rev) + + Review.find(rev.id).rating.must_equal rev.rating + 1 + end + # + # it "will return not found, if review doesn't exist" do + # bad_id = Review.last.id + 1 + # review_data = { + # review:{ + # rating: 3, + # description: "It is a good product " + # } + # } + # patch review_path(bad_id), params: review_data + # must_respond_with :not_found + # end + # + # it "will not let you invalidate work item" do + # w = Work.first + # work_data = { + # id: w.id, + # work: { + # title: "" # Clearing the title + # } + # } + # + # patch work_path(w), params: work_data + # + # must_respond_with :bad_request + # + # Work.find(w.id).title.must_equal w.title + # end + end end From 14ebce1f377558b95567c80df2de5c4360e0a73b Mon Sep 17 00:00:00 2001 From: sairagula Date: Sat, 21 Oct 2017 15:18:03 -0700 Subject: [PATCH 126/348] Changes for testing review --- app/controllers/reviews_controller.rb | 2 +- test/controllers/reviews_controller_test.rb | 32 ++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index e267139718..61014ba4d4 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,6 +1,6 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:edit, :update, :destroy] - before_action :check_for_product_owner, only: [:create] + before_action :check_for_product_owner, only: [:create, :new] def new @review = Review.new diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 3a3a6e2f49..03b29b6387 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -4,19 +4,37 @@ let(:review) { reviews(:review) } let(:mermaid_fin) { products(:mermaid_fin) } - describe "new" do - it " should work without a merchant id" do - get new_review_path - must_respond_with :success - end - end - def login_test_user user = merchants(:ada) OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) get login_path(:github) end + describe "new" do + # it " should work without a merchant id" do + # get new_review_path + # must_respond_with :success + # end + + it " should not work if product belongs to merchant " do + # Arrange + login_test_user + review_data = { + review: { + rating: 5, + product_id: mermaid_fin.id + } + } + # Act + get reviews_path, params: review_data + # Assert + must_respond_with :redirect + must_redirect_to product_path(mermaid_fin) + end + end + + + describe "create" do describe " logged in users" do it "should return failure if product belongs to merchant " do From fffcb29e64b82c026cf66c8ca0dc2f189f3508a8 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 15:34:31 -0700 Subject: [PATCH 127/348] implement category displays on product index --- app/controllers/products_controller.rb | 12 +++++++++--- app/views/products/index.html.erb | 2 +- config/routes.rb | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 1700f385c9..5cf947f492 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - + before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] before_action :confirm_login, except: [:index, :show] @@ -8,8 +8,14 @@ class ProductsController < ApplicationController def index - @products = Product.all - @categories = ['Magic', 'Witchcraft', 'Mythical Beasts', 'Food', 'Legendary Items'] + if params[:category_id] + cat = Category.find(params[:category_id]) + @products = Product.all.find_all { |prod| prod.categories.include? cat } + @title = cat.name.capitalize + else + @products = Product.all + end + @categories = Category.all end def show diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index b9aeb29def..8af62bb1e5 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -3,7 +3,7 @@
    <% @categories.each do |category| %>
  • - <%= link_to category.capitalize, products_path %> + <%= link_to category.name.capitalize, category_products_path(category.id) %>
  • <% end %>
diff --git a/config/routes.rb b/config/routes.rb index 356e6e924d..083df3da9c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,5 +11,8 @@ resources :orders, except: [:edit] resources :order_products, only: [:update, :destroy] resources :products + resources :categories, only: [:new, :create, :destroy] do + resources :products, only: [:index] + end resources :reviews, except: [:index, :show] end From f4a5ddac6c90239a413851d17a9b7802e6d2654f Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 16:36:31 -0700 Subject: [PATCH 128/348] add categories page) --- app/assets/javascripts/categories.js | 2 + app/assets/stylesheets/categories.scss | 3 ++ app/assets/stylesheets/products.scss | 9 +++++ app/controllers/categories_controller.rb | 3 ++ app/controllers/products_controller.rb | 28 ++++++++++++- app/helpers/categories_helper.rb | 2 + app/models/product.rb | 7 ++++ app/views/products/categories.html.erb | 39 +++++++++++++++++++ app/views/products/index.html.erb | 2 +- config/routes.rb | 3 ++ .../controllers/categories_controller_test.rb | 7 ++++ 11 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/categories.js create mode 100644 app/assets/stylesheets/categories.scss create mode 100644 app/controllers/categories_controller.rb create mode 100644 app/helpers/categories_helper.rb create mode 100644 app/views/products/categories.html.erb create mode 100644 test/controllers/categories_controller_test.rb diff --git a/app/assets/javascripts/categories.js b/app/assets/javascripts/categories.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/categories.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss new file mode 100644 index 0000000000..ef1657f8c9 --- /dev/null +++ b/app/assets/stylesheets/categories.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the categories controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index 41afa6c2f4..cf1cdcc3c0 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -94,3 +94,12 @@ section.product-info { font-size: 1.5rem; padding: 1rem 2rem; } + + +//////////////////// +// PRODUCTS PAGE: // +//////////////////// + +.show-product { + height: 20rem; +} diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..0af4fa70fd --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,3 @@ +class CategoriesController < ApplicationController + +end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 5cf947f492..d7058ce9c0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,6 @@ class ProductsController < ApplicationController - before_action :find_product_by_params, only: [:show, :edit, :update, :destroy] + before_action :find_product_by_params, only: [:show, :edit, :update, :destroy, :categories] before_action :confirm_login, except: [:index, :show] @@ -13,7 +13,8 @@ def index @products = Product.all.find_all { |prod| prod.categories.include? cat } @title = cat.name.capitalize else - @products = Product.all + @products = Product.all.sort_by { |prod| -prod.orders.count }[0...6] + @title = "Popular Now" end @categories = Category.all end @@ -76,6 +77,29 @@ def destroy end end + def categories + @categories = Category.all.sort_by{|c| c.name} + end + + def add_categories + params[:id] = params[:product_id] + find_product_by_params + puts params + puts "controller" + return redirect_to product_path(@product.id) + end + + def create_category + category = Category.new(name: params[:name]) + result = category.save + + if result + return render :categories + else + return render :categories + end + end + private def find_product_by_params diff --git a/app/helpers/categories_helper.rb b/app/helpers/categories_helper.rb new file mode 100644 index 0000000000..e06f31554c --- /dev/null +++ b/app/helpers/categories_helper.rb @@ -0,0 +1,2 @@ +module CategoriesHelper +end diff --git a/app/models/product.rb b/app/models/product.rb index 13e9097fc9..600617697e 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -12,4 +12,11 @@ class Product < ApplicationRecord def self.most_popular Product.all.sort_by{|p| -p.orders.count}[0...3] end + + + def show_data + puts params + puts "controller" + end + end diff --git a/app/views/products/categories.html.erb b/app/views/products/categories.html.erb new file mode 100644 index 0000000000..3f381a687e --- /dev/null +++ b/app/views/products/categories.html.erb @@ -0,0 +1,39 @@ +
+

+ Would you like to add some categories to <%= @product.name %> to help shoppers find it? +

+
+
+
+
+
+
+
+
+

Categories

+

+ Select all that apply: +

+ <%= form_tag('/products/:id/categories') do %> + <% @categories.each do |category| %> + <%= check_box_tag category.name, category.id %> + <%= label_tag category.name %> + + <%= hidden_field_tag :product_id, @product.id %> + <% end %> + + <%= submit_tag "Add Selected" %> + <% end %> + +

+ Add a new category: +

+ <%= form_tag('/products/:id/new_category') do %> + <%= text_field_tag :category_name %> + + <%= submit_tag "Add Selected" %> + <% end %> + +
+
+
diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 8af62bb1e5..a0e0ce9474 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -10,7 +10,7 @@
-

Popular Now

+

<%= @title %>

<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> <%= render partial: "product-list", locals: {products: @products} %> diff --git a/config/routes.rb b/config/routes.rb index 083df3da9c..73e8f2084b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,9 @@ resources :orders, except: [:edit] resources :order_products, only: [:update, :destroy] + get '/products/:id/categories', to: 'products#categories', as: 'add_categories' + post '/products/:id/categories', to: 'products#add_categories' + post '/products/:id/new_category', to: 'products#create_category' resources :products resources :categories, only: [:new, :create, :destroy] do resources :products, only: [:index] diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb new file mode 100644 index 0000000000..125dd4c91d --- /dev/null +++ b/test/controllers/categories_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CategoriesController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From 9e49a3377ae4c32a8bb46f3364dc00aa8c08d20b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 16:38:07 -0700 Subject: [PATCH 129/348] categories page wont show categories a product already has --- app/views/products/categories.html.erb | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/views/products/categories.html.erb b/app/views/products/categories.html.erb index 3f381a687e..d73fe0f4c8 100644 --- a/app/views/products/categories.html.erb +++ b/app/views/products/categories.html.erb @@ -16,22 +16,24 @@

<%= form_tag('/products/:id/categories') do %> <% @categories.each do |category| %> - <%= check_box_tag category.name, category.id %> - <%= label_tag category.name %> + <% unless @product.categories.include? category %> + <%= check_box_tag category.name, category.id %> + <%= label_tag category.name %> - <%= hidden_field_tag :product_id, @product.id %> + <%= hidden_field_tag :product_id, @product.id %> + <% end %> <% end %> <%= submit_tag "Add Selected" %> <% end %> -

- Add a new category: -

+

+ Add a new category: +

<%= form_tag('/products/:id/new_category') do %> - <%= text_field_tag :category_name %> + <%= text_field_tag :category_name %> - <%= submit_tag "Add Selected" %> + <%= submit_tag "Add Selected" %> <% end %>
From 181e494ab7f4a33b7908c9b13a18fe8f15654619 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 16:44:21 -0700 Subject: [PATCH 130/348] implement create new category --- app/controllers/products_controller.rb | 6 +++--- app/views/products/categories.html.erb | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d7058ce9c0..83c7fb6030 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -90,13 +90,13 @@ def add_categories end def create_category - category = Category.new(name: params[:name]) + category = Category.new(name: params[:category_name]) result = category.save if result - return render :categories + return redirect_to add_categories_path(params[:product_id]) else - return render :categories + return redirect_to add_categories_path(params[:product_id]) end end diff --git a/app/views/products/categories.html.erb b/app/views/products/categories.html.erb index d73fe0f4c8..0e358750dd 100644 --- a/app/views/products/categories.html.erb +++ b/app/views/products/categories.html.erb @@ -32,6 +32,7 @@

<%= form_tag('/products/:id/new_category') do %> <%= text_field_tag :category_name %> + <%= hidden_field_tag :product_id, @product.id %> <%= submit_tag "Add Selected" %> <% end %> From 7abe060635fa599801d2e242799e362ff1bdcbfb Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 16:50:31 -0700 Subject: [PATCH 131/348] category uniqueness is case sensitive --- app/controllers/products_controller.rb | 5 +++++ app/models/category.rb | 2 ++ app/views/products/categories.html.erb | 5 ++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 83c7fb6030..80e7daabbc 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -94,8 +94,13 @@ def create_category result = category.save if result + flash[:status] = :success + flash[:message] = "Added category #{category.name}" return redirect_to add_categories_path(params[:product_id]) else + flash[:status] = :failure + flash[:message] = "Could not create new category" + flash[:details] = category.errors.messages return redirect_to add_categories_path(params[:product_id]) end end diff --git a/app/models/category.rb b/app/models/category.rb index f3218758f1..d5930b23ce 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -1,3 +1,5 @@ class Category < ApplicationRecord has_and_belongs_to_many :products + + validates :name, presence: true, uniqueness: { case_sensitive: false } end diff --git a/app/views/products/categories.html.erb b/app/views/products/categories.html.erb index 0e358750dd..37dd290b47 100644 --- a/app/views/products/categories.html.erb +++ b/app/views/products/categories.html.erb @@ -2,6 +2,9 @@

Would you like to add some categories to <%= @product.name %> to help shoppers find it?

+ + <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> +
@@ -34,7 +37,7 @@ <%= text_field_tag :category_name %> <%= hidden_field_tag :product_id, @product.id %> - <%= submit_tag "Add Selected" %> + <%= submit_tag "Create" %> <% end %>
From 23fbe61003cded7a95de5be8d99fa65ef3a4f21c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 16:51:45 -0700 Subject: [PATCH 132/348] moved creation of categories to categories controller --- app/controllers/categories_controller.rb | 14 ++++++++++++++ app/controllers/products_controller.rb | 16 ---------------- config/routes.rb | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 0af4fa70fd..2e5d9dda92 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,3 +1,17 @@ class CategoriesController < ApplicationController + def create + category = Category.new(name: params[:category_name]) + result = category.save + if result + flash[:status] = :success + flash[:message] = "Added category #{category.name}" + return redirect_to add_categories_path(params[:product_id]) + else + flash[:status] = :failure + flash[:message] = "Could not create new category" + flash[:details] = category.errors.messages + return redirect_to add_categories_path(params[:product_id]) + end + end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 80e7daabbc..fc82cae733 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -89,22 +89,6 @@ def add_categories return redirect_to product_path(@product.id) end - def create_category - category = Category.new(name: params[:category_name]) - result = category.save - - if result - flash[:status] = :success - flash[:message] = "Added category #{category.name}" - return redirect_to add_categories_path(params[:product_id]) - else - flash[:status] = :failure - flash[:message] = "Could not create new category" - flash[:details] = category.errors.messages - return redirect_to add_categories_path(params[:product_id]) - end - end - private def find_product_by_params diff --git a/config/routes.rb b/config/routes.rb index 73e8f2084b..8484577e73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,7 +12,7 @@ resources :order_products, only: [:update, :destroy] get '/products/:id/categories', to: 'products#categories', as: 'add_categories' post '/products/:id/categories', to: 'products#add_categories' - post '/products/:id/new_category', to: 'products#create_category' + post '/products/:id/new_category', to: 'categories#create' resources :products resources :categories, only: [:new, :create, :destroy] do resources :products, only: [:index] From ee653f85badb524686a1b2921c6769c1bfae9fd9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 16:56:29 -0700 Subject: [PATCH 133/348] add @own_product variable for product#show page --- app/controllers/products_controller.rb | 3 +++ app/views/products/show.html.erb | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index fc82cae733..b1a25e4145 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -20,6 +20,9 @@ def index end def show + if session[:merchant] + @own_product = session[:merchant]['id'] == @product.merchant_id ? true : false + end end def new diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index ec09add52b..e4dd7e3a4d 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,7 +1,6 @@ <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> -
From 96e205744499357be8229ab9d6bc10ddf7607295 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sat, 21 Oct 2017 17:00:13 -0700 Subject: [PATCH 134/348] create product redirects to add categories page --- app/controllers/products_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index b1a25e4145..40cb002bbd 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -38,7 +38,7 @@ def create if result flash.now[:status] = :success flash.now[:message] = "Successfully created #{@product.name}" - return redirect_to product_path(@product.id) + return redirect_to add_categories_path(@product.id) else flash.now[:status] = :failure flash.now[:message] = "Could not create new product" From 0a116631a81123a2e7f2de74ed28501ea9a5ab03 Mon Sep 17 00:00:00 2001 From: sairagula Date: Sun, 22 Oct 2017 00:37:41 -0700 Subject: [PATCH 135/348] All tests passed for review controller, added nested routes to review routes --- app/controllers/reviews_controller.rb | 50 +++--- config/routes.rb | 6 +- test/controllers/reviews_controller_test.rb | 170 ++++++++++---------- 3 files changed, 119 insertions(+), 107 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 228205b5e3..d1e233545f 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,6 +1,7 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:edit, :update, :destroy] - before_action :check_for_product_owner, only: [:create, :new] + before_action :check_for_product_owner_nested, only: [:create, :new] + before_action :check_for_product_owner, only: [:edit, :update, :destroy] def new @review = Review.new @@ -20,31 +21,30 @@ def create end def edit ; end - # + def update - # #TODO add owner check - @review.update_attributes(review_params) - if @review.save - flash[:status] = :success - flash[:message] = "Successfully created review " - redirect_to product_path(@product) - else - render :edit, status: :bad_request - return - end + @review.update_attributes(review_params) + if @review.save + flash[:status] = :success + flash[:message] = "Successfully created review " + redirect_to review_path(@review) + else + render :edit, status: :bad_request + return + end end - def destroy # only for logged in person who owns - # @review.destroy - # flash[:status] = :success - # flash[:result_text] = "Successfully destroyed review by #{@merchant.username}" - # redirect_to product_path + def destroy + @review.destroy + flash[:status] = :success + flash[:result_text] = "Successfully destroyed review" + redirect_to product_path(@review.product_id) end private def review_params - @review =(params.require(:review).permit(:rating, :description, :merchant_id, :product_id)) + return params.require(:review).permit(:rating, :description, :merchant_id, :product_id) end def find_review_by_params_id @@ -55,13 +55,23 @@ def find_review_by_params_id end def check_for_product_owner - @product = Product.find_by(id: params[:review][:product_id]) + if !session[:merchant].nil? && @review.merchant_id == session[:merchant]["id"] + flash[:status] = :failure + flash[:result_text] = "Owner can not edit the review of the product!" + # render :nothing => true, :status => :bad_request + redirect_to product_path(@review.product_id) + end + end + + def check_for_product_owner_nested + @product = Product.find_by(id: params[:product_id]) unless @product head :not_found end - if session[:merchant] && @product.merchant_id == session[:merchant][:id] + if !session[:merchant].nil? && @product.merchant_id == session[:merchant]["id"] flash[:status] = :failure flash[:result_text] = "Owner can not review the product!" + # render :nothing => true, :status => :bad_request redirect_to product_path(@product) end end diff --git a/config/routes.rb b/config/routes.rb index 356e6e924d..3d2a607798 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,6 +10,8 @@ resources :orders, except: [:edit] resources :order_products, only: [:update, :destroy] - resources :products - resources :reviews, except: [:index, :show] + resources :products do + # only: [:index, :new, :create] is nested + resources :reviews, shallow: true + end end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 03b29b6387..f832cb7af3 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -11,66 +11,56 @@ def login_test_user end describe "new" do - # it " should work without a merchant id" do - # get new_review_path - # must_respond_with :success - # end + it " should work for anon user" do + get new_product_review_path(mermaid_fin) + must_respond_with :success + end it " should not work if product belongs to merchant " do # Arrange login_test_user - review_data = { - review: { - rating: 5, - product_id: mermaid_fin.id - } - } + # Act - get reviews_path, params: review_data + get new_product_review_path(mermaid_fin) + # Assert must_respond_with :redirect must_redirect_to product_path(mermaid_fin) end end - - describe "create" do - describe " logged in users" do - it "should return failure if product belongs to merchant " do - # arrange: login 'ada' user - login_test_user - review_data = { - review: { - rating: 5, - product_id: mermaid_fin.id - } + it "should return failure if product belongs to merchant " do + # arrange: login 'ada' user + login_test_user + review_data = { + review: { + rating: 5, + product_id: mermaid_fin.id } + } + start_review_count = Review.count - # act: review (Mermaid Fin) - post reviews_path, params: review_data - - # assert: expect failure. - must_respond_with :redirect - must_redirect_to product_path(mermaid_fin) - end + # act: review (Mermaid Fin) + post product_reviews_path(mermaid_fin), params: review_data - # it " should " + # assert: expect failure. + must_respond_with :redirect + must_redirect_to product_path(mermaid_fin) + Review.count.must_equal start_review_count end + it "adds the review to the product and redirects when the review data is valid" do # Arrange review_data = { review: { rating: 5, product_id: mermaid_fin.id - } } start_review_count = Review.count - # Act - post reviews_path, params: review_data - + post product_reviews_path(mermaid_fin), params: review_data # Assert must_redirect_to product_path(mermaid_fin) Review.count.must_equal start_review_count + 1 @@ -87,35 +77,29 @@ def login_test_user } # Double checking the data is truly invalid Review.new(invalid_review_data[:review]).wont_be :valid? - start_review_count = Review.count # Act - post reviews_path, params: invalid_review_data + post product_reviews_path(mermaid_fin), params: invalid_review_data # Assert must_respond_with :bad_request Review.count.must_equal start_review_count end end - # + describe "edit" do - # # it "will give error message if merchant owns the product" do - # # arrange: login 'ada' user - # # login(users(:ada)) - # # # act: review (Mermaid Fin) - # # review_data = { - # # review: { - # # rating: 5, - # # product: (products(:mermaid_fin)) - # # } - # # } - # # # assert: expect failure. - # # must_respond_with :unauthorized - # # end - # # + it "will return failure if merchant owns the product" do + login_test_user + + get edit_review_path(review) + + must_redirect_to product_path(mermaid_fin) + end + it "succeeds for an exact review ID" do - get edit_review_path(reviews(:review)) + review_id = Review.first.id + get edit_review_path(review.id) must_respond_with :success end @@ -128,48 +112,64 @@ def login_test_user describe "update" do it "will successfully update review" do - rev = Review.first review_data = { review: { rating: 3, - product: products(:mermaid_fin).attributes + product: mermaid_fin.attributes } } - patch review_path(rev), params: review_data + patch review_path(review.id), params: review_data must_respond_with :redirect - must_redirect_to review_path(rev) + must_redirect_to review_path(review) + + Review.find(review.id).rating.must_equal 3 + end + + it "will return not found, if review doesn't exist" do + bad_id = Review.last.id + 1 + review_data = { + review:{ + rating: 3, + description: "It is a good product " + } + } + patch review_path(bad_id), params: review_data + must_respond_with :not_found + end + + it "will not let you invalidate review" do + review_data = { + review: { + rating: 'shdfgsjh', + product: mermaid_fin.attributes + } + } + + patch review_path(review.id), params: review_data + + must_respond_with :bad_request + end + end + + describe "destroy" do + it "will successfully destroy review" do + start_review_count = Review.count - Review.find(rev.id).rating.must_equal rev.rating + 1 + delete review_path(review) + + must_redirect_to product_path(mermaid_fin) + Review.count.must_equal start_review_count - 1 + end + + it "will not delete review if merchant owns the product" do + login_test_user + start_review_count = Review.count + delete review_path(review) + + must_redirect_to product_path(mermaid_fin.id) + Review.count.must_equal start_review_count end - # - # it "will return not found, if review doesn't exist" do - # bad_id = Review.last.id + 1 - # review_data = { - # review:{ - # rating: 3, - # description: "It is a good product " - # } - # } - # patch review_path(bad_id), params: review_data - # must_respond_with :not_found - # end - # - # it "will not let you invalidate work item" do - # w = Work.first - # work_data = { - # id: w.id, - # work: { - # title: "" # Clearing the title - # } - # } - # - # patch work_path(w), params: work_data - # - # must_respond_with :bad_request - # - # Work.find(w.id).title.must_equal w.title - # end end end From c3f6a023d4d2224ff78e7b91fafa9c1a9c5fc93e Mon Sep 17 00:00:00 2001 From: Roxanne Date: Sun, 22 Oct 2017 13:04:52 -0700 Subject: [PATCH 136/348] All tests working for Merchant Controller --- test/controllers/merchants_controller_test.rb | 87 +++++++------------ 1 file changed, 30 insertions(+), 57 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 4e53dd0f31..b9d29e46b3 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -35,63 +35,36 @@ Merchant.count.must_equal start_count + 1 end - # it "adds order to the database and redirects when the data is valid" do - # order = { - # order: { - # cust_name: "Mermaid", - # merchant_id: 21, - # cust_cc: 12345, - # cust_cc_exp: "11/22", - # cust_addr: "Sea World", - # cust_email: "forkhair@mermaid.com", - # status: "complete" - # } - # } - # Order.new(order[:order]).must_be :valid? - # start_count = Order.count - # - # post orders_path, params: order - # - # must_respond_with :redirect - # must_redirect_to orders_path - # Order.count.must_equal start_count + 1 - # end - # - # it "re-renders form when the order data is invalid" do - # order = { - # order: { - # cust_name: "Mermaid", - # merchant_id: 21, - # cust_cc: 12345, - # cust_cc_exp: "11/22", - # cust_addr: "Sea World", - # cust_email: "forkhair@mermaid.com", - # status: "" - # } - # } - # Order.new(order[:order]).wont_be :valid? - # start_count = Order.count - # - # post orders_path, params: order - # - # must_respond_with :bad_request - # Order.count.must_equal start_count - # end - # end - # - # # - # describe "edit" do - # it "succeeds for an extant merchant ID" do - # get edit_merchant_path(Merchant.first) - # must_respond_with :success - # end - # - # it "renders 404 not_found for a bogus merchant ID" do - # bogus_merchant_id = Merchant.last.id + 1 - # # binding.pry - # get edit_merchant_path(bogus_merchant_id) - # must_respond_with :not_found - # end + + it "re-renders form when the merchant data is invalid" do + merchant = { + merchant: { + oauth_provider: "github", + oauth_uid: "", + email: "somebodyelse@somesite.com", + username: "Somebody_else" + } + } + Merchant.new(merchant[:merchant]).wont_be :valid? + start_count = Merchant.count + + post merchants_path, params: merchant + + must_respond_with :bad_request + Merchant.count.must_equal start_count + end + end + + describe "edit" do + it "succeeds for an extant merchant ID" do + get edit_merchant_path(Merchant.first) + must_respond_with :success + end + it "renders 404 not_found for a bogus merchant ID" do + bogus_merchant_id = Merchant.last.id + 1 + get edit_merchant_path(bogus_merchant_id) + must_respond_with :not_found + end end describe "update" do From a24cd545f16d57bbf341990da4802dd5a396c1d4 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Sun, 22 Oct 2017 13:20:00 -0700 Subject: [PATCH 137/348] added simplecov gem --- .gitignore | 1 + Gemfile | 2 +- Gemfile.lock | 8 ++++++++ bin/rails | 6 ++++++ test/test_helper.rb | 2 ++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fd7861badf..b36cdf4968 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ .byebug_history .env +coverage diff --git a/Gemfile b/Gemfile index 2f318fea7b..0173e06114 100644 --- a/Gemfile +++ b/Gemfile @@ -17,7 +17,7 @@ gem 'sass-rails', '~> 5.0' gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby - +gem 'simplecov', :require => false, :group => :test # Use CoffeeScript for .coffee assets and views # gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks diff --git a/Gemfile.lock b/Gemfile.lock index 030babfd88..4d79ccae03 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -68,6 +68,7 @@ GEM concurrent-ruby (1.0.5) crass (1.0.2) debug_inspector (0.0.3) + docile (1.1.5) dotenv (2.2.1) dotenv-rails (2.2.1) dotenv (= 2.2.1) @@ -92,6 +93,7 @@ GEM jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks + json (2.0.2) jwt (1.5.6) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) @@ -189,6 +191,11 @@ GEM selenium-webdriver (3.6.0) childprocess (~> 0.5) rubyzip (~> 1.0) + simplecov (0.15.0) + docile (~> 1.1.0) + json (>= 1.8, < 3) + simplecov-html (~> 0.10.0) + simplecov-html (0.10.2) spring (2.0.2) activesupport (>= 4.2) spring-watcher-listen (2.0.1) @@ -249,6 +256,7 @@ DEPENDENCIES rails (~> 5.1.4) sass-rails (~> 5.0) selenium-webdriver + simplecov spring spring-watcher-listen (~> 2.0.0) turbolinks (~> 5) diff --git a/bin/rails b/bin/rails index 5badb2fde0..fb5757471e 100755 --- a/bin/rails +++ b/bin/rails @@ -7,3 +7,9 @@ end APP_PATH = File.expand_path('../config/application', __dir__) require_relative '../config/boot' require 'rails/commands' + +if ENV['RAILS_ENV'] == 'test' + require 'simplecov' + SimpleCov.start 'rails' + puts "required simplecov" +end diff --git a/test/test_helper.rb b/test/test_helper.rb index a122f05dbc..9501205d4c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,3 +1,5 @@ +require 'simplecov' +SimpleCov.start ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) require "rails/test_help" From 5a9a50317de3eb5191fc46e7c18b98fb6e0acad0 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 13:31:40 -0700 Subject: [PATCH 138/348] categories form passes through category ids --- app/controllers/products_controller.rb | 3 +-- app/views/products/categories.html.erb | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 40cb002bbd..469c0f24f2 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -87,8 +87,7 @@ def categories def add_categories params[:id] = params[:product_id] find_product_by_params - puts params - puts "controller" + return redirect_to product_path(@product.id) end diff --git a/app/views/products/categories.html.erb b/app/views/products/categories.html.erb index 37dd290b47..7ddffa5a18 100644 --- a/app/views/products/categories.html.erb +++ b/app/views/products/categories.html.erb @@ -20,7 +20,7 @@ <%= form_tag('/products/:id/categories') do %> <% @categories.each do |category| %> <% unless @product.categories.include? category %> - <%= check_box_tag category.name, category.id %> + <%= check_box_tag ("category_#{category.name}"), category.id %> <%= label_tag category.name %> <%= hidden_field_tag :product_id, @product.id %> From 3c686e72e1dc67ccbab5060be751843c1cbac7e4 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 13:43:07 -0700 Subject: [PATCH 139/348] add model functionality to add categories page --- app/controllers/products_controller.rb | 2 ++ app/models/product.rb | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 469c0f24f2..c8b51d9608 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -88,6 +88,8 @@ def add_categories params[:id] = params[:product_id] find_product_by_params + result = @product.add_categories_by_params(params) + return redirect_to product_path(@product.id) end diff --git a/app/models/product.rb b/app/models/product.rb index 600617697e..824a9b41b9 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -19,4 +19,15 @@ def show_data puts "controller" end + def add_categories_by_params(params) + new_categories = params.keep_if{|key, value| key.include?'category'} + + new_categories.values.each do |cat| + category = Category.find(cat) + self.categories << category + end + + return self.save + end + end From f9fa2096b017ca67eac1af64f3de1be416a1b01f Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 13:44:07 -0700 Subject: [PATCH 140/348] confirm ownership for adding categories --- app/controllers/products_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index c8b51d9608..02b9cd9a50 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -87,6 +87,7 @@ def categories def add_categories params[:id] = params[:product_id] find_product_by_params + confirm_ownership result = @product.add_categories_by_params(params) From 3acaabdd6c6387c4f85927ab8e36e679f4a12410 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 13:59:14 -0700 Subject: [PATCH 141/348] display categories on product#show page --- app/assets/stylesheets/products.scss | 33 ++++++++++++++++++++++++++++ app/views/products/show.html.erb | 9 ++++++++ 2 files changed, 42 insertions(+) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index cf1cdcc3c0..b9bf412ec8 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -103,3 +103,36 @@ section.product-info { .show-product { height: 20rem; } + + +////////////////////// +// CATEGORIES LIST: // +////////////////////// + +.prod-cats { + list-style: none; +} + +.prod-cats ul { + margin-bottom: 0; + margin-left: 0; +} + +.prod-cats li { + background-color: white; + border: 2px solid #9FA2B2; + border-radius: 2rem; +} + +.prod-cats a { + color: #9FA2B2; +} + +.prod-cats li:hover { + background-color: white; + border-color: #DBC2CF; +} + +.prod-cats li:hover a { + color: #DBC2CF; +} diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e4dd7e3a4d..a4b20dbae6 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -26,6 +26,15 @@ <%= @product.description %>

+
+
    + <% @product.categories.each do |category| %> +
  • + <%= link_to category.name.capitalize, category_products_path(category.id) %> +
  • + <% end %> +
+

Average Review: <%= @product.reviews.average(:rating) %>

From c93a2c34bad050f618ac1ab35e99fe019883a4b3 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 14:10:29 -0700 Subject: [PATCH 142/348] formatting fix on product#show --- app/views/products/show.html.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index a4b20dbae6..b70b2a7cab 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -3,11 +3,11 @@
-
-
+ +
-
-
+ +

<%= @product.name %>

From seller <%= link_to @product.merchant.username, merchant_path(@product.merchant_id) %> From 368086b76ad9250a38e6e57a2d55822548c3031e Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 14:19:11 -0700 Subject: [PATCH 143/348] add 'add categories' button for page owner --- app/assets/stylesheets/products.scss | 17 +++++++++++++++-- app/views/products/show.html.erb | 5 +++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index b9bf412ec8..dc01d70505 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -122,17 +122,30 @@ section.product-info { background-color: white; border: 2px solid #9FA2B2; border-radius: 2rem; + color: #9FA2B2; } .prod-cats a { - color: #9FA2B2; + color: inherit; } .prod-cats li:hover { background-color: white; border-color: #DBC2CF; + color: #DBC2CF; } .prod-cats li:hover a { - color: #DBC2CF; + color: inherit; +} + +.prod-cats .add-categories { + background-color: #DBC2CF; + color: white; +} + +.prod-cats .add-categories:hover { + background-color: #4F3640; + border-color: #9FA2B2; + color: white; } diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index b70b2a7cab..9465a7b624 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -33,6 +33,11 @@ <%= link_to category.name.capitalize, category_products_path(category.id) %> <% end %> + <% if @own_product %> +

  • + <%= link_to "Add Categories", add_categories_path(@product.id) %> +
  • + <% end %>
    From 211a8e5cc4c6e04f57ceb3b19ed7146fffd4c22c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 14:55:42 -0700 Subject: [PATCH 144/348] add model tests for products --- app/controllers/products_controller.rb | 2 +- app/models/product.rb | 10 +---- test/fixtures/categories.yml | 8 ++-- test/models/product_test.rb | 60 ++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 13 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 02b9cd9a50..0c572573fe 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -13,7 +13,7 @@ def index @products = Product.all.find_all { |prod| prod.categories.include? cat } @title = cat.name.capitalize else - @products = Product.all.sort_by { |prod| -prod.orders.count }[0...6] + @products = Product.most_popular @title = "Popular Now" end @categories = Category.all diff --git a/app/models/product.rb b/app/models/product.rb index 824a9b41b9..ed03e58480 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -10,13 +10,7 @@ class Product < ApplicationRecord validates :quantity, presence: true, numericality: {greater_than_or_equal_to: 0} def self.most_popular - Product.all.sort_by{|p| -p.orders.count}[0...3] - end - - - def show_data - puts params - puts "controller" + @products = Product.all.sort_by { |prod| -prod.orders.count }[0...6] end def add_categories_by_params(params) @@ -24,7 +18,7 @@ def add_categories_by_params(params) new_categories.values.each do |cat| category = Category.find(cat) - self.categories << category + self.categories << category unless self.categories.include? category end return self.save diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index 56066c68af..deee5548f9 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -1,7 +1,7 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString +magic: + name: Magic Items -two: - name: MyString +food: + name: Food diff --git a/test/models/product_test.rb b/test/models/product_test.rb index 2114a17238..c0c617f0f6 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -97,4 +97,64 @@ product.merchant.must_be_kind_of Merchant end end + + describe 'most_popular' do + it 'returns an array of 6 products if database contains at least 6 products' do + 1..6.times do |i| + Product.create!(name: i, price: i+1, quantity: i, merchant_id: Merchant.first.id) + end + prods = Product.most_popular + + prods.length.must_equal 6 + end + + it 'returns a shorter array of products if database less than 6 products' do + if Product.count >= 6 + i = Product.count + until i < 6 + Product.last.destroy + end + end + prods = Product.most_popular + + prods.length.must_equal Product.count + end + + it 'orders array by number of orders for product' do + prods = Product.most_popular + prods.each_cons(2) do |pair| + (pair[0].orders.count >= pair[1].orders.count).must_equal true + end + end + + it 'returns an empty array if database contains no products' do + Product.destroy_all + + Product.most_popular.must_equal [] + end + end + + describe 'add_categories_by_params' do + it 'adds provided categories to product' do + test_categories = [Category.first, Category.last] + test_params = { 'category_test_0' => test_categories[0].id, + 'category_test_1' => test_categories[1].id } + + product.add_categories_by_params(test_params) + + product.categories.must_include test_categories[0] + product.categories.must_include test_categories[1] + end + + it 'wont duplicate categories within product' do + test_category = Category.first + test_params = { 'category_test' => test_category.id } + + count = product.categories.count + + test_params = { 'category_test' => test_category.id } + + product.categories.count.must_equal count + end + end end From 7f461b8da4ff8ca3afd15d352633477ccbc033ef Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 15:11:41 -0700 Subject: [PATCH 145/348] controller edge tests for #index, #show --- app/controllers/products_controller.rb | 16 ++++---- test/controllers/products_controller_test.rb | 40 +++++++++++++++++--- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0c572573fe..50ee8fb9c3 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -9,9 +9,13 @@ class ProductsController < ApplicationController def index if params[:category_id] - cat = Category.find(params[:category_id]) - @products = Product.all.find_all { |prod| prod.categories.include? cat } - @title = cat.name.capitalize + cat = Category.find_by(id: params[:category_id]) + if cat + @products = Product.all.find_all { |prod| prod.categories.include? cat } + @title = cat.name.capitalize + else + return head :not_found + end else @products = Product.most_popular @title = "Popular Now" @@ -80,10 +84,6 @@ def destroy end end - def categories - @categories = Category.all.sort_by{|c| c.name} - end - def add_categories params[:id] = params[:product_id] find_product_by_params @@ -97,7 +97,7 @@ def add_categories private def find_product_by_params - @product = Product.find(params[:id]) + @product = Product.find_by(id: params[:id]) unless @product return head :not_found diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index a6adf8b68a..6a07710048 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -18,16 +18,38 @@ get login_path(:github) end - it 'can successfully access index of products' do - get products_path + describe 'index' do + it 'can successfully access index of products' do + get products_path - must_respond_with :success + must_respond_with :success + end + + it 'can successfully access nested index of products with valid id' do + get products_path(Category.first.id) + + must_respond_with :success + end + + it 'returns 404 for invalid category ID in nested route' do + get products_path, params: { 'category_id' => (Category.last.id + 1) } + + must_respond_with :not_found + end end - it 'can successfully access show product' do - get product_path(prod.id) + describe 'show' do + it 'can successfully access show product with valid ID' do + get product_path(prod.id) - must_respond_with :success + must_respond_with :success + end + + it 'returns 404 with invalid ID' do + get product_path( Product.last.id + 1 ) + + must_respond_with :not_found + end end it 'can successfully access new product' do @@ -128,6 +150,12 @@ Product.count.must_equal @before_count end end + + it 'can successfully categories' do + get product_path(prod.id) + + must_respond_with :success + end end describe 'for guest users' do From f8ff2285a4678d1a8e507c520505df1737ec6b7a Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 15:15:09 -0700 Subject: [PATCH 146/348] guest edge testing --- test/controllers/products_controller_test.rb | 34 ++++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 6a07710048..8e14432275 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -159,16 +159,38 @@ end describe 'for guest users' do - it 'can successfully access index of products' do - get products_path + describe 'index' do + it 'can successfully access index of products' do + get products_path - must_respond_with :success + must_respond_with :success + end + + it 'can successfully access nested index of products with valid id' do + get products_path(Category.first.id) + + must_respond_with :success + end + + it 'returns 404 for invalid category ID in nested route' do + get products_path, params: { 'category_id' => (Category.last.id + 1) } + + must_respond_with :not_found + end end - it 'can successfully access show product' do - get product_path(prod.id) + describe 'show' do + it 'can successfully access show product with valid ID' do + get product_path(prod.id) - must_respond_with :success + must_respond_with :success + end + + it 'returns 404 with invalid ID' do + get product_path( Product.last.id + 1 ) + + must_respond_with :not_found + end end it 'CANNOT access new product' do From 5b8890ac62c00b2393104a21cf43501a9759200c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Sun, 22 Oct 2017 15:38:56 -0700 Subject: [PATCH 147/348] tentative controller tests for adding categories --- app/controllers/categories_controller.rb | 2 + app/controllers/products_controller.rb | 6 +- test/controllers/products_controller_test.rb | 58 ++++++++++++++++++-- 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 2e5d9dda92..04f5405f21 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,4 +1,6 @@ class CategoriesController < ApplicationController + before_action :confirm_login + def create category = Category.new(name: params[:category_name]) result = category.save diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 50ee8fb9c3..7e3f1f313e 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -4,7 +4,7 @@ class ProductsController < ApplicationController before_action :confirm_login, except: [:index, :show] - before_action :confirm_ownership, only: [:edit, :update, :destroy] + before_action :confirm_ownership, only: [:edit, :update, :destroy, :categories] def index @@ -84,6 +84,10 @@ def destroy end end + def categories + @categories = Category.all + end + def add_categories params[:id] = params[:product_id] find_product_by_params diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 8e14432275..7846dbd428 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -88,14 +88,14 @@ describe 'edit' do # these tests will have to change when logging in actually works (dependent on fakey_login) it 'can successfully access edit for own product' do - owned_product = Product.find_by(merchant_id: Merchant.first.id) + owned_product = Product.find_by(merchant_id: merchants(:ada).id) get edit_product_path(owned_product.id) must_respond_with :success end it 'CANNOT successfully edit other users products' do - not_owned_product = Product.find_by(merchant_id: Merchant.last.id) + not_owned_product = Product.find_by(merchant_id: merchants(:grace).id) get edit_product_path(not_owned_product.id) must_respond_with :found @@ -151,10 +151,52 @@ end end - it 'can successfully categories' do - get product_path(prod.id) + describe 'categories' do + it 'can access page for own products' do + owned_product = Product.find_by(merchant_id: merchants(:ada).id) - must_respond_with :success + get add_categories_path(owned_product.id) + + must_respond_with :success + end + + it 'CANNOT access page for other users products' do + not_owned_product = Product.find_by(merchant_id: merchants(:grace).id) + + get add_categories_path(not_owned_product.id) + + must_respond_with :found + flash[:status].must_equal :failure + end + end + + describe 'add_categories' do + it 'can successfully add categories to own products' do + skip + owned_product = Product.find_by(merchant_id: merchants(:ada).id) + test_params = { "product_id"=>"2", + "category_Magic Items"=>"5", + id: :id + } + + post "/products/:id/categories", params: test_params + + must_respond_with :success + end + + it 'CANNOT successfully add categories to other users products' do + skip + not_owned_product = Product.find_by(merchant_id: merchants(:grace).id) + test_params = { "product_id"=>"2", + "category_Magic Items"=>"5", + id: :id + } + + post add_categories_path, params: test_params + + must_respond_with :found + flash[:status].must_equal :failure + end end end @@ -227,5 +269,11 @@ flash[:status].must_equal :failure must_respond_with :found end + + describe 'add_categories' do + it 'CANNOT access add categories page' do + + end + end end end From 9b3d04839448f452e4617367f6b3248cf99194be Mon Sep 17 00:00:00 2001 From: sairagula Date: Sun, 22 Oct 2017 16:38:23 -0700 Subject: [PATCH 148/348] Added index and show for controller review and added corresponding tests --- app/controllers/reviews_controller.rb | 8 ++++++- test/controllers/reviews_controller_test.rb | 25 +++++++++++++++++++++ test/fixtures/reviews.yml | 10 +++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index d1e233545f..cbebc91ace 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,8 +1,14 @@ class ReviewsController < ApplicationController - before_action :find_review_by_params_id, only: [:edit, :update, :destroy] + before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] before_action :check_for_product_owner_nested, only: [:create, :new] before_action :check_for_product_owner, only: [:edit, :update, :destroy] + def index + @reviews = Review.where(product_id: params[:product_id]) + end + + def show ; end + def new @review = Review.new end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index f832cb7af3..d4856a34c4 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -10,6 +10,31 @@ def login_test_user get login_path(:github) end + describe "index" do + it "returns success status for all reviews" do + get product_reviews_path(mermaid_fin) + must_respond_with :success + end + + it "works when there are no reviews" do + Review.destroy_all + get product_reviews_path(mermaid_fin) + must_respond_with :success + end + end + + describe "show" do + it "succeeds for a review that exists" do + get review_path(reviews(:review)) + must_respond_with :success + end + + it "returns 404 not_found for a review that does not exist" do + get review_path(123) + must_respond_with :not_found + end + end + describe "new" do it " should work for anon user" do get new_product_review_path(mermaid_fin) diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index a0ffa82ab1..2da233da94 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -8,3 +8,13 @@ review: rating: 4 merchant: ada product: mermaid_fin + +review2: + rating: 3 + merchant: ada + product: mermaid_fin + +review3: + rating: 4 + merchant: grace + product: wand From 71a78732c1fbbb712f36b9ffcbd3c587ec18d038 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Sun, 22 Oct 2017 17:15:23 -0700 Subject: [PATCH 149/348] added tests for merchant by_auth_hash method in model --- app/models/merchant.rb | 4 +- coverage/.last_run.json | 5 + coverage/.resultset.json | 561 +++ coverage/.resultset.json.lock | 0 coverage/assets/0.10.2/application.css | 799 +++ coverage/assets/0.10.2/application.js | 1707 +++++++ coverage/assets/0.10.2/colorbox/border.png | Bin 0 -> 163 bytes coverage/assets/0.10.2/colorbox/controls.png | Bin 0 -> 2033 bytes coverage/assets/0.10.2/colorbox/loading.gif | Bin 0 -> 9427 bytes .../0.10.2/colorbox/loading_background.png | Bin 0 -> 166 bytes coverage/assets/0.10.2/favicon_green.png | Bin 0 -> 1009 bytes coverage/assets/0.10.2/favicon_red.png | Bin 0 -> 1009 bytes coverage/assets/0.10.2/favicon_yellow.png | Bin 0 -> 1009 bytes coverage/assets/0.10.2/loading.gif | Bin 0 -> 7247 bytes coverage/assets/0.10.2/magnify.png | Bin 0 -> 1301 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes coverage/index.html | 4330 +++++++++++++++++ test/models/merchant_test.rb | 48 +- 30 files changed, 7450 insertions(+), 4 deletions(-) create mode 100644 coverage/.last_run.json create mode 100644 coverage/.resultset.json create mode 100644 coverage/.resultset.json.lock create mode 100644 coverage/assets/0.10.2/application.css create mode 100644 coverage/assets/0.10.2/application.js create mode 100644 coverage/assets/0.10.2/colorbox/border.png create mode 100644 coverage/assets/0.10.2/colorbox/controls.png create mode 100644 coverage/assets/0.10.2/colorbox/loading.gif create mode 100644 coverage/assets/0.10.2/colorbox/loading_background.png create mode 100644 coverage/assets/0.10.2/favicon_green.png create mode 100644 coverage/assets/0.10.2/favicon_red.png create mode 100644 coverage/assets/0.10.2/favicon_yellow.png create mode 100644 coverage/assets/0.10.2/loading.gif create mode 100644 coverage/assets/0.10.2/magnify.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_222222_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_454545_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_888888_256x240.png create mode 100644 coverage/assets/0.10.2/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 coverage/index.html diff --git a/app/models/merchant.rb b/app/models/merchant.rb index c6b225d2cf..a9559069cb 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -13,11 +13,11 @@ class Merchant < ApplicationRecord def self.by_auth_hash(auth_hash) merchant = Merchant.new - merchant.oauth_provider = auth_hash['provider'] + merchant.oauth_provider = auth_hash['provider'] merchant.oauth_uid = auth_hash['uid'] merchant.email = auth_hash['info']['email'] merchant.username = auth_hash['info']['nickname'] - merchant + merchant end end diff --git a/coverage/.last_run.json b/coverage/.last_run.json new file mode 100644 index 0000000000..8c4a8aeabb --- /dev/null +++ b/coverage/.last_run.json @@ -0,0 +1,5 @@ +{ + "result": { + "covered_percent": 81.34 + } +} diff --git a/coverage/.resultset.json b/coverage/.resultset.json new file mode 100644 index 0000000000..9bc11d714a --- /dev/null +++ b/coverage/.resultset.json @@ -0,0 +1,561 @@ +{ + "MiniTest": { + "coverage": { + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/application_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/main_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/merchants_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/order_products_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/orders_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/products_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/reviews_helper.rb": [ + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/main_controller.rb": [ + 1, + null, + 1, + 1, + 1, + null, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/application_controller.rb": [ + 1, + 1, + null, + 1, + 0, + null, + null, + 1, + null, + 1, + 16, + 5, + 5, + 5, + null, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/merchants_controller.rb": [ + 1, + 1, + 13, + 13, + null, + 13, + 13, + 13, + null, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + null, + null, + 13, + 13, + null, + null, + 1, + 0, + 0, + null, + null, + null, + 1, + 0, + null, + null, + 1, + 2, + null, + 2, + null, + 1, + 1, + 1, + null, + null, + 1, + 1, + 1, + 1, + null, + null, + null, + null, + null, + null, + null, + 1, + 2, + 2, + null, + null, + 1, + 3, + 2, + null, + 2, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + null, + 1, + null, + null, + null, + null, + null, + 1, + 2, + 2, + null, + null, + 1, + 0, + 0, + null, + null, + null, + 1, + null, + 1, + 4, + null, + null, + 1, + 3, + 3, + 1, + null, + 3, + null, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/order_products_controller.rb": [ + 1, + 1, + 1, + 0, + null, + null, + null, + 1, + 2, + 1, + 1, + 1, + null, + null, + 0, + null, + null, + null, + null, + null, + 1, + 2, + 2, + 2, + 2, + 0, + null, + null, + null, + 1, + null, + 1, + 1, + null, + null, + 1, + 4, + 4, + 1, + null, + 4, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/orders_controller.rb": [ + 1, + 1, + 0, + null, + null, + 1, + 1, + null, + null, + 1, + 1, + 1, + 0, + 0, + 0, + null, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 2, + null, + null, + 1, + 0, + null, + null, + 1, + 2, + 1, + 1, + 1, + null, + null, + 0, + null, + null, + null, + null, + null, + 1, + 2, + 2, + 2, + 2, + 0, + null, + null, + null, + 1, + null, + 1, + 2, + null, + null, + 1, + 6, + 6, + 2, + null, + 6, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/products_controller.rb": [ + 1, + null, + 1, + null, + 1, + null, + 1, + null, + null, + 1, + 2, + 2, + null, + null, + 1, + null, + null, + 1, + 1, + null, + null, + 1, + 3, + 3, + null, + 3, + null, + 3, + 2, + 2, + 2, + null, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + null, + null, + 1, + 2, + null, + 2, + 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, + null, + null, + null, + 1, + 1, + null, + 1, + 1, + 1, + 1, + null, + 0, + 0, + 0, + 0, + null, + null, + null, + 1, + null, + 1, + 12, + null, + 12, + 0, + null, + null, + null, + 1, + 7, + 3, + 3, + 3, + null, + null, + null, + 1, + 5, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/reviews_controller.rb": [ + 1, + 1, + null, + 1, + 1, + null, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + 1, + 0, + 0, + 0, + null, + 1, + 1, + null, + 1, + null, + null, + null, + null, + 1, + null, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + 1, + null, + null, + null, + null, + null, + null, + 1, + null, + 1, + 1, + null, + null, + 1, + 2, + 2, + 1, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/category.rb": [ + 1, + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/application_record.rb": [ + 1, + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/merchant.rb": [ + 1, + 1, + 1, + 1, + 1, + null, + 1, + 1, + 1, + 1, + 1, + null, + 1, + 0, + null, + 0, + 0, + 0, + 0, + null, + 0, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/order_product.rb": [ + 1, + 1, + 1, + null, + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/order.rb": [ + 1, + 1, + 1, + 1, + null, + 1, + 1, + 1, + null, + 1, + 24, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/product.rb": [ + 1, + 1, + 1, + 1, + 1, + 1, + null, + 1, + 1, + 1, + null, + 1, + 0, + null, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/review.rb": [ + 1, + 1, + 1, + null, + 1, + null + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/channels/application_cable/channel.rb": [ + 0, + 0, + 0, + 0 + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/channels/application_cable/connection.rb": [ + 0, + 0, + 0, + 0 + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/jobs/application_job.rb": [ + 0, + 0 + ], + "/Users/roxanneagerone/Ada/week_10/betsy/app/mailers/application_mailer.rb": [ + 0, + 0, + 0, + 0 + ] + }, + "timestamp": 1508709257 + } +} diff --git a/coverage/.resultset.json.lock b/coverage/.resultset.json.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/coverage/assets/0.10.2/application.css b/coverage/assets/0.10.2/application.css new file mode 100644 index 0000000000..d86560434d --- /dev/null +++ b/coverage/assets/0.10.2/application.css @@ -0,0 +1,799 @@ +/* ----------------------------------------------------------------------- + + + Blueprint CSS Framework 0.9 + http://blueprintcss.org + + * Copyright (c) 2007-Present. See LICENSE for more info. + * See README for instructions on how to use Blueprint. + * For credits and origins, see AUTHORS. + * This is a compressed file. See the sources in the 'src' directory. + +----------------------------------------------------------------------- */ + +/* reset.css */ + +html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;} +article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;} +body {line-height:1.5;} +table {border-collapse:separate;border-spacing:0;} +caption, th, td {text-align:left;font-weight:normal;} +table, td, th {vertical-align:middle;} +blockquote:before, blockquote:after, q:before, q:after {content:"";} +blockquote, q {quotes:"" "";} +a img {border:none;} + +/* typography.css */ +html {font-size:100.01%;} +body {font-size:82%;color:#222;background:#fff;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;} +h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;} +h1 {font-size:3em;line-height:1;margin-bottom:0.5em;} +h2 {font-size:2em;margin-bottom:0.75em;} +h3 {font-size:1.5em;line-height:1;margin-bottom:1em;} +h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;} +h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;} +h6 {font-size:1em;font-weight:bold;} +h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;} +p {margin:0 0 1.5em;} +p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;} +p img.right {float:right;margin:1.5em 0 1.5em 1.5em;} +a:focus, a:hover {color:#000;} +a {color:#009;text-decoration:underline;} +blockquote {margin:1.5em;color:#666;font-style:italic;} +strong {font-weight:bold;} +em, dfn {font-style:italic;} +dfn {font-weight:bold;} +sup, sub {line-height:0;} +abbr, acronym {border-bottom:1px dotted #666;} +address {margin:0 0 1.5em;font-style:italic;} +del {color:#666;} +pre {margin:1.5em 0;white-space:pre;} +pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;} +li ul, li ol {margin:0;} +ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;} +ul {list-style-type:disc;} +ol {list-style-type:decimal;} +dl {margin:0 0 1.5em 0;} +dl dt {font-weight:bold;} +dd {margin-left:1.5em;} +table {margin-bottom:1.4em;width:100%;} +th {font-weight:bold;} +thead th {background:#c3d9ff;} +th, td, caption {padding:4px 10px 4px 5px;} +tr.even td {background:#efefef;} +tfoot {font-style:italic;} +caption {background:#eee;} +.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;} +.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;} +.hide {display:none;} +.quiet {color:#666;} +.loud {color:#000;} +.highlight {background:#ff0;} +.added {background:#060;color:#fff;} +.removed {background:#900;color:#fff;} +.first {margin-left:0;padding-left:0;} +.last {margin-right:0;padding-right:0;} +.top {margin-top:0;padding-top:0;} +.bottom {margin-bottom:0;padding-bottom:0;} + +/* forms.css */ +label {font-weight:bold;} +fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;} +legend {font-weight:bold;font-size:1.2em;} +input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;} +input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;} +input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;} +input.text, input.title {width:300px;padding:5px;} +input.title {font-size:1.5em;} +textarea {width:390px;height:250px;padding:5px;} +input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;} +form.inline {line-height:3;} +form.inline p {margin-bottom:0;} +.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;} +.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;} +.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;} +.success {background:#E6EFC2;color:#264409;border-color:#C6D880;} +.error a {color:#8a1f11;} +.notice a {color:#514721;} +.success a {color:#264409;} +.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;} +hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;} +hr.space {background:#fff;color:#fff;visibility:hidden;} +.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;} +.clearfix, .container {display:block;} +.clear {clear:both;} +/* +github.com style (c) Vasily Polovnyov +*/ + + +pre code { +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #998; + font-style: italic +} + +pre .keyword, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .lisp .title { + color: #000; + font-weight: bold +} + +pre .number, +pre .hexcolor { + color: #458 +} + + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #d14 +} + +pre .subst { + color: #712; +} + +pre .constant, +pre .title, +pre .id { + color: #900; + font-weight: bold +} + +pre .javascript .title, +pre .lisp .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .label, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .instancevar, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #009926 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .ruby .symbol .keyword, +pre .ruby .symbol .keymethods, +pre .lisp .keyword, +pre .tex .special, +pre .input_number { + color: #990073 +} + +pre .builtin, +pre .built_in, +pre .lisp .title { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} + +pre .tex .formula { + opacity: 0.5; +} +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ + +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } +.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } +/* + ColorBox Core Style: + The following CSS is consistent between example themes and should not be altered. +*/ +#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;} +#cboxOverlay{position:fixed; width:100%; height:100%;} +#cboxMiddleLeft, #cboxBottomLeft{clear:left;} +#cboxContent{position:relative;} +#cboxLoadedContent{overflow:auto;} +#cboxTitle{margin:0;} +#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;} +#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;} +.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;} +.cboxIframe{width:100%; height:100%; display:block; border:0;} +#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box;} + +/* + User Style: + Change the following styles to modify the appearance of ColorBox. They are + ordered & tabbed in a way that represents the nesting of the generated HTML. +*/ +#cboxOverlay{background:#000;} +#colorbox{} + #cboxTopLeft{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat 0 0;} + #cboxTopCenter{height:14px; background:url(colorbox/border.png) repeat-x top left;} + #cboxTopRight{width:14px; height:14px; background:url(colorbox/controls.png) no-repeat -36px 0;} + #cboxBottomLeft{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat 0 -32px;} + #cboxBottomCenter{height:43px; background:url(colorbox/border.png) repeat-x bottom left;} + #cboxBottomRight{width:14px; height:43px; background:url(colorbox/controls.png) no-repeat -36px -32px;} + #cboxMiddleLeft{width:14px; background:url(colorbox/controls.png) repeat-y -175px 0;} + #cboxMiddleRight{width:14px; background:url(colorbox/controls.png) repeat-y -211px 0;} + #cboxContent{background:#fff; overflow:visible;} + .cboxIframe{background:#fff;} + #cboxError{padding:50px; border:1px solid #ccc;} + #cboxLoadedContent{margin-bottom:5px;} + #cboxLoadingOverlay{background:url(colorbox/loading_background.png) no-repeat center center;} + #cboxLoadingGraphic{background:url(colorbox/loading.gif) no-repeat center center;} + #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;} + #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;} + + #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(colorbox/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;} + #cboxPrevious{left:0px; background-position: -51px -25px;} + #cboxPrevious:hover{background-position:-51px 0px;} + #cboxNext{left:27px; background-position:-75px -25px;} + #cboxNext:hover{background-position:-75px 0px;} + #cboxClose{right:0; background-position:-100px -25px;} + #cboxClose:hover{background-position:-100px 0px;} + + .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;} + .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;} + .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;} + .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} +#loading { + position: fixed; + left: 40%; + top: 50%; } + +a { + color: #333333; + text-decoration: none; } + a:hover { + color: black; + text-decoration: underline; } + +body { + font-family: "Lucida Grande", Helvetica, "Helvetica Neue", Arial, sans-serif; + padding: 12px; + background-color: #333333; } + +h1, h2, h3, h4 { + color: #1c2324; + margin: 0; + padding: 0; + margin-bottom: 12px; } + +table { + width: 100%; } + +#content { + clear: left; + background-color: white; + border: 2px solid #dddddd; + border-top: 8px solid #dddddd; + padding: 18px; + -webkit-border-bottom-left-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + -moz-border-radius-topright: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top-right-radius: 5px; } + +.dataTables_filter, .dataTables_info { + padding: 2px 6px; } + +abbr.timeago { + text-decoration: none; + border: none; + font-weight: bold; } + +.timestamp { + float: right; + color: #dddddd; } + +.group_tabs { + list-style: none; + float: left; + margin: 0; + padding: 0; } + .group_tabs li { + display: inline; + float: left; } + .group_tabs li a { + font-family: Helvetica, Arial, sans-serif; + display: block; + float: left; + text-decoration: none; + padding: 4px 8px; + background-color: #aaaaaa; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#dddddd), to(#aaaaaa)); + background: -moz-linear-gradient(#dddddd, #aaaaaa); + background: linear-gradient(#dddddd, #aaaaaa); + text-shadow: #e5e5e5 1px 1px 0px; + border-bottom: none; + color: #333333; + font-weight: bold; + margin-right: 8px; + border-top: 1px solid #efefef; + -webkit-border-top-left-radius: 2px; + -webkit-border-top-right-radius: 2px; + -moz-border-radius-topleft: 2px; + -moz-border-radius-topright: 2px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; } + .group_tabs li a:hover { + background-color: #cccccc; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#eeeeee), to(#aaaaaa)); + background: -moz-linear-gradient(#eeeeee, #aaaaaa); + background: linear-gradient(#eeeeee, #aaaaaa); } + .group_tabs li a:active { + padding-top: 5px; + padding-bottom: 3px; } + .group_tabs li.active a { + color: black; + text-shadow: white 1px 1px 0px; + background-color: #dddddd; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(white), to(#dddddd)); + background: -moz-linear-gradient(white, #dddddd); + background: linear-gradient(white, #dddddd); } + +.file_list { + margin-bottom: 18px; } + +a.src_link { + background: url("./magnify.png") no-repeat left 50%; + padding-left: 18px; } + +tr, td { + margin: 0; + padding: 0; } + +th { + white-space: nowrap; } + th.ui-state-default { + cursor: pointer; } + th span.ui-icon { + float: left; } + +td { + padding: 4px 8px; } + td.strong { + font-weight: bold; } + +.source_table h3, .source_table h4 { + padding: 0; + margin: 0; + margin-bottom: 4px; } +.source_table .header { + padding: 10px; } +.source_table pre { + margin: 0; + padding: 0; + white-space: normal; + color: black; + font-family: "Monaco", "Inconsolata", "Consolas", monospace; } +.source_table code { + color: black; + font-family: "Monaco", "Inconsolata", "Consolas", monospace; } +.source_table pre { + background-color: #333333; } + .source_table pre ol { + margin: 0px; + padding: 0px; + margin-left: 45px; + font-size: 12px; + color: white; } + .source_table pre li { + margin: 0px; + padding: 2px 6px; + border-left: 5px solid white; } + .source_table pre li code { + white-space: pre; + white-space: pre-wrap; } + .source_table pre .hits { + float: right; + margin-left: 10px; + padding: 2px 4px; + background-color: #444444; + background: -webkit-gradient(linear, 0 0, 0 bottom, from(#222222), to(#666666)); + background: -moz-linear-gradient(#222222, #666666); + background: linear-gradient(#222222, #666666); + color: white; + font-family: Helvetica, "Helvetica Neue", Arial, sans-serif; + font-size: 10px; + font-weight: bold; + text-align: center; + border-radius: 6px; } + +#footer { + color: #dddddd; + font-size: 12px; + font-weight: bold; + margin-top: 12px; + text-align: right; } + #footer a { + color: #eeeeee; + text-decoration: underline; } + #footer a:hover { + color: white; + text-decoration: none; } + +.green { + color: #009900; } + +.red { + color: #990000; } + +.yellow { + color: #ddaa00; } + +.source_table .covered { + border-color: #009900; } +.source_table .missed { + border-color: #990000; } +.source_table .never { + border-color: black; } +.source_table .skipped { + border-color: #ffcc00; } +.source_table .covered:nth-child(odd) { + background-color: #cdf2cd; } +.source_table .covered:nth-child(even) { + background-color: #dbf2db; } +.source_table .missed:nth-child(odd) { + background-color: #f7c0c0; } +.source_table .missed:nth-child(even) { + background-color: #f7cfcf; } +.source_table .never:nth-child(odd) { + background-color: #efefef; } +.source_table .never:nth-child(even) { + background-color: #f4f4f4; } +.source_table .skipped:nth-child(odd) { + background-color: #fbf0c0; } +.source_table .skipped:nth-child(even) { + background-color: #fbffcf; } + + + diff --git a/coverage/assets/0.10.2/application.js b/coverage/assets/0.10.2/application.js new file mode 100644 index 0000000000..fe65d88219 --- /dev/null +++ b/coverage/assets/0.10.2/application.js @@ -0,0 +1,1707 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ + +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); +var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(/"}while(x.length||y.length){var u=t().splice(0,1)[0];v+=l(w.substr(q,u.offset-q));q=u.offset;if(u.event=="start"){v+=r(u.node);s.push(u.node)}else{if(u.event=="stop"){var p=s.length;do{p--;var o=s[p];v+=("")}while(o!=u.node);s.splice(p,1);while(p'+l(K[0])+""}else{M+=l(K[0])}O=N.lR.lastIndex;K=N.lR.exec(L)}M+=l(L.substr(O,L.length-O));return M}function J(r,L){if(L.sL&&d[L.sL]){var K=f(L.sL,r);s+=K.keyword_count;return K.value}else{return E(r,L)}}function H(L,r){var K=L.cN?'':"";if(L.rB){p+=K;L.buffer=""}else{if(L.eB){p+=l(r)+K;L.buffer=""}else{p+=K;L.buffer=r}}B.push(L);A+=L.r}function D(N,K,P){var Q=B[B.length-1];if(P){p+=J(Q.buffer+N,Q);return false}var L=y(K,Q);if(L){p+=J(Q.buffer+N,Q);H(L,K);return L.rB}var r=v(B.length-1,K);if(r){var M=Q.cN?"":"";if(Q.rE){p+=J(Q.buffer+N,Q)+M}else{if(Q.eE){p+=J(Q.buffer+N,Q)+M+l(K)}else{p+=J(Q.buffer+N+K,Q)+M}}while(r>1){M=B[B.length-2].cN?"":"";p+=M;r--;B.length--}var O=B[B.length-1];B.length--;B[B.length-1].buffer="";if(O.starts){H(O.starts,"")}return Q.rE}if(w(K,Q)){throw"Illegal"}}var G=d[I];var B=[G.dM];var A=0;var s=0;var p="";try{var u=0;G.dM.buffer="";do{var x=q(C,u);var t=D(x[0],x[1],x[2]);u+=x[0].length;if(!t){u+=x[1].length}}while(!x[2]);if(B.length>1){throw"Illegal"}return{language:I,r:A,keyword_count:s,value:p}}catch(F){if(F=="Illegal"){return{language:null,r:0,keyword_count:0,value:l(C)}}else{throw F}}}function h(){function o(t,s,u){if(t.compiled){return}if(!u){t.bR=c(s,t.b?t.b:"\\B|\\b");if(!t.e&&!t.eW){t.e="\\B|\\b"}if(t.e){t.eR=c(s,t.e)}}if(t.i){t.iR=c(s,t.i)}if(t.r==undefined){t.r=1}if(t.k){t.lR=c(s,t.l||hljs.IR,true)}for(var r in t.k){if(!t.k.hasOwnProperty(r)){continue}if(t.k[r] instanceof Object){t.kG=t.k}else{t.kG={keyword:t.k}}break}if(!t.c){t.c=[]}t.compiled=true;for(var q=0;qx.keyword_count+x.r){x=u}if(u.keyword_count+u.r>w.keyword_count+w.r){x=w;w=u}}}var s=t.className;if(!s.match(w.language)){s=s?(s+" "+w.language):w.language}var o=b(t);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=k(o,b(q),A)}if(y){w.value=w.value.replace(/^((<[^>]+>|\t)+)/gm,function(B,E,D,C){return E.replace(/\t/g,y)})}if(p){w.value=w.value.replace(/\n/g,"
    ")}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){var q=t.parentNode;var v=document.createElement("div");v.innerHTML="
    "+w.value+"
    ";t=v.firstChild.firstChild;v.firstChild.cN=q.cN;q.parentNode.replaceChild(v.firstChild,q)}else{t.innerHTML=w.value}t.className=s;t.dataset={};t.dataset.result={language:w.language,kw:w.keyword_count,re:w.r};if(x&&x.language){t.dataset.second_best={language:x.language,kw:x.keyword_count,re:x.r}}}function j(){if(j.called){return}j.called=true;e();var q=document.getElementsByTagName("pre");for(var o=0;o|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.inherit=function(o,r){var q={};for(var p in o){q[p]=o[p]}if(r){for(var p in r){q[p]=r[p]}}return q}}();hljs.LANGUAGES.ruby=function(){var g="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var a="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,yield:1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,"eval":1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1,"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}};var h={cN:"yardoctag",b:"@[A-Za-z]+"};var d={cN:"comment",b:"#",e:"$",c:[h]};var c={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[h],r:10};var b={cN:"comment",b:"^__END__",e:"\\n$"};var u={cN:"subst",b:"#\\{",e:"}",l:g,k:n};var p=[hljs.BE,u];var s={cN:"string",b:"'",e:"'",c:p,r:0};var r={cN:"string",b:'"',e:'"',c:p,r:0};var q={cN:"string",b:"%[qw]?\\(",e:"\\)",c:p,r:10};var o={cN:"string",b:"%[qw]?\\[",e:"\\]",c:p,r:10};var m={cN:"string",b:"%[qw]?{",e:"}",c:p,r:10};var l={cN:"string",b:"%[qw]?<",e:">",c:p,r:10};var k={cN:"string",b:"%[qw]?/",e:"/",c:p,r:10};var j={cN:"string",b:"%[qw]?%",e:"%",c:p,r:10};var i={cN:"string",b:"%[qw]?-",e:"-",c:p,r:10};var t={cN:"string",b:"%[qw]?\\|",e:"\\|",c:p,r:10};var e={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:g,k:n,c:[{cN:"title",b:a,l:g,k:n},{cN:"params",b:"\\(",e:"\\)",l:g,k:n},d,c,b]};var f={cN:"identifier",b:g,l:g,k:n,r:0};var v=[d,c,b,s,r,q,o,m,l,k,j,i,t,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},d,c,b]},e,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[s,r,q,o,m,l,k,j,i,t,f],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},f,{b:"("+hljs.RSR+")\\s*",c:[d,c,b,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];u.c=v;e.c[1].c=v;return{dM:{l:g,k:n,c:v}}}(); +/*! + Colorbox v1.5.13 - 2014-08-04 + jQuery lightbox and modal window plugin + (c) 2014 Jack Moore - http://www.jacklmoore.com/colorbox + license: http://www.opensource.org/licenses/mit-license.php + */ + +(function ($, document, window) { + var + // Default settings object. + // See http://jacklmoore.com/colorbox for details. + defaults = { + // data sources + html: false, + photo: false, + iframe: false, + inline: false, + + // behavior and appearance + transition: "elastic", + speed: 300, + fadeOut: 300, + width: false, + initialWidth: "600", + innerWidth: false, + maxWidth: false, + height: false, + initialHeight: "450", + innerHeight: false, + maxHeight: false, + scalePhotos: true, + scrolling: true, + opacity: 0.9, + preloading: true, + className: false, + overlayClose: true, + escKey: true, + arrowKey: true, + top: false, + bottom: false, + left: false, + right: false, + fixed: false, + data: undefined, + closeButton: true, + fastIframe: true, + open: false, + reposition: true, + loop: true, + slideshow: false, + slideshowAuto: true, + slideshowSpeed: 2500, + slideshowStart: "start slideshow", + slideshowStop: "stop slideshow", + photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, + + // alternate image paths for high-res displays + retinaImage: false, + retinaUrl: false, + retinaSuffix: '@2x.$1', + + // internationalization + current: "image {current} of {total}", + previous: "previous", + next: "next", + close: "close", + xhrError: "This content failed to load.", + imgError: "This image failed to load.", + + // accessbility + returnFocus: true, + trapFocus: true, + + // callbacks + onOpen: false, + onLoad: false, + onComplete: false, + onCleanup: false, + onClosed: false, + + rel: function() { + return this.rel; + }, + href: function() { + // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') + return $(this).attr('href'); + }, + title: function() { + return this.title; + } + }, + + // Abstracting the HTML and event identifiers for easy rebranding + colorbox = 'colorbox', + prefix = 'cbox', + boxElement = prefix + 'Element', + + // Events + event_open = prefix + '_open', + event_load = prefix + '_load', + event_complete = prefix + '_complete', + event_cleanup = prefix + '_cleanup', + event_closed = prefix + '_closed', + event_purge = prefix + '_purge', + + // Cached jQuery Object Variables + $overlay, + $box, + $wrap, + $content, + $topBorder, + $leftBorder, + $rightBorder, + $bottomBorder, + $related, + $window, + $loaded, + $loadingBay, + $loadingOverlay, + $title, + $current, + $slideshow, + $next, + $prev, + $close, + $groupControls, + $events = $(''), // $({}) would be prefered, but there is an issue with jQuery 1.4.2 + + // Variables for cached values or use across multiple functions + settings, + interfaceHeight, + interfaceWidth, + loadedHeight, + loadedWidth, + index, + photo, + open, + active, + closing, + loadingTimer, + publicMethod, + div = "div", + requests = 0, + previousCSS = {}, + init; + + // **************** + // HELPER FUNCTIONS + // **************** + + // Convenience function for creating new jQuery objects + function $tag(tag, id, css) { + var element = document.createElement(tag); + + if (id) { + element.id = prefix + id; + } + + if (css) { + element.style.cssText = css; + } + + return $(element); + } + + // Get the window height using innerHeight when available to avoid an issue with iOS + // http://bugs.jquery.com/ticket/6724 + function winheight() { + return window.innerHeight ? window.innerHeight : $(window).height(); + } + + function Settings(element, options) { + if (options !== Object(options)) { + options = {}; + } + + this.cache = {}; + this.el = element; + + this.value = function(key) { + var dataAttr; + + if (this.cache[key] === undefined) { + dataAttr = $(this.el).attr('data-cbox-'+key); + + if (dataAttr !== undefined) { + this.cache[key] = dataAttr; + } else if (options[key] !== undefined) { + this.cache[key] = options[key]; + } else if (defaults[key] !== undefined) { + this.cache[key] = defaults[key]; + } + } + + return this.cache[key]; + }; + + this.get = function(key) { + var value = this.value(key); + return $.isFunction(value) ? value.call(this.el, this) : value; + }; + } + + // Determine the next and previous members in a group. + function getIndex(increment) { + var + max = $related.length, + newIndex = (index + increment) % max; + + return (newIndex < 0) ? max + newIndex : newIndex; + } + + // Convert '%' and 'px' values to integers + function setSize(size, dimension) { + return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); + } + + // Checks an href to see if it is a photo. + // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. + function isImage(settings, url) { + return settings.get('photo') || settings.get('photoRegex').test(url); + } + + function retinaUrl(settings, url) { + return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; + } + + function trapFocus(e) { + if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { + e.stopPropagation(); + $box.focus(); + } + } + + function setClass(str) { + if (setClass.str !== str) { + $box.add($overlay).removeClass(setClass.str).addClass(str); + setClass.str = str; + } + } + + function getRelated(rel) { + index = 0; + + if (rel && rel !== false && rel !== 'nofollow') { + $related = $('.' + boxElement).filter(function () { + var options = $.data(this, colorbox); + var settings = new Settings(this, options); + return (settings.get('rel') === rel); + }); + index = $related.index(settings.el); + + // Check direct calls to Colorbox. + if (index === -1) { + $related = $related.add(settings.el); + index = $related.length - 1; + } + } else { + $related = $(settings.el); + } + } + + function trigger(event) { + // for external use + $(document).trigger(event); + // for internal use + $events.triggerHandler(event); + } + + var slideshow = (function(){ + var active, + className = prefix + "Slideshow_", + click = "click." + prefix, + timeOut; + + function clear () { + clearTimeout(timeOut); + } + + function set() { + if (settings.get('loop') || $related[index + 1]) { + clear(); + timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); + } + } + + function start() { + $slideshow + .html(settings.get('slideshowStop')) + .unbind(click) + .one(click, stop); + + $events + .bind(event_complete, set) + .bind(event_load, clear); + + $box.removeClass(className + "off").addClass(className + "on"); + } + + function stop() { + clear(); + + $events + .unbind(event_complete, set) + .unbind(event_load, clear); + + $slideshow + .html(settings.get('slideshowStart')) + .unbind(click) + .one(click, function () { + publicMethod.next(); + start(); + }); + + $box.removeClass(className + "on").addClass(className + "off"); + } + + function reset() { + active = false; + $slideshow.hide(); + clear(); + $events + .unbind(event_complete, set) + .unbind(event_load, clear); + $box.removeClass(className + "off " + className + "on"); + } + + return function(){ + if (active) { + if (!settings.get('slideshow')) { + $events.unbind(event_cleanup, reset); + reset(); + } + } else { + if (settings.get('slideshow') && $related[1]) { + active = true; + $events.one(event_cleanup, reset); + if (settings.get('slideshowAuto')) { + start(); + } else { + stop(); + } + $slideshow.show(); + } + } + }; + + }()); + + + function launch(element) { + var options; + + if (!closing) { + + options = $(element).data(colorbox); + + settings = new Settings(element, options); + + getRelated(settings.get('rel')); + + if (!open) { + open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. + + setClass(settings.get('className')); + + // Show colorbox so the sizes can be calculated in older versions of jQuery + $box.css({visibility:'hidden', display:'block', opacity:''}); + + $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); + $content.css({width:'', height:''}).append($loaded); + + // Cache values needed for size calculations + interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); + interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); + loadedHeight = $loaded.outerHeight(true); + loadedWidth = $loaded.outerWidth(true); + + // Opens inital empty Colorbox prior to content being loaded. + var initialWidth = setSize(settings.get('initialWidth'), 'x'); + var initialHeight = setSize(settings.get('initialHeight'), 'y'); + var maxWidth = settings.get('maxWidth'); + var maxHeight = settings.get('maxHeight'); + + settings.w = (maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth; + settings.h = (maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight; + + $loaded.css({width:'', height:settings.h}); + publicMethod.position(); + + trigger(event_open); + settings.get('onOpen'); + + $groupControls.add($title).hide(); + + $box.focus(); + + if (settings.get('trapFocus')) { + // Confine focus to the modal + // Uses event capturing that is not supported in IE8- + if (document.addEventListener) { + + document.addEventListener('focus', trapFocus, true); + + $events.one(event_closed, function () { + document.removeEventListener('focus', trapFocus, true); + }); + } + } + + // Return focus on closing + if (settings.get('returnFocus')) { + $events.one(event_closed, function () { + $(settings.el).focus(); + }); + } + } + + var opacity = parseFloat(settings.get('opacity')); + $overlay.css({ + opacity: opacity === opacity ? opacity : '', + cursor: settings.get('overlayClose') ? 'pointer' : '', + visibility: 'visible' + }).show(); + + if (settings.get('closeButton')) { + $close.html(settings.get('close')).appendTo($content); + } else { + $close.appendTo('
    '); // replace with .detach() when dropping jQuery < 1.4 + } + + load(); + } + } + + // Colorbox's markup needs to be added to the DOM prior to being called + // so that the browser will go ahead and load the CSS background images. + function appendHTML() { + if (!$box && document.body) { + init = false; + $window = $(window); + $box = $tag(div).attr({ + id: colorbox, + 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. + role: 'dialog', + tabindex: '-1' + }).hide(); + $overlay = $tag(div, "Overlay").hide(); + $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); + $wrap = $tag(div, "Wrapper"); + $content = $tag(div, "Content").append( + $title = $tag(div, "Title"), + $current = $tag(div, "Current"), + $prev = $('
    +
    diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 1053daf4eb..05a5813e94 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,5 +1,7 @@ -

    Create New Product

    +
    +

    Create New Product

    -<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> + <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> -<%= render partial: "product-form", locals: {button: "Create"} %> + <%= render partial: "product-form", locals: {button: "Create"} %> +
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 1c406aefc2..5343c9393b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,13 +1,8 @@ - -<%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> -
    -
    >
    -

    <%= @product.name %>

    From seller diff --git a/config/routes.rb b/config/routes.rb index 7dc0a6bd66..4d66d61c7a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,7 +10,7 @@ resources :orders, except: [:edit] resources :order_products, only: [:update, :destroy] - get '/products/:id/categories', to: 'products#categories', as: 'add_categories' + get '/products/:id/categories', to: 'categories#add', as: 'add_categories' post '/products/:id/categories', to: 'products#add_categories' post '/products/:id/new_category', to: 'categories#create' resources :products From 3e084ea44decff88a7bab49472e1c228f6434e39 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Mon, 23 Oct 2017 14:02:16 -0700 Subject: [PATCH 178/348] remove obsolete temp-errors partial renders --- app/views/categories/add.html.erb | 2 -- app/views/products/edit.html.erb | 2 -- app/views/products/index.html.erb | 1 - app/views/products/new.html.erb | 4 +--- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/app/views/categories/add.html.erb b/app/views/categories/add.html.erb index 29211ed7b7..07fd2a60bf 100644 --- a/app/views/categories/add.html.erb +++ b/app/views/categories/add.html.erb @@ -3,8 +3,6 @@ Would you like to add some categories to <%= @product.name %> to help shoppers find it?

    - <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> -
    diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index eacb9a2bc5..18a2cefb8c 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1,7 +1,5 @@

    Edit Product Info

    - <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> - <%= render partial: "product-form", locals: {button: "Update"} %>
    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index f43df1935e..1a91db5a37 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -12,7 +12,6 @@

    <%= @title %>

    - <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> <%= render partial: "product-list", locals: {products: @products} %>
    diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index 05a5813e94..b0c4aeb37c 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1,7 +1,5 @@ -
    +

    Create New Product

    - <%= (render partial: 'temp-errors') if (flash[:message]) || (flash.now[:message]) %> - <%= render partial: "product-form", locals: {button: "Create"} %>
    From 69a23379ccb6c9f5286668563e0124e6bbbae5d4 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Mon, 23 Oct 2017 14:05:15 -0700 Subject: [PATCH 179/348] add confirm login/ownership to application controller --- app/controllers/application_controller.rb | 10 +++++++++- app/controllers/categories_controller.rb | 3 +++ app/controllers/products_controller.rb | 10 +--------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ec8efcb775..682a62c21a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -10,7 +10,7 @@ def confirm_login return redirect_back(fallback_location: products_path) end end - + def find_product_by_params @product = Product.find_by(id: params[:id]) @@ -19,4 +19,12 @@ def find_product_by_params end end + def confirm_product_ownership + unless session[:merchant]['id'] == @product.merchant_id + flash[:status] = :failure + flash[:message] = "Only a product's merchant can modify a product." + return redirect_back(fallback_location: products_path) + end + end + end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 25a2613d08..f768d321ce 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,7 +1,10 @@ class CategoriesController < ApplicationController before_action :confirm_login + before_action :find_product_by_params, only: [:add] + before_action :confirm_product_ownership, only: [:add] + def create category = Category.new(name: params[:category_name]) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index e7ca7f6dd1..6770f870c6 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -4,7 +4,7 @@ class ProductsController < ApplicationController before_action :confirm_login, except: [:index, :show] - before_action :confirm_ownership, only: [:edit, :update, :destroy, :categories, :add_categories] + before_action :confirm_product_ownership, only: [:edit, :update, :destroy, :categories, :add_categories] def index @@ -93,14 +93,6 @@ def add_categories private - def confirm_ownership - unless session[:merchant]['id'] == @product.merchant_id - flash[:status] = :failure - flash[:message] = "Only a product's merchant can modify a product." - return redirect_back(fallback_location: products_path) - end - end - def prod_params params.require(:product).permit(:name, :image_url, :price, :quantity, :description) end From 7a23c7ccb565cfee5184af3c9586b96e8a0f6dc5 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Mon, 23 Oct 2017 14:06:26 -0700 Subject: [PATCH 180/348] added view for merchant show --- .DS_Store | Bin 0 -> 6148 bytes .../_list-merchant-products.html.erb | 19 ++++++++++++++++++ app/views/merchants/show.html.erb | 6 ++++++ 3 files changed, 25 insertions(+) create mode 100644 .DS_Store create mode 100644 app/views/merchants/_list-merchant-products.html.erb diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..74018da7b3a8ca3f1cf12430fe7fcfefa4ba1d0d GIT binary patch literal 6148 zcmeHK&2G~`5S~o~^{PS`i9?ZkScwCd970OT)e7wm34|kh;3u{5sxh*>mE$CbD3bdE zeSpFh%6q^=@FLuq+1((jz!5~zj5Pbr&d$u*-&(s~01$&|b{`-FfB==SC9(O1&^YOu zw7iE<*cufia11(~PfpgN+3_zjKx-Gk8!#{f4L_}4T9_2azNIHcKB>FiucEclzIJ^x zkaA1jkT>P4cx>izoz&CGAgNwZ?`cwx)1(@OJ8_NTD#Dp zF$D(Lv|*Ay&-Hv1-hO1tI>}32+1jqg%fr0P%zR*`Wj3+#zPOZkqoc->Dg!wRw-<}v z-d;!b`n_dGE&Ba#M?KhmxLnHM&b{4duiu`Yoxgkk;p4@p&o&7JezaC@d0fF4G}cI& z#Z_6D@)*Zfd8>FvW`G%B2Cf(bej5w6uGn+)<1z!xz@KM;_6LPZ7 + <% if products.count == 0 %> + +

    This merchant has no products.

    + <% else %> + <% products.each do |product| %> +
    + <%= link_to product_path(product.id) do %> +
    + >
    +

    + <%= product.name %> +

    + <% end %> +
    + <% end %> + <% end %> +
    diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index e69de29bb2..c5b677447f 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -0,0 +1,6 @@ +

    <%=@merchant.username%>

    + +

    Products

    +
    +<%= render partial: "list-merchant-products", locals: {products: @merchant.products} %> +
    From f83cb55c29c0495ba7d74f8667e98c2acf9d71af Mon Sep 17 00:00:00 2001 From: Roxanne Date: Mon, 23 Oct 2017 14:13:59 -0700 Subject: [PATCH 181/348] added view to merchant show page --- app/views/merchants/index.html.erb | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/views/merchants/index.html.erb diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb deleted file mode 100644 index e69de29bb2..0000000000 From 4b20c6830d05345e1a125adcc75b3cb6c0a477f5 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Mon, 23 Oct 2017 14:22:23 -0700 Subject: [PATCH 182/348] removed categories from seed data --- db/seeds.rb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index efc5509f4d..3b29540564 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -33,20 +33,20 @@ ]) products = Product.create([ - { category: 'food', name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 1, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { category: 'legendary items', name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 2, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { category: 'alchemy ingredient', name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 3, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { category: 'apparel', name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 4, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, - { category: 'magic wands', name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { category: 'creatures', name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 6, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { category: 'alchemy ingredient', name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 7, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, - { category: 'alchemy ingredient', name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 8, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { category: 'legendary items', name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { category: 'legendary items', name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 10, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { category: 'wish granting', id: 11, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, - { category: 'literature', id: 12, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { category: 'leather goods', id: 13, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, - { category: 'alchemy ingredient', id: 14, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 1, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 2, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + {name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 3, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 4, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, + { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 6, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 7, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, + {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 8, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 10, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 11, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, + { id: 12, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 13, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, + { id: 14, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } ]) order_products = OrderProduct.create([ From 39ceb4b091246695358e62e3be1a161306483c31 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Mon, 23 Oct 2017 14:31:10 -0700 Subject: [PATCH 183/348] gave all the product seeds extremely large numbers for ids --- db/seeds.rb | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 3b29540564..89bac8e3bf 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -33,20 +33,20 @@ ]) products = Product.create([ - { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 1, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 2, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 113247913947192347, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 213024812034837489, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, {name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 3, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 4, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, - { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 6, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 7, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, - {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 8, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 10, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { id: 11, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, - { id: 12, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { id: 13, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, - { id: 14, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 42349182376412387469, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, + { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 51234710239874019283, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 62314861923874691, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 732486891283746923874, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, + {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 823948689123746, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9123847981273642983476, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 102314870129384701928374, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 117123840981273409821743, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, + { id: 1232984710293847012938, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 13238470192837401928374, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, + { id: 141023984701293847, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } ]) order_products = OrderProduct.create([ From cad40438de6b93440960fafe5aa3a77f14adc4c4 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Mon, 23 Oct 2017 14:34:05 -0700 Subject: [PATCH 184/348] made seed product ids a bit smaller --- db/seeds.rb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 89bac8e3bf..46b0e7b1f8 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -36,17 +36,17 @@ { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 113247913947192347, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 213024812034837489, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, {name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 3, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 42349182376412387469, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, - { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 51234710239874019283, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 62314861923874691, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 732486891283746923874, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, - {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 823948689123746, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9123847981273642983476, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 102314870129384701928374, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { id: 117123840981273409821743, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, - { id: 1232984710293847012938, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { id: 13238470192837401928374, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, - { id: 141023984701293847, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 423491823764, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, + { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5123471023, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 62314861, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 732486891, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, + {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 82394832028, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 91238479812, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 102314870129, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 11712384098, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, + { id: 1232984710, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 132384701, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, + { id: 141023984, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } ]) order_products = OrderProduct.create([ From c274c9fbb0f6f27e14125e51f1e2311d991efcc1 Mon Sep 17 00:00:00 2001 From: kee nam Date: Mon, 23 Oct 2017 14:47:04 -0700 Subject: [PATCH 185/348] Added form for orders/new --- app/controllers/orders_controller.rb | 11 +++++++++ app/views/orders/_form.html.erb | 34 ++++++++++++++++++++++++++++ app/views/orders/new.html.erb | 5 +++- 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 app/views/orders/_form.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 4d75d6837d..83a1e14084 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,5 +1,8 @@ class OrdersController < ApplicationController + # check if logged in at first + def index + # show only the orders that belong to the merchant @orders = Order.all if session[:merchant] @orders = Merchant.find(params[:merchant]).orders @@ -7,10 +10,15 @@ def index end def new + # new order, either with no merchant_id or with the logged-in-user's merchant_id @order = Order.new + if session[:merchant] + @order.merchant_id = Merchant.find(params[:merchant]['id']) + end end def create + # create new order, either with no merchant_id or with the logged-in-user's merchant_id @order = Order.new(order_params) if @order.save flash[:status] = :success @@ -25,10 +33,12 @@ def create end def show + # show the desired order find_order_by_params_id end def update + # edit the desired order if find_order_by_params_id @order.update_attributes(order_params) if @order.save @@ -42,6 +52,7 @@ def update end def destroy + # if the order belongs to the user, can destroy it if find_order_by_params_id @order.destroy flash[:status] = :success diff --git a/app/views/orders/_form.html.erb b/app/views/orders/_form.html.erb new file mode 100644 index 0000000000..a6c1e9c7f8 --- /dev/null +++ b/app/views/orders/_form.html.erb @@ -0,0 +1,34 @@ +<%= form_for @order, html: {id: "order-form"} do |f| %> + <% if session[:merchant] %> + <%= f.hidden_field :merchant_id, value: session[:merchant] %> + <% end %> + + <%= content_tag :div, class: "name-wrapper" do %> + <%= f.label :cust_name, "Name"%> + <%= f.text_field :cust_name %> + <% end %> + + <%= content_tag :div, class: "cc-wrapper" do %> + <%= f.label :cust_cc, "Credit Card Number" %> + <%= f.text_field :cust_cc %> + <% end %> + + <%= content_tag :div, class: "ccexp-wrapper" do %> + <%= f.label :cust_cc_exp, "Expiration Date" %> + <%= f.text_field :cust_cc_exp %> + <% end %> + + <%= content_tag :div, class: "addr-wrapper" do %> + <%= f.label :cust_addr, "Address" %> + <%= f.text_field :cust_addr %> + <% end %> + + <%= content_tag :div, class: "email-wrapper" do %> + <%= f.label :cust_email, "Email" %> + <%= f.text_field :cust_email %> + <% end %> + + <%= content_tag :div, class: "submit-wrapper" do %> + <%= f.submit button_text, class: "button" %> + <% end %> +<% end %> diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb index 2f85f7d69b..46834e680d 100644 --- a/app/views/orders/new.html.erb +++ b/app/views/orders/new.html.erb @@ -1 +1,4 @@ -

    NEW order page

    +
    +

    Payment details

    + <%= render partial: "form", locals: { hide_placeholder_text: true, button_text: "Place Order" }%> +
    From 428afccaa60da730098a8007476adb43c764fda5 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Mon, 23 Oct 2017 14:58:17 -0700 Subject: [PATCH 186/348] add categories + relationships + fix pkeys --- db/seeds.rb | 55 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/db/seeds.rb b/db/seeds.rb index 46b0e7b1f8..92ef85cd58 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -32,23 +32,47 @@ { cust_name: 'Hermit Wizard', status: 'completed', cust_email: 'lookingforlove@lonelyville.com', cust_cc: '1234567890', cust_cc_exp: '10/20', cust_addr: 'The cave', id: 12, created_at: Time.now, updated_at: Time.now } ]) +categories = Category.create([ + {name: 'Magic Ingredients', id: 1}, + {name: 'Legendary Items', id: 2}, + {name: 'Mythical Creatures', id: 3}, + {name: 'Enchanted Food', id: 4}, + {name: 'Apparel', id: 5}, + {name: 'Curses', id: 6} + ]) + products = Product.create([ - { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 113247913947192347, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 213024812034837489, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { name: 'Peaches of Immortality ', image_url: 'http://4.bp.blogspot.com/-5GQ1fBLNVr4/UAM6EnUpUSI/AAAAAAAAEyg/XKNYdq4P8x4/s1600/6a00e55119b5ec8834012877293a88970c-800wi.jpg', price: 3.25, quantity: 120, description: "Magical powers of immortality given from one bite", id: 1, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { name: 'That Ring', image_url: 'https://listverse.com/wp-content/uploads/2013/08/the-one-ring-e1375311691730.jpg', price: 350.00, quantity: 1, description: "The ring that gives you invisibility", id: 2, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, {name: 'Dragon\'s Tooth', image_url: 'https://img1.etsystatic.com/100/0/9170080/il_340x270.831176717_5zaz.jpg', price: 9.99, quantity: 4, description: "Gives magical powers to it's owner.", id: 3, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 423491823764, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, - { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5123471023, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 62314861, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 732486891, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, - {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 82394832028, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, - { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 91238479812, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, - { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 102314870129, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { id: 11712384098, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, - { id: 1232984710, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, - { id: 132384701, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, - { id: 141023984, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } + { name: 'Helm of Darkness', image_url: 'http://cdn3.list25.com/wp-content/uploads/2017/04/HELMOFDARKNESSorsimilarmaybesubstituted-610x610.jpg', price: 49.99, quantity: 25, description: "Turn into a shadow with this magical helmet.", id: 4, created_at: Time.now, updated_at: Time.now , merchant_id: 5 }, + { name: 'Umbra Staff', image_url: 'https://image.freepik.com/free-photo/umbrella-closed_19-121570.jpg', price: 693.39, quantity: 10, description: "This is a supremely powerful magic wand, imbued with the soul of a great wizard. It's definitely not just an umbrella.", id: 5, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'My Little Pony (REAL)', image_url: 'https://lilyladewig.files.wordpress.com/2009/04/glitter-pony-2.jpg', price: 123.45, quantity: 100, description: "REAL PONY REAL MAGIC!! NOT FAKE", id: 6, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Witch\'s Tears', image_url: 'https://i.ebayimg.com/images/g/BlsAAOSwWnFV84vC/s-l300.jpg', price: 21.21, quantity: 50, description: "You have to be really mean to a witch to make these.", id: 7, created_at: Time.now, updated_at: Time.now, merchant_id: 8 }, + {name: 'Golden Fleece', image_url: 'https://i.imgur.com/UMHsPJn.jpg', price: 5000.39 , quantity: 1, description: "Fresh Golden Fleece.", id: 8, created_at: Time.now, updated_at: Time.now, merchant_id: 7 }, + { name: 'Excalibur', image_url: 'https://i.imgur.com/2cGiWjQ.jpg', price: 50.01, quantity: 1, description: "Do you want to be the King of Camelot? Here is your chance. Also, people used to be a lot smaller than they are now.", id: 9, created_at: Time.now, updated_at: Time.now, merchant_id: 6 }, + { name: 'Ghost of Caesar in a Mason Jar', image_url: 'https://i.imgur.com/ys1of8Rr.jpg', price: 2145.96, quantity: 1, description: "There are so many uses for this ghost in a jar. Are you interested in learning Latin? Have someone you really need to scare? This ghost will haunt like none other. Just open the jar and your home, work, or back yard is haunted by Julius Caesar. You'll be saying 'E Tu, Brute' in no time.", id: 10, created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 11, name: 'Monkey\'s Paw', image_url: 'https://theluckycandle.com/wp-content/uploads/2014/07/Monkey-Paw-.jpg', price: 777.00, quantity: 60, description: 'The paw of a monkey, said to grant any wish in unfathomable ways.(Seller does not take any responsibility for the outcome of said wishes)', created_at: Time.now, updated_at: Time.now, merchant_id: 3 }, + { id: 12, name: 'Bloodied Parchments of Merlin', image_url: 'https://orig00.deviantart.net/e72e/f/2011/259/a/1/bloody_parchment_by_shinjite_samachan-d4a2dlf.jpg', price: 20, quantity: 300, description: 'Parchments said to come from the infamous wizard himself. Papers are bloodied to the point of illegibility.', created_at: Time.now, updated_at: Time.now, merchant_id: 4 }, + { id: 13, name: 'Golden Saddles of Mercury', image_url: 'https://i.pinimg.com/736x/3a/b2/b6/3ab2b6bc38cc66bbdad7c4cca2b02812.jpg', price: 104.67, quantity: 9, description: 'Sturdy leather saddle set for horse-riding enthusiasts. Recommended for winged steeds.', created_at: Time.now, updated_at: Time.now, merchant_id: 5 }, + { id: 14, name: 'Mermaid Fin', image_url: 'https://www.finfunmermaid.com/images/products/dragonfly-mermaid-tail_category.jpg', price: 35.00, quantity: 2017, description: 'Fins collected from mermaids who decided to give up their underwater life to be where the (land) people are.', created_at: Time.now, updated_at: Time.now, merchant_id: 6 } ]) +p = Product.find(1); p.categories << [Category.find(4), Category.find(1)]; p.save +p = Product.find(2); p.categories << Category.find(2); p.save +p = Product.find(3); p.categories << Category.find(1); p.save +p = Product.find(4); p.categories << Category.find(5); p.save +p = Product.find(5); p.categories << [Category.find(2), Category.find(4)]; p.save +p = Product.find(6); p.categories << Category.find(3); p.save +p = Product.find(7); p.categories << Category.find(1); p.save +p = Product.find(8); p.categories << Category.find(1); p.save +p = Product.find(9); p.categories << Category.find(2); p.save +p = Product.find(10); p.categories << Category.find(6); p.save +p = Product.find(11); p.categories << [Category.find(6), Category.find(1), Category.find(2)]; p.save +p = Product.find(12); p.categories << Category.find(1); p.save +p = Product.find(13); p.categories << Category.find(2); p.save +p = Product.find(14); p.categories << Category.find(3); p.save + order_products = OrderProduct.create([ { status: 'shipped', quantity: '1', order_id: 1, product_id: 13, created_at: Time.now, updated_at: Time.now, id: 1 }, { status: 'shipped', quantity: '3', order_id: 2, product_id: 12, created_at: Time.now, updated_at: Time.now, id: 2 }, @@ -73,3 +97,8 @@ { rating: 5, description: 'very nice and magic', product_id: 6, created_at: Time.now, updated_at: Time.now, id: 1 }, { rating: 1, description: 'these are wizards tears, NOT witch\'s tears. seller should be ashamed', product_id: 7, created_at: Time.now, updated_at: Time.now, id: 2 } ]) + +puts "Manually resetting PK sequence on each table" +ActiveRecord::Base.connection.tables.each do |t| + ActiveRecord::Base.connection.reset_pk_sequence!(t) +end From 572b5603733258bfc4f7a7c73d9ed6a422009cb8 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Mon, 23 Oct 2017 15:00:57 -0700 Subject: [PATCH 187/348] formatting for categories --- app/assets/stylesheets/categories.scss | 17 +++++++++++++++++ app/views/categories/add.html.erb | 26 ++++++++++++++++---------- app/views/products/_review.html.erb | 3 +++ 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss index ef1657f8c9..69e3192ccb 100644 --- a/app/assets/stylesheets/categories.scss +++ b/app/assets/stylesheets/categories.scss @@ -1,3 +1,20 @@ // Place all the styles related to the categories controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ + +//////////////////// +// ADD CATEGORIES // +//////////////////// + +.check-with-label:checked + .label-for-check { + font-weight: bold; +} + +input[type="checkbox"] { + display: none; +} + +.add-category { + display: inline-block !important; + width: inherit !important; +} diff --git a/app/views/categories/add.html.erb b/app/views/categories/add.html.erb index 07fd2a60bf..11868fd29f 100644 --- a/app/views/categories/add.html.erb +++ b/app/views/categories/add.html.erb @@ -18,23 +18,29 @@ <%= form_tag add_categories_path, :method => :post, id: @product.id do %> <% @categories.each do |category| %> <% unless @product.categories.include? category %> - <%= check_box_tag ("category_#{category.name}"), category.id %> - <%= label_tag category.name %> +
    + <% cat_name = "category_#{category.name}" %> + <%= check_box_tag cat_name, category.id, false, class: "check-with-label" %> + <%= label_tag cat_name, category.name, class: "label-for-check" %> +
    <% end %> <% end %> <%= submit_tag "Add Selected" %> <% end %> -

    - Add a new category: -

    - <%= form_tag categories_path, :method => :post do %> - <%= text_field_tag :category_name %> - <%= hidden_field_tag :product_id, @product.id %> +
    + <%= form_tag categories_path, :method => :post do %> +

    + New category: +

    - <%= submit_tag "Create" %> - <% end %> + <%= text_field_tag :category_name, "", class: "small-12 medium-2 columns add-category" %> + <%= hidden_field_tag :product_id, @product.id, class: "add-category" %> + + <%= submit_tag "Create", class: "small-12 medium-2 columns add-category" %> + <% end %> +
    diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index c20552c9be..4b66ea10d3 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -1 +1,4 @@

    Placeholder review text

    +<%= review.rating %> +
    +<%= review.description %> From 3f35a8d917daec2d027fef2c3915cf7866824263 Mon Sep 17 00:00:00 2001 From: sairagula Date: Mon, 23 Oct 2017 15:03:51 -0700 Subject: [PATCH 188/348] Started views for Review --- app/controllers/reviews_controller.rb | 12 ++--- app/views/products/_review.html.erb | 1 - app/views/reviews/_review.html.erb | 7 +++ app/views/reviews/_review_form.html.erb | 9 ++++ app/views/reviews/index.html.erb | 0 app/views/reviews/new.html.erb | 2 + app/views/reviews/show.html.erb | 0 test/controllers/reviews_controller_test.rb | 51 +++++++++++---------- 8 files changed, 50 insertions(+), 32 deletions(-) delete mode 100644 app/views/products/_review.html.erb create mode 100644 app/views/reviews/_review.html.erb create mode 100644 app/views/reviews/_review_form.html.erb delete mode 100644 app/views/reviews/index.html.erb delete mode 100644 app/views/reviews/show.html.erb diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index cbebc91ace..bcb68eb105 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,13 +1,13 @@ class ReviewsController < ApplicationController - before_action :find_review_by_params_id, only: [:show, :edit, :update, :destroy] + before_action :find_review_by_params_id, only: [:edit, :update, :destroy] #:show, before_action :check_for_product_owner_nested, only: [:create, :new] before_action :check_for_product_owner, only: [:edit, :update, :destroy] - def index - @reviews = Review.where(product_id: params[:product_id]) - end + # def index # leaving for future, if we rethink and decide to add later + # @reviews = Review.where(product_id: params[:product_id]) + # end - def show ; end + # def show ; end def new @review = Review.new @@ -33,7 +33,7 @@ def update if @review.save flash[:status] = :success flash[:message] = "Successfully created review " - redirect_to review_path(@review) + redirect_to product_path(@review) #review_path(@review) else render :edit, status: :bad_request return diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb deleted file mode 100644 index c20552c9be..0000000000 --- a/app/views/products/_review.html.erb +++ /dev/null @@ -1 +0,0 @@ -

    Placeholder review text

    diff --git a/app/views/reviews/_review.html.erb b/app/views/reviews/_review.html.erb new file mode 100644 index 0000000000..4ae472c0a0 --- /dev/null +++ b/app/views/reviews/_review.html.erb @@ -0,0 +1,7 @@ +

    Reviews +

    <% link_to @review.description %>

    +

    + +

    + <%=@review.rating %> +

    diff --git a/app/views/reviews/_review_form.html.erb b/app/views/reviews/_review_form.html.erb new file mode 100644 index 0000000000..36670ba6e0 --- /dev/null +++ b/app/views/reviews/_review_form.html.erb @@ -0,0 +1,9 @@ +<%= form_for @product do |f| %> + <%= f.label :rating %> + <%= f.integer :rating %> + + <%= f.label :description %> + <%= f.text_field :description %> + + <%= f.submit button, class: 'button' %> +<% end %> diff --git a/app/views/reviews/index.html.erb b/app/views/reviews/index.html.erb deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index e69de29bb2..92dbdd11f7 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -0,0 +1,2 @@ +

    Add review to the product

    +<%= render partial: "review", locals: {button: "Add new review"} %> diff --git a/app/views/reviews/show.html.erb b/app/views/reviews/show.html.erb deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 1ec7bc597b..b2dab605e6 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -10,30 +10,31 @@ def login_test_user get login_path(:github) end - describe "index" do - it "returns success status for all reviews" do - get product_reviews_path(mermaid_fin) - must_respond_with :success - end - - it "works when there are no reviews" do - Review.destroy_all - get product_reviews_path(mermaid_fin) - must_respond_with :success - end - end - - describe "show" do - it "succeeds for a review that exists" do - get review_path(reviews(:review)) - must_respond_with :success - end - - it "returns 404 not_found for a review that does not exist" do - get review_path(123) - must_respond_with :not_found - end - end +######### Leaving for future, if we rethink and decide to add later + # describe "index" do + # it "returns success status for all reviews" do + # get product_reviews_path(mermaid_fin) + # must_respond_with :success + # end + # + # it "works when there are no reviews" do + # Review.destroy_all + # get product_reviews_path(mermaid_fin) + # must_respond_with :success + # end + # end + + # describe "show" do + # it "succeeds for a review that exists" do + # get review_path(reviews(:review)) + # must_respond_with :success + # end + # + # it "returns 404 not_found for a review that does not exist" do + # get review_path(123) + # must_respond_with :not_found + # end + # end describe "new" do @@ -164,7 +165,7 @@ def login_test_user patch review_path(review.id), params: review_data must_respond_with :redirect - must_redirect_to review_path(review) + must_redirect_to product_path(review) Review.find(review.id).rating.must_equal 3 end From ad8e943f62296ccd620f51be164171487e3bf0d9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Mon, 23 Oct 2017 15:07:02 -0700 Subject: [PATCH 189/348] fix formatting, merchant email validation --- app/assets/stylesheets/application.css | 4 ++++ app/models/merchant.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 729b02c20d..e1378c18d0 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -23,3 +23,7 @@ .row { max-width: 100%; } + +header nav { + text-align: right; +} diff --git a/app/models/merchant.rb b/app/models/merchant.rb index a9559069cb..564bec134c 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -6,7 +6,7 @@ class Merchant < ApplicationRecord validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness:true - validates_format_of :email, :with => /\A\w+@\w+\.\w+\z/ + validates_format_of :email, :with => /\A[\w|.|+]+@[\w|.|+]+\.[\w|.|+]+\z/ validates :oauth_provider, presence: true validates :oauth_uid, presence: true, uniqueness: true From b7dff17b378cc7408def0f63da3e230bc597d6c9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Mon, 23 Oct 2017 15:33:16 -0700 Subject: [PATCH 190/348] button formatting for categories page --- app/assets/stylesheets/categories.scss | 4 ++++ app/assets/stylesheets/products.scss | 21 ++++++++++++++++----- app/controllers/products_controller.rb | 17 +++++++++++------ app/views/categories/add.html.erb | 4 ++-- app/views/products/index.html.erb | 5 ++++- app/views/products/show.html.erb | 2 +- 6 files changed, 38 insertions(+), 15 deletions(-) diff --git a/app/assets/stylesheets/categories.scss b/app/assets/stylesheets/categories.scss index 69e3192ccb..a8774e6213 100644 --- a/app/assets/stylesheets/categories.scss +++ b/app/assets/stylesheets/categories.scss @@ -18,3 +18,7 @@ input[type="checkbox"] { display: inline-block !important; width: inherit !important; } + +.button[type="submit"] { + margin: .25rem; +} diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index a94664a713..ce2a7c5b6c 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -86,13 +86,10 @@ section.product-info { // width: 30%; } -.product-details [type="submit"] { +.product-details .cart-btn { display: block; - margin: auto; -} - -.product-details .button { font-size: 1.5rem; + margin: auto; padding: 1rem 2rem; } @@ -150,3 +147,17 @@ section.product-info { border-color: #9FA2B2; color: white; } + +////////////////////// +// CATEGORY SIDEBAR // +////////////////////// + +.category-menu li a { + display: inline-block; + text-indent: -.5rem; +} + +.view-all { + font-weight: bold; + margin-bottom: 1rem; +} diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 6770f870c6..965ba3650a 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -9,16 +9,21 @@ class ProductsController < ApplicationController def index if params[:category_id] - @cat = Category.find_by(id: params[:category_id]) - if @cat - @products = Product.all.find_all { |prod| prod.categories.include? @cat } - @title = @cat.name.capitalize + if params[:category_id] == 'all' + @products = Product.all + @title = "All Products" else - return head :not_found + @cat = Category.find_by(id: params[:category_id]) + if @cat + @products = Product.all.find_all { |prod| prod.categories.include? @cat } + @title = @cat.name.capitalize + else + return head :not_found + end end else - @products = Product.most_popular @title = "Popular Now" + @products = Product.most_popular end @categories = Category.all end diff --git a/app/views/categories/add.html.erb b/app/views/categories/add.html.erb index 11868fd29f..e2b9969f0a 100644 --- a/app/views/categories/add.html.erb +++ b/app/views/categories/add.html.erb @@ -26,7 +26,7 @@ <% end %> <% end %> - <%= submit_tag "Add Selected" %> + <%= submit_tag "Add Selected", class: 'button' %> <% end %>
    @@ -38,7 +38,7 @@ <%= text_field_tag :category_name, "", class: "small-12 medium-2 columns add-category" %> <%= hidden_field_tag :product_id, @product.id, class: "add-category" %> - <%= submit_tag "Create", class: "small-12 medium-2 columns add-category" %> + <%= submit_tag "Create", class: "small-12 medium-2 columns add-category button end" %> <% end %>
    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 1a91db5a37..badc21bc21 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,7 +1,10 @@
    -

    From 4340c528e24e4a7f7744065ba45d004c38a592af Mon Sep 17 00:00:00 2001 From: kee nam Date: Tue, 24 Oct 2017 10:01:34 -0700 Subject: [PATCH 202/348] Edited orders #index page --- app/controllers/orders_controller.rb | 14 ++++++++++---- app/views/orders/index.html.erb | 26 +++++++++++++++++--------- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index c9b5e8261b..c0dc7136b2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,11 +1,12 @@ class OrdersController < ApplicationController - # check if logged in at first def index # show only the orders that belong to the merchant if session[:merchant] merchant_id = session[:merchant]['id'] @orders = Merchant.find(merchant_id).orders + else + @orders = nil end end @@ -17,6 +18,7 @@ def new def create # create new order, either with no merchant_id or with the logged-in-user's merchant_id @order = Order.new(order_params) + # @order.order_products += session[:cart] if @order.save flash[:status] = :success flash[:message] = "Successfully created order" @@ -30,12 +32,12 @@ def create end def show - # show the desired order + # show the order if it belongs to the merchant (buyer) find_order_by_params_id end def update - # edit the desired order + # edit the desired order if it belongs to the merchant (buyer) if find_order_by_params_id @order.update_attributes(order_params) if @order.save @@ -49,7 +51,7 @@ def update end def destroy - # if the order belongs to the user, can destroy it + # if the order belongs to the merchant (buyer), can destroy it if find_order_by_params_id @order.destroy flash[:status] = :success @@ -61,14 +63,18 @@ def destroy private def order_params + # parameters for the order return params.require(:order).permit(:cust_name, :status, :cust_email, :cust_cc, :cust_cc_exp, :cust_addr, :merchant_id) end def find_order_by_params_id + # find the order by the id parameter @order = Order.find_by(id: params[:id]) unless @order head :not_found end return @order end + + # confirm if the order belongs to the merchant (buyer) end diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index c462e0cd9c..08134a11e0 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -1,20 +1,28 @@

    Order history

    - <% if @orders.count < 1 %> + + <% if @orders == nil %>

    You haven't purchased anything yet!

    <% else %> + <% @orders.each do |order| %>
    -
    -
    - + <% order.products.each do | product |%> + +
    +
    + +
    -
    -
    -

    Product name

    -

    Product description maybe.

    -
    +
    +

    <%= product.name %>

    +

    <%= product.description %>

    +

    <%= product.price %>

    +
    + <% end %> +
    <% end %> + <% end %>
    From 40900daeef156c17fda3ee90155c32015b748afb Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 10:02:50 -0700 Subject: [PATCH 203/348] tweaks to cart --- app/helpers/main_helper.rb | 2 +- app/models/order_product.rb | 2 +- app/views/main/shopping_cart.html.erb | 5 +++-- app/views/products/show.html.erb | 3 +-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/helpers/main_helper.rb b/app/helpers/main_helper.rb index 4193635cf6..a062ab8119 100644 --- a/app/helpers/main_helper.rb +++ b/app/helpers/main_helper.rb @@ -1,5 +1,5 @@ module MainHelper def total(array) - array.inject { |sum, n| sum + n.total } + array.sum { |n| n.total } end end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index b01036b74a..7dbfa8f4fa 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -1,6 +1,6 @@ class OrderProduct < ApplicationRecord belongs_to :product - belongs_to :order + belongs_to :order, optional: true validates :quantity, presence: true, numericality: {greater_than: 0} diff --git a/app/views/main/shopping_cart.html.erb b/app/views/main/shopping_cart.html.erb index 9701dd6163..b15f626f44 100644 --- a/app/views/main/shopping_cart.html.erb +++ b/app/views/main/shopping_cart.html.erb @@ -2,10 +2,11 @@

    Shopping Cart

    <% @products.each do |order_product| %> -

    <%= order_product.name %>

    +

    <%= order_product.product.name %>

    <%= order_product.total %>

    - <% puts order_product, order_product.name, order_product.total %> <% end %> +

    cart total

    <%= total(@products)%> +
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 25c331dfa8..ee77615808 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,7 +1,6 @@
    -
    - > +
    >

    <%= @product.name %>

    From 092ba34fe79a455e30a7c8c8a37efc5e4d87f747 Mon Sep 17 00:00:00 2001 From: sairagula Date: Tue, 24 Oct 2017 10:24:03 -0700 Subject: [PATCH 204/348] mysterious buttons solved --- app/assets/stylesheets/reviews.scss | 4 ++-- app/views/products/_review.html.erb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index 1c9ecbe173..53b0eac8ab 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -13,11 +13,11 @@ display: inline-block; // text-indent: 2rem; } -.button { +.change { background-color: white; border: .5px solid black; border-radius: 1rem; - font: black; + color: inherit; } .review_info{ padding-left: 10%; diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index e2b90c65de..7afa34ceac 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -6,6 +6,6 @@
    <%= review.description %>
    -
    <%= link_to "Edit", edit_review_path(review.id) %>
    -
    <%= link_to "Delete", review_path(review.id), method: :delete, data: { confirm: "Are you sure?" }%>
    +
    <%= link_to "Edit", edit_review_path(review.id) %>
    +
    <%= link_to "Delete", review_path(review.id), method: :delete, data: { confirm: "Are you sure?" }%>
    From e82bedfb400b31fa2ef29f6c70e021a54deb7e41 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 11:09:40 -0700 Subject: [PATCH 205/348] formatting tweaks --- app/assets/stylesheets/application.css | 4 ++++ app/views/products/show.html.erb | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index e1378c18d0..97b12211c4 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -27,3 +27,7 @@ header nav { text-align: right; } + +.right { + float: right; +} diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 25c331dfa8..e8abf87c89 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,10 +1,13 @@
    -
    +
    >
    -
    -

    <%= @product.name %>

    +
    +

    + <%= @product.name %> + <%= (link_to "Edit", edit_product_path(@product.id), class: 'right button') if @own_product %> +

    From seller <%= link_to @product.merchant.username, merchant_path(@product.merchant_id) %>

    From 68bc806f2fa5720ee603c94563742b5b4862ab44 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 11:28:08 -0700 Subject: [PATCH 206/348] layout for order products index --- app/controllers/order_products_controller.rb | 4 +--- app/views/order_products/index.html.erb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index fc84b1aff8..2f8ddd28cd 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,8 +1,6 @@ class OrderProductsController < ApplicationController def index - if session[:merchant] - @order_products = Merchant.find(params[:merchant]).order_products - end + @order_products = OrderProduct.all.find_all {|op| (op.product.merchant_id == params['merchant_id'].to_i) && op.status != nil} end def update diff --git a/app/views/order_products/index.html.erb b/app/views/order_products/index.html.erb index 818eae11cd..6af69b0304 100644 --- a/app/views/order_products/index.html.erb +++ b/app/views/order_products/index.html.erb @@ -1 +1,13 @@

    order products index

    + +<% @order_products.each do |op| %> +

    + + Order #<%= op.order_id %>
    + Customer: <%= op.order.cust_name %> +
    +

    +

    + <%= op.product.name %> | <%= op.quantity %> | Status: <%= op.status %> +

    +<% end %> From adc4425d4aa2bf8bec48e026f852bb6be4664387 Mon Sep 17 00:00:00 2001 From: sairagula Date: Tue, 24 Oct 2017 11:29:50 -0700 Subject: [PATCH 207/348] Trying to sign in --- app/views/layouts/application.html.erb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3af72753d9..78e36bb226 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,9 +20,11 @@
    <%= review.description %>
    + <% if session[:merchant] %>
    <%= link_to "Edit", edit_review_path(review.id) %>
    <%= link_to "Delete", review_path(review.id), method: :delete, data: { confirm: "Are you sure?" }%>
    + <% end %>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 25c331dfa8..954e3a2703 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -38,6 +38,7 @@
    +

    <%= link_to "Add review", new_product_review_path(@product) %>

    Average Review: <%= @product.reviews.average(:rating) %>

    <% @product.reviews.each do |review| %> <%= render partial: 'review', locals: {review: review} %> diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index edac7218e7..f879f86868 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,2 +1,2 @@

    Add review to the product

    -<%= render partial: "review_form", locals: {button: "Add new review"} %> +<%= render partial: "review_form", locals: {button: "Submit review"} %> From 62c6325c169709ed331a59eb35b66a60f187f110 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 13:57:33 -0700 Subject: [PATCH 212/348] fixing tests for reviews --- coverage/.last_run.json | 2 +- coverage/.resultset.json | 205 +- coverage/index.html | 2334 +++++++++++-------- test/controllers/reviews_controller_test.rb | 12 +- test/test_helper.rb | 11 + 5 files changed, 1493 insertions(+), 1071 deletions(-) diff --git a/coverage/.last_run.json b/coverage/.last_run.json index 19684f4866..383c48cb5a 100644 --- a/coverage/.last_run.json +++ b/coverage/.last_run.json @@ -1,5 +1,5 @@ { "result": { - "covered_percent": 94.74 + "covered_percent": 90.54 } } diff --git a/coverage/.resultset.json b/coverage/.resultset.json index af0ba8c674..a18a5d51c0 100644 --- a/coverage/.resultset.json +++ b/coverage/.resultset.json @@ -1,42 +1,50 @@ { "MiniTest": { "coverage": { - "/Users/sairagul/code/Week11/betsy/app/helpers/application_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/application_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/categories_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/categories_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/main_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/main_helper.rb": [ 1, + 1, + 0, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/merchants_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/merchants_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/order_products_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/order_products_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/orders_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/orders_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/products_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/products_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/helpers/reviews_helper.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/helpers/reviews_helper.rb": [ 1, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/categories_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/categories_controller.rb": [ + 1, + 1, + null, 1, + null, 1, null, + null, 1, 2, 2, @@ -52,9 +60,13 @@ 1, null, null, + null, + 1, + 1, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/application_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/application_controller.rb": [ 1, 1, null, @@ -67,9 +79,47 @@ 7, null, null, + null, + 1, + 20, + null, + 20, + 3, + null, + null, + null, + 1, + 12, + 5, + 5, + 5, + null, + null, + null, + 1, + 6, + 2, + 2, + 2, + 2, + null, + null, + null, + null, + 1, + 6, + 6, + 1, + null, + 6, + 2, + 2, + 2, + null, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/main_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/main_controller.rb": [ 1, null, 1, @@ -77,9 +127,21 @@ 1, null, null, + 1, + 0, + 0, + null, + 0, + 0, + 0, + null, + null, + 1, + 0, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/merchants_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/merchants_controller.rb": [ 1, 1, 31, @@ -105,8 +167,8 @@ null, null, 1, - 1, - 1, + 2, + 2, null, null, null, @@ -188,7 +250,7 @@ null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/order_products_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/order_products_controller.rb": [ 1, 1, 1, @@ -233,21 +295,28 @@ null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/orders_controller.rb": [ - 1, + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/orders_controller.rb": [ 1, + null, 1, + null, 1, 0, + 0, + null, + 1, null, null, null, 1, + null, 1, null, null, 1, + null, 2, + null, 2, 1, 1, @@ -261,10 +330,12 @@ null, null, 1, + null, 2, null, null, 1, + null, 2, 1, 1, @@ -278,6 +349,7 @@ null, null, 1, + null, 3, 2, 2, @@ -289,19 +361,23 @@ 1, null, 1, + null, 3, null, null, 1, + null, 7, 7, 3, null, 7, null, + null, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/products_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/products_controller.rb": [ 1, null, 1, @@ -314,6 +390,10 @@ 1, 6, 4, + 0, + 0, + null, + 4, 4, 6, 2, @@ -321,6 +401,7 @@ 2, null, null, + null, 2, 2, null, @@ -382,10 +463,6 @@ null, null, 1, - 1, - null, - null, - 1, 2, null, 2, @@ -402,27 +479,11 @@ 1, null, 1, - 21, - null, - 21, - 3, - null, - null, - null, - 1, - 12, - 5, - 5, - 5, - null, - null, - null, - 1, 5, null, null ], - "/Users/sairagul/code/Week11/betsy/app/controllers/reviews_controller.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/controllers/reviews_controller.rb": [ 1, 1, 1, @@ -484,43 +545,21 @@ 2, null, null, - null, - 1, - 6, - 2, - 2, - null, - 2, - null, - null, - null, - 1, - 6, - 6, - 1, - null, - 6, - 2, - 2, - null, - 2, - null, - null, null ], - "/Users/sairagul/code/Week11/betsy/app/models/category.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/category.rb": [ 1, 1, null, 1, null ], - "/Users/sairagul/code/Week11/betsy/app/models/application_record.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/application_record.rb": [ 1, 1, null ], - "/Users/sairagul/code/Week11/betsy/app/models/merchant.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/merchant.rb": [ 1, 1, 1, @@ -545,15 +584,25 @@ null, null ], - "/Users/sairagul/code/Week11/betsy/app/models/order_product.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/order_product.rb": [ 1, 1, 1, null, 1, + null, + 1, + 0, + null, + null, + 1, + 0, + 0, + null, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/models/order.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/order.rb": [ 1, 1, 1, @@ -561,9 +610,17 @@ null, 1, 1, + null, + 1, + 0, + 0, + 0, + null, + 0, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/models/product.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/product.rb": [ 1, 1, 1, @@ -596,38 +653,40 @@ null, null ], - "/Users/sairagul/code/Week11/betsy/app/models/review.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/models/review.rb": [ 1, 1, 1, null, 1, + 1, + null, null ], - "/Users/sairagul/code/Week11/betsy/app/channels/application_cable/channel.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/channels/application_cable/channel.rb": [ 0, 0, 0, 0 ], - "/Users/sairagul/code/Week11/betsy/app/channels/application_cable/connection.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/channels/application_cable/connection.rb": [ 0, 0, 0, 0 ], - "/Users/sairagul/code/Week11/betsy/app/jobs/application_job.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/jobs/application_job.rb": [ 0, 0 ], - "/Users/sairagul/code/Week11/betsy/app/mailers/application_mailer.rb": [ + "/Users/roxanneagerone/Ada/week_10/betsy/app/mailers/application_mailer.rb": [ 0, 0, 0, 0 ] }, - "timestamp": 1508794083 + "timestamp": 1508878600 }, "Unit Tests": { "coverage": { diff --git a/coverage/index.html b/coverage/index.html index 39445c1ff4..da5cc63364 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -14,27 +14,27 @@ loading

    diff --git a/config/routes.rb b/config/routes.rb index 908f571449..b03bd58e8d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,5 +30,9 @@ get '/home', to: 'merchants#summary', as: 'self_summary' get '/pending', to: 'merchants#pending', as: 'self_pending' get '/completed', to: 'merchants#completed', as: 'self_completed' + get '/revenue', to: 'merchants#revenue', as: 'self_revenue' + get '/inventory', to: 'merchants#inventory', as: 'self_inventory' + get '/mark_shipped/:id', to: 'merchants#mark_shipped', as: 'mark_shipped' + end From 395f8ea5cf0ad9c7068058e569dc1e377b760d76 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 19:24:34 -0700 Subject: [PATCH 229/348] decrement of products when an order is made completed --- app/controllers/orders_controller.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 375a119e85..a76d0c9480 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -21,6 +21,7 @@ def create @order.order_products += OrderProduct.find_in_cart(session[:cart]) if @order.save + decrement_products session[:cart] = nil flash[:status] = :success flash[:message] = "Successfully created order" @@ -78,5 +79,14 @@ def find_order_by_params_id return @order end + def decrement_products + @order.order_products.each do |order_product| + quantity = order_product.quantity + product = Product.find(order_product.product_id) + product.quantity -= quantity + product.save + end + end + # confirm if the order belongs to the merchant (buyer) end From 63b9bf6f02436b271b9fbecdf1e388218d47d07c Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 19:29:41 -0700 Subject: [PATCH 230/348] added ruby version --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 0173e06114..64f2c86972 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,7 @@ gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby gem 'simplecov', :require => false, :group => :test +ruby '2.3.4' # Use CoffeeScript for .coffee assets and views # gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks From 6cdf6042ab5b1f5e6fd6dcf30b43076445293913 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 19:39:09 -0700 Subject: [PATCH 231/348] added Procfile --- Gemfile | 4 +++- Procfile | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 Procfile diff --git a/Gemfile b/Gemfile index 64f2c86972..dca75e37be 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,9 @@ gem 'uglifier', '>= 1.3.0' # See https://github.com/rails/execjs#readme for more supported runtimes # gem 'therubyracer', platforms: :ruby gem 'simplecov', :require => false, :group => :test + + +#added these gems because the terminal told me to ruby '2.3.4' # Use CoffeeScript for .coffee assets and views # gem 'coffee-rails', '~> 4.2' @@ -40,7 +43,6 @@ group :development, :test do gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] # Adds support for Capybara system testing and selenium driver gem 'capybara', '~> 2.13' - gem 'pry-rails' gem 'selenium-webdriver' end diff --git a/Procfile b/Procfile new file mode 100644 index 0000000000..c2c566e8cc --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: bundle exec puma -C config/puma.rb From 375effdc2f29c31e6d4bd301daa523f5894d011b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 19:42:09 -0700 Subject: [PATCH 232/348] formatting --- test/controllers/products_controller_test.rb | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 94885db14e..7401e896d8 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -255,7 +255,7 @@ must_respond_with :found end - it 'CANNOT successfully create valid product' do + it 'CANNOT create valid product' do post products_path(prod.id), params: good_params flash[:status].must_equal :failure @@ -283,13 +283,11 @@ must_respond_with :found end - describe 'add_categories' do - it 'CANNOT access add categories page' do - get add_categories_path(owned_product.id) + it 'CANNOT access add categories page' do + get add_categories_path(owned_product.id) - must_respond_with :found - flash[:status].must_equal :failure - end + must_respond_with :found + flash[:status].must_equal :failure end end end From 1e043563e0235306b123e59a0bf3e8c37dad1e31 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 19:52:08 -0700 Subject: [PATCH 233/348] not really any changes --- Gemfile | 2 +- Gemfile.lock | 3 +++ app/controllers/orders_controller.rb | 12 ++++++------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index dca75e37be..5147ef0a48 100644 --- a/Gemfile +++ b/Gemfile @@ -21,7 +21,7 @@ gem 'simplecov', :require => false, :group => :test #added these gems because the terminal told me to -ruby '2.3.4' +ruby '2.4.0' # Use CoffeeScript for .coffee assets and views # gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks diff --git a/Gemfile.lock b/Gemfile.lock index 4d79ccae03..504cf3e28f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -264,5 +264,8 @@ DEPENDENCIES uglifier (>= 1.3.0) web-console (>= 3.3.0) +RUBY VERSION + ruby 2.4.0p0 + BUNDLED WITH 1.16.0.pre.3 diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index a76d0c9480..6c0b0d961f 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -80,12 +80,12 @@ def find_order_by_params_id end def decrement_products - @order.order_products.each do |order_product| - quantity = order_product.quantity - product = Product.find(order_product.product_id) - product.quantity -= quantity - product.save - end + @order.order_products.each do |order_product| + quantity = order_product.quantity + product = Product.find(order_product.product_id) + product.quantity -= quantity + product.save + end end # confirm if the order belongs to the merchant (buyer) From 6b22af2f79c0c81b74cdb152d8632c0599573aa7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 20:00:58 -0700 Subject: [PATCH 234/348] redirect tests for products#update --- app/controllers/products_controller.rb | 6 +++++- test/controllers/products_controller_test.rb | 15 +++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 965ba3650a..a2c154c3bd 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -65,7 +65,11 @@ def update if result flash.now[:status] = :success flash.now[:message] = "Successfully updated #{@product.name}" - return redirect_to product_path(@product.id) + if request.referer.include?'inventory' + return redirect_to self_inventory_path + else + return redirect_to product_path(@product.id) + end else flash.now[:status] = :failure flash.now[:message] = "Could not update product" diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 7401e896d8..69a2d84725 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -110,12 +110,23 @@ end describe 'update' do - it 'can successfully update own product with valid data' do - patch product_path(owned_product.id), params: new_params + it 'can successfully update own product & redirect to product show page with valid data' do + patch product_path(owned_product.id), params: new_params, headers: { "HTTP_REFERER" => edit_product_path(owned_product.id) } id = owned_product.id Product.find(id).name.must_equal "Updated Name" flash[:status].must_equal :success + must_redirect_to product_path + must_respond_with :found + end + + it 'redirects to inventory path if coming from inventory management page' do + patch product_path(owned_product.id), params: new_params, headers: { "HTTP_REFERER" => self_inventory_path } + id = owned_product.id + + Product.find(id).name.must_equal "Updated Name" + flash[:status].must_equal :success + must_redirect_to self_inventory_path must_respond_with :found end From 918ac9d2c26089765f5508059ca93e341f853b81 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 20:07:03 -0700 Subject: [PATCH 235/348] fix formatting issues, add 'account home' button to nav bar --- app/assets/stylesheets/merchants.scss | 6 +++++- app/views/layouts/application.html.erb | 5 +++-- app/views/merchants/inventory.html.erb | 4 +++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index abd5e171d5..961d8853b0 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -42,7 +42,7 @@ // INVENTORY // /////////////// -.info > div { +.inventory-info > div { margin: 2rem 0; overflow-x: hidden; white-space: nowrap; @@ -58,3 +58,7 @@ input.inventory-form { display: inline-block; width: 50%; } + +.new-product-button { + margin: 3rem 0; +} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d0f1074ce7..110968a2c3 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -23,8 +23,9 @@ <%= link_to "Shopping Cart", shopping_cart_path, class: "button" %> <% if session[:merchant] %> <%= link_to "Sell", new_product_path, class: "button" %> - <%= link_to "Sold items", merchant_sold_index_path(session[:merchant]['id']), class: "button" %> - <%= link_to "Purchased Items", merchant_orders_path(session[:merchant]['id']), class: "button" %> + <%= link_to "Account Home", self_summary_path, class: "button" %> + <%# link_to "Sold items", merchant_sold_index_path(session[:merchant]['id']), class: "button" %> + <%# link_to "Purchased Items", merchant_orders_path(session[:merchant]['id']), class: "button" %> <%= link_to "Sign Out", logout_path, class: "button" %> <% else %> diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index 8a73ae93a2..7a297120a1 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -12,7 +12,7 @@
    > - +

    <%= product.name %>

    @@ -34,3 +34,5 @@ <% end %> <% end %> + +<%= link_to "Sell A New Product", new_product_path, class: 'button new-product-button' %> From 56abaf0ca4c0aaf7d7e8819dff571255e57aa8e8 Mon Sep 17 00:00:00 2001 From: sairagula Date: Tue, 24 Oct 2017 20:42:38 -0700 Subject: [PATCH 236/348] Edit working for Review --- app/controllers/reviews_controller.rb | 18 ++++++++++-------- app/views/reviews/_review_form.html.erb | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index fb62a3717c..1bdabca45b 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -11,6 +11,7 @@ class ReviewsController < ApplicationController def new @review = Review.new + @review.product_id = params[:product_id] end def create @@ -18,10 +19,8 @@ def create if @review.save flash[:status] = :success flash[:message] = "Successfully created review " - # binding.pry redirect_to product_path(@review.product) else - binding.pry flash[:status] = :failure flash[:message] = "Failed to create review" render :new, status: :bad_request @@ -32,20 +31,23 @@ def edit ; end def update @review.update_attributes(review_params) - if @review.save + result = @review.save + if result flash[:status] = :success flash[:message] = "Successfully created review " redirect_to product_path(@review.product_id) else - render :edit, status: :bad_request - return + flash.now[:status] = :failure + flash.now[:message] = "Could not update the review" + flash.now[:details] = @review.errors.messages + return render :edit, status: :bad_request end end def destroy @review.destroy flash[:status] = :success - flash[:result_text] = "Successfully destroyed review" + flash[:message] = "Successfully destroyed review" redirect_to product_path(@review.product_id) end @@ -65,7 +67,7 @@ def find_review_by_params_id def check_for_product_owner if !session[:merchant].nil? && @review.merchant_id == session[:merchant]["id"] flash[:status] = :failure - flash[:result_text] = "Owner can not edit the review of the product!" + flash[:message] = "Owner can not edit the review of the product!" redirect_to product_path(@review.product_id) end end @@ -77,7 +79,7 @@ def check_for_product_owner_nested end if !session[:merchant].nil? && @product.merchant_id == session[:merchant]["id"] flash[:status] = :failure - flash[:result_text] = "Owner can not review the product!" + flash[:message] = "Owner can not review the product!" redirect_to product_path(@product) end end diff --git a/app/views/reviews/_review_form.html.erb b/app/views/reviews/_review_form.html.erb index dc452263fe..349aaf31cc 100644 --- a/app/views/reviews/_review_form.html.erb +++ b/app/views/reviews/_review_form.html.erb @@ -1,11 +1,11 @@ <%= form_for @review do |f| %> <%= f.label :rating %> - <%= f.select :rating, options_for_select([1, 2, 3, 4, 5]) %> + <%= f.select :rating, options_for_select([1, 2, 3, 4, 5], :selected => @review.rating) %> <%= f.label :description %> <%= f.text_field :description %> - <%= f.hidden_field :product_id, value: params[:product_id] %> + <%= f.hidden_field :product_id, value: @review.product_id %> <%= f.submit button, class: 'button' %> <% end %> From 51aa5b0ac98c4f4b77cb302dc5b3487b4200f0e9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 20:51:29 -0700 Subject: [PATCH 237/348] user page tests, duckify application controller methods --- app/controllers/application_controller.rb | 12 ++-- app/controllers/categories_controller.rb | 8 ++- app/controllers/merchants_controller.rb | 2 +- app/controllers/products_controller.rb | 8 ++- test/controllers/merchants_controller_test.rb | 64 +++++++++++++++++++ 5 files changed, 83 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f050ae0c04..268b40951e 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -11,19 +11,19 @@ def confirm_login end end - def find_product_by_params - @product = Product.find_by(id: params[:id]) + def find_object_by_params(model) + @product = model.find_by(id: params[:id]) unless @product return head :not_found end end - def confirm_product_ownership - unless session[:merchant]['id'] == @product.merchant_id + def confirm_object_ownership(model) + unless session[:merchant]['id'] == model.merchant_id flash[:status] = :failure - flash[:message] = "Only a product's merchant can modify a product." - return redirect_back(fallback_location: products_path) + flash[:message] = "Only a #{model}'s merchant can modify a #{model}." + return redirect_back(fallback_location: send("#{model.class.to_s.downcase}_path")) end end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index f768d321ce..f5f4b4fe32 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,9 +1,13 @@ class CategoriesController < ApplicationController before_action :confirm_login - before_action :find_product_by_params, only: [:add] + before_action only: [:add] do + find_object_by_params(Product) + end - before_action :confirm_product_ownership, only: [:add] + before_action only: [:add] do + confirm_object_ownership(@product) + end def create diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 7b676fa156..f744a61ec1 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,6 +1,6 @@ class MerchantsController < ApplicationController - before_action :confirm_login, only: [:summary] + before_action :confirm_login, only: [:summary, :pending, :completed, :mark_shipped, :revenue, :inventory] def login auth_hash = request.env['omniauth.auth'] diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a2c154c3bd..0fe530a303 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,10 +1,14 @@ class ProductsController < ApplicationController - before_action :find_product_by_params, only: [:show, :edit, :update, :destroy, :categories, :add_categories] + before_action only: [:show, :edit, :update, :destroy, :categories, :add_categories] do + find_object_by_params(Product) + end before_action :confirm_login, except: [:index, :show] - before_action :confirm_product_ownership, only: [:edit, :update, :destroy, :categories, :add_categories] + before_action only: [:edit, :update, :destroy, :categories, :add_categories] do + confirm_object_ownership(@product) + end def index diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 7109ad2b52..f4d6e21dcc 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -185,4 +185,68 @@ merchant.username.wont_equal invalid_merchant_data[:merchant][:username] end end + + describe "user pages" do + describe "logged in" do + before do + user = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + get login_path(:github) + end + + it 'logged in user can access summary' do + get self_summary_path + + must_respond_with :success + end + + it 'logged in user can access pending' do + get self_pending_path + + must_respond_with :success + end + + it 'logged in user can access completed' do + get self_completed_path + + must_respond_with :success + end + + it 'logged in user can access revenue' do + get self_summary_path + + must_respond_with :success + end + + it 'logged in user can access inventory' do + get self_summary_path + + must_respond_with :success + end + + describe 'mark_shipped' do + it 'changes the status of an existing product owned by the user' do + + end + + it 'returns not_found if product does not exist' do + + end + + it 'redirects without changing if product does not belong to user' do + + end + end + end + + describe "guests" do + it 'guest user cannot access summary' do + get self_summary_path + + must_respond_with :found + end + + + end + end end From f508f46e5398d1785675ca5dcb591a59d6376e64 Mon Sep 17 00:00:00 2001 From: sairagula Date: Tue, 24 Oct 2017 20:52:33 -0700 Subject: [PATCH 238/348] Working on testing coverage --- test/controllers/reviews_controller_test.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index e2ab01caa9..0a654171c6 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -33,6 +33,9 @@ # end describe "new" do + it " should not work if product doesn't exist" do + + end it " should work for a non-user" do logout_test_user From 055fff7c48326aef05b40fa1cb0da78b8687fe43 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 20:56:48 -0700 Subject: [PATCH 239/348] use duckified controller filters --- app/controllers/application_controller.rb | 1 + app/controllers/merchants_controller.rb | 17 +++++++---------- app/controllers/products_controller.rb | 1 - 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 268b40951e..827fe2597a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -17,6 +17,7 @@ def find_object_by_params(model) unless @product return head :not_found end + return @product end def confirm_object_ownership(model) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index f744a61ec1..a77d631742 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -106,16 +106,13 @@ def completed end def mark_shipped - order_product = OrderProduct.find_by(id: params[:id]) - if order_product - order_product.status = "shipped" - order_product.save - flash[:status] = :success - flash[:message] = "Marked #{order_product.product.name} as shipped" - return redirect_to self_pending_path - else - return head :not_found - end + @order_product = find_object_by_params(OrderProduct) + confirm_object_ownership(@order_product) + @order_product.status = "shipped" + @order_product.save + flash[:status] = :success + flash[:message] = "Marked #{@order_product.product.name} as shipped" + return redirect_to self_pending_path end def revenue diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0fe530a303..d492f774cb 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -10,7 +10,6 @@ class ProductsController < ApplicationController confirm_object_ownership(@product) end - def index if params[:category_id] if params[:category_id] == 'all' From 497003812e00650c8387e6ec81dfce9b251352bf Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 21:30:12 -0700 Subject: [PATCH 240/348] orders decrement the products in the model --- app/controllers/orders_controller.rb | 12 +----------- app/models/order.rb | 9 +++++++++ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 6c0b0d961f..81405414c2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -21,7 +21,7 @@ def create @order.order_products += OrderProduct.find_in_cart(session[:cart]) if @order.save - decrement_products + @order.decrement_products session[:cart] = nil flash[:status] = :success flash[:message] = "Successfully created order" @@ -78,15 +78,5 @@ def find_order_by_params_id end return @order end - - def decrement_products - @order.order_products.each do |order_product| - quantity = order_product.quantity - product = Product.find(order_product.product_id) - product.quantity -= quantity - product.save - end - end - # confirm if the order belongs to the merchant (buyer) end diff --git a/app/models/order.rb b/app/models/order.rb index 0463a4f537..1cda4caf8c 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -24,4 +24,13 @@ def quantity_check end end end + + def decrement_products + order_products.each do |order_product| + quantity = order_product.quantity + product = Product.find(order_product.product_id) + product.quantity -= quantity + product.save + end + end end From 69ff5d23be56301f72f619c8252a71f9d48923d3 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 21:32:21 -0700 Subject: [PATCH 241/348] fixes to controller filters --- Gemfile | 2 +- app/controllers/application_controller.rb | 17 +++++++++++++---- app/controllers/categories_controller.rb | 2 +- app/controllers/merchants_controller.rb | 13 ++++++++++--- app/controllers/products_controller.rb | 2 +- test/controllers/merchants_controller_test.rb | 7 +++++++ test/fixtures/order_products.yml | 1 + 7 files changed, 34 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 5147ef0a48..5dc9e41e0a 100644 --- a/Gemfile +++ b/Gemfile @@ -44,6 +44,7 @@ group :development, :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '~> 2.13' gem 'selenium-webdriver' + gem 'pry-rails' end group :development do @@ -63,7 +64,6 @@ gem 'jquery-turbolinks' gem 'foundation-rails', '6.4.1.2' group :development do gem 'better_errors' - gem 'pry-rails' gem 'binding_of_caller' end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 827fe2597a..bbd5881114 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -13,18 +13,17 @@ def confirm_login def find_object_by_params(model) @product = model.find_by(id: params[:id]) - unless @product return head :not_found end return @product end - def confirm_object_ownership(model) - unless session[:merchant]['id'] == model.merchant_id + def confirm_object_ownership(model, merchant_id) + unless session[:merchant]['id'] == merchant_id flash[:status] = :failure flash[:message] = "Only a #{model}'s merchant can modify a #{model}." - return redirect_back(fallback_location: send("#{model.class.to_s.downcase}_path")) + return redirect_back(fallback_location: pathfinder(model.class)) end end @@ -49,4 +48,14 @@ def check_for_product_owner_nested redirect_to product_path(@product) end end + + private + def pathfinder(model) + case model + when Product + return products_path + else + return root_path + end + end end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index f5f4b4fe32..d8ce5096ee 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -6,7 +6,7 @@ class CategoriesController < ApplicationController end before_action only: [:add] do - confirm_object_ownership(@product) + confirm_object_ownership(@product, @product.merchant_id) end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index a77d631742..46f5b5629a 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -2,6 +2,15 @@ class MerchantsController < ApplicationController before_action :confirm_login, only: [:summary, :pending, :completed, :mark_shipped, :revenue, :inventory] + before_action only: [:mark_shipped] do + @order_product = find_object_by_params(OrderProduct) + end + + before_action only: [:mark_shipped] do + confirm_object_ownership(@order_product, @order_product.product.merchant_id) + end + + def login auth_hash = request.env['omniauth.auth'] merchant = Merchant.find_by(oauth_uid: auth_hash['uid'], oauth_provider: auth_hash['provider']) @@ -106,10 +115,8 @@ def completed end def mark_shipped - @order_product = find_object_by_params(OrderProduct) - confirm_object_ownership(@order_product) @order_product.status = "shipped" - @order_product.save + @order_product.save! flash[:status] = :success flash[:message] = "Marked #{@order_product.product.name} as shipped" return redirect_to self_pending_path diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d492f774cb..2e3f4c8254 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -7,7 +7,7 @@ class ProductsController < ApplicationController before_action :confirm_login, except: [:index, :show] before_action only: [:edit, :update, :destroy, :categories, :add_categories] do - confirm_object_ownership(@product) + confirm_object_ownership(@product, @product.merchant_id) end def index diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index f4d6e21dcc..262b18b325 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -226,11 +226,18 @@ describe 'mark_shipped' do it 'changes the status of an existing product owned by the user' do + op_id = order_products(:order_products).id + get mark_shipped_path(op_id) + must_respond_with :found + flash[:status].must_equal :success + OrderProduct.find(op_id).status.must_equal "shipped" end it 'returns not_found if product does not exist' do + get mark_shipped_path(OrderProduct.last.id + 1) + must_respond_with :not_found end it 'redirects without changing if product does not belong to user' do diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index b082f40af6..4813239b03 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -9,3 +9,4 @@ order_products: quantity: 6 product: mermaid_fin order: order + status: pending From 8254251bdb5454b052cadd01aa42602d340398b1 Mon Sep 17 00:00:00 2001 From: sairagula Date: Tue, 24 Oct 2017 21:35:07 -0700 Subject: [PATCH 242/348] 100% coverage for controller review --- test/controllers/reviews_controller_test.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 0a654171c6..a1011afc14 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -5,7 +5,6 @@ let(:mermaid_fin) { products(:mermaid_fin) } - ######### Leaving for future, if we rethink and decide to add later # describe "index" do # it "returns success status for all reviews" do @@ -34,7 +33,10 @@ describe "new" do it " should not work if product doesn't exist" do + bad_product = Product.last.id + 1 + get new_product_review_path(bad_product) + must_respond_with :not_found end it " should work for a non-user" do @@ -58,6 +60,7 @@ describe "create" do + # We are already checking "new" method for owenership # it "should return failure if product belongs to merchant " do # # arrange: login 'ada' user # login_test_user From 89215b3e40fe75347a14db8f0235f74fc0fc75c6 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 21:38:30 -0700 Subject: [PATCH 243/348] guest user tests for user pages --- test/controllers/merchants_controller_test.rb | 36 +++++++++++++++++++ test/fixtures/order_products.yml | 6 ++++ test/fixtures/orders.yml | 11 +++++- 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 262b18b325..2817f0fbee 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -241,7 +241,12 @@ end it 'redirects without changing if product does not belong to user' do + op_id = order_products(:other_order_products).id + get mark_shipped_path(op_id) + must_respond_with :found + flash[:status].must_equal :failure + OrderProduct.find(op_id).status.wont_equal "shipped" end end end @@ -253,7 +258,38 @@ must_respond_with :found end + it 'guest user cannot access pending' do + get self_pending_path + + must_respond_with :found + end + + it 'guest user cannot access completed' do + get self_completed_path + + must_respond_with :found + end + + it 'guest user cannot access revenue' do + get self_summary_path + + must_respond_with :found + end + + it 'guest user cannot access inventory' do + get self_summary_path + + must_respond_with :found + end + + it 'guest user cannot access mark_shipped' do + op_id = order_products(:order_products).id + get mark_shipped_path(op_id) + must_respond_with :found + flash[:status].must_equal :failure + OrderProduct.find(op_id).status.wont_equal "shipped" + end end end end diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index 4813239b03..adfd57706a 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -10,3 +10,9 @@ order_products: product: mermaid_fin order: order status: pending + +other_order_products: + quantity: 3 + product: wand + order: order + status: pending diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index acfbdde410..764696f1be 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -8,4 +8,13 @@ order: cust_cc_exp: 11/22 cust_addr: Sea World cust_email: forkhair@mermaid.com - status: complete + status: pending + +other_order: + cust_name: Demon + merchant_id: :grace + cust_cc: 5432314 + cust_cc_exp: 66/66 + cust_addr: Fire World + cust_email: flameshair@mermaid.com + status: pending From 78d5b0636f9d952d5007367d2e98a0b058e334a0 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Tue, 24 Oct 2017 21:39:42 -0700 Subject: [PATCH 244/348] changes --- app/controllers/orders_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 81405414c2..084b842d2c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -22,6 +22,7 @@ def create if @order.save @order.decrement_products + binding.pry session[:cart] = nil flash[:status] = :success flash[:message] = "Successfully created order" From e0a82e447db8d56f1551348e20643f1db9f2f891 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Tue, 24 Oct 2017 21:48:54 -0700 Subject: [PATCH 245/348] Products with quantity of 0 will not display on product lists --- app/controllers/products_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a2c154c3bd..198154bad8 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -25,6 +25,7 @@ def index @title = "Popular Now" @products = Product.most_popular end + @products = @products.reject {|prod| prod.quantity == 0} @categories = Category.all end From 89b441c871fa949e5d34653ceab9091bc1674e98 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 00:14:21 -0700 Subject: [PATCH 246/348] fixing tests and fixtures --- Gemfile | 2 +- test/controllers/merchants_controller_test.rb | 68 +++++++++++++++++++ test/fixtures/order_products.yml | 11 ++- test/models/merchant_test.rb | 8 +-- test/models/order_product_test.rb | 6 +- 5 files changed, 85 insertions(+), 10 deletions(-) diff --git a/Gemfile b/Gemfile index 5147ef0a48..0482ee9184 100644 --- a/Gemfile +++ b/Gemfile @@ -34,7 +34,7 @@ gem 'jbuilder', '~> 2.5' # gem 'bcrypt', '~> 3.1.7' gem "omniauth" gem "omniauth-github" - +gem 'pry-rails' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 7109ad2b52..fc04ee5282 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -185,4 +185,72 @@ merchant.username.wont_equal invalid_merchant_data[:merchant][:username] end end + + describe "summary" do + it "responds with success with the given path" do + merchant = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get self_summary_path + must_respond_with :found + + end + end + + describe "pending" do + it "responds with success with the given path" do + merchant = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get login_path(:github) + get self_pending_path + must_respond_with :success + end + end + + describe "completed" do + it "responds with success in the given path" do + merchant = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get login_path(:github) + get self_completed_path + must_respond_with :success + end + end + + describe "mark-shipped" do + it "responds with success upon completion" do + merchant = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get login_path(:github) + op = order_products(:one) + get mark_shipped_path(op) + must_respond_with :found + + op.status.must_equal "shipped" + must_redirect_to self_pending_path + must_respond_with :success + flash[:status].must_include "Marked #{op.product.name} as shipped" + end + + end + + describe "revenue" do + it "responds with success upon completion" do + merchant = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get login_path(:github) + get self_revenue_path + must_respond_with :success + end + end + + describe "inventory" do + it "responds with success upon completion" do + merchant = merchants(:ada) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + get login_path(:github) + get self_inventory_path + must_respond_with :success + end + end + end diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index b082f40af6..c43ab616f4 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -5,7 +5,14 @@ # below each fixture, per the syntax in the comments below -order_products: - quantity: 6 +one: + quantity: 2 product: mermaid_fin order: order + status: pending + +two: + quantity: 3 + product: mermaid_fin + order: order + status: shipped diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1444e9a158..f22ff95b31 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -70,7 +70,7 @@ end describe 'relationships' do - it "has a list of products" do + it "has a list of order_products" do mermaid_fin = merchants(:ada) mermaid_fin.must_respond_to :products mermaid_fin.products.each do |product| @@ -87,9 +87,9 @@ end it "has a list of orders" do - order = merchants(:ada) - order.must_respond_to :orders - order.orders.each do |order| + merchant = merchants(:ada) + merchant.must_respond_to :orders + merchant.orders.each do |order| order.must_be_kind_of Order end end diff --git a/test/models/order_product_test.rb b/test/models/order_product_test.rb index 6956ef6aa7..4a254a568e 100644 --- a/test/models/order_product_test.rb +++ b/test/models/order_product_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe OrderProduct do - let(:order_product) { order_products(:order_products)} + let(:order_product) { order_products(:one)} describe "validations" do describe "quantity" do @@ -20,7 +20,7 @@ describe "relationships" do it "has a product" do - b = order_products(:order_products) + b = order_products(:one) a = products(:mermaid_fin) b.must_respond_to :product @@ -29,7 +29,7 @@ end it "has an order" do - b = order_products(:order_products) + b = order_products(:one) a = orders(:order) b.must_respond_to :order From 88bb7e6df4e48e7fbaaee8ce8e8fffed284c8e74 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 08:07:25 -0700 Subject: [PATCH 247/348] making html tag classes the same --- app/views/merchants/_list-merchant-products.html.erb | 2 +- app/views/merchants/completed.html.erb | 4 ++-- app/views/merchants/inventory.html.erb | 6 +++--- app/views/merchants/pending.html.erb | 4 ++-- app/views/merchants/revenue.html.erb | 7 +++++-- app/views/merchants/show.html.erb | 4 ++-- app/views/merchants/summary.html.erb | 9 +++++---- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/app/views/merchants/_list-merchant-products.html.erb b/app/views/merchants/_list-merchant-products.html.erb index d32489240c..917c2d57ad 100644 --- a/app/views/merchants/_list-merchant-products.html.erb +++ b/app/views/merchants/_list-merchant-products.html.erb @@ -4,7 +4,7 @@

    This merchant has no products.

    <% else %> <% products.each do |product| %> -
    +
    <%= link_to product_path(product.id) do %>
    diff --git a/app/views/merchants/completed.html.erb b/app/views/merchants/completed.html.erb index 14f1a77a45..8023184df0 100644 --- a/app/views/merchants/completed.html.erb +++ b/app/views/merchants/completed.html.erb @@ -1,4 +1,4 @@ -

    Completed Orders

    +

    Completed Orders

    <% if @order_products.empty? %>
    @@ -11,7 +11,7 @@ > -
    +

    <%= op.product.name %>

    Quantity: <%= op.quantity %>

    Price: <%= money(op.product.price) %>

    diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index 7a297120a1..3771d5e7f4 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -1,4 +1,4 @@ -

    Inventory Management

    +

    Inventory Management

    <% if @products.empty? %>
    @@ -11,9 +11,9 @@ <%= form_for product do |f| %>
    - > + > -
    +

    <%= product.name %>

    diff --git a/app/views/merchants/pending.html.erb b/app/views/merchants/pending.html.erb index 52fa568d13..ce752792bc 100644 --- a/app/views/merchants/pending.html.erb +++ b/app/views/merchants/pending.html.erb @@ -1,4 +1,4 @@ -

    Pending Orders

    +

    Pending Orders

    <% if @order_products.empty? %>
    @@ -11,7 +11,7 @@ > -
    +

    <%= op.product.name %>

    Quantity: <%= op.quantity %>

    Price: <%= money(op.product.price) %>

    diff --git a/app/views/merchants/revenue.html.erb b/app/views/merchants/revenue.html.erb index b2c8147088..4c012f37bc 100644 --- a/app/views/merchants/revenue.html.erb +++ b/app/views/merchants/revenue.html.erb @@ -1,13 +1,16 @@ -

    Earnings Details

    +

    Earnings Details

    Total Revenue to Date: <%= money(@user.total_revenue) %>

    +

    Completed Orders:

    Completed Orders: <%= @completed.count %>

    Income: <%= money(@completed.sum{|order| order.total}) %>

    Average Income Per Order: <%= money((@completed.sum{|order| order.total})/@completed.count) %>

    - +
    +

    Pending Orders:

    Pending Orders: <%= @pending.count %>

    Income: <%= money(@pending.sum{|order| order.total}) %>

    Average Income Per Order: <%= money((@pending.sum{|order| order.total})/@pending.count) %>

    +
    diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 62e6b70992..a79328b133 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -1,7 +1,7 @@ -

    <%=@merchant.username%>

    +

    <%=@merchant.username%>

    Contact Merchant

    Products

    -
    +
    <%= render partial: "list-merchant-products", locals: {products: @merchant.products} %>
    diff --git a/app/views/merchants/summary.html.erb b/app/views/merchants/summary.html.erb index 415c8341c4..2e5fa9c7b8 100644 --- a/app/views/merchants/summary.html.erb +++ b/app/views/merchants/summary.html.erb @@ -1,15 +1,16 @@ -

    Welcome, <%= @user.username %>!

    +

    Welcome, <%= @user.username %>!

    -
    +
    +

    Pending Orders

    <%= @user.pending_orders.count %> <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %>
    -
    +

    Currently Selling

    <%= @user.active_products.count %> @@ -20,7 +21,7 @@
    -
    +

    Completed Orders

    <%= @user.shipped_orders.count %> <%= link_to "Completed Orders", self_completed_path, class: 'button profile-button' %> From de88c08d7219f71ea387a49a9340811bed97d1e7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 09:21:26 -0700 Subject: [PATCH 248/348] fix model overwrite method --- app/controllers/products_controller.rb | 8 ++++++-- app/models/merchant.rb | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 198154bad8..0955bc8c4f 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,10 +1,14 @@ class ProductsController < ApplicationController - before_action :find_product_by_params, only: [:show, :edit, :update, :destroy, :categories, :add_categories] + before_action only: [:show, :edit, :update, :destroy, :categories, :add_categories] do + find_object_by_params(Product) + end before_action :confirm_login, except: [:index, :show] - before_action :confirm_product_ownership, only: [:edit, :update, :destroy, :categories, :add_categories] + before_action only: [:edit, :update, :destroy, :categories, :add_categories] do + confirm_object_ownership(@product, @product.merchant_id) + end def index diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 73a430dbfb..5b8314d399 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -21,7 +21,7 @@ def self.by_auth_hash(auth_hash) merchant end - def order_items + def own_orders OrderProduct.all.find_all {|op| op.product.merchant_id == id && op.order != nil} end From fbebfa318fb0a11ee952c4ef12e8ce4281a0f3fb Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 09:26:15 -0700 Subject: [PATCH 249/348] update dependent model methods, fix typo in account summary page --- app/models/merchant.rb | 4 ++-- app/views/merchants/summary.html.erb | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 5b8314d399..a3058f5cb6 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -26,11 +26,11 @@ def own_orders end def pending_orders - orders.find_all { |o| o.status == "pending" } + own_orders.find_all { |o| o.status == "pending" } end def shipped_orders - orders.find_all { |o| o.status == "shipped" } + own_orders.find_all { |o| o.status == "shipped" } end def total_revenue diff --git a/app/views/merchants/summary.html.erb b/app/views/merchants/summary.html.erb index 2e5fa9c7b8..e0f12efebb 100644 --- a/app/views/merchants/summary.html.erb +++ b/app/views/merchants/summary.html.erb @@ -1,15 +1,17 @@

    Welcome, <%= @user.username %>!

    +
    +
    -

    Pending Orders

    <%= @user.pending_orders.count %> <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %>
    +

    Currently Selling

    @@ -19,7 +21,9 @@
    +
    +

    Completed Orders

    @@ -27,6 +31,7 @@ <%= link_to "Completed Orders", self_completed_path, class: 'button profile-button' %>
    +

    Total Revenue

    @@ -36,4 +41,6 @@
    + +
    From 8cf57d108d21023839ccd5248523c87b2a7d60bd Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 09:26:51 -0700 Subject: [PATCH 250/348] Implemented order confirmation page --- Gemfile | 2 +- Gemfile.lock | 2 +- app/controllers/orders_controller.rb | 8 +++++--- app/views/orders/confirmation.html.erb | 8 ++++++++ app/views/orders/index.html.erb | 28 ++++++++++++-------------- config/routes.rb | 1 + 6 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 app/views/orders/confirmation.html.erb diff --git a/Gemfile b/Gemfile index 5147ef0a48..b79aafc234 100644 --- a/Gemfile +++ b/Gemfile @@ -21,7 +21,7 @@ gem 'simplecov', :require => false, :group => :test #added these gems because the terminal told me to -ruby '2.4.0' +ruby '2.4.1' # Use CoffeeScript for .coffee assets and views # gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks diff --git a/Gemfile.lock b/Gemfile.lock index 504cf3e28f..a2d2761d30 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -265,7 +265,7 @@ DEPENDENCIES web-console (>= 3.3.0) RUBY VERSION - ruby 2.4.0p0 + ruby 2.4.1p111 BUNDLED WITH 1.16.0.pre.3 diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 084b842d2c..c80212d5ce 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -22,11 +22,10 @@ def create if @order.save @order.decrement_products - binding.pry session[:cart] = nil flash[:status] = :success flash[:message] = "Successfully created order" - redirect_to orders_path + redirect_to confirmation_path(@order) else flash.now[:status] = :failure flash.now[:message] = "Failed to create order" @@ -64,6 +63,10 @@ def destroy end end + def confirmation + find_order_by_params_id + end + private def order_params @@ -79,5 +82,4 @@ def find_order_by_params_id end return @order end - # confirm if the order belongs to the merchant (buyer) end diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb new file mode 100644 index 0000000000..2dfca534a7 --- /dev/null +++ b/app/views/orders/confirmation.html.erb @@ -0,0 +1,8 @@ +
    +

    Order confirmation

    + +

    <%= @order.id %>

    + <% @order.order_products.each do |order_product| %> +

    <%= order_product.product.name %>

    + <% end %> +
    diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index fb310b9fd1..e734242304 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -4,7 +4,6 @@ <% if @orders == nil %>

    You haven't purchased anything yet!

    <% else %> - <% @orders.each do |order| %>
    @@ -23,23 +22,22 @@
    - <% order.order_products.each do | order_product |%> -
    -
    -
    - -
    -
    -
    -

    <%= order_product.product.name %>

    -

    <%= order_product.product.description %>

    -

    Price: $ <%= sprintf('%.2f', order_product.product.price) %> Quantity: <%= order_product.quantity %>

    -

    Subtotal: $ <%= sprintf('%.2f', order_product.total) %>

    + <% order.order_products.each do | order_product | %> +
    +
    +
    +
    - <% end %> +
    +

    <%= order_product.product.name %>

    +

    <%= order_product.product.description %>

    +

    Price: $ <%= sprintf('%.2f', order_product.product.price) %> Quantity: <%= order_product.quantity %>

    +

    Subtotal: $ <%= sprintf('%.2f', order_product.total) %>

    +
    +
    + <% end %> <% end %> - <% end %> diff --git a/config/routes.rb b/config/routes.rb index b03bd58e8d..c359704445 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -35,4 +35,5 @@ get '/mark_shipped/:id', to: 'merchants#mark_shipped', as: 'mark_shipped' + get '/confirmation/:id', to: 'orders#confirmation', as: 'confirmation' end From 6c3b8795824fe6878ef27dda8c7fef6fc9b24b18 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 09:35:42 -0700 Subject: [PATCH 251/348] utilized test helper on merchants controller test --- test/controllers/merchants_controller_test.rb | 23 +++++-------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index f68b6e9214..614f536474 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -295,8 +295,7 @@ describe "summary" do it "responds with success with the given path" do - merchant = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) + login_test_user get self_summary_path must_respond_with :found @@ -305,9 +304,7 @@ describe "pending" do it "responds with success with the given path" do - merchant = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) - get login_path(:github) + login_test_user get self_pending_path must_respond_with :success end @@ -315,9 +312,7 @@ describe "completed" do it "responds with success in the given path" do - merchant = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) - get login_path(:github) + login_test_user get self_completed_path must_respond_with :success end @@ -325,9 +320,7 @@ describe "mark-shipped" do it "responds with success upon completion" do - merchant = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) - get login_path(:github) + login_test_user op = order_products(:one) get mark_shipped_path(op) must_respond_with :found @@ -342,9 +335,7 @@ describe "revenue" do it "responds with success upon completion" do - merchant = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) - get login_path(:github) + login_test_user get self_revenue_path must_respond_with :success end @@ -352,9 +343,7 @@ describe "inventory" do it "responds with success upon completion" do - merchant = merchants(:ada) - OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(merchant)) - get login_path(:github) + login_test_user get self_inventory_path must_respond_with :success end From 4e5a8777a5f04c4dd5f10f28af5f613d36d1397b Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 09:45:57 -0700 Subject: [PATCH 252/348] removed redundant tests --- test/controllers/merchants_controller_test.rb | 56 ------------------- 1 file changed, 56 deletions(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 614f536474..2817f0fbee 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -292,60 +292,4 @@ end end end - - describe "summary" do - it "responds with success with the given path" do - login_test_user - get self_summary_path - must_respond_with :found - - end - end - - describe "pending" do - it "responds with success with the given path" do - login_test_user - get self_pending_path - must_respond_with :success - end - end - - describe "completed" do - it "responds with success in the given path" do - login_test_user - get self_completed_path - must_respond_with :success - end - end - - describe "mark-shipped" do - it "responds with success upon completion" do - login_test_user - op = order_products(:one) - get mark_shipped_path(op) - must_respond_with :found - - op.status.must_equal "shipped" - must_redirect_to self_pending_path - must_respond_with :success - flash[:status].must_include "Marked #{op.product.name} as shipped" - end - - end - - describe "revenue" do - it "responds with success upon completion" do - login_test_user - get self_revenue_path - must_respond_with :success - end - end - - describe "inventory" do - it "responds with success upon completion" do - login_test_user - get self_inventory_path - must_respond_with :success - end - end end From dd32db6287ef819f7b656d756b85b21cb13548ed Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 09:58:39 -0700 Subject: [PATCH 253/348] removed pry --- app/controllers/orders_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 084b842d2c..81405414c2 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -22,7 +22,6 @@ def create if @order.save @order.decrement_products - binding.pry session[:cart] = nil flash[:status] = :success flash[:message] = "Successfully created order" From d88df8dbc287182b26ff6bcac2f229616e23ae77 Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 10:04:47 -0700 Subject: [PATCH 254/348] Added order confirmation page; edited show.html.erb --- app/views/orders/confirmation.html.erb | 42 +++++++++++++++++++++++--- app/views/orders/show.html.erb | 33 +++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/app/views/orders/confirmation.html.erb b/app/views/orders/confirmation.html.erb index 2dfca534a7..8269687528 100644 --- a/app/views/orders/confirmation.html.erb +++ b/app/views/orders/confirmation.html.erb @@ -1,8 +1,42 @@

    Order confirmation

    -

    <%= @order.id %>

    - <% @order.order_products.each do |order_product| %> -

    <%= order_product.product.name %>

    - <% end %> +

    Thanks for your purchase!

    +
    +
      +
    • Order Number: #<%= @order.id %>
    • +
    • Total: <%= @order.total %>
    • +
    • Date: <%= @order.created_at.strftime("%B %d, %Y") %>
    • +
    • Status: <%= @order.status.capitalize %>
    • +
    +
    + +

    Order details

    +
    + + + + + + + + <% @order.order_products.each do |order_product| %> + + + + + + <% end %> + +
    QuantityItemTotal
    <%= order_product.quantity %> +
    + +
    +
    +

    <%= link_to order_product.product.name, product_path(id:order_product.product.id) %>

    +

    Sold by <%= order_product.product.merchant.username %>

    +

    $ <%= sprintf('%.2f', order_product.product.price) %>

    +
    +
    $ <%= sprintf('%.2f', order_product.total) %>
    +
    diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 858e6eee8e..1ad365861b 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -9,11 +9,34 @@

    Payment by

    -

    <%= @order.cust_name %>

    -

    <%= @order.cust_email %>

    -

    <%= @order.cust_addr %>

    -

    ****<%= @order.cust_cc.last(4) %>

    -

    Expires <%= @order.cust_cc_exp %>

    +

    + + + + + <%= @order.cust_name %> +

    +

    + + + + + <%= @order.cust_email %> +

    +

    + + + + + <%= @order.cust_addr %> +

    +

    + + + + + ****<%= @order.cust_cc.last(4) %> (expires <%= @order.cust_cc_exp %>) +

    From 71e06d3266b32856299a5732249210fe948130ac Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 10:06:08 -0700 Subject: [PATCH 255/348] Edited show.html.erb for orders --- app/views/orders/show.html.erb | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 1ad365861b..05ba67a5ec 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -9,34 +9,11 @@

    Payment by

    -

    - - - - - <%= @order.cust_name %> -

    -

    - - - - - <%= @order.cust_email %> -

    -

    - - - - - <%= @order.cust_addr %> -

    -

    - - - - - ****<%= @order.cust_cc.last(4) %> (expires <%= @order.cust_cc_exp %>) -

    +

    <%= @order.cust_name %>

    +

    <%= @order.cust_email %>

    +

    <%= @order.cust_addr %>

    +p

    ****<%= @order.cust_cc.last(4) %>

    +

    Expires <%= @order.cust_cc_exp %>

    From 15ef89e52d50e3d6e1710344bf7b8cf944f2c16d Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 10:24:48 -0700 Subject: [PATCH 256/348] gemfile fix, merchant user summary cards added --- Gemfile | 3 +- app/assets/stylesheets/merchants.scss | 12 +++---- app/controllers/application_controller.rb | 6 ++++ app/controllers/merchants_controller.rb | 2 ++ app/views/merchants/revenue.html.erb | 16 ++++----- app/views/merchants/summary.html.erb | 44 ++++++++++++++--------- 6 files changed, 51 insertions(+), 32 deletions(-) diff --git a/Gemfile b/Gemfile index 92a04db7f1..cfda5e0270 100644 --- a/Gemfile +++ b/Gemfile @@ -21,7 +21,7 @@ gem 'simplecov', :require => false, :group => :test #added these gems because the terminal told me to -ruby '2.4.0' +ruby '2.4.1' # Use CoffeeScript for .coffee assets and views # gem 'coffee-rails', '~> 4.2' # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks @@ -34,7 +34,6 @@ gem 'jbuilder', '~> 2.5' # gem 'bcrypt', '~> 3.1.7' gem "omniauth" gem "omniauth-github" -gem 'pry-rails' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 961d8853b0..ef06236227 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -17,6 +17,7 @@ text-align: center; padding: 2rem; margin: 1rem auto; + min-width: 15.5rem; } .profile-huge { @@ -30,12 +31,11 @@ width: 80%; } -@media print, screen and (min-width: 64em) { - .profile-card { - min-width: 14rem; - max-width: 22rem; - } -} +// @media print, screen and (min-width: 40em) { +// .profile-card { +// min-height: 15.5rem; +// } +// } /////////////// diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bbd5881114..a61f88bd86 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,8 +1,14 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + before_action :no_nil_cart + protected + def no_nil_cart + session[:cart] ||= [] + end + def confirm_login if session[:merchant].nil? flash[:status] = :failure diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 46f5b5629a..5ced092677 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -126,6 +126,8 @@ def revenue @user = Merchant.find(session[:merchant]['id']) @pending = @user.pending_orders @completed = @user.shipped_orders + @pending_average = (@pending.count == 0 ? 0 : (@pending.sum{|order| order.total})/@pending.count) + @completed_average = (@completed.count == 0 ? 0 : (@completed.sum{|order| order.total})/@completed.count) end def inventory diff --git a/app/views/merchants/revenue.html.erb b/app/views/merchants/revenue.html.erb index 4c012f37bc..d9dd4ad6c1 100644 --- a/app/views/merchants/revenue.html.erb +++ b/app/views/merchants/revenue.html.erb @@ -3,14 +3,14 @@

    Total Revenue to Date: <%= money(@user.total_revenue) %>

    -

    Completed Orders:

    -

    Completed Orders: <%= @completed.count %>

    -

    Income: <%= money(@completed.sum{|order| order.total}) %>

    -

    Average Income Per Order: <%= money((@completed.sum{|order| order.total})/@completed.count) %>

    +

    Completed Orders:

    +

    Completed Orders: <%= @completed.count %>

    +

    Income: <%= money(@completed.sum{|order| order.total}) %>

    +

    Average Income Per Order: <%= money(@completed_average) %>

    -

    Pending Orders:

    -

    Pending Orders: <%= @pending.count %>

    -

    Income: <%= money(@pending.sum{|order| order.total}) %>

    -

    Average Income Per Order: <%= money((@pending.sum{|order| order.total})/@pending.count) %>

    +

    Pending Orders:

    +

    Pending Orders: <%= @pending.count %>

    +

    Income: <%= money(@pending.sum{|order| order.total}) %>

    +

    Average Income Per Order: <%= money(@pending_average) %>

    diff --git a/app/views/merchants/summary.html.erb b/app/views/merchants/summary.html.erb index e0f12efebb..9935d4c44b 100644 --- a/app/views/merchants/summary.html.erb +++ b/app/views/merchants/summary.html.erb @@ -4,42 +4,54 @@
    -
    -
    -

    Pending Orders

    - <%= @user.pending_orders.count %> - <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %> +
    +
    +

    Shopping Cart

    + <%= session[:cart].count %> + <%= link_to "Go To Cart", shopping_cart_path, class: 'button profile-button' %>
    -
    +

    Currently Selling

    <%= @user.active_products.count %> <%= link_to "Inventory Management", self_inventory_path, class: 'button profile-button' %>
    -
    - -
    - -
    +
    -

    Completed Orders

    - <%= @user.shipped_orders.count %> - <%= link_to "Completed Orders", self_completed_path, class: 'button profile-button' %> +

    Pending Orders

    + <%= @user.pending_orders.count %> + <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %>
    -
    +
    +
    +

    Purchased Orders

    + <%= @user.orders.count %> + <%= link_to "Past Orders", orders_path, class: 'button profile-button' %> +
    +
    + +

    Total Revenue

    <%= money(@user.total_revenue, true) %> - <%= link_to "Income Details", self_revenue_path, class: 'button profile-button' %>
    + +
    +
    +

    Completed Orders

    + <%= @user.shipped_orders.count %> + <%= link_to "Completed Orders", self_completed_path, class: 'button profile-button' %> +
    +
    +
    From 4a4d1b0b5a9076389ae7fa73307f4a9452dad11b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 10:26:44 -0700 Subject: [PATCH 257/348] LoreStore website title --- app/views/layouts/application.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 110968a2c3..71a06f96fd 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -4,7 +4,7 @@ - <%= content_for?(:title) ? yield(:title) : "Untitled" %> + <%= content_for?(:title) ? yield(:title) : "LoreStore" %> <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> From a1356d0209012e264d4f653482ad2515df0997f9 Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 25 Oct 2017 10:43:40 -0700 Subject: [PATCH 258/348] Changes in review --- app/assets/stylesheets/reviews.scss | 4 ++-- app/views/products/_review.html.erb | 7 ++++++- app/views/products/show.html.erb | 2 +- test/controllers/reviews_controller_test.rb | 2 -- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index 53b0eac8ab..c95552a85c 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -9,11 +9,11 @@ // border-radius: 1rem; // color: black; // } -.first_line h6{ +.first_line_info h6{ display: inline-block; // text-indent: 2rem; } -.change { +.change{ background-color: white; border: .5px solid black; border-radius: 1rem; diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index c016bffc6a..24a39f3508 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -1,6 +1,11 @@
    -
    +
    + <%if session[:merchant]%> +
    <%= Merchant.new(session[:merchant]).username%>:
    + <%else%> +
    Guest:
    + <%end%>
    Rating: <%=review.rating %>
    <%= review.updated_at.strftime("%b %d, %Y") %>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 3367b297f4..94c2f6c3cd 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -40,7 +40,7 @@
    -

    <%= link_to "Add review", new_product_review_path(@product.id) %>

    + <%= link_to "Add review", new_product_review_path(@product.id) %>

    Average Review: <%= @product.reviews.average(:rating) %>

    <% @product.reviews.each do |review| %> <%= render partial: 'review', locals: {review: review} %> diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 0a654171c6..651e1af052 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -4,8 +4,6 @@ let(:review) { reviews(:review) } let(:mermaid_fin) { products(:mermaid_fin) } - - ######### Leaving for future, if we rethink and decide to add later # describe "index" do # it "returns success status for all reviews" do From aa660d3d2640b857dc580eb9a4f5c121a1d79eaa Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 25 Oct 2017 11:02:48 -0700 Subject: [PATCH 259/348] Added only review owner can edit/delete --- app/controllers/reviews_controller.rb | 4 +++- app/views/products/_review.html.erb | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 1bdabca45b..48f0503289 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -2,7 +2,9 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:edit, :update, :destroy] #:show, before_action :check_for_product_owner_nested, only: [:new] before_action :check_for_product_owner, only: [:edit, :update, :destroy] - + before_action only: [] do + confirm_object_ownership(@review, merchant_id) + end # def index # leaving for future, if we rethink and decide to add later # @reviews = Review.where(product_id: params[:product_id]) # end diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index 24a39f3508..fbb624bcae 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -12,7 +12,7 @@
    <%= review.description %>
    - <% if session[:merchant] %> + <% if session[:merchant] && session[:merchant]['id'] == review.merchant_id%>
    <%= link_to "Edit", edit_review_path(review.id) %>
    <%= link_to "Delete", review_path(review.id), method: :delete, data: { confirm: "Are you sure?" }%>
    <% end %> From 42f6f61817728a49e619389c215dde5709adeeac Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 11:05:27 -0700 Subject: [PATCH 260/348] Edited application and orders controllers and order.rb model --- app/controllers/application_controller.rb | 2 +- app/controllers/orders_controller.rb | 4 +++- app/models/order.rb | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a61f88bd86..090ba598c1 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -13,7 +13,7 @@ def confirm_login if session[:merchant].nil? flash[:status] = :failure flash[:message] = "You must be logged in to do that." - return redirect_back(fallback_location: products_path) + return redirect_back(fallback_location: root_path) end end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index c80212d5ce..b48af6ea0d 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,5 +1,7 @@ class OrdersController < ApplicationController + before_action :confirm_login, except: [:new, :create, :confirmation] + def index # show only the orders that belong to the merchant if session[:merchant] @@ -20,7 +22,7 @@ def create @order = Order.new(order_params) @order.order_products += OrderProduct.find_in_cart(session[:cart]) - if @order.save + if @order.save && @order.order_products.length > 0 @order.decrement_products session[:cart] = nil flash[:status] = :success diff --git a/app/models/order.rb b/app/models/order.rb index 1cda4caf8c..a14cd7fc3a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -33,4 +33,16 @@ def decrement_products product.save end end + + def order_status + shipped_count = 0 + order_products.each do |order_product| + if order_product.status == "shipped" + shipped_count += 1 + end + end + if shipped_count == order_products.length + self.status == "complete" + end + end end From 26d9266b65836d6d14577791610354b28b8d94e2 Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 25 Oct 2017 11:12:02 -0700 Subject: [PATCH 261/348] Fixed that user bug --- app/controllers/reviews_controller.rb | 3 ++- app/views/products/_review.html.erb | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 48f0503289..4fc4205e17 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -3,7 +3,7 @@ class ReviewsController < ApplicationController before_action :check_for_product_owner_nested, only: [:new] before_action :check_for_product_owner, only: [:edit, :update, :destroy] before_action only: [] do - confirm_object_ownership(@review, merchant_id) + confirm_object_ownership(@review, @review.merchant_id) end # def index # leaving for future, if we rethink and decide to add later # @reviews = Review.where(product_id: params[:product_id]) @@ -18,6 +18,7 @@ def new def create @review = Review.new(review_params) + @review.merchant_id = session[:merchant]["id"] if session[:merchant] if @review.save flash[:status] = :success flash[:message] = "Successfully created review " diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index fbb624bcae..05ba986a48 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -1,8 +1,8 @@
    - <%if session[:merchant]%> -
    <%= Merchant.new(session[:merchant]).username%>:
    + <%if review.merchant%> +
    <%= review.merchant.username%>:
    <%else%>
    Guest:
    <%end%> From e86d4848278eb244f8b22f84b38cc9b74cb1453e Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 11:17:14 -0700 Subject: [PATCH 262/348] Added order_status method to orders model --- app/models/order.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index a14cd7fc3a..8b9e463d6d 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -35,14 +35,13 @@ def decrement_products end def order_status - shipped_count = 0 - order_products.each do |order_product| - if order_product.status == "shipped" - shipped_count += 1 - end - end - if shipped_count == order_products.length - self.status == "complete" + # shipped_count = 0 + result = order_products.all? do |order_product| + order_product.status == "shipped" end + + # if shipped_count == order_products.length + self.status = "complete" if result + # end end end From 630cedafabfd528e285f1ec7a2687751245daa30 Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 11:17:28 -0700 Subject: [PATCH 263/348] Added order_status method to orders model --- app/models/order.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index 8b9e463d6d..e37fc0d877 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -35,13 +35,9 @@ def decrement_products end def order_status - # shipped_count = 0 result = order_products.all? do |order_product| order_product.status == "shipped" end - - # if shipped_count == order_products.length self.status = "complete" if result - # end end end From d19ce69dee235c476ceee2114c18722f6739cf19 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 11:24:44 -0700 Subject: [PATCH 264/348] mark_shipped updates order status --- app/controllers/merchants_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 7b676fa156..534ec09c8a 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -110,6 +110,7 @@ def mark_shipped if order_product order_product.status = "shipped" order_product.save + order_product.order.order_status flash[:status] = :success flash[:message] = "Marked #{order_product.product.name} as shipped" return redirect_to self_pending_path From d3358b338b9bc6f7b5cbedf1828dc2a97cdcc887 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 11:59:56 -0700 Subject: [PATCH 265/348] fixed order_status update method --- app/models/order.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/order.rb b/app/models/order.rb index e37fc0d877..4d1c72b089 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -38,6 +38,7 @@ def order_status result = order_products.all? do |order_product| order_product.status == "shipped" end - self.status = "complete" if result + self.status = "complete" if result + self.save end end From 010b0baff1a807bfa919c6c513a92c020c405f14 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 12:06:03 -0700 Subject: [PATCH 266/348] add inventory to product fixtures --- test/fixtures/products.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 8fb6d72712..b0c666f4f2 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -7,11 +7,11 @@ mermaid_fin: name: Mermaid Fin price: 3.45 - quantity: 3 + quantity: 30 merchant: ada wand: name: Magic Wand price: 10.14 - quantity: 1 + quantity: 10 merchant: grace From e54e9095e1edaf9b83f5f5763b30a5e15b3fb695 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 12:46:20 -0700 Subject: [PATCH 267/348] hero img --- app/assets/images/hero.jpeg | Bin 0 -> 289721 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/hero.jpeg diff --git a/app/assets/images/hero.jpeg b/app/assets/images/hero.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..180bcfe9dbae1d1c430c16464f0bd5d1782f937a GIT binary patch literal 289721 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 u%yKT#OdoG<~Xew}+i+)J+75k$9$R8!~3b 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

    w}*D<9JX1S+xhW4Ca)!8FtGKFb% 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

    W?6h5c1!lN7!!L1I~`nq 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

    XRYi&O0AdqP<+o6h}olI3w- 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 EKZU}HCjbBd literal 0 HcmV?d00001 From b7a0f32bebe2cc51e5875de86f468c7ca9d1615d Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 12:51:26 -0700 Subject: [PATCH 268/348] basic homepage --- app/assets/stylesheets/main.scss | 4 ++++ app/views/main/index.html.erb | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 971b13c825..41d8e460b0 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -1,3 +1,7 @@ // Place all the styles related to the Main controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ + +.hero { + background-image: image('assets/hero.jpeg'); +} diff --git a/app/views/main/index.html.erb b/app/views/main/index.html.erb index e69de29bb2..2ae4fb3854 100644 --- a/app/views/main/index.html.erb +++ b/app/views/main/index.html.erb @@ -0,0 +1,4 @@ +

    +

    Welcome to LoreStore

    +

    Your One-Stop Shop For All Things Magical

    +
    From 9c0481155c81c0856ca5c49c1646155de5aa30ec Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 12:57:49 -0700 Subject: [PATCH 269/348] basic formatting for hero page --- app/assets/stylesheets/main.scss | 20 +++++++++++++++++++- app/views/main/index.html.erb | 6 ++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 41d8e460b0..07e520c818 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -3,5 +3,23 @@ // You can use Sass (SCSS) here: http://sass-lang.com/ .hero { - background-image: image('assets/hero.jpeg'); + background-image: url('hero.jpeg'); + background-position: center center; + background-size: cover; + height: 40rem; + text-align: center; + width: 100%; +} + +.hero-text { + color: white; + display: inline-block; + margin: 5rem auto; +} + +h1.hero-title { +} + +h2.hero-subtitle { + font-style: italic; } diff --git a/app/views/main/index.html.erb b/app/views/main/index.html.erb index 2ae4fb3854..c99d1d8b43 100644 --- a/app/views/main/index.html.erb +++ b/app/views/main/index.html.erb @@ -1,4 +1,6 @@
    -

    Welcome to LoreStore

    -

    Your One-Stop Shop For All Things Magical

    +
    +

    Welcome to LoreStore

    +

    Your one-stop shop for all things magical or otherworldly

    +
    From 451678a191a41652460e38c10206028f194d982b Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 25 Oct 2017 13:06:03 -0700 Subject: [PATCH 270/348] Review works without bugs for now --- app/controllers/reviews_controller.rb | 8 +++--- test/controllers/reviews_controller_test.rb | 27 +++++++++++++++++---- test/fixtures/reviews.yml | 5 ++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 4fc4205e17..8c3541bace 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -2,10 +2,12 @@ class ReviewsController < ApplicationController before_action :find_review_by_params_id, only: [:edit, :update, :destroy] #:show, before_action :check_for_product_owner_nested, only: [:new] before_action :check_for_product_owner, only: [:edit, :update, :destroy] - before_action only: [] do + before_action only: [:edit, :destroy] do + confirm_object_ownership(@review, @review.merchant_id) end - # def index # leaving for future, if we rethink and decide to add later + # leaving for future, if we rethink and decide to add later + # def index # @reviews = Review.where(product_id: params[:product_id]) # end @@ -68,7 +70,7 @@ def find_review_by_params_id end def check_for_product_owner - if !session[:merchant].nil? && @review.merchant_id == session[:merchant]["id"] + if !session[:merchant].nil? && @review.product.merchant_id == session[:merchant]["id"] flash[:status] = :failure flash[:message] = "Owner can not edit the review of the product!" redirect_to product_path(@review.product_id) diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index 088b7a46b6..85350a0c32 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -3,6 +3,7 @@ describe ReviewsController do let(:review) { reviews(:review) } let(:mermaid_fin) { products(:mermaid_fin) } + let(:wand) { products(:wand) } ######### Leaving for future, if we rethink and decide to add later # describe "index" do @@ -31,6 +32,7 @@ # end describe "new" do + it " should not work if product doesn't exist" do bad_product = Product.last.id + 1 get new_product_review_path(bad_product) @@ -119,8 +121,13 @@ end describe "edit" do - it "will return failure if merchant owns the product" do + + before do login_test_user + end + + it "will return failure if merchant owns the product" do + # login_test_user get edit_review_path(review) @@ -128,9 +135,10 @@ end it "succeeds for an exact review ID" do + review_id = Review.first.id get edit_review_path(review.id) - must_respond_with :success + must_respond_with :found end it "renders 404 not_found for a bogus review ID" do @@ -141,6 +149,7 @@ end describe "update" do + it "will successfully update review" do review_data = { review: { @@ -184,17 +193,25 @@ end describe "destroy" do + + before do + login_test_user + end + it "will successfully destroy review" do + start_review_count = Review.count - delete review_path(review) + delete review_path(reviews(:review4)) + # binding.pry + must_redirect_to product_path(wand.id) - must_redirect_to product_path(mermaid_fin) + flash[:status].must_equal :success Review.count.must_equal start_review_count - 1 end it "will not delete review if merchant owns the product" do - login_test_user + # login_test_user start_review_count = Review.count delete review_path(review) diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index 2da233da94..479d5e3d4d 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -18,3 +18,8 @@ review3: rating: 4 merchant: grace product: wand + +review4: + rating: 4 + merchant: ada + product: wand From a56562a1a591bb14912e4c3aed020e0adac23a55 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 13:56:54 -0700 Subject: [PATCH 271/348] OrderProduct has status Pending upon creation --- app/controllers/main_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index 4489bda668..bd01f39d53 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -9,7 +9,7 @@ def add_to_cart if session[:cart].nil? session[:cart] = [] end - order_product = OrderProduct.create(quantity: params["quantity"], product_id: params["id"]) + order_product = OrderProduct.create(quantity: params["quantity"], product_id: params["id"], status: "pending") session[:cart] << order_product.id redirect_to products_path end From 0325ad02ad38576b985f2b61cf649cde70058b01 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 14:00:11 -0700 Subject: [PATCH 272/348] Shopping cart can be edited --- app/assets/stylesheets/main.scss | 26 +++++++++++++ app/controllers/order_products_controller.rb | 8 ++-- app/views/main/shopping_cart.html.erb | 39 ++++++++++++++++++-- app/views/merchants/inventory.html.erb | 1 + 4 files changed, 67 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 07e520c818..f0436b10db 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -23,3 +23,29 @@ h1.hero-title { h2.hero-subtitle { font-style: italic; } + +////////// +// CART // +////////// + + +.shopping-cart-info > div { + margin: 2rem 0; + overflow-x: hidden; + white-space: nowrap; +} + +.cart-text { + line-height: 2; +} + +label.shopping-cart-form { + display: inline; + text-align: right; + width: 40%; +} + +input.shopping-cart-form { + display: inline-block; + width: 50%; +} diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 01ee1704ec..41b5b48613 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -7,7 +7,8 @@ def update if find_order_product_by_params_id @order_product.update_attributes(order_product_params) if @order_product.save - redirect_to order_product_path(@order_product) + redirect_to shopping_cart_path + # redirect_to order_product_path(@order_product) return else render :edit, status: :bad_request @@ -20,8 +21,9 @@ def destroy if find_order_product_by_params_id @order_product.destroy flash[:status] = :success - flash[:message] = "Deleted order product #{@order_product.product.name}" - redirect_to merchant_sold_index_path(@order_product.product.merchant) + flash[:message] = "Deleted item #{@order_product.product.name} from cart" + redirect_to shopping_cart_path + # redirect_to merchant_sold_index_path(@order_product.product.merchant) end end diff --git a/app/views/main/shopping_cart.html.erb b/app/views/main/shopping_cart.html.erb index aa04c00c83..8e1870003a 100644 --- a/app/views/main/shopping_cart.html.erb +++ b/app/views/main/shopping_cart.html.erb @@ -2,13 +2,44 @@

    Shopping Cart

    <% @products.each do |order_product| %> -

    <%= order_product.product.name %>

    -

    <%= order_product.total %>

    + <%= form_for order_product do |f| %> +
    + + > + +
    +
    +

    <%= order_product.product.name %>

    +
    +
    +
    +

    Price: + <%= money(order_product.product.price) %> +

    +
    +
    + <%= f.label :quantity, "Quantity:", class: 'shopping-cart-form' %> + <%= f.text_field :quantity, class: 'shopping-cart-form' %> +
    +
    +

    Total: + <%= money(order_product.total) %> +

    +
    +
    + <%= f.submit "Update Item", class: 'button' %> + <%= link_to "Remove From Cart", order_product_path(order_product.id), method: :delete, data: { confirm: "Are you sure?" }, class: "button delete-button" %> +
    +
    + +
    + <% end %> + <% end %> <% unless @products.empty? %> -

    cart total

    - <%= total(@products) %> +

    Cart Total: <%= money(total(@products)) %>

    <%= link_to "Checkout Cart", new_order_path, class: 'button' %> <% else %> diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index 3771d5e7f4..9abd88de58 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -6,6 +6,7 @@
    <% else %> +
    <% @products.each do |product| %> <%= form_for product do |f| %> From 7ce55ae48ba813908f1233a6303824138d4b1081 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 14:00:44 -0700 Subject: [PATCH 273/348] fix validation message for order product quantitiy --- app/models/order.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/order.rb b/app/models/order.rb index 4d1c72b089..c80624d1b2 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -20,7 +20,7 @@ def quantity_check available = order_product.product.quantity desired = order_product.quantity if desired > available - errors.add(:product, 'does not have enough stock') + errors.add("#{order_product.product.name} does not have enough stock") end end end From 24f656e7ad5bec44c1e7495de41ff6c8e08b7dcf Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 14:08:40 -0700 Subject: [PATCH 274/348] make confirm_ownership errors message more generic --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 090ba598c1..53843934f3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -28,7 +28,7 @@ def find_object_by_params(model) def confirm_object_ownership(model, merchant_id) unless session[:merchant]['id'] == merchant_id flash[:status] = :failure - flash[:message] = "Only a #{model}'s merchant can modify a #{model}." + flash[:message] = "Only a #{model}'s creator can modify a #{model}." return redirect_back(fallback_location: pathfinder(model.class)) end end From 658daeb6c98605d79c54e68d67fce2e2370b18ae Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 14:13:06 -0700 Subject: [PATCH 275/348] Fixing Order controller tests --- app/controllers/orders_controller.rb | 10 ------ app/views/orders/show.html.erb | 2 +- test/controllers/main_controller_test.rb | 5 +-- test/controllers/orders_controller_test.rb | 39 ++++++++++++---------- 4 files changed, 23 insertions(+), 33 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index b48af6ea0d..a19e2412fd 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -55,16 +55,6 @@ def update end end - def destroy - # if the order belongs to the merchant (buyer), can destroy it - if find_order_by_params_id - @order.destroy - flash[:status] = :success - flash[:message] = "Deleted order" - redirect_to orders_path - end - end - def confirmation find_order_by_params_id end diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 05ba67a5ec..858e6eee8e 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -12,7 +12,7 @@

    <%= @order.cust_name %>

    <%= @order.cust_email %>

    <%= @order.cust_addr %>

    -p

    ****<%= @order.cust_cc.last(4) %>

    +

    ****<%= @order.cust_cc.last(4) %>

    Expires <%= @order.cust_cc_exp %>

    diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb index dc3944cd9b..036ebec531 100644 --- a/test/controllers/main_controller_test.rb +++ b/test/controllers/main_controller_test.rb @@ -6,9 +6,6 @@ it "should respond with success" do get root_path must_respond_with :success - end + end end - # it "must be a real test" do - # flunk "Need real tests" - # end end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index f78e8f4ea9..9ca37f4992 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -4,6 +4,7 @@ describe "index" do it "returns success for the orders of a specific merchant if given a merchant" do merchant = :ada + login_test_user get merchant_orders_path(merchant) must_respond_with :success end @@ -31,7 +32,7 @@ updated_at: Time.now } } - good_order = Order.new(order[:order]) + good_order = Order.new(order[:another_order]) good_order.must_be :valid? start_count = Order.count @@ -68,12 +69,14 @@ describe "show" do it "returns success with valid id" do + login_test_user order_id = Order.first.id get order_path(order_id) must_respond_with :success end it "returns not_found with invalid id" do + login_test_user invalid_id = Order.last.id + 1 get order_path(invalid_id) must_respond_with :not_found @@ -115,21 +118,21 @@ end end - describe "destroy" do - it "returns success and destroys if order exists" do - order = Order.first - order.must_be :valid? - delete order_path(order) - must_respond_with :redirect - must_redirect_to orders_path - end - - it "returns not_found if work does not exist" do - order = Order.first - order.must_be :valid? - delete order_path(order) - delete order_path(order) - must_respond_with :not_found - end - end + # describe "destroy" do + # it "returns success and destroys if order exists" do + # order = Order.first + # order.must_be :valid? + # delete order_path(order) + # must_respond_with :redirect + # must_redirect_to orders_path + # end + # + # it "returns not_found if work does not exist" do + # order = Order.first + # order.must_be :valid? + # delete order_path(order) + # delete order_path(order) + # must_respond_with :not_found + # end + # end end From 569edf8c68b06a31a4a7f5dd91c220dcba987904 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 14:14:56 -0700 Subject: [PATCH 276/348] include assets --- config/application.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/config/application.rb b/config/application.rb index af9b19982d..b1dc090fe1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -11,13 +11,14 @@ class Application < Rails::Application config.generators do |g| # Force new test files to be generated in the minitest-spec style g.test_framework :minitest, spec: true - + # Always use .js files, never .coffee g.javascript_engine :js end # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.1 - + + config.serve_static_assets = true # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. From bdb0a6c5d3bdebeb9418094983865789bc8dd9be Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 14:17:02 -0700 Subject: [PATCH 277/348] Edited orders index and show pages --- app/views/orders/index.html.erb | 2 +- app/views/orders/show.html.erb | 33 ++++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index e734242304..c44e85231c 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -14,7 +14,7 @@
    TOTAL - <%= sprintf('%.2f', order.total) %> + $ <%= sprintf('%.2f', order.total) %>
    ORDER #<%= order.id %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 858e6eee8e..8e78c0a4e1 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -9,11 +9,34 @@

    Payment by

    -

    <%= @order.cust_name %>

    -

    <%= @order.cust_email %>

    -

    <%= @order.cust_addr %>

    -

    ****<%= @order.cust_cc.last(4) %>

    -

    Expires <%= @order.cust_cc_exp %>

    +

    + + + + + <%= @order.cust_name %> +

    +

    + + + + + <%= @order.cust_email %> +

    +

    + + + + + <%= @order.cust_addr %> +

    +

    + + + + + ****<%= @order.cust_cc.last(4) %> (expires <%= @order.cust_cc_exp %>) +

    From 67002f86fe3d561cf65875d4781baad6fc896a03 Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 14:22:31 -0700 Subject: [PATCH 278/348] Fixed show.html.erb issue --- app/views/orders/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 8e78c0a4e1..1ad365861b 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -33,7 +33,7 @@

    - + ****<%= @order.cust_cc.last(4) %> (expires <%= @order.cust_cc_exp %>)

    From 3e02258c5229e94b22670a254675daaf2a2e4531 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 14:29:19 -0700 Subject: [PATCH 279/348] change hero img url --- app/assets/stylesheets/main.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index f0436b10db..53aabe93b4 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -3,7 +3,7 @@ // You can use Sass (SCSS) here: http://sass-lang.com/ .hero { - background-image: url('hero.jpeg'); + background-image: url('http://3.bp.blogspot.com/-Z23LsR1pXhE/VN7uK5CR9yI/AAAAAAAAAOk/N_CksAB4Cbw/s1600/Dark%2BMagic%2BFloating%2BAway%2BFrom%2BCreepy%2BForest.jpg'); background-position: center center; background-size: cover; height: 40rem; From 7c7745615455b4b3b46ec16e4551a982eede238a Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 15:01:37 -0700 Subject: [PATCH 280/348] added cvv and zip code to orders model --- app/models/order.rb | 2 +- app/views/orders/_form.html.erb | 10 ++++++++++ .../20171025214645_add_cvv_and_zip_code_to_orders.rb | 6 ++++++ db/schema.rb | 4 +++- 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20171025214645_add_cvv_and_zip_code_to_orders.rb diff --git a/app/models/order.rb b/app/models/order.rb index c80624d1b2..1e00b0f783 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -3,7 +3,7 @@ class Order < ApplicationRecord has_many :order_products has_many :products, through: :order_products - validates :cust_cc, :cust_cc_exp, :cust_addr, :cust_email, :status, :cust_name, presence: true + validates :cust_cc, :cust_cc_exp, :cust_addr, :cust_email, :status, :cust_name, :cvv, :zip_code, presence: true validate :quantity_check validates_format_of :cust_email, :with => /\A\w+@\w+\.\w+\z/ diff --git a/app/views/orders/_form.html.erb b/app/views/orders/_form.html.erb index 958329458c..ee8887666e 100644 --- a/app/views/orders/_form.html.erb +++ b/app/views/orders/_form.html.erb @@ -19,11 +19,21 @@ <%= f.text_field :cust_cc_exp %> <% end %> + <%= content_tag :div, class: "cvv-wrapper" do %> + <%= f.label :cvv, "cvv" %> + <%= f.text_field :cvv %> + <% end %> + <%= content_tag :div, class: "addr-wrapper" do %> <%= f.label :cust_addr, "Address" %> <%= f.text_field :cust_addr %> <% end %> + <%= content_tag :div, class: "zip-wrapper" do %> + <%= f.label :zip_code, "Zip Code" %> + <%= f.text_field :zip_code %> + <% end %> + <%= content_tag :div, class: "email-wrapper" do %> <%= f.label :cust_email, "Email" %> <%= f.text_field :cust_email %> diff --git a/db/migrate/20171025214645_add_cvv_and_zip_code_to_orders.rb b/db/migrate/20171025214645_add_cvv_and_zip_code_to_orders.rb new file mode 100644 index 0000000000..6fe5142931 --- /dev/null +++ b/db/migrate/20171025214645_add_cvv_and_zip_code_to_orders.rb @@ -0,0 +1,6 @@ +class AddCvvAndZipCodeToOrders < ActiveRecord::Migration[5.1] + def change + add_column :orders, :cvv, :string + add_column :orders, :zip_code, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 086373f22e..d0e5d70ec2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20171020222435) do +ActiveRecord::Schema.define(version: 20171025214645) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -54,6 +54,8 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "merchant_id" + t.string "cvv" + t.string "zip_code" end create_table "products", force: :cascade do |t| From 5cb67df957835fe72d750e5a0cde36858bafe650 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 15:04:02 -0700 Subject: [PATCH 281/348] add button to retire products --- app/controllers/merchants_controller.rb | 4 ++- app/controllers/products_controller.rb | 10 +++++-- app/models/merchant.rb | 4 +++ app/views/merchants/inventory.html.erb | 38 +++++++++++++++++++++++-- config/routes.rb | 3 +- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 9823c01cb1..bf2c27c847 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -137,7 +137,9 @@ def revenue end def inventory - @products = Merchant.find(session[:merchant]['id']).products + merchant = Merchant.find(session[:merchant]['id']) + @products = merchant.active_products + @inactive_products = merchant.inactive_products end private diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0955bc8c4f..e15549a1f0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,12 +1,12 @@ class ProductsController < ApplicationController - before_action only: [:show, :edit, :update, :destroy, :categories, :add_categories] do + before_action only: [:show, :edit, :update, :destroy, :categories, :add_categories, :retire] do find_object_by_params(Product) end before_action :confirm_login, except: [:index, :show] - before_action only: [:edit, :update, :destroy, :categories, :add_categories] do + before_action only: [:edit, :update, :destroy, :categories, :add_categories, :retire] do confirm_object_ownership(@product, @product.merchant_id) end @@ -105,6 +105,12 @@ def add_categories return redirect_to product_path(@product.id) end + def retire + @product.quantity = 0 + @product.save + return redirect_to self_inventory_path + end + private def prod_params diff --git a/app/models/merchant.rb b/app/models/merchant.rb index a3058f5cb6..fc44cd31dd 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -40,4 +40,8 @@ def total_revenue def active_products products.find_all { |p| p.quantity > 0 } end + + def inactive_products + products.find_all { |p| p.quantity == 0 } + end end diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index 3771d5e7f4..110d8874b4 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -1,5 +1,5 @@

    Inventory Management

    - +

    Active Products

    <% if @products.empty? %>

    You are not currently selling any items!

    @@ -13,7 +13,7 @@ > -
    +

    <%= product.name %>

    @@ -24,8 +24,9 @@ <%= f.label :quantity, class: 'inventory-form' %> <%= f.text_field :quantity, class: 'inventory-form' %>
    -
    +
    <%= f.submit "Update Item", class: 'button' %> + <%= link_to "Retire Item", retire_product_path(product.id), class: 'button' %>
    @@ -36,3 +37,34 @@ <% end %> <%= link_to "Sell A New Product", new_product_path, class: 'button new-product-button' %> + +<% unless @inactive_products.empty? %> +
    +

    Inactive Products

    + <% @inactive_products.each do |product| %> + <%= form_for product do |f| %> +
    + + > + +
    +

    <%= product.name %>

    +
    +
    + <%= f.label :price, class: 'inventory-form' %> + <%= f.text_field :price, class: 'inventory-form' %> +
    +
    + <%= f.label :quantity, class: 'inventory-form' %> + <%= f.text_field :quantity, class: 'inventory-form' %> +
    +
    + <%= f.submit "Update Item", class: 'button' %> +
    +
    + +
    + <% end %> + <% end %> +
    +<% end %> diff --git a/config/routes.rb b/config/routes.rb index c359704445..8b2c853795 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -33,7 +33,8 @@ get '/revenue', to: 'merchants#revenue', as: 'self_revenue' get '/inventory', to: 'merchants#inventory', as: 'self_inventory' - get '/mark_shipped/:id', to: 'merchants#mark_shipped', as: 'mark_shipped' + get '/:id/mark_shipped', to: 'merchants#mark_shipped', as: 'mark_shipped' + get '/:id/retire', to: 'products#retire', as: 'retire_product' get '/confirmation/:id', to: 'orders#confirmation', as: 'confirmation' end From 63d7e95201dff2a4f4da88532caab682e5d2377c Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 15:07:12 -0700 Subject: [PATCH 282/348] update button text --- app/views/merchants/inventory.html.erb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index 110d8874b4..c31d237387 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -13,7 +13,7 @@ > -
    +

    <%= product.name %>

    @@ -24,9 +24,9 @@ <%= f.label :quantity, class: 'inventory-form' %> <%= f.text_field :quantity, class: 'inventory-form' %>
    -
    - <%= f.submit "Update Item", class: 'button' %> - <%= link_to "Retire Item", retire_product_path(product.id), class: 'button' %> +
    + <%= f.submit "Update", class: 'button' %> + <%= link_to "Retire", retire_product_path(product.id), class: 'button' %>
    @@ -59,7 +59,7 @@ <%= f.text_field :quantity, class: 'inventory-form' %>
    - <%= f.submit "Update Item", class: 'button' %> + <%= f.submit "Update", class: 'button' %>
    From 37fc4c0ad610c3c9cc44c25155edd86f70c4ecb0 Mon Sep 17 00:00:00 2001 From: sairagula Date: Wed, 25 Oct 2017 15:11:59 -0700 Subject: [PATCH 283/348] stars showing on average rating --- app/assets/images/stars.png | Bin 0 -> 3945 bytes app/views/products/_review.html.erb | 16 +++++++++++++++- app/views/products/show.html.erb | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/stars.png diff --git a/app/assets/images/stars.png b/app/assets/images/stars.png new file mode 100644 index 0000000000000000000000000000000000000000..b55a9b381472675c431b82b406cf90e0fc6752b2 GIT binary patch literal 3945 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 DFGF4t literal 0 HcmV?d00001 diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index 24a39f3508..8006354b3a 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -6,7 +6,20 @@ <%else%>
    Guest:
    <%end%> -
    Rating: <%=review.rating %>
    +
    Rating: + <% rating = review.rating %> + <% if rating <= 1 %> + â­‘â­’â­’â­’â­’ + <% elsif rating <= 2 %> + â­‘â­‘â­’â­’â­’ + <% elsif rating <= 3 %> + â­‘â­‘â­‘â­’â­’ + <% elsif rating <= 4 %> + â­‘â­‘â­‘â­‘â­’ + <% else %> + â­‘â­‘â­‘â­‘â­‘ + <% end %> +
    <%= review.updated_at.strftime("%b %d, %Y") %>
    <%= review.description %>
    @@ -16,4 +29,5 @@
    <%= link_to "Edit", edit_review_path(review.id) %>
    <%= link_to "Delete", review_path(review.id), method: :delete, data: { confirm: "Are you sure?" }%>
    <% end %> +
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 94c2f6c3cd..0a75f280e5 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -41,7 +41,20 @@
    <%= link_to "Add review", new_product_review_path(@product.id) %> -

    Average Review: <%= @product.reviews.average(:rating) %>

    +

    Average Review: + <% rating = @product.reviews.average(:rating) %> + <% if rating <= 1 %> + â­‘â­’â­’â­’â­’ + <% elsif rating <= 2 %> + â­‘â­‘â­’â­’â­’ + <% elsif rating <= 3 %> + â­‘â­‘â­‘â­’â­’ + <% elsif rating <= 4 %> + â­‘â­‘â­‘â­‘â­’ + <% else %> + â­‘â­‘â­‘â­‘â­‘ + <% end %> +

    <% @product.reviews.each do |review| %> <%= render partial: 'review', locals: {review: review} %> <% end %> From 11f722f19ec20906bbf7f65f31f78d3168c6c986 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 15:24:24 -0700 Subject: [PATCH 284/348] added validations for orders fixtures --- test/fixtures/orders.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 764696f1be..f8582ff0df 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -6,6 +6,8 @@ order: merchant_id: :ada cust_cc: 12345 cust_cc_exp: 11/22 + cvv: 111 + zip_code: 32444 cust_addr: Sea World cust_email: forkhair@mermaid.com status: pending @@ -15,6 +17,8 @@ other_order: merchant_id: :grace cust_cc: 5432314 cust_cc_exp: 66/66 + cvv: 111 + zip_code: 32444 cust_addr: Fire World cust_email: flameshair@mermaid.com status: pending From 0064378a32364f4fe128ca73e5eaafadad32fbf9 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 15:27:54 -0700 Subject: [PATCH 285/348] fix card formatting for profile summary page --- app/assets/stylesheets/merchants.scss | 4 ++++ app/views/merchants/summary.html.erb | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index ef06236227..3e3845d8d1 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -24,6 +24,10 @@ font-size: 5rem; } +.card-title { + height: 4rem; +} + .profile-button { display: block; margin: auto; diff --git a/app/views/merchants/summary.html.erb b/app/views/merchants/summary.html.erb index 9935d4c44b..ee41adf8ca 100644 --- a/app/views/merchants/summary.html.erb +++ b/app/views/merchants/summary.html.erb @@ -6,7 +6,9 @@
    -

    Shopping Cart

    +
    +

    Shopping Cart

    +
    <%= session[:cart].count %> <%= link_to "Go To Cart", shopping_cart_path, class: 'button profile-button' %>
    @@ -14,7 +16,9 @@
    -

    Currently Selling

    +
    +

    Currently Selling

    +
    <%= @user.active_products.count %> <%= link_to "Inventory Management", self_inventory_path, class: 'button profile-button' %>
    @@ -22,7 +26,9 @@
    -

    Pending Orders

    +
    +

    Pending Orders

    +
    <%= @user.pending_orders.count %> <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %>
    @@ -30,7 +36,9 @@
    -

    Purchased Orders

    +
    +

    Purchased Orders

    +
    <%= @user.orders.count %> <%= link_to "Past Orders", orders_path, class: 'button profile-button' %>
    @@ -38,7 +46,9 @@
    -

    Total Revenue

    +
    +

    Total Revenue

    +
    <%= money(@user.total_revenue, true) %> <%= link_to "Income Details", self_revenue_path, class: 'button profile-button' %>
    @@ -46,7 +56,9 @@
    -

    Completed Orders

    +
    +

    Completed Orders

    +
    <%= @user.shipped_orders.count %> <%= link_to "Completed Orders", self_completed_path, class: 'button profile-button' %>
    From c3ed1bdd5329ed57fa9d8df09d99724795044885 Mon Sep 17 00:00:00 2001 From: kee nam Date: Wed, 25 Oct 2017 15:51:29 -0700 Subject: [PATCH 286/348] Passed orders_controllers.rb basic tests --- app/controllers/orders_controller.rb | 10 ++-- test/controllers/orders_controller_test.rb | 59 ++++++++-------------- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index a19e2412fd..eaace23882 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -7,8 +7,6 @@ def index if session[:merchant] merchant_id = session[:merchant]['id'] @orders = Merchant.find(merchant_id).orders - else - @orders = nil end end @@ -46,9 +44,14 @@ def update if find_order_by_params_id @order.update_attributes(order_params) if @order.save + flash[:status] = :success + flash[:message] = "Successfully updated order" redirect_to order_path(@order) return else + flash.now[:status] = :failure + flash.now[:message] = "Order could not be updated" + flash.now[:details] = @order.errors.messages render :edit, status: :bad_request return end @@ -56,6 +59,7 @@ def update end def confirmation + # route successful orders to a confirmation order summary page find_order_by_params_id end @@ -63,7 +67,7 @@ def confirmation def order_params # parameters for the order - return params.require(:order).permit(:cust_name, :status, :cust_email, :cust_cc, :cust_cc_exp, :cust_addr, :merchant_id) + return params.require(:order).permit(:cust_name, :status, :cust_email, :cust_cc, :cust_cc_exp, :cust_addr, :merchant_id, :order_products) end def find_order_by_params_id diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 9ca37f4992..1c4ccbb29f 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -18,7 +18,14 @@ end describe "create" do - it "adds order to the database and redirects when the data is valid" do + it "adds order to the database with at least 1 order product and redirects when the data is valid" do + login_test_user + cart_params = { + "quantity" => 4, + "id" => products(:wand).id + } + post add_to_cart_path(products(:wand).id), params: cart_params + order = { order: { cust_name: "Mermaid", @@ -32,14 +39,14 @@ updated_at: Time.now } } - good_order = Order.new(order[:another_order]) + good_order = Order.new(order[:order]) good_order.must_be :valid? start_count = Order.count post orders_path, params: order must_respond_with :redirect - must_redirect_to orders_path + must_redirect_to confirmation_path(Order.last.id) Order.count.must_equal start_count + 1 flash[:status].must_equal :success flash[:message].must_include "Successfully created order" @@ -68,14 +75,14 @@ end describe "show" do - it "returns success with valid id" do + it "returns success with valid id when logged in" do login_test_user order_id = Order.first.id get order_path(order_id) must_respond_with :success end - it "returns not_found with invalid id" do + it "returns not_found with invalid id when logged in" do login_test_user invalid_id = Order.last.id + 1 get order_path(invalid_id) @@ -84,7 +91,8 @@ end describe "update" do - it "returns success if order product exists and changes are valid" do + it "returns success if at least 1 order product exists and changes are valid" do + login_test_user order = Order.first changes = { order: { @@ -95,44 +103,19 @@ order.must_be :valid? patch order_path(order), params: changes - must_respond_with :redirect - must_redirect_to order_path(order) + must_respond_with :redirect + must_redirect_to order_path(order.id) order.reload order.cust_name.must_equal changes[:order][:cust_name] end + end - it "returns not_found if work does not exist" do - order = Order.first - changes = { - order: { - cust_name: "Wienerschnitzel" - } - } - order.update_attributes(changes[:order]) - order.must_be :valid? - order.destroy + describe "confirmation" do + it "shows the order summary of an order after it is created for a guest user" do + end - patch order_path(order), params: changes - must_respond_with :not_found + it "shows the order summary of an order after it is created for a logged in user" do end end - - # describe "destroy" do - # it "returns success and destroys if order exists" do - # order = Order.first - # order.must_be :valid? - # delete order_path(order) - # must_respond_with :redirect - # must_redirect_to orders_path - # end - # - # it "returns not_found if work does not exist" do - # order = Order.first - # order.must_be :valid? - # delete order_path(order) - # delete order_path(order) - # must_respond_with :not_found - # end - # end end From 3d9a5cb0b6b4c5bdb5237c662ca6a7488f3cf95b Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 15:55:14 -0700 Subject: [PATCH 287/348] added orders controller params --- app/controllers/orders_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index eaace23882..6aea3c42b3 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -67,7 +67,7 @@ def confirmation def order_params # parameters for the order - return params.require(:order).permit(:cust_name, :status, :cust_email, :cust_cc, :cust_cc_exp, :cust_addr, :merchant_id, :order_products) + return params.require(:order).permit(:cust_name, :status, :cust_email, :cust_cc, :cust_cc_exp, :cust_addr, :merchant_id, :order_products, :cvv, :zip_code) end def find_order_by_params_id From 857b35e59962b9cb1e53b36366d8d32081d66e5b Mon Sep 17 00:00:00 2001 From: Roxanne Date: Wed, 25 Oct 2017 15:58:33 -0700 Subject: [PATCH 288/348] changed orders controller test --- test/controllers/orders_controller_test.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 1c4ccbb29f..6e7f159d3a 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -34,6 +34,8 @@ cust_cc_exp: "11/22", cust_addr: "Sea World", cust_email: "forkhair@mermaid.com", + cvv: 123, + zip_code: 32444, status: "complete", created_at: Time.now, updated_at: Time.now @@ -60,6 +62,8 @@ cust_cc: 12345, cust_cc_exp: "11/22", cust_addr: "Sea World", + cvv: 123, + zip_code: 32444, cust_email: "forkhair@mermaid.com", status: "" } From 63fe3e8c5302ccc724648ef99f5856f8fe905dc7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 19:27:43 -0700 Subject: [PATCH 289/348] starter tests for main controller --- app/controllers/main_controller.rb | 7 ++++--- test/controllers/main_controller_test.rb | 22 +++++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index bd01f39d53..2c9965cc8b 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -1,16 +1,17 @@ class MainController < ApplicationController def index - @products = Product.all - @merchants = Merchant.all end def add_to_cart if session[:cart].nil? session[:cart] = [] end - order_product = OrderProduct.create(quantity: params["quantity"], product_id: params["id"], status: "pending") + find_object_by_params(Product) + order_product = OrderProduct.create(quantity: params["quantity"], product_id: @product.id, status: "pending") session[:cart] << order_product.id + flash[:status] = :success + flash[:message] = "#{@product.name} added to cart." redirect_to products_path end diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb index 036ebec531..2c335a24dc 100644 --- a/test/controllers/main_controller_test.rb +++ b/test/controllers/main_controller_test.rb @@ -1,11 +1,27 @@ require "test_helper" describe MainController do + let(:wand) { products(:wand) } + + it 'can successfully access the index page' do + get root_path + + must_respond_with :success + end + + describe '#add_to_cart' do + it 'adds items to cart' do + params = { + "quantity" => "4", + "id" => wand.id + } + + get add_to_cart_path(wand.id), params: params + + binding.pry - describe "#index" do - it "should respond with success" do - get root_path must_respond_with :success + flash[:status].must_equal :success end end end From 42c2fef74eeeb643978e43644848eb7da563c53b Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 19:29:21 -0700 Subject: [PATCH 290/348] test typo --- test/controllers/main_controller_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb index 2c335a24dc..aa0e41172e 100644 --- a/test/controllers/main_controller_test.rb +++ b/test/controllers/main_controller_test.rb @@ -16,7 +16,7 @@ "id" => wand.id } - get add_to_cart_path(wand.id), params: params + post add_to_cart_path(wand.id), params: params binding.pry From 29c2aa2a81c4134f9ee875efb6d7609b578c3f95 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 19:45:16 -0700 Subject: [PATCH 291/348] tests for add_to_cart --- app/controllers/main_controller.rb | 23 +++++++++------ test/controllers/main_controller_test.rb | 37 ++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index 2c9965cc8b..901b65aff3 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -1,22 +1,27 @@ class MainController < ApplicationController + before_action only: [:add_to_cart] do + find_object_by_params(Product) + end + def index end def add_to_cart - if session[:cart].nil? - session[:cart] = [] - end - find_object_by_params(Product) order_product = OrderProduct.create(quantity: params["quantity"], product_id: @product.id, status: "pending") - session[:cart] << order_product.id - flash[:status] = :success - flash[:message] = "#{@product.name} added to cart." - redirect_to products_path + if order_product.valid? + session[:cart] << order_product.id + flash[:status] = :success + flash[:message] = "#{@product.name} added to cart." + redirect_to products_path + else + flash[:status] = :failure + flash[:message] = "#{@product.name} could not be added to cart." + redirect_to products_path + end end def shopping_cart - session[:cart] ||= [] @products = OrderProduct.find_in_cart(session[:cart]) end end diff --git a/test/controllers/main_controller_test.rb b/test/controllers/main_controller_test.rb index aa0e41172e..af3db93f5c 100644 --- a/test/controllers/main_controller_test.rb +++ b/test/controllers/main_controller_test.rb @@ -9,6 +9,12 @@ must_respond_with :success end + it 'can successfully access the shopping cart page' do + get shopping_cart_path + + must_respond_with :success + end + describe '#add_to_cart' do it 'adds items to cart' do params = { @@ -18,10 +24,35 @@ post add_to_cart_path(wand.id), params: params - binding.pry - - must_respond_with :success + must_respond_with :found flash[:status].must_equal :success + session[:cart].length.must_equal 1 + end + + it 'returns not_found for DNE product' do + bad_id = Product.last.id + 1 + params = { + "quantity" => "4", + "id" => bad_id + } + + post add_to_cart_path(bad_id), params: params + + must_respond_with :not_found + session[:cart].length.must_equal 0 + end + + it 'wont work if no quantity is passed' do + params = { + "id" => wand.id + } + + post add_to_cart_path(wand.id), params: params + + must_respond_with :found + flash[:status].must_equal :failure + + session[:cart].length.must_equal 0 end end end From 95ebe4bafa41ba7827dcc9fbc552f936d1e06098 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Wed, 25 Oct 2017 20:31:54 -0700 Subject: [PATCH 292/348] add order date, link to product page to order status pages --- app/assets/stylesheets/merchants.scss | 25 ++++++++++++++++ app/controllers/application_controller.rb | 12 +------- app/views/merchants/completed.html.erb | 27 ++++++++++------- app/views/merchants/pending.html.erb | 35 +++++++++++++---------- app/views/merchants/summary.html.erb | 2 +- 5 files changed, 64 insertions(+), 37 deletions(-) diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 3e3845d8d1..3472bd5dc1 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -35,6 +35,15 @@ width: 80%; } +.summary-empty { + color: grey; +} + +.summary-urgent { + color: crimson; +} + + // @media print, screen and (min-width: 40em) { // .profile-card { // min-height: 15.5rem; @@ -66,3 +75,19 @@ input.inventory-form { .new-product-button { margin: 3rem 0; } + + +// ORDER PAGES + +.order-product span { + margin: 0; +} + +.ord-name { + overflow-x: hidden; + white-space: nowrap; +} + +.button.ship-btn { + margin: 0; +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 53843934f3..00c56479b2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -29,7 +29,7 @@ def confirm_object_ownership(model, merchant_id) unless session[:merchant]['id'] == merchant_id flash[:status] = :failure flash[:message] = "Only a #{model}'s creator can modify a #{model}." - return redirect_back(fallback_location: pathfinder(model.class)) + return redirect_back(fallback_location: root_path) end end @@ -54,14 +54,4 @@ def check_for_product_owner_nested redirect_to product_path(@product) end end - - private - def pathfinder(model) - case model - when Product - return products_path - else - return root_path - end - end end diff --git a/app/views/merchants/completed.html.erb b/app/views/merchants/completed.html.erb index 8023184df0..4732f67033 100644 --- a/app/views/merchants/completed.html.erb +++ b/app/views/merchants/completed.html.erb @@ -8,23 +8,30 @@ <% @order_products.each do |op| %>
    - > - + > +
    -

    <%= op.product.name %>

    -

    Quantity: <%= op.quantity %>

    -

    Price: <%= money(op.product.price) %>

    -

    Total: <%= money(op.total) %>

    +

    <%= link_to op.product.name, product_path(op.product.id) %>

    +

    Quantity: <%= op.quantity %>

    +

    Price: <%= money(op.product.price) %>

    +

    Total: <%= money(op.total) %>

    -
    +
    -

    - Customer: <%= op.order.cust_name %> +

    + Customer: <%= op.order.cust_name %>

    -

    +

    + Order Placed: <%= op.order.created_at.strftime('%B %d, %Y') %> +

    +

    + Order Status: Completed +

    + +

    <%= op.order.cust_addr %>

    diff --git a/app/views/merchants/pending.html.erb b/app/views/merchants/pending.html.erb index ce752792bc..91fdb6fea1 100644 --- a/app/views/merchants/pending.html.erb +++ b/app/views/merchants/pending.html.erb @@ -8,33 +8,38 @@ <% @order_products.each do |op| %>
    - > - + > +
    -

    <%= op.product.name %>

    -

    Quantity: <%= op.quantity %>

    -

    Price: <%= money(op.product.price) %>

    -

    Total: <%= money(op.total) %>

    +

    <%= link_to op.product.name, product_path(op.product.id) %>

    +

    Quantity: <%= op.quantity %>

    +

    Price: <%= money(op.product.price) %>

    +

    Total: <%= money(op.total) %>

    -
    +
    -

    - Customer: <%= op.order.cust_name %> +

    + Customer: <%= op.order.cust_name %>

    -

    +

    + Order Placed: <%= op.order.created_at.strftime('%B %d, %Y') %> +

    +

    + Order Status: Completed +

    + +

    <%= op.order.cust_addr %>

    + + <%= link_to "Mark Shipped", mark_shipped_path(op.id), class: 'button medium-12 columns ship-btn' %> +
    - - - <%= link_to "Mark Shipped", mark_shipped_path(op.id), class: 'button medium-12 columns ship-btn' %> -
    -
    <% end %> <% end %> diff --git a/app/views/merchants/summary.html.erb b/app/views/merchants/summary.html.erb index ee41adf8ca..46abfffdec 100644 --- a/app/views/merchants/summary.html.erb +++ b/app/views/merchants/summary.html.erb @@ -29,7 +29,7 @@

    Pending Orders

    - <%= @user.pending_orders.count %> + "><%= @user.pending_orders.count %> <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %>
    From c6a5ba0c1e6be22641d517902d4cb3b950c6d05f Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 26 Oct 2017 01:08:46 -0700 Subject: [PATCH 293/348] Rating with stars works --- app/assets/stylesheets/reviews.scss | 78 ++++++++++++++++++++++--- app/views/reviews/_review_form.html.erb | 18 ++++-- app/views/reviews/new.html.erb | 2 +- 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index c95552a85c..516d5b9570 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -2,16 +2,10 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ -// .review{ -// padding-left: 10%; -// background-color: white; -// border: .5px solid black; -// border-radius: 1rem; -// color: black; -// } +///////***Partial view***//////////// + .first_line_info h6{ display: inline-block; - // text-indent: 2rem; } .change{ background-color: white; @@ -26,3 +20,71 @@ border-radius: 1rem; color: black; } + +//////////////****Review form****///////////// + +// .description{ +// margin-top: 10rem; +// // float: left; +// // clear: right; +// } +// .text_command{ +// margin-top: 5rem; +// padding-left: 10%; +// } +// .rating .text_command{ +// display: inline-block; +// margin-top: 7%; +// // padding-right: 15%; +// +// width: 60%; +// } + +.rating:not(:checked) > input { + position:absolute; + top:-9999px; + clip:rect(0,0,0,0); +} + +.rating:not(:checked) > label { + float:right; + width:1.2em; + padding:0 .1em; + overflow:hidden; + white-space:nowrap; + cursor:pointer; + font-size:200%; + line-height:1.2; + color:#ddd; + text-shadow:1px 1px #bbb, 2px 2px #666, .1em .1em .2em rgba(0,0,0,.5); +} + +.rating:not(:checked) > label:before { + content: '★ '; +} + +.rating > input:checked ~ label { + color: #f70; + text-shadow:1px 1px #c60, 2px 2px #940, .1em .1em .2em rgba(0,0,0,.5); +} + +.rating:not(:checked) > label:hover, +.rating:not(:checked) > label:hover ~ label { + color: gold; + text-shadow:1px 1px goldenrod, 2px 2px #B57340, .1em .1em .2em rgba(0,0,0,.5); +} + +.rating > input:checked + label:hover, +.rating > input:checked + label:hover ~ label, +.rating > input:checked ~ label:hover, +.rating > input:checked ~ label:hover ~ label, +.rating > label:hover ~ input:checked ~ label { + color: #ea0; + text-shadow:1px 1px goldenrod, 2px 2px #B57340, .1em .1em .2em rgba(0,0,0,.5); +} + +.rating > label:active { + position:relative; + top:2px; + left:2px; +} diff --git a/app/views/reviews/_review_form.html.erb b/app/views/reviews/_review_form.html.erb index 349aaf31cc..825d3479bb 100644 --- a/app/views/reviews/_review_form.html.erb +++ b/app/views/reviews/_review_form.html.erb @@ -1,10 +1,20 @@ + <%= form_for @review do |f| %> - <%= f.label :rating %> - <%= f.select :rating, options_for_select([1, 2, 3, 4, 5], :selected => @review.rating) %> - <%= f.label :description %> - <%= f.text_field :description %> +
    + + <%= f.radio_button(:rating, "5") %> <%= f.label(:rating.to_s + "_5") %> + <%= f.radio_button(:rating, "4") %> <%= f.label(:rating.to_s + "_4") %> + <%= f.radio_button(:rating, "3") %> <%= f.label(:rating.to_s + "_3") %> + <%= f.radio_button(:rating, "2") %> <%= f.label(:rating.to_s + "_2") %> + <%= f.radio_button(:rating, "1") %> <%= f.label(:rating.to_s + "_1") %> +
    + +
    + <%= f.label :description %> + <%= f.text_field :description %> +
    <%= f.hidden_field :product_id, value: @review.product_id %> <%= f.submit button, class: 'button' %> diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index f879f86868..28b6c7377a 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,2 +1,2 @@ -

    Add review to the product

    +

    Please rate the product:

    <%= render partial: "review_form", locals: {button: "Submit review"} %> From 44e1b4959f23cbea4b5ed38eec29cb2ae4922a4e Mon Sep 17 00:00:00 2001 From: kee nam Date: Thu, 26 Oct 2017 02:49:03 -0700 Subject: [PATCH 294/348] 100% test coverage on order_controllers.rb --- app/controllers/orders_controller.rb | 11 +-- app/views/orders/edit.html.erb | 0 config/routes.rb | 2 +- test/controllers/orders_controller_test.rb | 89 +++++++++++++++++++++- test/fixtures/order_products.yml | 19 ++--- test/fixtures/orders.yml | 11 ++- 6 files changed, 112 insertions(+), 20 deletions(-) create mode 100644 app/views/orders/edit.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 6aea3c42b3..82f894e319 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -39,6 +39,12 @@ def show find_order_by_params_id end + def edit + # edit the order if it belongs to the merchant (buyer) + find_order_by_params_id + confirm_object_ownership(@order, @order.merchant_id) + end + def update # edit the desired order if it belongs to the merchant (buyer) if find_order_by_params_id @@ -58,11 +64,6 @@ def update end end - def confirmation - # route successful orders to a confirmation order summary page - find_order_by_params_id - end - private def order_params diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/config/routes.rb b/config/routes.rb index 8b2c853795..09f1a0f425 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,7 +8,7 @@ resources :order_products, only:[:index], as: 'sold' end - resources :orders, except: [:edit] + resources :orders resources :order_products, only: [:update, :destroy] get '/products/:id/categories', to: 'categories#add', as: 'add_categories' post '/products/:id/categories', to: 'products#add_categories' diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 6e7f159d3a..fa7a35e58e 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -8,6 +8,12 @@ get merchant_orders_path(merchant) must_respond_with :success end + + it "will not show page to guest users" do + merchant = :ada + get merchant_orders_path(merchant) + must_redirect_to root_path + end end describe "new" do @@ -94,6 +100,38 @@ end end + describe "edit" do + it "returns success when the order belongs to the merchant" do + login_test_user + cart_params = { + "quantity" => 4, + "id" => products(:wand).id + } + post add_to_cart_path(products(:wand).id), params: cart_params + order = { + order: { + cust_name: "Mermaid", + merchant_id: merchants(:ada).id, + cust_cc: 12345, + cust_cc_exp: "11/22", + cust_addr: "Sea World", + cust_email: "forkhair@mermaid.com", + cvv: 123, + zip_code: 32444, + status: "complete", + created_at: Time.now, + updated_at: Time.now + } + } + order = Order.create!(order[:order]) + order_id = Order.last.id + get edit_order_path(order_id) + must_respond_with :success + end + it "returns failure when the order does not belong to the merchant" do + end + end + describe "update" do it "returns success if at least 1 order product exists and changes are valid" do login_test_user @@ -113,13 +151,56 @@ order.reload order.cust_name.must_equal changes[:order][:cust_name] end - end - describe "confirmation" do - it "shows the order summary of an order after it is created for a guest user" do + it "returns failure if at least 1 order product exists and changes are invalid" do + login_test_user + order = Order.first + changes = { + order: { + cust_name: "" + } + } + order.update_attributes(changes[:order]) + order.wont_be :valid? + + patch order_path(order), params: changes + + must_respond_with :bad_request end + end - it "shows the order summary of an order after it is created for a logged in user" do + describe "confirmation" do + it "shows the order summary of an order" do + # login_test_user + # cart_params = { + # "quantity" => 4, + # "id" => products(:wand).id + # } + # post add_to_cart_path(products(:wand).id), params: cart_params + # + # order = { + # order: { + # cust_name: "Mermaid", + # merchant_id: 21, + # cust_cc: 12345, + # cust_cc_exp: "11/22", + # cust_addr: "Sea World", + # cust_email: "forkhair@mermaid.com", + # cvv: 123, + # zip_code: 32444, + # status: "complete", + # created_at: Time.now, + # updated_at: Time.now + # } + # } + # good_order = Order.new(order[:order]) + # good_order.must_be :valid? + # start_count = Order.count + # + # post orders_path, params: order + # + # must_respond_with :redirect + # must_redirect_to confirmation_path(Order.last.id) end end end diff --git a/test/fixtures/order_products.yml b/test/fixtures/order_products.yml index 3139823c53..0ca4de9018 100644 --- a/test/fixtures/order_products.yml +++ b/test/fixtures/order_products.yml @@ -1,16 +1,17 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -# This model initially had no columns defined. If you add columns to the -# model remove the "{}" from the fixture names and add the columns immediately -# below each fixture, per the syntax in the comments below - - one: quantity: 2 product: mermaid_fin order: order status: pending +two: + quantity: 3 + product: mermaid_fin + order: order + status: shipped + order_products: quantity: 2 product: mermaid_fin @@ -23,8 +24,8 @@ other_order_products: order: order status: pending -two: - quantity: 3 +guest_op: + quantity: 5 product: mermaid_fin - order: order - status: shipped + order: guest_order + status: pending diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index f8582ff0df..8b21c8ea8c 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -1,6 +1,5 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html - order: cust_name: Mermaid merchant_id: :ada @@ -22,3 +21,13 @@ other_order: cust_addr: Fire World cust_email: flameshair@mermaid.com status: pending + +guest_order: + cust_name: Gaston + cust_cc: 1234098756 + cust_cc_exp: 12/48 + cvv: 324 + zip_code: 56123 + cust_addr: A small provincial town + cust_email: gaston@beautybeast.com + status: pending From 2f92617fa533588b4baaa8758a4f9c8e72817147 Mon Sep 17 00:00:00 2001 From: kee nam Date: Thu, 26 Oct 2017 04:11:38 -0700 Subject: [PATCH 295/348] Editing order_products controller tests -- 1 error --- app/controllers/order_products_controller.rb | 6 ++-- app/models/order_product.rb | 8 +++++ .../order_products_controller_test.rb | 21 ++++++++--- test/controllers/orders_controller_test.rb | 35 ------------------- 4 files changed, 26 insertions(+), 44 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 41b5b48613..af996164e1 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -6,12 +6,11 @@ def index def update if find_order_product_by_params_id @order_product.update_attributes(order_product_params) - if @order_product.save + if @order_product.save && @order_product.check_quantity redirect_to shopping_cart_path - # redirect_to order_product_path(@order_product) return else - render :edit, status: :bad_request + render 'main/shopping_cart', status: :bad_request return end end @@ -23,7 +22,6 @@ def destroy flash[:status] = :success flash[:message] = "Deleted item #{@order_product.product.name} from cart" redirect_to shopping_cart_path - # redirect_to merchant_sold_index_path(@order_product.product.merchant) end end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 1cb92ec4ee..aee4465872 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -11,4 +11,12 @@ def total def self.find_in_cart(cart) OrderProduct.all.find_all { |order_product| cart.include? order_product.id } unless cart.nil? end + + def check_quantity + if product.quantity < quantity + return false + else + return true + end + end end diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index f44bdbfd41..03bf759c2c 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -22,13 +22,24 @@ patch order_product_path(order_product), params: changes must_respond_with :redirect - must_redirect_to order_product_path(order_product) + must_redirect_to shopping_cart_path order_product.reload order_product.quantity.must_equal changes[:order_product][:quantity] end - it "returns not_found if work does not exist" do + it "returns failure if order product exists and changes are invalid" do + order_product = OrderProduct.first + changes = { + order_product: { + quantity: 900000 + } + } + patch order_product_path(order_product), params: changes + order_product.wont_be :valid? + end + + it "returns not_found if order product does not exist" do order_product = OrderProduct.first changes = { order_product: { @@ -45,15 +56,15 @@ end describe "destroy" do - it "returns success and destroys if work exists" do + it "returns success and destroys if order product exists" do order_product = OrderProduct.first order_product.must_be :valid? delete order_product_path(order_product) must_respond_with :redirect - must_redirect_to merchant_sold_index_path(order_product.product.merchant) + must_redirect_to shopping_cart_path end - it "returns not_found if work does not exist" do + it "returns not_found if order product does not exist" do order_product = OrderProduct.first order_product.must_be :valid? delete order_product_path(order_product) diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index fa7a35e58e..bedcb6c29e 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -168,39 +168,4 @@ must_respond_with :bad_request end end - - describe "confirmation" do - it "shows the order summary of an order" do - # login_test_user - # cart_params = { - # "quantity" => 4, - # "id" => products(:wand).id - # } - # post add_to_cart_path(products(:wand).id), params: cart_params - # - # order = { - # order: { - # cust_name: "Mermaid", - # merchant_id: 21, - # cust_cc: 12345, - # cust_cc_exp: "11/22", - # cust_addr: "Sea World", - # cust_email: "forkhair@mermaid.com", - # cvv: 123, - # zip_code: 32444, - # status: "complete", - # created_at: Time.now, - # updated_at: Time.now - # } - # } - # good_order = Order.new(order[:order]) - # good_order.must_be :valid? - # start_count = Order.count - # - # post orders_path, params: order - # - # must_respond_with :redirect - # must_redirect_to confirmation_path(Order.last.id) - end - end end From cfcb352a118503b44ca6e3d6770acbd93920f6d9 Mon Sep 17 00:00:00 2001 From: kee nam Date: Thu, 26 Oct 2017 04:14:47 -0700 Subject: [PATCH 296/348] Added edit button and form to orders --- app/views/orders/edit.html.erb | 4 ++++ app/views/orders/show.html.erb | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/views/orders/edit.html.erb b/app/views/orders/edit.html.erb index e69de29bb2..88fbc5a55a 100644 --- a/app/views/orders/edit.html.erb +++ b/app/views/orders/edit.html.erb @@ -0,0 +1,4 @@ +
    +

    Edit order

    + <%= render partial: "form", locals: { hide_placeholder_text: true, button_text: "Save Changes" }%> +
    diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 1ad365861b..95181a13df 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -39,6 +39,10 @@

    +
    + <%= link_to "Edit", edit_order_path(@order), class: 'button' %> +
    +
    From bc7ceb7ebf2a840abf7ce9e6845aa3f494e8eca7 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 26 Oct 2017 09:33:03 -0700 Subject: [PATCH 297/348] add conditionals to shopping cart --- app/views/main/shopping_cart.html.erb | 66 ++++++++++--------- .../order_products_controller_test.rb | 2 +- 2 files changed, 35 insertions(+), 33 deletions(-) diff --git a/app/views/main/shopping_cart.html.erb b/app/views/main/shopping_cart.html.erb index 8e1870003a..08ff55c0a7 100644 --- a/app/views/main/shopping_cart.html.erb +++ b/app/views/main/shopping_cart.html.erb @@ -1,44 +1,46 @@

    Shopping Cart

    - <% @products.each do |order_product| %> - <%= form_for order_product do |f| %> -
    + <% if @products %> + <% @products.each do |order_product|%> + <%= form_for order_product do |f| %> +
    - > - -
    -
    -

    <%= order_product.product.name %>

    + > + +
    +
    +

    <%= order_product.product.name %>

    +
    -
    -
    -

    Price: - <%= money(order_product.product.price) %> -

    -
    -
    - <%= f.label :quantity, "Quantity:", class: 'shopping-cart-form' %> - <%= f.text_field :quantity, class: 'shopping-cart-form' %> -
    -
    -

    Total: - <%= money(order_product.total) %> -

    -
    -
    - <%= f.submit "Update Item", class: 'button' %> - <%= link_to "Remove From Cart", order_product_path(order_product.id), method: :delete, data: { confirm: "Are you sure?" }, class: "button delete-button" %> -
    - +
    +

    Price: + <%= money(order_product.product.price) %> +

    +
    +
    + <%= f.label :quantity, "Quantity:", class: 'shopping-cart-form' %> + <%= f.text_field :quantity, class: 'shopping-cart-form' %> +
    +
    +

    Total: + <%= money(order_product.total) %> +

    +
    +
    + <%= f.submit "Update Item", class: 'button' %> + <%= link_to "Remove From Cart", order_product_path(order_product.id), method: :delete, data: { confirm: "Are you sure?" }, class: "button delete-button" %> +
    + -
    +
    + <% end %> + <% end %> - <% end %> - <% unless @products.empty? %> + <% unless @products.nil? || @products.empty? %>

    Cart Total: <%= money(total(@products)) %>

    <%= link_to "Checkout Cart", new_order_path, class: 'button' %> diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index 03bf759c2c..6553c37621 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -36,7 +36,7 @@ } } patch order_product_path(order_product), params: changes - order_product.wont_be :valid? + order_product.quantity.wont_equal 900000 end it "returns not_found if order product does not exist" do From f6a3fc8cfdec6d739d518f791348eaeac8bb4001 Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 26 Oct 2017 09:40:02 -0700 Subject: [PATCH 298/348] Added rating condition --- app/controllers/application_controller.rb | 20 ------------------- app/controllers/reviews_controller.rb | 22 +++++++++++++++++++++ app/views/products/show.html.erb | 24 ++++++++++++----------- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 00c56479b2..9c00a86610 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -33,25 +33,5 @@ def confirm_object_ownership(model, merchant_id) end end - def check_for_product_owner - unless session[:merchant].nil? - if @review.merchant_id == session[:merchant]["id"] - flash[:status] = :failure - flash[:result_text] = "Owner can not edit the review of the product!" - redirect_to product_path(@review.product_id) - end - end - end - def check_for_product_owner_nested - @product = Product.find_by(id: params[:product_id]) - unless @product - head :not_found - end - if !session[:merchant].nil? && @product.merchant_id == session[:merchant]["id"] - flash[:status] = :failure - flash[:result_text] = "Owner can not review the product!" - redirect_to product_path(@product) - end - end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 8c3541bace..d1115a2e95 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -88,4 +88,26 @@ def check_for_product_owner_nested redirect_to product_path(@product) end end + + # def check_for_product_owner + # unless session[:merchant].nil? + # if @review.merchant_id == session[:merchant]["id"] + # flash[:status] = :failure + # flash[:result_text] = "Owner can not edit the review of the product!" + # redirect_to product_path(@review.product_id) + # end + # end + # end + # + # def check_for_product_owner_nested + # @product = Product.find_by(id: params[:product_id]) + # unless @product + # head :not_found + # end + # if !session[:merchant].nil? && @product.merchant_id == session[:merchant]["id"] + # flash[:status] = :failure + # flash[:result_text] = "Owner can not review the product!" + # redirect_to product_path(@product) + # end + # end end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 0a75f280e5..baf8cc4400 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -43,17 +43,19 @@ <%= link_to "Add review", new_product_review_path(@product.id) %>

    Average Review: <% rating = @product.reviews.average(:rating) %> - <% if rating <= 1 %> - â­‘â­’â­’â­’â­’ - <% elsif rating <= 2 %> - â­‘â­‘â­’â­’â­’ - <% elsif rating <= 3 %> - â­‘â­‘â­‘â­’â­’ - <% elsif rating <= 4 %> - â­‘â­‘â­‘â­‘â­’ - <% else %> - â­‘â­‘â­‘â­‘â­‘ - <% end %> + <% if rating %> + <% if rating <= 1 %> + â­‘â­’â­’â­’â­’ + <% elsif rating <= 2 %> + â­‘â­‘â­’â­’â­’ + <% elsif rating <= 3 %> + â­‘â­‘â­‘â­’â­’ + <% elsif rating <= 4 %> + â­‘â­‘â­‘â­‘â­’ + <% else %> + â­‘â­‘â­‘â­‘â­‘ + <% end %> + <% end %>

    <% @product.reviews.each do |review| %> <%= render partial: 'review', locals: {review: review} %> From bdd2f693146e22bfd2348cc82b04ae516f7a1bf6 Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 26 Oct 2017 13:59:48 -0700 Subject: [PATCH 299/348] Average review fixed, style for new review page --- app/assets/stylesheets/reviews.scss | 41 +++++++++++++------------ app/views/products/show.html.erb | 34 ++++++++++---------- app/views/reviews/_review_form.html.erb | 3 +- app/views/reviews/new.html.erb | 2 +- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index 516d5b9570..bc80315c79 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -4,16 +4,16 @@ ///////***Partial view***//////////// -.first_line_info h6{ +.first_line_info h6 { display: inline-block; } -.change{ +.change { background-color: white; border: .5px solid black; border-radius: 1rem; color: inherit; } -.review_info{ +.review_info { padding-left: 10%; background-color: white; border: .5px solid black; @@ -22,23 +22,26 @@ } //////////////****Review form****///////////// +.new_review { + margin-top: 30px; + max-width: 600px; -// .description{ -// margin-top: 10rem; -// // float: left; -// // clear: right; -// } -// .text_command{ -// margin-top: 5rem; -// padding-left: 10%; -// } -// .rating .text_command{ -// display: inline-block; -// margin-top: 7%; -// // padding-right: 15%; -// -// width: 60%; -// } + h4 { + display: inline-block; + margin-right: 10px; + } + + .description { + margin-top: 20px; + } +} + +.rating { + display: inline-block; + position: relative; + top: 8px; + left: -10px; +} .rating:not(:checked) > input { position:absolute; diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index baf8cc4400..a56bc97bec 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -41,22 +41,24 @@
    <%= link_to "Add review", new_product_review_path(@product.id) %> -

    Average Review: - <% rating = @product.reviews.average(:rating) %> - <% if rating %> - <% if rating <= 1 %> - â­‘â­’â­’â­’â­’ - <% elsif rating <= 2 %> - â­‘â­‘â­’â­’â­’ - <% elsif rating <= 3 %> - â­‘â­‘â­‘â­’â­’ - <% elsif rating <= 4 %> - â­‘â­‘â­‘â­‘â­’ - <% else %> - â­‘â­‘â­‘â­‘â­‘ - <% end %> - <% end %> -

    + <% unless @product.reviews.empty?%> +

    Average Review: + <% rating = @product.reviews.average(:rating) %> + <% if rating %> + <% if rating <= 1 %> + â­‘â­’â­’â­’â­’ + <% elsif rating <= 2 %> + â­‘â­‘â­’â­’â­’ + <% elsif rating <= 3 %> + â­‘â­‘â­‘â­’â­’ + <% elsif rating <= 4 %> + â­‘â­‘â­‘â­‘â­’ + <% else %> + â­‘â­‘â­‘â­‘â­‘ + <% end %> + <% end %> +

    + <% end %> <% @product.reviews.each do |review| %> <%= render partial: 'review', locals: {review: review} %> <% end %> diff --git a/app/views/reviews/_review_form.html.erb b/app/views/reviews/_review_form.html.erb index 825d3479bb..18a6814966 100644 --- a/app/views/reviews/_review_form.html.erb +++ b/app/views/reviews/_review_form.html.erb @@ -1,9 +1,8 @@ <%= form_for @review do |f| %> - +

    Please rate the product:

    - <%= f.radio_button(:rating, "5") %> <%= f.label(:rating.to_s + "_5") %> <%= f.radio_button(:rating, "4") %> <%= f.label(:rating.to_s + "_4") %> <%= f.radio_button(:rating, "3") %> <%= f.label(:rating.to_s + "_3") %> diff --git a/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb index 28b6c7377a..4ddf851564 100644 --- a/app/views/reviews/new.html.erb +++ b/app/views/reviews/new.html.erb @@ -1,2 +1,2 @@ -

    Please rate the product:

    + <%= render partial: "review_form", locals: {button: "Submit review"} %> From f7fdcf1c9e1defa4b0b1eb4d084580e37f832a8d Mon Sep 17 00:00:00 2001 From: kee nam Date: Thu, 26 Oct 2017 14:36:14 -0700 Subject: [PATCH 300/348] Changed CSS for application.css, main.scss, and edited application.html.erb and main/index HTML pages --- app/assets/stylesheets/application.css | 64 ++++++++++++++++-- app/assets/stylesheets/main.scss | 21 ++++-- app/views/layouts/application.html.erb | 89 +++++++++++++++++++++----- app/views/main/index.html.erb | 7 +- 4 files changed, 150 insertions(+), 31 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index c48f55485d..dccc53aad1 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -18,22 +18,74 @@ /* ------ import URLS ------*/ @import url('https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'); +@import url('https://fonts.googleapis.com/css?family=Astloch:700|Josefin+Sans:400,600'); + * { /*border: 1px solid lawngreen;*/ } -.row { - max-width: 100%; + +/* ------ UNIVERSAL STYLES ------ */ +html { box-sizing: border-box; } +*, *:before, *:after { box-sizing: inherit; } +html, body { height: 100%; } +body { + width: 100%; + font-family: 'Josefin Sans', sans-serif; + font-size: 16px; + display: flex; + flex-direction: column; +} +h1, h2, h3, h4, h5, h6 { + font-family: 'Astloch', cursive; + font-weight: 700; } -header nav { - text-align: right; +/*--------------- header ---------------*/ +header.header { + background: #3C7A89; + padding: 1% 0; +} +h1.main-heading { margin: 0 0 0 1%; } +h1.main-heading a { color: #fefefe; } +main.main { + padding: 0; + flex: 1 0 auto; +} +footer.footer { + color: #fcfcfc; + background: #16262E; + text-align: center; + padding: 3% 6% 2%; } -.right { - float: right; +/*--------------- navigation ---------------*/ +header.header section { + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + align-items: center; } +nav.top-nav ul { + width: 100%; + display: flex; + flex-wrap: nowrap; + justify-content: flex-end; + align-items: center; + margin: 0; +} +nav.top-nav ul li { + width: 15%; + text-align: center; +} +nav.top-nav ul li a { color: #fefefe; } + + +.row { max-width: 100%; } +header nav { text-align: right; } +.right { float: right; } +/*--------------- mini thumbnails ---------------*/ div.mini-img { width: 150px; height: 150px; text-align: center; } div.mini-img img { max-width: 100%; max-height: 100%; } diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index 53aabe93b4..c187777340 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -6,22 +6,31 @@ background-image: url('http://3.bp.blogspot.com/-Z23LsR1pXhE/VN7uK5CR9yI/AAAAAAAAAOk/N_CksAB4Cbw/s1600/Dark%2BMagic%2BFloating%2BAway%2BFrom%2BCreepy%2BForest.jpg'); background-position: center center; background-size: cover; - height: 40rem; + background-repeat: no-repeat; + height: 45rem; text-align: center; width: 100%; } - .hero-text { + font-family: 'Josefin Sans', sans-serif; color: white; display: inline-block; - margin: 5rem auto; + width: 100%; + height: 100%; + background: rgba(0,0,0,0.5); } - +h1 span.hero-lorestore { + font-family: 'Astloch', cursive; + font-size: 3em; +} +h1.hero-title, h2.hero-subtitle { font-family: 'Josefin Sans', sans-serif; } h1.hero-title { + font-size: 2.5em; + margin-top: 10%; } - h2.hero-subtitle { - font-style: italic; + font-size: 1.8em; + margin-top: 5%; } ////////// diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 71a06f96fd..367bf93317 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -14,27 +14,83 @@
    -

    +

    <%= link_to "LoreStore", root_path %>

    -
    -
    <%= render partial: 'layouts/error-messages' if flash[:status] %>
    @@ -43,6 +99,5 @@

    Copyright © 2017 LoreStore

    - diff --git a/app/views/main/index.html.erb b/app/views/main/index.html.erb index c99d1d8b43..c4c42b58c4 100644 --- a/app/views/main/index.html.erb +++ b/app/views/main/index.html.erb @@ -1,6 +1,9 @@
    -

    Welcome to LoreStore

    -

    Your one-stop shop for all things magical or otherworldly

    +

    + Welcome to +
    LoreStore +

    +

    Your one-stop shop for all things magical or otherworldly

    From e2d3ec1a4a85d33e687cadd84b74eedef913b7fc Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 26 Oct 2017 14:36:21 -0700 Subject: [PATCH 301/348] Rating method moved to Review model --- app/assets/stylesheets/reviews.scss | 1 + app/models/review.rb | 18 +++++++++++++++++- app/views/products/_review.html.erb | 15 +-------------- app/views/products/show.html.erb | 22 ++++++---------------- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index bc80315c79..8312f7ef3b 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -19,6 +19,7 @@ border: .5px solid black; border-radius: 1rem; color: black; + margin-bottom: 20px; } //////////////****Review form****///////////// diff --git a/app/models/review.rb b/app/models/review.rb index cb9ab0641b..76d907615b 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -3,6 +3,22 @@ class Review < ApplicationRecord belongs_to :product validates :rating, presence: true, numericality: { only_integer: true }, inclusion: { in: 1..5 } - def average_rating + + def self.get_rating_stars(rating) + stars = "" + + if rating <= 1 + stars = "â­‘â­’â­’â­’â­’" + elsif rating <= 2 + stars = "â­‘â­‘â­’â­’â­’" + elsif rating <= 3 + stars = "â­‘â­‘â­‘â­’â­’" + elsif rating <= 4 + stars = "â­‘â­‘â­‘â­‘â­’" + else + stars = "â­‘â­‘â­‘â­‘â­‘" + end + + return stars end end diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index dc1c2c785e..576e0cf7bb 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -6,20 +6,7 @@ <%else%>
    Guest:
    <%end%> -
    Rating: - <% rating = review.rating %> - <% if rating <= 1 %> - â­‘â­’â­’â­’â­’ - <% elsif rating <= 2 %> - â­‘â­‘â­’â­’â­’ - <% elsif rating <= 3 %> - â­‘â­‘â­‘â­’â­’ - <% elsif rating <= 4 %> - â­‘â­‘â­‘â­‘â­’ - <% else %> - â­‘â­‘â­‘â­‘â­‘ - <% end %> -
    +
    Rating: <%= Review.get_rating_stars(review.rating) %>
    <%= review.updated_at.strftime("%b %d, %Y") %>
    <%= review.description %>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index a56bc97bec..624832d9f6 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -40,25 +40,15 @@
    - <%= link_to "Add review", new_product_review_path(@product.id) %> <% unless @product.reviews.empty?%> -

    Average Review: - <% rating = @product.reviews.average(:rating) %> - <% if rating %> - <% if rating <= 1 %> - â­‘â­’â­’â­’â­’ - <% elsif rating <= 2 %> - â­‘â­‘â­’â­’â­’ - <% elsif rating <= 3 %> - â­‘â­‘â­‘â­’â­’ - <% elsif rating <= 4 %> - â­‘â­‘â­‘â­‘â­’ - <% else %> - â­‘â­‘â­‘â­‘â­‘ - <% end %> - <% end %> +

    Average Review: + <%= Review.get_rating_stars(@product.reviews.average(:rating)) %>

    <% end %> + <%= link_to "Add review", new_product_review_path(@product.id), class: "columns small-6" %> +
    + +
    <% @product.reviews.each do |review| %> <%= render partial: 'review', locals: {review: review} %> <% end %> From a5e5b4acef912190e176fd342561fecf21455a0d Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 26 Oct 2017 14:36:52 -0700 Subject: [PATCH 302/348] added fun font awesome to products reviews. Thanks for the help, Kee. --- app/views/products/show.html.erb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index baf8cc4400..1578d811f7 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -40,7 +40,11 @@
    - <%= link_to "Add review", new_product_review_path(@product.id) %> + <%= link_to new_product_review_path(@product.id) do %> + + Add Review + <%#= link_to "Add review", new_product_review_path(@product.id) %> + <% end %>

    Average Review: <% rating = @product.reviews.average(:rating) %> <% if rating %> From e4bce3a5fcf73ff3083b59bdda47ad26c39a1d2d Mon Sep 17 00:00:00 2001 From: kee nam Date: Thu, 26 Oct 2017 14:40:25 -0700 Subject: [PATCH 303/348] Added background color to application.css --- app/assets/stylesheets/application.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index dccc53aad1..00e3621cdd 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -36,6 +36,7 @@ body { font-size: 16px; display: flex; flex-direction: column; + background: #fafafa; } h1, h2, h3, h4, h5, h6 { font-family: 'Astloch', cursive; From 8b643c20a9e7e4bf2911233de7960b4baad531c4 Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 26 Oct 2017 14:51:32 -0700 Subject: [PATCH 304/348] Review's get_rating_stars method is fully tested --- app/models/review.rb | 2 ++ test/models/review_test.rb | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/app/models/review.rb b/app/models/review.rb index 76d907615b..f2e56f2d14 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -7,6 +7,8 @@ class Review < ApplicationRecord def self.get_rating_stars(rating) stars = "" + return stars if !(rating.is_a? Numeric) + if rating <= 1 stars = "â­‘â­’â­’â­’â­’" elsif rating <= 2 diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 9150d63453..00f5369328 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -42,4 +42,38 @@ review.valid?.must_equal false end end + + describe "get_rating_stars" do + it 'returns 1 star if given a rating of 0-1' do + Review.get_rating_stars(0).must_equal "â­‘â­’â­’â­’â­’" + Review.get_rating_stars(0.5).must_equal "â­‘â­’â­’â­’â­’" + Review.get_rating_stars(1.0).must_equal "â­‘â­’â­’â­’â­’" + end + + it 'returns 2 star if given a rating of 1-2' do + Review.get_rating_stars(1.5).must_equal "â­‘â­‘â­’â­’â­’" + Review.get_rating_stars(2).must_equal "â­‘â­‘â­’â­’â­’" + end + + it 'returns 3 star if given a rating of 2-3' do + Review.get_rating_stars(2.5).must_equal "â­‘â­‘â­‘â­’â­’" + Review.get_rating_stars(3).must_equal "â­‘â­‘â­‘â­’â­’" + end + + it 'returns 4 star if given a rating of 3-4' do + Review.get_rating_stars(3.5).must_equal "â­‘â­‘â­‘â­‘â­’" + Review.get_rating_stars(4).must_equal "â­‘â­‘â­‘â­‘â­’" + end + + it 'returns 5 star if given a rating of greater than 4' do + Review.get_rating_stars(4.5).must_equal "â­‘â­‘â­‘â­‘â­‘" + Review.get_rating_stars(5).must_equal "â­‘â­‘â­‘â­‘â­‘" + Review.get_rating_stars(6).must_equal "â­‘â­‘â­‘â­‘â­‘" + end + + it 'returns empty string if rating is nil or empty' do + Review.get_rating_stars("").must_equal "" + Review.get_rating_stars(nil).must_equal "" + end + end end From 6ef0e2428ed5e974a6156dcece87bd390f481d45 Mon Sep 17 00:00:00 2001 From: Roxanne Date: Thu, 26 Oct 2017 14:54:44 -0700 Subject: [PATCH 305/348] added SPOOKY animation --- app/assets/stylesheets/main.scss | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/assets/stylesheets/main.scss b/app/assets/stylesheets/main.scss index c187777340..86b052ef99 100644 --- a/app/assets/stylesheets/main.scss +++ b/app/assets/stylesheets/main.scss @@ -1,6 +1,19 @@ // Place all the styles related to the Main controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +// @keyframes fadeIn { +// 0% {opacity: 0;} +// 100% {opacity: 1;} +// } +@-webkit-keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +@keyframes fadeIn { + 0% {opacity: 0;} + 100% {opacity: 1;} +} .hero { background-image: url('http://3.bp.blogspot.com/-Z23LsR1pXhE/VN7uK5CR9yI/AAAAAAAAAOk/N_CksAB4Cbw/s1600/Dark%2BMagic%2BFloating%2BAway%2BFrom%2BCreepy%2BForest.jpg'); @@ -22,6 +35,12 @@ h1 span.hero-lorestore { font-family: 'Astloch', cursive; font-size: 3em; + -webkit-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-name: fadeIn; + animation-name: fadeIn; } h1.hero-title, h2.hero-subtitle { font-family: 'Josefin Sans', sans-serif; } h1.hero-title { From ddff6e0842eb052e7f503075e7da74e3ea154334 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 26 Oct 2017 15:18:04 -0700 Subject: [PATCH 306/348] oops --- app/assets/stylesheets/_settings.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index b67ff00cdc..0ef2ccf1a5 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -860,4 +860,3 @@ $grid-padding-gutters: $grid-margin-gutters; $grid-container-padding: $grid-padding-gutters; $grid-container-max: $global-width; $block-grid-max: 8; - From d5cd5c41a340c2ad1be0bd3f306a0a64bc348ee4 Mon Sep 17 00:00:00 2001 From: sairagula Date: Thu, 26 Oct 2017 15:21:36 -0700 Subject: [PATCH 307/348] Colorin to stars added --- app/assets/stylesheets/reviews.scss | 4 ++++ app/views/products/_review.html.erb | 6 +++++- app/views/products/show.html.erb | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/reviews.scss b/app/assets/stylesheets/reviews.scss index 8312f7ef3b..6f9fbd04da 100644 --- a/app/assets/stylesheets/reviews.scss +++ b/app/assets/stylesheets/reviews.scss @@ -22,7 +22,11 @@ margin-bottom: 20px; } +.stars { + color: gold; +} //////////////****Review form****///////////// + .new_review { margin-top: 30px; max-width: 600px; diff --git a/app/views/products/_review.html.erb b/app/views/products/_review.html.erb index 576e0cf7bb..e90bf1cdb4 100644 --- a/app/views/products/_review.html.erb +++ b/app/views/products/_review.html.erb @@ -6,7 +6,11 @@ <%else%>
    Guest:
    <%end%> -
    Rating: <%= Review.get_rating_stars(review.rating) %>
    +
    Rating: + + <%= Review.get_rating_stars(review.rating) %> + +
    <%= review.updated_at.strftime("%b %d, %Y") %>

    <%= review.description %>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 624832d9f6..f9b4c3a802 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -42,7 +42,8 @@
    <% unless @product.reviews.empty?%>

    Average Review: - <%= Review.get_rating_stars(@product.reviews.average(:rating)) %> + <% rating = @product.reviews.average(:rating) %> + <%= Review.get_rating_stars(rating) %>

    <% end %> <%= link_to "Add review", new_product_review_path(@product.id), class: "columns small-6" %> From 0ebfa7bc23764ed09aef9fbdb41723451eb95d03 Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 26 Oct 2017 15:31:17 -0700 Subject: [PATCH 308/348] styling for merchant summary page --- app/assets/stylesheets/_settings.scss | 10 ++++++++++ app/assets/stylesheets/merchants.scss | 23 +++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 0ef2ccf1a5..f58c37fbb1 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -75,6 +75,16 @@ $foundation-palette: ( warning: #ffae00, alert: #cc4b37, ); + +// Palette: +$pink: #DBC2CF; +$grey: #A7AAB9; +$gray: #A7AAB9; +$teal: #3C7A89; +$navy: #16262E; +$burgundy: #4F3640; + + $light-gray: #e6e6e6; $medium-gray: #cacaca; $dark-gray: #8a8a8a; diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 3472bd5dc1..6d22b4eebc 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -2,6 +2,15 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ +// Palette: +$pink: #DBC2CF; +$grey: #A7AAB9; +$gray: #A7AAB9; +$teal: #3C7A89; +$navy: #16262E; +$burgundy: #4F3640; + + ///////////// // PROFILE // ///////////// @@ -12,8 +21,11 @@ } .profile-card { - border: 2px solid grey; + background-color: $teal; + // border: 2px solid $navy; border-radius: 2rem; + // box-shadow: 3px 2px 0 $navy; + color: #fefefe; text-align: center; padding: 2rem; margin: 1rem auto; @@ -29,18 +41,25 @@ } .profile-button { + background-color: $teal; + border: 2px solid #fefefe; + border-radius: 2rem; display: block; margin: auto; min-width: 12rem; width: 80%; } +.profile-button:hover { + background-color: $pink; +} + .summary-empty { color: grey; } .summary-urgent { - color: crimson; + color: lightcoral; } From 073dfe4c283c94842b086e5385c66af02f1ee0fa Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Thu, 26 Oct 2017 15:46:24 -0700 Subject: [PATCH 309/348] styling for revenue page --- app/assets/stylesheets/application.css | 2 + app/assets/stylesheets/merchants.scss | 18 +++++- app/controllers/merchants_controller.rb | 2 + app/views/merchants/inventory.html.erb | 1 - app/views/merchants/revenue.html.erb | 76 ++++++++++++++++++++----- 5 files changed, 83 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 00e3621cdd..51bf1c734a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -38,7 +38,9 @@ body { flex-direction: column; background: #fafafa; } + h1, h2, h3, h4, h5, h6 { + color: #16262E; font-family: 'Astloch', cursive; font-weight: 700; } diff --git a/app/assets/stylesheets/merchants.scss b/app/assets/stylesheets/merchants.scss index 6d22b4eebc..55fb2b6fc9 100644 --- a/app/assets/stylesheets/merchants.scss +++ b/app/assets/stylesheets/merchants.scss @@ -70,6 +70,19 @@ $burgundy: #4F3640; // } +///////////// +// REVENUE // +///////////// + +table.revenue { + margin: auto; + float: none !important; +} + +.revenue-total { + color: $teal; +} + /////////////// // INVENTORY // /////////////// @@ -95,8 +108,9 @@ input.inventory-form { margin: 3rem 0; } - -// ORDER PAGES +///////////////// +// ORDER PAGES // +///////////////// .order-product span { margin: 0; diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index bf2c27c847..ceb32adaec 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -130,8 +130,10 @@ def mark_shipped def revenue @user = Merchant.find(session[:merchant]['id']) + @all = @user.own_orders @pending = @user.pending_orders @completed = @user.shipped_orders + @all_average = (@all.count == 0 ? 0 : (@all.sum{|order| order.total})/@all.count) @pending_average = (@pending.count == 0 ? 0 : (@pending.sum{|order| order.total})/@pending.count) @completed_average = (@completed.count == 0 ? 0 : (@completed.sum{|order| order.total})/@completed.count) end diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index b02a6f2a2b..c31d237387 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -6,7 +6,6 @@
    <% else %> -
    <% @products.each do |product| %> <%= form_for product do |f| %> diff --git a/app/views/merchants/revenue.html.erb b/app/views/merchants/revenue.html.erb index d9dd4ad6c1..451062c98b 100644 --- a/app/views/merchants/revenue.html.erb +++ b/app/views/merchants/revenue.html.erb @@ -1,16 +1,66 @@

    Earnings Details

    -

    Total Revenue to Date: <%= money(@user.total_revenue) %>

    +

    Total Revenue to Date: <%= money(@user.total_revenue) %>

    -
    -

    Completed Orders:

    -

    Completed Orders: <%= @completed.count %>

    -

    Income: <%= money(@completed.sum{|order| order.total}) %>

    -

    Average Income Per Order: <%= money(@completed_average) %>

    -
    -
    -

    Pending Orders:

    -

    Pending Orders: <%= @pending.count %>

    -

    Income: <%= money(@pending.sum{|order| order.total}) %>

    -

    Average Income Per Order: <%= money(@pending_average) %>

    -
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Order Category + + # Orders + + Total Income + + Average Income per Order +
    + Completed + + <%= @completed.count %> + + <%= money(@completed.sum{|order| order.total}) %> + + <%= money(@completed_average) %> +
    + Pending + + <%= @pending.count %> + + <%= money(@pending.sum{|order| order.total}) %> + + <%= money(@pending_average) %> +
    + Total + + <%= @all.count %> + + <%= money(@all.sum{|order| order.total}) %> + + <%= money(@all_average) %> +
    From e468baf7a101d39598b6e946e256b5d0a94c75a9 Mon Sep 17 00:00:00 2001 From: kee nam Date: Thu, 26 Oct 2017 15:47:33 -0700 Subject: [PATCH 310/348] Added halloween images here and there; still working on orders index CSS styling --- .DS_Store | Bin 6148 -> 6148 bytes app/assets/images/001-zombie.png | Bin 0 -> 11536 bytes app/assets/images/002-eye.png | Bin 0 -> 19358 bytes app/assets/images/003-pumpkin.png | Bin 0 -> 20620 bytes app/assets/images/004-torch.png | Bin 0 -> 13423 bytes app/assets/images/005-trident.png | Bin 0 -> 14624 bytes app/assets/images/006-poison.png | Bin 0 -> 11551 bytes app/assets/images/007-castle.png | Bin 0 -> 12347 bytes app/assets/images/008-spellbook.png | Bin 0 -> 15954 bytes app/assets/images/009-candelabra.png | Bin 0 -> 13148 bytes app/assets/images/010-candle.png | Bin 0 -> 10796 bytes app/assets/images/011-tree.png | Bin 0 -> 12797 bytes app/assets/images/012-owl.png | Bin 0 -> 25398 bytes app/assets/images/013-bat.png | Bin 0 -> 18049 bytes app/assets/images/014-coffin.png | Bin 0 -> 16846 bytes app/assets/images/015-broom.png | Bin 0 -> 15503 bytes app/assets/images/016-skull.png | Bin 0 -> 17606 bytes app/assets/images/017-potion.png | Bin 0 -> 18877 bytes app/assets/images/018-potful.png | Bin 0 -> 22438 bytes app/assets/images/019-crescent-moon.png | Bin 0 -> 18697 bytes app/assets/images/020-full-moon.png | Bin 0 -> 14408 bytes app/assets/images/021-scythe.png | Bin 0 -> 16249 bytes app/assets/images/022-cleaver.png | Bin 0 -> 16368 bytes app/assets/images/023-knife.png | Bin 0 -> 14468 bytes app/assets/images/024-axe.png | Bin 0 -> 17114 bytes app/assets/images/025-grave.png | Bin 0 -> 16939 bytes app/assets/images/026-gravestone.png | Bin 0 -> 18811 bytes app/assets/images/027-eye-jar.png | Bin 0 -> 17272 bytes app/assets/images/028-heart.png | Bin 0 -> 19210 bytes app/assets/images/029-ghost.png | Bin 0 -> 19039 bytes app/assets/images/030-brain.png | Bin 0 -> 19055 bytes app/assets/stylesheets/orders.scss | 38 +++++++++++++++ app/views/layouts/application.html.erb | 2 +- app/views/orders/index.html.erb | 59 +++++++++++++----------- 34 files changed, 72 insertions(+), 27 deletions(-) create mode 100644 app/assets/images/001-zombie.png create mode 100644 app/assets/images/002-eye.png create mode 100644 app/assets/images/003-pumpkin.png create mode 100644 app/assets/images/004-torch.png create mode 100644 app/assets/images/005-trident.png create mode 100644 app/assets/images/006-poison.png create mode 100644 app/assets/images/007-castle.png create mode 100644 app/assets/images/008-spellbook.png create mode 100644 app/assets/images/009-candelabra.png create mode 100644 app/assets/images/010-candle.png create mode 100644 app/assets/images/011-tree.png create mode 100644 app/assets/images/012-owl.png create mode 100644 app/assets/images/013-bat.png create mode 100644 app/assets/images/014-coffin.png create mode 100644 app/assets/images/015-broom.png create mode 100644 app/assets/images/016-skull.png create mode 100644 app/assets/images/017-potion.png create mode 100644 app/assets/images/018-potful.png create mode 100644 app/assets/images/019-crescent-moon.png create mode 100644 app/assets/images/020-full-moon.png create mode 100644 app/assets/images/021-scythe.png create mode 100644 app/assets/images/022-cleaver.png create mode 100644 app/assets/images/023-knife.png create mode 100644 app/assets/images/024-axe.png create mode 100644 app/assets/images/025-grave.png create mode 100644 app/assets/images/026-gravestone.png create mode 100644 app/assets/images/027-eye-jar.png create mode 100644 app/assets/images/028-heart.png create mode 100644 app/assets/images/029-ghost.png create mode 100644 app/assets/images/030-brain.png diff --git a/.DS_Store b/.DS_Store index 74018da7b3a8ca3f1cf12430fe7fcfefa4ba1d0d..6a703d4059b404c468963987149341d379cf4c9c 100644 GIT binary patch delta 59 zcmZoMXfc@J&&kZdz`)4BAi%KMoOv^&IEc&4kjPNLP*4_Jl$VpAmkv@eS&>;}vjWpa K*3Il3fB6AihYbP% delta 50 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 U`R)LIy$oT@&zvYVy>$D301rb=Pyhe` literal 0 HcmV?d00001 diff --git a/app/assets/images/002-eye.png b/app/assets/images/002-eye.png new file mode 100644 index 0000000000000000000000000000000000000000..c0b1c9057a80d5e7dd94ecac3cf57ca05c4ce027 GIT binary patch literal 19358 zcmaI8WmHt(8!&oi5KvN(ZV@G=5g19OrKAK&rMtTZ5$Pe7kWxxeLAqfO5D*m*5Re)| zVCe3+dw&1>u6Nxp*QIODIeYJ?YnRd5n#!a^3`7tFk*caF=s*x0Ji?)?1mI`SZ}Uc@sTg^J{-d~mum@ak{lG_hFGWKyT~`|~-)A1ykgu;VzrBm2 zr{yy@YkpS`+qWB13=qTysVd0p`DLw5`34z}K0DZEgA zbl*L5J?;+bZ}qtS$vuav%sT&}d#XbOMjF|(qGWT_u97+1$;VTpbbbj)?eia@sH{>p(wl9sm z=#WWPK5x*Qsd~_k)NhF>6(x@un0NomO$I`SjP9j0wsMOOB_)U5d_5DrgFbZ4JE;% zjJA`|P8dGa`7db;{%qbZ$piJTJQmhmbj!l&8U=SgKv7J0Y`Rv%1l`CEkg`oj``mXt zd-K+>7(l$Sth~qrfbm|YT0sox=-Bn?h-zA5pdY@XzL;Fu3wM+(rF;1z%vnh{n(jTE z4fRB-G~}K#*`BQ>tG&Q;Sh=T_kYPy`O(#|l>J)lz&`cJ1aj*n-QU!tI4P)Ww`e@_9kiZfbnk^|G zdOsS&vIlG zV9jAK)om!btLV0vB7NvT>D;`o3y66C+(3%NBwl*i92O_^R;Ba9IUoSGrOriXC!VEj z0{HmOZ`0KebKwg4AXYKUHx^n_ji zp|#vAb$mGj4uEWFAWyc#jfuiPpOlFQuTMQPX{8v>)=gbC=Q;vwHR$>lBkC4=VH#`$?}C$x zq}c)ymtG9VJQw1fCJAB+#K?{Uz$ID#(3enM*mxz zfj3?oo(mB^-YThW5|J*b z!3DvQl;8*sdWdnDIdsWLM1TNX?L3CLeMqNnyLvixp^PNxa91ceC_pxSA!jgoj)+Um zAwq@&PrG%1yu6KpgVs(-GyD*;Nopd3+Sy|{o4s!0n z7q0MJdF8!Wm3=i>8$oOFDw&=vHIj#>YVIb+ajbY(3@3A8?Q3g_5h2%!2%Z;p^i-5U zdhgPy$>HX(3z(ez<3=VQ*mbb;HSqXObf0g7%)1K;K!jd}aA??PtJ*?{0}$6k++; z+4Y|@Z~fC2+~ORPpH#rld+^*Ki0NSP3#&-BqC$b%)U~sRTy$fOh$zMnP^uB|M5Gp; zETlw-BYC~CVpO&P*r6Sg=N2_mIL2tZ3TX~Y%lO64u48F-MFtpwK?d2J9uH&&9&K-7I%CV%=`hxqUm|7bGgQ2l6l42IXIL}djD?9F8zeGV#YYz5YvDEEqM7JFwiSAt)1-t+v%{TVmDINtf|lK#!a8^6KG0=VFn zuA0+Jfdj=ruf$xYcaYOqip9SJvp;Lg)>AoGO4O&lK4t#K9142|iP)+;SRX7H*u=Ri zdCQ@0h6g9T3mvM#C(y#TNPKQ^#(<$+W|Ngv=Qp?b`Ag=FQ?;M9WmZ}1-)UcSXQkSs z2DboYY!RX4d@9XPvYx?v@LZ52v@*$b9_c{@TsB<~#~vN6u*t&KbhiwgR-g3}#LBv& z7-iXK?mlGKa!fy*RETJ?-$KS8PQ`tzO%q^g0UjhNbtVR z=0>~~GGx>lXVQxP{nI_iWW4vgv-EO?4x-<9dkjPz#R+D_^og@#O-#i+A~v;mEWb&qSLKuB(4#(&p~gI}jBbv1~;Rtq{m; z=CDgVQAQLyb)|Kv?BU(r*{3y za&-CEi>4&bQ0tYk`B+!q>ORUGwE$bpVp;fBr#{^NV#9;jhhkZrx%0{s+=$$W;M7Ye zAb>NEV|W7JDyH>zV9lMjEbZ`_K0*P8?){~NKiKe%3d&Qyuo|GN%vBFva_ z6~DXgqs&51*Z6(BRuDIZ-BOgqc1n0TJr+4y)aw-lwy=OB!XbH{UNL+SA{jwI&J_ov z%I_!r`xDXR=k8pG<HpL+p{G$a(dKrd%pf4YtXOy37Yf`6bg#F12EDBC4d`w!;j?i z%97tyF#W};)`U^b!{Q?~Y_?d*>$WBz;ag9=67z_i;M4R(1b@I7O%y*E6T-cv%w~m% zO&xVK4y?yUuQzHZr0VCDpahyNg_ks(MVJ-83lKDeWX~teTwuavjMFO~dL3zS?Dhp% zZg%X!R?qKqM2!~DS3Hx;BB7wQ-`faX^l>t}`(Zo!yeK?1{1!1zhV-XM*>YeEGQe46 z1A`bD5ALWdQ_yA#m1PK+iz}wF__RtLgoVk9Fc%Cn=>s&AcxTs-fNScQ#g6*!t`_^Q z$jJ(omP~isPWuq0WyyT?qT+62gt=%T-`gWY?PR+-=r(zG&Q8zsX zA_eIC3Hg~E5wB8bq|x!3k{SaPIQ_g0J4TBEgFap$#t&(-pamWbxLqKf4)KZ7G8LmJ z|3&T9$QgDR@ggj9=Fo5#KhKYTCNhjy-8N}Q)pqx6ZQHrIk=q3k)8lRm0t8?p;sn7Q zvf$Pa+brAfBO3L>mD_9wk{4;|zu5l`rTo}7CwI1)+Q<}`oP&#SitdiINxc4}lnac) zEVg2l=!-fbeQD-hoF*y#;Pq(0NG>WzbmnbahN&rP?B5-JA$KdhnV^}HIF})MIN2f3 z77F;AHKIp**b0Yh5Uq=Dz;U!z^ZTqVQ2h5unh>+1)c}YK$Dyp5za+BnEPM5Z;Yu^I zA$fw2i#~dwH1k_K7hpJJ{sgSFX;<8SD=l+mByAQv4rULmq>}maZ<)9|m2!*WbaFnZll{k=)P0ZKb;);?uix!ni#whS?XN`|Q{`@5&Y8 z(rG+ual|6g9WjJ=*3netkPR&bQr9D>NcPgnJcRYlp%~sXX(AJ6oY9x(Ot-(#&n~hY zE_fjGsMeM>C92ufzCCEZ8q%P2YD}TSuZU1?Fr@qg``wy4Q zX{~CJrOL51Uh~JlPe?wkz(EZnvsOqu|)+0ZyFolXcjBo2y$Qfa8bfmm+)s|=_eYj8eb zd~mq?xk)^6MCSL6@3zSthh>GKhYrGj_=nt47;?=5`>z?IsJ9WL<-BgWD%t%VZJ~Yy zL*GO*Q0)JFiMPZ@0$}eP_#xRViy6Oe{(Jp>@%UTzYRy2uJJpV)4)a@;4Kod%+KdOS z4m0WyX8XkMYPQ<^OA&jzUj(D~H{aamsJ&a5==%*W z%;L)YQ+HZnwK{fd`O}MAKbk^#K>Eo<-F&?rtu5%*guNd5u@t8WTD*REz-zbqU(+P! zEtbqJy(>At%hDg@bfQL=r}ik1)!VS5*0cNKg8_fLM70p)Qkf?NcFud-xuKFNk3WZi zzdZ`|B+XXJHTS zX^c9O547yu93{E1$o)D7o*K;pkq->|qy;8^cdSl0o>cA#yUimbV=QyrzX7xGYMU77 z3O0EMO&+}Xb=ZFg5q-BITd(`h(Bn8&ZzuNJ1)s`m%vS;?h?`1K4TdF1&#;LY%iPD` zh@peQi%k*c2R!o;2mG~bzKb#&VU>if_eHnd^R7MvIv07Yj&{Tx_fC_ad`7!eyZ>_Wv(=A2U>S;Uz07rn{@Qk`<| z6F#Vud1A8hu&bitJCXoJoB~Pa(^wSA=o6vQ2{aZ!Ay-h>PnrD9~Y#7@jlzu+iFjlS|4Oadp zU^b({lOoRikjM4TfuRuvH8;p77o%uS9(Q9MQ=0O+Wv!;oh)=GoltUCu9r0~_7hXAC zt9OTlI^(pcx_?yi2I7QZkM92-d|xL!$9IAgJ<yyJ1G4%&)sE3`Q+@Yq`!OE#o+_y8+^9n9$G_;2=5VDq z;;AcNenkkFA=b--CXbrD|Lf4n@~H1UA1-#uk~KFmO}zPA;gfcHaA|8Qp`std7+U8N zMApmL+$2%-#-tZlyd>aGyZUD-nd#Do7XsyJ|M%%;oA$g=4;>{aTt zevV#SuVJ5t1(EXwk&ULJmyEfOJk(ivP!+dzEC0(WnC`;AIm5Lqv}Qw-^B+Z++qWl= z?)%Jps-jlAyDDlq)Fkn?=rL=QE?N$T3B-q&fz94W3=`_zZhYpJj4b8E#7JTQ(!|y> zq2~7EWE{v_$k4l8wVm_<$s0j~J7Ni<%y&3WW$+^>u0z^`rur#-#qaz53#-@w7S zS2#CzpRX_-76n~UIw><1j205|kBB7*|6gR9JzCe^{AD%3Y1eTeCe(vu-z!vnzC5nXpmPq=B;|2~q z;e`r675uz6 z22uT)DZsAKR~@U~{lWk45dYUzS7GK3t~%K?E4f#qcgP!YG4nP0-@^tWcXH+jw7T*KqV}p8Mbp?al(eDu z-J36L+xooXO7oVINe1$|7v-rzdDX^L@9;&OeM7|3L`0_im-)fbS)9~nFoM_Odh>;n zQqG|a^F!ECGmA}}<2~kw4juYkLIG%k`*>Rk;b(_)I;0^2x=M}%cp%wXbgub^D@QCB zNUUkP!gO7dTJ-cn~bEA(1ke783KOgf<SeS#<4|Xb z<$iP0GfC{&IyV(j_qolF7;z{N%1-5dc+eR`*B0zkjHMI1MLqGL|75A>zz3kD^!}W0 zfB&3_;lU8#nLf91hicj#WssQq3`_70Ody80FWP&3T1{gKLg|b8Y~nFshTF4%GQamP z@zsDRgObMW23O|urY9*e&S4M0N>KZ@pZ!&h{Qt_->=MO9g7(c_w{gCfweMfz(JUR8 ze$An7m2kI*s`F92HKIr9BDZ>o9h)?iOPE>6Y7jd5-k?)BEM~^mupMblsp= zTxQxMuc0c#YA&$n+hJlq zi?6S_s^2QZ2jaMHR=NaPL9$S{=3lb{@2c+9IBccqICQY|u}b|B*V2PzOx{S$J!K8; zyK-?%zB-r$70x=^b%@u-f2$~FJ!^7$AFCcj4(25u!KMpUszeza$4<#Xcf5BjuSuCT zUl25V$NQbd1612JaeQP)^CgZfMvH;}%vjczqEw=T)90y>mK$(jYD#O^%Rf7dly%3O z-F4e@2xejnwVP=-b5(UDw68+tZ7?m!F`{yef*j}NV-9FwvKC|02^Df!-2Mtf1O~1dV4pa}t;0D}e)3|(O z6nAadb6qlDqx*UZ&uETFrV#A&serZT5215XT>1zebCxgQn+}~d%wFWs8UBr#Kc_{B z0mSRsT@~k7yE9>aH?H%AvbcW)Gv%WDiZL<)Sih%?`cZ|SUW{3uQlRvqGX78+_a;Z1 z$a;*Z>AL#l`imjBiHPx|3pK^&XHK#PFh67b7g1Z|by_x7u_y$sFT?oUQk8426XI2U zH{-X1TevlzQM@#LK2-fv6BJoO>+kc8EOPu3F1k6MGMZXc$U=rv=iY5NwDgT0g5O}H7(uo9{ zh?qBoluk28&x0V|>T#~OzCt;4HfAa9W(AX|+c8o=d4aXi)-6=;2Y8gOAM(GI9`(U} z+5#RXrd55YV8!H~=at-`RfQoT1+}>p*X$l(54fciBoR`t&NoLq^UySJ2(PfVW%ETv z^RATXnOf=h_KIm;E~+RacXEq&jxW_-H+avwuo%_Oc#$N@H(i_wO@cWtfQR~ncjaNb z+$@>|T>`9$$7}xIjr#4KYlu5?4zD5~CKxC248M|IWSzv%!-keT9nF<})z;)f}oQrXpydtN<#^f{e0k_b%|F0Vk~1QtFo);mPfnH<0h z#T8`l%~K&s>uQ!19g!mRyDG>BZ=RHplKzX=J*~ZCQ>pWSVl3C(bJzQURGu@4q!Yy5 zXLrS{wYccgG1%qWGr44OGdh)mm6q!1xkX!_fwb>nCeHsGnD@{Vt+~0O@S^-E5=9of zJufd~UF7GYp(ql4Wv$Fy>DGAfrW>G<_(#^jkF@f)UzhKh4l6tS)zeb0^XA@qkL6(R zNa~}lU;5V~b+jTwgg<2887;-)w~24r@a&g_=@+#uOeF$CHN>s(s&8q3Yw*!G&w~O3 zmjI9Z*)8-#NuBaaH7Cbk#Zn{#D^WYN-4cal=~jpcm69y!hS#h!60w2i(|!5n-idvV z2)S3k0EDt#rQLUu^LAUSg52(@syxt~1gHUU@v2P1lLO=q+K;|_nJ5mil9}?g??PZ{dfHtxD#1ip^O0sOW3?ZE${AMo7C^l= zfk>X*-C;4CqEi-=L$?OZ;1A(V3feXs?A{Rf|2{P6+;Y{#0THco+j)GZKlstX_KMOY zMReg>m~0PN?d_`;(kQ|he;@llX94D;^!~B~IoFU#^m|cK+yIMI4V(X3n%}cy7+5f0 zvGOt!woJNUiFtBW40IbI`yrgI&{^Qjth!-bnRc5|?@HEpJQLAdIN-%4ArywIz!Yj> zDH@yJtpRaGcEK`zDmnn}lx{=xNL1H<1)E0)GuyqpGsxPv}SC9y(xdNH>G7)^iDI9D>}730H;DG ziEg06;=TnUr%6ZJ7h?AVjq2{tp41R9oSE5Z+AYS-A!R|R49V^G;-e5ZoCVUP!J`FM zHFvKeDD3X(>G+={t3cai<_f9_OV!2`;iCN4U0`=G{o&ig z@Zb+gs`(7w0XZt(*m68dVE;Wg?~=;cXxKgb^YYED3z@gP1KB+T<8KQ;3h173g-iu5 zueR!yIW>UQT>5dH?jD27cjd-w<;pdGgx-&9WfyHJI>^5#TNcfJprBdyYw4Mnv2^}~ zX3&Xot2SH8-NavusdOS!qpd`T4B0CvC={?CfWmPtZ1-g?eLOq(^SY80BL_2d z76cHZ^nN)==s^bbB>%Nk5rH!;3JQ~pQShzCb~f-$N3tBxj|l(t1)C5r3*le&JCqa@ zNtG*LlL{swiU%RCYXd5e^dq5NPJ`U+9QGN#BunC{@*gB87>b{7I;hx*0O$t z_^u%O{zpSzie=Wn!&h*yyYGSSc&)+#09zlrxjV^zt+0Wh#Wcw{oPfRwb??nnBV}Rd z-N!lL!|4Xg93vw>1z#64CM; zNB2(l7aXHhZpz#@qJb5RPd#SpNLaN3#%mPX%+GC^A4IF0kgL$|HGq@b%pf2s&di6zj~T1|NSLMo8Zw|C>l82TmNp%o)G; z#{h`EL7yeS*Svl>?(~W*v5C+EDIl^(Tbh=Lpp0pSoZOoh4ZD14KnR#DsfHiWNm+H^ z_{LCUHfEh30y+uSH|B6(vtiKDokpEJ0JX57qI>!oy$=k?@@>z*5b4Qv98hS%qYWHL zdHbpbaoi3ihhjtnAn>!Wqyn1L#hoJ;?O!e(&7|7mPFlvcuh z;;z+ChC_)@8)NoXNDKdF0kBMWS_1G&3JZc+c`&)OY3+L2XNXG2K48fZ&xEvKovEhtmL($s#Mj7-{QPr+-u5yK6YzN>TwJ$^ySI5A5N1tb44I_ zl`7fH*H)Gt__8YzLB~?t#v30COm1Y71oN9f0^fMG`^2-af zC;jgE7d3N6SUKVQR@38UDGvl;z2C;3DwkRif|%0dMn%-=8jRd){8^OJEI&dGA%}nK z?@b@pW9fk9cl-{VnJ;)#Cd@paURnuGkIJ^a?7Xq4l>#yYeN5*KVr*zgG?uPgzXn+M z=B%v>znKk=&z?LET7i74tN??! z_BbnC8skkqP5j5_t%c`P2RxzYszZ+nKG_gKa?>mCPC46d*VT34+9@E9!28P=y{^5+ z(na|sY8up#gf`rzq>=hHP-ZX?&(L{_v4hK2Bm*A=9k*VYl1*4a%TZ7W-Knx?1TV>( zkJ3@X9AZWgM0C#m>8;DH7Mpx5pn6UiE5;amdZr7&8vO+Net-zyU%ju|Qu_^u*gbmK z(eX=2FlU6VuDBSB8`pPLTr=(H!4$j$F=ysC8fM<6& zRWf&GS-K@69=MkFrKiA9;N`sbx#Jm0ln7w1y>&(Bovh-nx2ssTl7a#g$M(_go^&JH zD=xY8+!RvA2719-c5?-pK@?8fvQg{9oYq z@TmqTCFrNEV!PZhFR%0HNd`*i@dh`fSW@`0XMLS*3!5;$ zl89DA4{kTQHpT~;w_&-y)w|H5DR%q=HZO00&}4Vs)3kjwb-sF?!oBgqokyFdggjrfU1Z@+{^r&`+PsgyJZ9h@yjH z(|_`N4kE1AIpzt&8F@ZEvSZ36#mF*p1xj2Q#;b*>c61 zl|fSE$t~VY!uPt|qanTE%%ex%=%rOT!}|Yrym$Qw=scb@Llfi;&cq4YTNkINHRYj@ zD4rlR?%cF|(r-T4wndGT;DW>nZR>;4&=tA1u-_zT=)ZL4pSoA-{hz)Fo@yuq;|4La za0x}ITK-4hobaIt6rO6<5>~c(`Jk9MCQ2`CIL4>3^^%zM;vpd8ri5Q3rfX^FL_V9J z3q-^Sz0B!T7S7{j%}qugYUDGO*6O$)CqJvF-K6(ze+dFsI;nqu6dwre$N7Fy{;(+M z^u4RGBEC#L4V{}bp=a(pzj0Hp!wrSH{hj%m+HFuQg$YWKxCtZnLNd8wHvX%Y!E*rbBI(CF{ zxn)xbn7oFvJ2;;z+_Szp>;j`mdN$w{dRzjfCixIYMUkM2PI;B_^L|tt%PCk{h)$Us z@j%q?r{L`D-9^|C5j}`!Eout>#5|_E{1Q&#UJNYhQY2P%$~8)f6_0FcB69NP=T)y=Cs48LTFhw&6Txrq{=*2c6d z(*lKyWGlsho+>WpaYvgQg&WZk)h40T`&G6XC=PaEKJ05pY@iiv+%ym@K;(Y_=V#Z- zS`5W6!x~G92RzP4h9k8^m{k?5w12O^T@GBJuQc|}M6q|jgKKwz$LCXCychJk_Wp+> zM_O;6Ba)+fu36u6#^s3~r!faaOx8;xIa2VbcBtj@?jnvJhud5C4pEcu*(|}IqphzSdvB-%lS}J!nbDZj>Q8w(2u>A|Bm;qU)#6szmlNIcs+@Tn@Xjv71jBoD|4kB9M~1(t9r)!=hf$keku23>_vavsW15!0WU-0Jh3zKOt zCT<~Wi1YhD)t1KO;g7uATDfXNBWVM9^H&tC*og3T%FFXFGrFwqIb61;lzu5e5xT>DEZNwlpt%#I?ee4m@7u?I<$$V(dXSa&&bHY} zu8}(M)$MrFLBT+p{iT=NT5k)&2^D$XX|q*X6JkNRY*2Q)PQV6{G|UCA7F15Q(nS~3 zCiwv~sij%z&r$4HGdi-(e$`zb`9`ILO4vx)Q9S8s!<)TT$KJy|;A~`hPwcs)gS1$C zyB?|Xo5d7QYn{`Je30c-?=UK!w|5a{)+$(}qC77!_{`bzJ{!0K!dXiVFr-$N_$%>g z>#N}%u|2<*qhhUh&wSEPJZ)wf3r7eQQJf$(26Tb?eWKTClEB{-sr(&Wk@?P>%LxkD zjD2IwMR&=4>nv#z!Tah{1=~eK(R6836_LZ=eSY))?cJDkM4;-UzzVjW&yrc?{ljFx zHOb~%;lsI-;U`1Iv$;Z~u6ZL~Qc0D4-GRMMV-Et(X+Vfh+^htynWh7~Zn`ZNkZ*GV%);gfmGT*`3#O5t-8a9(a=5`zxL+j(POZ$}V2qgwhE|f^2E#P03j0HF4@Zobc9k9cJx(^gDy2a>oGqNwsCwhWThZwYI$45dvkuk5 zJO6gA4%axFEVZ^R#mBP)x%P_HId5A`HeaKEu z%Pm;#;CocKfWL-y$D}g{wW716)Wq#!9@=MBz6x*oQ>64F;Kv&*fye}JW~K#C=IjMa z(}mL$4Nj^Odmf0rBXx6?b7oY_XQE6zWN5y9V)A8i4ZW+Q$n+nY(^Z;NM^{JB?ZB>b z<4op2?tdU>z7vpd6_;7;)Mh6fXj4y=d`>lvVy*dsIB>`^q)z|WJq2cLm&5G&uxc;`}Z zRHX%JRrhBfDq_?yf#|Nnt6+}2Q3%(5dWsCi3lYl-yEObdr~)&DOn%GwP7{8KMSs$n z1{1XUNCR>1c&05=3ndALWB(Gu%Y1zsLp5N zq);+LC&WvzVkb_GY*)o&y{dfczB-{~j+uaPz^fl@6sulR@S#JZon~ zey|e8Jp>lQ3J@g_$>diz(H+L2n*=-n3H?z6mI)xq21qt?)d}fdY{K+C^WFmlZAlkfcLv5Ecejf~dfig(eZEcqdWj=N|z1 zlu_xwZi1PsB0gqeL!3G9N|qZd!2VJX()`5g_uDIKmPq;5#Fr-mU={@G2F=A1K)xXJ zdj%FjX0Qwg?uDVFrR@-M*M5rs-*>QQRPr)EX%w6TF9D=F+us;Ol`zsZE z%u!=Z@qlD6{}Akd?MyQ+L$L4Y=tEV|E(hAPj$Fq7_m=m|3&~SE>V*_`n+v8)`a2LI zP2BMDXq+6FD2;4gX6&LS57eC|#+*lz<(I2aaI%0@94pq5C2&HF3+bF-X4Xo_#Tyf*va+6@7AGYtFwJRX>YdG5e42(mwiyt0}pY>!e>jiGfm}G_$ z^KsU0p+U!45QvN*sUm7?F` zEGVVt==(@>y_4E(C43-b0v-aB8z`j^dtn6$hF)OE0v4N;1LGPG!G%3`cDxGmbkLe3 z#=L-Z6ZN=pkOAj`J@JYm0mD zjOR7qmhsx7W5#V3P*%XbC9MT7tnyr-bpY%pHEk@a|a_a^+k7>10AzWMMw( zWRHo##aYs1G*Cv5_^ZmxdMfa6_=Q|^<$N%I;=H{Wfq@Fl+{r2|G`BuL4*6 zhHk!k?>Ex!n(^yD2w0zITE{ak2o*rd^;6SDn<1mp0h_h)3_=Y;ZW)6zbjVu$NH&mQ z1NM4{8}Ano3LJp*Xx5SkYL|@Z?eqe=U!!lM?}2eW_b|zGn?*cStRiX8WnWExph2C; zmd&ZpY-%ih@Bw*UkC29c+yT*plaAS%7~YAxZ3!GChnTjMQk|f+X4cb+g*&Da^Jx9~ zD%BBC1ZJ&N>9@M|dSFuOPtj=jRj1Ha5GaL`jZLK^7XA;f-aZv57IkteuF1-ZXx z1yOJ2e=&3+1T#_ONw>E?x0zQ;&H6}II6MEv;#)H92buU1Fwi+uAN@ollI{c0k}J5z z`tv)wuxQ~q4GHj5u$$_1ft4Xo|SiRr?w7auF#y=$VQClXQk(qTo0mQ{B~FgqXa z19*Rly?(p;j~CLR2neMTgok01c_46N_tE>WBV!I5il|tP#nJ*3vwT)8Ne-DiB`ts) zIK=kLcDT$59h?`Rb9oFe!$lNp&gdAUri$=VbtD+Lp+NPe58(dq991ZZ@-49@0cocA zPXuuS270hM+D%6d9+__!b_iv9NoN8m%Rg7`0g%)jF0!Jp9nM;T(4FnZit2tW0x4=X zYuyGlqGlotTxWTIB?lIu9?6x@vUX~?%F+??L-O(D{{kuxuDW|++c6krjp%d(QWX7# zz+bgXpxw08;FbB4BbNQpsva2JwXEu~$drw~!7Q(tEHCrU!vDSro`)j;zaI}C zLu=c8*urR`^K_xJI|o;$41R<$?S< zrEp9qR+@8~lY*O>lLl(pXi({?TS$N)Vm#dc3s6ENNBGN_(OByWg(L-N{|VKrs1hL` zmN$Ijd=ZruHAEz*CBc9d183=rQ;T7L*2G#9-m#A1^1fcVnSWv(_mcI zFuxBkCxq8~-9&%8;yOrkwrogZTYI3?O6aTtGoA+SS`wb!^*aLSIS4G#XIlxp$% z)M})|Jw9BE?LkXLi2Qj!1{}a3lkDbe{gpyw_5hnXuodQ_hfyl~yc;}0zr9eDZeJbi zNOVew(VvGeu*fzskeVI7-z~x;(S;plW3TJ@-@Xe0*S@vYr{hxf)!=y=9Yqoh6gA}V zSoI~kSNDONIu<=t`S*I>0ePvmUdDM|1LBD|^8*EkU!$P(cu%#}4-nGd7J$0Wmu3X^ zeRwe$z@O5w*V%Of!D!;)#gM&AkPnPCBCm^l7Xtfnx(<#vv-!5PaD-}{A`$DCk4@YEw#xEf`ddw>zG-pIqx^5Xg6hrv>OuwPl z{J|w7O6g+4>ncS_Fi5I2Y|jzhP>>|ZUXF;D>H4*B2#9Y3cF~emC!{U_2gm*&C@}r| zh`v?yFbk~#^8TCtKgpEbjxeqhTFeH~ShH#jy(e!BXk{>Z) z{%hW4wy*LjKJN;!Q$LYnJMqGdjy++zTgS1*I#wRoua7w>AQ;K0ADpAEZk+*H?kBnq z*^jqxU00Lrl<82lDHqumnrmFx8I9wE&Df z<`5X)Kf$`&{LiW(CZMEycr&n8T)x#?W8X5v@L7;xB-;~=$NI=*;XgoBEq^0f7S;0w z#1zG`ClqJT0YcZWAwQc~(#hf^+7oDybYH-INk0&UtJ5UQB((LZkR8+l>f1wegt%fM z%pI*@0Uva!riKY z$+zeH8NJ}6aF3YV*Sn`{Osk*5pu1fKiZ+E#DQd8xLhF`70%5@(1%@bBQ5XK46y?CJ#hD3S+LQ`hjuAEDCdK!|dKr zZ9)Zx4hjWUi_b*dZfp1S2H;PSnAo!%q)A2-$%Us!nxZ$xB#DadL+rwwi?hxc_R<+-SCp*7(pVX#d6833>G*_<)o^7nye6 z_E`kW{}Y@9WBU=2IWrGm0*ipLND=-7M$N-D=3#PBld1qTPpp6NGNiN?5sAn=>;^6e zmN3|Ni{2yq)_>ms=LA#$8pk|r1h&M^QGhAnwb&sA% zV@@v7IIuK!h(0|QJAjC!%{=@Bi~u8@R{Kn{M+BDvr}r?-e&8M81z^lPROSw>3P1yy zhlx(B{VdsUVC(3E*v(l)n#DY9Ap7=yd#BYt88`(v0hmAS^LMiM2ey*!yRsGNn1`KF zLeD}4pt+WjHQA$L2bqJB*a1YOxy-}Y)bmuqL+BlVhB6PEfJb8In1fgH%{xRyqz@_p z&2~5SIw5dBFd93Ah)4=l02<6Zd=Ferwh2WY+-x4|aDtbJNad*jG@N;O8MrNWj{jk` zc~~7ggosEgQ~(6?umX4@c8(dmMajoviik9g3V%v9nC`I&hA8sM1lLA|gpp0g%6$hbi-LE!pqvW4{>q0B~_tH_#~Af!F~` zkm8y|YE1<|4wJtVFif1E2>uQ%F%P$xho)XMeuy2Q1Szgbq}EgbfYz zOxXpV0v6_{aW&Z>k0KqE6xSqDYuXA}{!_kBz)hW2dlj&p^3D!e2aK49k4hT9Znnh^ zP=XZKBvNZC05Yq5+u*A@t@aRbJ=x=dllmNX2k;WG#yq^)=UAyp@!N8WYZ9rodEIU| zb_S`LPOCi+7$Q4NXqfC#!EA>L9RR)p#(}lKyA6KEKdVlwJqa8gJ4ZpL%)>FULx{+s zbO%6sW*)l0hxy;Kybv76p~qq#!9T}gZUcTW53zq)P$%nw#j!&aWPR)aB62tt0O?y^ z2!71}K8YMB6=S4R0LEem5Rt>_R{$c_l+r~rrL~A8Lj^#jg3QAfU}NkY1=yIcMMNq_ z1wf>_*2WG{fE3msk|Y%Xk?MK~*cCfOA9j(gK}0G@1wf>t%)^hs%Gf#jurgnRh*XdY zfJn974{VPeVh*;GWfzf(QUMUDF!QhnxGQ#!Ik+p&E+Q4B0w7X-j{@(<4$*`6$uf&b zg=s5bks9c<+Q$PEz=^T5%;Gy>$UM~Xv4u#Z=njBL4dfTpVPGIBL~26s0EpC3r`0|mcm_B& za+ICGRpwz`BNYIVn(DOL3xF2^ixmO5)I4m8G{1=SL5~1LYAV0*E&`qa2HE7h z`J9V%@fWEt-2o6uK&RC{1Go>ku;i&;1xC!n$0g4rA|+D+5J^a<)m{wT3k(%J^aL`TRFNemp(TMpAf)ng2z3Yq2YkeV5D|bs zhn}P7;18b5Gx=9U;6Gm?ixBXg_>G*d3wVD5`#<#A!(>nJkj7O;$5q40%GJa4ttG_6 z!-LD#(ay!(^o=E#(_8E09Wh!6TPSM zt9?NPX@ZqfAFkN4{7=6~x~Qe9Ya~tBjUuMTHzS&u+ zio4BA_J4}}z%RmAd1BPyJ6{@aRFUm6elDN(bhF0a=XQ^qA%f+6=a1K}AS$+{PeW4B zd-TvB)tb+QIdAE|U_AL|NXgT!j&l#@;IZ2%M0yEF&q)1Q+hK35MAXoxpAR!?kEMH&{O3Fw)uq`+|N(#J)K)~dPks%>+IAAA~l=An$TyQw?|8Ilj z_;qt}DI#q&0ArQsa&c?rBGw@Yi(^0@BHBR&8TS6s9ZK717$nkWgO8y_2KyWk9ce={ zl0lbif%vx{mZYCCkpI27QeU!u7h!P+9Aqi}tH4j|I=Q2Pv$&$WBf+6^@4tan#5ais z0PA$d6S1t51*|(Xuogk~5Sc5%d2z9RrN_C!H*CzL(gsru6o0 zccVjkr5Ydz`0`Hb$!eh5&uStHJyEDPou(tr@d`;aQ^ z2~{=zbcOKM_P9de!xGqaV5@ldddow*S+VQ1&x!8Nk=gSzblnu3{c-TePKoe7d|M4H z%Al5Dy2*o-LtrH(Tsw&@gH$a<4KXMv6)Bg%UMy)Q5-w|I>z4a=9guI^-M>wGgCz0-WA@7sGX?&^oS^Mz_ zC8XTNL*8sD0->zq1shy&Bd1u2K1y>x>Gv_V6d|Il69Z50^9x)=wB0-x$DVr+_S{v} z(yvrCZcDLb14g`8`ecO}d4*3wd>=anRs0l&UlWRW2BcChr2WmYq_QSh56c%W=j8tl zv%n5Re6s%EFiPyOJ(0zy7wN}UK(7i%pfb;%fzd=PCdZNvc|g3fWx!YAMzY#*R|@D$ zurLdl;ci?8SgIH-3f>~C!Ol^ELsoRGUfZQ3Dy*Xh~dwfo?;Ub*xCGX*$H;sh&<^pY#g3Gd0;`-VRbq6poQ8n$mw8i| zt#4pF1dNv$-U{dkT;EFs79n8nvlYh0`2cL%?*kxak<(lR5_%`^RX1)S@;X0V8!{)w zHYjj(&>=aD#Jve^(~$hgb$0d(^F3^(9D)&PN=mvS6pY@kqIK0%7O{z{NpjUu-jBcZ z2p+S!@;*PYjVd>IFw1Z5_@A@T)p7*SF!hy4M?$jIPvs?oBkFglEqOtkT%IcVgEu%6 z&dbqXF-^0jd@aIHc#h03zovHuMz=Vl?!NiS6~`fcZOG!yIYEk^(S^4@x_xIbsoF^L z=s-jd*I%-%eQjs6w=(XSM zQ}i+3&@k?X#;<2dltO)>R)n&24D@!ZPsjhZIE$xi%pL&^gQwyN=loPhb%y!RN^v+F zNpVOY2i-_nktJ@GHaQuMkX?+i>6v{5l@rc;H3<>BQ5!yv3}7hhw0Rjn0Xg0q%|_iv zAq_c&lnLCQYE)tjtFFbZA3F)?Mi!K@Yu4G6l~#yp-ltlo_lFI) zr!r`%PwciwzbaibR?!{zcwaON=e)zWU(64>`dr0sX*!H|e313tgc_~fpd(?&&rX~I zL%vU>MH@dkS`suV{^cq5M5Ry<{a9~hv2?2AZJ)hdW%|{L4r$4+Pj3yaVjR|a?&KBd zNOV%OPz%rWDzoBykqOp&Rt}YAz zyl#_|Q=$k!|!$jNr1+899K9A@Ch_dxcjQOrxL{$sLB?hpE|bD zXKFYU&sFlvlE#Ba?U4HNJ7xn9&dFOV`lqP`QYV` z;JG6s_X(f7wvRb)R*|4$NG8x((imImBRa~pK-D1yf+kegNhIELVyX8}bDmM72~c^q zkC&s5Nue0XWt|}>(_z67Ry6BL*Fz)b<3tDe_}Z2QdeW(>g(v^o?-ZN}5+*Ty(T{JGpy=N4yg}=sa(t<1DJhQ*pkKaUe zdAqpF!5cvVRe-?FUVq2j(Zj`zkOos}ljH8&b>LYC{QJw18 ze>4)avfJM^igCZnUHWM@! z$u>3x)%tJs@7=y3HQF}j+S?A|cS19op*z)KD{5fI4=_l?)103(ff!=WC-e#x+3FT| zxLGQFX|!aof0w!#zV0H-PZwh_u!lX4lkwhrHtgq@UEfevK{NXTw?;3=*)*Z^>_%;D z!TQ7K4G7x3LFbwr%o+%01&m?WquJ@VS@6$FUM4X&mE`2EpJc!v)>n~g|S^H!}JUXjfSBgd-roJCOi|mgpx-IR5c{MNDj|vvzc(XYrX8L%!Knl2mEyjv7b_BL7Q%X|e- zZDL)HQ&77?o*%;{bU5rz)O`8p-U`;HV`kM2e2MKC5=jSlIvX+#`nDRlz+%AH>aM-0=a6BP}-zj%%c znCz$^sP7pZwI%?3z(I-HpieXl@{%tF^!53&k%R%r)o*vm*kbid3H6dx-8>@an{uji zJ6a~Zajr165{{MmD3rpe_62TVEIY-6CL;!OB=2kaj#&XR= zD-XYZu$UsU|8R=ZB6Ny30bpuP+q2vCT6cU_P1YjwW(6^w2onqDQ|5TK92X z>ZcTO%Pk=2N`=b-(d#;99I5accY*bekLd-qTu0G)`3y|_biwaG#`ZU>s~~!{p&y@t26aV39xJ+N&gx`BUiiOwM zirYRH$`I%`&T!wtbJQGA?qJH_;i|ae_&mEmL7$#ckI5h_*&pyndAXPS4!hoymVbri z=^b=L%ZySNOi1g&bH@V$^*O`9lR0{ZEcZj(r)w8 zNz5Wm(`@9pH6Vn9a}mlsEalWwC7-vk_BkebH z1b$N?(B5B8Q*z!z@1!o2zc93{rKqPL6mz~@lIrq)wdnVY=?J$e3+l$T?&l^p5Fg{8=R@r3@JE&>QFJ;%u{T!VWdgw;`$2f<*~_$B6}EDcO!m{RTnX&M6mrUF@|Qp9 zZUyICTsxeGUjxOjzA*|Hja|VU@?UY-8hvN^vNQWjo?UgTt@sf!TIa(!4RoH5Atc@` z9(xRg=*K8qU@$%-$xpG)?+DEk%f~9H{zH6OkPNRvBjYKL{86Z10iNgXlQ$YE{X`+= zUYA$EOn!>}1+3hoFRk+q{9r+)BNQd+HH@P#QjI-Af>KU~V{A&=v8S_z{E-6Et>sE3 zpCZ|rPcVQIyJc#$7C8GC?6)V^{riS^*dxTGf%Bfffbp~zkAD+uia)2paDP*9bBmg( z_%&&1z~fGcPRQoq_U z+F0=mXEt-c;oR;|MM@uMJE4GmO~+X*E!6WlZXe!&{E*A-U;zk*iu5||7pMN>1!_Je zA$$Lnk@Pys)A5Ij<$yo!+NGgR+Q#~WX0PWaY#tBVAGf3@l9@@s4WZz2QiFrB5DBl9 z0~W|}30dmLFZ&{YM>M3+Its2ziC8Ii-oY6QiY(C!9-7%QI}1oAGvk6MgX8@b)l_Wx>B8%FOvHRpu^z5Ck7P27 z@9;$I3}$+4SEP5zSnmK6wfx=T*sbT~)uHZd+3>URCOLy_YAzeYs@VNqVuvG?DeYR- z%J}mOWFEMd0G3%XzqNzpl9`@90crxmuHxsaO~O}|x3jdyif)CE>I zaf>M>D7O$Q5%TCqDngL+I7Y8ULWIkBZTIyBPd(i7H-TooKbJRLW#**=5>pVdd$dcS z)brXwdaL_l#Gm(v_XfdqcgQF+5U<)at##wzt6pt(8ULOa>f&?PRrB`ha{(cpWlO3T zaAK1cm*pDA5@HI-{ln4tY50( zWtL755b5=nV=RB>>M|cs=S-|ld9zx4P;{=vIGOCLVWd0+X^i72$bg`?xWJn7HN_cl zwkvx->N~aDnH_T$H*YuRr#XTM$6y(=*?w%fJ94t+Dh^ z%~RR??GmKda0xj#_b)T`ziK!>a70K*yZHW$|4#LnvuutlZXk)w;z4F9M5*{3Be zZc}k&tWEZ)*SOufFO;~z=lHBb=840}x%aUY&J_quZh$GUp>4|138xFCt!=pK%cCVTrk;H#?U!$_sx{c(A2SJzf>mm&v^4)Cy!3R}k@Sl@ z&p18{!^?jv_(w!*#@wHgDDEY0%WeYMqQbL(vZ{*1&BGwu=-Gg(bT-vty9~WMe3v%Y z{jj#H_+x;YC*DXBa6qgMSc-m`9#8m%mU z-@&DfWf()tJlMTirUC?sk=cac?}h3Ys)@dJJ>D%8`nDr3&S!BTV2DpG35$X&O<+x#_XMb}_>L6I& zU_Jd3B>zuZVRP+JMg@jK*}5ImVlhoo1_HK$L^76Jw~_fv{+K~mdih~tNyN%t;q2sE zJ%4{%-u|f(5JAd?@y%DqTY3Kbhq2a2C5lV4_z#$7vRWlQZy=2Y81UX_Vi z3!Cy1EnUD;)$fyEeqR@kDtgM3Z+!vhSy53LPDsfP4BsS+R6*4sJ(6z1Z$?1;@95Zp zyfS4ZMvaD{Dji@pUYO2`DKkss4aadm?#bRtM*a z+aFAW@)0*2ZkB+5S(4wctOfal>q@g_j6k$kX=9y>lB+!n)&vx{h$JdI8uSzw*YCfO zkoQx4EpyWDcWv+ig*$i>bUMMHvNE(MT-L@Fhg+A#Q%2G<`a!ap=~V!DPFYFnY4ZyY*KAO8Uuc?)DtJw z41+jaQBhLvbtuVG2BCv-fiHw2^JSD;N5GeBJ@k5nY*r!jQ*uu3iTedQ7< znc=s$qxoufQX_8b{W&@{_j=CppL!oi8%aEZDKp1DAPg>`XDr~+a)_$ntgzKFx2Dla zFqhY!b`3G>d^qSt-4m`&>YapD)Mu!>gDbjOFz@Hlq)k-;pP1XKIhr~vQ0FTQV%84S z3^W`qe-U3zD|YsanU}UC1b!(o_1IlhG|lzE!YOcffAyH@Dyk9kN{ecTkm`zVas;qU6SWuO5a z_d+@Oq#1Qj+RfRtF$F%YeqC@dfw@brX+Af40MR>* zzc()-qGEoB57YB>XY>?RVjA9G<}Sq&9!^%%bQ~dia53$~Z`kDLI-B*41?~tEfYnC) z%ko%bz!5mpXruUZ_a`EVt>0V2o4!=Q3#Ar}5fiM@{USGdxmHfh=s9ZIxT<`#8Ct2S z361K&G1`@RZlnn@+BMaOy_H>iYF8Jt`Libc)4{JU`UjhOckk`->w26mo0H9pEMA>c zmo~Gp9{xeeFdLChI~{&w2t{gSxfxH3yJmJ0dXPH5ZBIXzQF{7ReJ!Zrqp)jhdf;^F zt~_yZo@ma`k7t6syI7ksjysU#Bno4A9)10ImM)+F>~CA!rOBJ&8VSU^!=P4qiF5Q5 z=G&Mir_0NSA9Sz(xBe0_z2Ch~!t_VHDE18Y-b)j@s*hD+Uu~y) zU;p`s>FF!^L2&8eiTt}J{LsOT0OH=m-q$wjd>q8_nev(i?ICul>I+GAOEvzuYl_Al~1pde3jNT<%I3s6h6?c?swK{LDIq;ucImM zrbw7N$jN3ZJRu{kRw<$%4UL5{x`^DeDIrE`VH9nY#tkLT{*KaY<_1MhzD=yJT+Ac! zN&3IB0BUo(_cQtO{<|!~Uc}{aPkM9sC?&7{2~T^2{x~A{^F)#uI>fO!W^h`#`bmJ+ zsyft@r_7aXmuhcrXo2>`=gmNUch!>0rrpNhvZh>?Q7c3I1Vx;TF%0Z=*4Tq|&-MkM zE&=`Mv$H>Y#1eZUZ8n;kti(TbOK}r4v2y$rRb9D_V6joAzFtBLW6n>BZi|=3>K2R| zULWmIf@ihglN4SRfg*@??<#3!F)081O}p(JwLNN+df`D{j%g%I zj_Q8YyV_By3^C&EnFzZpBsR62MJ~D}k}p2PTRF$Z1_Y3-Et>sIk>!VtAa|Mr4ti0y z$%y3^t#Uj!)7>Q(pBMS-qk?sa;)VS>@hso9H5U2$Uy z;^eLYt<%9B)Bg2Y_r$l3jjh4%rc@)EWLsJ}LBqaRw~j`Udm)sxA8s`%AlErvv~^0G!6pk`#d&X%*ts04DL zYCLK#*w4UjmMkkrZ52d7K>^mFVe74o~=R7m)LCP^&2ODM|oKoP4@uk$D) zYw3yw&nDa2d;?zkbhT|<1V#I9EttM2WIqdo=!1*?krH>U9zN=YNx8>f2ts@0Ln#CO z(unG(mt!BEWvV&U`kseUHo3o1(ifIVd)-NVIR=BoVr00=PYhy#lDoVJ{&m;Gs;JuB zeD^8CBFkHv0|iJG#(0_cV{Uk~-)RijE#8#{joaXy+P;K4->HkL!-l|LaMO0ZgyB4D zz|fdt93KV zUg`_(%n9k;s?HA!EvhV6bL+Y8~R1q{@17uOCvR7JXq z1|h_7O&{#c<82iXzK_D5(h+#88>kQLC%d%6V0B3lmzZ{}T%#05qCZPT1nh;h&s)r` z7&Fo>B+GU>SL^(6D7i5&#@pX4Civ6B5c3AkSZjY9r9h1Qje#?sm6}ueE~*9d%qe(i znpXouGrG_muAD$7!=hpp3$cM_gan6^PSj$8+vr_f<@;jkU2?BKe>`$xS>yqQ`3IlJ zl6)5_gLfGxwvN?-k8WjSREtHlv&A!v91%&eNP(q=i`HgFawp_{m&(TFLr!gyL2`oo zs*edPP^Oe+559asz+QWQxX8yVeIuEZ3WH1kg3fSV_4Q~%N@}fNA{v)~)jrHLbx&3L z0~KmeQQ02~{^-mO#0_t`tMj;r6~c}Q!^>Xy8BhLcFE#6zE;Twei^}&5n4H*4nRlaF zI2rgzIP~Ip$hj#UndR6lDg3J@B0QPwIZG%I`uAfKWZ};K@FwcHlyn<(b&z>(8-;v9 zA{8=U^W6l&o$wH`jv%(hi--661B4=pbXI^0a$SE`XfQri|*p6fR*L9kDz-r&*gx(EnF9XPj%t?!1S*_D3ZJ zx7W>oeblE%iN)%uP>Uo|lHO4)4u3c0Dr*(_L?rEvQkcV+EPlVfnrrt7YZyLUr$knj z2AoTBsX(;oh!F6N{yy>SC1G`%7-fAiC&T#lC%y-bZiW^k=Sh3&B9_i;tBfP2a#atZ zU(R%=Qy0eXl50J{hN$9o9CL#Ve&Thv26PKcX}IU=OTu#I*fBjtVo%38pkJOgI9n19 z=*-ddM7ezdMr*U7&ek$`{iUzR$Zs;E+9v%0+OY2FZv&CyQl}{`uju&-$VC6bHQQhVzPY1f345p-wW&d+xOhol2G+9~MX*zw3 zx8E8Pp-(Ji>+)uW@H&BwHZIglgp*AO3;jXOB7$6&NDHPfuFT)shLse_cyM*Zbv!-a zE?WQcNvHWq*ZGI1;i3W{MB>$Q;5BkN5^$lZtLj)R;SUql4|AG0WIeEZA(lmg^mI}- z)?!lO<+ySeESLWhazEY>ueMVPAlcxs6gIYtxXt>J35e?c5*seKe#tc+g3|HiA+nhS z++*Qz`9X3?+QXwuaQR`O(F*#9gUeRK|A&nOm?!{!%gB2LsltDW{r!;W-}C?T=NwwJ zaN($mds|9K5nM9cjj6ixkg+zPh)OB{->ouUnax{L;MOG{9{VU`#`PAKo^Lz1K&6-j zJSBdW_iwG`^HRzsTqIXa9^7gNql=b-q&p54eg?1i1`3@4=lj z9guKm0b#whON4pN zG)3ggVOmIJZT*v}n=*88m;x5_sBKgo6%)p`* z-ExpI>kk2Zk>zFnt-(Js3s|mGQvsM00uf~m$N!WZ{tSG?5hx+Sq8s=BQvSa|j$q$d ztRr^&95;k+IfTeP1ez&laJ0M{&>2sS{f=c`p{01@%c}eE%xnP&+_}0)R2(B%4-8y; z40dCh0ZwrS(@6&xF1BI*`T&Nd^luI~D~(yfLGiVddBH(tYb`qn!VGu@xs+|4H0!x{ zTSfCVj?!@qJqHp97Wn;4aF{zglcPN?oKeU?d|mKy(;NYZ;ZV_35xry?uYY@|w61eC zawOV!dr&y`eC6bLjqgqksjKsLML3cf*vd{m0CJ2Xn&8?rS^6p##4Ml^As{TSN2sTN z73Y?xJC&Tn%y%La1cyDsG6$B;Y+mkf8h&&`Sr!ieXiNH!E9>{}VXy1M(o%qn#Qc#s zDvAH&o|_0hy%56(AoO?}p1--`*a9nanSoG8N~M76ROot8Qv?ku$Oiz>1HIHg7-*KM`jbQWmcmkXYs{2COwzURC45V z{_r!rc(^=#$B)5w#I&k-y*`D`$>8b(oH%A6yX+vo|0%0U1NU`D4si=P?o9;pa zlCq0YmbFg0(d3f#FVDx+#&-*$=Ym+4F%Y~W(ZZ}JG6=4mffvSCI%iDakz-F($~px|yvc$WlQeNMDj~iVUd}2xT$GVv z;E0l`IiTpFA{bH@>Y#NZ{lIeX-O(I~HYkZdQy1+%h#qe5mfdCpQeXgOJP}C2YjD?1 zD^}dczQNWAX|R@!R3Y&4%(w!2uyK0UG}icaK>BS4o&{wb35JuU2ReC^{_vkaP6q?sN4EJQ{Pym5N0+@ zU+GIHr^CXfiAN^@yv;dBvQZBQ%^DFDNu$IDO?JKaF{Hgaw}bYQ^lV=#z_S_;l`PfK zptJm1{Z6B=VyQ|8EK+B(QMjw8=J0DlGo_0vWXsI!ofhmKR6!SA@%V@R*wiE(W~v{* z?3qXqpwa&}kpsy+-hZU%ebYqh_d8LclZ|#M%Ft}U-PtVRi3hMD-)Iu{r6ID&v^D^ARFAL5pv7WAcgWL+8OL;IZt+SJ&`aLPA* z6=L|L*QRgAHm)>5==d1V_y|s$NOz;wPa}e>7q}DbVa^C0Wt7j?n!A@bp1kIMorePf z^vt@#%FOGcAe6-E3_Sv;!QGlYm_dJ>j1S2Bd&8f_4VoLOmoz&}S<$boGF}V0NCh z&RB*6REW|UOabz2{cN*dP8V(5wHS?;lKkzU z<0=b?dgLPz3I1}Kc#S46$BMF219w^Vb=5^!|8!7U?9|6Jfywi_RH zQ0X^fzz)gif<(SOC{S^v8_Z;Yzjdo2{rjez=seqybHeH(x9$NXouEou^qHgHSnCbf zxA7spD3HOZvyBa>j>yoB$C!p=S5k#wc;iq0d#XCp0p`Hxo*wKQajlWNm1-GxfywKu z#!3~1{6A4pz(Fj-x&LHvbTV&28+6h}&cqJnArj;%>0K8cUpBQ}(XhGs$M6C6VJd-iV$au8F< zliYY{KaOIeasdY@2Gph3+z1-th1E23Me?``NTg0BXD#?R6aN|=5xCSMv^vt_%YkKI zd6|QJ8qnV_Kxko#k8bSD&bEDLrM)y?Tyihp>d%ArxUC)eW3QHyWu|{fL!Ev4HP2?# zD3cB_6%@nc+I1e<)r~*<(bMR$v6k1^U%_?YqtV%+Z1 zf+K+ry5DK%;{RzTE(Vx{b<3W`l+r7?j5G)8p7}&oT$%`+Ga|GdV>K&*gKi3Qbx!=i zL*g$)zjGd!gz9+B>=x+%ei!ewZW&F05q>H*-^$eJg@-*Hj^sOQo*m;x;$&aCL(Td( z)~1tV@JlBPS|vY9tjaK_u>c=%Nr4Wbc90jgH;7p(DgKcS_Pj_CK`wC&I;BL+s5Lsz{PZiZ`H<-vm#x8FP1p`updM*$&!OIKoH1# zTjHQk{(fwk1UIBEj+)~rHNZ&X#F!57xxzn_0F!WTY$UL(i(^9F)7C=R_*(TRh!El? zj7AhCvRI_r?Tl8(&#F4?O4lt-Ovf8uuqtsu06v(9n*##bWlq|Bv&??J%~?7>B&*uL z$xTDKi`Z-HDrAGqP2D=#DqF7+IPIF82c*<$fA%`Jb)@d`2^{d8%6;DzRl@I7TM~iI z#AJpT7~%0jxH~aT;ryk|{Z_U$+M*4t?~_`LJ*P65M(QMwGL?ymMbj5aMbCAHvdC#E zxpfXWp`6?O=#QKBcU&LxMATuS*Uyav|9W9}VvNIhTyIDm(O=ZDSyD}-lcApVUJ>sG zmlI3O-}n@bJj*0>x7lwkwkuMKB+^=_xA(ExQ4SLgO(yUDZeJ*^d3Jy#Tt$I?9B!$3nKCw@b&2xP?+g#^+&mqRo@(MBDEvNS zaipZ4?Xc}zv&?s=bb7p}uTaD{LiSn5L2&@}fzSH4?|2V-Ti$Uxjp{<-4h?!x6M5|< zA>;Wxm#gS?K7hk&Ded%A#!lPNQggZW{HHbey~bd^Yn*lZ{=K&Xe4jBuSG`7#{HB-E z4bq&h8gwX(J`7mn!R~vY=8hvom$;P1G=623!0h5dNaSW46h} zYdz!5VP{6z*h2)p=6}Mx04_Og$xeUG56r~dZUxA^xny%2dX5zE)Ae8c2rvn}H!q!< zMTs{qyPNS};A|*9dzk(mt9C|ZO>_=0inGXdl9tC;sk45cmGi=nZl8)agOlR?Qp(?; z(*&8NMi|2!RrRM@H%m9$`Zu4eG*WkvND2Onm$2CnvJ*`;^}2l%C*_T@VQC1Kz3V})xZt1-&Oxjw*|j*~ zP366xAKtm?RNoXqU9$Ti@Af-*lu{60+0m}qgV(A|P=A{YV`82gwII9V7-imqzbK58> z6C;fIrs~#7AT3U~01p4f23#c5I)qO=aVbUb0U~^?FS#5ld=kKqy64WdM;h&XW~#+tff#UbaF|OZ5-#o12&}8a3R2 z!yMBq!d5W+42Xv?WPW8tz?au(MSfh@VUZZ;?%iA6yzpH4ZuIz$ z5>YYk7Yfm5b{9SmbsW3H`vII;QYsJc{K1cmh{Jah>h9cH4@l!a=ob&u(`5Ny;{d>f zYe-Z5lOa^5#%)G%zF&yP2F4eQpVI^S&0Gy`ndoLyKgQzFH`Z}D@ExO9+gbYV2X}tB zKl>5X>3je|0ifq>CYW+0<@!sxNCb?$op}wnr&dRrd{t*-{_-7hJmn62q`JVAWN@P zM_>1tZiev^T4WzLJKm?0${_LL4&x2c5nz4$R3-iHgD`){3kRlKiA8S%@S|bn@4OHT z1s?k#$@l!wgndcm^W312`mK#voy4iqcQpX#l`Lek62*5nSL4o1+^W|VS#piI15~JZ zD}y;2m2ZJyt^OFjQ~9f8JAK55uO~ioW8+X5p13aqj2_#Fw1J8Z6*d^f^`Ca7SBu-& z0_C%XlzAsCmU^JXn}Rw_WMuYxQ?kdOiVz?7N#Ia|@ELwxc!VT8@;Sv#a zwN^+kY;5@^J8g2xDuHwNSDCF^xN?{a=Z2C|l$B-Wa*b1BKy|-c;%V#iLH@UV4hB~h zhMbu4^?M~OBy8EUH)f#^#Zz-$sn!T>A0B_vZw?1&+O#TaOF%T|#_lq3Vh>&`lNo#~ z$N0uFw+Xx^&B2uhy39b4d}n2{>Y=QYMAZi+Opf|;qxUOo-E8lA^XA*aQuBlgxj_l? ze?j~JpiBxV4FF3@x;%aix-Z1+O8qx(R%dmI+i|OGD92~D2^^=FI-{S(4i#9b8EyQ^ z(V0p%z4}Q{cW3o)?}PHe0AhfIvlU;Ln5leFNJu^+?9p0z3@d`p0_l@{!qBY*kNhWn z!GS^mRI31B=7w(b82hpC)C_-K*D&4ZYqOp~(OGT;vKuM%#V(GGDtxr_uRB3nb2`=3 z(&?k-4;rmwtMX{Ep5}L3)Be0Yao*EbZkYSD)E~th_%g32x#9w*Tq(4vKFC5wu0_#i zEiox2YndiGu_| z%I`m0qbBL5GO8byqJ;Kq?pK;6t_4X}^+O`PX2=`6Tq(9gl<*;-i28@fcM^zFq)}}~ zHSeTdiK68$RGcFvZ%;28>_bIGlUU{RxOo7DnuNp9M5L9Ms-1iD?|vJP4o=HBZq^1X z$C)du#qmw09dAUK-`XxK2s~Lwq^p?Ki6Ni@?@QvDvn~w3pZayF-fq>EtVL5G=~ddK zB0%?De5dNo=XYi&P5HGNjS)AnT~rdhTP(=DcQ=zQ-b`9HsVV#x$VuH1J9E)nWAD|l znu1l>S$hnsHf&h;tBd;f0(jsuE?5qe1VD*u-gr;8*#Zdzs{x4o$BXFca;jwl-_tyW z8Z9Pm#`!S)y=%4S>QiU0HoZoe4Q3`c0u-%pP}7A z=9sdDAC$f2?bJ}07z3tO`pIz4cwwa;FxK1ECvf)lkhMmbE<3Y=sTgwTO z6}Zm-0K9tm2KDK*>}E^GRg=L>7MSL`MDo^0Hyzu6-RIv@h2^i_tDGn25u>I+KB&j_ zo>8biK5z~aN}JOt5Da|%>WwPfwUjP2e;t=qiGx7qyYVIqol2Ze5USduPdWp_MgX^p zAW8t#VT^O#4Xl7^&PZ{augI08VV#6$)O4suy_-_hqtpjA{*Tx3uhSFNB)z6jswIf` zgn-`h0ie3x7CU4Fa64jXtkuDVj@ZuspgvfKm=7%ca@ zp(Xq0q-i5>KwZ=u^jg7CrdX8w7AE*BwA>HxN#CQ}A~p^)o}pmRKYv?vI~b`Jh$gHZ zeRiS##`u)vvlZxcz+(sJzE$IEdv9)RASKKF)aIUF$E-in`JbyQvjzR3V&jZBSEfXp4UJ+hV=mm z7V829bm~x6SO065N!{N4O#82;s%Ty6T}(F~)}0U_OL6UP2E!iZr|n3oaQl!<WP>RQL{;+%uZQcWPt1Yo)&s3b;3y`QIEaaM zpdL4~MMS$D{)EK#5KNZ>LnP@Ob)M)VBJ=W-;>i@~`y#%+kUDwoxt#}Oa94@Y^x4;c z!)xQllaR=``mUhZo~W5do-bKJ+yGza*0(LmkV5u&Z39#d;L8udR#2vj z2QFl#B@bzx6wdk@8_%9sXWP5T+ycheeUat!0d)*f_pHu%1i`g^*^NuCad7zFXd;`n zFzx>&EFt}4A~A-RDyfgW^qDYssydf+fkXT(?xF|-eOnO!XJH66(RZSUS= zq`K+=j(_K|JG(rt3pC4?mql8j6||&D#hO?fv?rC?2Pz3Bwl$(Q{$cbQ{YTsQ_{0CM z+DH|(K9X9}SQDB;>y1&YhP0;jfv~VpWP!5mKuOs>FuSumkLw?2Qif$=Uvux7JM;S_ zH^cMJk6dPczkBXEzf*6d0GNRG)E3}ZK=kX~;x3t_W!YlVQEeu44TV#uDQ3^w4nx$b zH46nam}WY*f+i@EccjS|Ko1;8X|Ppt=b0t;=&5=W_d9cF@{jTzKc zMvwMV8W^-1gQ!EvByG2>B++K6#xIvCyxC_SSBYAB7I@fked!~9752uuV#IO%S22?U z_uGyoj!NeT80qe@J`CUbo_9yywN2E&)cg)>$-kV-k?%e%$-nk~fNAe5$^RN;1YioZ zr{)4XfQ`0eiL3PW3u#%@Wo@WcCRd5ET36gaYF3fPgl}ONj+xw$= zuOOhk?6CBOd=rE_mb z``$@=GrdKf34%!O!pr&s`R*PHr?Zm$Yi|$m0ZIN-Ck4O^IIh13SOfgVawxGC6bg(U zKgr0!!`3GWislrA*l8~)6c{~r+-%>Qm-%QlHVk|f*x)F)3#%Yv(mtz87h6VFO)m8vc4e6UtFemwzfTD$`^Bt96CbbWS=De z+ACnXv)&=ef97NaAOzY|_X9rzx@^Z1XNh!*^r9}a)o_iL4UQf=VKxd9qDp4fjU?yJ znbA4Q7jqO&XQhpAcn$)ebzJ{nwgYJtQUHWRdul#rmB1F;vBX`XEknza#iTl%8J#D{ z=gA*DB9pMh6%y$*nbkK<>(Ns=m!r@pi9bYT;D^As9oLtAk!wf_fRJfVZ32D@blQ$3 z?viuo(6V&#w03F>ibX~a9U&MQ4Iwho2ojlAGOKPR(b_txKVKdirr6g{X;6n8SySr; z9&ud%Z?*$zL{b1mKzr&s;7Q=qwqt1osRi>$cXg6%pIjjj6pM@=?WKG%7jk4G_9oGv zqMRF|m_0-3yzDCxvR?vjr2(4=ffN7{(w^E3Yy+;d9ZMrfI&*31>Lhu!PHsU!@yuHk z`p?K@EHNdCbeiOx*(BQANVa7NMn@@M$Wh7-$^WJBWr3}giPa)RQUF9ud#V%oKJYm} zcBZL;L~AR_+3h4}wUcPgP#zf}7#gOW8b1lAz zDbCV%!V^_`G0nD~a$NtKdrNCit-*{4Y(ZAxMBxBtR{u`hfru+f0T2_~Q+EJg2R?y( zafPJ>JP$nKxcoLnYw*t#Uj!j%H0DR0a|BH_6PpQAN_S90~Yrq$PnQa0f z#`6#0$H22wy*45`QUJt^_S8b)Vc_$?O3UFiiu0KD$J-p&KQYz6tUZ+gK86_;xDP4N z!ZZN<8hFxi{i8EInf6o%@MYjDz`~iHugPiPcffYX_4nBhModf!fEd%B`Y`4W=2JkM z<#6Jt8#B!RwB!0iwK!p=KzjspT~^fMoPrYY3h-OZBbl09t7_U)8BAgQD6p>9=WlSY z1KWWej_XUm?HG{)paE3wVm1Sx1nxraK(FN}@B*+i%ne2=qXKsU4`AjD$Y{;fyp0*+ z-v#_}qG$WHq&;;5W);qZz=x3j9OF5GnHc+wY|k5CQUEjwQ zOw!-wxPFg~ASy{kRgMk7%=R{JOb3A7n56%TrNdeHnw5R3(_i*XUt68=r9>6pj*#*4hxc+&|@mxlGDh;gXQbBMV&3TuZ z2mXRd`n#ty{~}7-Qx0Ys;U>)Is?jG82EczY*XKED+S7QX0B9oGQ?~#gsT_CGSOvjh zOu~Nw*z34{(Q-VKraiR)_$a0rxEok(H=@uC0S7T_!e0db?7050-H@h7d#Vj{%^m2=L{b1Wv8sY#J+KzI8OYd-X%a4AhKl!BA5lId4x9GW zD&W1qYRolRjY%+9+4s2alrVEG_H+5Q`d_0i3Dcfx2i^zVikU>X4)d96w;9(2E@H0B zKH%@b9>?|j?S>?xBn5zYM`dVwCFYB3E#?bt4X~8x8{QOvBaBJ(zzN6ooAN)c_S9lb zF;HC?tj6w$K|fbsql4AWlbV(GR0>nLRTl-f0t+Gzr2rhq4ChxLz0LYr5{482VnUVf zcb%9-Q++G~x`5f3JDpjT*XkpMSsy$A3|5YTF|T8PoCS_Ju0I;dKQQLBr{-c3%?ixq z!Z}ksGF-X_=f`;+@7D%^v-LK=A`Y~tmS8?N9l*TG>)0QU_wzL7G0Je|7^-?5!hCM} ifKy{$&q|^f_y3(SWu!7Fm6E|ALS&6Fp)yEiiR@8I))2B}DxvHnk+o%{RF>@f6z!p= zvW=~c53&^5m;V|1eg8dAPxHR-bI4euQIZyA?X(M|D5h5ar-afN{^x>|cber=bOTVXnHQ7CFx1qdV_uQPY zf7N|+!i^n^xVJ`W5w=5D%^U6(e(10YHR1m9-s;Zu`00|3zmu<*e%a5eJnI`CRcCK;GRD1MxR+iX9Qp3N5lXpzqp>l`mqxeH54>g9(OD%XH(*Z+v81KIOu`YVG!2_1347Pc zk~(|GqP#0>^#f1ex7?hFhqs@f+-Q_d@_oAA?N5HZQjfFk`Em;Ltx=)8$s89OdD9)I zd=45|i46Q2w2vz~emK!1c_QeRSJ&FtVlISnN?;k^XEbxc0CZHJ^iE{dJQIznSoKqnJ;MFcisj~ zQRF2Cgl;*0y`viO4HJ%wwpo zX)5F9`9pR2RW^W^IC0!ObMSEGlia<(dyb4J({B>4V-Rsew%f>VbFJUZ`RsF)&>K<$ z+gf>R+B?W*N z;MMktRx!XnOZ=gG>Z!>`f~!gH2@{?Bv@(_v{o%BF9HsL8XGd@X{YVh>n64dPY{I;it7KDtLXTMmJUmRf z`4D0_0ZjVl#tlJL^hDX@D}5m%uw2i7T!xurM(0E4xk({Mm>0e!)(&MRd_Em`6nrw^ zE})+5dyPJ2Xysh7EoD5xsIcJG#NFyu2*vIMcQvduVeU^|Oxj!Ce-rS%xS5-c`$4em zp4pz&Q;r{}LzH9&nx9*xgT1j2wc7l%rSDx7tgFj&nY^79NC35Xv)%FzF%OD|=$It` z^d{s_60&=$9ry=LVRh^-swnLvS3~RTR?1+Btzny$we^?w_B*AM#V=pJ zR94@e8#1Sp5&Wv_JIy2Vn+|{xnE-ODa-&1zifj#2DyyoB$HrErYF5pO*Oi7YMV7jE zhmrTtdvBw{BCB;L;a-&N0&Wj+%4+xhsy0HFi^j^=!SKF(CJNmSb z1_hAR%%qdn6dM~FMpaf;cP#`I(bMkL?f_R1HGA8qMI2a?66pzzv#EXGCOOsAv|ene z;X~Qo;OTq`-cW=gt_Oy5;!hGb{Q6!X)+elD(bd(bRZ>*`zWIi4ehfE1tn*25B@1TjjoYIY?{3N-bA8kvF&REJ zs#)$nBn)alfKD5rVOh@ z&t)?G_{*#oVL`!`@R+oiye<4&Ar0%6${B-$)WaG_&_^li9o|w2*2S-X#fJR+{j^1M z;qlw=b{A)t3LB%q3P$yicult-@6n-5Wm8*QXP%J@&I>*rWuC7=wLjKrnHs z;(t5x>Q{ftT2%Gi{<-vtMs(g5#kh`YHGqAs)G43*c;A>|b+O zXR*$>)uaSA^u6E$-yln+xtg9jSZ2&BX><5fQs-Uq`0r3wau&~mFcsbh^qSI)OKihr z$Jef=vVDH9k{itKfPJU5U4{xKVIb0rNVXnT>#fz*H9qgDf8XnL@}%BYRX2sF$KJaa z*dkB{3mcoF`JQ*0g*}H4#V)D33x1xSE-(D+=$18%<(uOaKx->ZmQw$+5MKsjy`7!MuIyU1xt_7zqgCwFAw1?(WW5#(%FPL7rm%jmBG=+7vA>-S?leMY6bmv6>Wyi>S?sW-hP|Gelu4XW zp={E(x}%%!lr=hh;Q%v+cAe(&W{M~Js;!gJ-!?g7o{?sCYi6f4qWR|1x4PM=nH%@6 zeov%w z;yEd?bKv3aMF?*;G%@)^`+IBRUDofr5Vh0XSUvY(9Bys zs~VHAV1(AHJqdh%@&_JKBfwlAvn@SSl-)Boem|s*fEhM!UX5yE$jB);*v84}+34DA z7W07dMqjfC`X@IVC=mlBdRRV}=|LOp#s}jkN`gI`wLxliNbCbBD`~#>VTC>F?nsfJ z3*&wWAgTk%FeEJ`-@Q=sUp=k%=Q+IEL6f^xCYqBxqpDAv-sf!rpWT2#e z91lw#PN);xji(hV=O#RDjaE@_-V|sY98r0C z^PXtkIx<4rl1GOrl*+e$LVtGRs!dF)hDB}UwY2i?+&LlUDn745{=qMaMZL9U51&5q z+&0aJg?vIaG&+QFmefFci_%04^6EM0zR8Oqtb;JOF+qN#%1@2eyK-+SRz*MldD|3n zCY@&=?BWqWgMtL4GkG3WY{%l!y0!|RvceL+;H|fF2*3Eyr_e?%5WdmYj5_ z>Su8f5%SRJ_QRa_lEvv&B+yj-ekt)IlFP?$S6{YxuLZEXZnnwYHkP|e%`WBk`Z)HX zAbg!Wcjp&n-6GnaRWMzxcyMkh%B}SyvS8ap(I_2NDsB08(iqdXze0>{u|)*ET=mnH z3Ieu#)d%{sXTvXB1_x8`953SAvr0`mmm8w<;LkbEaMG=+-+~$C5l8|Z>Zl8?^V=S5~~+$yp;QlNxCj$FRZrPyIvJ1*T(c)ucgR)mRXcl2qOA)I8}xHwzbJt zaLX2j((b!2xTBx^#6w0J^e!95Vy`>li3oQ@&hU!0kuj!H$+gAEY3S>I9AdbucE~ZP z^^IMrTcMSeXqSXGFT?=rqQsldSF%ChHo%f#Vq&Aue&{Vi5NuXY z8?sgHy4VhKb5wY9;)D?E{ARvng2UXbU0d=+N#Ju*1NW=Y*LKvcFKtwK`Z8U)bVy!ikU&QA zZsYg&IUQWp`aVI zz5P_MZ4^{+smXvK6ybPGOc9GjL{Sb1d~@^`3P9?&HZR@v2}puf+rM!0-^UaxapLvQLp z$UZEJCx%fgyH1}GGICm&?Jo&k(%<2_%eGYCr(gZNGeiWr9FI9)ahNtE`NfM`Sa|M< z_0;3HB0|)lAAhn3eNV?BETWF_V((jo@b_+46hEO3>E?@1vpfFOFeEmi^Ao%VB@K&> z)Dx5?p}&wW$vV8)^#eH)*Pq>SZ?87DE(`a;JDolq(f4v`x|ehJ3mvs79rlXzMHA#@ zvE;B8?eX9pa~%3fsvM3ZDqGo!lZN zqkX|WEmuL{dNMxX=zYroOQz@Zom{3{wsqd`&t#oB`J`aGoRUKs-P+w2PHes6cnqh* z8izN1hpu#->7DKs((n^}AhDrLuV!gU4+@jS+^f`E87@8B!(5ec1SHc@aH2@Xv%6zr zw5Q5HtJHm6|9cF_V=X5ggygeL?flw)@6zyYdNY1nqbTES&ER?rbP_I74u{$E-T%{B zw6*wr!S9&MFJHa05@tTUvietoS@CgLRR+Cf@`(XuR+1w0ZqxalZ$!vRp*#iu-8!B5 z>3)p$pq8qGo14+$y^F<@!$NDy3i?9COl2&E4gp?9KjXwRZ091vBB=SfPwh2i0vBfv z1^)UdsjQ^55PBWV8TfcGGkUx}l;-6xnF6yDMC36iv4ef?aC(_EA8>afk_ zvZgZC5a0KknpXEFhkhnC+UFW!Nizc2K$27sOVJizZj7T^?nr*uQQ{isH{9V=b;CL2 zqaTK^3^M0Q_nzEzdfDMAWlFVByp+JmP2bRB@n^cw(O~%TLh;MMxy~JHq)lW8)~Z|+ zAuE)7a`)RNO9?m@%0hF7p=Uu+f7-pv*a1HsPS3e3%ej3E&9`P)^eiM55(TDa$PGL_ z5Nc1;Aw!QUVM0nn{22$kEwqod|1+R>2IQ;2kt?x>pSA%@0;BH<3|?aSNjrZ{K!{9} zOZN4SUq$1?=1zHzw@6=pq?IToa9P;R0kW`uIe=&!Kf%TCDlU%GpH)3)KpdQUOmAk% zeRIGe;xh@4Dc7@&q%bNpz~lxzf8E4I1dE!={3^0-c!o#hr$Pl?`BGe5n4U!6#4cJd zl~a7-(Xgn5E(BX{W!LEGdMj-%aD*}m$C|HuA6HeYD_j?X1Yu(ee6Np+5KU$FW~XSj z$5_rZ8x@Y}vi2KYt*26PxgJwn+x_TT!o(XaEg8xbB`~SWo1j=FUZV~(T&m(9%3~1U z{ewUFJ~R9>`nLbV6-jP+K*pWR&~C9waslt zV`D7GYCbyXmR*`RI)3!|Vc+7~skX0$MWmV*Z_NVNBTVtqs0W;YP2_FXLh3hH{Pf@G z;+wJ2byYsq!TCBD%lQiZT<%-8IaEakdT}HDSO%MHXqdW`-gU9j(m=St7XNtW7&MT0 zV1c4Q7wQ|fp31mRrJV0Vrv|K8SBc)u53hYva)&K7liLaO3|@y(Z62_c9`JydyLD;Z zH`#|bIXW+FYoT}C0IWC>2bt`$g)@G0&Xl`rQ?2`Ih5hw{Jzxw+Bi1& z?;(q{Iz5D{&AUdXhD(Regn=|u>vw6w{~7e`a(VA3D?fOe*6mppNi1K50v-T*o+P0Y zRX3fd12lTW?i4bw>E6qs7=T)rG{px>pa)bmtaI4`i>3$8?&+8p*OtV@`Ib6wPfe(` zFv8lX?vNS^98ZQyyZfQXR8Y=d{Ir%aHg?PQs<|H__qI^np*fX~VpIzkRM~tm(u*}x_&nrHAMPWSu_}lt$kLDk5$~)*t zNiA5K$bpL&+eW$=A;i;gVFfWa7Y;PvHkCut-xs0+DG1xJv||4pV}H(0&r?g*=$Gn?MJ0w;x6S`D&IdFL~&ugAhms> z1;R#NQ_9V?6|@U!T3+x(MA1}j8V>k=#=z4&n@c26m7*@o)o2e+W9)P8e@;{GYhC%% zjACDCYjk<7;cU6|)_J!QTO%{Jz_)+d0{?)mB zJ0UpxXKJulBAo}0Xs6vaIr2lb8yyGCXjH-n=>a}U7R|T3>uLIgE5!oBZ+z!ftT)^`28UOF_g}c)*JMzhyqOxS=u6*xu4dQ{CWEc_oFQFhxSbH_php@QRle8 zd`3sD`O=-Rk?GSqe7fXA(0krFz+-;F*x~AYz;sX<{W5(i-Z!e5b21FFRD;d=svhCC zy!!K$^%!N)`5N8-!EPZnT@Ov8N^6s&N%un)4{57m5y1&OLO`T9 zkB$FSc8`!wv+WWYctsn5>yLE{o(&U_m!qEyTmRip2|Zi2K8t{ru&6N~TTRJ7dMfK$ zqIkybGj_W=Q7{z1scf*jP+tgNB9Ynhx6h)4P*j|wQI4|~n4x>}by)T#- zQ3Gb23R^>e0JW$G1}QxAtD8Khfhf?*i;N51(AXm_fzjuaK;*RrU7pqQTx34T5%1bY zR5S6IF(KHN=kf#^wf)M4P!BkfjAK>Lv=bk)hf3J6ZKPEw3{6KK7NTl~il^4`1CcPB z2=)tA1up7gNK3qsll|Gh0m}(FUeowvQyR7G|%oFkV9Zh-l?DHN+*c@>>*s zOTzDsfCbwJx^klzAzA4Tsr+hbu?<7zSFI6QX_8V|@5hUO_2)%bs&*8x;bxP+{o?wP zWJ?-Y%_<>o1JZDW^uh?e+B(PvN-|MB{Ftx^%7Y^-uNZDRj(|3St=xFbq8N@i60nX? zz^(vVYIN^q=QT~ZLgMinyH5OeoeMd9+$AhzGyR{UMr==?{T1@YMAQKK6$~Ywa_OsF zSG6BMwn+q?Ymh|@8uU2ckrob^SkX*!m9Ae{R9<5Sc%K8j3;Lza)9Oe`<}L&y?EDMT z${?|aHC{!#sMVgYz%?cej4_b7Vw;Wras$yTAc8}s=*`jLJ%^cT_vZw4s7rWEK@4CJ z1~D&1nKH~BstNVroQ`8*3ZT>_JmEG!4Lbskgh@ng>{ZsUEz7ZG*3)7=CZ={Ti_nV! zx(w~3{EhaGeDOFVEI}C@00;bv#5Lty_Qju10eC3rE_?dRR~rgu42`ff>dFBAcx~C~ zLi#IGqf&`PB3e@5BDcXpf3=pq@;`Pez%FvV*4Qg03Cvc-^lVPrfpa`B%dzg@Hrzqg_uwLxROn7$hVCRn6Kp-v8sf51!vwnkk%FB0c6ow^rVb;F+;jotm9rZe9G~ClsE(V<7k+(XPpr$sIy8 zyBhy96J`|EHo2GaJ!Q}ugI>pjE3WYVB@1KME;ryrtF83@oBDL(d98qbvhSV7=WE-D zE-tm9)R)IN!L35lR~D^%x|E)HEYHp-rj1OiiaF!?zG6WGgbS% z$wHU0-&+GGQ))}y$)~}@4SuZ$q`&A;Nts-cWlJ|FE&->`uGgM#p<@dxCYQT-FRB?Q zQwa31)TR%#HlK&fh_!NDstED-vcCoR7D*vLUS~MFm6D^}G4BfP9Vc&pKKXh-Odj}} z(Xb9BztmRGMu96bTZ0th^>a`;4rlxND}`|Y+F6&mko>h^&%+Vy)PJxOh+>9maL;r| zA~iJTULutu?A>4pu_NLCkbci?(^sqnrX|Fh8IcoMsl9_!64T7K)(wZ-Mi1<5=BKSM zvW+rqliA_jtY7&!GiUD5gOQ@8{OkVs%?ZWw&?>6;6Oro`Kw~D!QGGq~9-Mm4Hq4UT z@h@7Y+bV>{oKiymFEy~Fc>^bq2}A}%B&r?xw(Mf$9oV{#(+1I! zn0nf3P>L@TgK}vXAt?9qJ46>+%o$z(s)$*Nhwc$K+f%sE*xg6_$5q2AWQRM|F!Q|x zCdh1NX_p`{jlThH@(j|Wd*=2ETxSd(>B5VHKWqMGqUgs zTu>(44J(TGXv;(EuiP@JvH1DC*~NT%&z%|0dK|iD4*X64zaJ^M27oXT(nY`F>`nTf z@Z^!?iA!KW{MYmR5nPBC%@Ha?86y!}KEokzUUwYMzRu<{_YpA@3nqfM^g9f_!V(C@bq zA6UaWPvjM0R9MVCHwn=n1DxW0E9v52go{Wqxqlpb#%bFVec>*1e1Riv*lY+Y4!#_4 z7$?W(rM598T(n`OF>@mXQv0c@6g5c0z6OGQ{1=Pc@Oa9NO^w>e_IAp=PP3T1%g_wb zNI}G-?97<^r}5Ut9J=SmGf@Obdv{dQ~&ED~EOT`PR>$3)4-cHq>@-PVu66JP>B4L?FB2E92md zqvkyGGudbwGXq0RY3!;!2RR?$D$=L)g7Gq@)&BX+Sn^$0ZI1bE(HvARF1!~ zhx_L8YfpGCgV%?74`BmJc)FdiD9ctZwa#BO1vhq9nC}u7s&2TXy~urnkMSr(|Aqi- z6%u(9)i+u)NOEY-yz_Bsefj5dx~q82<-R!5R{>OQ3JbqbIz)bOKs+Q{CgiO1>A)g- zXp-*<{vkF)IM52)$}YOi{bJGb-cRxDwVJ!euBLMr-D^as7IX0ddpS_PS8rUaN8*G9 z92V@2CZnMKE6J^;p!`V;d?zs-!4Wz?PNk2-f_Y}<&KNTPuL25}sy$gn=P?N6Zxn{~ z5(j&aT)bJaEobxv1EwUY3xe*!+}1A}5&_<)4aCSX3& z9J&XxLEWuY5@FP$7mq?1bUYe+UK&)JQ1>;h>`C|T@=tzJXS%mjvXUp-gO|v?OYvU_ z@=lPusyHlG2Sg&&AG0)BC7e9rU**p;Fw`@hfX6g#N%F0s*9I>ku|T3Iq>Cpl^R7!q zc&{cZeWye%lanY2gG0T2_PThl=f(LG7(CR)#;Lh8tpu#&5QZY$JjK)LSVbTXv~i-Q zJ!bG>%*cpw&6K9+$IJE32hBFF|0+cpP4E?L6pn-~!^=RkF;o;1qI-gG5`8E&B%6n< zhDTlp?lsnh6C7UHQ9^g=f)x2Ugd~+%^R9SI!q+4%26PM>>^`uyz;{ulb0!L#wR#a2 zIX0S&=ZoONzWJHk4a`*x>!8nZh}yQhi#_q>UgAJLEQTse4oChDC1v4;W8=vI`#(@~ zCcfZLUAphAhw)|=wsGKQ=80suG8S$FMEVY4%7`f$2OR2aBDyR9L?6{oS zOJTjrWJ~_CzFp#fHa^P{ud!f0R0<^?PeF|9YM=$5JlE#WQTY?=SaPe$aNvow=}Zfa z$pQbHh3+dNI_4=Y3C8Il5T*vL$%J!HW?BOX*jllHHFg6W^1LwQRWj46CWsw50!jwC zZNd^S;t@V$sIl(l9m3dc0Ius~6#@Nz;Y!6P?P|35{X^BAKjE~N9_bUbTE zIJn^e#|L>V()sE-o_~#kZ`(P*omz|i2#@5Y zr9g-demWL}Xm0zm3NsByK_?oxljs^uHItJ8=heZ19 zTK9bR5j);sD>#4}-jcHV+kw2c_sf`z&=GhCdr?n4lMnsNo;xw<_+(PZ!ePftu7qIP^KDuP5CK zzgcj5dvVZI?G#+rdKBC8qcK6^pw76boxguh;I80toDw55k&11-qt8g^}$2Cew-(|kB33QQE~TXI1h|-_R3(% zIxB3w1Tn-*XP`?lk5P+5@$xIIs>w*7up*$Fh)B3)#ZW#0@c~=Vfa;G&ng4i+W2vuJ z7z9M2Ua6H?c48 zk4GZ^_{I~E&Obv%L{ZqvQXriJNIrT+VNtl4TR|O(>LB^Bf1`Rx{vWOA0fhfYAOkm~ zV<2sz`trrT*V2FB1GWsz63((25T<;4rt1S5PB};i&5WjC)T&>o2W{bBsjt z>sC;Ul)^GLte{4GiARb5P)iX*+y3dcjf_(M>9%bjdazfGF(wD~j!`*|NzqL@b z=0wI$Fz_-wZ~vo?)@o0W&X`G`Pa0O=2F{8OU)YNL7Va+jxDUHOa&P?#p@{T)?fVg4!bg!bG*Pdrit+!Sib!44aV~gPGHAj}LGU=rs_YUW8+XCO` zTz>=+9Z%@SQK1C*Lp$cVwewEZXt~9`FzNwdL)=%5M7yB{Y2Xp&lpS>v; zMqCFq3M1kxEV-z$&Y9IaNsmB4L8j?qh-b$0DPH*7GaSgS7d++5yer>kENDvQXwX6_ z9*fFcYuG7;Vc4LK!q{&K%Wo+!R8SafhHTnsJuO#&Dg=JkQ*I^bPn4J z2=>x1T!TteLmRn896q-b$bjx=aTN^1Z#=(UrQFuPYvkmz0)qlkh>+Z8|J`BvQP5En zHNa-1wqaRf`0;h1cMq*o8Y^BJ= z1WwcnVq0Vjxt0eU5>_J%n6q|SEeE}m7{=c|dnX0lhj|QoNq_s(`@c=cS!IK3C>B>Q z-oZE8%Uk4RWgJz{i2ddb45>%&aIzP#Tf&8GBK?{BIN|8BqS4&S=rJ@Ar77BppM^U1 z%W&^m=6DA$%O3wCGSEtk<^G9P;4@jK*WvHerH0E41M-r$Q}+v=#9Vuw0ZrBL%ZC% z;5(Q%X%>Im@;DGx9?J+Pv`p;lfim?^DHOnDQKWYjgheL7t4czP?-p1tg2qb@@@&DW zxLbCgPOz6sX3IKMwlFc$+8FTVdYtseKB@X9wof{~v&^X-&hf9yOK0+!J{d0hG|pGI zk-g#s*8^DclbJ`4_s~9H)Vte^y~`%w<%QJBp<596)w`t0ZnLk;CI~HLjNgDHTo;vv zUY))yGb{@3!`O0&lRA)EN6PM(J<7W4l$!rumc7EJscTRK_;H40Ms~~b@w7+ph1kPB zg6q*=l~9U7$$jPTUp$ZI))Z9?ev1RMyi9a4w-fr7p083rojauLc~rWqJK+3pb_P*< zG=e@Djpw^$)Eu$Rsr{0(?D=X>@(_UzCDyW6qkf^?DCGr>DM!|Xh>JqscGKhI}d9%e@s@)RPV%E_2TLxZ2DcjZLG zMc9rp*1=tdJQfCQ`?GIUwmT~*R0u80%2&bY!^qpS;@4l0*o69F0+hX$XG4wSt~&f z<$}+>E6v+?xm3_!d=VC+sTgz|S@^9;afQ?Ccx1_4XiVQKzF}o^fzT}?HGIa!U0Zc7 zC#(9EpA>w<^+y zpWSJ4vB{4&LJuHgJP=4S)h@JcC}ywL=2m8h`o(+0qW9VFh#O>gHmQAAkopU^Q&1cN z+cQ?up;A*U+3!R^3F&+hr3gJN42>^-;Vrvyd8Ad8ays)uU*6LR|I#QZixDB_W=BtP z?0Varr`wB;aY1BJUsn^*vB#DQN_H)yJF|rnEZAv>Xd=tM^i|e#@4_ALig{y-Q-V3$ zCy3s%oJ$RRPG_7mGq0a6FlACeYb|5TMEM$4a4I6)Ks4)_3t--D`fCCUAgqob2KeME0K+ikf|{`>ruBb z*;MG;pDi_zFD{D@sF`~!ZGWNZ_~}kQFCq9pDhv@0a$|;n_a4{s&e?vGTnp)}Hiq&6 z@vh@?IeD7>>+9cb1iGYr&KT7#;vT8*AqTA!2*zC8S`Y|~-bF-`UPRY_t>P;?O xq4$exni~&9JQ35?wkdRc;rBfWlG^^IiS({Z@`{{U4w-ZcOK literal 0 HcmV?d00001 diff --git a/app/assets/images/005-trident.png b/app/assets/images/005-trident.png new file mode 100644 index 0000000000000000000000000000000000000000..f50f6af77dbeb8cd065996064f117d4acafd740c GIT binary patch literal 14624 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 NcUtdwwB7T}{{ULBUgZD) literal 0 HcmV?d00001 diff --git a/app/assets/images/006-poison.png b/app/assets/images/006-poison.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf0435f821a551f864cddbe2651d77163a08028 GIT binary patch literal 11551 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

    SswOJ85kz30LMISHQEC_c3zPop`IxlIM$UB z;~7`*^&3rnJmNg%1by_)ZIM99x^}3MzovNV+9*BDSG%6=J^N94h$;a zy~1|a2u+fma0ppA2|My|5bZ86py}Izx6eqR>$?C#{?~UE#+paxd3Jy&Lk@cx35p$n zNdMEE1^7RDL;2LOilfIG=ivN4mvpZjdFpXKbeHmq@NLG8c0`bgs2lb&;@edmQ)-LlSS|OqmFcIH8{O9t=hi!^1%QZz#jrW9RUwV5V z=%24uJbLtLPK9Py*U|hMlkDVVYlz;s`~p!bL@{LTmU4klN%Fd;Gu2wdjrUFcD~hiU z8E0#{c0P$smh)b|zhQ1;liPf!IRA;#)A2)Hq+b}>8vuewG)V$^z228x=ToiLf{rLk zD*E2K=6&Gu(w)byZtkWRM~<7BpB%*_ZB>mr<8e?8lke8M?_WAlL| z(zfDfJXXny!G*s*WjrO34ANB1vbHrD=9iVV5EPIi97;MiJ-v|DG1D>mx>&(y{Dh9K z?(|*45qbF%&o-=-ZHfBPqouf@Ns5j^;t^-$$=x8k#RQH#Z*z?ne~^2Pa3&bz`~t;)oyiF8!3A#!r^%89j)qoo(#pPK3|wtukQ zSzinL48mps1uv5jA-@Zy`wb4t3N~zSyf2(9Q&Xk6Q|4TIy4?yP>;oI738GWhdxFZE zPleCTB~6U}ITRKaM}JThgde%+T;kgrbW}khnY4+b0(m5LT3!3x@4BaS>a8Wb+S37c z`AY`fCA0-vTy(VCOnTt>^rbA37zv0aPhPv$INp$$ZUI-@VNBMswocw5ZT;x&`?!*& zQJc=58{Y_GBI18yH)#`h$>&Ze2K_Z-+1UF~*0HK)xm3pOYsre97RH1ZLR8V{rfe-C zyMm)Ks=1DJ;YlPg;zy3q+ds&RWp*9<`R9gS6UKxi7lN(#&CTt9-O{^$z7NaErlel{ zka$o=&Hn1urN>|Ulo?c5Euea+^g_M%_526Ub#}N+zQ8#*d*gFK=`;y-oks|rroRr` zOn)p>n*~hmFgE!PQTp6S(Q5K9HQ81Ip9sy11M!O$bwAC`SgQKo04HSGgrc=tPi$~1&dXh1XZri|55=YLi(pPR!bh1Rsz|{4`zHQX zJBRP9ul;|vb>%q0cL3|3^CQg1LYV*RH>r1$S$De7UWzli01R=>wR6}|#TCc0{O6}>w72!Y(n_IurnzIiqv^*4nS4Jh%6T`Rh||}? zkg))S@2=hoDDb2CrT3uNEL04t+x!CuVzG3l|I>x9z{z{c?mm znS?24VMZ}$mHfz;TGL%{EWB5GXIYO1ttxfMAq&7_{zB0a5v!JOC+5a!&H#s)JefJr zvjyrczhn?t8o#G@P*8e~eq}41MhSWn5)yJAe^8RSk|NG6eMAr=3n9(ZPwDb^`_`6Wl(?dD^gIF*i$!aq} zKr0Hgr0$8XXT8Nht9#gb^|+sk5Og#FbWNkl=Sa%S*AY0&>&N7>j|Mg>{HMq7@2_MM zO0;_JP(x!Q4#O-u=H?00Nw@|e{z!QnHS1pu+aoa|pRl+CUNt*k{ayS_6cMCUvW}D-cpz?5Ryvq&udwuVN2MGhSd9|gb z`p$=1X;(&$3*OjxBozF^_|wDV-(FlXoleq&pbuCS9yhw7YmhizAZ0VN90-Mg$Kn?c z9+EO#+UJ=YvT@zo+IsHSuUB*LvY!gxB*^?l4%>hUG3nE$=gt+1PUIIo?Vfj^;T$`f zA&HgGUDy%AmsI3gy6!qdwZDFeI=Unp8+pC@l~%S^^tGQJfv;b0i%&|*B#~Nf7j2e> zoWUVJy~9S<);~t8uKW1VcGlj|{q`;MWVI@9)RU4D+sBVblDm90MDTaj2dMVe)~Y`* zPW8Mng}Va@kmq{8Jo@K`g5R~w<`0K>D}<<9;5fHTM>ksIE%IMv%1M71KZFg;Wg(An zgfG_^u6pq=u9TFP(SAmmf}1n$Pw35f3vp;q2y8>i3_)gf>%zr(eSX4C9_@PShD)wt z;&BtyI70a)z&Usc#KZApPaEmk=<4gmokUd+DQuL`;!5Y)ZVBEfu~m~6<7_Q)!V=L2 zgg;CpLpgymUFcC-R<=Lj1hD2%g6rz-KkW9SQ=Q#i6V#A8cHu>}g6aZ0E76y{6(qn8 z07Up}<#=K)Lrkp#_L@$w9~hDXYX*M1tF0~ew+}u;3d>z^F7t&`6Yk~r@Nkx?zMIsx zkXpl@kdwU=b09=Kkb=f9R-iZur0tiKw2M^WMjtaKZ6~UNpx|u$%%j!*JOtQ~^4TX% zDM&|oAn@vEi{qSUKuca0Ybm`fY;)3t*nRfK4rG$PEn;KkVa0`_N@a?>jql~AGT&`w zB*DJ#U1bHz_c+(d3SMOI=n282cl?lcAZ)to<50_X;>8aMO4n*b)&-QWpE^LwxVLi6 zP(UrusmY)|@HNwm8!zO2nc^wn7LS)nQz67MNsrS)*BVC{E=15~V5;hscXXls)jNH& z@U#7<@{dijO)|=eiqVh zkM`^F7g?P1!&_NJRnuqSvU`Y-&rl2~_qM>$-@kkJd8hrk>q2#`wwScy%c$;a=STkf%>hQSuDBAVdC&6~xwh}ma?jCybAMob zV!Fq5&4oxFQF_mC^ks0cq#Ysm?qv!uMK&EdKa>zs8~y$`H_?=F=TlQtIilJXd2EpW zcWUCb*aX5ee62Mgx+(5+<(}n$b0>aN1ElPxNgy>^mBotQSUpJRj2!n0UJv1yJAYf~ z<_{hzyY%vXvNu~kmP=0zN0S=d{m3_2*Ht|v@2l@)2uHs;TBdIgVNH~38#*mKw)kS3 z*CA|%O}U8l2bzs}6$cR*vC8@jkN~S-Wxs4H-$MCihi^J|thMNl`hXeJ zi|rwK3*WPMehJvScR}#?Qq}U04{mfYZ$8tL->!1fpN0fSfe#)|KhUOxMSCE-H2bx$ zZ#!4SeN~FHEc9IE3yD@;)iB#Bou89qKIFM5KaiN1_%uT3++#p5VhXJQqkjgEh^Hz0 zo?MxqwD_d2$Ohh=VJr6=N_GMuB3~PvsS{v`7dli@R_5~a-A{oSn7MR$$c#*Zvefwa zZUC^ZlRa{~)q+xo6>-TppF24QX;~x^S68=vb*#9WnqduJd5D3tbMC3V^3f_Rsqw2b z<{~Wa1qFB;r21*}ZyxwDj?HN|kDLnz0kDe`Pj_{j(9=Q!v9?VbAt!YbqKL9ZIbWBY zh0%V7x!RHVeKVT&{@c$YVg{}z497LGPxENk(Hzl#QacT<}TY%#*IQY}7$` zYdP9;;6UfME_YZi3nDvx{Z9-mkd3Igw6ru_&?*IRQB>Rk!xR$YAA%y3?9fFw>!5yj<0E%AUv=yL{aaIN@G znSCkG@XRy`5?k1*ueCEolF-sv!c&p)@o}HY;cc@^0oE^ElM)VFJu6XA4r-x|BE%WP zcnff+O-nc^3rc}Bej-mQmRL#(_?<~(BbEElC7%nPiongjiSVu3bcBz?WoCNKf2~w_ z>}#nT*M5cU%1RsIz{MySCkH2oS3_tZ+`D~8W8d7&aV3V_m@&5 zGl`y)J?uUN!b1{gSXipK39JX0W+9si1cX`nm+ zm=iv}zHXz+m3mE)m2Xm44C{~dQ-IAkug@^xG@x3MJPJi`WF&7+$@1#g&ja88Sca!e zelN9{n)~UDxR-o>Vng>)k{_|wz9Gc4O;s> zRA*+XBuR?;xHS0N*sk&m$nxMp2mtmgm(85j(#oarpFVcj>7h{I>d?vB^|mJAFJK^k zJbZVrF&KdDl5T(1dxLQ^r;$r$&VnD`C0358oZXd3~y*;clWH zY#+ijx>M79YA#mu9)G4x_3|AE$90mDlGcLluP1z|T1@>?MPH5i#Z}&r7nkd! zaAszftv-~2X$t@WmO8B%oY;6`!bxwo9PTjY z&4C-JU0mAHvcly1MiLE5b5#Xv=NepNO1iL>E27lzuZ;?gI}%DFk#7KO=I4)R(fG^n zrp-*ZKfap?H^c}MBTpI{MjzV<*sK`m_2M+E+UEnp!is`S+EBU>(G(O+TYjY&lpoHb zL+le!@w8l-uepk2i8%|*M>7vC-U| zg}&B{?={sk6V#OmU@93Reg4~JWyjVQwN7?@`I1CBUr>E>e&X{RZbt78=!FLc*BQNl zwAu-L6AYmQ=Pw6aa)n10Y&d1*Quhhvf40R?r(sH!(G#t{vYKpB;eg9Hju^TGQWvl- zH+rl;5Nszbpqj5Ob{=P-<9g+CC-?e5w9*f3J^L#x%MURy1Fh462c;xCOj`ra0mRnR z(%A)o?`zqdppTDF5(!J;Bq8KwZfg3p+kPc;e!90PU1(ZMjc>@)a;Cb{=Bh_f${XQG zc_3on8l^#4{LEu^HnpqR{)P@CI29F7gMz<%?`m10ZQe0KW^FvYdf^>&T{Bx7oKqzH zraD5xq%%$5pM5+ zoxgP?X`?bmO16h`;6fQnl`Q()>pgnb#xA#_0^Um9W*>f#qIPn@AT1w4+FhSm8F^aj z$;_A}Q&b@3{`JM0AlyRr$cC9k_mheW%_ddVOqY)7t~kTMbD}ScIVqb4#SAcri({7( zvyqvP@t)d^ukNfHDU7RYoT<&p&%ethR>^Lm%?NlA*SOaro4SQ_Vp&bK9jJp`ZBBN! zsm;Lm!orrqP5Ub!^A@KlQy-5fioC-PJWUwv77V z@T_x6H+Bt{hO-DNUqAo3NbUOM?ZTr9^>S@#K0e29)?=Q-Qw`4;K=%1E7M16By@2&w z7<&LO1bI&H3wB*yrG=K7&v1h2-lzwX4NA{4GuvY4I=jBS2J*{S-7K7)C%0|Ka55&c zbjp@z77;35Osn91RMwJ|g&DMfjn?hnU6?`|#Lcx;@?t%?7=)pr@)L1q+@+umc;C|! z%>0@1iEqxf6*t}kdVtgn)p5#w3NpG*xNtYynt(IiMT$uz3FBr6ePeHF74T0!H#~6mkJnVsd?AgW^yFzlw_(t#ywECBIT7qLYJcH$ z05YxgPWcQ)L2<`}EoWW(zW8>wwK?KA5FDag382mHJwVd(%q1)$PwLQ?e3li8RGG5ZZ&g>PA41}F@^CisKU|* zuNEZwc(ZBB}Cf3IPE_b#ar+ZIH6%>3e zzM1iM$dhiU5$kC=q-~j&W(Ogzv77Ew@JfKoBdSzU3nPs$#y4)PuV3Km>MCeu53od4 zDWEgf2jjUT5rh3tbp#~v|CJ`ZaPc(gNi-L3)&U;|6`MepxqlaO2>0KsT*NW`t0V;a z|9^BOqMiSLt2^nYF)Cj7|5aaleg41Imu`47m2dl}ywvmfD+pI%qw3pzP(6a8vK{%x z*PX<^yy$6B2X-iPT?fNPeZctXY>Xz0dl}UAHE*Dzwo)ZkILG|k>csdrMJkN`0HZC$ zrxeqeh)*Y@r}sEOg)1%S5@T7%3@Bm|)7Gs_?$fp++f2>sl}(o6Scgo9N9AVizIvlz z><6Nzw=oK9)$4eZ$3S&2|LjZ+qwHmQkY8dtf$rXM9P!Uhjs5ejXDWhRmcoUhMox`? zW2Ks;Gn^(9C)DK|;Vp_w4wN(nO!vE3$r|-v#<6`IVk3@ZDHD&93sa!p$I~rd;P@LN z5Du0*y5iLbC9mK%6K`|q`X6PKF(pup7}RNP#0%o;JE+9YPH`7IdNr3UE6RY^1O@SQ zQ@kJ4E+bRm0SwfbXW-e$!Xq@e1M1=z@M?)A?-)hc`AkY86x0twsZ}}^OO?t}zSBis zKl5=jBAZ!O&kS|Jiwr>$8YDrP(~n$ph{oJuh3Y5u@xi;Huq_Mq-ZL0=J?JzeuUogD zhV{m}Rq+FyEO-2VDo)?Q5;1>R?@U|F1TuZmwmxVeirF6~E|^ea)&2{fxlo2wwBbHD zli>-@0orl=U-9kQ&Cx+pF$(Pt3L;$!x)r=@rh;q!w(T}=)a9b*8y~F(58ett6OD=E Q1l>XSGX@%kryOqm4=kf^UYeb)_2!sk(0f1p534Nd-e-cV_lY$ye9zwV1emr zn*#t1Sfl}%7{D(|#MeFWi!MY9X2}HpMKRrZ4%ScH)3XZ!>4|?n5UtBO5#W#K;5xQ& zi$G6!xLdFX5FQ>5^$G9`ad*4t0SyfH%2~h83jjg@O#6mq#Ot-0`}OC&q8B$yGp1(3 z$*n#()LnzI+kGg1nTQXDwpxmMPc_9JWZuEN5t2M1a?VpoQ(5K#d+#X&ralp$<)^fC zi>HM9@4RLI{h)Sy+}$BwikaCjqZ&OG-i{j(ocZ|niWAk`DbT8YZs?jykM0U$F2AB; zZo6E~x`IFl0IR2!oWKb)2|&OnGY9ynW&i)UX!@2wf1YSyfVIM}p#oCiRp{Ua6Bxb- z)pmg-`6OyRGq(6?{sO{Jbf#brasMg$hFYC-iD>jqJW*uEp?68YWaU)$0^%x6Y2}5# zX9hYuZ#cxn0-G$|L+siM=c{^Pj5*H}9g6ofapXyi<25qjS4N}H(-LORLLJ9?`AM8OmPbc7)+yR?`)86N__6C)D+4C zE%osC4h>n0&9f@7b_tS=NR>};U8GgM%@HPfD6Q2h$0w1j=71-Q;Iz#PU+8d)MqA?} znRln72Pi=V;9K)-Ci+;6#6#%jc=WUr72{&wmeD5DLtRHv++a!#6WT_24LwANaDMAt z)5lYOry>GVDfw0=6>G}UBok5GyX2vPT`N9zkshkE7%54_|L(gN9+#q3+qMJg8zbuL3ij#+;LyFm|&I0F&k#%T| zl=|vNTF~D*Fb$jDrNN!Ac^rvkssSPcJ(sFMG`j-Z%hgifzNB97k-C6r75!liy6MpR(6JA8*$bMiil zg&{nI^K(dAQ%+0Gvj(Ek=H`=2B|IXBw}kWicc-D>T5mBO@$5D&!0WbQh?~Os74U+! zYH-a17(tfbQ$DbE)83_{7H0o&rv<%z4a_^-k>su}fjIEB`1n^UFx>1)zKM#dVt(Q% zbBXi>cfDP4U*f@zKilBdjX%=C4>+wZI-v5vU0#$v z>hI@oJ3?YrcMYf&3mW9+S*p`|k5Yo<)%L=5<0BL$3MS}JSEqN+al=bA+HofLK$J8D zo|jw3J}^1oJPRezMk!qax29nM(N6rS9`&<%R`u&lp9{vt;Fnzw6&nO^lsr%5Ls3LS z!~e=y(dAZOYo1Mkiba_NV4tF>n4*4g!NQ~skmy8NyK%H7)xqN7y(V-M<5wG9P>c%q zcHax-iN8vwWL-Y&aAWMD%3|gwIKM{x{@rcXH0(DmN=-*%`Cd_Cc_RsCzk~^a@vI+B zFfk`dj4?9as?|+5s1L5|sfr%DbwoFQ3Bt`;M*pNIB_xv9n3{*u<=1BpQ_**kGpv}S zBFM)d?FN(l_wqMF9Ho2bocqrcb4(AHU6Xa?mGlt0$is%NAY6t)FwOe!hD7q=H=4Eh z?aA4q#f^>a6rRNw)vrY6{NIq(34!gW-nm$ZL+x9#1%n-jYAPxoBq~>L8xl4=*d}>H zk82U7v%)@j&Gwog$BkRGhl*gg5SXC+aHt`5^Z>;Rc@qRZ@?eO2wX&3O++jL55Rr?H zxf$JF7SwOJEWb`YHeoP`2wY&IbDhj#`F-e+NZt)q&8^`LH^hB5-9AAG_w8KC5Xn+8 z3bI+iRtcVmL=Kpts`>E~qrotl3Mz^Y*W->S4o640 z52x`M4YbtD7+v#j*JF(l%fu_%?gq%#7?=ENRNL|W-YT}KA-zTp4pscf?THmK( zOr7shsg(KVk0EEN_l4hYA3ihU8UE!sO7A#7*LPfc*x;@;bN|A{dsd0$go^#`Kqd11 z66R)Y+r_k2t>zT=^w6#8X0)o2%}BDD^64Uxz95{R$Knd1f8q`nY4F%1=heri0N13c zGheo(v)%TR|0@0{drRa@UXUZ$A0}o$^6cHXid`ES1~(ju270=Ldb*KW#7;>wJdZk8 zJ!}}v@{%Kir-bp0|I3Q~q^i3*nKYW2V+NUut}jAq^}h3d>Es5^UW7_pl0~6%Y{xAq z8ON6qH!{cikzj8hun;ZyXY=p8s-oS`B~OeZNJ$k(pRQfE`V5B%cVi(RgM{zeUcKe$ zTsCH43v~spKjZ@F2e=CVaelb}1;v6|dZZh;^CE@~6xHesd8bc0AL|2v$ID6+XDeh& z$jy4*V+kLv43=p+Mh$uHy^FRkrauX z=4t7KLs;C(X**KX`u~*pE`}*|!;5%B_;dklnJc8VlK5nb0L)Eg2@0!TKtvjH|7`}F zGAkh+TsV*sti+h_IR-X~5bv;Lyt0foR9ah`=S5Z^9xWicPoozQ8W%`5hSc_lspuqy z!4Elq3Bytt_8ISa_=z0Wl@Idq9D|yxPU3D%@zqAYk<8IqSIn{G33ouROnt;VW@jxbZq2B;$~{Batk3bgmVHBb48 zIhN75X(%Z}G+~zz#uN1>c?dTP=cr9uKx|}CR7OK9zr98u3zKp%NgO=~zT-hSDXYll!_SWRS70Q<^m1mn|Y~-)XuQ6_4iqEZz~O#hKT#nQP${O5$aNE5TR*KtlfolJlQLwg63{d8jBeTyr$X|3 z`2-vW40Ga1sc$FTy4-_|c)aSHo4v6jl^t<_jI#0@e$_^wyKwEkA1TKfJlx#ygB_R} zV)?37h1E?i8cli86xiB$n^lFi$>kJd4bohChJi}t?@HG5%4J=}qBptb^${w-r`uPZ zA_v6$ry6xOcYY3qQMR}J`qRnvhye+;oep&_FHf54(?Frm?c0v6f$wi*87{s(&eNy* z%wQYr8+^6)f2&ox_n6Q*3R~kxiNNYC&O$ZpE^huuY~A+);hCTwIeB$;ZcPt>-9Lp) zB%N!T4eshYzTJ1nJo5J{eyqxYrtH+f$^=jwFvDw9?Lx%M*4Y}i22PjXksT?<0784R zSuexZr)U2Pc2IPw7#Vp5wR{{#xdZ5xT1+;C=sNWO-u8lbCXOlH1!}w2XH@fp)vV-h z*Jb`*oh{dXm|H2c+y~Ug9I8;M)CSzaj~^5X{eCAhuh z<>V^tt30t1fUuIhd>P0=6L+m|KBBe34QZ%e{~DCvcSqKKp#oi8EXoxxm!P4O*3UI6 z8hYg`#P#l7%gC?|%h=f1Z_%Zr;>Dxo9s6sac6Krqea%twa;g=Kg5#z0UtWI40FTYY zQbxcnRz=jAw9aofclX?)-Dt8P6RXlh()vBtrjBb9`BmMT3kM&|0-qLw{O7`O)wr+} zlKBO{2yeac>CIDrxRYOna#oiXIOzDX7dqJz66sJw(K%%5&YNki4;%1RqYTGLW$2d} z_!?ZUfs8kXGN-h&f#=!i+@2MB;v1uwSa*Zh5L7Hyu+r|Gz0wT4h$K77jRj;B6+b`z z`Oe>==~wVYKwm6nGJ1ifq<>kQlXC&u<5#o;b8CuV6!woZrZbpC%J?(=% z1w8#DC0T~u@N;Tj`@gF`-@%vkd)t-KbbR}Ue8qfpS4I|PB|-24DH*El)!eX;^HTLh z9pbS^>SD?@A1oeJWi#oJnx~EI8%2dC`R&enls(el0HG)`e!8B9S=0%Rua} z{f+8XJ<3>M8I9(F1lt=;uX#rYh^?f6d(>LVFx3*|+mEZ` z=68580DBkLS`TwOiS=biCoV8AcPrw@J(IQ2)uNv9F! zRo0^uAxlOXBX3RVk-iNW-2U$zXwlMFUj;P^JDIC?<^e6E6*L1R2w{!hs9jw8H(CIu za{sUTM8Txr%-kOre|_%>U5}#R#erBUsFcrK+cU6%g{P+{b-8Fx&gqr|Xrx7aHrk$r zE`CWR$s#^(a$chLez;lE53rx^Nz5NEdN1^aM^5e?cH@ZgVk`9KuHy6HmdeO=oC}|l zp>I#3zrGk}i9y`!pXRX0ZGqvwlv2YC8lgL^0@u-UUM2Nj+r})XPGv$b1^YH+w{4HR zsqHPhW2`Gm`h6TO({|A7CJKy_?jR#yg>S0_TUbK+;O9UDAR0rc>AJStH@wYsP$F$Y>K)ijHUw>Eki z{`FRi;}}mnMIm2;28q=#E=;*(LjKV=T4LbS-#`q&v#2(PP7mU?XKS`bf2%zcOa0sO ztp5|12c9LE^!(+DyBOq6&H*o$W?*PrOi+YUV^#^qeBT+*y1wkbUVo;QhN0C-OTWPN%xA~h_asWt& z^)ptrl8K3y#&k6VrJ0~=ONRtNh9tkz74W~`!g&0oo3A%0+?E`?Dn* zCo{8EDgtB3&VJHItwKInAm{wGU_%RwrTYDDK6yn&jO~@*sY71|2T29E{m`R>`UfW= zLfM1)`D4WPO{qWnNHO5G<@KYlhg0U|XkAtT{6dnTf~ngMJ3!M|Tl*$3cBvKQM_vH| zYem&c?dt`g;*0Al1np*t0Uc5gV<|D&bnFJs`}xzS3<{_LiP8L#)z!+lu5)?i!6#^t z!asv`mIiZ)Eq?@$22d-uuJG~nvKsRm>d|}}}wf~-^f>ex#I`=LKq*30G z^pT3}&ThO@LWRp8K-ggU$rA9x$eO0U;4-PkhzCMGY*?APz%F{9^nwv`_yXONkVaF# z&ITe$cB48S0SW%U*g!YF{#y`X=>P#-{t*(7n)Q8q;SGI{2yPC}q1m}_H7EAqa)h7z zU@X1}sR1Q1d#*sTty3tITIx!HSawYm@6^1X)tur3nf-?=AvknAjV1`3=-tU|GMNUJ{+L>s|Woa*$zipU-uHHe4Se^5!GbGfERLoe8CBj&m`McA)<_ zZw4E}!vD&EhR}VZ0mD-f&?QZRHz~U6^rK=LK%nXqTv+oRholTA#$T&$(#0Eysu|$-y7N!K>e3CKtfhErQ?_P?k#@NvT`a7w%8$u~fpQ5PQ~ zGBdd&CrMI8t-qqMfyfo|!(VwHgK!R_I8D5qWsMDnh)6=mivI}N&cv(*gP=~y9{Rr9 zVWJ+^h8lW6&{F5w^~wN|IqPStrbD|0UWcXCe*A=> z#K~J#*88nP$K;II!Dl6(LCAIi)|ml(%P@)gi!(oka(gsX-tX`!HQSbO9~eI#ZquU& zU_-6@>o!q+a1JpADC#g7-DPZsVE-36c z7?=rfpD#7y3Hrb#O+$C@{@*z4P5b*G^ksu=cfi~56CGx#AFDfpaJi^9NfOomzKPt} z&X;h${<9;tHZHFy&Q;fU4efh8Y9iJl%%_)-YP)F}oxvD@EOC6Sv zsxNxd6{fdm>2Ak)`^KR^} zE2Gi$%uXU8{{R5wYexG#EUC{r>3$l+a?f{fSol4gR}D>3iDf(i0lZIxpV=y#V?7~% zx(TAcdi_XcS(S?r9vo+@Q1Qm@2vIKDyU5PWpuCO*(p$l-8G}DHVYCq0rCvDsRjUQ<%f+1c)?6)A$bpfNbnrd!2H*hdPf6u!(MM zwZdD&BCY1u+bnvQ))j08hGl7h3!OnY78H2a%+kB1UIxLu$A>IE)M-$0-+R+lPzve> zCv#_fZpOjrJL$bI8hU%hpkk8mz#|)jP6Dq$ykp1!VQP|lARStY-Um0rf4kx#3-1&@ z8nN;twwy;FQCn9SCV~Ig0zs} z&&{Mj189L@^hLl`rqTcQcE64_k=xQe5V~z66(T+_80Zs{WZW$J*(R`N9odI9@)R&%7VJV@4 zc+7GZiA&_ahS6`KGVdDaDi?Qk4b}+P@ZNo}>!< z?`c#(MnkFQ5u?BewvWo2f3|&oDLo@S^vCAK?2TVo$?Fe*Z$-N;*VKZ)xv{XaVq)L8 z9MaORkPUp@+-@*$F=yxJ5JC5sBnuI;#1JrlCS5-2B`>3FDyXr)ZzYk|Afr+9WS4$m zU?8Z!euxQBuORql=jIYXSBYc}2$`p+r`OllqeHxgvY=fj9cljuW&1xVip!w0YDg67 zp;l+W$qG4&Z8&K{_#+ac_U<(3!ZdtR9+W-wL$N&hX%z9(L$i*z5)I?>AMK^WxBR z+XcB`I%xb^n7T0O4cl7f1YU6(0FWCr_-ybeZ0oIF z8x_u{C6c=yu3V`FlSYK3ibJr?dk)wX_)G6apow9e2LR0A4yOF{=YTM}ziah!Wr+_@ z0oQM^0LV0YMVnx0^?wa${GXt&|9(+F8w#u$bo+g#Sbd$dF)OJl3|6S_GIwMyew_aK z1i`mNQhOY|KhHZTq9C9A)wSekE8pRYUsyq9)|0pC`c|D>7w+D^DxUjZX3#S2rA>pa zzIQ?D@NMyeUH0Jj(@_9mtNe2p z;DnJhg|rNBPc-qWx7DY!mi_|k_FFL-qfq$C@~`+!W5vo1u_h$T{L?Se*!HY2R#H-F z^|h8`^X9OnIOe^x1-@MI+D>_KYb0i`eC^eC82Pv zi$#b}nEHi>0DG|C(~SC{yUr;Wne{K_%&EqgAKe_JSk)`GmQ9M0Rvq!o%;OWZg7=0q?4+2uIpO9~MffDC}bAIkm8z=jc7ncGK!( zyDL3bZpj$D@EZ${`X!BbGW5Zn_S6UeC$XN^20xn{<5q+5T zB4soCsf7YdsYrR@&(EB0t_9~g?+YPNo7s&uxg(7Va*_gOcXd?k2%(%I*nr!{79rwl z_u!V`m&@eSb|yerE*0vx{i9y-B@|wjbmx6ZE;(-Ut*`aI@f|8o?h$5;iN=j52{vJA zH38Ro!5-yQuB{gJ5?z7$ik>&u>iXG?5qU5i-{U*^-q%=_$mO8&b{zBKgNIu9zBqr* zI`L7@+ibg4vb~EpKSW5ou_kL|z0aqMhIe|j4-+sE;p|{NK;nBQCg1vLk^NR*gb_GS zXE|nGICDq(5=Tn6ELQ?rGTSb(qWS#Nvbi2haX&VsKlN>vxofm>;uY`cup5ykcN&hh z6>DSaWN#g?>wWS=>?th42gcvOI(nCd%4=FkZKL9Xa$kRc?PN>o^5ZqKQOLwJ!i~q! z5r(`ln>4WAbe_0d+^kRcVAxjfJ$g#XL_Ce@C?Lt!5E~S2HeqPD9TjWH)yTZS1U#i~ zTfvvo#S>Vr@Ks$*D_f~14=q1%FGBqInml5EH^cbrrK1OJ%d;q+6!}z)?`11ORJj0M zy2Pm+F{gHfwNjw6;5bLO$GGR@-sJ83k`=$odSMau5R&vhx>H5SwH~Xf$@*2A?GK#g8OB>3? z1@H;Dxb;QgEb1lk&n!LmBuWhK$B}J@R`v+*O8RT{CCo;DnA#PQX0vvr6|$=tAG}$& z*PK~=an0XF&K>)*w3lKNy{u=`q(w>yYuH{9|Nu()qOryf_Cyw-Ep_Ck`f0jcnyP| zS37_#ImVK%;5JdPnTdX3s6%G3iOCjKkxP~!gEVnHA90C951t0E&U%t;r8dAc4yua) zTfVl=po|oK>(Kp0a0$z>o6%POXC*2$&aHoF$pHlttoW5Zs}5&MQB}-eTTwfTnQZjD zMb^b`uW~vHK!h}}!Xm|r(%?M|>7fJ7SyP;m1ly8A0&Uvx?5H5f1NLgBBer5u#E;q& z3JY5WEzQk#k&1NNr_Oxk0BGO?JMVApbwjyY$@b7g#H@li%PN6)BSpymA1VsHs zk1xn1^EksqADtlTu7A0l6YdZs*5na1C9=su zOV|s2R%6D@gB-c+YTwuF!;Nj)3bMqrPR5`59{ZfN zgd#YO{Z1hgU`O@|Ok{F`2gkbI4UGC{X(#mcGZv9BvfLVy1zey8MJ&>&7%MS60x_?w zwzzJ_qEL->eZ)`iTS`vNP5ei;GedHm*&_y#1Mal_1yLsYHNpVgPWttJyKQ67Q7qQ2 zupKWKdD|`dC9xip-}lWIvDP%<=k9fu1He{lOgPZ;lt+0yinbE)pQ5iMR*;i^`FCfG z{yPCt?8_;Q&yu%I8d{a#zI}V-%;$$#J-+l3MAydr_=2vK^uBi$@qS&gUL8@{mbht2 zy3?>EK%Dva=IxAZ4!3z4nW}R(xF75Iu2(YYqUChH`wVX~W2NQe- zSO%|?EqBOpzT()ljh>ZYZ_gv5bTzmBjCXq4OW;2$m#N_V(*r1%}2w}Tr(-QMtGvm4_hjN`qXU?47>hDYJIS0!Y?`p7Igm7fs1ezaO zR+fCXT!Og9TrJ-1N@e4EqALL{R&i8Hvo~Dgj+S70Ui;nB=mpr%+0m?dq%`&M3qki^ z=GRI@IRNOhe=^2j0ss#7cv$BnTHZcZ?>iBuhgqp{@3yk@vWUB+YhZRH2g;%O31qTl zzVp4y>3m9lcke92V%x*0%WOycbv-6Nb02!F%Hc=f&H!OT03aMTQ_?Wm;$L)nGi_+h zsmUk7+T`VO+cQ?uH07=)0rFfH1dO$OJF!7)vq1w^myVek81dM(bpOxjNb(FPfPDl2 zk4;qwr66a4ID12L2V|b!Plh}|$I1T^&jtzjVIpU5AurFHxdHYl!%v|D-3q(|tiJN9 zWe<+((+xa8NtRcWtGU=yDzDn)iZujmZUDe={fj!cnfHG081_a@_Vz7Z%quS4sz=<` zcBr_`;A;RrG=Y1IIp_%?k1J-pQqyxI&?@$ z+si!-ri)%DT18V{m^O^Y8xOn-aAlA?|NlsEc2X9&@{e$`p50RS1_P24@|zyeJj2h7 zDH5XX*aY@z0HL@<27*~KM5xx17SPn@Kk@e~XP6hwDjR^jeC;Bs;Ef9N6#%@c7>90W z!+-(og~biN5D%e;Z7jb+Alr<9rX`(2H@rW&+>10KmuP7+C%(>}Ut=-${eN&U_n91TRUK)5DzI15TyB z3WtD$Mv7cR`HJl^0z!1YsMp=E&nml1(@OjZIks?Q1CUiX904iL~TLgihWuBUtl1hX8-^I literal 0 HcmV?d00001 diff --git a/app/assets/images/008-spellbook.png b/app/assets/images/008-spellbook.png new file mode 100644 index 0000000000000000000000000000000000000000..e292620ae54a5dcaea4f9f18f79616485e16714d GIT binary patch literal 15954 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/010-candle.png b/app/assets/images/010-candle.png new file mode 100644 index 0000000000000000000000000000000000000000..be988694a918c98218159bb686e7cc0f6d1da9b8 GIT binary patch literal 10796 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%0DK$({p0|)mVJ5DncdsB3Z|5}joHHtAY1q$PN@n|1 z5@HG;4n+x=1zBS?5|vGXINklbg@*f#G%)x?|09$AOO>@y)ca@ z@b*AZ7L}=6;&4Fu!t$erR)g!tE{l)sHHh6!pI+@9*zln+z#rK|e&vy+-<2m3rW4pF zsoBemC1SWAM=lb{0Xo)r#KBwtK=Pg&z^RwZyM6#39PA{an4%0+Bk1I^!dR%wOS$;r8guT=8g!DHMnhQ(s$?WBuFI!aJfAxTRpY91w zPS|iPhRMH&Atm)u8OT;AuHV;MX2QgA&PBIJJEc)48XQndWU)=H?gGC~VOp1h;)CRD zKOyP-qt_4%UT&xLa89@1sYRdDn>eqNNG)oI7i;

    CtIC|gurms%9{pQOiQ8zWmyF6T(j2SZ}pTFzKR8W4A4l#5ezFF>JS8v9g^mteh z<48GdZM=3ksn>4NW-w5Vs=W`h*!rb!f>S4&^@hP~@4QDn?B^3?umJ7WEnoVMQF|#k z7XPdJri!J+dUzgIlnstP#(R3xrf!*+Kfen{WdmdBbAHZ}#}z!iwAr?Ka)BX^^-G`O zh~aU*0z4&}T$Gy`yJH+{IRpzsy{(PY2!3ZPxi{>pP5~~V1!H1FR|$4 z`o9g?&S7OypWR1s{006MK^n+p=zU#eJYV_vonc=aa1QsiA^wc zS$s14h>O4~?^;+_r*53*D~P_(X;|M$Q4`I1)US1NY|Dq&XmPBR7?Iie-IUW9`3qT| zHIO&+FZ)-@uX{J*7V@R*vGNZ=+m*n6LctlhQ#{??g0w~{vArA*E9zB$`5()o9KWa) zGq7~wz5D%+MlH~ssI_s|wt~hYn+N`wx0i+WUA_V(2G7uLyua$Wb!BkVog4bMkoSi2 zS{w7}j<_wQb>Qx-EXrA~R-X@jRN>E(v?!$gw3!H+)8OGM#uhP4xpO8d8?!xDPb2jj zlkzGQuek@^UK?fr0g{mbfeF>aee6=nlg2%Kr7D5mtl8(51vVKaa)X}TXn=jLTJUhW z&DxopoAKVeUP`5zNS?oYOX}!#e6+mZ+(-9-tM`~;ms}~a1?-B|iLvm7;SWnTr@r3_ z%czx}&4~S{U+cB|{i}~u8McR{MW3nT@+ViQFi-y(9*=BxiE-abb;(<*wYA5#hkOVB zTnHofRwuPdu=!+t`%`lCmSec=Tz1VJf_&BJpHTCaE$W)mBCLUUax$f{P27ICsq^z5 zewDMEg_%Y(ADyT{LHym9s-tyO?Fj0c*`qqCSEmU%-Q+-cLMjAt$aj`6eVaJ7j}wO; zJy3Zx^CwElpsyHL&rlh$dN9rywq+1z$AdAX1j!C(gR zYIbsmkJ9b_gj2G;@ZUYgYp>Iaab;ZoCM4we2Oi;jbA#R`O8dysENCS%5<;zK`Edc- z2O)Y-yxKkN+VV)JZq~+snUxuCICO_H#V$EhEkKORK?hS* z(TTG6sRwTQ-<~SQ`8V`Qj=zSqbLN5dO5Z+<*gRy6c~_I@s^* z;BkxzwPz{g%?j+-@-)moJ);L6b7f>l?owu(g9l!sxlfWr-{`(|Bhy0mMAh>ba9$=F z&ljQUBWNE^?uQi|VdqwPZ*+$mm2&xZw0VE>?(Lp#$l1KoEwG#jhd3<38kmnSHuf~2 z90((>NB;GCz|?jmR1%%}@L|?KLPCX_csFGyh5K`s@e4`4(3wVXCWA9PTQ2!G+?%g;D~f#ExO?3_n@6yz1 zgAhNv9#-5P+gE*X9P-ys(1tEeRVVPdLEG~%Rjz_|Ma}G!kUGLH@o;%xG`-*U(K+R2 zIaAO=$!Ddu{h@5=gf-(Dxl6X6f<;usU9a$PIWD}Yov}o@A)DpPm7TBdIb;vX(jwxF zmU7$!IvTNk0@om9Un7k;bPK${E$mt_#A%U545?{`pw*X%0Aa^GnB%~My+nJyACg5? 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/025-grave.png b/app/assets/images/025-grave.png new file mode 100644 index 0000000000000000000000000000000000000000..dd3d4905289760def93efe9b0d8f08c0c81fefe2 GIT binary patch literal 16939 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 !m&hI{>7@JlAQ*gL|)e`Ht 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 R|2F^t002ovPDHLkV1oD=PhXoQ*) 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 E0LE##i2wiq literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 3b0428a94e..fc070399a8 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -1,3 +1,41 @@ // Place all the styles related to the orders controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ + +.tiny-img { + width: 48px; + height: 48px; +} + +section.order-index { padding: 2% 5%; } +h3.no-orders { + font-family: 'Josefin Sans', sans-serif; + margin: 1% 0; +} +h2.page-title { font-size: 2.5em; } +section.order-index article { + width: 100%; + margin-top: 2%; + padding: 1% 2%; + border: 2px solid #eee; + border-radius: 8px; + background: #fefefe; + display: flex; + justify-content: space-around; + align-items: flex-start; +} +div.o-products { + display: flex; + flex-direction: column; +} +div.oitem-wrapper { + display: flex; + flex-wrap: none; + justify-content: flex-start; + align-items: center; +} +a.ls-btn { + padding: 5% 10%; + background: #4F3640; + color: #fefefe; +} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 367bf93317..70bd81a3bc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -15,7 +15,7 @@

    - <%= link_to "LoreStore", root_path %> + <%= image_tag("008-spellbook.png", class:'tiny-img') %> <%= link_to "LoreStore", root_path %>

    Wr730j+l$6)np;g3=a%N1A&7 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 l{r~?rI#~a|_Y)JqB74^C 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%0Dpe{v!`x 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/016-skull.png b/app/assets/images/016-skull.png new file mode 100644 index 0000000000000000000000000000000000000000..67fa57a0f220036877b8230524e6c6f477b10baf GIT binary patch literal 17606 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/017-potion.png b/app/assets/images/017-potion.png new file mode 100644 index 0000000000000000000000000000000000000000..7ed9e31d84c05b4981573fd8d6d2604cb8688f27 GIT binary patch literal 18877 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 IM6N<$f~?pIK^PSUrKB51 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/019-crescent-moon.png b/app/assets/images/019-crescent-moon.png new file mode 100644 index 0000000000000000000000000000000000000000..1bca6d3e83a42023bc06a2b44f94a8f61fbb387e GIT binary patch literal 18697 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 Ks5A5V=l=k_YR(A& literal 0 HcmV?d00001 diff --git a/app/assets/images/021-scythe.png b/app/assets/images/021-scythe.png new file mode 100644 index 0000000000000000000000000000000000000000..eb09aa8ad225df4f189793dd5d74abcbef95fc05 GIT binary patch literal 16249 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 Lak%V|>*fCgQN(z{ literal 0 HcmV?d00001 diff --git a/app/assets/images/024-axe.png b/app/assets/images/024-axe.png new file mode 100644 index 0000000000000000000000000000000000000000..d261da81387c05a722d7442476e481042554e78a GIT binary patch literal 17114 zcmYj(2{@GN`~N!zlVYT@6q7Cn?3}b*l zGGJSn;XiYCT2|mcjBXmI4Yt5PK3lE^!2h$jYMZ#h`VRCjPUes775H%X?UTm0FS=a6 z?P-1M8s_QgDPiyI=w@T>dQHORmTmNe@*WJ^hn?0uZg3~&Z@1@5(zWi*>BZ}ErQA&{ zr?rP$p9lny^()LTXtmf917wm;hgdv3rmitrx}|FOddj^6$JI|h6L1Re@n+l3FyfoD zy4ufpQoHK!M9gfg!q9Ayghb}h5v5tbyqMB-{?Kw^8AS_+vD^R&umND?s1Jl%$-bd`ZN3N~)i6)RwRR&*=SXK?i z?}0C#z(EA}B}x}(AIVBmC2sd++$V755V6aN5}nee7EGeO+uE%weMSi$eX5U2!jzfP zOn#e5G92?*8*bg&Yb33SzVgU;H4~_&u17n3Z&l|Z65_~qLIzVJpPPdRrHoVjTdR!aT5$cvPaAb$J(?~ZrkwsWMUS%yBX z;MbYt?r2ifxFKUq2nYz%<>6Yzit+uF1EL#u@k`H#IKwX$2@|`{l8=h|_O{x+nLBtq z

    @@ -37,7 +37,7 @@ <%= text_field_tag :category_name, "", class: "add-category" %> <%= hidden_field_tag :product_id, @product.id, class: "add-category" %> - <%= submit_tag "Create", class: "add-category button teal-btn" %> + <%= submit_tag "Create", class: "add-category button burg-btn" %>
    <% end %>
    diff --git a/app/views/main/shopping_cart.html.erb b/app/views/main/shopping_cart.html.erb index 4892889bae..593ab2d712 100644 --- a/app/views/main/shopping_cart.html.erb +++ b/app/views/main/shopping_cart.html.erb @@ -28,8 +28,8 @@

    - <%= f.submit "Update Item", class: 'button teal-btn small-5 columns' %> - <%= link_to "Remove From Cart", order_product_path(order_product.id), method: :delete, data: { confirm: "Are you sure?" }, class: "button teal-btn delete-button small-7 columns" %> + <%= f.submit "Update Item", class: 'button burg-btn small-5 columns' %> + <%= link_to "Remove From Cart", order_product_path(order_product.id), method: :delete, data: { confirm: "Are you sure?" }, class: "button burg-btn delete-button small-7 columns" %>
    @@ -42,7 +42,7 @@

    Cart Total: <%= money(total(@products)) %>

    - <%= link_to "Checkout Cart", new_order_path, class: 'button teal-btn small-12 columns' %> + <%= link_to "Checkout Cart", new_order_path, class: 'button burg-btn small-12 columns' %>
    <% else %>

    diff --git a/app/views/merchants/inventory.html.erb b/app/views/merchants/inventory.html.erb index 46d750606a..7c3d346f65 100644 --- a/app/views/merchants/inventory.html.erb +++ b/app/views/merchants/inventory.html.erb @@ -26,8 +26,8 @@ <%= f.text_field :quantity, class: 'inventory-form medium-6 large-6 columns' %>

    - <%= f.submit "Update", class: 'button teal-btn small-12 medium-6 columns' %> - <%= link_to "Retire", retire_product_path(product.id), class: 'button teal-btn small-12 medium-5 columns' %> + <%= f.submit "Update", class: 'button burg-btn small-12 medium-6 columns' %> + <%= link_to "Retire", retire_product_path(product.id), class: 'button burg-btn small-12 medium-5 columns' %>
    @@ -60,7 +60,7 @@ <%= f.text_field :quantity, class: 'inventory-form' %>
    - <%= f.submit "Update", class: 'button teal-btn' %> + <%= f.submit "Update", class: 'button burg-btn' %>
    diff --git a/app/views/merchants/pending.html.erb b/app/views/merchants/pending.html.erb index 8f0a34f18f..2914deed34 100644 --- a/app/views/merchants/pending.html.erb +++ b/app/views/merchants/pending.html.erb @@ -36,7 +36,7 @@ <%= op.order.cust_addr %>

    - <%= link_to "Mark Shipped", mark_shipped_path(op.id), class: 'button teal-btn medium-12 columns ship-btn' %> + <%= link_to "Mark Shipped", mark_shipped_path(op.id), class: 'button burg-btn medium-12 columns ship-btn' %>
    diff --git a/app/views/merchants/summary.html.erb b/app/views/merchants/summary.html.erb index cc4ed2c405..5d09d4a21f 100644 --- a/app/views/merchants/summary.html.erb +++ b/app/views/merchants/summary.html.erb @@ -11,7 +11,7 @@

    Shopping Cart

    <%= session[:cart].count %> - <%= link_to "Go To Cart", shopping_cart_path, class: 'button profile-button' %> + <%= link_to "Go To Cart", shopping_cart_path, class: 'button burg-btn profile-button' %>
    @@ -21,7 +21,7 @@

    Currently Selling

    <%= @user.active_products.count %> - <%= link_to "Inventory Management", self_inventory_path, class: 'button profile-button' %> + <%= link_to "Inventory Management", self_inventory_path, class: 'button burg-btn profile-button' %>
    @@ -31,7 +31,7 @@

    Pending Orders

    "><%= @user.pending_orders.count %> - <%= link_to "Pending Orders", self_pending_path, class: 'button profile-button' %> + <%= link_to "Pending Orders", self_pending_path, class: 'button burg-btn profile-button' %>
    @@ -41,7 +41,7 @@

    Purchased Orders

    <%= @user.orders.count %> - <%= link_to "Past Orders", orders_path, class: 'button profile-button' %> + <%= link_to "Past Orders", orders_path, class: 'button burg-btn profile-button' %>
    @@ -52,7 +52,7 @@
    <%= money(123456.99, true) %> - <%= link_to "Income Details", self_revenue_path, class: 'button profile-button' %> + <%= link_to "Income Details", self_revenue_path, class: 'button burg-btn profile-button' %>
    @@ -62,7 +62,7 @@

    Completed Orders

    <%= @user.shipped_orders.count %> - <%= link_to "Completed Orders", self_completed_path, class: 'button profile-button' %> + <%= link_to "Completed Orders", self_completed_path, class: 'button burg-btn profile-button' %>
    diff --git a/app/views/products/_product-form.html.erb b/app/views/products/_product-form.html.erb index 6bf489022c..6192ce982b 100644 --- a/app/views/products/_product-form.html.erb +++ b/app/views/products/_product-form.html.erb @@ -25,6 +25,6 @@
    - <%= f.submit button, class: 'button teal-btn medium-6 small-12 columns product-form' %> + <%= f.submit button, class: 'button burg-btn medium-6 small-12 columns product-form' %>
    <% end %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 2e8eac839b..6ad641097e 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -13,7 +13,7 @@ -
    +

    <%= @title %>

    <%= render partial: "product-list", locals: {products: @products} %> From 1071caf1d7857a0c7e82ac24ec8139c718b55acf Mon Sep 17 00:00:00 2001 From: Kate Evans-Spitzer Date: Fri, 27 Oct 2017 09:58:51 -0700 Subject: [PATCH 327/348] border separates categories --- app/assets/stylesheets/products.scss | 8 ++++++++ app/views/products/index.html.erb | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/products.scss b/app/assets/stylesheets/products.scss index ac861e0427..15cdeff3f2 100644 --- a/app/assets/stylesheets/products.scss +++ b/app/assets/stylesheets/products.scss @@ -86,6 +86,7 @@ section.product-info { } .product-index { + border-top: 1px solid $grey; } .product-info .row { @@ -126,6 +127,13 @@ section.product-info { height: 20rem; } +@media print, screen and (min-width: 40em) { + .product-index { + border-top: 0; + border-left: 1px solid $grey; + } +} + ////////////////////// // CATEGORIES LIST: // diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 6ad641097e..c56128dfc0 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,5 +1,5 @@
    -