From 062770a92bc56c7466c3b6ed2575b260b751c1be Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 18 Apr 2018 11:47:11 -0700 Subject: [PATCH 001/236] New rails app --- .gitignore | 19 + Gemfile | 72 ++ Gemfile.lock | 236 +++++ README.md | 207 +---- Rakefile | 6 + app/assets/config/manifest.js | 3 + app/assets/images/.keep | 0 app/assets/javascripts/application.js | 20 + app/assets/javascripts/cable.js | 13 + app/assets/javascripts/channels/.keep | 0 app/assets/stylesheets/_settings.scss | 869 ++++++++++++++++++ app/assets/stylesheets/application.css | 19 + app/assets/stylesheets/browserslist | 4 + .../stylesheets/foundation_and_overrides.scss | 61 ++ 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 | 26 + tmp/.keep | 0 vendor/.keep | 0 79 files changed, 2272 insertions(+), 194 deletions(-) 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/browserslist 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..8490d0efb5 --- /dev/null +++ b/Gemfile @@ -0,0 +1,72 @@ +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.6' +# Use postgresql as the database for Active Record +gem 'pg', '>= 0.18', '< 2.0' +# 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', '~> 4.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 'jquery-rails' +gem 'foundation-rails' +gem 'normalize-rails' +group :development, :test do + gem 'pry-rails' +end + +group :development do + gem 'better_errors' + 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..d528acb17a --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,236 @@ +GEM + remote: https://rubygems.org/ + specs: + actioncable (5.1.6) + actionpack (= 5.1.6) + nio4r (~> 2.0) + websocket-driver (~> 0.6.1) + actionmailer (5.1.6) + actionpack (= 5.1.6) + actionview (= 5.1.6) + activejob (= 5.1.6) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 2.0) + actionpack (5.1.6) + actionview (= 5.1.6) + activesupport (= 5.1.6) + rack (~> 2.0) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.2) + actionview (5.1.6) + activesupport (= 5.1.6) + builder (~> 3.1) + erubi (~> 1.4) + rails-dom-testing (~> 2.0) + rails-html-sanitizer (~> 1.0, >= 1.0.3) + activejob (5.1.6) + activesupport (= 5.1.6) + globalid (>= 0.3.6) + activemodel (5.1.6) + activesupport (= 5.1.6) + activerecord (5.1.6) + activemodel (= 5.1.6) + activesupport (= 5.1.6) + arel (~> 8.0) + activesupport (5.1.6) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + 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.8.0) + debug_inspector (>= 0.0.1) + builder (3.2.3) + byebug (10.0.2) + capybara (2.18.0) + addressable + mini_mime (>= 0.1.3) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + xpath (>= 2.0, < 4.0) + childprocess (0.9.0) + ffi (~> 1.0, >= 1.0.11) + coderay (1.1.2) + concurrent-ruby (1.0.5) + crass (1.0.4) + debug_inspector (0.0.3) + erubi (1.7.1) + execjs (2.7.0) + ffi (1.9.23) + foundation-rails (6.4.3.0) + railties (>= 3.1.0) + sass (>= 3.3.0, < 3.5) + sprockets-es6 (>= 0.9.0) + globalid (0.4.1) + activesupport (>= 4.2.0) + i18n (1.0.1) + concurrent-ruby (~> 1.0) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-rails (4.3.3) + rails-dom-testing (>= 1, < 3) + railties (>= 4.2.0) + thor (>= 0.14, < 2.0) + 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.2.2) + crass (~> 1.0.2) + nokogiri (>= 1.5.9) + mail (2.7.0) + mini_mime (>= 0.1.1) + method_source (0.9.0) + mini_mime (1.0.0) + mini_portile2 (2.3.0) + minitest (5.11.3) + minitest-rails (3.0.0) + minitest (~> 5.8) + railties (~> 5.0) + minitest-reporters (1.2.0) + ansi + builder + minitest (>= 5.0) + ruby-progressbar + multi_json (1.13.1) + nio4r (2.3.0) + nokogiri (1.8.2) + mini_portile2 (~> 2.3.0) + normalize-rails (4.1.1) + pg (1.0.0) + pry (0.11.3) + coderay (~> 1.1.0) + method_source (~> 0.9.0) + pry-rails (0.3.6) + pry (>= 0.10.4) + public_suffix (3.0.2) + puma (3.11.4) + rack (2.0.4) + rack-test (1.0.0) + rack (>= 1.0, < 3) + rails (5.1.6) + actioncable (= 5.1.6) + actionmailer (= 5.1.6) + actionpack (= 5.1.6) + actionview (= 5.1.6) + activejob (= 5.1.6) + activemodel (= 5.1.6) + activerecord (= 5.1.6) + activesupport (= 5.1.6) + bundler (>= 1.3.0) + railties (= 5.1.6) + sprockets-rails (>= 2.0.0) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) + rails-html-sanitizer (1.0.4) + loofah (~> 2.2, >= 2.2.2) + railties (5.1.6) + actionpack (= 5.1.6) + activesupport (= 5.1.6) + method_source + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (12.3.1) + rb-fsevent (0.10.3) + 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.7) + 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.11.0) + childprocess (~> 0.5) + rubyzip (~> 1.2) + 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.1.1) + turbolinks-source (~> 5.1) + turbolinks-source (5.1.0) + tzinfo (1.2.5) + thread_safe (~> 0.1) + uglifier (4.1.9) + execjs (>= 0.3.0, < 3) + web-console (3.6.0) + 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.3) + xpath (3.0.0) + nokogiri (~> 1.8) + +PLATFORMS + ruby + +DEPENDENCIES + better_errors + binding_of_caller + byebug + capybara (~> 2.13) + foundation-rails + jbuilder (~> 2.5) + jquery-rails + jquery-turbolinks + listen (>= 3.0.5, < 3.2) + minitest-rails + minitest-reporters + normalize-rails + pg (>= 0.18, < 2.0) + pry-rails + puma (~> 3.7) + rails (~> 5.1.6) + 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.1 diff --git a/README.md b/README.md index 2758975bf5..7db80e4ca1 100644 --- a/README.md +++ b/README.md @@ -1,205 +1,24 @@ -# bEtsy -[Much like other e-commerce platforms](https://www.etsy.com/), your team will make an online store where a wide variety of products can be listed and sold by any user. This project focuses on reinforcing the major components of Rails, model validations, testing, and more complex logic such as user authentication. +# README -This is a [Stage 3](https://github.com/Ada-Developers-Academy/pedagogy/blob/master/rule-of-three.md) project requiring you to expand upon what you have learned in class. +This README would normally document whatever steps are necessary to get the +application up and running. -## Project Learning Goals -- Core comprehension of: - - Routes - - Controllers - - Models - - Views -- User based application logic -- User authentication -- Testing on models and controllers -- Agile practices -- Feature branch management with Git -- Group project ownership +Things you may want to cover: -## Guidelines -- Groups of three or four will collaborate in pairs or individually and will report to their assigned Project Manager (one of the instructors) -- Use a task manager like [Trello](http://trello.com) to track your team's efforts -- Build a logical user-flow that moves across multiple controllers and models -- Use HTML/CSS and Foundation to style your website +* Ruby version -## Getting Started -1. As a group decide on an app name (this may help lead the aesthetic) -1. As a group decide on a team name (this will amuse your instructors) -1. Have one person on your team fork/clone the project master as per usual - 1. Create a new rails app using `rails new .` - 1. Add all other team members as collaborators - 1. Each team member should clone the repo to their computer -1. Figure out your workflow for the project, re: Git and Task management - 1. Do you want to use git branches? Pull requests? - 1. Determine who will be the Stand Up Leader and Task Leader for the first week -1. Create a Trello board to use as a Kanban board and ensure that all team members and instructors have access -1. Review the User Stories below and create Trello tasks to represent them -1. Slack your team name, app name, and link to your Trello board to your Project Manager +* System dependencies -## Expectations -Build an online system for listing, selling, reviewing, and buying a wide variety of products listed by multiple merchants. +* Configuration -### General Requirements -- Unit tests and/or specs for - - Models - - Controllers -- Test code coverage (using SimpleCov - remember me!) - - 90% for all controller and model classes +* Database creation -### User Stories -#### Guest User (Unauthenticated) -As a guest to the website (not signed in) I **can**: +* Database initialization -- Browse all products -- Browse products by category -- Browse products by merchant (users) -- View any individual product with additional details -- Leave a review for a product providing: - - A text review - - A rating out of 5 -- Add in-stock products to my cart -- Remove products from my cart -- Change the quantity of an existing product in my cart -- Purchase the items in my cart, providing: - - Email Address - - Mailing Address - - Name on credit card - - Credit card number - - Credit cart expiration - - Credit Card CVV (security code) - - Billing zip code -- Purchasing an order makes the following changes: - - Reduces the number of inventory for each product - - Changes the order state from "pending" to "paid" - - Clears the current cart -- After purchasing an order, I can view a confirmation screen including: - - Each item in the order with a quantity and line-item subtotal - - A link to the item description page - - Order total price - - Date/time the order was placed - - The current status of the order -- Sign up to be a merchant using OAuth - - Every merchant must have a username -- Sign in to my merchant account using OAuth +* How to run the test suite -As a guest I **cannot**: +* Services (job queues, cache servers, search engines, etc.) -- Add products to the cart that are out of stock -- View any link or page to manage any products -- View any of the account pages +* Deployment instructions -#### Authenticated Users -As a signed-in user, I **can**: - -- Do everything a guest user can do except for sign up and sign in -- Sign out -- Create new categories (categories are shared between all merchants) -- Create a new product providing: - - name - - description - - price - - photo URL - - stock -- Assign my products to any number of categories -- Retire a product from being sold, which hides it from browsing -- View an account page to edit/update my existing products -- View an account page showing my order fulfillment -- On the order fulfillment page: - - Total Revenue - - Total Revenue by status - - Total number of orders by status - - Filter orders displayed by status - - Link to each individual order - - A list of orders including at least one of my products: - - Each order item sold by me with a quantity and line-item subtotal - - A link to the item description page - - DateTime the order was placed - - Link to transition the order item to marked as shipped - - The current status of the order ("pending", "paid", "complete", "cancelled") -- View an individual order to see the user's: - - Name - - Email address - - Mailing address - - Last four digits of their credit card - - Credit card expiration date - -As a signed-in user, I **cannot**: - -- Review my own products -- View order items from a shared order that belong to another merchant -- View another user's private data (i.e. order fulfillment or product management) - -### Validations -Many of our models will have attributes that are required for our application to use and display data consistently. Each model will have attributes with requirements for a valid record. The requirements are summarized below: - -#### Merchant -- Username must be present -- Username must be unique -- Email Address must be present -- Email Address must be unique - -#### Product -- Name must be present -- Name must be unique -- Price must be present -- Price must be a number -- Price must be greater than 0 -- Product must belong to a User - -#### Order -- An Order must have one or more Order Items - -#### OrderItem -- Must belong to a Product -- Must belong to an Order -- Quantity must be present -- Quantity must be an integer -- Quantity must be greater than 0 - -#### Review -- Rating must be present -- Rating must be an integer -- Rating must be between 1 and 5 - -## Submission Guidelines -Your final project must be deployed to [Heroku](http://heroku.com). Your team will open a single pull request for the entire project. There are comprehension questions to answer with your submission that you should complete together as a group. Remember, you can submit a PR and still make some final changes to your code, so don't wait until the last minute. - -## Team Leaders -Each team will have team leaders who are responsible for keeping track of each team member's contributions. Rotate leader roles at the beginning of the second week; every team member should be in at least one leader role during the project. - -- **Stand Up Leader** - - Notifies team members about meeting schedule and ensures that everyone is present and ready - - Takes notes about each person's daily report in Stand Up - - Keeps the meeting moving -- **Task Leader** - - Leads discussion on task assignment and prioritization - - Decide if a task should be completed alone or in a pair - - Assign tasks based on... - - Individual comfort - - Desire - - Ability - - Ensures the Kanban board stays up to date - -## Stand Up Meetings -The Stand Up Leader should determine the daily time for your stand up meeting with the team. Once you come up with a time, confirm with your PM that this time will work for them. - -At the end of each day, your team's assigned Project Manager will review the Trello board to ensure it captures the updates that your team has made throughout the day. - -## Interim Demo -In a real world work environment, a team's success is measured by their product as opposed to each individual's contribution. - -Each team will present their progress and respond to questions from their Project Manager on the first Friday. Every team member will participate in these demos; the PM will ask specific questions regarding -1. The team's progress and plan for completing the project -1. The technical decisions and implementation -1. Every team member's understanding of the underlying technical structures - -## Final Presentation -Each team will present their product in a final presentation to the group on the final Friday. Your presentation should be no more than 7 minutes. The presentation should include every team member and: -- what you learned as individuals and as a group -- a short story-driven demo of interesting features - -## Due Date -This project is due EOD Apr 27 via PR against Ada-C9/betsy. - -## What Instructors Are Looking For -Check out the [feedback template](feedback.md) which lists the items instructors will be looking for as they evaluate your project. +* ... 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..f04673be81 --- /dev/null +++ b/app/assets/javascripts/application.js @@ -0,0 +1,20 @@ +// 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 jquery + +// +//= 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..26f74f9494 --- /dev/null +++ b/app/assets/stylesheets/_settings.scss @@ -0,0 +1,869 @@ +// 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-button-cursor: auto; +$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; +$menu-icons-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-sizes: ( + small: 250px, +); +$offcanvas-vertical-sizes: ( + small: 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; +$xy-block-grid-max: 8; + diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000..3a38418320 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,19 @@ +/* + * 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 normalize-rails + + * + *= require_tree . + *= require_self + *= require foundation_and_overrides + + */ diff --git a/app/assets/stylesheets/browserslist b/app/assets/stylesheets/browserslist new file mode 100644 index 0000000000..6019618a9a --- /dev/null +++ b/app/assets/stylesheets/browserslist @@ -0,0 +1,4 @@ +last 2 versions +ie >= 9 +Android >= 2.3 +ios >= 7 diff --git a/app/assets/stylesheets/foundation_and_overrides.scss b/app/assets/stylesheets/foundation_and_overrides.scss new file mode 100644 index 0000000000..ed4c5a0ecf --- /dev/null +++ b/app/assets/stylesheets/foundation_and_overrides.scss @@ -0,0 +1,61 @@ +@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-xy-grid-classes; +//@include foundation-grid; +//@include foundation-flex-grid; +@include foundation-flex-classes; +@include foundation-typography; +@include foundation-forms; +@include foundation-button; +@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-menu; +@include foundation-menu-icon; +@include foundation-drilldown-menu; +@include foundation-dropdown; +@include foundation-dropdown-menu; +@include foundation-responsive-embed; +@include foundation-label; +@include foundation-media-object; +@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; +@include foundation-visibility-classes; +@include foundation-float-classes; + +// 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..5f6ca0f9b2 --- /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..7f68fb3891 --- /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: 55a259c3241bf3d44e4e4b5b21aaefa1793e2ff067ae9a4dd34c9d9494c9d99f9f5aa16f311b45f1582027f9c5c360a61f2558b4671f57923c1db5344b0d6aaf + +test: + secret_key_base: 7fd84c0d006d6c01509c844e7b9e5ba1e7b3e18397001daf50b05eecc3e13ee272c34de9df91fa521a549d132193c937faf2235831adaf09217968432d55703a + +# 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..10594a3248 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,26 @@ +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 cfded832dc70f46fd1eb5ccd9f511d3018aa5b3a Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 18 Apr 2018 11:54:39 -0700 Subject: [PATCH 002/236] Update readme --- README.md | 207 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 194 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 7db80e4ca1..2758975bf5 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,205 @@ -# README +# bEtsy +[Much like other e-commerce platforms](https://www.etsy.com/), your team will make an online store where a wide variety of products can be listed and sold by any user. This project focuses on reinforcing the major components of Rails, model validations, testing, and more complex logic such as user authentication. -This README would normally document whatever steps are necessary to get the -application up and running. +This is a [Stage 3](https://github.com/Ada-Developers-Academy/pedagogy/blob/master/rule-of-three.md) project requiring you to expand upon what you have learned in class. -Things you may want to cover: +## Project Learning Goals +- Core comprehension of: + - Routes + - Controllers + - Models + - Views +- User based application logic +- User authentication +- Testing on models and controllers +- Agile practices +- Feature branch management with Git +- Group project ownership -* Ruby version +## Guidelines +- Groups of three or four will collaborate in pairs or individually and will report to their assigned Project Manager (one of the instructors) +- Use a task manager like [Trello](http://trello.com) to track your team's efforts +- Build a logical user-flow that moves across multiple controllers and models +- Use HTML/CSS and Foundation to style your website -* System dependencies +## Getting Started +1. As a group decide on an app name (this may help lead the aesthetic) +1. As a group decide on a team name (this will amuse your instructors) +1. Have one person on your team fork/clone the project master as per usual + 1. Create a new rails app using `rails new .` + 1. Add all other team members as collaborators + 1. Each team member should clone the repo to their computer +1. Figure out your workflow for the project, re: Git and Task management + 1. Do you want to use git branches? Pull requests? + 1. Determine who will be the Stand Up Leader and Task Leader for the first week +1. Create a Trello board to use as a Kanban board and ensure that all team members and instructors have access +1. Review the User Stories below and create Trello tasks to represent them +1. Slack your team name, app name, and link to your Trello board to your Project Manager -* Configuration +## Expectations +Build an online system for listing, selling, reviewing, and buying a wide variety of products listed by multiple merchants. -* Database creation +### General Requirements +- Unit tests and/or specs for + - Models + - Controllers +- Test code coverage (using SimpleCov - remember me!) + - 90% for all controller and model classes -* Database initialization +### User Stories +#### Guest User (Unauthenticated) +As a guest to the website (not signed in) I **can**: -* How to run the test suite +- Browse all products +- Browse products by category +- Browse products by merchant (users) +- View any individual product with additional details +- Leave a review for a product providing: + - A text review + - A rating out of 5 +- Add in-stock products to my cart +- Remove products from my cart +- Change the quantity of an existing product in my cart +- Purchase the items in my cart, providing: + - Email Address + - Mailing Address + - Name on credit card + - Credit card number + - Credit cart expiration + - Credit Card CVV (security code) + - Billing zip code +- Purchasing an order makes the following changes: + - Reduces the number of inventory for each product + - Changes the order state from "pending" to "paid" + - Clears the current cart +- After purchasing an order, I can view a confirmation screen including: + - Each item in the order with a quantity and line-item subtotal + - A link to the item description page + - Order total price + - Date/time the order was placed + - The current status of the order +- Sign up to be a merchant using OAuth + - Every merchant must have a username +- Sign in to my merchant account using OAuth -* Services (job queues, cache servers, search engines, etc.) +As a guest I **cannot**: -* Deployment instructions +- Add products to the cart that are out of stock +- View any link or page to manage any products +- View any of the account pages -* ... +#### Authenticated Users +As a signed-in user, I **can**: + +- Do everything a guest user can do except for sign up and sign in +- Sign out +- Create new categories (categories are shared between all merchants) +- Create a new product providing: + - name + - description + - price + - photo URL + - stock +- Assign my products to any number of categories +- Retire a product from being sold, which hides it from browsing +- View an account page to edit/update my existing products +- View an account page showing my order fulfillment +- On the order fulfillment page: + - Total Revenue + - Total Revenue by status + - Total number of orders by status + - Filter orders displayed by status + - Link to each individual order + - A list of orders including at least one of my products: + - Each order item sold by me with a quantity and line-item subtotal + - A link to the item description page + - DateTime the order was placed + - Link to transition the order item to marked as shipped + - The current status of the order ("pending", "paid", "complete", "cancelled") +- View an individual order to see the user's: + - Name + - Email address + - Mailing address + - Last four digits of their credit card + - Credit card expiration date + +As a signed-in user, I **cannot**: + +- Review my own products +- View order items from a shared order that belong to another merchant +- View another user's private data (i.e. order fulfillment or product management) + +### Validations +Many of our models will have attributes that are required for our application to use and display data consistently. Each model will have attributes with requirements for a valid record. The requirements are summarized below: + +#### Merchant +- Username must be present +- Username must be unique +- Email Address must be present +- Email Address must be unique + +#### Product +- Name must be present +- Name must be unique +- Price must be present +- Price must be a number +- Price must be greater than 0 +- Product must belong to a User + +#### Order +- An Order must have one or more Order Items + +#### OrderItem +- Must belong to a Product +- Must belong to an Order +- Quantity must be present +- Quantity must be an integer +- Quantity must be greater than 0 + +#### Review +- Rating must be present +- Rating must be an integer +- Rating must be between 1 and 5 + +## Submission Guidelines +Your final project must be deployed to [Heroku](http://heroku.com). Your team will open a single pull request for the entire project. There are comprehension questions to answer with your submission that you should complete together as a group. Remember, you can submit a PR and still make some final changes to your code, so don't wait until the last minute. + +## Team Leaders +Each team will have team leaders who are responsible for keeping track of each team member's contributions. Rotate leader roles at the beginning of the second week; every team member should be in at least one leader role during the project. + +- **Stand Up Leader** + - Notifies team members about meeting schedule and ensures that everyone is present and ready + - Takes notes about each person's daily report in Stand Up + - Keeps the meeting moving +- **Task Leader** + - Leads discussion on task assignment and prioritization + - Decide if a task should be completed alone or in a pair + - Assign tasks based on... + - Individual comfort + - Desire + - Ability + - Ensures the Kanban board stays up to date + +## Stand Up Meetings +The Stand Up Leader should determine the daily time for your stand up meeting with the team. Once you come up with a time, confirm with your PM that this time will work for them. + +At the end of each day, your team's assigned Project Manager will review the Trello board to ensure it captures the updates that your team has made throughout the day. + +## Interim Demo +In a real world work environment, a team's success is measured by their product as opposed to each individual's contribution. + +Each team will present their progress and respond to questions from their Project Manager on the first Friday. Every team member will participate in these demos; the PM will ask specific questions regarding +1. The team's progress and plan for completing the project +1. The technical decisions and implementation +1. Every team member's understanding of the underlying technical structures + +## Final Presentation +Each team will present their product in a final presentation to the group on the final Friday. Your presentation should be no more than 7 minutes. The presentation should include every team member and: +- what you learned as individuals and as a group +- a short story-driven demo of interesting features + +## Due Date +This project is due EOD Apr 27 via PR against Ada-C9/betsy. + +## What Instructors Are Looking For +Check out the [feedback template](feedback.md) which lists the items instructors will be looking for as they evaluate your project. From d57cbd13c694db6717233326eff261e86731cc08 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 08:45:51 -0700 Subject: [PATCH 003/236] Add ERD to imgs --- app/assets/images/sweatsy.png | Bin 0 -> 55008 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/sweatsy.png diff --git a/app/assets/images/sweatsy.png b/app/assets/images/sweatsy.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ec06cec464efbc1ff4384d66d3110d8335a49d GIT binary patch literal 55008 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 literal 0 HcmV?d00001 From b0716820bb887c46977b4bdd6ed6ad0c07af68b2 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 12:31:45 -0700 Subject: [PATCH 004/236] Generate Merchant model --- app/models/merchant.rb | 2 ++ db/migrate/20180419192941_create_merchants.rb | 10 ++++++++ db/schema.rb | 25 +++++++++++++++++++ test/fixtures/merchants.yml | 9 +++++++ test/models/merchant_test.rb | 9 +++++++ 5 files changed, 55 insertions(+) create mode 100644 app/models/merchant.rb create mode 100644 db/migrate/20180419192941_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/20180419192941_create_merchants.rb b/db/migrate/20180419192941_create_merchants.rb new file mode 100644 index 0000000000..64a57c904c --- /dev/null +++ b/db/migrate/20180419192941_create_merchants.rb @@ -0,0 +1,10 @@ +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..6fc3901554 --- /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: 20180419192941) 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..7af41d4fbe --- /dev/null +++ b/test/fixtures/merchants.yml @@ -0,0 +1,9 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + username: MyString + email: MyString + +two: + username: MyString + email: MyString 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 1bca53178eee24a48ba1e7595c61572490d17dd3 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 13:30:24 -0700 Subject: [PATCH 005/236] Validate username and email on merchant --- app/models/merchant.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 0440407160..894cf72a57 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,2 +1,4 @@ class Merchant < ApplicationRecord + validates :username, presence: true, uniqueness: true + validates :email, presence: true, uniqueness: true end From 677098971707027039d15cb260df114259009dfa Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 13:52:49 -0700 Subject: [PATCH 006/236] Create test fixtures for merchant --- test/fixtures/merchants.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index 7af41d4fbe..e33596dac6 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -1,9 +1,9 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - username: MyString - email: MyString +merchant_one: + username: merchant_one + email: merchant_one@gmail.com -two: - username: MyString - email: MyString +merchant_two: + username: merchant_two + email: merchant_two@gmail.com From cd73de7b7d9e9e5370afaf58cb095d3990b9e9fe Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 13:53:27 -0700 Subject: [PATCH 007/236] test validations for merchant --- test/models/merchant_test.rb | 50 +++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/test/models/merchant_test.rb b/test/models/merchant_test.rb index 1cc99d985f..200bd7362e 100644 --- a/test/models/merchant_test.rb +++ b/test/models/merchant_test.rb @@ -1,9 +1,53 @@ require "test_helper" describe Merchant do - let(:merchant) { Merchant.new } - it "must be valid" do - value(merchant).must_be :valid? + describe "validations" do + + before do + @merchant = merchants(:merchant_one) + end + + it "is valid with all the required fields" do + result = @merchant.valid? + + value(result).must_equal true + end + + it "is invalid without a username" do + @merchant.username = nil + + result = @merchant.valid? + + value(result).must_equal false + end + + it "is invalid without an email" do + @merchant.email = nil + + result = @merchant.valid? + + value(result).must_equal false + end + + it "is invalid when there is a duplicate username" do + duplicate = merchants(:merchant_two) + duplicate.username = "merchant_one" + + result = duplicate.valid? + + value(result).must_equal false + end + + it "is invalid when there is a duplicate email" do + duplicate = merchants(:merchant_two) + duplicate.email = "merchant_one@gmail.com" + + result = duplicate.valid? + + value(result).must_equal false + end + end + end From 366973a3b19a28d35c5391363fe0e6d287ebda0a Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 19 Apr 2018 14:00:04 -0700 Subject: [PATCH 008/236] built controller and model and new view for reviews --- app/assets/javascripts/reviews.js | 2 ++ app/assets/stylesheets/reviews.scss | 3 +++ app/controllers/reviews_controller.rb | 27 +++++++++++++++++++++ app/helpers/reviews_helper.rb | 2 ++ app/models/review.rb | 2 ++ app/views/reviews/new.html.erb | 10 ++++++++ db/migrate/20180419200734_create_reviews.rb | 10 ++++++++ db/schema.rb | 25 +++++++++++++++++++ test/controllers/reviews_controller_test.rb | 7 ++++++ test/fixtures/reviews.yml | 11 +++++++++ test/models/review_test.rb | 9 +++++++ 11 files changed, 108 insertions(+) create mode 100644 app/assets/javascripts/reviews.js create mode 100644 app/assets/stylesheets/reviews.scss create mode 100644 app/controllers/reviews_controller.rb create mode 100644 app/helpers/reviews_helper.rb create mode 100644 app/models/review.rb create mode 100644 app/views/reviews/new.html.erb create mode 100644 db/migrate/20180419200734_create_reviews.rb create mode 100644 db/schema.rb create mode 100644 test/controllers/reviews_controller_test.rb create mode 100644 test/fixtures/reviews.yml create mode 100644 test/models/review_test.rb 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/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/reviews_controller.rb b/app/controllers/reviews_controller.rb new file mode 100644 index 0000000000..1c86a93546 --- /dev/null +++ b/app/controllers/reviews_controller.rb @@ -0,0 +1,27 @@ +class ReviewsController < ApplicationController +belongs_to :product + +validates :rating, presence: true, numericality: true, length: { in: 1..5 } +validtes :description, presence: true + + def new + @review = Review.new + end + + def create + @review = Review.new(review_params) + @review.assign_attributes(product_id: params[:product_id]) + + if @review.save + redirect_to product_path + else + flash[:error] = "You must submit a rating of 1-5 and a description." + render :new + end + end + + private + def review_params + return params.require(:review).permit(:rating, :description) + end +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/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/app/views/reviews/new.html.erb b/app/views/reviews/new.html.erb new file mode 100644 index 0000000000..84eb241e79 --- /dev/null +++ b/app/views/reviews/new.html.erb @@ -0,0 +1,10 @@ +

Add a Review For: *product name*
+<%= form_for @review do |f| %> + <%= f.label :rating %> + <%= f.number_field :rating %> + + <%= f.label :description %> + <%= f.text_field :description %> + + <%= f.submit %> +<% end %> diff --git a/db/migrate/20180419200734_create_reviews.rb b/db/migrate/20180419200734_create_reviews.rb new file mode 100644 index 0000000000..68962656fc --- /dev/null +++ b/db/migrate/20180419200734_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 new file mode 100644 index 0000000000..cef9a06c4b --- /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: 20180419200734) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + 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/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 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 663d7dfbc52e6e81d5735e4f69def1b80369ff85 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 14:18:34 -0700 Subject: [PATCH 009/236] Generate new merchants controller --- app/assets/javascripts/merchants.js | 2 ++ app/assets/stylesheets/merchants.scss | 3 +++ app/controllers/merchants_controller.rb | 2 ++ app/helpers/merchants_helper.rb | 2 ++ test/controllers/merchants_controller_test.rb | 7 +++++++ 5 files changed, 16 insertions(+) create mode 100644 app/assets/javascripts/merchants.js create mode 100644 app/assets/stylesheets/merchants.scss create mode 100644 app/controllers/merchants_controller.rb create mode 100644 app/helpers/merchants_helper.rb create mode 100644 test/controllers/merchants_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/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/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/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/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 From a5ee12ff99a41d6150bc2b1d4d2fd72e3078ac2f Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 19 Apr 2018 14:21:06 -0700 Subject: [PATCH 010/236] completed reviews controller, model, and view for new --- app/models/review.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/models/review.rb b/app/models/review.rb index b2ca4935ed..2b6352f9fe 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,2 +1,16 @@ class Review < ApplicationRecord + + def total + self.count + end + + def average + reviews = Review.all + review_count = reviews.count + + ratings = reviews.map { |review| review.rating} + ratings_sum = ratings.inject { |sum, rating| sum + rating } + + return ratings_sum / review_count + end end From a416ebaf1c813fa506b999cd291dc11b8735bb65 Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 19 Apr 2018 14:28:41 -0700 Subject: [PATCH 011/236] Generated controller and model for product. Added validations for model. --- app/assets/javascripts/products.js | 2 ++ app/assets/stylesheets/products.scss | 3 +++ app/controllers/products_controller.rb | 2 ++ app/helpers/products_helper.rb | 2 ++ app/models/product.rb | 7 +++++ .../20180419211417_drop_products_table.rb | 9 +++++++ db/migrate/20180419212035_create_products.rb | 11 ++++++++ db/schema.rb | 26 +++++++++++++++++++ test/controllers/products_controller_test.rb | 7 +++++ test/fixtures/products.yml | 11 ++++++++ test/models/product_test.rb | 9 +++++++ 11 files changed, 89 insertions(+) create mode 100644 app/assets/javascripts/products.js create mode 100644 app/assets/stylesheets/products.scss create mode 100644 app/controllers/products_controller.rb create mode 100644 app/helpers/products_helper.rb create mode 100644 app/models/product.rb create mode 100644 db/migrate/20180419211417_drop_products_table.rb create mode 100644 db/migrate/20180419212035_create_products.rb create mode 100644 db/schema.rb create mode 100644 test/controllers/products_controller_test.rb create mode 100644 test/fixtures/products.yml create mode 100644 test/models/product_test.rb 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/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/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/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/models/product.rb b/app/models/product.rb new file mode 100644 index 0000000000..166b366681 --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,7 @@ +class Product < ApplicationRecord + # relationship belongs to a user + validates :name, presence: true + validates :name, uniquesness: true + validates :price, presence: true + validates :price, numericality: { only_integer: true, greater_than: 0} +end diff --git a/db/migrate/20180419211417_drop_products_table.rb b/db/migrate/20180419211417_drop_products_table.rb new file mode 100644 index 0000000000..5ce5988afe --- /dev/null +++ b/db/migrate/20180419211417_drop_products_table.rb @@ -0,0 +1,9 @@ +class DropProductsTable < ActiveRecord::Migration[5.1] + def up + drop_table :products + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/migrate/20180419212035_create_products.rb b/db/migrate/20180419212035_create_products.rb new file mode 100644 index 0000000000..f7229bfe9a --- /dev/null +++ b/db/migrate/20180419212035_create_products.rb @@ -0,0 +1,11 @@ +class CreateProducts < ActiveRecord::Migration[5.1] + def change + create_table :products do |t| + t.string :name + t.integer :price + t.integer :available + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..d26df13719 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,26 @@ +# 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: 20180419212035) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "products", force: :cascade do |t| + t.string "name" + t.integer "price" + t.integer "available" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + 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/fixtures/products.yml b/test/fixtures/products.yml new file mode 100644 index 0000000000..d886371688 --- /dev/null +++ b/test/fixtures/products.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: MyString + price: 1 + available: 1 + +two: + name: MyString + price: 1 + available: 1 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 cf8b95789730ed08ca11a5d520e9f194500aa95a Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 14:35:53 -0700 Subject: [PATCH 012/236] Add routes for Merchants --- config/routes.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/config/routes.rb b/config/routes.rb index 787824f888..d2c6792357 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,4 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + resources :merchants, except: [:destroy] end From a6c8ca1788b10729e21f618766c6981b3b4f9f75 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 19 Apr 2018 14:49:13 -0700 Subject: [PATCH 013/236] built category model --- app/models/category.rb | 3 +++ db/migrate/20180419214250_create_categories.rb | 8 ++++++++ test/fixtures/categories.yml | 11 +++++++++++ test/models/category_test.rb | 9 +++++++++ 4 files changed, 31 insertions(+) create mode 100644 app/models/category.rb create mode 100644 db/migrate/20180419214250_create_categories.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/db/migrate/20180419214250_create_categories.rb b/db/migrate/20180419214250_create_categories.rb new file mode 100644 index 0000000000..917ecd3b70 --- /dev/null +++ b/db/migrate/20180419214250_create_categories.rb @@ -0,0 +1,8 @@ +class CreateCategories < ActiveRecord::Migration[5.1] + def change + create_table :categories do |t| + + t.timestamps + end + end +end diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/categories.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/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 b5ca68417784029d805b957ebb8b7fd14dc13e32 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 19 Apr 2018 15:01:41 -0700 Subject: [PATCH 014/236] Order model, order controller --- app/assets/javascripts/orders.js | 2 + app/assets/stylesheets/orders.scss | 3 ++ app/controllers/orders_controller.rb | 44 +++++++++++++++++++ app/helpers/orders_helper.rb | 2 + app/models/order.rb | 22 ++++++++++ db/migrate/20180419204902_create_orders.rb | 8 ++++ .../20180419204920_all_columns_to_order.rb | 13 ++++++ db/schema.rb | 32 ++++++++++++++ test/controllers/orders_controller_test.rb | 7 +++ test/fixtures/orders.yml | 11 +++++ test/models/order_test.rb | 9 ++++ 11 files changed, 153 insertions(+) create mode 100644 app/assets/javascripts/orders.js create mode 100644 app/assets/stylesheets/orders.scss create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/helpers/orders_helper.rb create mode 100644 app/models/order.rb create mode 100644 db/migrate/20180419204902_create_orders.rb create mode 100644 db/migrate/20180419204920_all_columns_to_order.rb create mode 100644 db/schema.rb create mode 100644 test/controllers/orders_controller_test.rb create mode 100644 test/fixtures/orders.yml create mode 100644 test/models/order_test.rb 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/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss new file mode 100644 index 0000000000..741506954d --- /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/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..d493d11778 --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,44 @@ +class OrdersController < ApplicationController + before_action :find_order, only: [:show, :edit, :update] + + def index + @orders = Order.all + end + + def show; end + + def new + @order = Order.new + end + + def create + @order = Order.new(order_params) + if @order.save + redirect_to orders_path + else + render :new + end + end + + def edit; end + + def update + if @order.update(order_params) + redirect_to orders_path + else + render :edit + end + end + + private + + def order_params + params.require(:order).permit(:date, :status, :name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) + end + + def find_order + @order = Order.find_by_id(params[:id]) + end +end + +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/models/order.rb b/app/models/order.rb new file mode 100644 index 0000000000..dd65f5de58 --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,22 @@ +class Order < ApplicationRecord + belongs_to :merchant + has_many :products + + validates :name, presence: true + + validates :email, presence: true, format: {with: /@/, message: "Must include @"} + + validates :address, presence: true, format: { with: /\A[\d]+/, + message: "Must start with digits" } + + validates :cc_num, presence: true, format: { with: /\A[\d]+\z/, + message: "Digits only" } + + validates :expiry_date, presence: true + + validates :cc_cvv, presence: true, format: { with: /\A[\d]+\z/, + message: "Digits only" } + + validates :zip, presence: true, format: { with: /\A[\d]+\z/, + message: "Digits only" } +end diff --git a/db/migrate/20180419204902_create_orders.rb b/db/migrate/20180419204902_create_orders.rb new file mode 100644 index 0000000000..4c82956027 --- /dev/null +++ b/db/migrate/20180419204902_create_orders.rb @@ -0,0 +1,8 @@ +class CreateOrders < ActiveRecord::Migration[5.1] + def change + create_table :orders do |t| + + t.timestamps + end + end +end diff --git a/db/migrate/20180419204920_all_columns_to_order.rb b/db/migrate/20180419204920_all_columns_to_order.rb new file mode 100644 index 0000000000..b1127e0873 --- /dev/null +++ b/db/migrate/20180419204920_all_columns_to_order.rb @@ -0,0 +1,13 @@ +class AllColumnsToOrder < ActiveRecord::Migration[5.1] + def change + add_column :orders, :date, :date + add_column :orders, :status, :string + add_column :orders, :name, :string + add_column :orders, :email, :string + add_column :orders, :address, :string + add_column :orders, :cc_num, :string + add_column :orders, :expiry_date, :date + add_column :orders, :cc_cvv, :string + add_column :orders, :zip, :string + end +end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..a080566b62 --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,32 @@ +# 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: 20180419204920) do + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "orders", force: :cascade do |t| + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.date "date" + t.string "status" + t.string "name" + t.string "email" + t.string "address" + t.string "cc_num" + t.date "expiry_date" + t.string "cc_cvv" + t.string "zip" + 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/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 0000000000..dc3ee79b5d --- /dev/null +++ b/test/fixtures/orders.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_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 9eb2695e3ca670f15c431f1c7c7af24776d601e9 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 19 Apr 2018 15:29:05 -0700 Subject: [PATCH 015/236] Tests in progress --- app/controllers/orders_controller.rb | 1 - test/fixtures/orders.yml | 15 +++++++---- test/models/order_test.rb | 40 ++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index d493d11778..0a85febd35 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -39,6 +39,5 @@ def order_params def find_order @order = Order.find_by_id(params[:id]) end -end end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index dc3ee79b5d..8f30f21afc 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -4,8 +4,13 @@ # 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 +basic_order: + date: Date.new + status: pending + name: Dan + email: dan@adaacademy.org + address: 1215 4th Ave, Seattle, WA 98161 + cc_num: 1234567891011121 + expiry_date: Date.new + cc_cvv: 111 + zip: 98161 diff --git a/test/models/order_test.rb b/test/models/order_test.rb index df80f10fb6..77e6fc1114 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -6,4 +6,44 @@ it "must be valid" do value(order).must_be :valid? end + + describe "relations" do + it "has a merchant" do + end + + it "has a list of products" do + # order = orders(:order_one) + # order.must_respond_to :products + # order.products.each do |product| + # product.must_be_kind_of Product + end + end + + describe "validations" do + it "requires a name" do + order = Order.new + order.valid?.must_equal false + order.errors.messages.must_include :name + end + + it "requires an email" do + end + + it "requires an address" do + end + + it "requires a cc_num" do + end + + it "requires a expiry_date" do + end + + it "requires a cc_cvv" do + end + + it "requires a zip" do + end + + end + end From 0c63220cb80fcf79e2a3eb2b49520e57dabc0eef Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 19 Apr 2018 15:49:26 -0700 Subject: [PATCH 016/236] Added passing model validation tests. And fixtures to assist. --- app/models/product.rb | 2 +- test/fixtures/products.yml | 19 +++++++----- test/models/product_test.rb | 59 +++++++++++++++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/app/models/product.rb b/app/models/product.rb index 166b366681..5fd636193f 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,7 +1,7 @@ class Product < ApplicationRecord # relationship belongs to a user validates :name, presence: true - validates :name, uniquesness: true + validates :name, uniqueness: true validates :price, presence: true validates :price, numericality: { only_integer: true, greater_than: 0} end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index d886371688..21e6560448 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -1,11 +1,16 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html -one: - name: MyString - price: 1 - available: 1 +hb: + name: headband + price: 10 + available: 6 -two: - name: MyString +water: + name: bottled water price: 1 - available: 1 + available: 100 + +pants: + name: sweatpants + price: 20 + available: 10 diff --git a/test/models/product_test.rb b/test/models/product_test.rb index a618b0a156..2f167094e6 100644 --- a/test/models/product_test.rb +++ b/test/models/product_test.rb @@ -1,9 +1,62 @@ require "test_helper" describe Product do - let(:product) { Product.new } + describe 'validations' do + before do - it "must be valid" do - value(product).must_be :valid? + @product = Product.new( + name: 'headband', + price: 8, + available: 300) + end + + it "can be created with all required fields" do + # result = @product.valid? + # + # result.must_equal true + end + + it "is invalid without a name" do + @product.name = nil + + result = @product.valid? + result.must_equal false + @product.errors.messages.must_include :name + end + + it "is invalid with a duplicate name" do + dup_product = Product.first + + @product.name = dup_product.name + + result = @product.valid? + result.must_equal false + @product.errors.messages.must_include :name + end + + it "it is invalid without a price" do + @product.price = nil + + result = @product.valid? + result.must_equal false + @product.errors.messages.must_include :price + end + + it "it is invaild if price is 0 or less" do + @product.price = -2 + + result = @product.valid? + result.must_equal false + @product.errors.messages.must_include :price + end + + it "it is invalid if price is not an integer" do + @product.price = 'hi' + + result = @product.valid? + result.must_equal false + @product.errors.messages.must_include :price + + end end end From 8409cb016b5dc7925f1f156dfa1d41a4f2945af1 Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 19 Apr 2018 15:59:37 -0700 Subject: [PATCH 017/236] skeleton of crud operations. --- app/controllers/products_controller.rb | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index f1ad12ddea..0f146e9ee3 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,2 +1,37 @@ class ProductsController < ApplicationController + before_action :find_product, only: [:show, :edit, :update, :destroy] + + def index + @products = Products.all + end + + def new + @product = Product.new + end + + def create + end + + def edit + + end + + def show + + end + + def destroy + end + + private + + def find_product + @product = products.find_by(id: params[:id]) + + head :not_found unless @product + end + + def product_params + return params.require(:product).permit(:name, :price, :available) + end end From f200c49b84ebad589295b61930bcaa2c28db2b07 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 16:13:14 -0700 Subject: [PATCH 018/236] Create controller actions and views for new, create, and show for merchant --- app/controllers/merchants_controller.rb | 32 +++++++++++++ app/views/merchants/_form.html.erb | 11 +++++ app/views/merchants/index.html.erb | 1 + app/views/merchants/new.html.erb | 3 ++ app/views/merchants/show.html.erb | 7 +++ config/routes.rb | 5 +- test/controllers/merchants_controller_test.rb | 47 +++++++++++++++++-- 7 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 app/views/merchants/_form.html.erb create mode 100644 app/views/merchants/index.html.erb create mode 100644 app/views/merchants/new.html.erb create mode 100644 app/views/merchants/show.html.erb diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index ae95f7677b..f05ed0a5d6 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,2 +1,34 @@ class MerchantsController < ApplicationController + + def index + @merchants = Merchant.all + end + + def new + @merchant = Merchant.new + end + + def create + merchant = Merchant.new(merchant_params) + + if merchant.save + flash[:success] = "Welcome to Sweatsy. Get ready to get sweaty!" + redirect_to merchant_path(merchant) + else + flash[:error] = "Something went wrong!" + render :new + end + + end + + def show + @merchant = Merchant.find_by(id: params[:id]) + end + + private + + def merchant_params + params.require(:merchant).permit(:username, :email) + end + end diff --git a/app/views/merchants/_form.html.erb b/app/views/merchants/_form.html.erb new file mode 100644 index 0000000000..db4ac539a5 --- /dev/null +++ b/app/views/merchants/_form.html.erb @@ -0,0 +1,11 @@ +<%= form_for @merchant do |f| %> + + <%= f.label :username, "User Name" %> + <%= f.text_field :username %> + + <%= f.label :email, "Email Address" %> + <%= f.text_field :email %> + + <%= f.submit %> + +<% end %> diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb new file mode 100644 index 0000000000..46c45d6d84 --- /dev/null +++ b/app/views/merchants/index.html.erb @@ -0,0 +1 @@ +

This will be a list of all merchants:

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

Get Ready to Sweat!!!

+ +<%= render partial: "form" %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb new file mode 100644 index 0000000000..c26aface13 --- /dev/null +++ b/app/views/merchants/show.html.erb @@ -0,0 +1,7 @@ +
Dashboard for <%= @merchant.username %>
+ +
<%= link_to "Manage your products", merchant_products_path(@merchant.id) %>
+ +
<%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
+ +
<%= link_to "Create new categories", categories_path %>
diff --git a/config/routes.rb b/config/routes.rb index d2c6792357..99c72f5dcc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,7 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :merchants, except: [:destroy] + resources :merchants, except: [:edit, :destroy] do + resources :products + end + end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 6eb57f7baa..665b998e49 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,7 +1,48 @@ require "test_helper" describe MerchantsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe "index" do + it "sends a success reponse when there are many merchants" do + Merchant.count.must_be :>, 0 + get merchants_path + must_respond_with :success + end + + it "sends a success response when there are no merchants" do + Merchant.destroy_all + Merchant.count.must_equal 0 + get merchants_path + must_respond_with :success + end + end + + describe "new" do + it "sends a success response" do + get new_merchant_path + must_respond_with :success + end + end + + describe "create" do + it "can add a valid merchant to the database" do + old_merchant_count = Merchant.count + + merchant_data = { + username: "test user", + email: 'email@gmail.com' + } + + merchant = Merchant.new(merchant_data) + + post merchants_path, params: { merchant: merchant_data} + + must_respond_with :redirect + must_redirect_to merchant_path(Merchant.last.id) + + Merchant.count.must_equal old_merchant_count + 1 + + end + end + end From bb28130a9bce48b66597f0ad884460acca5ad565 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 16:18:37 -0700 Subject: [PATCH 019/236] create nested routes for merchants and products, merchants and orders, and categories routes --- config/routes.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/routes.rb b/config/routes.rb index 99c72f5dcc..128bc16b14 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,9 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :merchants, except: [:edit, :destroy] do resources :products + resources :orders end + resources :categories, only: [:new, :create] + end From ad3e0f935ce2f398551f67321bb2ea01d2e3c4ed Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 19 Apr 2018 16:38:43 -0700 Subject: [PATCH 020/236] Added resources product routes. Updated products controller with basic functionality. --- app/controllers/products_controller.rb | 21 ++++++++++++++++++--- config/routes.rb | 1 + 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0f146e9ee3..4d1943823b 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -10,17 +10,32 @@ def new end def create + @product = Product.new(product_params) + + if product.save + flash[:success] = "Product added successfully" + redirect_to products_path + else + flash.now[:failure] = "Validations Failed" + render :new, :status :bad_request end - def edit + def edit; end - end + def show; end - def show + def update + @product.assign_attributes(product_params) + if @product.save + redirect_to product_path + else render :edit, status: :bad_request end def destroy + @product.destroy + + redirect_to products_path end private diff --git a/config/routes.rb b/config/routes.rb index 787824f888..13b18358c7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,4 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + resources :products end From 4b4733600cd38971be7e8dab6806234bf0c63b3b Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 19 Apr 2018 16:55:34 -0700 Subject: [PATCH 021/236] Created view files. updated partial _form.html.erb with form. --- app/views/layouts/_form.html.erb | 15 +++++++++++++++ app/views/products/edit.html.erb | 0 app/views/products/index.html.erb | 1 + app/views/products/new.html.erb | 0 app/views/products/show.html.erb | 0 5 files changed, 16 insertions(+) create mode 100644 app/views/layouts/_form.html.erb 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/layouts/_form.html.erb b/app/views/layouts/_form.html.erb new file mode 100644 index 0000000000..f4223731ce --- /dev/null +++ b/app/views/layouts/_form.html.erb @@ -0,0 +1,15 @@ +

Add a new product

+ +<%= form_for @products do |f| %> + + <%= f.label :name %> + <%= f.text_field :name %> + + <%= f.label :price %> + <%= f.number_field :price %> + + <%= f.label :available %> + <%= f.number_field :available %> + + <%= f.submit %> +<% end %> 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..4ef4e68f63 --- /dev/null +++ b/app/views/products/index.html.erb @@ -0,0 +1 @@ +

ALL PRODUCTS GO HERE

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 908be9d949ddbe5d930e7a6bfa97d170b8a0cf0a Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 17:12:54 -0700 Subject: [PATCH 022/236] Complete test for merchants#create --- app/controllers/merchants_controller.rb | 8 +++---- test/controllers/merchants_controller_test.rb | 21 ++++++++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index f05ed0a5d6..b6423a0dfa 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -9,14 +9,14 @@ def new end def create - merchant = Merchant.new(merchant_params) + @merchant = Merchant.new(merchant_params) - if merchant.save + if @merchant.save flash[:success] = "Welcome to Sweatsy. Get ready to get sweaty!" - redirect_to merchant_path(merchant) + redirect_to merchant_path(@merchant) else flash[:error] = "Something went wrong!" - render :new + render :new, status: :bad_request end end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 665b998e49..364e79ada3 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -25,7 +25,7 @@ end describe "create" do - it "can add a valid merchant to the database" do + it "creates a merchant with valid data" do old_merchant_count = Merchant.count merchant_data = { @@ -41,6 +41,25 @@ must_redirect_to merchant_path(Merchant.last.id) Merchant.count.must_equal old_merchant_count + 1 + end + + it "renders error for missing data" do + old_merchant_count = Merchant.count + + merchant_data = {email: 'email@gmail.com'} + + merchant = Merchant.new(merchant_data) + Merchant.new(merchant_data).wont_be :valid? + + post merchants_path, params: { merchant: merchant_data} + + must_respond_with :bad_request + Merchant.all.count.must_equal old_merchant_count + end + end + + describe "show" do + it "text" do end end From 073ada5d292732c01254c15cb2596c66f1d25432 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 19 Apr 2018 17:37:30 -0700 Subject: [PATCH 023/236] Removed date column from orders, refined order_test --- app/models/order.rb | 7 +- .../20180420002031_change_expiry_data_type.rb | 6 + ...420003356_delete_date_column_from_order.rb | 5 + db/schema.rb | 5 +- test/fixtures/orders.yml | 5 +- test/models/order_test.rb | 134 +++++++++++++++--- 6 files changed, 136 insertions(+), 26 deletions(-) create mode 100644 db/migrate/20180420002031_change_expiry_data_type.rb create mode 100644 db/migrate/20180420003356_delete_date_column_from_order.rb diff --git a/app/models/order.rb b/app/models/order.rb index dd65f5de58..5cfe083e3a 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -9,12 +9,13 @@ class Order < ApplicationRecord validates :address, presence: true, format: { with: /\A[\d]+/, message: "Must start with digits" } - validates :cc_num, presence: true, format: { with: /\A[\d]+\z/, + validates :cc_num, presence: true, format: { with: /\A[\d]{16}\z/, message: "Digits only" } - validates :expiry_date, presence: true + validates :expiry_date, presence: true, format: { with: /\A[\d]{4}\z/, + message: "Digits only" } - validates :cc_cvv, presence: true, format: { with: /\A[\d]+\z/, + validates :cc_cvv, presence: true, format: { with: /\A[\d]{3}\z/, message: "Digits only" } validates :zip, presence: true, format: { with: /\A[\d]+\z/, diff --git a/db/migrate/20180420002031_change_expiry_data_type.rb b/db/migrate/20180420002031_change_expiry_data_type.rb new file mode 100644 index 0000000000..40b193d8c0 --- /dev/null +++ b/db/migrate/20180420002031_change_expiry_data_type.rb @@ -0,0 +1,6 @@ +class ChangeExpiryDataType < ActiveRecord::Migration[5.1] + def change + change_column :orders, :date, :timestamp + change_column :orders, :expiry_date, :string + end +end diff --git a/db/migrate/20180420003356_delete_date_column_from_order.rb b/db/migrate/20180420003356_delete_date_column_from_order.rb new file mode 100644 index 0000000000..8a2ebf8920 --- /dev/null +++ b/db/migrate/20180420003356_delete_date_column_from_order.rb @@ -0,0 +1,5 @@ +class DeleteDateColumnFromOrder < ActiveRecord::Migration[5.1] + def change + remove_column :orders, :date + end +end diff --git a/db/schema.rb b/db/schema.rb index a080566b62..1dc9f3ef89 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: 20180419204920) do +ActiveRecord::Schema.define(version: 20180420003356) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -18,13 +18,12 @@ create_table "orders", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.date "date" t.string "status" t.string "name" t.string "email" t.string "address" t.string "cc_num" - t.date "expiry_date" + t.string "expiry_date" t.string "cc_cvv" t.string "zip" end diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 8f30f21afc..5a24eb4125 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -3,14 +3,13 @@ # 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 -# + basic_order: - date: Date.new status: pending name: Dan email: dan@adaacademy.org address: 1215 4th Ave, Seattle, WA 98161 cc_num: 1234567891011121 - expiry_date: Date.new + expiry_date: 1020 cc_cvv: 111 zip: 98161 diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 77e6fc1114..10931c67df 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -1,49 +1,149 @@ require "test_helper" describe Order do - let(:order) { Order.new } - it "must be valid" do - value(order).must_be :valid? - end - - describe "relations" do - it "has a merchant" do + describe "validations" do + before do + @order = orders(:basic_order) + @blank_order = Order.new() end - it "has a list of products" do - # order = orders(:order_one) - # order.must_respond_to :products - # order.products.each do |product| - # product.must_be_kind_of Product + it 'can be created with all required fields' do + result = @order.valid? + result.must_equal true end - end - describe "validations" do + # name it "requires a name" do - order = Order.new - order.valid?.must_equal false - order.errors.messages.must_include :name + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :name end + # email it "requires an email" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :email end + it "requires an @ sign in the email" do + @order.email = "emailnoatsign" + @order.valid?.must_equal false + @order.errors.messages.must_include :email + end + + # address it "requires an address" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :address + end + + it "requires a number at beginning of address" do + @order.address = "not starting w/ numbers" + @order.valid?.must_equal false + @order.errors.messages.must_include :address end + # cc_num it "requires a cc_num" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :cc_num + end + + it "requires 16 digits" do + @order.cc_num = "111222" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_num + end + + it "requires digits only - test with letters only" do + @order.cc_num = "no numbersssssss" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_num + end + + it "requires digits only - test with some letters" do + @order.cc_num = "1letters23456789" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_num end + # expiry_date it "requires a expiry_date" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :expiry_date end + it "requires 4 digits" do + @order.expiry_date = "113" + @order.valid?.must_equal false + @order.errors.messages.must_include :expiry_date + end + + it "requires digits only - test with letters only" do + @order.expiry_date = "xxxx" + @order.valid?.must_equal false + @order.errors.messages.must_include :expiry_date + end + + it "requires digits only - test with some letters" do + @order.expiry_date = "1x2x" + @order.valid?.must_equal false + @order.errors.messages.must_include :expiry_date + end + + # cc_cvv it "requires a cc_cvv" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :cc_cvv + end + + it "requires 3 digits" do + @order.cc_cvv = "1234" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_cvv + end + + it "requires digits only - test with letters only" do + @order.cc_cvv = "xxx" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_cvv + end + + it "requires digits only - test with some letters" do + @order.cc_cvv = "1x2" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_cvv end + # zip it "requires a zip" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :zip + end + + it "requires digits only - test with letters only" do + @order.zip = "xxxxx" + @order.valid?.must_equal false + @order.errors.messages.must_include :zip + end + + it "requires digits only - test with some letters" do + @order.zip = "1x3x5" + @order.valid?.must_equal false + @order.errors.messages.must_include :zip + end + end + + describe "relations" do + it "has a merchant" do end + it "has a list of products" do + # order = orders(:order_one) + # order.must_respond_to :products + # order.products.each do |product| + # product.must_be_kind_of Product + end end end From cbb2a2e472a639e4497ba976810c906bdb4bcc9b Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 19 Apr 2018 18:20:06 -0700 Subject: [PATCH 024/236] added controller tests for restful routes --- app/controllers/orders_controller.rb | 26 ++++--- config/routes.rb | 3 + test/controllers/orders_controller_test.rb | 81 +++++++++++++++++++++- 3 files changed, 93 insertions(+), 17 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 0a85febd35..849f604a1c 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,9 +1,5 @@ class OrdersController < ApplicationController - before_action :find_order, only: [:show, :edit, :update] - - def index - @orders = Order.all - end + before_action :find_order, only: [:show] def show; end @@ -13,27 +9,29 @@ def new def create @order = Order.new(order_params) + @order.status = 'pending' if @order.save - redirect_to orders_path + redirect_to order_path(@order.id) else render :new end end - def edit; end + # add product to cart, remove product from cart should go in product - def update - if @order.update(order_params) - redirect_to orders_path - else - render :edit - end + def total_price + end + + def checkout_cart + end + + def empty_cart end private def order_params - params.require(:order).permit(:date, :status, :name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) + params.require(:order).permit(:status, :name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) end def find_order diff --git a/config/routes.rb b/config/routes.rb index 787824f888..4de8ef231e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,3 +1,6 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html + + resources :orders, only: [:show, :new, :create] + end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 68784595f3..a36bb37fd7 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -1,7 +1,82 @@ require "test_helper" describe OrdersController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe 'show' do + + it "succeeds if order exists" do + get order_path(Order.first) + must_respond_with :success + end + + it "sends not_found if order doesn't exit" do + order_id = Order.last.id + 1 + get order_path(order_id) + + must_respond_with :not_found + end + + end + + describe 'new' do + + it 'responds with success' do + get new_order_path + must_respond_with :success + end + + end + + describe 'create' do + + it "can add a valid order" do + order_data = { + status: nil, + name: "Max", + email: "max@adaacademy.com", + # address zip + address: "2627 107th Ave NE Bellevue, WA 98004", + cc_num: "1234567891011121", + expiry_date: "1020", + cc_cvv: "123", + # billing zip + zip: "98004" + } + old_order_count = Order.count + + test = Order.new(order_data).must_be :valid? + + post orders_path, params: { order: order_data} + + must_respond_with :redirect + must_redirect_to order_path(test.id) + + Order.count.must_equal old_order_count + 1 + Order.last.name.must_equal order_data[:name] + end + + it "won't add an invalid order" do + order_data = { + name: "Max", + email: "max@adaacademy.com", + # address zip + address: "2627 107th Ave NE Bellevue, WA 98004", + cc_num: nil, + expiry_date: "1020", + cc_cvv: "123", + # billing zip + zip: "98004", + } + old_order_count = Order.count + + Order.new(order_data).wont_be :valid? + + post orders_path, params: { order: order_data } + + must_respond_with :bad_request + Order.count.must_equal old_order_count + end + + end + end From eabf0f363613a7bcdfe3d9687b169ad8e245d3d7 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 19 Apr 2018 18:24:41 -0700 Subject: [PATCH 025/236] empty views --- app/views/orders/new.html.erb | 0 app/views/orders/show.html.erb | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/views/orders/new.html.erb create mode 100644 app/views/orders/show.html.erb diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 From 4577d52e7769c1380c14173e5d1b4f3636c01162 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 20:14:47 -0700 Subject: [PATCH 026/236] Add test and method to controller for show merchant --- app/controllers/merchants_controller.rb | 1 + test/controllers/merchants_controller_test.rb | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index b6423a0dfa..943bb9315e 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -23,6 +23,7 @@ def create def show @merchant = Merchant.find_by(id: params[:id]) + render file: "#{Rails.root}/public/404.html", status: :not_found unless @merchant end private diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 364e79ada3..46f5754161 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -59,8 +59,22 @@ end describe "show" do - it "text" do + it "sends a success response if the merchant exists in the database" do + merchant = Merchant.first + merchant.must_be :valid? + + get merchant_path(merchant) + + must_respond_with :success + end + + it "sends not_found if the merchant does not exist in the database" do + merchant = Merchant.last.id + 1 + + get merchant_path(merchant) + + must_respond_with :not_found end end From fd5bc79c687890ca3370dd22ba0da6935f7a700a Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 20:16:28 -0700 Subject: [PATCH 027/236] Get rid of unnecessary update route for merchants --- config/routes.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 128bc16b14..287aad4021 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 - resources :merchants, except: [:edit, :destroy] do + resources :merchants, except: [:edit, :update, :destroy] do resources :products resources :orders end From 3e7c6d12262861a00aa7e08304e0fdd7d49a1244 Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 19 Apr 2018 20:42:38 -0700 Subject: [PATCH 028/236] Update new and edit to contain partial data. Remaining views have no design. --- app/controllers/products_controller.rb | 7 +++++-- app/views/products/edit.html.erb | 1 + app/views/products/new.html.erb | 1 + app/views/products/show.html.erb | 5 +++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4d1943823b..204a4ad9fe 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -2,7 +2,7 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update, :destroy] def index - @products = Products.all + @products = Product.all end def new @@ -17,7 +17,8 @@ def create redirect_to products_path else flash.now[:failure] = "Validations Failed" - render :new, :status :bad_request + render :new, status: :bad_request + end end def edit; end @@ -30,6 +31,7 @@ def update if @product.save redirect_to product_path else render :edit, status: :bad_request + end end def destroy @@ -49,4 +51,5 @@ def find_product def product_params return params.require(:product).permit(:name, :price, :available) end + end diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index e69de29bb2..d83b325754 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -0,0 +1 @@ +<%= render partial: "form", locals: { page_title: "Edit a new product"} %> diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index e69de29bb2..f2d13ef172 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -0,0 +1 @@ +<%= render partial: "form", locals: { page_title: "Add a new product"} %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e69de29bb2..4c94f6aed2 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -0,0 +1,5 @@ +

Merchant:

+ +

+ categories +

From 69700cd0454b4443e124e8a5af60873776523bc6 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 20:44:28 -0700 Subject: [PATCH 029/236] Add details to Merchant index view --- app/views/merchants/index.html.erb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 46c45d6d84..370f8be6f2 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -1 +1,11 @@ -

This will be a list of all merchants:

+

Browse by Merchant:

+ +
    + <% @merchants.each do |merchant| %> +
  • <%= link_to merchant.username, merchant_path(merchant) %>
  • +
  • Average Rating: TBD
  • +
  • Categories: TBD
  • +
  • Best-Seller: TBD
  • +
  • + <% end %> +
From 009acb178bb1defe8353b2f4a1a190f2638bf680 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 19 Apr 2018 21:03:02 -0700 Subject: [PATCH 030/236] Add relationships to Merchant model --- app/models/merchant.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 894cf72a57..65dc14d51a 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,4 +1,11 @@ class Merchant < ApplicationRecord + has_many: products + has_many: orders + has_many: reviewed_products, through: :reviews, source: :product + has_many: product_categories, through: :categories, source: :product + + validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness: true + end From b0c86add33d58c6c4712519b6405d8010f8816ca Mon Sep 17 00:00:00 2001 From: mgraonic Date: Fri, 20 Apr 2018 10:06:27 -0700 Subject: [PATCH 031/236] Update reviews_controller.rb --- app/controllers/reviews_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 1c86a93546..e73292e051 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -2,7 +2,7 @@ class ReviewsController < ApplicationController belongs_to :product validates :rating, presence: true, numericality: true, length: { in: 1..5 } -validtes :description, presence: true +validates :description, presence: true def new @review = Review.new From a48031dafbb28f1ec1d12b21d0e2bff7ac74fa63 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 20 Apr 2018 10:57:58 -0700 Subject: [PATCH 032/236] added categories model --- .../20180419214250_create_categories.rb | 2 +- db/schema.rb | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 db/schema.rb diff --git a/db/migrate/20180419214250_create_categories.rb b/db/migrate/20180419214250_create_categories.rb index 917ecd3b70..9528428eb8 100644 --- a/db/migrate/20180419214250_create_categories.rb +++ b/db/migrate/20180419214250_create_categories.rb @@ -1,7 +1,7 @@ class CreateCategories < ActiveRecord::Migration[5.1] def change create_table :categories do |t| - + t.string "name" t.timestamps end end diff --git a/db/schema.rb b/db/schema.rb new file mode 100644 index 0000000000..f9ab93d00b --- /dev/null +++ b/db/schema.rb @@ -0,0 +1,31 @@ +# 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: 20180419214250) 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 "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 From e8dbd7aecb570a299c67870b89306b982a94decd Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 20 Apr 2018 10:58:48 -0700 Subject: [PATCH 033/236] Fix syntac on Merchant model relationships --- app/models/merchant.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 65dc14d51a..02fda22eae 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -1,8 +1,8 @@ class Merchant < ApplicationRecord - has_many: products - has_many: orders - has_many: reviewed_products, through: :reviews, source: :product - has_many: product_categories, through: :categories, source: :product + has_many :products + has_many :orders + has_many :reviewed_products, through: :reviews, source: :product + has_many :product_categories, through: :categories, source: :product validates :username, presence: true, uniqueness: true From 663e55a8425ec2be2fa4a0870ab1064ff9bbe37e Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 20 Apr 2018 11:02:31 -0700 Subject: [PATCH 034/236] Reviews and Orders --- app/controllers/orders_controller.rb | 41 ++++++++ app/views/orders/new.html.erb | 0 app/views/orders/show.html.erb | 0 test/models/order_test.rb | 149 +++++++++++++++++++++++++++ 4 files changed, 190 insertions(+) create mode 100644 app/controllers/orders_controller.rb create mode 100644 app/views/orders/new.html.erb create mode 100644 app/views/orders/show.html.erb create mode 100644 test/models/order_test.rb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 0000000000..849f604a1c --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,41 @@ +class OrdersController < ApplicationController + before_action :find_order, only: [:show] + + def show; end + + def new + @order = Order.new + end + + def create + @order = Order.new(order_params) + @order.status = 'pending' + if @order.save + redirect_to order_path(@order.id) + else + render :new + end + end + + # add product to cart, remove product from cart should go in product + + def total_price + end + + def checkout_cart + end + + def empty_cart + end + + private + + def order_params + params.require(:order).permit(:status, :name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) + end + + def find_order + @order = Order.find_by_id(params[:id]) + end + +end diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 0000000000..10931c67df --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,149 @@ +require "test_helper" + +describe Order do + + describe "validations" do + before do + @order = orders(:basic_order) + @blank_order = Order.new() + end + + it 'can be created with all required fields' do + result = @order.valid? + result.must_equal true + end + + # name + it "requires a name" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :name + end + + # email + it "requires an email" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :email + end + + it "requires an @ sign in the email" do + @order.email = "emailnoatsign" + @order.valid?.must_equal false + @order.errors.messages.must_include :email + end + + # address + it "requires an address" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :address + end + + it "requires a number at beginning of address" do + @order.address = "not starting w/ numbers" + @order.valid?.must_equal false + @order.errors.messages.must_include :address + end + + # cc_num + it "requires a cc_num" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :cc_num + end + + it "requires 16 digits" do + @order.cc_num = "111222" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_num + end + + it "requires digits only - test with letters only" do + @order.cc_num = "no numbersssssss" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_num + end + + it "requires digits only - test with some letters" do + @order.cc_num = "1letters23456789" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_num + end + + # expiry_date + it "requires a expiry_date" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :expiry_date + end + + it "requires 4 digits" do + @order.expiry_date = "113" + @order.valid?.must_equal false + @order.errors.messages.must_include :expiry_date + end + + it "requires digits only - test with letters only" do + @order.expiry_date = "xxxx" + @order.valid?.must_equal false + @order.errors.messages.must_include :expiry_date + end + + it "requires digits only - test with some letters" do + @order.expiry_date = "1x2x" + @order.valid?.must_equal false + @order.errors.messages.must_include :expiry_date + end + + # cc_cvv + it "requires a cc_cvv" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :cc_cvv + end + + it "requires 3 digits" do + @order.cc_cvv = "1234" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_cvv + end + + it "requires digits only - test with letters only" do + @order.cc_cvv = "xxx" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_cvv + end + + it "requires digits only - test with some letters" do + @order.cc_cvv = "1x2" + @order.valid?.must_equal false + @order.errors.messages.must_include :cc_cvv + end + + # zip + it "requires a zip" do + @blank_order.valid?.must_equal false + @blank_order.errors.messages.must_include :zip + end + + it "requires digits only - test with letters only" do + @order.zip = "xxxxx" + @order.valid?.must_equal false + @order.errors.messages.must_include :zip + end + + it "requires digits only - test with some letters" do + @order.zip = "1x3x5" + @order.valid?.must_equal false + @order.errors.messages.must_include :zip + end + end + + describe "relations" do + it "has a merchant" do + end + + it "has a list of products" do + # order = orders(:order_one) + # order.must_respond_to :products + # order.products.each do |product| + # product.must_be_kind_of Product + end + end + +end From 4915b51491b9ea1c57933cd648f71fc9c468e50f Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 20 Apr 2018 14:03:11 -0700 Subject: [PATCH 035/236] updated product model with relationship to merchant. --- app/models/product.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/product.rb b/app/models/product.rb index 5fd636193f..344854eeff 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,5 @@ class Product < ApplicationRecord - # relationship belongs to a user + belongs_to :merchant validates :name, presence: true validates :name, uniqueness: true validates :price, presence: true From 3b0d1156f0701b792a54c35456b4d6dbf117483f Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 20 Apr 2018 14:21:22 -0700 Subject: [PATCH 036/236] Created orders products join table. --- app/models/order.rb | 2 +- app/models/product.rb | 2 ++ ...20180420210859_createordersproductsjoin.rb | 8 +++++ db/schema.rb | 31 ++++++++++++------- 4 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20180420210859_createordersproductsjoin.rb diff --git a/app/models/order.rb b/app/models/order.rb index 5cfe083e3a..5fcb7f5e21 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,6 @@ class Order < ApplicationRecord belongs_to :merchant - has_many :products + has_and_belongs_to_many :products validates :name, presence: true diff --git a/app/models/product.rb b/app/models/product.rb index 344854eeff..089bebe39f 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,7 @@ class Product < ApplicationRecord + has_and_belongs_to_many :orders belongs_to :merchant + validates :name, presence: true validates :name, uniqueness: true validates :price, presence: true diff --git a/db/migrate/20180420210859_createordersproductsjoin.rb b/db/migrate/20180420210859_createordersproductsjoin.rb new file mode 100644 index 0000000000..28398e6597 --- /dev/null +++ b/db/migrate/20180420210859_createordersproductsjoin.rb @@ -0,0 +1,8 @@ +class Createordersproductsjoin < ActiveRecord::Migration[5.1] + def change + create_table :orders_products do |t| + t.belongs_to :order, index: true + t.belongs_to :product, index: true + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 427905b08d..73628be78f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,11 +10,24 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180420003356) do +ActiveRecord::Schema.define(version: 20180420210859) 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 "merchants", force: :cascade do |t| + t.string "username" + t.string "email" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "orders", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -28,10 +41,11 @@ t.string "zip" end - create_table "categories", force: :cascade do |t| - t.string "name" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "orders_products", force: :cascade do |t| + t.bigint "order_id" + t.bigint "product_id" + t.index ["order_id"], name: "index_orders_products_on_order_id" + t.index ["product_id"], name: "index_orders_products_on_product_id" end create_table "products", force: :cascade do |t| @@ -42,13 +56,6 @@ t.datetime "updated_at", null: false end - 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 - create_table "reviews", force: :cascade do |t| t.integer "rating" t.string "description" From d2165cd3e47170d8dee19c57eb69c8b2cd5fa3e4 Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 20 Apr 2018 14:31:46 -0700 Subject: [PATCH 037/236] Added column to order_products table. --- ...80420212840_add_quantity_field_to_order_products_table.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb diff --git a/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb b/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb new file mode 100644 index 0000000000..f929baa812 --- /dev/null +++ b/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb @@ -0,0 +1,5 @@ +class AddQuantityFieldToOrderProductsTable < ActiveRecord::Migration[5.1] + def change + add_column :orders_products, :quantity, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 73628be78f..a12e184d7a 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: 20180420210859) do +ActiveRecord::Schema.define(version: 20180420212840) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -44,6 +44,7 @@ create_table "orders_products", force: :cascade do |t| t.bigint "order_id" t.bigint "product_id" + t.integer "quantity" t.index ["order_id"], name: "index_orders_products_on_order_id" t.index ["product_id"], name: "index_orders_products_on_product_id" end From 9e8e20b09a3f8fa7e6e3e5ad9160e70cd4cef849 Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 20 Apr 2018 14:57:48 -0700 Subject: [PATCH 038/236] Added categories_products join table and added merchant id foreign key to products table. --- app/controllers/products_controller.rb | 2 +- app/models/product.rb | 1 + .../20180420213433_category_product_join_table.rb | 8 ++++++++ .../20180420214528_add_merchant_id_to_products.rb | 5 +++++ db/schema.rb | 12 +++++++++++- 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 db/migrate/20180420213433_category_product_join_table.rb create mode 100644 db/migrate/20180420214528_add_merchant_id_to_products.rb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 204a4ad9fe..50c36599fc 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -12,7 +12,7 @@ def new def create @product = Product.new(product_params) - if product.save + if @product.save flash[:success] = "Product added successfully" redirect_to products_path else diff --git a/app/models/product.rb b/app/models/product.rb index 089bebe39f..3861e4b802 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,6 @@ class Product < ApplicationRecord has_and_belongs_to_many :orders + has_and_belongs_to_many :categories belongs_to :merchant validates :name, presence: true diff --git a/db/migrate/20180420213433_category_product_join_table.rb b/db/migrate/20180420213433_category_product_join_table.rb new file mode 100644 index 0000000000..9afdf35e6a --- /dev/null +++ b/db/migrate/20180420213433_category_product_join_table.rb @@ -0,0 +1,8 @@ +class CategoryProductJoinTable < ActiveRecord::Migration[5.1] + def change + create_table :categories_products do |t| + t.belongs_to :category, index: true + t.belongs_to :product, index: true + end + end +end diff --git a/db/migrate/20180420214528_add_merchant_id_to_products.rb b/db/migrate/20180420214528_add_merchant_id_to_products.rb new file mode 100644 index 0000000000..45930fd0d9 --- /dev/null +++ b/db/migrate/20180420214528_add_merchant_id_to_products.rb @@ -0,0 +1,5 @@ +class AddMerchantIdToProducts < ActiveRecord::Migration[5.1] + def change + add_reference :products, :merchant, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index a12e184d7a..6ffdfb0f7d 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: 20180420212840) do +ActiveRecord::Schema.define(version: 20180420214528) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -21,6 +21,13 @@ t.datetime "updated_at", null: false end + create_table "categories_products", force: :cascade do |t| + t.bigint "category_id" + t.bigint "product_id" + t.index ["category_id"], name: "index_categories_products_on_category_id" + t.index ["product_id"], name: "index_categories_products_on_product_id" + end + create_table "merchants", force: :cascade do |t| t.string "username" t.string "email" @@ -55,6 +62,8 @@ t.integer "available" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "merchant_id" + t.index ["merchant_id"], name: "index_products_on_merchant_id" end create_table "reviews", force: :cascade do |t| @@ -64,4 +73,5 @@ t.datetime "updated_at", null: false end + add_foreign_key "products", "merchants" end From 269499229cc7c8ceb4652271fa916cdb4e189656 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 20 Apr 2018 20:47:01 -0700 Subject: [PATCH 039/236] Added csv files for seeds --- db/seed_data/categories-products.csv | 9 +++++++++ db/seed_data/categories.csv | 6 ++++++ db/seed_data/merchants.csv | 6 ++++++ db/seed_data/orders-products.csv | 9 +++++++++ db/seed_data/orders.csv | 5 +++++ db/seed_data/products.csv | 6 ++++++ db/seed_data/reviews.csv | 6 ++++++ 7 files changed, 47 insertions(+) create mode 100644 db/seed_data/categories-products.csv create mode 100644 db/seed_data/categories.csv create mode 100644 db/seed_data/merchants.csv create mode 100644 db/seed_data/orders-products.csv create mode 100644 db/seed_data/orders.csv create mode 100644 db/seed_data/products.csv create mode 100644 db/seed_data/reviews.csv diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv new file mode 100644 index 0000000000..da488e94b9 --- /dev/null +++ b/db/seed_data/categories-products.csv @@ -0,0 +1,9 @@ +category_id,product_id +2,1 +2,2 +1,2 +2,3 +3,3 +4,3 +5,4 +4,5 diff --git a/db/seed_data/categories.csv b/db/seed_data/categories.csv new file mode 100644 index 0000000000..c5af04b777 --- /dev/null +++ b/db/seed_data/categories.csv @@ -0,0 +1,6 @@ +name +shirts +pants +shoes +outerwear +accessories diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv new file mode 100644 index 0000000000..8b9300b742 --- /dev/null +++ b/db/seed_data/merchants.csv @@ -0,0 +1,6 @@ +rating,email +gregg,gregg.popovich@nba.com +tyronn,tyronn.lue@nba.com +steve,steve.kerr@nba.com +becky,becky.hammon@nba.com +mark,mark.jackson@nba.com diff --git a/db/seed_data/orders-products.csv b/db/seed_data/orders-products.csv new file mode 100644 index 0000000000..f3da7b5ddd --- /dev/null +++ b/db/seed_data/orders-products.csv @@ -0,0 +1,9 @@ +order_id,product_id,quantity +1,5,1 +2,4,3 +2,3,1 +3,1,2 +3,3,1 +3,4,1 +3,5,1 +4,2,4 diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv new file mode 100644 index 0000000000..31c5324386 --- /dev/null +++ b/db/seed_data/orders.csv @@ -0,0 +1,5 @@ +status,name,email,address,cc_num,espiry_date,cc_cvv,zip +pending,Danny Green,danny@nba.com,"1234 5th Street Seattle, WA 98125",1234567888888888,1020,100,98312 +paid,Lebron James,lebron@nba.com,"6789 10th Street Seattle, WA 98125",1234512345123456,1118,200,98004 +complete,Harrison Barnes,harrison@nba.com,"1112 13th Street Seattle, WA 98125",3334445556667778,1119,300,98111 +cancelled,Kyrie Irving,kyrie@nba.com,"1415 16th Street Seattle, WA 98125",1010101111223345,1220,400,98332 diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv new file mode 100644 index 0000000000..6fee405414 --- /dev/null +++ b/db/seed_data/products.csv @@ -0,0 +1,6 @@ +name,price,available,merchant_id +Track Pants,50.00,20,1 +Head Band,6.99,20,1 +Rain Jacket,35.45,20,2 +Hiking Boots,64.05,20,4 +Sweaty Accessory,2.25,20,5 diff --git a/db/seed_data/reviews.csv b/db/seed_data/reviews.csv new file mode 100644 index 0000000000..853dabbb5b --- /dev/null +++ b/db/seed_data/reviews.csv @@ -0,0 +1,6 @@ +rating,details +1,Horrible product! Sweat everywhere!! +2,"Eh, I'm not impressed. Not so great and I wouldn't buy it again." +3,"This product is okay. Nothing to call home about, but it gets the job done." +4,I like it! Very nice...minimal sweat. +5,This is a really fabulous product. It controlled my sweat! From 65b7370137b1040e2827371b3df893f74ff674c1 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 20 Apr 2018 21:52:25 -0700 Subject: [PATCH 040/236] Seeds.rb file in progress --- ...0180421042831_add_product_id_to_reviews.rb | 5 + db/schema.rb | 5 +- db/seed_data/products.csv | 12 +- db/seed_data/reviews.csv | 12 +- db/seeds.rb | 138 ++++++++++++++++++ 5 files changed, 159 insertions(+), 13 deletions(-) create mode 100644 db/migrate/20180421042831_add_product_id_to_reviews.rb diff --git a/db/migrate/20180421042831_add_product_id_to_reviews.rb b/db/migrate/20180421042831_add_product_id_to_reviews.rb new file mode 100644 index 0000000000..aa157d4e07 --- /dev/null +++ b/db/migrate/20180421042831_add_product_id_to_reviews.rb @@ -0,0 +1,5 @@ +class AddProductIdToReviews < ActiveRecord::Migration[5.1] + def change + add_reference :reviews, :product, foreign_key: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 6ffdfb0f7d..99ed6c56b7 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: 20180420214528) do +ActiveRecord::Schema.define(version: 20180421042831) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -71,7 +71,10 @@ t.string "description" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.bigint "product_id" + t.index ["product_id"], name: "index_reviews_on_product_id" end add_foreign_key "products", "merchants" + add_foreign_key "reviews", "products" end diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index 6fee405414..b68ff88f79 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,6 +1,6 @@ -name,price,available,merchant_id -Track Pants,50.00,20,1 -Head Band,6.99,20,1 -Rain Jacket,35.45,20,2 -Hiking Boots,64.05,20,4 -Sweaty Accessory,2.25,20,5 +name,price,available,merchant_username +Track Pants,50.00,20,gregg +Head Band,6.99,20,gregg +Rain Jacket,35.45,20,tyronn +Hiking Boots,64.05,20,becky +Sweaty Accessory,2.25,20,mark diff --git a/db/seed_data/reviews.csv b/db/seed_data/reviews.csv index 853dabbb5b..e27501ccf7 100644 --- a/db/seed_data/reviews.csv +++ b/db/seed_data/reviews.csv @@ -1,6 +1,6 @@ -rating,details -1,Horrible product! Sweat everywhere!! -2,"Eh, I'm not impressed. Not so great and I wouldn't buy it again." -3,"This product is okay. Nothing to call home about, but it gets the job done." -4,I like it! Very nice...minimal sweat. -5,This is a really fabulous product. It controlled my sweat! +rating,details,product_name +1,Horrible product! Sweat everywhere!!,Sweaty Accessory +2,"Eh, I'm not impressed. Not so great and I wouldn't buy it again.",Track Pants +3,"This product is okay. Nothing to call home about, but it gets the job done.",Hiking Boots +4,I like it! Very nice...minimal sweat.,Hiking Boots +5,This is a really fabulous product. It controlled my sweat!,Head Band diff --git a/db/seeds.rb b/db/seeds.rb index 1beea2accd..bdf4d7d539 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,3 +5,141 @@ # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) + +CATEGORIES_FILE = Rails.root.join('db', 'seed_data', 'categories.csv') +puts "Loading raw category data from #{CATEGORIES_FILE}" + +category_failures = [] +CSV.foreach(CATEGORIES_FILE, :headers => true) do |row| + category = Category.new + category.name = row['name'] + successful = category.save + if !successful + category_failures << category + puts "Failed to save category: #{category.inspect}" + else + puts "Created category: #{category.inspect}" + end +end + +puts "Added #{Category.count} category records" +puts "#{category_failures.length} categories failed to save" + + + +MERCHANTS_FILE = Rails.root.join('db', 'seed_data', 'merchants.csv') +puts "Loading raw merchant data from #{MERCHANTS_FILE}" + +merchant_failures = [] +CSV.foreach(MERCHANTS_FILE, :headers => true) do |row| + merchant = Merchant.new + merchant.username = row['username'] + merchant.email = row['email'] + successful = merchant.save + if !successful + merchant_failures << merchant + puts "Failed to save merchant: #{merchant.inspect}" + else + puts "Created merchant: #{merchant.inspect}" + end +end + +puts "Added #{Merchant.count} merchant records" +puts "#{merchant_failures.length} merchants failed to save" + + + +ORDERS_FILE = Rails.root.join('db', 'seed_data', 'orders.csv') +puts "Loading raw order data from #{ORDERS_FILE}" + +order_failures = [] +CSV.foreach(ORDERS_FILE, :headers => true) do |row| + order = Category.new + order.status = row['status'] + order.name = row['name'] + order.email = row['email'] + order.address = row['address'] + order.cc_num = row['cc_num'] + order.expiry_date = row['expiry_date'] + order.cc_cvv = row['cc_cvv'] + order.zip = row['zip'] + successful = order.save + if !successful + order_failures << order + puts "Failed to save order: #{order.inspect}" + else + puts "Created order: #{order.inspect}" + end +end + +puts "Added #{Order.count} order records" +puts "#{order_failures.length} orders failed to save" + + + +PRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'products.csv') +puts "Loading raw category data from #{PRODUCTS_FILE}" + +product_failures = [] +CSV.foreach(PRODUCTS_FILE, :headers => true) do |row| + product = Product.new + product.name = row['name'] + product.price = row['price'] + product.available = row['available'] + product.merchant_id = Merchant.find_by(username: row['merchant_username']).id + successful = product.save + if !successful + product_failures << product + puts "Failed to save product: #{product.inspect}" + else + puts "Created product: #{product.inspect}" + end +end + +puts "Added #{Product.count} product records" +puts "#{product_failures.length} products failed to save" + + + + +REVIEWS_FILE = Rails.root.join('db', 'seed_data', 'reviews.csv') +puts "Loading raw review data from #{REVIEWS_FILE}" + +review_failures = [] +CSV.foreach(REVIEWS_FILE, :headers => true) do |row| + review = Review.new + review.rating = row['rating'] + review.description = row['description'] + review.product_id = Product.find_by(name: row['product_name']).id + successful = review.save + if !successful + review_failures << review + puts "Failed to save review: #{review.inspect}" + else + puts "Created review: #{review.inspect}" + end +end + +puts "Added #{Review.count} review records" +puts "#{review_failures.length} reviews failed to save" + + + +CATEGORIESPRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'categories-products.csv') +puts "Loading raw categories_products data from #{CATEGORIESPRODUCTS_FILE}" + +categories-products_failures = [] +CSV.foreach(CATEGORIESPRODUCTS_FILE_FILE, :headers => true) do |row| + categories_products = Category.new + category.name = row['name'] + successful = category.save + if !successful + category_failures << category + puts "Failed to save category: #{category.inspect}" + else + puts "Created category: #{category.inspect}" + end +end + +puts "Added #{Category.count} category records" +puts "#{category_failures.length} categories failed to save" From 25685de9bad7110d78d53301414557b1d45ad8f5 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 20 Apr 2018 22:17:23 -0700 Subject: [PATCH 041/236] Basics of seeds.rb file added --- db/seed_data/categories-products.csv | 18 ++++++------ db/seed_data/orders-products.csv | 18 ++++++------ db/seeds.rb | 42 ++++++++++++++++++++++------ 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv index da488e94b9..0bca3b01ea 100644 --- a/db/seed_data/categories-products.csv +++ b/db/seed_data/categories-products.csv @@ -1,9 +1,9 @@ -category_id,product_id -2,1 -2,2 -1,2 -2,3 -3,3 -4,3 -5,4 -4,5 +category_name,product_name +pants,Track Pants +accessories,Sweaty Accessory +shirts,Rain Jacket +outerwear,Rain Jacket +shoes,Hiking Boots +outerwear,Hiking Boots +outerwear,Head Band +accessories,Head Band diff --git a/db/seed_data/orders-products.csv b/db/seed_data/orders-products.csv index f3da7b5ddd..774f25eb51 100644 --- a/db/seed_data/orders-products.csv +++ b/db/seed_data/orders-products.csv @@ -1,9 +1,9 @@ -order_id,product_id,quantity -1,5,1 -2,4,3 -2,3,1 -3,1,2 -3,3,1 -3,4,1 -3,5,1 -4,2,4 +order_id,product_name,quantity +1,Sweaty Accessory,1 +2,Hiking Boots,3 +2,Rain Jacket,1 +3,Track Pants,2 +3,Rain Jacket,1 +3,Hiking Boots,1 +3,Sweaty Accessory,1 +4,Head Band,4 diff --git a/db/seeds.rb b/db/seeds.rb index bdf4d7d539..6c1a115603 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -128,18 +128,42 @@ CATEGORIESPRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'categories-products.csv') puts "Loading raw categories_products data from #{CATEGORIESPRODUCTS_FILE}" -categories-products_failures = [] +categoryproduct_failures = [] CSV.foreach(CATEGORIESPRODUCTS_FILE_FILE, :headers => true) do |row| - categories_products = Category.new - category.name = row['name'] - successful = category.save + category_product = CategoryProduct.new + category_product.category_id = Category.find_by(name: row['category_name']).id + category_product.product_id = Product.find_by(name: row['product_name']).id + successful = category_product.save if !successful - category_failures << category - puts "Failed to save category: #{category.inspect}" + categoryproduct_failures << category_product + puts "Failed to save category_product: #{category_product.inspect}" else - puts "Created category: #{category.inspect}" + puts "Created category_product: #{category_product.inspect}" end end -puts "Added #{Category.count} category records" -puts "#{category_failures.length} categories failed to save" +puts "Added #{CategoryProduct.count} category_product records" +puts "#{categoryproduct_failures.length} category_product records failed to save" + + + +ORDERSPRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'orders-products.csv') +puts "Loading raw orders_products data from #{ORDERSPRODUCTS_FILE}" + +orderproduct_failures = [] +CSV.foreach(CATEGORIESPRODUCTS_FILE_FILE, :headers => true) do |row| + order_product = OrderProduct.new + order_product.order_id = row['order_id'] + order_product.product_name = Product.find_by(name: row['product_name']).id + order_product.quantity = row['quantity'] + successful = order_product.save + if !successful + orderproduct_failures << order_product + puts "Failed to save order_product: #{order_product.inspect}" + else + puts "Created order_product: #{order_product.inspect}" + end +end + +puts "Added #{OrderProduct.count} order_product records" +puts "#{orderproduct_failures.length} order_product records failed to save" From d5a2e890ac73f714b85e0d5dae6325fa87b3f71a Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 20 Apr 2018 23:13:02 -0700 Subject: [PATCH 042/236] Seed.rb working except for join table portions --- app/models/order.rb | 2 +- app/models/product.rb | 2 +- db/migrate/20180419211417_drop_products_table.rb | 9 --------- db/seed_data/merchants.csv | 2 +- db/seed_data/orders.csv | 2 +- db/seeds.rb | 14 +++++--------- 6 files changed, 9 insertions(+), 22 deletions(-) delete mode 100644 db/migrate/20180419211417_drop_products_table.rb diff --git a/app/models/order.rb b/app/models/order.rb index 5fcb7f5e21..cdad57d001 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,5 +1,5 @@ class Order < ApplicationRecord - belongs_to :merchant + has_many :merchants, through: :products has_and_belongs_to_many :products validates :name, presence: true diff --git a/app/models/product.rb b/app/models/product.rb index 3861e4b802..831d36a5af 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -6,5 +6,5 @@ class Product < ApplicationRecord validates :name, presence: true validates :name, uniqueness: true validates :price, presence: true - validates :price, numericality: { only_integer: true, greater_than: 0} + validates :price, numericality: { greater_than: 0} end diff --git a/db/migrate/20180419211417_drop_products_table.rb b/db/migrate/20180419211417_drop_products_table.rb deleted file mode 100644 index 5ce5988afe..0000000000 --- a/db/migrate/20180419211417_drop_products_table.rb +++ /dev/null @@ -1,9 +0,0 @@ -class DropProductsTable < ActiveRecord::Migration[5.1] - def up - drop_table :products - end - - def down - raise ActiveRecord::IrreversibleMigration - end -end diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 8b9300b742..3001327d0d 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,4 +1,4 @@ -rating,email +username,email gregg,gregg.popovich@nba.com tyronn,tyronn.lue@nba.com steve,steve.kerr@nba.com diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv index 31c5324386..182e105dd1 100644 --- a/db/seed_data/orders.csv +++ b/db/seed_data/orders.csv @@ -1,4 +1,4 @@ -status,name,email,address,cc_num,espiry_date,cc_cvv,zip +status,name,email,address,cc_num,expiry_date,cc_cvv,zip pending,Danny Green,danny@nba.com,"1234 5th Street Seattle, WA 98125",1234567888888888,1020,100,98312 paid,Lebron James,lebron@nba.com,"6789 10th Street Seattle, WA 98125",1234512345123456,1118,200,98004 complete,Harrison Barnes,harrison@nba.com,"1112 13th Street Seattle, WA 98125",3334445556667778,1119,300,98111 diff --git a/db/seeds.rb b/db/seeds.rb index 6c1a115603..51c7e06979 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,10 +1,4 @@ -# 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) +require 'csv' CATEGORIES_FILE = Rails.root.join('db', 'seed_data', 'categories.csv') puts "Loading raw category data from #{CATEGORIES_FILE}" @@ -54,7 +48,7 @@ order_failures = [] CSV.foreach(ORDERS_FILE, :headers => true) do |row| - order = Category.new + order = Order.new order.status = row['status'] order.name = row['name'] order.email = row['email'] @@ -91,6 +85,8 @@ if !successful product_failures << product puts "Failed to save product: #{product.inspect}" + puts "XXXXXXXXXX" + puts product.errors.messages else puts "Created product: #{product.inspect}" end @@ -129,7 +125,7 @@ puts "Loading raw categories_products data from #{CATEGORIESPRODUCTS_FILE}" categoryproduct_failures = [] -CSV.foreach(CATEGORIESPRODUCTS_FILE_FILE, :headers => true) do |row| +CSV.foreach(CATEGORIESPRODUCTS_FILE, :headers => true) do |row| category_product = CategoryProduct.new category_product.category_id = Category.find_by(name: row['category_name']).id category_product.product_id = Product.find_by(name: row['product_name']).id From 32e1a51b5b145c854cdda60e4b78fba91f21e1ef Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Sat, 21 Apr 2018 11:24:52 -0700 Subject: [PATCH 043/236] Seeds workinggit add . --- app/models/merchant.rb | 2 -- app/models/order.rb | 3 +- app/models/order_product.rb | 4 +++ app/models/product.rb | 3 +- ...20180420210859_createorderproductsjoin.rb} | 4 +-- ..._quantity_field_to_order_products_table.rb | 2 +- db/schema.rb | 16 ++++----- db/seeds.rb | 35 +++++++------------ 8 files changed, 32 insertions(+), 37 deletions(-) create mode 100644 app/models/order_product.rb rename db/migrate/{20180420210859_createordersproductsjoin.rb => 20180420210859_createorderproductsjoin.rb} (51%) diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 02fda22eae..5cff079738 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -4,8 +4,6 @@ class Merchant < ApplicationRecord has_many :reviewed_products, through: :reviews, source: :product has_many :product_categories, through: :categories, source: :product - 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 cdad57d001..88645bf736 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,6 +1,7 @@ class Order < ApplicationRecord + has_many :order_products + has_many :products, through: :order_products has_many :merchants, through: :products - has_and_belongs_to_many :products validates :name, presence: true diff --git a/app/models/order_product.rb b/app/models/order_product.rb new file mode 100644 index 0000000000..3ff23fb742 --- /dev/null +++ b/app/models/order_product.rb @@ -0,0 +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 831d36a5af..bdedea84df 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,5 +1,6 @@ class Product < ApplicationRecord - has_and_belongs_to_many :orders + has_many :order_products + has_many :orders, through: :order_products has_and_belongs_to_many :categories belongs_to :merchant diff --git a/db/migrate/20180420210859_createordersproductsjoin.rb b/db/migrate/20180420210859_createorderproductsjoin.rb similarity index 51% rename from db/migrate/20180420210859_createordersproductsjoin.rb rename to db/migrate/20180420210859_createorderproductsjoin.rb index 28398e6597..000d4417b4 100644 --- a/db/migrate/20180420210859_createordersproductsjoin.rb +++ b/db/migrate/20180420210859_createorderproductsjoin.rb @@ -1,6 +1,6 @@ -class Createordersproductsjoin < ActiveRecord::Migration[5.1] +class Createorderproductsjoin < ActiveRecord::Migration[5.1] def change - create_table :orders_products do |t| + create_table :order_products do |t| t.belongs_to :order, index: true t.belongs_to :product, index: true end diff --git a/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb b/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb index f929baa812..6105b5bcf8 100644 --- a/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb +++ b/db/migrate/20180420212840_add_quantity_field_to_order_products_table.rb @@ -1,5 +1,5 @@ class AddQuantityFieldToOrderProductsTable < ActiveRecord::Migration[5.1] def change - add_column :orders_products, :quantity, :integer + add_column :order_products, :quantity, :integer end end diff --git a/db/schema.rb b/db/schema.rb index 99ed6c56b7..30101d7b74 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -35,6 +35,14 @@ t.datetime "updated_at", null: false end + create_table "order_products", force: :cascade do |t| + t.bigint "order_id" + t.bigint "product_id" + t.integer "quantity" + t.index ["order_id"], name: "index_order_products_on_order_id" + t.index ["product_id"], name: "index_order_products_on_product_id" + end + create_table "orders", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -48,14 +56,6 @@ t.string "zip" end - create_table "orders_products", force: :cascade do |t| - t.bigint "order_id" - t.bigint "product_id" - t.integer "quantity" - t.index ["order_id"], name: "index_orders_products_on_order_id" - t.index ["product_id"], name: "index_orders_products_on_product_id" - end - create_table "products", force: :cascade do |t| t.string "name" t.integer "price" diff --git a/db/seeds.rb b/db/seeds.rb index 51c7e06979..6d9779d952 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -17,7 +17,7 @@ end puts "Added #{Category.count} category records" -puts "#{category_failures.length} categories failed to save" +puts "#{category_failures.count} categories failed to save" @@ -39,7 +39,7 @@ end puts "Added #{Merchant.count} merchant records" -puts "#{merchant_failures.length} merchants failed to save" +puts "#{merchant_failures.count} merchants failed to save" @@ -67,7 +67,7 @@ end puts "Added #{Order.count} order records" -puts "#{order_failures.length} orders failed to save" +puts "#{order_failures.count} orders failed to save" @@ -93,7 +93,7 @@ end puts "Added #{Product.count} product records" -puts "#{product_failures.length} products failed to save" +puts "#{product_failures.count} products failed to save" @@ -117,29 +117,20 @@ end puts "Added #{Review.count} review records" -puts "#{review_failures.length} reviews failed to save" +puts "#{review_failures.count} reviews failed to save" CATEGORIESPRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'categories-products.csv') puts "Loading raw categories_products data from #{CATEGORIESPRODUCTS_FILE}" -categoryproduct_failures = [] CSV.foreach(CATEGORIESPRODUCTS_FILE, :headers => true) do |row| - category_product = CategoryProduct.new - category_product.category_id = Category.find_by(name: row['category_name']).id - category_product.product_id = Product.find_by(name: row['product_name']).id - successful = category_product.save - if !successful - categoryproduct_failures << category_product - puts "Failed to save category_product: #{category_product.inspect}" - else - puts "Created category_product: #{category_product.inspect}" - end + category = Category.find_by(name: row['category_name']) + product = Product.find_by(name: row['product_name']) + category.products << product end -puts "Added #{CategoryProduct.count} category_product records" -puts "#{categoryproduct_failures.length} category_product records failed to save" +puts "done with categories-products" @@ -147,10 +138,10 @@ puts "Loading raw orders_products data from #{ORDERSPRODUCTS_FILE}" orderproduct_failures = [] -CSV.foreach(CATEGORIESPRODUCTS_FILE_FILE, :headers => true) do |row| +CSV.foreach(ORDERSPRODUCTS_FILE, :headers => true) do |row| order_product = OrderProduct.new - order_product.order_id = row['order_id'] - order_product.product_name = Product.find_by(name: row['product_name']).id + order_product.order_id = Order.find(row['order_id']).id + order_product.product_id = Product.find_by(name: row['product_name']).id order_product.quantity = row['quantity'] successful = order_product.save if !successful @@ -162,4 +153,4 @@ end puts "Added #{OrderProduct.count} order_product records" -puts "#{orderproduct_failures.length} order_product records failed to save" +puts "#{orderproduct_failures.count} order_product records failed to save" From 47503c31e11df50cb8cdb4e97e52b87e1d0697cb Mon Sep 17 00:00:00 2001 From: Kiera Date: Sat, 21 Apr 2018 16:40:10 -0700 Subject: [PATCH 044/236] Created controller tests for the products controller. All but, one (update) is passing. --- app/controllers/products_controller.rb | 8 +- app/views/layouts/_form.html.erb | 3 +- app/views/products/edit.html.erb | 2 +- app/views/products/new.html.erb | 2 +- test/controllers/products_controller_test.rb | 176 ++++++++++++++++++- test/fixtures/products.yml | 4 + 6 files changed, 184 insertions(+), 11 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 50c36599fc..5b414363a1 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -6,7 +6,7 @@ def index end def new - @product = Product.new + @product = Product.new(merchant_id: params[:merchant_id]) end def create @@ -14,7 +14,7 @@ def create if @product.save flash[:success] = "Product added successfully" - redirect_to products_path + redirect_to products_path # QUESTION: should this be the nested merchant_products route? else flash.now[:failure] = "Validations Failed" render :new, status: :bad_request @@ -43,13 +43,13 @@ def destroy private def find_product - @product = products.find_by(id: params[:id]) + @product = Product.find_by(id: params[:id]) head :not_found unless @product end def product_params - return params.require(:product).permit(:name, :price, :available) + return params.require(:product).permit(:name, :price, :available, :merchant_id) end end diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index f4223731ce..a3eeb1a39c 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -1,7 +1,6 @@

Add a new product

-<%= form_for @products do |f| %> - +<%= form_for @product do |f| %> <%= f.label :name %> <%= f.text_field :name %> diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index d83b325754..f793cad346 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1 +1 @@ -<%= render partial: "form", locals: { page_title: "Edit a new product"} %> +<%= render partial: "layouts/form", locals: { page_title: "Edit a product"} %> diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index f2d13ef172..b22b95f389 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1 +1 @@ -<%= render partial: "form", locals: { page_title: "Add a new product"} %> +<%= render partial: "layouts/form", locals: { page_title: "Add a new product"} %> diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 392a20e292..7246c935fa 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,7 +1,177 @@ require "test_helper" describe ProductsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe 'index' do + it "sends a success response where there are products" do + Product.count.must_be :>,0 + + get products_path + + must_respond_with :success + + end + + it "sends a success response when there are no products" do + Product.destroy_all + + get products_path + + Product.count.must_equal 0 + must_respond_with :success + end + end + + describe 'new' do + it "sends a success response" do + get new_product_path + must_respond_with :success + end + end + + describe 'create' do + + it "can add a product with valid data" do + product_data = { + name: 'random', + price: 3, + available: 4, + merchant_id: Merchant.first.id + } + old_product_count = Product.count + + product = Product.new(product_data) + + product.must_be :valid? + + post products_path, params: { product: product_data} + + must_respond_with :redirect + must_redirect_to products_path + + Product.count.must_equal old_product_count + 1 + + Product.last.name.must_equal product_data[:name] + end + + it "renders error for invalid data" do + product_data = { + merchant_id: Merchant.first.id + } + old_product_count = Product.count + + product = Product.new(product_data) + + product.wont_be :valid? + + post products_path, params: { product: product_data} + + must_respond_with :bad_request + + Product.count.must_equal old_product_count + end + end + + describe 'edit' do + it "send success if the product saves" do + get edit_product_path(Product.first) + must_respond_with :success + end + + it "sends not_found if product does not exist" do + product_id = Product.last.id + 1 + + get edit_product_path(product_id) + must_respond_with :not_found + + end + end + + describe 'show' do + it "send success if the product exists" do + get product_path(Product.first) + must_respond_with :success + end + + it "sends not_found if product does not exist" do + product_id = Product.last.id + 1 + + get product_path(product_id) + must_respond_with :not_found + + end + end + + describe 'update' do + it "updates existing product with valid data" do + # product = Product.first + # product_data = product.attributes + # + # product_data[:name] = "sweaty stuff" + # + # product.assign_attributes(product_data) + # + # product.must_be :valid? + # + # patch product_path(product), params: { product: product_data } + # + # must_redirect_to product_path(product) + # + # product.reload + # product.name.must_equal product_data[:name] + end + + it "sends bad_request when data is invalid" do + product = Product.first + product_data = product.attributes + + product_data[:name] = "" + + product.assign_attributes(product_data) + + product.wont_be :valid? + + patch product_path(product), params: { product: product_data } + + must_respond_with :bad_request + + product.reload + product.name.wont_equal product_data[:name] + end + + it "sends not_found for a product that does not exist" do + product_id = Product.last.id + 1 + + patch product_path(product_id) + + must_respond_with :not_found + end + + end + + describe 'destroy' do + it "can destroy a product" do + product_id = Product.first.id + old_product_count = Product.count + + delete product_path(product_id) + + must_respond_with :redirect + must_redirect_to products_path + + Product.count.must_equal old_product_count - 1 + end + + it "sends not_found when product does not exist" do + product_id = Product.first.id + 1 + old_product_count = Product.count + + delete product_path(product_id) + + must_respond_with :not_found + + Product.count.must_equal old_product_count + + end + end end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 21e6560448..0732238b20 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -4,13 +4,17 @@ hb: name: headband price: 10 available: 6 + merchant_id: 1 water: name: bottled water price: 1 available: 100 + merchant_id: 1 + pants: name: sweatpants price: 20 available: 10 + merchant_id: 2 From cf1948142a9e712744ea03d66b1f5bb0f715f73f Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Sat, 21 Apr 2018 17:29:53 -0700 Subject: [PATCH 045/236] Seeds added and order tests passings --- app/controllers/orders_controller.rb | 7 +++++-- app/controllers/reviews_controller.rb | 4 ---- app/models/review.rb | 5 +++++ test/controllers/orders_controller_test.rb | 16 ++++++++-------- test/controllers/products_controller_test.rb | 3 --- test/controllers/reviews_controller_test.rb | 3 --- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 849f604a1c..ba86015d11 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,7 +4,7 @@ class OrdersController < ApplicationController def show; end def new - @order = Order.new + @order = Order.new() end def create @@ -13,11 +13,13 @@ def create if @order.save redirect_to order_path(@order.id) else - render :new + render :new, status: :bad_request end end # add product to cart, remove product from cart should go in product + def subtotal + end def total_price end @@ -36,6 +38,7 @@ def order_params def find_order @order = Order.find_by_id(params[:id]) + head :not_found unless @order end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index e73292e051..e3402f92d5 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,8 +1,4 @@ class ReviewsController < ApplicationController -belongs_to :product - -validates :rating, presence: true, numericality: true, length: { in: 1..5 } -validates :description, presence: true def new @review = Review.new diff --git a/app/models/review.rb b/app/models/review.rb index 2b6352f9fe..9f79681cd4 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,5 +1,10 @@ class Review < ApplicationRecord + belongs_to :product + + validates :rating, presence: true, numericality: true, length: { in: 1..5 } + validates :description, presence: true + def total self.count end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index a36bb37fd7..a09f54b368 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -44,12 +44,12 @@ } old_order_count = Order.count - test = Order.new(order_data).must_be :valid? + Order.new(order_data).must_be :valid? post orders_path, params: { order: order_data} must_respond_with :redirect - must_redirect_to order_path(test.id) + must_redirect_to order_path(Order.last.id) Order.count.must_equal old_order_count + 1 Order.last.name.must_equal order_data[:name] @@ -66,15 +66,15 @@ cc_cvv: "123", # billing zip zip: "98004", - } - old_order_count = Order.count + } + old_order_count = Order.count - Order.new(order_data).wont_be :valid? + Order.new(order_data).wont_be :valid? - post orders_path, params: { order: order_data } + post orders_path, params: { order: order_data } - must_respond_with :bad_request - Order.count.must_equal old_order_count + must_respond_with :bad_request + Order.count.must_equal old_order_count end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 392a20e292..92d9857b96 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -1,7 +1,4 @@ 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 index 386065239a..ad4797b820 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,7 +1,4 @@ require "test_helper" describe ReviewsController do - # it "must be a real test" do - # flunk "Need real tests" - # end end From 1e1b1b3c22d35f75d1b185828b94e8993004c1fb Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Sat, 21 Apr 2018 17:56:31 -0700 Subject: [PATCH 046/236] Seeds working and tests running --- app/models/review.rb | 7 +++---- test/controllers/reviews_controller_test.rb | 3 +++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index 9f79681cd4..86140d1f0a 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,9 +1,8 @@ class Review < ApplicationRecord - belongs_to :product - - validates :rating, presence: true, numericality: true, length: { in: 1..5 } - validates :description, presence: true + # belongs_to :product + # validates :rating, presence: true, numericality: true, length: { in: 1..5 } + # validates :description, presence: true def total self.count diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index ad4797b820..386065239a 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -1,4 +1,7 @@ require "test_helper" describe ReviewsController do + # it "must be a real test" do + # flunk "Need real tests" + # end end From 72558e23a16b325fef2c51b882b1ef932c245b59 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Sat, 21 Apr 2018 18:01:45 -0700 Subject: [PATCH 047/236] Update review.rb --- app/models/review.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/review.rb b/app/models/review.rb index 86140d1f0a..983c176c00 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,6 +1,6 @@ class Review < ApplicationRecord - # belongs_to :product + belongs_to :product # validates :rating, presence: true, numericality: true, length: { in: 1..5 } # validates :description, presence: true From c56f8e157a2cd15ba80fb3d6104822e1e3781981 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Sat, 21 Apr 2018 20:25:35 -0700 Subject: [PATCH 048/236] Add methods to order helper --- app/helpers/orders_helper.rb | 41 ++++++++++++++++++++++ app/models/order.rb | 1 + app/models/review.rb | 2 +- app/views/orders/show.html.erb | 63 ++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb index 443227fd48..b89778ac6c 100644 --- a/app/helpers/orders_helper.rb +++ b/app/helpers/orders_helper.rb @@ -1,2 +1,43 @@ module OrdersHelper + + def last_four + @order.cc_num.last(4) + end + + def format_expiry + @order.expiry_date.first(2) + "/" + @order.expiry_date.last(2) + end + + def date_placed + @order.updated_at.strftime("%B %d, %Y") + " at " + @order.updated_at.strftime("%I: %M %p") + end + + def products_in_order + all_products = [] + @order.products.each do |p| + all_products << p + end + return all_products + end + + def quantity_in_order(product) + @order.order_products.find_by(product_id: product.id).quantity + end + + # can i use a price function in product? + def product_subtotal(product) + quant = quantity_in_order(product) + price = product.price + return quant * price + end + + def order_total + end + + # check w/ others before putting this in application? + # change all database values to cents and update method + def format_money(money) + "$#{money.round(2)}" + end + end diff --git a/app/models/order.rb b/app/models/order.rb index 88645bf736..28c9608d87 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -21,4 +21,5 @@ class Order < ApplicationRecord validates :zip, presence: true, format: { with: /\A[\d]+\z/, message: "Digits only" } + end diff --git a/app/models/review.rb b/app/models/review.rb index 86140d1f0a..983c176c00 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,6 +1,6 @@ class Review < ApplicationRecord - # belongs_to :product + belongs_to :product # validates :rating, presence: true, numericality: true, length: { in: 1..5 } # validates :description, presence: true diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index e69de29bb2..f2bc0e64e0 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -0,0 +1,63 @@ +

+ <%= "Details for order #{@order.id}" %> +

+ +
+ +

Summary

+
    +
  • Placed: <%= date_placed %>
  • +
  • Status: <%= @order.status %>
  • +
+ +
+ +
+ +

Items

+ <% products_in_order.each do |p| %> +
    +
  • <%= p.name %>
  • +
  • <%= quantity_in_order(p) %>
  • + <% amt = product_subtotal(p) %> +
  • <%= format_money(amt) %>
  • +
+ <% end %> + +

<%= "Total: INSERT TOTAL#{}" %>

+ +
+ + +
+ +

Contact

+
    +
  • Name: <%= @order.name %>
  • +
  • Email: <%= @order.email %>
  • +
+ +
+ + +
+ +

Billing

+
    +
  • Credit Card: <%= last_four %>
  • +
  • Expiration: <%= format_expiry %>
  • +
  • CCV Number: <%= @order.cc_cvv %>
  • +
  • Billing Zip: <%= @order.zip %>
  • +
+ +
+ + +
+ +

Shipping

+
    +
  • Address: <%= @order.address %>
  • +
+ +
From 0cea235c3ff757b46fc0280cbedf037aee91d266 Mon Sep 17 00:00:00 2001 From: Kiera Date: Sat, 21 Apr 2018 21:02:12 -0700 Subject: [PATCH 049/236] Added photo url and description fields to products table and form.Added a placeholder nav bar for the application. Made progress on browsing all products view index.html.erb. --- .gitignore | 2 + .../images/placeimg_200_250_any (1).jpg | Bin 0 -> 54895 bytes app/assets/images/placeimg_200_250_any.jpg | Bin 0 -> 33467 bytes .../images/placeimg_200_250_nature (1).jpg | Bin 0 -> 36355 bytes app/assets/images/placeimg_200_250_nature.jpg | Bin 0 -> 53918 bytes app/models/product.rb | 3 + app/views/layouts/_error_messages.html.erb | 15 +++++ app/views/layouts/_form.html.erb | 9 +++ app/views/layouts/application.html.erb | 49 ++++++++++++---- app/views/products/index.html.erb | 55 +++++++++++++++++- app/views/products/new.html.erb | 2 + ...scription_and_image_to_new_product_form.rb | 6 ++ db/schema.rb | 4 +- 13 files changed, 132 insertions(+), 13 deletions(-) create mode 100644 app/assets/images/placeimg_200_250_any (1).jpg create mode 100644 app/assets/images/placeimg_200_250_any.jpg create mode 100644 app/assets/images/placeimg_200_250_nature (1).jpg create mode 100644 app/assets/images/placeimg_200_250_nature.jpg create mode 100644 app/views/layouts/_error_messages.html.erb create mode 100644 db/migrate/20180422033227_add_description_and_image_to_new_product_form.rb diff --git a/.gitignore b/.gitignore index 82701fedc8..617df47c1d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,5 @@ /yarn-error.log .byebug_history + +.DS_Store diff --git a/app/assets/images/placeimg_200_250_any (1).jpg b/app/assets/images/placeimg_200_250_any (1).jpg new file mode 100644 index 0000000000000000000000000000000000000000..fba2897f301d9c3e093c8806ac2745cf7a080f84 GIT binary patch literal 54895 zcmbrlbx<5%^!7;tBuEHO@F0U*aEAmR2<|gT2s*ek1p9{IFc1b99D)o!_%JxZ9fF6! zf(F-MA%V?r->rA6_OGqo+tpRw)%TvN&+Y2!^W5{?hwl$RaL6>(fND689^v3T`ghqf9(lwA_akLX~_Oy3o@fQ|+#lr39195j`0cxtVXzHn|v-nGh@bI&E`PsNa zd;?kJS%hD`B6?WDQT`X}|6lu`Apid&{2Tr76^EPv=Qqv}?jtsw$K;Q2$saxR;k^7u ziT}T1 z(M_1yd;4eS7r!pAu5WIC{}0zA9Nhms zW&aE8|G`E6kLxiW9xmR~|KWP{IN;xjOOA)nD*S}vjs8;`FG@C%j|5ao$pv-YgzTaQ zr_}Ggr-*0(V(T1d|AY2_lKsB}3;+K__P@dYZ!Rp(Gu%i2ULGzvjv~%)^*+UV{TX+i z@*kC>ZNTYQ%wA>75S3f?m~>qyA+dwnXvmXyb!R#GP-K}gp?Kvzda#vq^#N0n>O9^eNfou`CxS`1z&xT#=0fxnr$rdZ-w8?9b z&!8m>LJFm;`TdvUzew0OOUn7Wxnh11XM9PsnyT?7K52r~(2v}M0pufs_DQ2KE2s5o z@q1a^l&=sOm|v1da1!=fFDAYND)F=D`Y>l7m7~U>q`IpObV~-EZY%lgbCwSAg z(>FHFt+T(+Ip?74rW?FJb*|a3>{m@z^+1!;HUc3(GvC&x@qalpGdk!V*^`*QGJcod zUxacuc39jBr8(=0lvA7T{c>RCqO^bg&1^N^rBV_Wk6XSsqe_h>uti8YVmhOohGPcU z7~U{}TtK-EFU$>1Nkp^h+_sZ+Tl|Rnr{u~IL+WG<01B*%CDCov3;RTCnT0O9qX3oU zt?9hq2Zt&^NAD(7x#bcsy1j?nac1)YCnAEJ|Fs&+%nz4HK`!vno5{Gon{5IX}>$Lxj2}iOhN=wJ6r@4Ii8p@){?xs&o5j1F2XjF#3rl$QwL%5slLy~ zx!VV{XO*&WyRrS$J!kd&1JZ8hH$f-EWHyw4^r=a3-8Kwt*r%qgwoq!UROvn})m>)p zJ&fi?Uvi}PqiD2Rd|}Fl@x7Syw{>O=LjX*DOJ)%%Kf3{3w77jzR%VdiN?Gh!>c9H+ zyCv)RpK2Lzyx3LooT!?VE4i1IU5Q3m{aBJRO+8uJzZ)&=Of+n6@-HA1guV&2i-w4< zuxILDu5cb@z0HUm6BaBC=M)w1nY6PK=e28±|Q6zW4YIne~&XmyjUhg+M>hA&Y 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%0DJ!JX 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

6-B| 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 A@Bjb+ literal 0 HcmV?d00001 diff --git a/app/models/product.rb b/app/models/product.rb index 3861e4b802..9e207fb6e5 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -7,4 +7,7 @@ class Product < ApplicationRecord validates :name, uniqueness: true validates :price, presence: true validates :price, numericality: { only_integer: true, greater_than: 0} + + + end diff --git a/app/views/layouts/_error_messages.html.erb b/app/views/layouts/_error_messages.html.erb new file mode 100644 index 0000000000..75a24cfb85 --- /dev/null +++ b/app/views/layouts/_error_messages.html.erb @@ -0,0 +1,15 @@ +<% if model.errors.messages.any? %> +

+

There were some problems

+
    + <% model.errors.messages.each do |field, problems| %> + <% problems.each do |problem| %> +
  • + <%= field %> + <%= problem %> +
  • + <% end %> + <% end %> +
+
+<% end %> diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index a3eeb1a39c..c0066ee793 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -1,5 +1,8 @@ +

Add a new product

+<%= render partial: "layouts/error_messages", locals: { model: @product } %> + <%= form_for @product do |f| %> <%= f.label :name %> <%= f.text_field :name %> @@ -7,6 +10,12 @@ <%= f.label :price %> <%= f.number_field :price %> + <%= f.label :photo, 'Photo URL' %> + <%= f.file_field :photo %> + + <%= f.label :description %> + <%= f.text_area :description %> + <%= f.label :available %> <%= f.number_field :available %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index cd60004891..58d7c47301 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,19 +1,46 @@ - - - + + + - <%= content_for?(:title) ? yield(:title) : "Untitled" %> + <%= content_for?(:title) ? yield(:title) : "Untitled" %> - <%= stylesheet_link_tag "application" %> - <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> - <%= csrf_meta_tags %> - - - + <%= stylesheet_link_tag "application" %> + <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + +
+
<%= yield %> +
+ - + diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 4ef4e68f63..55924c6256 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1 +1,54 @@ -

ALL PRODUCTS GO HERE

+
+
+

Everything you need to stay DRY

+
+
+
    +
  • Previous
  • +
  • You're on page 1
  • +
  • 2
  • +
  • 3
  • +
  • 4
  • +
  • 5
  • +
  • 6
  • +
  • Next
  • +
+
+
+ <% @products.each do |product| %> +
    +
  • + +
    + placeholder photo +
    + +
    +
    <%= product.name %>
    +
    <%= number_to_currency(product.price) %>
    +

    +

    <%= product.available%> Available

    +
    + +
    +

    Ratings!

    +

    Reviews

    +
    +
  • + <% end%> +
+ +
+
+
    +
  • Previous
  • +
  • You're on page 1
  • +
  • 2
  • +
  • 3
  • +
  • 4
  • +
  • 5
  • +
  • 6
  • +
  • Next
  • +
+
+
diff --git a/app/views/products/new.html.erb b/app/views/products/new.html.erb index b22b95f389..036f093135 100644 --- a/app/views/products/new.html.erb +++ b/app/views/products/new.html.erb @@ -1 +1,3 @@ + + <%= render partial: "layouts/form", locals: { page_title: "Add a new product"} %> diff --git a/db/migrate/20180422033227_add_description_and_image_to_new_product_form.rb b/db/migrate/20180422033227_add_description_and_image_to_new_product_form.rb new file mode 100644 index 0000000000..fe56fe3ab5 --- /dev/null +++ b/db/migrate/20180422033227_add_description_and_image_to_new_product_form.rb @@ -0,0 +1,6 @@ +class AddDescriptionAndImageToNewProductForm < ActiveRecord::Migration[5.1] + def change + add_column :products, :description, :string + add_column :products, :photo, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 6ffdfb0f7d..5d0b42c779 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: 20180420214528) do +ActiveRecord::Schema.define(version: 20180422033227) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -63,6 +63,8 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false t.bigint "merchant_id" + t.string "description" + t.string "photo" t.index ["merchant_id"], name: "index_products_on_merchant_id" end From b95a427cfe94700b2b628be787eeb1f64c924fc4 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Sat, 21 Apr 2018 21:44:01 -0700 Subject: [PATCH 050/236] Working on views - show and new --- app/views/orders/new.html.erb | 27 +++++++++++++++++++++++++++ app/views/orders/show.html.erb | 2 ++ 2 files changed, 29 insertions(+) diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb index e69de29bb2..76e1f41ccc 100644 --- a/app/views/orders/new.html.erb +++ b/app/views/orders/new.html.erb @@ -0,0 +1,27 @@ +### NEED TO MOVE THIS FORM TO UPDATE AS IT WILL BE USED TO CHECKOUT CART (UPDATE STATUS) NOT TO CREATE NEW ORDER...NO VIEW NEEDED FOR CREATE + +

Review Cart

+ +<%= form_for @order do |f| %> + +<%= f.label :name, "Name: " %> +<%= f.text_field :name, placeholder: "Dwayne Johnson" %> + +<%= f.label :email, "Email: " %> +<%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> + +<%= f.label :cc_num, "Credit Card: " %> +<%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> + +<%= f.label :cc_cvv, "CVV: " %> +<%= f.number_field :cc_cvv, placeholder: "XXX" %> + +<%= f.label :expiry_date, "Expiration: " %> +<%= f.date_select :expiry_date, :discard_day => true, :start_year => Date.today.year, :end_year => (Date.today.year+10), :use_month_numbers => true, :order => [:month, :year] %> + +<%= f.label :zip, "Billing Zip: " %> +<%= f.number_field :zip, placeholder: "XXXXX" %> + +<%= f.submit "Check Out", class: 'button' %> + +<% end %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index f2bc0e64e0..c62030bcf2 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -31,6 +31,8 @@
+### DETAILS BELOW ONLY AVAILABLE IF ORDER IS NO LONGER PENDING...IF ORDER IS PENDING, NEED BUTTON GOING TO CHECKOUT +

Contact

+ +
+
Browse by Category
+
    + <% @categories.each do |category|%> +
  • <%= category.name %>
  • + <% end %> +
+ <%= link_to "See More", categories_path %> +
+ +
+
See Top Sellers
+
    + <% @merchants.each do |merchant|%> +
  • <%= merchant.username %>
  • + <% end %> +
+ <%= link_to "See More", merchants_path %> +
From 9ec8a0e8d366117ce14643ac6621042d1b4b3a0c Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Sun, 22 Apr 2018 20:43:41 -0700 Subject: [PATCH 076/236] built new category form on merchant dashboard --- app/assets/javascripts/categories.js | 2 ++ app/assets/stylesheets/categories.scss | 3 +++ app/controllers/categories_controller.rb | 26 +++++++++++++++++++ app/helpers/categories_helper.rb | 2 ++ app/models/category.rb | 2 ++ app/views/categories/new.html.erb | 1 + app/views/merchants/show.html.erb | 12 ++++++++- config/routes.rb | 2 +- .../controllers/categories_controller_test.rb | 7 +++++ 9 files changed, 55 insertions(+), 2 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/categories/new.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/controllers/categories_controller.rb b/app/controllers/categories_controller.rb new file mode 100644 index 0000000000..7f9ec5639a --- /dev/null +++ b/app/controllers/categories_controller.rb @@ -0,0 +1,26 @@ +class CategoriesController < ApplicationController + + def index + @categories = Category.all + end + + def new + @category = Category.new(name: params[:name]) + end + + def create + @category = Category.new(name: params[:category][:name]) + + if @category.save + flash[:success] = "Category added successfully" + redirect_to products_path + else + flash.now[:failure] = "Validations Failed" + render :new, status: :bad_request + end + end + + def show + @category = Category.find_by(id: params[:id]) + end +end 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/category.rb b/app/models/category.rb index f3218758f1..c6a8c69b0a 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 + validates :name, uniqueness: true end diff --git a/app/views/categories/new.html.erb b/app/views/categories/new.html.erb new file mode 100644 index 0000000000..e693f843e7 --- /dev/null +++ b/app/views/categories/new.html.erb @@ -0,0 +1 @@ +
new category route
diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 9a2917ab05..86b8122fda 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -9,6 +9,16 @@
<%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
-
<%= link_to "Create new categories", categories_path %>
+
Create a new category
+ + +
+ <%= form_for :category, url: categories_path do |f|%> + + <%= f.label :name %> + <%= f.text_field :name %> + + <%= f.submit %> + <% end %>
diff --git a/config/routes.rb b/config/routes.rb index 8e7a31e664..014fd406e9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,7 @@ resources :orders, only: [:show, :new, :create] - resources :categories, only: [:new, :create, :index] do + resources :categories, only: [:new, :create, :index, :show] do resources :products, only: [:index] end 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 c338622639fd4e912c4e5db4b9186024facda35f Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Sun, 22 Apr 2018 20:52:32 -0700 Subject: [PATCH 077/236] More updates to homepage --- app/assets/stylesheets/application.css | 15 +++++++++++++++ app/views/products/root.html.erb | 25 +++++++++++++++---------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index a96cadd4a1..754557e6a5 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -21,3 +21,18 @@ form { padding: 2em; } + + #home-background-img { + background-repeat: no-repeat; + background-size: cover; + background-position: center; + padding-top: 20px; + } + + .home-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: 7em; +} diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index e71a759537..e61b951304 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -1,15 +1,18 @@ -

SWEATSY

- -

Get ready to get sweaty!

- - +
+ homepage +
+

SWEATSY

+
+

Get ready to get sweaty!

+
+
-
About Sweatsy
-

+
Our Story
+

Storify Dan Fleckner Robin Sloan hashtag future of context The Work of Art in the Age of Mechanical Reproduction fourth estate semipermeable newspaper strike fair use hyperlocal West Seattle Blog process vs. product, startups discuss production of innocence commons-based peer production hashtag paidContent Ushahidi I saw it on Mediagazer trolls dingbat David Foster Wallace crowdsourcing, net neutrality Neil Postman analytics Walter Cronkite died for your sins Gutenberg afternoon paper TechCrunch NPR fair use Innovator's Dilemma +1.

-
Browse Top Products
+
Browse Top Products
<% @products.each do |product|%>
  • <%= product.name %>
  • <% end %> @@ -18,7 +21,7 @@
    -
    Browse by Category
    +
    Browse by Category
      <% @categories.each do |category|%>
    • <%= category.name %>
    • @@ -28,11 +31,13 @@
    -
    See Top Sellers
    +
    See Top Sellers
      <% @merchants.each do |merchant|%>
    • <%= merchant.username %>
    • <% end %>
    <%= link_to "See More", merchants_path %> +
    + <%= link_to "Sign Up to Sell", new_merchant_path %>
    From 98cdf2bd02fbd25251274c9f4c26e4d55f909e1f Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Sun, 22 Apr 2018 20:54:23 -0700 Subject: [PATCH 078/236] Add links to navbar --- app/views/layouts/application.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 58d7c47301..e6c0ad5a16 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -20,8 +20,8 @@
  • Browse
  • From 0915f1eedf494a2c93763a9067a9f03756faf965 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Mon, 23 Apr 2018 08:41:47 -0700 Subject: [PATCH 079/236] Add background image to homepage --- app/assets/stylesheets/application.css | 1 + app/views/products/show.html.erb | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 754557e6a5..b7083874d8 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -23,6 +23,7 @@ } #home-background-img { + background-image: url('home_img.jpg'); background-repeat: no-repeat; background-size: cover; background-position: center; diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 599f35960f..0d9fea5380 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -10,7 +10,6 @@
    - placeholder photo

    <%= @product.name %>

    <%=number_to_currency(@product.price)%> @@ -32,4 +31,3 @@ <%= link_to "Write a Review", new_product_review_path(@product.id) %>

    - From 78160c82e0362607b3d3ea22a5c9aef5a7b02726 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Mon, 23 Apr 2018 08:50:56 -0700 Subject: [PATCH 080/236] Fix navbar dropdown sticking issue --- app/assets/javascripts/application.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index f04673be81..bbeccf9c77 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -14,7 +14,6 @@ // //= require rails-ujs //= require foundation -//= require turbolinks //= require_tree . $(function(){ $(document).foundation(); }); From ea8748e55c8bb585500fd501ecddd8f48dde3716 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Mon, 23 Apr 2018 08:56:59 -0700 Subject: [PATCH 081/236] Change color on homepage title text for readability --- app/assets/stylesheets/application.css | 65 +++++++++++++++----------- app/views/products/root.html.erb | 5 +- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index b7083874d8..a2450a3bd9 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1,39 +1,50 @@ /* - * 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 normalize-rails +* 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 normalize-rails - * - *= require_tree . - *= require_self - *= require foundation_and_overrides +* +*= require_tree . +*= require_self +*= require foundation_and_overrides - */ +*/ - form { - padding: 2em; - } +form { + padding: 2em; +} - #home-background-img { - background-image: url('home_img.jpg'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - padding-top: 20px; - } +#home-background-img { + background-image: url('home_img.jpg'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + padding-top: 2em; + height: 22em; +} - .home-container { +.home-container { display: flex; flex-direction: column; justify-content: center; align-items: center; margin-top: 7em; } + + +.homepage-title { + color: #fff; + font-weight: bold; + font-size: 2.75em; + text-shadow: 0px 4px 3px rgba(0,0,0,0.8), + 0px 8px 13px rgba(0,0,0,0.4), + 0px 18px 23px rgba(0,0,0,0.4); +} diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index e61b951304..4a2fbca673 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -1,9 +1,8 @@
    - homepage
    -

    SWEATSY

    +

    SWEATSY

    -

    Get ready to get sweaty!

    +

    Get ready to get sweaty!

    From 42d1320695dad317a351a346d983a59abb19bc69 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Mon, 23 Apr 2018 09:11:46 -0700 Subject: [PATCH 082/236] Make Sweatsy at top of navbar to home button --- 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 e6c0ad5a16..4176c2fefc 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -16,7 +16,7 @@
    -

    <%= @product.name %>

    +
    + placeholder image +
    <%=number_to_currency(@product.price)%>

    <%= @product.description %> @@ -20,8 +22,8 @@ <%= @product.available %> Available

    -

    - <%= link_to 'Add to cart'%> +

    + <%= link_to 'Add to cart', '#' %>

    From 65ac342d9cbd3188b6cd9fe427a4e51172d391d6 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 10:14:54 -0700 Subject: [PATCH 087/236] added review form to product show page --- app/views/products/show.html.erb | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 2b8eb3b47b..df87110c67 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -29,7 +29,17 @@

    Enjoyed this product? Write a review

    -

    + <%= f.label :rating %> + <%= f.select :rating, (1..5) %> + + <%= f.label :description %> + <%= f.text_field :description %> + + <%= f.submit %> + <% end %> +

    From 5d8fa8990012a9e4e2460a9bec95470b5a04380f Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 10:23:56 -0700 Subject: [PATCH 088/236] product review gets logged correctly --- 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 df87110c67..e4a97e5db6 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -30,7 +30,7 @@

    Enjoyed this product? Write a review

    - <%= form_for :review do |f| %> + <%= form_for :review, url: product_reviews_path(@product.id) do |f| %> <%= f.label :rating %> <%= f.select :rating, (1..5) %> From e58e121e871acf63145bd768fde51479c4fd4801 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 10:46:53 -0700 Subject: [PATCH 089/236] built average rating calculation for product show page --- app/controllers/reviews_controller.rb | 4 ++++ app/models/product.rb | 13 ++++++++++++- app/views/products/show.html.erb | 11 +++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index c3288a5ce3..230fa7ca2a 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -4,6 +4,10 @@ def new @review = Review.new end + def index + @reviews = Review.all + end + def create @review = Review.new(review_params) # @review.assign_attributes(product_id: params[:product_id]) diff --git a/app/models/product.rb b/app/models/product.rb index eba8157e3f..2e49f15b13 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,6 +1,6 @@ class Product < ApplicationRecord has_many :order_products - has_many :reviews, dependent: :destroy + has_many :reviews, dependent: :destroy has_many :orders, through: :order_products has_and_belongs_to_many :categories belongs_to :merchant @@ -10,4 +10,15 @@ class Product < ApplicationRecord validates :price, presence: true validates :price, numericality: { only_integer: true, greater_than: 0} + def average_rating + reviews = self.reviews + + review_count = reviews.count + + ratings = reviews.map { |review| review.rating} + ratings_sum = ratings.inject { |sum, rating| sum + rating } + + return (ratings_sum.to_f / review_count.to_f).round(2) + end + end diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e4a97e5db6..338b8fc40a 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -27,6 +27,17 @@

    +
    +
    Average Review: <%= @product.average_rating %>
    + +
      + <% @product.reviews.each do |review| %> +
    • <%= review.rating %>
    • +
    • <%= review.description %>
    • + <% end %> +
    +
    +

    Enjoyed this product? Write a review

    From aa8aa0020544050fe7c31c94a63e39a30f78a4c9 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 10:49:47 -0700 Subject: [PATCH 090/236] transferred review calculation logic to prodct model --- app/models/review.rb | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index feb2be3016..1ce5009168 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -3,18 +3,4 @@ class Review < ApplicationRecord validates :description, presence: true belongs_to :product - def total - self.count - end - - def average - reviews = Review.all - review_count = reviews.count - - ratings = reviews.map { |review| review.rating} - ratings_sum = ratings.inject { |sum, rating| sum + rating } - - return ratings_sum / review_count - end - end From fea8a2adc9bc892bfbc682cf2ed6e0621193f905 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 10:59:04 -0700 Subject: [PATCH 091/236] created reviews table on product show page --- app/views/products/show.html.erb | 35 ++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 338b8fc40a..9e3c8bf331 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -30,27 +30,36 @@
    Average Review: <%= @product.average_rating %>
    -
      - <% @product.reviews.each do |review| %> -
    • <%= review.rating %>
    • -
    • <%= review.description %>
    • - <% end %> -
    +

    All Reviews

    + + + + + + + <% @product.reviews.each do |review| %> + + + + + <% end %> + +
    RatingDescription
    <%= review.rating %><%= review.description %>

    Enjoyed this product? Write a review

    <%= form_for :review, url: product_reviews_path(@product.id) do |f| %> - <%= f.label :rating %> - <%= f.select :rating, (1..5) %> + <%= f.label :rating %> + <%= f.select :rating, (1..5) %> - <%= f.label :description %> - <%= f.text_field :description %> + <%= f.label :description %> + <%= f.text_field :description %> - <%= f.submit %> + <%= f.submit %> <% end %> + <%= link_to "Write a Review", new_product_review_path(@product.id) %> +

    -->
    From 41195bac698c98bb14b7f21298561fd08fad6b59 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 11:36:06 -0700 Subject: [PATCH 092/236] completed review model tests --- app/models/review.rb | 2 +- test/fixtures/reviews.yml | 4 +- test/models/review_test.rb | 78 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/app/models/review.rb b/app/models/review.rb index 1ce5009168..8fb94200d3 100644 --- a/app/models/review.rb +++ b/app/models/review.rb @@ -1,6 +1,6 @@ class Review < ApplicationRecord validates :rating, presence: true + validates_numericality_of :rating, only_integer: true, :greater_than_or_equal_to => 1, :less_than_or_equal_to => 5 validates :description, presence: true belongs_to :product - end diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index 1f37113c10..de9a25ae04 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -6,10 +6,10 @@ # one: rating: 1 - description: This is review number one + description: This review is for product 1 product: hb two: rating: 2 - description: This is review number two + description: This is review is for product 2 product: water diff --git a/test/models/review_test.rb b/test/models/review_test.rb index ce8378a033..09b8b33835 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -1,9 +1,81 @@ require "test_helper" describe Review do - let(:review) { Review.new } + describe 'validations' do + it "creates a review with complete form data" do + product_id = Product.first.id + old_review_count = Review.count - it "must be valid" do - value(review).must_be :valid? + review = Review.new(rating: 5, description: 'test review', product_id: product_id ) + review.save + + review.valid?.must_equal true + Review.count.must_equal old_review_count + 1 + Review.last.description.must_equal 'test review' + end + + it "rejects a review with non-numeric rating" do + product_id = Product.first.id + old_review_count = Review.count + + review = Review.new(rating: '10', description: 'test review', product_id: product_id ) + review.save + + review.valid?.must_equal false + Review.count.must_equal old_review_count + end + + it "rejects a review without description" do + product_id = Product.first.id + old_review_count = Review.count + + review = Review.new(rating: 1, product_id: product_id ) + review.save + + review.valid?.must_equal false + Review.count.must_equal old_review_count + end + + it "rejects a review without rating" do + product_id = Product.first.id + old_review_count = Review.count + + review = Review.new(description: 'test review', product_id: product_id ) + review.save + + review.valid?.must_equal false + Review.count.must_equal old_review_count + end + + it "rejects review with rating less than 1" do + product_id = Product.first.id + old_review_count = Review.count + + review = Review.new(rating: 0, description: 'test review', product_id: product_id ) + review.save + + review.valid?.must_equal false + Review.count.must_equal old_review_count + end + + it "rejects review with rating greater than 5" do + product_id = Product.first.id + old_review_count = Review.count + + review = Review.new(rating: 6, description: 'test review', product_id: product_id ) + review.save + + review.valid?.must_equal false + Review.count.must_equal old_review_count + end + end + + describe 'relations' do + it "must respond to products" do + review = Review.first + + review.must_respond_to :product + review.product.must_be_kind_of Product + end end end From 3857a2227a845666c39b959bee6b62fc281fbb6e Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 11:49:28 -0700 Subject: [PATCH 093/236] moved average rating method to product helpers and updated views accordingly --- app/helpers/products_helper.rb | 10 ++++++++++ app/models/product.rb | 20 ++++++++++---------- app/views/products/index.html.erb | 3 +-- app/views/products/show.html.erb | 2 +- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb index ab5c42b325..6b08c5324c 100644 --- a/app/helpers/products_helper.rb +++ b/app/helpers/products_helper.rb @@ -1,2 +1,12 @@ module ProductsHelper + def average_rating(product) + reviews = product.reviews + + review_count = reviews.count + + ratings = reviews.map { |review| review.rating} + ratings_sum = ratings.inject { |sum, rating| sum + rating } + + return (ratings_sum.to_f / review_count.to_f).round(2) + end end diff --git a/app/models/product.rb b/app/models/product.rb index 2e49f15b13..ad8fcbf3bb 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -10,15 +10,15 @@ class Product < ApplicationRecord validates :price, presence: true validates :price, numericality: { only_integer: true, greater_than: 0} - def average_rating - reviews = self.reviews - - review_count = reviews.count - - ratings = reviews.map { |review| review.rating} - ratings_sum = ratings.inject { |sum, rating| sum + rating } - - return (ratings_sum.to_f / review_count.to_f).round(2) - end + # def average_rating + # reviews = self.reviews + # + # review_count = reviews.count + # + # ratings = reviews.map { |review| review.rating} + # ratings_sum = ratings.inject { |sum, rating| sum + rating } + # + # return (ratings_sum.to_f / review_count.to_f).round(2) + # end end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 086296275d..d9f2a9278e 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -31,14 +31,13 @@
    -

    Ratings!

    +

    Average Rating <%= average_rating(product) %>

    Reviews

    <% end%> -
    • Previous
    • diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 9e3c8bf331..7706dbcfec 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -28,7 +28,7 @@
    -
    Average Review: <%= @product.average_rating %>
    +
    Average Review: <%= average_rating(@product) %>

    All Reviews

    From 4c4efac1ddc8952748c2bb96c5670af9d09381d7 Mon Sep 17 00:00:00 2001 From: Kiera Date: Mon, 23 Apr 2018 12:05:23 -0700 Subject: [PATCH 094/236] updated controller index to call new model method products_by_category. Moved two order helper methods to the order model updated corresponding order view to reflect change. --- app/controllers/application_controller.rb | 3 +++ app/controllers/categories_controller.rb | 2 +- app/helpers/orders_helper.rb | 22 --------------- app/models/category.rb | 8 ++++++ app/models/order.rb | 23 +++++++++++++--- app/views/categories/index.html.erb | 33 +++++++++++++++++++++++ app/views/orders/show.html.erb | 6 ++--- config/routes.rb | 2 +- db/seeds.rb | 2 -- 9 files changed, 68 insertions(+), 33 deletions(-) create mode 100644 app/views/categories/index.html.erb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1c07694e9d..7bbfc88632 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,6 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + + + end diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 7f9ec5639a..8027a445c4 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,7 +1,7 @@ class CategoriesController < ApplicationController def index - @categories = Category.all + @products_by_category = Category.products_by_category end def new diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb index b2f1a7c6b8..c13e09a66e 100644 --- a/app/helpers/orders_helper.rb +++ b/app/helpers/orders_helper.rb @@ -12,26 +12,4 @@ def date_placed @order.updated_at.strftime("%B %d, %Y") + " at " + @order.updated_at.strftime("%I: %M %p") end - def products_in_order - all_products = [] - @order.products.each do |p| - all_products << p - end - return all_products - end - - def quantity_in_order(product) - @order.order_products.find_by(product_id: product.id).quantity - end - - # can i use a price function in product? - def product_subtotal(product) - quant = quantity_in_order(product) - price = product.price - return quant * price - end - - def order_total - end - end diff --git a/app/models/category.rb b/app/models/category.rb index c6a8c69b0a..6a0a1486fa 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -2,4 +2,12 @@ class Category < ApplicationRecord has_and_belongs_to_many :products validates :name, presence: true validates :name, uniqueness: true + + def self.products_by_category + cat_prod = {} + all.each do |c| + cat_prod[c] = c.products + end + return cat_prod + end end diff --git a/app/models/order.rb b/app/models/order.rb index 28c9608d87..7bc610b345 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -8,18 +8,33 @@ class Order < ApplicationRecord validates :email, presence: true, format: {with: /@/, message: "Must include @"} validates :address, presence: true, format: { with: /\A[\d]+/, - message: "Must start with digits" } + message: "Must start with digits" } validates :cc_num, presence: true, format: { with: /\A[\d]{16}\z/, - message: "Digits only" } + message: "Digits only" } validates :expiry_date, presence: true, format: { with: /\A[\d]{4}\z/, - message: "Digits only" } + message: "Digits only" } validates :cc_cvv, presence: true, format: { with: /\A[\d]{3}\z/, - message: "Digits only" } + message: "Digits only" } validates :zip, presence: true, format: { with: /\A[\d]+\z/, message: "Digits only" } + def quantity_in_order(product) + self.order_products.find_by(product_id: product.id).quantity + end + + # can i use a price function in product? + def product_subtotal(product) + quant = quantity_in_order(product) + price = product.price + return quant * price + end + + def order_total + end + + end diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb new file mode 100644 index 0000000000..035b46b716 --- /dev/null +++ b/app/views/categories/index.html.erb @@ -0,0 +1,33 @@ +

    All products by category

    + + + + + <% @products_by_category.each do | c, prods | %> + +

    <%= " #{c.name.capitalize}" %>

    + +
      + <% prods.each do |p| %> +
    • +
      + +
      + +
      +
      <%=link_to p.name, product_path(p) %>
      +
      <%= number_to_currency(p.price) %>
      +

      <%= p.description %>

      +

      <%= p.available%> Available

      +
      + +
      +

      Ratings!

      +

      Reviews

      +
      + +
    • + <% end %> +
    + +<% end %> diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index 5a3d39e10d..a8e52654fe 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -15,11 +15,11 @@

    Items

    - <% products_in_order.each do |p| %> + <% @order.products.each do |p| %>
    • <%= p.name %>
    • -
    • <%= quantity_in_order(p) %>
    • -
    • <%= number_to_currency product_subtotal(p) %>
    • +
    • <%= @order.quantity_in_order(p) %>
    • +
    • <%= number_to_currency @order.product_subtotal(p) %>
    <% end %> diff --git a/config/routes.rb b/config/routes.rb index 014fd406e9..6eb489703a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -10,7 +10,7 @@ resources :orders, only: [:show, :new, :create] resources :categories, only: [:new, :create, :index, :show] do - resources :products, only: [:index] + resources :product, only: [:root] end resources :merchants, except: [:edit, :update, :destroy] do diff --git a/db/seeds.rb b/db/seeds.rb index 7ccabe904d..f132ef86f1 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -85,8 +85,6 @@ if !successful product_failures << product puts "Failed to save product: #{product.inspect}" - puts "XXXXXXXXXX" - puts product.errors.messages else puts "Created product: #{product.inspect}" end From eeaca59b126fca010404ddd36ac6408dadf1d72d Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 13:22:14 -0700 Subject: [PATCH 095/236] reviews save if valid; and dont save if mssing info --- app/controllers/products_controller.rb | 21 ++++++++++++++++++- app/controllers/reviews_controller.rb | 8 +++---- app/models/product.rb | 12 ----------- config/routes.rb | 2 +- test/controllers/reviews_controller_test.rb | 23 ++++++++++++--------- test/fixtures/products.yml | 7 +++---- test/fixtures/reviews.yml | 4 ++-- 7 files changed, 42 insertions(+), 35 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index fe180bd261..8537c671c1 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -29,6 +29,22 @@ def create end end +# TODO: attempted to move review creation to products controller but kept getting UnKNownMethodError on merchant and products (evaluated to nil) + # def create_review + # @review = Review.new(review_params) + # @review.product_id = params[:id] + # + # if @review.save + # redirect_to product_path(@product.id) + # else + # flash[:error] = "You must submit a rating of 1-5 and a description." + # @product = Product.find_by(id: params[:product_id]) + # # id = @product.id + # puts "line 43 executed" + # render :show, status: :bad_request + # end + # end + def edit; end def show; end @@ -59,5 +75,8 @@ def find_product def product_params return params.require(:product).permit(:name, :price, :available, :merchant_id) end - + private + # def review_params + # return params.require(:review).permit(:rating, :description) + # end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 230fa7ca2a..ad373a37f3 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -4,10 +4,6 @@ def new @review = Review.new end - def index - @reviews = Review.all - end - def create @review = Review.new(review_params) # @review.assign_attributes(product_id: params[:product_id]) @@ -17,7 +13,9 @@ def create redirect_to product_path(@review.product_id) else flash[:error] = "You must submit a rating of 1-5 and a description." - render :new + @product = Product.find_by(id: params[:product_id]) + # id = @product.id + render 'products/show', status: :bad_request end end diff --git a/app/models/product.rb b/app/models/product.rb index ad8fcbf3bb..d9d4f2848e 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -9,16 +9,4 @@ class Product < ApplicationRecord validates :name, uniqueness: true validates :price, presence: true validates :price, numericality: { only_integer: true, greater_than: 0} - - # def average_rating - # reviews = self.reviews - # - # review_count = reviews.count - # - # ratings = reviews.map { |review| review.rating} - # ratings_sum = ratings.inject { |sum, rating| sum + rating } - # - # return (ratings_sum.to_f / review_count.to_f).round(2) - # end - end diff --git a/config/routes.rb b/config/routes.rb index 014fd406e9..d4bf4ac8b9 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 'products#root' - +post '/products/:id/add_review', to: 'products#create_review', as: :create_review resources :products do resources :reviews, only: [:new, :show, :create] end diff --git a/test/controllers/reviews_controller_test.rb b/test/controllers/reviews_controller_test.rb index e8a88084cd..f86912b9a2 100644 --- a/test/controllers/reviews_controller_test.rb +++ b/test/controllers/reviews_controller_test.rb @@ -2,16 +2,6 @@ require 'pry' describe ReviewsController do - describe 'new' do - it "succeeds" do - product_id = Product.first.id - - get new_product_review_path(product_id) - - must_respond_with :success - end - end - describe 'create' do it "creates a review with valid data" do product_id = Product.first.id @@ -27,5 +17,18 @@ Review.count.must_equal old_review_count + 1 Review.last.description.must_equal 'review description' end + + it "responds with bad request for missing input" do + product_id = Product.first.id + review_data = { description: 'review description', product_id: product_id } + + old_review_count = Review.count + + Review.new(review_data).wont_be :valid? + post product_reviews_path(product_id), params: { review: review_data} + + must_respond_with :bad_request + Review.count.must_equal old_review_count + end end end diff --git a/test/fixtures/products.yml b/test/fixtures/products.yml index 7c6dcf7a31..5564084b12 100644 --- a/test/fixtures/products.yml +++ b/test/fixtures/products.yml @@ -4,20 +4,19 @@ hb: name: headband price: 10 available: 6 - merchant_id: 1 + merchant: merchant_one categories: accessories water: name: bottled water price: 1 available: 100 - merchant_id: 1 + merchant: merchant_two categories: accessories - pants: name: sweatpants price: 20 available: 10 - merchant_id: 2 + merchant: merchant_two categories: pants diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index de9a25ae04..224e299f8e 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -7,9 +7,9 @@ one: rating: 1 description: This review is for product 1 - product: hb + product_id: hb two: rating: 2 description: This is review is for product 2 - product: water + product_id: water From fcc98b9b9084ef851d2a3dab5985bd4918774b1a Mon Sep 17 00:00:00 2001 From: Kiera Date: Mon, 23 Apr 2018 13:40:11 -0700 Subject: [PATCH 096/236] update products index view add link to merchant. --- app/controllers/products_controller.rb | 7 ++++++- app/models/category.rb | 1 + app/views/categories/show.html.erb | 24 ++++++++++++++++++++++++ app/views/merchants/index.html.erb | 2 +- app/views/products/index.html.erb | 4 +++- 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 app/views/categories/show.html.erb diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index fe180bd261..4915b7c456 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -8,7 +8,12 @@ def root end def index - @products = Product.all + merch_id = params[:merchant_id] + if merch_id.nil? + @products = Product.all + else + @products = Merchant.find(merch_id).products + end end def new diff --git a/app/models/category.rb b/app/models/category.rb index 6a0a1486fa..6c04ea00fe 100644 --- a/app/models/category.rb +++ b/app/models/category.rb @@ -10,4 +10,5 @@ def self.products_by_category end return cat_prod end + end diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb new file mode 100644 index 0000000000..bd04340f6f --- /dev/null +++ b/app/views/categories/show.html.erb @@ -0,0 +1,24 @@ +

    <%= @category.name.capitalize %>

    + +
      + <% @category.products.each do |p| %> +
    • +
      + +
      + +
      +
      <%=link_to p.name, product_path(p) %>
      +
      <%= number_to_currency(p.price) %>
      +

      <%= p.description %>

      +

      <%= p.available%> Available

      +
      + +
      +

      Ratings!

      +

      Reviews

      +
      + +
    • + <% end %> +
    diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 815a2529a2..530f335401 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -21,7 +21,7 @@

    - <%= link_to merchant.username.capitalize, merchant_path(merchant) %> + <%= link_to merchant.username.capitalize, merchant_products_path(merchant.id) %>

    diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 086296275d..757ce04218 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -1,6 +1,8 @@
    -

    Everything you need to stay DRY

    +

    + All products +

      From 0961975b40527bca5594dbb4eb8abe19391cc0ea Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Mon, 23 Apr 2018 14:05:39 -0700 Subject: [PATCH 097/236] Add config lines so images will appear when delopyed --- config/environments/production.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/environments/production.rb b/config/environments/production.rb index 9284f84839..f97f2af958 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -79,7 +79,9 @@ # Use a different logger for distributed setups. # require 'syslog/logger' # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name') - + config.serve_static_assets = true + config.assets.compile = true + if ENV["RAILS_LOG_TO_STDOUT"].present? logger = ActiveSupport::Logger.new(STDOUT) logger.formatter = config.log_formatter From 74ea9342ab555ad6453c38a50d2ec7f0c3cc2379 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 16:13:19 -0700 Subject: [PATCH 098/236] deleting extraneous code and custom route for reviews --- app/controllers/products_controller.rb | 24 ++++-------------------- app/controllers/reviews_controller.rb | 1 + config/routes.rb | 2 +- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index a50bdcb144..1779a389f8 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -33,23 +33,7 @@ def create render :new, status: :bad_request end end - -# TODO: attempted to move review creation to products controller but kept getting UnKNownMethodError on merchant and products (evaluated to nil) - # def create_review - # @review = Review.new(review_params) - # @review.product_id = params[:id] - # - # if @review.save - # redirect_to product_path(@product.id) - # else - # flash[:error] = "You must submit a rating of 1-5 and a description." - # @product = Product.find_by(id: params[:product_id]) - # # id = @product.id - # puts "line 43 executed" - # render :show, status: :bad_request - # end - # end - + def edit; end def show; end @@ -81,7 +65,7 @@ def product_params return params.require(:product).permit(:name, :price, :available, :merchant_id) end private - # def review_params - # return params.require(:review).permit(:rating, :description) - # end + def review_params + return params.require(:review).permit(:rating, :description) + end end diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index ad373a37f3..df319424ad 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -15,6 +15,7 @@ def create flash[:error] = "You must submit a rating of 1-5 and a description." @product = Product.find_by(id: params[:product_id]) # id = @product.id + # render 'products/show', status: :bad_request render 'products/show', status: :bad_request end end diff --git a/config/routes.rb b/config/routes.rb index 0ef1641991..897a779d0a 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 'products#root' -post '/products/:id/add_review', to: 'products#create_review', as: :create_review + resources :products do resources :reviews, only: [:new, :show, :create] end From 1657bc2a95f937b726c96fe04e87fe4dfac17ed3 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Mon, 23 Apr 2018 16:14:50 -0700 Subject: [PATCH 099/236] Added current order method to app controller --- app/controllers/application_controller.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 7bbfc88632..5165d1dfbd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,13 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception + helper_method :current_order - + def current_order + if session[:order_id] + Order.find(session[:order_id]) + else + Order.new + end + end end From 8c0d7fd510869d5aad336e26abe8f9175b504dcf Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Mon, 23 Apr 2018 16:26:54 -0700 Subject: [PATCH 100/236] Modified index method in products and added order_products controller --- app/assets/javascripts/order_products.js | 2 ++ app/assets/stylesheets/order_products.scss | 3 +++ app/controllers/order_products_controller.rb | 2 ++ app/controllers/products_controller.rb | 1 + app/helpers/order_products_helper.rb | 2 ++ app/views/products/index.html.erb | 10 +++++++++- test/controllers/order_products_controller_test.rb | 7 +++++++ 7 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/order_products.js create mode 100644 app/assets/stylesheets/order_products.scss create mode 100644 app/controllers/order_products_controller.rb create mode 100644 app/helpers/order_products_helper.rb create mode 100644 test/controllers/order_products_controller_test.rb 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/stylesheets/order_products.scss b/app/assets/stylesheets/order_products.scss new file mode 100644 index 0000000000..4e38cdae9b --- /dev/null +++ b/app/assets/stylesheets/order_products.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the OrderProducts 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/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/products_controller.rb b/app/controllers/products_controller.rb index a50bdcb144..30968e00b6 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -11,6 +11,7 @@ def index merch_id = params[:merchant_id] if merch_id.nil? @products = Product.all + @order_product = current_order.order_products.new else @products = Merchant.find(merch_id).products 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/views/products/index.html.erb b/app/views/products/index.html.erb index 3583edc28f..965e42b0ef 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -34,8 +34,16 @@

      Average Rating <%= average_rating(product) %>

      -

      Reviews

      + +
      + <%= form_for @order_products do |f| %> + <%= f.hidden_field :product_id, value: product.id %> + <%= f.number_field :quantity %> + <%= f.submit "Add to cart" %> + <% 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 From f2e5ec1c8619deec389dea50ee8747cbf8cdafb2 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Mon, 23 Apr 2018 16:39:39 -0700 Subject: [PATCH 101/236] Added routes for order_products --- app/controllers/order_products_controller.rb | 3 +++ app/views/products/index.html.erb | 4 ++-- config/routes.rb | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 8fc2a16bfe..6e2387ef7c 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,2 +1,5 @@ class OrderProductsController < ApplicationController + + + end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 965e42b0ef..8e38e8eee8 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -37,11 +37,11 @@
    - <%= form_for @order_products do |f| %> + <%= form_for @order_product do |f| %> <%= f.hidden_field :product_id, value: product.id %> <%= f.number_field :quantity %> <%= f.submit "Add to cart" %> - <% end %> + <% end %>
    diff --git a/config/routes.rb b/config/routes.rb index 0ef1641991..96e86d7122 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,6 +9,9 @@ resources :orders, only: [:show, :new, :create] + # may not need all routes for order_products + resources :order_products + resources :categories, only: [:new, :create, :index, :show] do resources :product, only: [:root] end From a5d8ade1e461b78fb7d4fe761a9e865229c2d5ad Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Mon, 23 Apr 2018 16:55:13 -0700 Subject: [PATCH 102/236] Generate carts controller --- app/assets/javascripts/carts.js | 2 ++ app/assets/stylesheets/carts.scss | 3 +++ app/controllers/carts_controller.rb | 2 ++ app/controllers/order_products_controller.rb | 11 +++++++++++ app/helpers/carts_helper.rb | 2 ++ app/views/products/index.html.erb | 4 ++-- test/controllers/carts_controller_test.rb | 7 +++++++ 7 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/carts.js create mode 100644 app/assets/stylesheets/carts.scss create mode 100644 app/controllers/carts_controller.rb create mode 100644 app/helpers/carts_helper.rb create mode 100644 test/controllers/carts_controller_test.rb diff --git a/app/assets/javascripts/carts.js b/app/assets/javascripts/carts.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/carts.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/carts.scss b/app/assets/stylesheets/carts.scss new file mode 100644 index 0000000000..2fe1b9e710 --- /dev/null +++ b/app/assets/stylesheets/carts.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the Carts 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/carts_controller.rb b/app/controllers/carts_controller.rb new file mode 100644 index 0000000000..db5babd3e0 --- /dev/null +++ b/app/controllers/carts_controller.rb @@ -0,0 +1,2 @@ +class CartsController < ApplicationController +end diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 6e2387ef7c..8c9319c24c 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,5 +1,16 @@ class OrderProductsController < ApplicationController + def create + @order = current_order + @item = @order.order_products.new(item_params) + @order.save + session[:order_id] = @order.id + redirect_to products_path + end + private + def item_params + params.require(:order_product).permit(:quantity, :product_id) + end end diff --git a/app/helpers/carts_helper.rb b/app/helpers/carts_helper.rb new file mode 100644 index 0000000000..d99c380cb5 --- /dev/null +++ b/app/helpers/carts_helper.rb @@ -0,0 +1,2 @@ +module CartsHelper +end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 8e38e8eee8..58b507c8e0 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -36,11 +36,11 @@

    Average Rating <%= average_rating(product) %>

    -
    +
    <%= form_for @order_product do |f| %> <%= f.hidden_field :product_id, value: product.id %> <%= f.number_field :quantity %> - <%= f.submit "Add to cart" %> + <%= f.submit "Add to cart", class: "button" %> <% end %>
    diff --git a/test/controllers/carts_controller_test.rb b/test/controllers/carts_controller_test.rb new file mode 100644 index 0000000000..f6b1fd8761 --- /dev/null +++ b/test/controllers/carts_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe CartsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From 23496b9d614eae91570c6b77cb0e147154cf0a9d Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Mon, 23 Apr 2018 16:57:23 -0700 Subject: [PATCH 103/236] Added carts controller and cart show route --- app/controllers/carts_controller.rb | 5 +++++ config/routes.rb | 1 + 2 files changed, 6 insertions(+) diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index db5babd3e0..a0b78e2003 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -1,2 +1,7 @@ class CartsController < ApplicationController + + def show + @order_products = current_order.order_products + end + end diff --git a/config/routes.rb b/config/routes.rb index 96e86d7122..031255d80d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,6 +11,7 @@ # may not need all routes for order_products resources :order_products + resources :cart, only: [:show] resources :categories, only: [:new, :create, :index, :show] do resources :product, only: [:root] From 6fe1ab6ca17b2af22c1f043a8dbb2286b821c3c7 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Mon, 23 Apr 2018 16:58:50 -0700 Subject: [PATCH 104/236] changed login buttons to route to oauth; created sessions controller --- .gitignore | 1 + Gemfile | 3 +++ Gemfile.lock | 28 ++++++++++++++++++++ app/assets/javascripts/sessions.js | 2 ++ app/assets/stylesheets/sessions.scss | 3 +++ app/controllers/sessions_controller.rb | 2 ++ app/helpers/sessions_helper.rb | 2 ++ app/views/layouts/application.html.erb | 6 ++--- config/initializers/omniauth.rb | 3 +++ config/routes.rb | 5 ++++ test/controllers/sessions_controller_test.rb | 7 +++++ 11 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/sessions.js create mode 100644 app/assets/stylesheets/sessions.scss create mode 100644 app/controllers/sessions_controller.rb create mode 100644 app/helpers/sessions_helper.rb create mode 100644 config/initializers/omniauth.rb create mode 100644 test/controllers/sessions_controller_test.rb diff --git a/.gitignore b/.gitignore index 9b351fa781..b1e910d4cf 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ .byebug_history .DS_Store +.env diff --git a/Gemfile b/Gemfile index 5a2489b67b..658789f98b 100644 --- a/Gemfile +++ b/Gemfile @@ -34,6 +34,8 @@ gem 'jbuilder', '~> 2.5' # gem 'capistrano-rails', group: :development gem 'simplecov', require: false, group: :test +gem "omniauth" +gem "omniauth-github" group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console @@ -50,6 +52,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 bfea144982..8330f49f9f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -69,8 +69,14 @@ GEM crass (1.0.4) debug_inspector (0.0.3) docile (1.1.5) + dotenv (2.2.2) + dotenv-rails (2.2.2) + dotenv (= 2.2.2) + railties (>= 3.2, < 6.0) erubi (1.7.1) execjs (2.7.0) + faraday (0.12.2) + multipart-post (>= 1.2, < 3) ffi (1.9.23) foundation-rails (6.4.3.0) railties (>= 3.1.0) @@ -78,6 +84,7 @@ GEM sprockets-es6 (>= 0.9.0) globalid (0.4.1) activesupport (>= 4.2.0) + hashie (3.5.7) i18n (1.0.1) concurrent-ruby (~> 1.0) jbuilder (2.7.0) @@ -91,6 +98,7 @@ GEM railties (>= 3.1.0) turbolinks json (2.1.0) + jwt (1.5.6) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) @@ -113,10 +121,27 @@ GEM minitest (>= 5.0) ruby-progressbar multi_json (1.13.1) + multi_xml (0.6.0) + multipart-post (2.0.0) nio4r (2.3.0) nokogiri (1.8.2) mini_portile2 (~> 2.3.0) normalize-rails (4.1.1) + 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.8.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.5.0) + oauth2 (~> 1.1) + omniauth (~> 1.2) pg (1.0.0) pry (0.11.3) coderay (~> 1.1.0) @@ -218,6 +243,7 @@ DEPENDENCIES binding_of_caller byebug capybara (~> 2.13) + dotenv-rails foundation-rails jbuilder (~> 2.5) jquery-rails @@ -226,6 +252,8 @@ DEPENDENCIES minitest-rails minitest-reporters normalize-rails + omniauth + omniauth-github pg (>= 0.18, < 2.0) pry-rails puma (~> 3.7) diff --git a/app/assets/javascripts/sessions.js b/app/assets/javascripts/sessions.js new file mode 100644 index 0000000000..dee720facd --- /dev/null +++ b/app/assets/javascripts/sessions.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/sessions.scss b/app/assets/stylesheets/sessions.scss new file mode 100644 index 0000000000..7bef9cf826 --- /dev/null +++ b/app/assets/stylesheets/sessions.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the sessions 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/sessions_controller.rb b/app/controllers/sessions_controller.rb new file mode 100644 index 0000000000..16d11b5710 --- /dev/null +++ b/app/controllers/sessions_controller.rb @@ -0,0 +1,2 @@ +class SessionsController < ApplicationController +end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 0000000000..309f8b2eb3 --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,2 @@ +module SessionsHelper +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4176c2fefc..f7febb50ce 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -30,10 +30,8 @@
    - + <%= link_to "Already a Merchant? Login!", github_login_path, class: "button" %> + <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button' %>
    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 897a779d0a..25b2b92b51 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,12 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'products#root' + + get '/auth/github', as: 'github_login' + post '/logout', to: 'sessions#logout', as: 'logout' + get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' + resources :products do resources :reviews, only: [:new, :show, :create] end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb new file mode 100644 index 0000000000..c2632a720b --- /dev/null +++ b/test/controllers/sessions_controller_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +describe SessionsController do + # it "must be a real test" do + # flunk "Need real tests" + # end +end From 80d4e79bd63c10ffe5dd96ece47a728fd650dbe8 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Mon, 23 Apr 2018 18:20:14 -0700 Subject: [PATCH 105/236] Made shopping cart work except items aren't aggregated --- app/controllers/order_products_controller.rb | 9 ++-- app/controllers/products_controller.rb | 4 +- app/models/order.rb | 43 +++++++++++--------- app/views/carts/show.html.erb | 11 +++++ app/views/products/show.html.erb | 11 +++-- config/routes.rb | 2 +- 6 files changed, 53 insertions(+), 27 deletions(-) create mode 100644 app/views/carts/show.html.erb diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 8c9319c24c..48c4d82d5a 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -3,9 +3,12 @@ class OrderProductsController < ApplicationController def create @order = current_order @item = @order.order_products.new(item_params) - @order.save - session[:order_id] = @order.id - redirect_to products_path + if @order.save + session[:order_id] = @order.id + redirect_to products_path + else + @order.errors.messages.inspect + end end private diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 30968e00b6..579a7f2eb0 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -53,7 +53,9 @@ def create def edit; end - def show; end + def show + @order_product = current_order.order_products.new + end def update @product.assign_attributes(product_params) diff --git a/app/models/order.rb b/app/models/order.rb index 7bc610b345..9eec55399e 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -3,24 +3,24 @@ class Order < ApplicationRecord has_many :products, through: :order_products has_many :merchants, through: :products - validates :name, presence: true - - validates :email, presence: true, format: {with: /@/, message: "Must include @"} - - validates :address, presence: true, format: { with: /\A[\d]+/, - message: "Must start with digits" } - - validates :cc_num, presence: true, format: { with: /\A[\d]{16}\z/, - message: "Digits only" } - - validates :expiry_date, presence: true, format: { with: /\A[\d]{4}\z/, - message: "Digits only" } - - validates :cc_cvv, presence: true, format: { with: /\A[\d]{3}\z/, - message: "Digits only" } - - validates :zip, presence: true, format: { with: /\A[\d]+\z/, - message: "Digits only" } + # validates :name, presence: true + # + # validates :email, presence: true, format: {with: /@/, message: "Must include @"} + # + # validates :address, presence: true, format: { with: /\A[\d]+/, + # message: "Must start with digits" } + # + # validates :cc_num, presence: true, format: { with: /\A[\d]{16}\z/, + # message: "Digits only" } + # + # validates :expiry_date, presence: true, format: { with: /\A[\d]{4}\z/, + # message: "Digits only" } + # + # validates :cc_cvv, presence: true, format: { with: /\A[\d]{3}\z/, + # message: "Digits only" } + # + # validates :zip, presence: true, format: { with: /\A[\d]+\z/, + # message: "Digits only" } def quantity_in_order(product) self.order_products.find_by(product_id: product.id).quantity @@ -34,7 +34,12 @@ def product_subtotal(product) end def order_total + total = 0 + self.order_products.each do |order_product| + product = order_product.product + total += product_subtotal(product) + end + return total end - end diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb new file mode 100644 index 0000000000..9a93677b24 --- /dev/null +++ b/app/views/carts/show.html.erb @@ -0,0 +1,11 @@ +<% if @order_products.any? %> + <% @order_products.each do |i| %> +

    <%= i.product.name %> | <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure?", :method => "delete"} %>

    + +

    <%= "Unit Price: #{i.product.price} | Quantity: #{i.quantity} | Total Price: #{number_to_currency(i.product.price * i.quantity)}" %>

    + + <% end %> +

    Your Total: <%= number_to_currency current_order.order_total %>

    +<% else %> +

    Your shopping cart is empty.

    +<% end %> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 7706dbcfec..1bca85451f 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -22,9 +22,14 @@ <%= @product.available %> Available

    -

    - <%= link_to 'Add to cart', '#' %> -

    +
    + <%= form_for @order_product do |f| %> + <%= f.hidden_field :product_id, value: @product.id %> + <%= f.number_field :quantity %> + <%= f.submit "Add to cart", class: "button" %> + <% end %> +
    +
    diff --git a/config/routes.rb b/config/routes.rb index 031255d80d..e21b27f577 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,7 +11,7 @@ # may not need all routes for order_products resources :order_products - resources :cart, only: [:show] + resource :cart, only: [:show] resources :categories, only: [:new, :create, :index, :show] do resources :product, only: [:root] From 3e79c862a09e82737419058bcf6faab4b27aba92 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 11:40:18 -0700 Subject: [PATCH 106/236] Added destroy method --- app/controllers/application_controller.rb | 17 +++++++++++------ app/controllers/order_products_controller.rb | 17 +++++++++++++++-- app/controllers/orders_controller.rb | 11 ----------- app/models/order.rb | 17 +++++++++++++++++ config/routes.rb | 4 ++-- 5 files changed, 45 insertions(+), 21 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 5165d1dfbd..9d81f8baab 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,11 +3,16 @@ class ApplicationController < ActionController::Base helper_method :current_order def current_order - if session[:order_id] - Order.find(session[:order_id]) - else - Order.new - end - end + if session[:order_id] + result = Order.find(session[:order_id]) + # if result.status == "paid" + # Order.new + # else + # return result + # end + else + Order.new + end + end end diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 48c4d82d5a..b389520e3e 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -2,8 +2,9 @@ class OrderProductsController < ApplicationController def create @order = current_order - @item = @order.order_products.new(item_params) - if @order.save + @item = OrderProduct.new(item_params) + @item.order = @order + if @order.save && @item.save session[:order_id] = @order.id redirect_to products_path else @@ -11,6 +12,18 @@ def create end end + def destroy + @order = current_order + @item = @order.order_products.find(params[:id]) + @item.destroy + if @order.save + flash[:success] = "#{Product.find_by(id: @item.product_id).name} has been deleted from your cart." + else + flash[:failure] = "Something went wrong, but don't sweat it! Here's your cart." + end + redirect_to cart_path + end + private def item_params params.require(:order_product).permit(:quantity, :product_id) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index ba86015d11..09fb4967f7 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -18,17 +18,6 @@ def create end # add product to cart, remove product from cart should go in product - def subtotal - end - - def total_price - end - - def checkout_cart - end - - def empty_cart - end private diff --git a/app/models/order.rb b/app/models/order.rb index 9eec55399e..d5d03e08bb 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -2,6 +2,8 @@ class Order < ApplicationRecord has_many :order_products has_many :products, through: :order_products has_many :merchants, through: :products + before_save :update_status + before_save :order_total # validates :name, presence: true # @@ -42,4 +44,19 @@ def order_total return total end + def update_status + if self.status == nil? + self.status = "pending" + end + end + + def checkout + if self.status == "pending" + self.status = "paid" + end + end + + def new_cart + end + end diff --git a/config/routes.rb b/config/routes.rb index e21b27f577..01b32765c5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,8 +2,8 @@ # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html root 'products#root' -post '/products/:id/add_review', to: 'products#create_review', as: :create_review - resources :products do + post '/products/:id/add_review', to: 'products#create_review', as: :create_review + resources :products, except: [:edit, :update] do resources :reviews, only: [:new, :show, :create] end From d6b820edfbde11f7cf90c051a4ecce11354c51cc Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 11:54:49 -0700 Subject: [PATCH 107/236] Add font awesome cdn to application layout view --- app/views/layouts/application.html.erb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4176c2fefc..ca1da0f48d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -5,6 +5,8 @@ <%= content_for?(:title) ? yield(:title) : "Untitled" %> + + <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> From 469c5342683c5b8ef77ef0130f0f76cf10123ebd Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 12:05:46 -0700 Subject: [PATCH 108/236] Replace end in routes --- config/routes.rb | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 69ee2fe2e0..96fc7c8941 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -6,28 +6,29 @@ post '/products/:id/add_review', to: 'products#create_review', as: :create_review resources :products, except: [:edit, :update] do - get '/auth/github', as: 'github_login' + get '/auth/github', as: 'github_login' - post '/logout', to: 'sessions#logout', as: 'logout' - get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' + post '/logout', to: 'sessions#logout', as: 'logout' + get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' - resources :products do - resources :reviews, only: [:new, :show, :create] - end + resources :products do + resources :reviews, only: [:new, :show, :create] + end - resources :orders, only: [:show, :new, :create] + resources :orders, only: [:show, :new, :create] - # may not need all routes for order_products - resources :order_products - resource :cart, only: [:show] + # may not need all routes for order_products + resources :order_products + resource :cart, only: [:show] - resources :categories, only: [:new, :create, :index, :show] do - resources :product, only: [:root] - end + resources :categories, only: [:new, :create, :index, :show] do + resources :product, only: [:root] + end - resources :merchants, except: [:edit, :update, :destroy] do - resources :products, only: [:index] - resources :orders, only: [:index] - end + resources :merchants, except: [:edit, :update, :destroy] do + resources :products, only: [:index] + resources :orders, only: [:index] + end + end end From 4adad14ab00f22922f633652537c6a21747e978d Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 12:08:09 -0700 Subject: [PATCH 109/236] Fix bug in routes again --- config/routes.rb | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 96fc7c8941..4e05baaf73 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,31 +4,29 @@ root 'products#root' post '/products/:id/add_review', to: 'products#create_review', as: :create_review - resources :products, except: [:edit, :update] do - - get '/auth/github', as: 'github_login' - post '/logout', to: 'sessions#logout', as: 'logout' - get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' + get '/auth/github', as: 'github_login' - resources :products do - resources :reviews, only: [:new, :show, :create] - end + post '/logout', to: 'sessions#logout', as: 'logout' + get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' - resources :orders, only: [:show, :new, :create] + resources :products, except: [:edit, :update] do + resources :reviews, only: [:new, :show, :create] + end - # may not need all routes for order_products - resources :order_products - resource :cart, only: [:show] + resources :orders, only: [:show, :new, :create] - resources :categories, only: [:new, :create, :index, :show] do - resources :product, only: [:root] - end + # may not need all routes for order_products + resources :order_products + resource :cart, only: [:show] - resources :merchants, except: [:edit, :update, :destroy] do - resources :products, only: [:index] - resources :orders, only: [:index] - end + resources :categories, only: [:new, :create, :index, :show] do + resources :product, only: [:root] + end + resources :merchants, except: [:edit, :update, :destroy] do + resources :products, only: [:index] + resources :orders, only: [:index] end + end From 7740ff29e127f97d18f55cb3af61f2394ac56aca Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 12:11:11 -0700 Subject: [PATCH 110/236] added methods to session controller and merchant model; added login buttons; added basic flash messages --- app/controllers/sessions_controller.rb | 39 +++++++++++++++++++ app/models/merchant.rb | 5 +++ app/views/layouts/application.html.erb | 11 +++++- config/routes.rb | 4 +- ...75628_add_uid_and_provider_to_merchants.rb | 6 +++ db/schema.rb | 4 +- db/seed_data/merchants.csv | 12 +++--- db/seeds.rb | 2 + 8 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 db/migrate/20180424175628_add_uid_and_provider_to_merchants.rb diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 16d11b5710..f32a9cb590 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,2 +1,41 @@ class SessionsController < ApplicationController + + def create + auth_hash = request.env['omniauth.auth'] + + + if auth_hash['uid'] + @merchant = Merchant.find_by(id: auth_hash['uid'], provider: 'github') + + if @merchant.nil? + @merchant = Merchant.build_from_github(auth_hash) + if @merchant.save + session[:merchant_id] = @merchant.id + flash[:success] = "Successfully created new user #{@merchant.username} with ID #{@merchant.id}" + redirect_to merchant_path(@merchant.id) + else + flash[:error] = "Could not log in" + flash[:messages] = @merchant.errors.messages + redirect_to root_path + end + else + session[:merchant_id] = @merchant.id + flash[:success] = "Welcome back #{@merchant.username}!" + redirect_to merchant_path(@merchant.id) + end + + else + flash[:error] = "Could not authenticate user via Github" + redirect_to root_path + end + + end + + + def destroy + session[:merchant_id] = nil + flash[:success] = "You have been logged out" + redirect_to root_path + end end +'' diff --git a/app/models/merchant.rb b/app/models/merchant.rb index 514e57fb83..94d7a532d2 100644 --- a/app/models/merchant.rb +++ b/app/models/merchant.rb @@ -7,4 +7,9 @@ class Merchant < ApplicationRecord validates :username, presence: true, uniqueness: true validates :email, presence: true, uniqueness: true + def self.build_from_github(auth_hash) + @merchant = Merchant.new(username: auth_hash['info']['nickname'], email: auth_hash['info']['email'], uid: auth_hash['uid'], provider: auth_hash['provider']) + + end + end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f7febb50ce..21c0d7c982 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -30,12 +30,21 @@
    - <%= link_to "Already a Merchant? Login!", github_login_path, class: "button" %> + <%= link_to "Already a Merchant? Login!", '/auth/github', class: "button" %> <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button' %> + <%= link_to "Logout", logout_path, method: :delete, class: 'button' %>
    + +
    +
    + <% flash.each do |name, message| %> +
    <%= message %>
    + <% end %> +
    + <%= yield %>
    diff --git a/config/routes.rb b/config/routes.rb index 836563e0fd..df064fc33a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,8 +4,8 @@ root 'products#root' get '/auth/github', as: 'github_login' - - post '/logout', to: 'sessions#logout', as: 'logout' + + delete '/logout', to: 'sessions#destroy', as: 'logout' get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' resources :products do diff --git a/db/migrate/20180424175628_add_uid_and_provider_to_merchants.rb b/db/migrate/20180424175628_add_uid_and_provider_to_merchants.rb new file mode 100644 index 0000000000..22e8a4f2a6 --- /dev/null +++ b/db/migrate/20180424175628_add_uid_and_provider_to_merchants.rb @@ -0,0 +1,6 @@ +class AddUidAndProviderToMerchants < ActiveRecord::Migration[5.1] + def change + add_column :merchants, :uid, :integer, null: false + add_column :merchants, :provider, :string, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index e0a09b86a6..c3e275acc1 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: 20180422222854) do +ActiveRecord::Schema.define(version: 20180424175628) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -33,6 +33,8 @@ t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.integer "uid", null: false + t.string "provider", null: false end create_table "order_products", force: :cascade do |t| diff --git a/db/seed_data/merchants.csv b/db/seed_data/merchants.csv index 3001327d0d..868f373174 100644 --- a/db/seed_data/merchants.csv +++ b/db/seed_data/merchants.csv @@ -1,6 +1,6 @@ -username,email -gregg,gregg.popovich@nba.com -tyronn,tyronn.lue@nba.com -steve,steve.kerr@nba.com -becky,becky.hammon@nba.com -mark,mark.jackson@nba.com +username,email,uid,provider +gregg,gregg.popovich@nba.com,1,github +tyronn,tyronn.lue@nba.com,2,github +steve,steve.kerr@nba.com,3,github +becky,becky.hammon@nba.com,4,github +mark,mark.jackson@nba.com,5,github diff --git a/db/seeds.rb b/db/seeds.rb index f132ef86f1..9ec15ee698 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -29,6 +29,8 @@ merchant = Merchant.new merchant.username = row['username'] merchant.email = row['email'] + merchant.uid = row['uid'] + merchant.provider = row['provider'] successful = merchant.save if !successful merchant_failures << merchant From c5475dce71c11dec0d07a709908396188700b4ff Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 12:17:51 -0700 Subject: [PATCH 111/236] Add cart button to navigation --- app/assets/stylesheets/application.css | 5 +++++ app/views/layouts/application.html.erb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index a2450a3bd9..8024ec1a3d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -48,3 +48,8 @@ form { 0px 8px 13px rgba(0,0,0,0.4), 0px 18px 23px rgba(0,0,0,0.4); } + +i { + color: #1779ba; + cursor: pointer; +} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 1183a9f5af..059a2c6555 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -33,7 +33,8 @@
    <%= link_to "Already a Merchant? Login!", github_login_path, class: "button" %> - <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button' %> + <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: "button" %> +
    From 560ac037fd025646b8467b8b5428b5339e7ca487 Mon Sep 17 00:00:00 2001 From: samanthaberk <15961601+samanthaberk@users.noreply.github.com> Date: Tue, 24 Apr 2018 13:54:31 -0700 Subject: [PATCH 112/236] Update sessions_controller.rb Add .capitalize to flash messages --- app/controllers/sessions_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index f32a9cb590..b674b3f63d 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -11,7 +11,7 @@ def create @merchant = Merchant.build_from_github(auth_hash) if @merchant.save session[:merchant_id] = @merchant.id - flash[:success] = "Successfully created new user #{@merchant.username} with ID #{@merchant.id}" + flash[:success] = "Successfully created new user #{@merchant.username.capitalize} with ID #{@merchant.id}" redirect_to merchant_path(@merchant.id) else flash[:error] = "Could not log in" @@ -20,7 +20,7 @@ def create end else session[:merchant_id] = @merchant.id - flash[:success] = "Welcome back #{@merchant.username}!" + flash[:success] = "Welcome back #{@merchant.username.capitalize}!" redirect_to merchant_path(@merchant.id) end From 75778ee3fb3110cf090ac221982b9415728e69f2 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 14:06:35 -0700 Subject: [PATCH 113/236] Update sessions_controller.rb --- app/controllers/sessions_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index b674b3f63d..ec4fd0da93 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -38,4 +38,3 @@ def destroy redirect_to root_path end end -'' From 94c24d5bb3d31514c50d27dc02593dc450a2365f Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 14:36:33 -0700 Subject: [PATCH 114/236] patching authentication fix --- app/controllers/sessions_controller.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index b674b3f63d..43448ba7ad 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -2,10 +2,10 @@ class SessionsController < ApplicationController def create auth_hash = request.env['omniauth.auth'] - + if auth_hash['uid'] - @merchant = Merchant.find_by(id: auth_hash['uid'], provider: 'github') + @merchant = Merchant.find_by(uid: auth_hash['uid'], provider: 'github') if @merchant.nil? @merchant = Merchant.build_from_github(auth_hash) @@ -38,4 +38,3 @@ def destroy redirect_to root_path end end -'' From 402268eb5a9cac950ee9e10abdc230daffec8c94 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 14:40:59 -0700 Subject: [PATCH 115/236] Added flash mssgs for putting item in cart --- app/assets/stylesheets/_settings.scss | 7 +++---- app/controllers/order_products_controller.rb | 5 ++++- app/views/layouts/application.html.erb | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 26f74f9494..e5de9ae304 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -312,11 +312,11 @@ $buttongroup-radius-on-each: true; // 13. Callout // ----------- -$callout-background: $white; +$callout-background: $light-gray; $callout-background-fade: 85%; $callout-border: 1px solid rgba($black, 0.25); -$callout-margin: 0 0 1rem 0; -$callout-padding: 1rem; +$callout-margin: 1rem; +$callout-padding: 2rem; $callout-font-color: $body-font-color; $callout-font-color-alt: $body-background; $callout-radius: $global-radius; @@ -866,4 +866,3 @@ $grid-padding-gutters: $grid-margin-gutters; $grid-container-padding: $grid-padding-gutters; $grid-container-max: $global-width; $xy-block-grid-max: 8; - diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index b389520e3e..c366e764c2 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -5,7 +5,10 @@ def create @item = OrderProduct.new(item_params) @item.order = @order if @order.save && @item.save + name = Product.find_by(id: @item.product_id).name.titleize + quant = @item.quantity session[:order_id] = @order.id + flash[:success] = "You added #{quant} #{quant > 1 ? name.pluralize : name}!" redirect_to products_path else @order.errors.messages.inspect @@ -17,7 +20,7 @@ def destroy @item = @order.order_products.find(params[:id]) @item.destroy if @order.save - flash[:success] = "#{Product.find_by(id: @item.product_id).name} has been deleted from your cart." + flash[:success] = "#{Product.find_by(id: @item.product_id).name.titleize} has been deleted from your cart." else flash[:failure] = "Something went wrong, but don't sweat it! Here's your cart." end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 995ef495ec..96768732eb 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -43,9 +43,9 @@
    -
    +
    <% flash.each do |name, message| %> -
    <%= message %>
    +
    <%= message %>
    <% end %>
    From 982de99ab7457c3df0aa729f057020667db5f9f8 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 14:45:17 -0700 Subject: [PATCH 116/236] Added controller filter to order_products --- app/controllers/order_products_controller.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index c366e764c2..d6d09876a2 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,4 +1,5 @@ class OrderProductsController < ApplicationController + before_action :find_order_product, only: [:show, :update, :edit, :destroy] def create @order = current_order @@ -15,9 +16,11 @@ def create end end + def edit; end + + def update; end + def destroy - @order = current_order - @item = @order.order_products.find(params[:id]) @item.destroy if @order.save flash[:success] = "#{Product.find_by(id: @item.product_id).name.titleize} has been deleted from your cart." @@ -32,4 +35,9 @@ def item_params params.require(:order_product).permit(:quantity, :product_id) end + def find_order_product + @order = current_order + @item = @order.order_products.find(params[:id]) + end + end From 336ddf40d911405b6ff84a14c89e47edcbec0795 Mon Sep 17 00:00:00 2001 From: Kiera Date: Tue, 24 Apr 2018 16:04:13 -0700 Subject: [PATCH 117/236] added current user and require login. --- app/controllers/application_controller.rb | 15 +++++++++++++-- app/controllers/merchants_controller.rb | 2 ++ app/controllers/products_controller.rb | 4 +++- app/controllers/sessions_controller.rb | 2 ++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9d81f8baab..778f209902 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,9 +2,21 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :current_order + before_action :require_login + + def current_user + @current_user ||= Merchant.find(session[:merchant_id]) if session[:merchant_id] + end + + def require_login + if current_user.nil? + flash[:error] = "You must be logged in to complete that action." + end + end + def current_order if session[:order_id] - result = Order.find(session[:order_id]) + result = Order.find_by(session[:order_id]) # if result.status == "paid" # Order.new # else @@ -14,5 +26,4 @@ def current_order Order.new end end - end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 943bb9315e..eb924df23a 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,5 +1,7 @@ class MerchantsController < ApplicationController + before_action :require_login, only: [:show] + def index @merchants = Merchant.all end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index c4bff0df17..47e63a3778 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,6 +1,8 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update, :destroy] + skip_before_action :require_login, only: [:root, :index] + def root @products = Product.all @categories = Category.all @@ -34,7 +36,7 @@ def create render :new, status: :bad_request end end - + def edit; end def show diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 43448ba7ad..4a49ecd7f4 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,5 +1,7 @@ class SessionsController < ApplicationController + skip_before_action :require_login, only: [:create, :destroy] + def create auth_hash = request.env['omniauth.auth'] From 9900071998170070e5498c392d3abda528049d78 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 17:08:58 -0700 Subject: [PATCH 118/236] solved for order 5 not found --- app/controllers/application_controller.rb | 2 +- app/models/order.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 778f209902..414c5fe898 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -16,7 +16,7 @@ def require_login def current_order if session[:order_id] - result = Order.find_by(session[:order_id]) + result = Order.find(session[:order_id]) # if result.status == "paid" # Order.new # else diff --git a/app/models/order.rb b/app/models/order.rb index d5d03e08bb..2984dc7262 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -1,5 +1,5 @@ class Order < ApplicationRecord - has_many :order_products + has_many :order_products, dependent: :destroy has_many :products, through: :order_products has_many :merchants, through: :products before_save :update_status From 2789c9ba0a156b8f6acc1b4381cc48db5c9227a5 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 17:15:22 -0700 Subject: [PATCH 119/236] Fixed adding 0 items issue --- .gitignore | 2 -- app/assets/stylesheets/application.css | 17 +++++++++++++++ app/controllers/order_products_controller.rb | 14 ++++++++----- app/views/carts/show.html.erb | 22 +++++++++++++++----- app/views/products/index.html.erb | 3 ++- app/views/products/show.html.erb | 3 ++- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index b1e910d4cf..d2f22b37aa 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,5 @@ .DS_Store .env - - # Ignore coverage coverage diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8024ec1a3d..7882fca872 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -53,3 +53,20 @@ i { color: #1779ba; cursor: pointer; } + +.quantity { + width: 3em; +} + +input[type=number]::-webkit-inner-spin-button, +input[type=number]::-webkit-outer-spin-button { + + opacity: 1; + +} + +.cart-items { + display: flex; + align-items: center; + justify-content: space-between; +} diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index d6d09876a2..e29c79d492 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,5 +1,5 @@ class OrderProductsController < ApplicationController - before_action :find_order_product, only: [:show, :update, :edit, :destroy] + before_action :find_order_product, only: [:show, :update, :destroy] def create @order = current_order @@ -12,13 +12,17 @@ def create flash[:success] = "You added #{quant} #{quant > 1 ? name.pluralize : name}!" redirect_to products_path else - @order.errors.messages.inspect + # FLASH MESSAGE + @order.errors.messages end end - def edit; end - - def update; end + def update + # FLASH MESSAGE + @item.assign_attributes({quantity: item_params[:quantity]}) + @item.save + redirect_to cart_path + end def destroy @item.destroy diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 9a93677b24..5cab62c17f 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,11 +1,23 @@ <% if @order_products.any? %> - <% @order_products.each do |i| %> -

    <%= i.product.name %> | <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure?", :method => "delete"} %>

    +
    + <% @order_products.each do |i| %> -

    <%= "Unit Price: #{i.product.price} | Quantity: #{i.quantity} | Total Price: #{number_to_currency(i.product.price * i.quantity)}" %>

    + <%= i.product.name %> + <%= form_for i do |f| %> + <% max = i.product.available %> + <%= f.hidden_field :product_id, value: i.product.id %> + <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + <%= f.submit "Update", class: "button" %> + <%= "Unit Price: #{i.product.price}" %> + <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <% end %> + <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure?", :method => "delete"}, class: "button" %> + <% end %> +
    + +

    OrderTotal: <%= number_to_currency current_order.order_total %>

    - <% end %> -

    Your Total: <%= number_to_currency current_order.order_total %>

    <% else %>

    Your shopping cart is empty.

    + <% end %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 58b507c8e0..6ced49fb32 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -38,8 +38,9 @@
    <%= form_for @order_product do |f| %> + <% max = product.available %> <%= f.hidden_field :product_id, value: product.id %> - <%= f.number_field :quantity %> + <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> <%= f.submit "Add to cart", class: "button" %> <% end %>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 1bca85451f..404b34c65a 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -24,8 +24,9 @@
    <%= form_for @order_product do |f| %> + <% max = @product.available %> <%= f.hidden_field :product_id, value: @product.id %> - <%= f.number_field :quantity %> + <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> <%= f.submit "Add to cart", class: "button" %> <% end %>
    From c9f2233263f942ba319902d14e40f1ee63db3f49 Mon Sep 17 00:00:00 2001 From: Kiera Date: Tue, 24 Apr 2018 17:27:06 -0700 Subject: [PATCH 120/236] remaining changes from sessions. --- app/controllers/sessions_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 4a49ecd7f4..7b991318fc 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -4,8 +4,7 @@ class SessionsController < ApplicationController def create auth_hash = request.env['omniauth.auth'] - - + if auth_hash['uid'] @merchant = Merchant.find_by(uid: auth_hash['uid'], provider: 'github') From 373afec4cb6d2c013a04f81d4b83753e1cc5ffaa Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 17:30:32 -0700 Subject: [PATCH 121/236] Fixed nested merchant page --- app/views/carts/show.html.erb | 33 +++++++++++++++++-------------- app/views/products/index.html.erb | 2 +- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 5cab62c17f..ed53435571 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,23 +1,26 @@ <% if @order_products.any? %> -
    - <% @order_products.each do |i| %> +
    + <% @order_products.each do |i| %> <%= i.product.name %> - <%= form_for i do |f| %> - <% max = i.product.available %> - <%= f.hidden_field :product_id, value: i.product.id %> - <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> - <%= f.submit "Update", class: "button" %> - <%= "Unit Price: #{i.product.price}" %> - <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> - <% end %> - <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure?", :method => "delete"}, class: "button" %> - <% end %> -
    + <%= form_for i do |f| %> -

    OrderTotal: <%= number_to_currency current_order.order_total %>

    + <% max = i.product.available %> + <%= f.hidden_field :product_id, value: i.product.id %> + <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + <%= f.submit "Update", class: "button" %> + <%= "Unit Price: #{number_to_currency(i.product.price)}" %> + <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <% end %> + + <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> + <% end %> + +
    + +

    OrderTotal: <%= number_to_currency current_order.order_total %>

    <% else %> -

    Your shopping cart is empty.

    +

    Your shopping cart is empty.

    <% end %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 6ced49fb32..e97305f815 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -37,7 +37,7 @@
    - <%= form_for @order_product do |f| %> + <%= form_for :order_product do |f| %> <% max = product.available %> <%= f.hidden_field :product_id, value: product.id %> <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> From d045ee49b81bfeac805a6fa585827d0f51f26884 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 17:56:51 -0700 Subject: [PATCH 122/236] Remove add to cart from product index --- app/assets/stylesheets/application.css | 2 +- app/controllers/products_controller.rb | 5 +++-- app/views/carts/show.html.erb | 15 +++++++++------ app/views/products/index.html.erb | 9 --------- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 7882fca872..4b14c68e0a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -68,5 +68,5 @@ input[type=number]::-webkit-outer-spin-button { .cart-items { display: flex; align-items: center; - justify-content: space-between; + justify-content: space-around; } diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index c4bff0df17..77d146a87a 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -34,7 +34,7 @@ def create render :new, status: :bad_request end end - + def edit; end def show @@ -67,8 +67,9 @@ def find_product def product_params return params.require(:product).permit(:name, :price, :available, :merchant_id) end - private + def review_params return params.require(:review).permit(:rating, :description) end + end diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index ed53435571..a40259138b 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,23 +1,26 @@ <% if @order_products.any? %> -
    + <% @order_products.each do |i| %> +
    - <%= i.product.name %> + <%= link_to i.product.name, product_path(i.product.id) %> +
    <%= form_for i do |f| %> <% max = i.product.available %> <%= f.hidden_field :product_id, value: i.product.id %> <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> <%= f.submit "Update", class: "button" %> - <%= "Unit Price: #{number_to_currency(i.product.price)}" %> - <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> <% end %> +
    + + <%= "Unit Price: #{number_to_currency(i.product.price)}" %> + <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> +
    <% end %> -
    -

    OrderTotal: <%= number_to_currency current_order.order_total %>

    <% else %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index e97305f815..1df1fabadc 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -36,15 +36,6 @@

    Average Rating <%= average_rating(product) %>

    -
    - <%= form_for :order_product do |f| %> - <% max = product.available %> - <%= f.hidden_field :product_id, value: product.id %> - <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> - <%= f.submit "Add to cart", class: "button" %> - <% end %> -
    - <% end%> From fef74efd6ac3b2f531206c0af7dc5ff7cc3a3992 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 18:05:51 -0700 Subject: [PATCH 123/236] patch to fix new order persistence in application controller --- app/controllers/application_controller.rb | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 414c5fe898..326a134085 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,6 +2,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :current_order + before_action :current_order before_action :require_login def current_user @@ -16,14 +17,11 @@ def require_login def current_order if session[:order_id] - result = Order.find(session[:order_id]) - # if result.status == "paid" - # Order.new - # else - # return result - # end + @current_order = Order.find(session[:order_id]) else - Order.new + @current_order = Order.create(status: 'pending') + session[:order_id] = @current_order.id end end + end From 71c0820efb466ecf1a35380647e03c7d1ea3160b Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Tue, 24 Apr 2018 19:23:24 -0700 Subject: [PATCH 124/236] Style cart page --- app/assets/stylesheets/_settings.scss | 2 +- app/assets/stylesheets/application.css | 12 ++++++--- app/views/carts/show.html.erb | 36 ++++++++++++++++---------- app/views/layouts/application.html.erb | 2 +- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index e5de9ae304..40606467ee 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -280,7 +280,7 @@ $breadcrumbs-item-separator-color: $medium-gray; $button-font-family: inherit; $button-padding: 0.85em 1em; -$button-margin: 0 0 $global-margin 0; +$button-margin: 0.5em; $button-fill: solid; $button-background: $primary-color; $button-background-hover: scale-color($button-background, $lightness: -15%); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 4b14c68e0a..0610f7da1e 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -56,6 +56,7 @@ i { .quantity { width: 3em; + display: inline; } input[type=number]::-webkit-inner-spin-button, @@ -66,7 +67,12 @@ input[type=number]::-webkit-outer-spin-button { } .cart-items { - display: flex; - align-items: center; - justify-content: space-around; + display:grid; + grid-template-columns: 1fr 5em repeat(4, 1fr); + font-size: 1.25em; +} + + +body > main { + margin: 2em; } diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index a40259138b..dc17eb846e 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,24 +1,34 @@ <% if @order_products.any? %> <% @order_products.each do |i| %> -
    - <%= link_to i.product.name, product_path(i.product.id) %> -
    - <%= form_for i do |f| %> + <%= form_for i do |f| %> + +
    + + + <%= link_to i.product.name, product_path(i.product.id) %> + + <% max = i.product.available %> + <%= f.hidden_field :product_id, value: i.product.id %> + <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + + + <%= "Unit Price: #{number_to_currency(i.product.price)}" %> + + + + <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + + + <%= f.submit "Update", class: "button" %> + + <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> - <% max = i.product.available %> - <%= f.hidden_field :product_id, value: i.product.id %> - <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> - <%= f.submit "Update", class: "button" %> - <% end %>
    - <%= "Unit Price: #{number_to_currency(i.product.price)}" %> - <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <% end %> - <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> -
    <% end %>

    OrderTotal: <%= number_to_currency current_order.order_total %>

    diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 96768732eb..37b0cc93e0 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" %> + <%= "Sweatsy" %> From a66cd30cf12fd30c09d4ffb8c9fb50fac3b9ed3c Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 19:51:43 -0700 Subject: [PATCH 125/236] fixed rendering product show page after submitting invalid review data --- 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 404b34c65a..c56759b94b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -23,7 +23,7 @@

    - <%= form_for @order_product do |f| %> + <%= form_for :order_product do |f| %> <% max = @product.available %> <%= f.hidden_field :product_id, value: @product.id %> <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> From 277996ed84ed274872733c58227c020bddc5f201 Mon Sep 17 00:00:00 2001 From: Kiera Date: Tue, 24 Apr 2018 20:54:04 -0700 Subject: [PATCH 126/236] updated seed file to include description and photo url. Added additional items and products to products and categories-products csvs. --- db/seed_data/categories-products.csv | 39 ++++++++++++++++++++++------ db/seed_data/categories.csv | 14 ++++++---- db/seed_data/orders-products.csv | 2 +- db/seed_data/products.csv | 28 +++++++++++++++----- db/seeds.rb | 2 ++ 5 files changed, 65 insertions(+), 20 deletions(-) diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv index 0bca3b01ea..5ce06ac072 100644 --- a/db/seed_data/categories-products.csv +++ b/db/seed_data/categories-products.csv @@ -1,9 +1,32 @@ category_name,product_name -pants,Track Pants -accessories,Sweaty Accessory -shirts,Rain Jacket -outerwear,Rain Jacket -shoes,Hiking Boots -outerwear,Hiking Boots -outerwear,Head Band -accessories,Head Band +Pants,Track Pants +Accessories,Pink Head Band +Accessories,Orange Head Band +Accessories,Sweaty Accessory +Shirts, Rain Jacket +Outerwear,Rain Jacket +Shoes,White Sneakers +Outerwear,White Sneakers +Outerwear,Head Band +Accessories,Head Band +Accessories,Purple Leotard +Tights,Purple Leotard +Accessories,Red Leotard +Tights,Red Leotard +Tights,Black Tights +Accessories,Black Tights +Outerwear,Track Jacket +Shirt,Track Jacket +Tights,Spandex +Tights,Green Spandex +Accessories,Neon Head Band +Tights,Leggings +Pants,Leggings +Tights,Nude Tights +Shirt,Dry fit Shirt +Dry fit,Dry fit Shirt +Shoes,Purple Sneakers +Shoes,Neon Sneakers +Dry fit, Silk Leotard +Accessories,Jazz legs +Legwarmers, Jazz legs diff --git a/db/seed_data/categories.csv b/db/seed_data/categories.csv index c5af04b777..3dbb14fe35 100644 --- a/db/seed_data/categories.csv +++ b/db/seed_data/categories.csv @@ -1,6 +1,10 @@ name -shirts -pants -shoes -outerwear -accessories +Shirts +Pants +Shoes +Outerwear +Accessories +Leotards +Legwarmers +Tights +Dry fit diff --git a/db/seed_data/orders-products.csv b/db/seed_data/orders-products.csv index 774f25eb51..81dca5528b 100644 --- a/db/seed_data/orders-products.csv +++ b/db/seed_data/orders-products.csv @@ -1,6 +1,6 @@ order_id,product_name,quantity 1,Sweaty Accessory,1 -2,Hiking Boots,3 +2,White Sneakers,3 2,Rain Jacket,1 3,Track Pants,2 3,Rain Jacket,1 diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index a6084b87e7..9e2f92aed8 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,6 +1,22 @@ -name,price,available,merchant_username -Track Pants,5000,20,gregg -Head Band,699,20,gregg -Rain Jacket,3545,20,tyronn -Hiking Boots,6405,20,becky -Sweaty Accessory,225,20,mark +name,price,available,description,photo,merchant_username +Track Pants,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg +Pink Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg +Orange Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg +Rain Jacket,3545,20,It will fight off the rain,http://via.placeholder.com/200x250,tyronn +White Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky +Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://via.placeholder.com/200x250,mark +Purple Leotard,100,20,Move around easier,http://via.placeholder.com/200x250,tyronn +Red Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn +Black Tights,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg +Track Jacket,2700,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg +Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg +Neon Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg +Green Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg +Leggings,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg +NudeTights,90,10,Release the sweat,http://via.placeholder.com/200x250,tyronn +Dryfit Shirt,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg +Neon Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky +Purple Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky +Silk Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn +Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg +Jazz legs200,20,Let it shine,http://via.placeholder.com/200x250,tyronn diff --git a/db/seeds.rb b/db/seeds.rb index 9ec15ee698..e37fa57cdc 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -82,6 +82,8 @@ product.name = row['name'] product.price = row['price'] product.available = row['available'] + product.description = row['description'] + product.photo = row['photo'] product.merchant_id = Merchant.find_by(username: row['merchant_username']).id successful = product.save if !successful From fe1f71a183fee2d0f2d150c9e287557a402170b3 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 20:56:51 -0700 Subject: [PATCH 127/236] restricted merchant dashboard view to users who are logged in --- app/controllers/application_controller.rb | 3 ++- app/controllers/merchants_controller.rb | 4 ++-- app/controllers/reviews_controller.rb | 3 --- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 326a134085..bab776f61d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,6 +2,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :current_order + before_action :current_user before_action :current_order before_action :require_login @@ -11,7 +12,7 @@ def current_user def require_login if current_user.nil? - flash[:error] = "You must be logged in to complete that action." + flash[:error] = "You must be logged in to do that." end end diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index eb924df23a..83278a941e 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -24,8 +24,8 @@ def create end def show - @merchant = Merchant.find_by(id: params[:id]) - render file: "#{Rails.root}/public/404.html", status: :not_found unless @merchant + @merchant = @current_user + redirect_to root_path unless @merchant end private diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index df319424ad..84596e0ba7 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -6,7 +6,6 @@ def new def create @review = Review.new(review_params) - # @review.assign_attributes(product_id: params[:product_id]) @review.product_id = params[:product_id] if @review.save @@ -14,8 +13,6 @@ def create else flash[:error] = "You must submit a rating of 1-5 and a description." @product = Product.find_by(id: params[:product_id]) - # id = @product.id - # render 'products/show', status: :bad_request render 'products/show', status: :bad_request end end From 7c44dca5c69fbb18f134cbe65ba32b470141cdb6 Mon Sep 17 00:00:00 2001 From: Kiera Date: Tue, 24 Apr 2018 20:58:24 -0700 Subject: [PATCH 128/236] update products index and view page to include photo from seed data. --- app/views/products/index.html.erb | 2 +- app/views/products/show.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 1df1fabadc..04c0f27566 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -22,7 +22,7 @@
  • - placeholder photo + placeholder photo
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 404b34c65a..9b13739a48 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,7 +12,7 @@

    <%= @product.name %>

    - placeholder image + placeholder image
    <%=number_to_currency(@product.price)%>

    From 0dff7ae699478e8523725e27c747fc3dbe06049e Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 21:08:34 -0700 Subject: [PATCH 129/236] Add uid and provider to merchants yaml files --- test/fixtures/merchants.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/fixtures/merchants.yml b/test/fixtures/merchants.yml index e33596dac6..2739b20ae7 100644 --- a/test/fixtures/merchants.yml +++ b/test/fixtures/merchants.yml @@ -3,7 +3,11 @@ merchant_one: username: merchant_one email: merchant_one@gmail.com + uid: 1 + provider: github merchant_two: username: merchant_two email: merchant_two@gmail.com + uid: 2 + provider: github From d3c23e604cc8a9b6a848bdce742573d65ab31fdd Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 21:08:59 -0700 Subject: [PATCH 130/236] three tests for order_products controller --- .../order_products_controller_test.rb | 62 +++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index 868bc2929c..b0754fde7a 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -1,7 +1,61 @@ require "test_helper" - +require 'pry' describe OrderProductsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe 'create' do + + it "can create an OrderProduct with valid data" do + order = Order.first + + item_data = { + order_id: order.id, + quantity: 10, + product_id: Product.first.id + } + # equals 0 + old_count = order.order_products.count + + post order_products_path, params: { order_product: item_data } + + must_respond_with :redirect + must_redirect_to products_path + # still equals 0, not saving + order.order_products.count.must_equal old_count + 1 + end + + it "does not create an OrderProduct with incomplete data" do + order = Order.first + + item_data = { + quantity: 10, + } + old_count = order.order_products.count + + post order_products_path, params: { order_product: item_data } + + must_respond_with :bad_request + # still equals 0, not saving + order.order_products.count.must_equal old_count + end + + end + + describe 'update' do + + it "updates the quantity of an existing OrderProduct with a valid number" do + order = Order.first + + order_product = OrderProduct.create!(quantity: 1, order_id: order.id, product_id: Product.first.id) + + item_data = order_product.attributes + item_data[:quantity] = 2 + + order_product.assign_attributes(item_data) + + patch order_product_path(order_product), params: { order_product: item_data } + + end + + end + end From bd645ee89a52b4a8bb7401e6e878feb704818ee2 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Tue, 24 Apr 2018 21:24:58 -0700 Subject: [PATCH 131/236] added ability for merchant to post a new product; this includes new nested route --- app/controllers/products_controller.rb | 4 ++-- app/views/layouts/_form.html.erb | 5 +++-- app/views/merchants/show.html.erb | 2 +- config/routes.rb | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 8f76a76f08..e1a9a89a1d 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -29,7 +29,7 @@ def create if @product.save flash[:success] = "Product added successfully" - redirect_to merchant_products_path(merchant.id) + redirect_to merchant_products_path(@current_user.id) else flash.now[:failure] = "Validations Failed" @@ -73,5 +73,5 @@ def product_params def review_params return params.require(:review).permit(:rating, :description) end - + end diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index b5cfd2e11f..1b5474361e 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -19,8 +19,9 @@ <%= f.label :available %> <%= f.number_field :available %> - <%= f.label :merchant_id %> - <%= f.text_field :merchant_id %> +<%= f.hidden_field :merchant_id%> + +

    <%= f.label :categories %> diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 86b8122fda..60b70a42f5 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -5,7 +5,7 @@
    <%= link_to "Manage your products", merchant_products_path(@merchant) %>
    -
    <%= link_to "Post a new product", new_product_path %>
    +
    <%= link_to "Post a new product", new_merchant_product_path(@merchant) %>
    <%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
    diff --git a/config/routes.rb b/config/routes.rb index 0b71f08fad..b4d4f43fa7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -26,7 +26,7 @@ end resources :merchants, except: [:edit, :update, :destroy] do - resources :products, only: [:index] + resources :products, only: [:index, :new] resources :orders, only: [:index] end From 355bf4d509006537ec27964c9c435ac5b0c7749f Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Tue, 24 Apr 2018 21:41:33 -0700 Subject: [PATCH 132/236] Some styling to homepage --- app/assets/stylesheets/application.css | 17 ++++++++ app/views/products/root.html.erb | 60 ++++++++++++++++---------- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 7882fca872..7ad5360cd1 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -22,11 +22,16 @@ form { padding: 2em; } +p { + padding: 2em; +} + #home-background-img { background-image: url('home_img.jpg'); background-repeat: no-repeat; background-size: cover; background-position: center; + background-attachment: fixed; padding-top: 2em; height: 22em; } @@ -49,6 +54,18 @@ form { 0px 18px 23px rgba(0,0,0,0.4); } +.home-header { + text-align: center; + padding: 1em; + font-weight: 400; +} + +hr { + width: 20%; + color: black; + padding: 0; +} + i { color: #1779ba; cursor: pointer; diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index 4a2fbca673..d40f7c51dd 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -6,37 +6,51 @@
    -
    Our Story
    +

    Our Story

    +

    Storify Dan Fleckner Robin Sloan hashtag future of context The Work of Art in the Age of Mechanical Reproduction fourth estate semipermeable newspaper strike fair use hyperlocal West Seattle Blog process vs. product, startups discuss production of innocence commons-based peer production hashtag paidContent Ushahidi I saw it on Mediagazer trolls dingbat David Foster Wallace crowdsourcing, net neutrality Neil Postman analytics Walter Cronkite died for your sins Gutenberg afternoon paper TechCrunch NPR fair use Innovator's Dilemma +1.

    -
    Browse Top Products
    - <% @products.each do |product|%> -
  • <%= product.name %>
  • - <% end %> - -<%= link_to "See More", products_path %> -
    +
    +

    Browse Top Products

    +
    + <% @products.each do |product|%> +
  • + <%= product.name %> +
  • -
    -
    Browse by Category
    -
      - <% @categories.each do |category|%> -
    • <%= category.name %>
    • <% end %>
    - <%= link_to "See More", categories_path %> + <%= link_to "See More", products_path, class:'button' %> +
    -
    See Top Sellers
    -
      - <% @merchants.each do |merchant|%> -
    • <%= merchant.username %>
    • - <% end %> -
    - <%= link_to "See More", merchants_path %> -
    - <%= link_to "Sign Up to Sell", new_merchant_path %> +
    +

    Browse by Category

    +
    +
      + <% @categories.each do |category|%> +
    • <%= category.name %>
    • + <% end %> +
    + <%= link_to "See More", categories_path, class:'button' %> +
    +
    + +
    +
    + +

    See Top Sellers

    +
    +
      + <% @merchants.each do |merchant|%> +
    • <%= merchant.username %>
    • + <% end %> +
    + <%= link_to "See More", merchants_path, class:'button' %> +
    + <%= link_to "Sign Up to Sell", new_merchant_path, class:'button' %> +
    From 6d852f621209654fcc7214973bc955ac64f84160 Mon Sep 17 00:00:00 2001 From: Kiera Date: Tue, 24 Apr 2018 21:50:37 -0700 Subject: [PATCH 133/236] updated csv photo url. --- db/seed_data/categories-products.csv | 6 +++--- db/seed_data/products.csv | 8 ++++---- db/seed_data/reviews.csv | 7 ++++--- db/seeds.rb | 16 ++++++++++++---- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv index 5ce06ac072..839d084a59 100644 --- a/db/seed_data/categories-products.csv +++ b/db/seed_data/categories-products.csv @@ -3,7 +3,7 @@ Pants,Track Pants Accessories,Pink Head Band Accessories,Orange Head Band Accessories,Sweaty Accessory -Shirts, Rain Jacket +Shirts,Rain Jacket Outerwear,Rain Jacket Shoes,White Sneakers Outerwear,White Sneakers @@ -27,6 +27,6 @@ Shirt,Dry fit Shirt Dry fit,Dry fit Shirt Shoes,Purple Sneakers Shoes,Neon Sneakers -Dry fit, Silk Leotard +Dry fit,Silk Leotard Accessories,Jazz legs -Legwarmers, Jazz legs +Legwarmers,Jazz legs diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index 9e2f92aed8..e3da3f3d32 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,7 +1,7 @@ name,price,available,description,photo,merchant_username Track Pants,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Pink Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg -Orange Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg +Pink Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg +Orange Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg Rain Jacket,3545,20,It will fight off the rain,http://via.placeholder.com/200x250,tyronn White Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://via.placeholder.com/200x250,mark @@ -18,5 +18,5 @@ Dryfit Shirt,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg Neon Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky Purple Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky Silk Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn -Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg -Jazz legs200,20,Let it shine,http://via.placeholder.com/200x250,tyronn +Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg +Jazz legs,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn diff --git a/db/seed_data/reviews.csv b/db/seed_data/reviews.csv index e27501ccf7..0ab8fbed9b 100644 --- a/db/seed_data/reviews.csv +++ b/db/seed_data/reviews.csv @@ -1,6 +1,7 @@ -rating,details,product_name +rating,description,product_name 1,Horrible product! Sweat everywhere!!,Sweaty Accessory 2,"Eh, I'm not impressed. Not so great and I wouldn't buy it again.",Track Pants -3,"This product is okay. Nothing to call home about, but it gets the job done.",Hiking Boots -4,I like it! Very nice...minimal sweat.,Hiking Boots +3,"This product is okay. Nothing to call home about, but it gets the job done.",Purple Leotard +4,I like it! Very nice...minimal sweat.,White Sneakers 5,This is a really fabulous product. It controlled my sweat!,Head Band +2,"Meh! Too tight.",Silk Leotard diff --git a/db/seeds.rb b/db/seeds.rb index e37fa57cdc..23a2fc55e0 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -107,7 +107,7 @@ CSV.foreach(REVIEWS_FILE, :headers => true) do |row| review = Review.new review.rating = row['rating'] - review.description = row['details'] + review.description = row['description'] review.product_id = Product.find_by(name: row['product_name']).id successful = review.save if !successful @@ -126,10 +126,18 @@ CATEGORIESPRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'categories-products.csv') puts "Loading raw categories_products data from #{CATEGORIESPRODUCTS_FILE}" +categories_products_failures = [] CSV.foreach(CATEGORIESPRODUCTS_FILE, :headers => true) do |row| - category = Category.find_by(name: row['category_name']) - product = Product.find_by(name: row['product_name']) - category.products << product + category = Category.find_by(name: row['category_name']).id + product = Product.find_by(name: row['product_name']).id + successful = categories_products.save + if !successful + categories_products_failures << product + puts "Failed to save categories_products: #{categories_products.inspect}" + else + puts "Created review: #{categories_products.inspect}" + end + end puts "done with categories-products" From ae4989765ec84320c84017303185d25d42fe566f Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 09:16:58 -0700 Subject: [PATCH 134/236] update csv files to remove errors. --- db/seed_data/categories-products.csv | 4 ++-- db/seed_data/orders-products.csv | 2 +- db/seed_data/products.csv | 4 ++-- db/seeds.rb | 15 ++++----------- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv index 839d084a59..011b15047d 100644 --- a/db/seed_data/categories-products.csv +++ b/db/seed_data/categories-products.csv @@ -16,14 +16,14 @@ Tights,Red Leotard Tights,Black Tights Accessories,Black Tights Outerwear,Track Jacket -Shirt,Track Jacket +Shirts,Track Jacket Tights,Spandex Tights,Green Spandex Accessories,Neon Head Band Tights,Leggings Pants,Leggings Tights,Nude Tights -Shirt,Dry fit Shirt +Shirts,Dry fit Shirt Dry fit,Dry fit Shirt Shoes,Purple Sneakers Shoes,Neon Sneakers diff --git a/db/seed_data/orders-products.csv b/db/seed_data/orders-products.csv index 81dca5528b..0d1deb9261 100644 --- a/db/seed_data/orders-products.csv +++ b/db/seed_data/orders-products.csv @@ -4,6 +4,6 @@ order_id,product_name,quantity 2,Rain Jacket,1 3,Track Pants,2 3,Rain Jacket,1 -3,Hiking Boots,1 +3,White Sneakers,1 3,Sweaty Accessory,1 4,Head Band,4 diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index e3da3f3d32..f37978a092 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -13,8 +13,8 @@ Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg Neon Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg Green Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg Leggings,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -NudeTights,90,10,Release the sweat,http://via.placeholder.com/200x250,tyronn -Dryfit Shirt,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg +Nude Tights,90,10,Release the sweat,http://via.placeholder.com/200x250,tyronn +Dry fit Shirt,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg Neon Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky Purple Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky Silk Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn diff --git a/db/seeds.rb b/db/seeds.rb index 23a2fc55e0..77c59d6ba5 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -126,18 +126,11 @@ CATEGORIESPRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'categories-products.csv') puts "Loading raw categories_products data from #{CATEGORIESPRODUCTS_FILE}" -categories_products_failures = [] -CSV.foreach(CATEGORIESPRODUCTS_FILE, :headers => true) do |row| - category = Category.find_by(name: row['category_name']).id - product = Product.find_by(name: row['product_name']).id - successful = categories_products.save - if !successful - categories_products_failures << product - puts "Failed to save categories_products: #{categories_products.inspect}" - else - puts "Created review: #{categories_products.inspect}" - end +CSV.foreach(CATEGORIESPRODUCTS_FILE, :headers => true) do |row| + category = Category.find_by(name: row['category_name']) + product = Product.find_by(name: row['product_name']) + category.products << product end puts "done with categories-products" From e609ca878809f3cd662493ea7fdb434c9abe20e8 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 09:30:42 -0700 Subject: [PATCH 135/236] Updated photo for neon head band. --- db/seed_data/products.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index f37978a092..985fc0ddac 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -10,7 +10,7 @@ Red Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn Black Tights,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg Track Jacket,2700,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Neon Head Band,699,20,http://via.placeholder.com/200x250, No more sweat on your brows,gregg +Neon Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg Green Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg Leggings,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg Nude Tights,90,10,Release the sweat,http://via.placeholder.com/200x250,tyronn From 6c3d6eedd8bd04546104a9246ba5d034226c7c85 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 10:18:34 -0700 Subject: [PATCH 136/236] resized image for product show page. Centered main content. --- app/views/products/show.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index e736deafce..6b25b961d2 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -1,4 +1,4 @@ -
    +

    Merchant: <%=@product.merchant.username%>

    @@ -9,10 +9,10 @@

    -
    +

    <%= @product.name %>

    - placeholder image + placeholder image
    <%=number_to_currency(@product.price)%>

    From cbda2fd14f8475511e1fdc1cd5361e27613892f6 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 10:43:18 -0700 Subject: [PATCH 137/236] Remove body styling --- app/assets/stylesheets/application.css | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 0610f7da1e..7e30f2f61a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -71,8 +71,3 @@ input[type=number]::-webkit-outer-spin-button { grid-template-columns: 1fr 5em repeat(4, 1fr); font-size: 1.25em; } - - -body > main { - margin: 2em; -} From 235dde3a0fba1e751ed44e6a17a4bf7db46e286a Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 25 Apr 2018 12:04:17 -0700 Subject: [PATCH 138/236] Add decrement method to order model --- app/controllers/order_products_controller.rb | 1 + app/models/order.rb | 6 ++++++ app/views/products/show.html.erb | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index e29c79d492..97e940f265 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -34,6 +34,7 @@ def destroy redirect_to cart_path end + private def item_params params.require(:order_product).permit(:quantity, :product_id) diff --git a/app/models/order.rb b/app/models/order.rb index 2984dc7262..17c0c9903b 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -44,6 +44,12 @@ def order_total return total end + def decrement(order) + order.order_products.each do |order_product| + order_product.product.available -= order_product.quantity + end + end + def update_status if self.status == nil? self.status = "pending" diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 6b25b961d2..9ae9eeb07b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -23,7 +23,7 @@

    - <%= form_for :order_product do |f| %> + <%= form_for @order_product do |f| %> <% max = @product.available %> <%= f.hidden_field :product_id, value: @product.id %> <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> From 43248f79c096b115a9c7a9b60e60bdff395d22ff Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 25 Apr 2018 12:14:08 -0700 Subject: [PATCH 139/236] Add clarifying comment to decrement method --- app/models/order.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/order.rb b/app/models/order.rb index 17c0c9903b..1695e067f7 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -44,6 +44,7 @@ def order_total return total end + # reduce the total num of products available when user pays for an order def decrement(order) order.order_products.each do |order_product| order_product.product.available -= order_product.quantity From f2b1b4393952aa17f2538144dbd9c3427324b0d7 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Wed, 25 Apr 2018 12:16:49 -0700 Subject: [PATCH 140/236] adding restrictions for guest users --- app/controllers/application_controller.rb | 3 ++- app/controllers/carts_controller.rb | 1 + app/controllers/categories_controller.rb | 1 + app/controllers/merchants_controller.rb | 2 +- app/controllers/order_products_controller.rb | 1 + app/controllers/orders_controller.rb | 1 + app/controllers/products_controller.rb | 3 +-- app/controllers/reviews_controller.rb | 2 +- app/views/layouts/_form.html.erb | 2 +- 9 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bab776f61d..d078bff5e5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -10,8 +10,9 @@ def current_user @current_user ||= Merchant.find(session[:merchant_id]) if session[:merchant_id] end +# flash message if current_user can't find a logged-in merchant def require_login - if current_user.nil? + unless current_user flash[:error] = "You must be logged in to do that." end end diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index a0b78e2003..734dbee4f5 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -1,4 +1,5 @@ class CartsController < ApplicationController +skip_before_action :require_login, only: [:show] def show @order_products = current_order.order_products diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index 8027a445c4..f8b4f4ac86 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -1,4 +1,5 @@ class CategoriesController < ApplicationController +skip_before_action :require_login, only: [:index, :show] def index @products_by_category = Category.products_by_category diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 83278a941e..3d2edc3bb7 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,5 +1,5 @@ class MerchantsController < ApplicationController - + skip_before_action :require_login, only: [:index, :new, :create] before_action :require_login, only: [:show] def index diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index e29c79d492..f8f250d46d 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -1,4 +1,5 @@ class OrderProductsController < ApplicationController + skip_before_action :require_login before_action :find_order_product, only: [:show, :update, :destroy] def create diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 09fb4967f7..7a6d07d058 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,4 +1,5 @@ class OrdersController < ApplicationController + skip_before_action :require_login before_action :find_order, only: [:show] def show; end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index e1a9a89a1d..d85d229463 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,7 +1,7 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update, :destroy] - skip_before_action :require_login, only: [:root, :index] + before_action :require_login, only: [:new, ] def root @products = Product.all @@ -59,7 +59,6 @@ def destroy end private - def find_product @product = Product.find_by(id: params[:id]) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index 84596e0ba7..aa4989ed71 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,5 +1,5 @@ class ReviewsController < ApplicationController - + skip_before_action :require_login def new @review = Review.new end diff --git a/app/views/layouts/_form.html.erb b/app/views/layouts/_form.html.erb index 1b5474361e..9d52a4a233 100644 --- a/app/views/layouts/_form.html.erb +++ b/app/views/layouts/_form.html.erb @@ -19,7 +19,7 @@ <%= f.label :available %> <%= f.number_field :available %> -<%= f.hidden_field :merchant_id%> +<%= f.hidden_field :merchant_id %> From b231efb32b2d14221797d819c8c63618ff36c77c Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 12:18:07 -0700 Subject: [PATCH 141/236] Added checkout and pay paths --- app/controllers/carts_controller.rb | 4 ++++ app/controllers/orders_controller.rb | 2 -- app/views/carts/edit.html.erb | 24 ++++++++++++++++++++++++ app/views/carts/show.html.erb | 2 ++ app/views/carts/update.html.erb | 0 app/views/products/show.html.erb | 2 +- config/routes.rb | 3 +++ 7 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 app/views/carts/edit.html.erb create mode 100644 app/views/carts/update.html.erb diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index a0b78e2003..1c27b38718 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -4,4 +4,8 @@ def show @order_products = current_order.order_products end + def edit; end + + def update; end + end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 09fb4967f7..3d649f8eee 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -17,8 +17,6 @@ def create end end - # add product to cart, remove product from cart should go in product - private def order_params diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb new file mode 100644 index 0000000000..1aa57af335 --- /dev/null +++ b/app/views/carts/edit.html.erb @@ -0,0 +1,24 @@ +

    Check Out

    + +<%= @current_order.inspect %> + +<% if @order_products.any? %> + + <% @order_products.each do |i| %> + + <%= link_to i.product.name, product_path(i.product.id) %> + + + <%= "Unit Price: #{number_to_currency(i.product.price)}" %> + + + + <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + + + + <% end %> + + <% end %> + +

    OrderTotal: <%= number_to_currency current_order.order_total %>

    diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index dc17eb846e..1eab1b200f 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -33,6 +33,8 @@

    OrderTotal: <%= number_to_currency current_order.order_total %>

    + <%= link_to "Checkout", checkout_path, class: "button" %> + <% else %>

    Your shopping cart is empty.

    diff --git a/app/views/carts/update.html.erb b/app/views/carts/update.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 index 6b25b961d2..9ae9eeb07b 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -23,7 +23,7 @@

    - <%= form_for :order_product do |f| %> + <%= form_for @order_product do |f| %> <% max = @product.available %> <%= f.hidden_field :product_id, value: @product.id %> <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> diff --git a/config/routes.rb b/config/routes.rb index b4d4f43fa7..3ef8db6fed 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -17,6 +17,9 @@ resources :orders, only: [:show, :new, :create] + get '/checkout', to: 'carts#edit', as: :checkout + get '/pay', to: 'carts#update', as: :pay + # may not need all routes for order_products resources :order_products resource :cart, only: [:show] From 155bf13f6b91cec5872a50035f0e2a7de018d3b7 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 12:21:47 -0700 Subject: [PATCH 142/236] Added conditional to login buttons to display name when logged in. --- app/controllers/sessions_controller.rb | 2 +- app/views/layouts/application.html.erb | 13 ++++++++----- app/views/merchants/index.html.erb | 2 +- app/views/merchants/show.html.erb | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 7b991318fc..186754c5f1 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -4,7 +4,7 @@ class SessionsController < ApplicationController def create auth_hash = request.env['omniauth.auth'] - + if auth_hash['uid'] @merchant = Merchant.find_by(uid: auth_hash['uid'], provider: 'github') diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 37b0cc93e0..e0a63363d5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -27,15 +27,18 @@
  • All Products
  • -
  • Two
  • -
  • Three
  • +
    + <% if @current_user %> + <%= link_to "Logged in as #{@current_user.username}",merchant_path(@current_user)%> + <%= link_to "Logout", logout_path, method: :delete, class: 'button' %> + <%else%> + <%= link_to "Already a Merchant? Login!", '/auth/github', class: "button" %> + <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button' %> + <%end%> - <%= link_to "Already a Merchant? Login!", '/auth/github', class: "button" %> - <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button' %> - <%= link_to "Logout", logout_path, method: :delete, class: 'button' %>
    diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 530f335401..2de30be61c 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -27,7 +27,7 @@

    Best-Seller:

    - placeholder photo + placeholder photo

    diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 60b70a42f5..612cd1878b 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -5,7 +5,7 @@

    <%= link_to "Manage your products", merchant_products_path(@merchant) %>
    -
    <%= link_to "Post a new product", new_merchant_product_path(@merchant) %>
    +
    <%= link_to "Add a new product", new_merchant_product_path(@merchant) %>
    <%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
    From 9a21ed3e54fcd7860727ff8ba89c79600f701bf7 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 12:31:08 -0700 Subject: [PATCH 143/236] Proceed to Checkout and Place Order paths --- app/controllers/carts_controller.rb | 11 ++++++++--- app/views/carts/edit.html.erb | 20 ++++++++++++++++++++ app/views/carts/show.html.erb | 2 +- app/views/carts/update.html.erb | 1 + config/routes.rb | 2 +- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index 1c27b38718..214cca51fe 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -1,11 +1,16 @@ class CartsController < ApplicationController + before_action :find_order_products - def show - @order_products = current_order.order_products - end + def show; end def edit; end def update; end + private + def find_order_products + @order_products = @current_order.order_products + head :not_found unless @order_products + end + end diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index 1aa57af335..88de51ae85 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -1,13 +1,24 @@

    Check Out

    <%= @current_order.inspect %> +<%= @order_products.inspect %> + <% if @order_products.any? %> <% @order_products.each do |i| %> + <%= form_for i do |f| %> + +
    + + <%= link_to i.product.name, product_path(i.product.id) %> + <% max = i.product.available %> + <%= f.hidden_field :product_id, value: i.product.id %> + <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + <%= "Unit Price: #{number_to_currency(i.product.price)}" %> @@ -16,9 +27,18 @@ <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <%= f.submit "Update", class: "button" %> + + <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> + +
    <% end %> <% end %>

    OrderTotal: <%= number_to_currency current_order.order_total %>

    + + <%= link_to "Place Order", place_order_path, class: "button" %> + +<% end %> diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 1eab1b200f..ba366617a1 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -33,7 +33,7 @@

    OrderTotal: <%= number_to_currency current_order.order_total %>

    - <%= link_to "Checkout", checkout_path, class: "button" %> + <%= link_to "Proceed to Checkout", checkout_path, class: "button" %> <% else %>

    Your shopping cart is empty.

    diff --git a/app/views/carts/update.html.erb b/app/views/carts/update.html.erb index e69de29bb2..17677fa6c7 100644 --- a/app/views/carts/update.html.erb +++ b/app/views/carts/update.html.erb @@ -0,0 +1 @@ +

    Pay

    diff --git a/config/routes.rb b/config/routes.rb index 3ef8db6fed..bf6ad803bc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,7 +18,7 @@ resources :orders, only: [:show, :new, :create] get '/checkout', to: 'carts#edit', as: :checkout - get '/pay', to: 'carts#update', as: :pay + get '/placeorder', to: 'carts#update', as: :place_order # may not need all routes for order_products resources :order_products From a3cbbad3635bec11b95673f4ce8d540553e9f161 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 12:48:29 -0700 Subject: [PATCH 144/236] conditionals log in buttons. --- 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 e0a63363d5..c504df8952 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -36,7 +36,7 @@ <%= link_to "Logout", logout_path, method: :delete, class: 'button' %> <%else%> <%= link_to "Already a Merchant? Login!", '/auth/github', class: "button" %> - <%= link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button' %> + <%=link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button'%> <%end%> From 81a3fc9765d331c86b9f2e439d031ca5c5f83eb8 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 25 Apr 2018 13:18:45 -0700 Subject: [PATCH 145/236] group orders on shopping cart page --- app/controllers/order_products_controller.rb | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 97e940f265..a30dbe5a7d 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -4,6 +4,20 @@ class OrderProductsController < ApplicationController def create @order = current_order @item = OrderProduct.new(item_params) + + product = Product.find(@item.product_id) + if @order.products.include?(product) + order_product = @order.order_products.find_by(product_id: product.id) + order_product.quantity += @item.quantity + if order_product.save + redirect_to products_path + return + else + @order.errors.messages + return + end + end + @item.order = @order if @order.save && @item.save name = Product.find_by(id: @item.product_id).name.titleize @@ -17,6 +31,22 @@ def create end end + # def create + # @order = current_order + # @item = OrderProduct.new(item_params) + # @item.order = @order + # if @order.save && @item.save + # name = Product.find_by(id: @item.product_id).name.titleize + # quant = @item.quantity + # session[:order_id] = @order.id + # flash[:success] = "You added #{quant} #{quant > 1 ? name.pluralize : name}!" + # redirect_to products_path + # else + # # FLASH MESSAGE + # @order.errors.messages + # end + # end + def update # FLASH MESSAGE @item.assign_attributes({quantity: item_params[:quantity]}) From 3aec4092daab8b039bee0bc591b534e87cadc9c4 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 13:29:45 -0700 Subject: [PATCH 146/236] Checkout page complete minus styling, confirmation in progress --- app/assets/stylesheets/application.css | 23 ++++++--- app/views/carts/edit.html.erb | 64 ++++++++++++++++---------- app/views/carts/show.html.erb | 4 +- app/views/carts/update.html.erb | 1 - app/views/orders/new.html.erb | 29 ------------ 5 files changed, 58 insertions(+), 63 deletions(-) delete mode 100644 app/views/carts/update.html.erb delete mode 100644 app/views/orders/new.html.erb diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 7e30f2f61a..8293591a5a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -59,15 +59,26 @@ i { display: inline; } +.cart-items { + display:grid; + grid-template-columns: 1fr 5em repeat(2, 1fr) repeat(2, 100px); + font-size: 1.25em; +} + +.checkout-items { + display:grid; + grid-template-columns: repeat(4, 250px); + font-size: 1.25em; +} + +.checkout { + display:grid; + grid-template-columns: repeat(2, 1fr); +} + input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { opacity: 1; } - -.cart-items { - display:grid; - grid-template-columns: 1fr 5em repeat(4, 1fr); - font-size: 1.25em; -} diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index 88de51ae85..4a0a66647a 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -1,44 +1,58 @@ -

    Check Out

    +

    Checkout

    -<%= @current_order.inspect %> -<%= @order_products.inspect %> +
    +
    + <%= form_for @current_order do |f| %> -<% if @order_products.any? %> + <%= f.label :name, "Name: " %> + <%= f.text_field :name, placeholder: "Dwayne Johnson" %> - <% @order_products.each do |i| %> + <%= f.label :email, "Email: " %> + <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> - <%= form_for i do |f| %> + <%= f.label :cc_num, "Credit Card: " %> + <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> -
    + <%= f.label :cc_cvv, "CVV: " %> + <%= f.number_field :cc_cvv, placeholder: "XXX" %> + <%= f.label :expiry_date, "Expiration: " %> - <%= link_to i.product.name, product_path(i.product.id) %> + ### THIS IS MAKING TEST FAIL + <%= f.date_select :expiry_date, :discard_day => true, :start_year => Date.today.year, :end_year => (Date.today.year+10), :use_month_numbers => true, :order => [:month, :year] %> - <% max = i.product.available %> - <%= f.hidden_field :product_id, value: i.product.id %> - <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + <%= f.label :zip, "Billing Zip: " %> + <%= f.number_field :zip, placeholder: "XXXXX" %> - - <%= "Unit Price: #{number_to_currency(i.product.price)}" %> - + <%= link_to "Back to Cart", cart_path, class: "button" %> - - <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> - + <%= f.submit "Place Order", class: 'button' %> - <%= f.submit "Update", class: "button" %> - <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> + <%= link_to "Place Order", place_order_path, class: "button" %> -
    + <% end %> +
    - <% end %> +
    + <% @order_products.each do |i| %> - <% end %> +
    -

    OrderTotal: <%= number_to_currency current_order.order_total %>

    + + <%= link_to i.product.name, product_path(i.product.id) %> + <%= "x #{i.quantity}" %> + - <%= link_to "Place Order", place_order_path, class: "button" %> + <%= "Sub Total: #{number_to_currency(i.product.price * i.quantity)}" %> -<% end %> +
    + + <% end %> + +

    Order Total: <%= number_to_currency current_order.order_total %>

    + +
    + +
    diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index ba366617a1..a831980ec7 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -18,7 +18,7 @@ - <%= "Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <%= "Sub Total: #{number_to_currency(i.product.price * i.quantity)}" %> <%= f.submit "Update", class: "button" %> @@ -31,7 +31,7 @@ <% end %> -

    OrderTotal: <%= number_to_currency current_order.order_total %>

    +

    Order Total: <%= number_to_currency current_order.order_total %>

    <%= link_to "Proceed to Checkout", checkout_path, class: "button" %> diff --git a/app/views/carts/update.html.erb b/app/views/carts/update.html.erb deleted file mode 100644 index 17677fa6c7..0000000000 --- a/app/views/carts/update.html.erb +++ /dev/null @@ -1 +0,0 @@ -

    Pay

    diff --git a/app/views/orders/new.html.erb b/app/views/orders/new.html.erb deleted file mode 100644 index 02b196451c..0000000000 --- a/app/views/orders/new.html.erb +++ /dev/null @@ -1,29 +0,0 @@ -### NEED TO MOVE THIS FORM TO UPDATE AS IT WILL BE USED TO CHECKOUT CART (UPDATE STATUS) NOT TO CREATE NEW ORDER...NO VIEW NEEDED FOR CREATE - -

    Review Cart

    - -<%= form_for @order do |f| %> - -<%= f.label :name, "Name: " %> -<%= f.text_field :name, placeholder: "Dwayne Johnson" %> - -<%= f.label :email, "Email: " %> -<%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> - -<%= f.label :cc_num, "Credit Card: " %> -<%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> - -<%= f.label :cc_cvv, "CVV: " %> -<%= f.number_field :cc_cvv, placeholder: "XXX" %> - -<%= f.label :expiry_date, "Expiration: " %> - -### THIS IS MAKING TEST FAIL -<%= f.date_select :expiry_date, :discard_day => true, :start_year => Date.today.year, :end_year => (Date.today.year+10), :use_month_numbers => true, :order => [:month, :year] %> - -<%= f.label :zip, "Billing Zip: " %> -<%= f.number_field :zip, placeholder: "XXXXX" %> - -<%= f.submit "Check Out", class: 'button' %> - -<% end %> From 40749269cd4fc3a8b28d05b56cef740bee46275d Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 25 Apr 2018 14:41:13 -0700 Subject: [PATCH 147/236] Basic functionality to restrict user from adding more than total available products to cart if items already exist in cart --- app/controllers/order_products_controller.rb | 33 +++++++++++--------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index a30dbe5a7d..7c2ba3c516 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -3,23 +3,24 @@ class OrderProductsController < ApplicationController def create @order = current_order - @item = OrderProduct.new(item_params) + product = Product.find_by(id: params[:order_product][:product_id]) - product = Product.find(@item.product_id) - if @order.products.include?(product) - order_product = @order.order_products.find_by(product_id: product.id) - order_product.quantity += @item.quantity - if order_product.save - redirect_to products_path - return - else - @order.errors.messages - return - end + # Maybe: make an instance method on Order to do this work and return + # the item + @item = @order.order_products.find_by(product: product) + if @item + @item.quantity += (params[:order_product][:quantity]).to_i + else + @item = @order.order_products.new(item_params) + end + + if @item.quantity > product.available + flash[:error] = "Only #{product.available} currently available." + redirect_to products_path + return end - @item.order = @order - if @order.save && @item.save + if @item.save name = Product.find_by(id: @item.product_id).name.titleize quant = @item.quantity session[:order_id] = @order.id @@ -31,6 +32,10 @@ def create end end + def order_num_valid?(quantity, availability) + + end + # def create # @order = current_order # @item = OrderProduct.new(item_params) From 9ed1d52a6a14827cdfdd4bc9e0905a22b53cc587 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 15:16:35 -0700 Subject: [PATCH 148/236] Added logic to login buttons. updated categories on merchant products to only appear once. --- app/views/layouts/application.html.erb | 2 +- app/views/merchants/index.html.erb | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index c504df8952..0ae92281a4 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -35,7 +35,7 @@ <%= link_to "Logged in as #{@current_user.username}",merchant_path(@current_user)%> <%= link_to "Logout", logout_path, method: :delete, class: 'button' %> <%else%> - <%= link_to "Already a Merchant? Login!", '/auth/github', class: "button" %> + <%= link_to "Login/Become a Merchant", '/auth/github', class: "button" %> <%=link_to "Sell Stuff on Sweatsy!", new_merchant_path, class: 'button'%> <%end%> diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 2de30be61c..9615554f54 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -24,16 +24,19 @@ <%= link_to merchant.username.capitalize, merchant_products_path(merchant.id) %> - + <% merchant.products.each do |product| %>

    Best-Seller:

    - placeholder photo + placeholder photo
    + <%end%>

    - <% merchant.product_categories.each do |category| %> - <%= link_to category.name, categories_path %> + <% cat = merchant.product_categories.uniq%> + <% cat.each do |category| %> + <%= link_to category.name, category_path(category) %> + <% end %>

    From d561c629e0570b838fb67bb90d4ea120a73a773d Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 15:21:13 -0700 Subject: [PATCH 149/236] updated image link on categories index. --- app/views/categories/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 035b46b716..066889f64a 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -11,7 +11,7 @@ <% prods.each do |p| %>
  • - +
    From 4bc28316fa75e8dafbc89e5bbc556b77ef1454ad Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Wed, 25 Apr 2018 15:36:54 -0700 Subject: [PATCH 150/236] changed some routes; restricted product access, generation, and editing to logged in users; updated security strategy --- app/controllers/application_controller.rb | 3 ++- app/controllers/products_controller.rb | 24 ++++++++++++++++------- app/views/merchants/show.html.erb | 2 +- app/views/products/edit.html.erb | 1 + config/routes.rb | 4 ++-- 5 files changed, 23 insertions(+), 11 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index d078bff5e5..ab930f978c 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -10,10 +10,11 @@ def current_user @current_user ||= Merchant.find(session[:merchant_id]) if session[:merchant_id] end -# flash message if current_user can't find a logged-in merchant +# flashes message if current_user can't find a logged-in merchant def require_login unless current_user flash[:error] = "You must be logged in to do that." + redirect_back fallback_location: root_path end end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d85d229463..d30c3b988f 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,7 +1,7 @@ class ProductsController < ApplicationController before_action :find_product, only: [:show, :edit, :update, :destroy] - - before_action :require_login, only: [:new, ] + before_action :correct_merchant, only: [:edit, :update, :destroy] + skip_before_action :require_login, only: [:index, :root, :show] def root @products = Product.all @@ -20,11 +20,12 @@ def index end def new - @product = Product.new(merchant_id: params[:merchant_id]) + @product = Product.new(merchant: @current_user) end def create @product = Product.new(product_params) + @product.merchant = @current_user if @product.save flash[:success] = "Product added successfully" @@ -37,10 +38,12 @@ def create end end - def edit; end def show - @order_product = current_order.order_products.new + end + + def edit + # Check that the current_user matches the user associated with the product end def update @@ -61,12 +64,19 @@ def destroy private def find_product @product = Product.find_by(id: params[:id]) - head :not_found unless @product end + def correct_merchant + # find_product + unless session[:merchant_id] == @product.merchant.id + flash[:error] = "Merchant and product do not match" + redirect_to root_path + end + end + def product_params - return params.require(:product).permit(:name, :price, :available, :merchant_id) + return params.require(:product).permit(:name, :price, :available) end def review_params diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 60b70a42f5..86b8122fda 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -5,7 +5,7 @@
    <%= link_to "Manage your products", merchant_products_path(@merchant) %>
    -
    <%= link_to "Post a new product", new_merchant_product_path(@merchant) %>
    +
    <%= link_to "Post a new product", new_product_path %>
    <%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
    diff --git a/app/views/products/edit.html.erb b/app/views/products/edit.html.erb index f793cad346..b517ba1404 100644 --- a/app/views/products/edit.html.erb +++ b/app/views/products/edit.html.erb @@ -1 +1,2 @@ +
    Edit Page
    <%= render partial: "layouts/form", locals: { page_title: "Edit a product"} %> diff --git a/config/routes.rb b/config/routes.rb index b4d4f43fa7..4ecef2170e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,7 +11,7 @@ get "/auth/:provider/callback", to: "sessions#create", as: 'auth_callback' - resources :products, except: [:edit, :update] do + resources :products do resources :reviews, only: [:new, :show, :create] end @@ -26,7 +26,7 @@ end resources :merchants, except: [:edit, :update, :destroy] do - resources :products, only: [:index, :new] + resources :products, only: [:index] resources :orders, only: [:index] end From 04a88ff74f9b37061b1c8a1260bdb3dc5a2b3573 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 15:37:30 -0700 Subject: [PATCH 151/236] updated conditions on product view to allow merchants to edit. --- app/views/products/index.html.erb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 04c0f27566..0f126676c1 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -30,6 +30,10 @@
    <%= number_to_currency(product.price) %>

    <%= product.description %>

    <%= product.available%> Available

    + <% if session[:merchant_id] == product.merchant_id%> + <%= link_to 'Edit', edit_product_path(product)%> + <%= link_to 'Retire', product_path(product), method: :delete %> + <%end%>
    From 634f474b34bf8806ed5622b94d2cff935d40d289 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Wed, 25 Apr 2018 15:48:08 -0700 Subject: [PATCH 152/236] order grouping --- app/controllers/order_products_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 7c2ba3c516..ebd6618ec6 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -22,9 +22,8 @@ def create if @item.save name = Product.find_by(id: @item.product_id).name.titleize - quant = @item.quantity session[:order_id] = @order.id - flash[:success] = "You added #{quant} #{quant > 1 ? name.pluralize : name}!" + flash[:success] = "You added #{@item.quantity} #{@item.quantity > 1 ? name.pluralize : name}!" redirect_to products_path else # FLASH MESSAGE From 139ea8cc1a7d52c93e4676392806243357f79f3f Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 15:48:56 -0700 Subject: [PATCH 153/236] One step closer to being able to pay --- app/controllers/carts_controller.rb | 19 ++++++++++++++++++- app/controllers/orders_controller.rb | 1 + app/models/order.rb | 9 ++++++--- app/views/carts/confirmation.html.erb | 4 ++++ app/views/carts/edit.html.erb | 9 +++------ config/routes.rb | 6 +++--- 6 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 app/views/carts/confirmation.html.erb diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index 214cca51fe..9e63968cb9 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -5,7 +5,20 @@ def show; end def edit; end - def update; end + def confirmation; end + + def update + @current_order.assign_attributes(cart_params) + + if @current_order.save + @current_order.checkout + previous_order = @current_order + + redirect_to confirmation_path(previous_order.id) + else + render :edit, status: :bad_request + end + end private def find_order_products @@ -13,4 +26,8 @@ def find_order_products head :not_found unless @order_products end + def cart_params + params.require(:order).permit(:name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) + end + end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 3d649f8eee..6672971c8e 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -19,6 +19,7 @@ def create private + # does this need to be edited since we have a cart params?? def order_params params.require(:order).permit(:status, :name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) end diff --git a/app/models/order.rb b/app/models/order.rb index 1695e067f7..86ac168e8d 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -58,12 +58,15 @@ def update_status end def checkout - if self.status == "pending" + if self.status = "pending" self.status = "paid" + @current_order.save end end - def new_cart - end + # def empty_cart + # @current_order = Order.create(status: 'pending') + # session[:order_id] = @current_order.id + # end end diff --git a/app/views/carts/confirmation.html.erb b/app/views/carts/confirmation.html.erb new file mode 100644 index 0000000000..30fb2f432d --- /dev/null +++ b/app/views/carts/confirmation.html.erb @@ -0,0 +1,4 @@ +

    Header

    + +<%= "Current Order: #{@current_order.inspect}" %> +<%= "Previous Order: #{@previous_order.inspect}" %> diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index 4a0a66647a..7554eeceff 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -1,9 +1,9 @@ -

    Checkout

    +

    <%= "Checkout #{@current_order.id} #{@current_order.status}" %>

    - <%= form_for @current_order do |f| %> + <%= form_for @current_order, url: cart_path do |f| %> <%= f.label :name, "Name: " %> <%= f.text_field :name, placeholder: "Dwayne Johnson" %> @@ -25,12 +25,9 @@ <%= f.label :zip, "Billing Zip: " %> <%= f.number_field :zip, placeholder: "XXXXX" %> - <%= link_to "Back to Cart", cart_path, class: "button" %> - <%= f.submit "Place Order", class: 'button' %> - - <%= link_to "Place Order", place_order_path, class: "button" %> + <%= link_to "Back to Cart", cart_path, class: "button" %> <% end %>
    diff --git a/config/routes.rb b/config/routes.rb index bf6ad803bc..d73b6bdabb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -15,14 +15,14 @@ resources :reviews, only: [:new, :show, :create] end - resources :orders, only: [:show, :new, :create] + resources :orders, only: [:show, :new, :create, :update] get '/checkout', to: 'carts#edit', as: :checkout - get '/placeorder', to: 'carts#update', as: :place_order + get '/order_confirmation/:id', to: 'carts#confirmation', as: :confirmation # may not need all routes for order_products resources :order_products - resource :cart, only: [:show] + resource :cart, only: [:show, :update] resources :categories, only: [:new, :create, :index, :show] do resources :product, only: [:root] From b80bfe9f0f19318bfe289bee3f8ab111c889a4c1 Mon Sep 17 00:00:00 2001 From: mgraonic Date: Wed, 25 Apr 2018 17:37:02 -0700 Subject: [PATCH 154/236] Update order.rb --- 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 86ac168e8d..9b6b50cf33 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -58,7 +58,7 @@ def update_status end def checkout - if self.status = "pending" + if self.status == "pending" self.status = "paid" @current_order.save end From 08e505578d732f6989888e83dac7895717ee8033 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Wed, 25 Apr 2018 17:43:10 -0700 Subject: [PATCH 155/236] changed new product link on merchant show page --- app/views/merchants/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index 612cd1878b..cb2310337a 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -5,7 +5,7 @@
    <%= link_to "Manage your products", merchant_products_path(@merchant) %>
    -
    <%= link_to "Add a new product", new_merchant_product_path(@merchant) %>
    +
    <%= link_to "Add a new product", new_product_path %>
    <%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
    From 99ffe8ebf46dadd8d1ba7226b9e909b9b6cf18c2 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 18:34:52 -0700 Subject: [PATCH 156/236] Possible to add products --- 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 9ae9eeb07b..9933abd067 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -23,7 +23,7 @@

    - <%= form_for @order_product do |f| %> + <%= form_for :order_product, url: order_products_path do |f| %> <% max = @product.available %> <%= f.hidden_field :product_id, value: @product.id %> <%= f.number_field :quantity, value: 1, min: 1, max: max, class: "quantity" %> From 52fbe48ceefb0c83a49d699a674428123813c29e Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Wed, 25 Apr 2018 18:43:42 -0700 Subject: [PATCH 157/236] Working cart again --- app/controllers/carts_controller.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index dbefc88039..5f2d3a7e35 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -1,7 +1,6 @@ class CartsController < ApplicationController before_action :find_order_products - skip_before_action :require_login, only: [:show] - + skip_before_action :require_login def show; end From 2c9743fb5d5783487ee5ecbf5a4ba7de2891de2d Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Wed, 25 Apr 2018 19:18:04 -0700 Subject: [PATCH 158/236] merchant cannot review own products --- app/controllers/reviews_controller.rb | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index aa4989ed71..6021c84ab7 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -1,14 +1,21 @@ class ReviewsController < ApplicationController skip_before_action :require_login + def new - @review = Review.new + unless @current_user.nil? + @review = Review.new + end end def create @review = Review.new(review_params) @review.product_id = params[:product_id] - if @review.save + if @current_user && @current_user.products.include?(@review.product) + flash[:error] = "You can't review your own products" + redirect_to product_path(@review.product) + + elsif @review.save redirect_to product_path(@review.product_id) else flash[:error] = "You must submit a rating of 1-5 and a description." @@ -16,9 +23,9 @@ def create render 'products/show', status: :bad_request end end +end - private - def review_params - return params.require(:review).permit(:rating, :description) - end +private +def review_params + return params.require(:review).permit(:rating, :description) end From 2e5686dd893dfcbfc5401e8ff4759a6ae583482a Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 19:22:58 -0700 Subject: [PATCH 159/236] Updated logic for merchants to only review their own products. --- app/controllers/products_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d30c3b988f..0db8e51659 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -43,6 +43,7 @@ def show end def edit + # Check that the current_user matches the user associated with the product end @@ -76,7 +77,7 @@ def correct_merchant end def product_params - return params.require(:product).permit(:name, :price, :available) + return params.require(:product).permit(:name, :price, :available, :photo, :description) end def review_params From 7e0a786e744828d49b0ec05e812e1a28c616e2a9 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 20:00:07 -0700 Subject: [PATCH 160/236] Changed logged in as to a link to merchant dashboard.Added div around edit and retire buttons. --- app/views/layouts/application.html.erb | 2 +- app/views/products/index.html.erb | 7 ++++++- app/views/products/show.html.erb | 10 ++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0ae92281a4..58699a42b1 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -32,7 +32,7 @@
    <% if @current_user %> - <%= link_to "Logged in as #{@current_user.username}",merchant_path(@current_user)%> + <%= link_to " #{@current_user.username}'s Dashboard ",merchant_path(@current_user), class: 'hollow button'%> <%= link_to "Logout", logout_path, method: :delete, class: 'button' %> <%else%> <%= link_to "Login/Become a Merchant", '/auth/github', class: "button" %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 0f126676c1..573a6131ff 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -30,10 +30,15 @@
    <%= number_to_currency(product.price) %>

    <%= product.description %>

    <%= product.available%> Available

    + +
    +
    <% if session[:merchant_id] == product.merchant_id%> +

    <%= link_to 'Edit', edit_product_path(product)%> <%= link_to 'Retire', product_path(product), method: :delete %> - <%end%> +

    + <%end%>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 9933abd067..77636d0dfa 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -22,6 +22,16 @@ <%= @product.available %> Available

    +
    + <% if session[:merchant_id] == @product.merchant_id%> +

    + <%= link_to 'Edit', edit_product_path(@product)%> + <%= link_to 'Retire', product_path(@product), method: :delete %> +

    + <%end%> +
    + +
    <%= form_for :order_product, url: order_products_path do |f| %> <% max = @product.available %> From 55321fbfaee9279ee75504970d0ad7239c4465fd Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Wed, 25 Apr 2018 20:06:21 -0700 Subject: [PATCH 161/236] basic login testing done; no edge cases --- app/controllers/sessions_controller.rb | 3 +- test/controllers/sessions_controller_test.rb | 31 ++++++++++++++++++-- test/test_helper.rb | 19 ++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 186754c5f1..b6ac11544b 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,6 +1,6 @@ class SessionsController < ApplicationController - skip_before_action :require_login, only: [:create, :destroy] + skip_before_action :require_login def create auth_hash = request.env['omniauth.auth'] @@ -29,7 +29,6 @@ def create flash[:error] = "Could not authenticate user via Github" redirect_to root_path end - end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index c2632a720b..c0a903cc88 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,7 +1,32 @@ require "test_helper" describe SessionsController do - # it "must be a real test" do - # flunk "Need real tests" - # end + describe 'auth_callback' do + it "creates a new DB entry for a new user" do + merchant = Merchant.new( + provider: 'github', + uid: 0000, + email: 'test@test.org', + username: 'testuser' + ) + + merchant.must_be :valid? + old_merchant_count = Merchant.count + + login(merchant) + + Merchant.count.must_equal old_merchant_count + 1 + session[:merchant_id].must_equal Merchant.last.id + end + + it "logs in existing merchant" do + merchant = Merchant.first + old_merchant_count = Merchant.count + + login(merchant) + + Merchant.count.must_equal old_merchant_count + session[:merchant_id].must_equal Merchant.first.id + end + end end diff --git a/test/test_helper.rb b/test/test_helper.rb index c337ac6f93..85f6111a74 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -26,4 +26,23 @@ 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 + OmniAuth.config.test_mode = true + end + + def mock_auth_hash(user) + return { + provider: user.provider, + uid: user.uid, + info: { + email: user.email, + nickname: user.username + } + } + end + + def login(user) + OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) + get auth_callback_path(:github) + end end From 8637e562c81965fb125e9ed57a2f9b0f77d404e8 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Wed, 25 Apr 2018 20:33:19 -0700 Subject: [PATCH 162/236] dashboard button --- app/controllers/merchants_controller.rb | 1 - app/views/layouts/application.html.erb | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 3d2edc3bb7..136b80d8e2 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,5 +1,4 @@ class MerchantsController < ApplicationController - skip_before_action :require_login, only: [:index, :new, :create] before_action :require_login, only: [:show] def index diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0ae92281a4..df48caa88a 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -32,7 +32,8 @@
    <% if @current_user %> - <%= link_to "Logged in as #{@current_user.username}",merchant_path(@current_user)%> + <%= link_to "Dashboard", merchant_path(@current_user), class: 'button' %> + <%= link_to "Logged in as #{@current_user.username}",merchant_path(@current_user), class: 'button'%> <%= link_to "Logout", logout_path, method: :delete, class: 'button' %> <%else%> <%= link_to "Login/Become a Merchant", '/auth/github', class: "button" %> From e59967e53422576d2a0fe4b9157714485485f501 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 20:42:13 -0700 Subject: [PATCH 163/236] Added product route for retire.Added corresponding changes to show pages to support controller retire method. --- app/controllers/products_controller.rb | 14 +++++++++++++- app/models/product.rb | 1 + app/views/products/index.html.erb | 2 +- app/views/products/show.html.erb | 4 ++-- config/routes.rb | 2 ++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 0db8e51659..dd165bd568 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,5 +1,5 @@ class ProductsController < ApplicationController - before_action :find_product, only: [:show, :edit, :update, :destroy] + before_action :find_product, only: [:show, :edit, :update, :retire, :destroy] before_action :correct_merchant, only: [:edit, :update, :destroy] skip_before_action :require_login, only: [:index, :root, :show] @@ -62,6 +62,18 @@ def destroy redirect_to products_path end + def retire + if @product.merchant = @current_user + @product.available = 0 + if @product.save + flash[:success] = "Successfully retired." + else + flash[:failure] = "Could not Retire, Try Again" + end + end + redirect_to products_path + end + private def find_product @product = Product.find_by(id: params[:id]) diff --git a/app/models/product.rb b/app/models/product.rb index d9d4f2848e..bb2187b2a2 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -9,4 +9,5 @@ class Product < ApplicationRecord validates :name, uniqueness: true validates :price, presence: true validates :price, numericality: { only_integer: true, greater_than: 0} + end diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 573a6131ff..4a9b5eb679 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -36,7 +36,7 @@ <% if session[:merchant_id] == product.merchant_id%>

    <%= link_to 'Edit', edit_product_path(product)%> - <%= link_to 'Retire', product_path(product), method: :delete %> + <%= link_to 'Retire', retire_path(product), method: :patch %>

    <%end%>
    diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index 77636d0dfa..d05e61b82a 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -4,7 +4,7 @@

    Categories: <% @product.categories.each do |category|%> - <%= category.name %> + <%= link_to category.name, category_path(category) %> <% end %>

    @@ -26,7 +26,7 @@ <% if session[:merchant_id] == @product.merchant_id%>

    <%= link_to 'Edit', edit_product_path(@product)%> - <%= link_to 'Retire', product_path(@product), method: :delete %> + <%= link_to 'Retire', retire_path(@product), method: :patch %>

    <%end%>
    diff --git a/config/routes.rb b/config/routes.rb index a1343672e8..5726831551 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,6 +3,8 @@ root 'products#root' + patch '/products/:id/retire', to: 'products#retire', as: 'retire' + post '/products/:id/add_review', to: 'products#create_review', as: :create_review get '/auth/github', as: 'github_login' From 1dfe3c573973ac592947eea5465f455085d382ee Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 22:23:48 -0700 Subject: [PATCH 164/236] updated primary foundation colors.Added fonts to application.css.styled the product thumbnails. --- app/assets/stylesheets/_settings.scss | 10 +++---- app/assets/stylesheets/application.css | 37 ++++++++++++++++++++++++++ app/views/layouts/application.html.erb | 14 +++++++--- app/views/products/index.html.erb | 5 ++-- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 40606467ee..572d087bcf 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -69,11 +69,11 @@ $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, + primary: #C36891, + secondary: #403F63, + success: #74b9e8, + warning: #f384aa, + alert: #ffffff, ); $light-gray: #e6e6e6; $medium-gray: #cacaca; diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8293591a5a..634ed9936a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -17,11 +17,38 @@ *= require foundation_and_overrides */ +/*all page body styling*/ +body,html { + height: 100%; +} +body { + /*font-family: 'Raleway', sans-serif;*/ + /*font-family: 'Dosis', sans-serif;*/ + /*font-family: 'Shadows Into Light', cursive;*/ + /*font-family: 'Handlee', cursive;*/ + /*font-family: 'Arsenal', sans-serif;*/ + font-family: 'Neucha', cursive; + +} +/*Navbar styling*/ +.nav { + width: 100%; + position: fixed; + background-color: #FFFFFF; +} +.top-bar-left { + list-style-type: none; + font-size: 40px; +} + + +/*form styling*/ form { padding: 2em; } +/*Home page styling*/ #home-background-img { background-image: url('home_img.jpg'); background-repeat: no-repeat; @@ -53,7 +80,17 @@ i { color: #1779ba; cursor: pointer; } +/*product grid styling*/ +.grid-x { + display: flex; +} + +.description { + display:flex; + flex-direction: column; +} +/*cart item styling*/ .quantity { width: 3em; display: inline; diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 0ae92281a4..a0dc9eb5d8 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,12 +1,14 @@ + <%= "Sweatsy" %> + - + <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> @@ -14,13 +16,17 @@ -
  • +

    Storify Dan Fleckner Robin Sloan hashtag future of context The Work of Art in the Age of Mechanical Reproduction fourth estate semipermeable newspaper strike fair use hyperlocal West Seattle Blog process vs. product, startups discuss production of innocence commons-based peer production hashtag paidContent Ushahidi I saw it on Mediagazer trolls dingbat David Foster Wallace crowdsourcing, net neutrality Neil Postman analytics Walter Cronkite died for your sins Gutenberg afternoon paper TechCrunch NPR fair use Innovator's Dilemma +1.

    +
    -
    -
    -

    Browse by Category

    -
    -
      - <% @categories.each do |category|%> -
    • <%= category.name %>
    • - <% end %> -
    - <%= link_to "See More", categories_path, class:'button' %> -
    -
    +
    +
    +

    Browse Top Products

    +
    +
      + <% @products.each do |product|%> +
    • +
      +
      <%=link_to product.name, product_path(product) %>
      +
      +
      + alt='placeholder photo' /> +
      +
    • + <% end %> +
    + <%= link_to "See More", products_path, class:'button' %> +
    +
    -
    -
    -

    See Top Sellers

    -
    -
      - <% @merchants.each do |merchant|%> -
    • <%= merchant.username %>
    • - <% end %> -
    - <%= link_to "See More", merchants_path, class:'button' %> -
    - <%= link_to "Sign Up to Sell", new_merchant_path, class:'button' %> -
    -
    +
    +
    +

    Browse by Category

    +
    +
      +
    • +
      +
      <%= link_to 'Shirts', categories_path %>
      +
      +
      + placeholder photo +
      +
    • + +
    • +
      +
      <%= link_to 'Shoes', categories_path %>
      +
      +
      + placeholder photo +
      +
    • + +
    • +
      +
      <%= link_to 'Accessories', categories_path %>
      +
      +
      + placeholder photo +
      +
    • + +
    • +
      +
      <%= link_to 'Legwarmers', categories_path %>
      +
      +
      + placeholder photo +
      +
    • + +
    + <%= link_to "See More", categories_path, class:'button' %> +
    +
    + +
    +
    + +

    See Top Sellers

    +
    +
      +
    • <%= link_to Merchant.find(1).username, merchants_path %>
    • +
    • <%= link_to Merchant.find(2).username, merchants_path %>
    • +
    • <%= link_to Merchant.find(3).username, merchants_path %>
    • +
    • <%= link_to Merchant.find(4).username, merchants_path %>
    • +
    + <%= link_to "See More", merchants_path, class:'button' %> +
    + <%= link_to "Sign Up to Sell", new_merchant_path, class:'button' %> +
    +
    + + + From 7ae953397507818d3902b8584fdf14ab6052fd20 Mon Sep 17 00:00:00 2001 From: Kiera Date: Wed, 25 Apr 2018 23:52:22 -0700 Subject: [PATCH 167/236] Added new background color. updated other css. --- app/assets/images/Red_Sweater.png | Bin 0 -> 366718 bytes app/assets/stylesheets/application.css | 22 +++++++++-- app/views/categories/index.html.erb | 50 ++++++++++++------------- app/views/merchants/index.html.erb | 32 ++++++++-------- 4 files changed, 60 insertions(+), 44 deletions(-) create mode 100644 app/assets/images/Red_Sweater.png diff --git a/app/assets/images/Red_Sweater.png b/app/assets/images/Red_Sweater.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc1ce62bca0a82e71875ddf63e290fce5c7c460 GIT binary patch literal 366718 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

    07azdRpse2h0>X;{`5lkp=p7 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%0D6Qz7R{nLzU372X*r>yV{gCEh#{KFTo<%CE~t zT2fXn!h7nMA8pf!IK$8DBW2?w2J|Vsd8(63@O~g~JXOp%c3P&#@@rCpADZT~3cLyI z<-)9$mZm{{I|qKC3CHoXjgcqw!E}kQJMsB$v2qzt^l8&hInEvxjhGk~wiVR(QwCrt zC-*A!G*Y&Yb&{M)I>?&K6Uh7Bwkx^{H1x~&D#9PNQwF$%@p20D$o7=_mKj&;y30gK zqf7O~a4R0-xYxss$Y7Fr1>6CGJ7ma@ku(LApzQpspo7 zE}tU3q~AJ!%0~sykf3cs26;&9@6b4b0~QsMUh}}TkRs(*i8TeyRr)K%cqN>>>HT6i z5!!;G6Dm^0#povk6IajhAm&Qbvyiv)sInP(AX~XONf3&oL3qYE0n&VV69+y zyH_QzGoy3w9__vR^}>d<7ZAqdZHM$&#=1*+>MtAauZ7=$W}|oKA#CyEJv1%*TrOi$ zsk>&1`iix$ZglkcKg(h*HR8!0lkP>OSw$cxl+bZxnF(^y08uHtXAg!m4t__%(MU(l zqr~&u<9i_Wsz4|@M=y8r@MF9d{<>!Gj(QCtZDM-?FNsps%ItI*xzn1-= z3c#L~#g0oqm1<0%bf_7jgRc3xA@%jTCIyMZ-Kv$!#_?mt? z=_`x`)2uxFh?aXzG9nHBV`v?z?E-AZD?t(R&R;m3jQ5j1g6OiN{@Mx|KasOuV5`K*%o?&)LhNfoYI5 z4&1B2U3qxWnkzHr=n2m4- z#W7tu^HLt-<0o{5my@_8UKE5uSA)s!EM+&ig+_+>YrrUH=}tTfi@$R8tH|c9JS7hZ zbL8F2jq|Ke*_*M%?1WL|la$HX-WAK<{N93lIx=8@oF%9jq$@&=@=}J)OD_2_oCZP` zm(qg2_0ezukeN5jVBPZoX46XKzAHM_}YMgxUu%t>NLd+#Xk zA4!WwgvP`5^~DwTY4k4XIn&8uKE? zy=fpH9q^ES^Vs_D%%Z%Sh_nYp?&V)P;!|0-4&Acp+Zn4W4^?Nfmw>c*s+@$S=Mqa# zfAT%JsY8(o{Kjwr=Mm|Yro0x;4|~ouf}o!xuEF^Ld)7nisI;xmmT`?4 z2Lo(yY&)zk_sHfm4fiL@6luyVmC2F^!Ue~hi=V%Mi_!?6#qKiChJE{VC@iEG0WJ%y z^EUaegIO1Gitzm(mgS{9mu0$muf!x2;ZIOJX`oJwl`sU3);R9>isSy!)N(NAas&|WjNVo(st5oAa2H7J}Z@T=R7 z;;G;;_6)ccpH2+AD%qhAnkZIucEM>XlXrGp@B&Z5J%U4J@;0N`C|u#X(wxS&3BpFB z|A{J2d@cWlmEUTFpb=X3lXRfSOVvmf#V_(^1QPyL8vLNvA?cO(6GrwW7sW)pq}P+P zJlV)4LyiI-!LPFu;_zd2C~3>`kasth?gsocEeA|J6Lk5wiJPI}B2cgc`z$)hr2P))%7sPbxD zV4aOQW2VAAG|n)&)WUr^=97v?85E=eg(C(FN|@h7Q9)FpIbwO$jj-@0+bYA(l;w09 zs5mk$pN=ZKQQuM1eP`83d^aeRkuXXtc_|`ab8qE^bn2y4;S#~CS#PW7OH~gNrKL~)gpogR7#BV!V@W@}fG9LPMNaULWmTlx^5y;r4N2>57z@@i7@ckS zKpKAFn<<%*pd4vTyn|Oy6*}kgxQICnx=Gt-(`w#H*GvACPYq%q?;$K7T%$aBOmt>C z;i+VTJmJZBGM`u`hD3^AS(GE~JoGlfL5zJy^__XO%{0{TEU6;QePqJOm?)mC)6`L6 zq~(#W${}?NTDB)1!=3s~I&9Zm&M3c`-2hhF4ziqb_<@5P8U@m`?#E~cFTPe>h;ret z(`fM7_9-oxX$4=7x`i(r4rh#yFihojpS?xl6nUAkG2p@X1kAm-of2j*iS^quKF7u?lf>)1f|yH`W?45Q?pc~)vh?~$wBiGCgA zml+gk9KMe5w}>5KTF^w^3eqYaE95BjO>nF6{&eqSX-Qf~k1AaHs31C87;p92|8s2-kFCRMxk%HR9u`j=n7Cqp~&~_onSskd}Y zD&?|u$0*&yXSNP=VvtLS zB8KO4_;!@o6KFbUT0`)NQ{_M<(fubbEAr}nt0gdh;8Ht*LX12WBafgpzRHL6RMue_ zIagJ6y}0l4kI)h?hB#B93~MthiVYMzrq&TsFO^Xx zXkN%+FasaHP)Hr&G(qS|OP5*%sU`@8guGFuc|r+ODOSd+Auh4X5;HLaSI1X!zCHUI zgf;!g$WQw2J8|?qdozSL56pit1K?BsI=_TVQzKYjRctehCLQ>{lVO~)Rq?j$l@bXu z%H9)3D#!L)y5UqANu*!$i(me@%M0jCG2_0;AwNQBDKd(R=M6B<#Hiq9rpNfmHwrp< z-1Oc@&@F!&WHAH+hpfm~N7v1LXE$65^ntQ|0zM53v`dsbHpCK7gUvFgy`cXS5zOa& zc+k9;Px4LKR9UXF;F2|%i=wJ@tUt2sOo~h05N%3;#+W1J8pEZ~mOM1}l$B1I_L-j( zHnqDa!g?U@kvEu?l`V$`h5IAk6ZRhe3-bJe^g4^`ES0iRc@-ZdO7`4Mi8WMtx^KX` zZ<#SKtn0}U!fMH6jnMWC}X&YqL$sOfm81 zXX2UjZ4XXo^Q1uVX;^5^dis{ruo_3#EJO7R+_#iNkEQjac|eEP$cdlgM7H2arn&?6 z&*-{=8UB|Twz!a*3V1Wt6^SxZQgPmzoHo)L_rkRtzv4{9c^GiF$BJ7pKIp=I2t8rN>D}YiDN1YrmChOMJgLoip28$DPfGj8>_{%w~+TsvL18Zbna4 zZb*+Eu!#ykRt)HyKU~%M!>7-HI+|t_`g--Iy<^rc&saWijUnV3X4l6nl>7mxp<>5e z=;*}TvoP|nIwTE8>{afb=-X9RltnGg(g;CD(!?*D&EefsfuecJO&EhB@epQ=t5ReM zf_`o0ExxB7mb4N?RQ#1APcBdKL?x9W87`GiC7=|eY^ydQ(zMfuAJcQd&~rX)WeAB0 zh&)xI1E+-LQ@&J2oH@!jJ4iIV^p+ol``=w zRk>7&6v({PN5yi{k>JC-Bb6qXhI{6e|kA#fRzvj^@waj-O)q$B^_Gm4K4 z!ZUO-+Dp916RI&-$rI-1C@)9>82Kp$*Ko=sa_1l%^0$_7WKBJ|O%Dm;UxN$!;83aS zYvOYZFyVFLjWbr3Bg>r2xA&H7y)>Gf?eiXS@k^A@K1IPk z#fY%%A@PjdYs4N)Q{Jq632py9bLlCRbq z@|pJXgp;E_vn1~m1@+VY!QL;X1=?wfdD4!GSN(*A5_moSxqqvzL441gWlXugr7LXJ zwu#qr@|NyJe!r5O{2~?{KNGI$AxW8n2ieu01Y)&{+0!j-e@t}m}JC`iR>E`C>5cO;eq+9lg1 zzb5Wbkf)+yw7*0e*Q6(`(_t87vbpRWbL1u+k>`!qQVZ1*6;VfxUEfS+!TT}O)W;9Z zAOLrKd`jhFB#h20sKDc&qhzT?$nKKPF!^MvYc=_YH(;hJUYVwWqF8VA|jLn6$JlGmkPu^ zdE?TIJCqccENL*8^p zfw3&c;D8^OC8^k{C86_2iB(1r<{tz&sYUki71@w3mzrsiSQj)J>W;tiBW=ku;B5Sk zC^Ig5I?hNpb9N|a_xRoNT@7WVAe?#IC(RlNpH=AKmqFafRfSbUz!?LN?R`(V_E{rO zgY*yb?hh2q-#H=8Gy47Nv&KgZ2;w677z*weQ1Ld8G=;1WUMi8o3g^3J@{oFE8c$Ft zRRE8H<${)3 zred2t0LqGVnO2u8xwih+GS<@RAcA>g8#6~Z%G3|k#h9P~y7~T;v}hn@hJv)af!7V$ z7x3%sgr_+95l(KANen~kT$X^r)MUsOm*kDyn-}tm>Fu2`%km?89pdndgJ0VK!^}AA zl4Z-XZ(2QJ&LA-ol)R;)*Nov{;Ae1x^0Chpg>97i?8h=SB&Ne7@SizrigkI%DNy(F z0`4q*f@Wq_984iE_8slFg5qu&43XRLVLqC6-fc$@J*pY`yY$JKOnJ7gJA9~thH6j1 z10UAm7#85rReM=^>kRWPhilkYVg^vIfw2iQ(WajENScwM1pqptnZYkp)_ju&qlWxN zltK~gsdhEobcWA6(({fyd?yy=LwREiX6byFx^hG3{AP$$$DdJ8|*OIVRO_BiPYBq@y;C74FglPgGJlQGt~1wANZhf=k8G zBWqPMXO2?SbIzOzKnqoQGhD^V&D35l1GAI2oAwf?3WiC`X;jEgdYPG^W46z=^OY%a zn;$A}rbES1g())xAn;>?c*}egq^_iBOeDP^mVftWsI*1VRa^FXa2ef)PZeVGM>!HL z{JHNX0)mz^RV8P52B$L09DsC8Bg`g^(J7*Fgnk(mG#kV*{rrb-OP|g(SYD)S`eGPT z9*)Q}VKS17GG?CNqKLUJJL~!hFXdV+AT^KWJ4po(am{nfhYFW#(Jc~EjnQE`r3*uu z-H^8Lz;$I@9LmR(3F}@DM}{$<+4zfsi!m{$z?tvY7{o4(v)t|@Ps_A3e12Wtuc0#- zoAgA1Chi%^o+Iu*v#-JR|H@N^`;0jA8%B1oFZ1n4= zpd7=mJif>97jJ#x*m8+X5j_dxPT8jHdit6tT)_$h4a@{uw~23kyJe`I+LI+NmeG_A zqR)6{Xd%m;{N{>B18Y2FMnW8xW3CzU;qWoO#(cDQ0bXZ^a+z-EWvLW0vYh~oSxro> zl;M;HWKr#jJ-~a?bvMy`6-JL+5%#6ju-NPfo zJ=TE{0_19@Acor-)x(ojZq$2ZoUvui0QFox%~a8NYwPFpXnp^==}9w95e+(5)G-Xc z?r335IFyiaV00A}hWPL@IEnzN+wLhm1ve7u57&$s zOY0;7M&Bu;GM*@5h+lE>qIj56c@&ku((bdJY|YQ@o#w{8MS# zY(l#utnxe;CheC@{kyuzQk=X8Z?do}dcP$}@=-2E5`v(vnX-@osVagXcpY{Q|)Egs)t=Mkp&0Qw!B{xpc((0t3FcqkM8 zX1obV8TJr-=*yW#hEo;T&GNH-r6ISzJsUqQA69td*?{0G0RVL^24 zQhrmxsccj?Q#d2aG>eNS@^+?aReIHajaN<3D1tNXfxp67!|}3)!@^Fziv5q`oTf5c zqRtkkLDnSBR3(jYZQm%|77^CqQA)sC3a`egX$)_Esv*$>8^BQB70_v4`qpa|mbFeUlX6Rn}drh3a9CTA}C z;GXd?3O^c}`~kLwwX+@KKusZ~>||i9?Guei^xZvANwtmlF>PYTlIhplH^oCy~xG#nuSEm@zl1#ik8oQ(EJA6_%%BAQI2 zV65o59L2u$<;f^sr9)vXQ1Qr5@4=*mN|Vyj%P18RJ&6}1cW5jiJWZXMIY3YoAFTfO zo3zY=e3-){*!V1(G$>|zPKDP??3@duReJDeyH>O$Q>J_w-5EtPCDHc9%e}agD}HKG zqy+%YMl*`DM&QD80&qh<*iIG2!0N)pPs+!r1M4y zQc|rGi4n`FNl|+l4smIWYjOc+JQ_arfxV-=HuCg3p1dw^BcUs}88TPJAEjCTY<_=9 zVf^RldY7^EbK8vy{tT^!|EW#@Jh?I|Q#rm&c4xciXkbiW-KPwdt5M>YL1AhQ*_wQe zc1Vq!2H0o{BVd%=_@?uFM*pN4qHpQ|c-_4le6zSd`WQv0m0^6JeC&m+>pgdq59N_; zGxW$K!%)r}y+G@d|CP^V)wCiqkgy0g{@^nthH2rWK2l!Esxmdb^(@$eM0xSiqE1oA zfZg8|KH0WR2!^+j*>!%7aB#1_O=+KA`3(EnWkLC8A1G<5gXXSjf_}l72wJ5>A36LdW!#A ze!WXx-gcW7XLL?Hyc=QZNnYmN!^LYJ+spbq{I2lpb8r6-o`2&DUfr~*-vTU3j?f%Z z6oRf}+>UYn7N~c_9K+(5v<&=xG;8PC-FV;neGLCTT=`4W|M4a4#NByt$A7|d+xW9*31Cp9KQKJ{pGKZCW{SaC3LAx4!#Tvq0LqK|x*p`~Xc*?i zpk;t$P-Kj`$=dYhX?Qn-LZ!nb`E2E4_zcR$#mku^T^#%xgQDluGx!n?^p#JgIf{Gl zXdA`1_?Ial=-Q0{z3daWB=9Cslb+EeM#YQHpRgS-V@BSa<8Id`O1#_R=~2eT3?z?w z5&!@|07*naRHxV(P63MdlylCp_pqh~jO%(s2e!~&PEp~wQo|q|N8pnDBKid#>9v6 z19~_w+{b%lTq`V7^A85ra%QlIlXBYf{{EbkHZYS+S3h|vZ-#v zkECQe3})I8gQ81$N>E3RMwZ4!>7xbD6huj)e_yX-GlIc6xp2nC^A3*u^dUq0Lk2~#be!14;N$iCN&BMmc3M66 z>h-JXK#^(6+89IS#aVULY;ceG=M zTzefc<#_iaBR}ktU(x|^rTKNxH|hVH5sRJHMcbFD?f%C;2e-lXTk$-GaPxkEb>npF zZTDxqto*v=Js%S$H17J}&ZnDrTXxvhc^8yJ_v;kKuR^ zz*_m=^4dAOrLiOVTPFGM9`=E!TM0SH)b)?1%O-JLe6f=?N>>&R(Z zJOR+)Fecum2-LndjX^KwYP8MO)^n=42Tub22aQUNEme?Gsmbx2`R|c4J&4kS6nME^*LV-^zH6*6YlTnp zr*u#POurh1ep+YBMx3BbO!_H5DUx=nF}fnfQC27gPn!u`<81HvP#DEQ1L`iNY3#3S zU}rjXZr6I~;NLs^HLSR4%v!IWAJ^o+RVONoRbr2TznAVx1P>R!h%QUrt?n_#{v z{}~nTmnlZi;L@M95PI@ogp(c7MsZF6p0)Swo5~X-+N^hZ$uO`Wd#3f2mwIa%EDj5^ z(D-Fxe(u{Sj51?4C?}8DPWU+`J6h$WsY3WLLfHFdGI1FVW1RN=;-s@&f;m%ba%cFg zMdy@sXPQ(VEAKN>f!@NNg`362ufpRxnizBB^(-UeG+ObfgVgH;D6Ogq(-7r9?$1?t zucP?pe6`7gbh*uXiQwWZL&0dg4O1gpFM?tElR9VA%ffyRS1{l}MwbGNe)8Kh z8U~dfMkN@~zVn%KHhz8i6LfmuQ<$$A9?7WA4drE*X={=KG@T3Q_+H(%Moud;}Ide>7+0>dcr0_tAX~hwfF*@ju*D4ADujmGZeeG<0~T z9*o|RdF6Bd>)$ezWS2{kr87M|#DKl7v7wXK@=&}CEL68jhYO_Jq7PatnqIY1E zvG~yqh7pKNlK9j63-x$$0Te$&;!}pl=MV9$aLPG)jK*ALEDaPqVK^BFZ#3&XL*%Cb z{I^D7{x!M#mw190GIu49`%<=N%Pps z1>`^W$8Tp)+{rB2bd*2;vAON zcqb^Rz%*o(BL>ABg4g?B-@KlkJItT0&6owH7L{sHW_?1+!&!|xV}c^=04BYpqoju4 z?DWKN3AS|!Ga676#575RO(ATJMRU3-5tL^mBf?U+rbjLOD6kg7en>%{Mn4JC)>7<* zwa(zAMcyavYNA1X7MG{i(@)MRR{pDRsSHwqF?($zIjE1zyVSYs$I^odkTu6qW-bwG*PU=p}yJVGh z%{Hm^W|~?Adpxp5D7t+6C7+a1yNB6HMvwcY6Uqx99k`HB@aMt|H1ta*^d5gQEiaxs zS0!nF@~r$@21WDwQwD!ZiF^|tYrE2DE^=z<7^f%6#q0df%U7ER*!afc;?MQA+wJHV zi?mxS#JGJP&)zU5@;7>5vGI8Z$*0$?(Fmhof^!}1rjN|-P`SO)quj{IbvS~-*pN25 z-3|=9DkI5_GPP83Wfp%@&U-QCYW4c3rbh>5ZRJx+a&e4uxh&GY)=SOkj2`EToV4kH za>3{|)yyUipIUWY&dN}~8*i8VF%sk>c^cS-Fnw$eag07Ao3elcKGUb7b*2@?|1rq$ zF=>@&Mt7vkDAx0BQLLf??wbBVTqlGGcStdNJ@AU<{WyWC*qYI3LYuGM!F&RA0_F-h}_u z0bvnK#-LDEu9~`d@y@vB%zl*i$7Wg$57bn4&S&{r){UiDtm!$F2^_R|X;LS0u) zRbr$(Z3Hr;i;MpL!VM1U;5i*T80yaJh9i}~^XfcPHfN-{@amN@*n>mnR{0C&>(XhB zjW|=@Ga|0uC)*hmpOf36JDjhp`xq2t56++4?wPzjO_rY3$?#KW>U?e;-v12b|ERvy z>GK}L@Nepv-eqbR8vY!Y3=WeA&?&n%Pl4`UU%JVYV}*6UKLy-DD-u=;`e;b41fsDCZz9H9 zDUGWFt9=-yvId3{)U9zjZEeI^J@==zTojqrTfgd3y|FKAi2t>Q>;3i5GiUr+^U6($ z`cQ*!Sf3GK`^`Bh&3BE(MUB&^PakKYsi_;Y+Ykk+c&2R3I*H^$y-dlr(D3Ja5iJ~6 zS}CsL*#(9oYfDV1Q^xf$YTqwLVMysJ{w!K89-|<&r1q7uo~Oo)cBpI z*tC`~WwZt{MM^LJ#YMQ+19!$~N{N_8x-b-sd|=wW@KwXDEhKA%(}qrKr#i83}*FbZX{CFOP2g2;p3jcnNVR+>{DOMeWyct5?hrAGl@>rGPNf=TfiBW?Jh zv4BEKle`O$l3Y(7@rD7(eU#Mv;4m~4-r5n$BqbPsjr1^-^kBO14m=7MMN{AX;2B;q zY2ui&bo%ObJ1$+c5IJ0f2O1@5@5zUfo^$eilFWl;>r%=urQiC4*CFyU_m}0B=|{FH zC2Dk>>FEyM(|V98@oD4X zgj)GTIix`1HRB6RYY_0tMga0i@{`9tF9MZ%~qfqLx5dewi5?u2CG)0*qB&fQ=qG}ux#l{Yo z+vq{IS{*mBs5BX`>LNY*6^eEC%+gW zD6l#XP7GeWTq6|Wme3lNm^BjBX&=K!4dxsY^7lD;Q@*UVxa=$mc{L+F)q#v92Eyl$ z@#1YVT3*erW~KAgs6==bU>O*>;js~tF}TTAd>8{L<3)L!{G4{?^OJvW)aK`mjHgC> zy8o^CKNnxkj0E@aFn1TW-+!T%kDqzDKiKc!x=_7A^aiiv#Fdrf?{9lozLb}*T|ztv z|Lf6<`v`KSf6F&`w}OMuZAbDxfB5w$=uLhdVvMVwhw=C_>><)`^m0EgtNxPY&~gVY zZg?|K?*h6O;p_cx{XGEP(mDDD`p)MewI7MX0q8fp{CI=nmh>HAFr2?3^IHqg5riM} z`dEQ|2=^b8@^1tsq3=%tCSI#TQkZj#*2`Kh`^R6Ws8Z@MomjGrMkaQd7L@g zMW>E@W^kljy-!)YdVBHYuYc(#)YD6E%Q3pZ}t%Z;++^k`CcELVkAu`FkGP4Xr;u?BF^a1 zL)yB7u;3}9 zl<`5)Ik)zqG~E_rdm2S}nKEW-6N4g_mVN-_NAf-t6^6p62j1z&Zt(5?W2@g+g@0dJ z`Vd`umyJ%m6r=g$pH9n{*Uf!5YL-!6j7C;cs@unP)*2=A4*x5MriVHR!3c@qj3Qpx zz>ZO&Cmb)7Ydk8@WQ5Tw_nOj%hy2H@_rwtGaE~UkTdZ!fT%6J+h(#ZFzvyQGFgjdh zm*~yt82{WT!Qx$Re3FJZaGR7Tku7X~i4`Gz&aUU4LE&OQ)1>Q~_BS{8Df$^AeGi$%X z^|ZrjrpHy-7^WO4b4DR9G90hempwlbqVDX_QSvXt-@2&G$I{79ZU?u>62Zp&s-LR| zuY#35kynLJUR7?bb#TT=%o}{3H46N^H4mmXsq>0F_?r^NpfJL7@%BSyp>k%?8Cg;G zyWjotwy9t(=x=oGyiu`M=T!cZg39Lghekt+N5V`^opvNc#)chJkMvX~7+4r2oK7Pn ztKjSS(77XDOeK5W9J;p!eV;)=HailpwAyw#d_pzc$%|as?&#BA`Mdvm$o>A%znv?5 zZ>}|u{^lD!2kmi%{&v`(pt2fP0V|g~i|RxsKBp?~q(@hLmG?;1_0`9`Iiw z_E5*q8?5fqem~2^{q3(EmpvulQ~t?w*WwRi_YgNvA>c0Pf$#T(yNU5Pyh-OM`XqDg zaK}&m_j_MI-k^Alf}QhQn3Zu4aO6HX81ztZ?tcIS??dz0jgb8o89N2=E-!}ujR{G( zrkSKyr%#XbwMNk_<`kf(O(C(>-;0!#=dFdP#hJ#_@bolb;?`)H26gqX|2mcAz@yYq zW+U=a54gW+{Az48fc2KYYx=-H|oc+o5mMV=sJ2RA)f)pLN&PYX#*giF5l&fG7 z`kKuCR^zssb)=z;C=g5G1Tc`h zd(WvD3p9?IczMmRO93)9Y0gBb zyA*%y81}rU=}oT-<7PO_I*0P?FYRz->(p0`5STVjCh{KTY~ikq;P|53`T%P{jA9t2 zJIzr3R2t5YV01bQ!brxOaCuo78MU`Eb=j%LW!mtLQF4+3Cf6B#bJ}=>elGkc22FWe zk?f9_!IHKuV9yWA{o)(uj{M+DO5{jK;Ro+}o0Ut(7=v2*F*-=DD0YjUc-@=)B-jps4zAC-;#3bV_-@chYoAXeEboiQlFCy%KE zOKJG0a2VYY-wtIZI%Rl_K6O#~dhz~4J1nJ$=gmkoYWK5s4pHK7Mo5N+(2b8q2iH2T z>f7=gpL?104Y)@+zYN|Gn{3UNuBE$pTAE`jWPF@58A3VSLTZ)0Xf`rCQ}A*gI&}tQ zMBt6O1L3BYT_?W`g{haM3zlhG=#r1YGR-LhhHmlYB_qOU4TEoOsawe**XDGU*6PG) zn$*SHIeMev>GPDf zS1;P{hEiH`rl;)r<1jr_S;ZI^SsRrSCBcqDA;+Tr6c` zjXr5-@}J~O&y|SrVR{zAnQE~WH71wr6GyA`wbT~2~et|NLkQ5N*M1# zOEai+kcl^WUmV+H%Ja|lhEBTt3xtlj`1L);&?sKf(39>IxJhFnM!_kMLu}Roq%2WX zDB~(7@57hAtvRrzu_;TG8b-)WK}s%9TBtn+Mft7A)w&xqHJd#lYeUH?Rkdr^pZ!ng{5S{R2lg)yxiy^3r29{Nk=_|6TAwKOL@)+z=?&k7EPxx z#y7i@Q4TNOzE55+p1i16`FYADLsOZY(S{+svd|O1KA*>&Mm9d1n^*ZVJ#6Ommp0{) z5xv$)lBF zh`yO7)RU1$R?xqMLitK|`cAs1EMnQ@dufR`G6rP#T>QhE@jvVhRG{aY1?1)J;(r;q zd8|R30tq)^OD`DkN4IN&dL21TcFf_3z&dD78l{{9Z|W1i8I56pGiFwO&@;Kx>0@*(sg3vDLw0VxPr1z9$RmU0 z`n>Q)%J2iPx-Y7W$51IfO@VSQXRZ5i5TCZfv@YSN10cG^BfIE_uko$3jA*;(31@ni zJSHD@x4Le+)a$0!{?|4UFzxoTgg!>&&)uJ!6Bgv^bn@37Zl1f`OuZ=+y4248|EMd{ zy5{E*6wvgD_Z_dHFE?^|d~rXxfp^>cIOuQkzR)QzzJr!85ZU8~`=VzL@ik(KxGMW1 zd@bw_^XpGV%5?y}KIeDOhxM`WU1=97W*qY3D9#tJ;19!g!oLXdAIjliP}~ycJ1khN z`WnN&=6_d6`WD6Gjsy=bM?zI`JzzAM+~>jV#_JGffZk2+$oJR3{z{;O@1E+t2=AU> zKJV~m1=#SI$AYIapg_)5oE5F-7RFOE@Uh0@Ej2yG!{K(XtIS_j;m=f<8akEw#~K9l ze`j$nWr3Sst)4SINRKduws|qLreYKXy-z6$DQCi6)L34gq#$aoLs8o2oAEMv9>UY0 zhZtOE!6_x74-3KNp_Ku2E^Y4gywwnz{=xv#Yx=%-@?duw#sZ_nLQ9SJ+|O4}wgjXx z!fwJZW`))gKDbdpYnD?mEpDA@FNGo9{gmeAelMK*m_6d3>oljg?W~O_9D5PX>fQ| zA~TJzsdqEyI|m2F1+6JX@vM;m>nBWk`b!I=|I!);BLs|+pL%~;UNZ!qjyy;=iI-N2 z6g>61PgbE5p2B7%OH<`!!_+dm2eMUCM5M5XfPfU57czCM-S0BfmDf7yS zXfp+|^ohQ0if2uT3=WQ8v;}<9-0K=Nm?k+!KxJpjoI^#e4GJbXR2Sh1qb4AY4mvse z^OOHpeg3R)=kefqmGJ*p{{2h2@GiVQBtyDj+_*gk5hS`6M(ep;j(@j68|??5jgG_j zeJ`Q+;I${Z1psbwMF2edsG-|sjc{Jh+u z3EbVO_mLM4fvCa!+_o;62VaF^|($vEB-N>*FTQLvO{O7~ph` z01>2>+vBzhOa8t16Y?gGw}p@fL1XYSh2w1%`lotAFPeLAap7!TnL>5`^68Uz^|rmU z@3>~rLd6;iit(o!KfUTNn;xb2eJL-&q4b2G#`Jv+kse|V%SDauMLRIf^pw)pXgzDh zVi_rg2{kxPPhkz;Op7UTW52F;QnI;wP)|TkCUK&Rg1towYIe+1rHZl4q zdgMVwFep+jh8X$6onl}Ys2RmTXWtrr=PGJN-`m=ifu_Jt%XJP@YFmAo4^6R9XjGneu=yl(AXnKBAWada6JjGHxOE4P(=dBac*c7F_jbMw@dk?3(6`z%04n<*rtBvK>8se7jG7_B(5 zpnMs;A(?#Cvz^SPT2J23cAp_+Yfqzm=o`cBIR!FUf!6~}!Q16#rVf>^X;M=rqm@BH z(O0&dDe*KTjUqcrW%$ftZOObIcCs^o(ODiS)8y>Bj)r~eTOKNo$)BMKDus`f{#mDZ zK!OKSya*q#s$ zt#lc?>R}7>Pm(Ru)Mi93d4M$*l)xCqXf;CM^l>9tQzlB!a}4~#!xys42=nYCCr06% z+MX;={#1U+C_0Dd@pVQv$_>6K+`qdl3ezqBScmm+$2be})gN1iS z5p?=k-!|LRwmxIdtjJK9^wH21sjJe;RF0m;!y{bXq1^qKWbkEEpxz`)|2@)Qht~g0 z-u_oO{}S98;g0AbCmhkgKe)+z7hJ~EW4*1H{da^TZ|;4QC)eISPu^_a9tZy;w_E9M?x5^pkAv>-iwFDHmrocUr%immcHN}6%F7`N znfT%w3~yWuBL0Njenw_*LOlAm#av-R_TD7Nck%Z)0~gEpIJxQV-X5nusXpQdsk`C(K4wmYRkA0Io3P4I znBN!o9&pR)nCd;yeQvwo!_Qj=#lyk=(`Rwudzmc!cjfGtjNU3K9!pSyxk<}FJ_3Ju z{Q}K=a+_i08j0(sLg?|YIcpt53$yEuyGrRf@1_Kv)L_*z&9M6P4A;ZE8onCu8Vpm3 zW+7jV2pHmMW=)a$M8lJusUs=*)0jbCD?Tkb?}p=Ra4ZJDNIAHqh>3%=eBT4uGuIh8 zp@60_wS!X%Qwp5J;a;X}*m=i3^LERb^$flX>#PBaMM$rPcS~Mxs>R+EC$|b^Diw2r zn*&S{bMRBi=B`kt4A2H37p>gqf~STyePbHJXwXRKJc>PZ1y;$-Umlbq&XZNVT$Der#iQ5>KT1ge7M|&!6i3PU%mH8Dk>4XRSnV zj7X3Z)8w39y!bQ8N_zM|%5?B#1Rl;m-V}alj%ZVJrsuXWVJUOheDq*2g2rf0z7Y%V zDAz`_o-PBp%pU`~$oWSznM7;P%cqUP5v;C3C@GDgl?052A`rPK0OcBU0UM|-j zo9w`Ff)sdS3Df()8=mCPZT**Dt2{z~cbCE#z{U+?9l z_gsfoe$yF(rpb>UAp&pp$e=Yp5G9lQBdo=le{zsJxOk`D=#K%<(3>(-xO_Ia%+8{c ziRQqabS}g76+<}*4|j%uayRP}OnJg{Y@Wn69_L1J*V!^=jdBxuGldbp;qRI{r0*yh z`S@I3BMQFaPX~cC`&%6kB}A^2fjWj}WVJMK61kJQv?m{v`BLWrf}P?{Gt5nKGDGem>OaUFEJT6?-X=Uou)9a>O73LpKnu2%MwAmspqs68mE!@tJ8>>wI?=W*Y zT;RiS-3R9%_cBcTc5t!*&u(2{Ja9d%R6Y>l2RW<5|IF9oVT{~)`3K=Ua(A4eGWd_Y zc78m9!-E)pL)=He{!L#0X;6G8`@Wi2Uk&h`34Rg0s`V(1n^$j3#55_Cnsu$GX2X;q zJ=NDWhSNw?Xf8g!d-AS1*QZtbr>!^8AlOMn1x{75cH&jN!y0joq~5i;_0n1gpn;o~GSco-nrf+1GAXeX2#P9&%M=QV+w=(Q1+9TS%?M(Iz`_WN zG$2iZm@E87`3}ZX+`uao-6r^#@xdv>G6rm?I=d&GpbhUSnjnY6D0y%Qul=GNp_y(m zIYz2szx;r-B+1NXw%mBx)96g5ds?Sguc@Y3y9bV;bik_`IW&QKEXeAdfQoiR* zi1NX%P!4At#dVaf5>7T?FiN5`uU+3sd9g_~TK%)-(05 zJVp=9_9;VptKXUo>K;^Eo!Di@ASQXCnzwvu%=N=Q@dCT#}VTt%J5 z{UtU%>GeVnjM63#PlYQTI<$HCjIvqlQ~3z^EWVwM8B%z!+Oc6yG!HP;#-KnvS;}E# z5vdp;3p8`9w zAHT_+nqaE9a2|e-1m@8{WnbA-Qdap{`LptpKN;I_M-O>|aMz6B#luzB&>vrdGm3xZ zg`|+9*)}?~oiMJ>KrlLHCo1#=(|vwj*T7?n!O|#Nl3s&iRfW*Y-F(Cvc9t`wI29{et;x;XM*}m%G0Wx$lpC!^7{7 z`+LM7su;eWzekFXr?J-od#GP43KPG`ck_LRf7g9aZ-4Io>YBf|>+i>)kU{-D#AJSt zUSILPH}0KE0*I~Mnc!aq`PBgTruwMkF$W$7FVueBgyMQp>80RMI?QD@WrI>_AM@Gj zum)!KzSoe~NQ}Z*_?cs!(q&styC``Y-j*MWP5s6kmBVZUN;$J=H#FRg1>2#H0#|xx z?KpLQUV|2lIkB~fASp}?4C>xeK*Kk<4#k>j9VKI4{Hq#KXI7Z%GzvogREU$(t+`tb zdr$Dzw1%bh!cTL#dSgowzI`7u7EOy3u5;PB$_cx(b56Lg);lk-N9ihUMpf_A3tz)c z39(QSZj(mu_%w<@39MfH1%GI+Vbzes&ux3&G=O**to&wP{@}VK-OfjGZs4q5)8NOq z=~WEuC^spRLYIq+M*hJXd>C@wpop^!mBBFj7Xv8xYx~-T)AXbkc_}=4XK5)x0JAhL zoF0`Z*^#ES7-9$-If=J;KML4J3;sxlf=EvIKTjqp(ncnxN3?haA34A``r2BQLG%5;YTp3X>zk(@XjOh&ML!bjzj5l2qYooBoq zkNJi^?uziSF+INFCj8JbB?DuG9Ua5++y-|-5>c-8-xzCVb%33|MQ*r>a)Q~ z7gP>l{m1I;%a=`eYOC63 z)vF{>wJJ?$trF+CUpH^KF+S1Y?KsqYZm#S7kNsU(-{Ag3unFA8fqTI%p2U^?<=#+V zafI^U68|gUd6PwXx1Qeji<>gAe;+?N-u4)I86ZEH&&SFBn)eOOLG6BGeht(=eVo4^ zg90m)nZ)h)W$Ll~_I__cy$2;qo9kAAIfk{ozyEi5a0KY+br>{EQrYG)ev4yXxi;xy zI5;PkHbrC%iWIoh8i<*i(L7k|D{8fBFKQ@iyfoH!CwktLCdPyXbc~75#nWS1(>$IJ4qT(n)S-aqN+Mcf68X% zaMV{m(_LnM=qM}Uyup2z(q}Ek$98C$^w5wWg@vMF%7n(Yc9Sl%;7d39W~Y|o4y=ur z7B^b7J4%0XXPVB2CmF;eM#bu(TxpCN6yi8LJ*D9^J3N&Jg~Fcll!;F%&!Zsq&HO3{ zFd;36iqP5j_DniOMl@vTXL47Pu^p2r3l8Q(4Z^~o1Cy z4fpQ2mO$hsv&&{O?aT4t7da!4m0-!*Z zgd0wahh%3f&&k~IwEPM^T+#mKT24ny9@0R4pW)cz#m_{DTkR0(}-%g z94Pnv*~@8g^zMJEg`_lS_$YAJIJ`B@q(%S^|KV$(xmk0-4(lkX=r!{Sl_dwRf>ZhptR2)YfwLZdN+-$Hdsv88X;J4ExewD zfrMMvzWpKvitmYMuvW;MigoZ8A&>QrzjzU>cr(42@zV5{Im67~y1V@;IKgljro{Gf?f;gjRXB z42kA^TA<)U*S1B;FQ)VXA^R;>@DTBdkk^# zQqCECpHklC1*QCXX_+QRSu?fpbIRM=>z^?@z=meBeO9@n=xb0fn#yHL$Vt;<^pG2s zDPnY#FVXLWcw6CG6bp7K<{$oj2Wt4V7{2m^ALDSoRQ>@2w)hYfb` z{U2aXTGCX`CiU=GPkB3FONaknHoXsk!EYJTBXtLv3N!mCtUe(W;BUhgp289l=x4bD1FkJ7G-7MLCyvh=S|sp z@zbmLosygkjVvWIg<~;680TY%i_8_a1x58p5u6B7Y5gGW(i3_do+v=8_!-n$; zy3$39tmHbQtv%PMl6tkepOKrapPp$eN+P1lg34otTJd&z)h7eEAAf^PQxoganrW&( zCFlPoG5_D1dgW}257X{Mll)M&m7gI9DuWQD4i}d~_j~NOTn~Z%z?TE=e;^LunsnLs zyI->OAs+GD>&xFAu^*J+@Dvddb1b1>1AojDF;^}7wOD^1|Nk^7zBMoYh*EbCZX=w> z6)e1tBvz$9*9zEcB00D(4@#z{*;)mEFYDdCZf>gv+d|c;{%c4nvYI}7o;zFN<3RGW z7_k)HO##eplwB=L{}iU_A??G0X}$N9Qv2gyG}rxOikR?}DsWuD&K-=@$&~q;-5M3d zX^>}aLyZ(=_PWNHl1b5@By&T{EY7ZBGu29iF8;vpi5fWUcP;TKe|zH6wlmX3H)T>o z`J!!ZU$!&V%#SZ1#r=KCABDk)0mVXN`_$H@@ET=B0~)V$ILXUZ!=JJMO?T#;s{g zpBs6zPT`Z0hvApp505QBp0`fPeDrr$o$B5}W@Fg2c=u&=;YC{27%NF*v?P~9YfA9^ z1xdLKPv1szz{ctM-4)Dmn=M~Matx&6AcwIQu`?}Zcu79{n-Kyq3ODobcZHN@>cYqV zR?QI0;+^;5m#}aOZVrQo{M+F&f~Oo!UIr^ZOsT}%kUFf7;y1Y`vwFI<7eIKV}2`K z5GsR4SPlkHa_p=dTa=%6PRf6&9{S&#lK1}oWrqPaA{Sq-jfR!$$`yRnojV^wDTiS| zFAG;P@@KmizF%UsyUV-Z@*3#zC2{?eUVp+&`wcjS{nM$ZV1C23%g6rwt>xq!Q2Op5 zzoS9%73uzp_fYn2`SRUNI7Cp;SFL<-y7lr9j(73ezV}As7L4!t2p>rv!1ppP8y?>V zzesA91CWKl7#6ioPOGlZy@sV8)6;t4Qnbz}TlKD~tZRa52{nN0lK!d>HG=cCJy+#V zDWL=#BA=dEhCvEX;8N-|{`K_%P$OmCffOj&ZgD8cKxC@|r|eR?S=IrX+rTJdre*uvnadF?8SnG!M7g;kB@ zX+{YJEfiBa@X{+@!+9wL;8TA3kKQ;njjK>%ESgpvN*_UhR*!OKh<-rH$QURv68A*-0~BIr5XqlWu9_gC1}6 zkY)LcC8cfP;%SP_c~daP5OFYLamN@%7(NsSk@9--Iobyno{*-#ZP95h17%aR;lGTE z0=Y8{OHT?cdMS1mlH=usDK8j9XrP$m&shcs-Wi?vTu<&v2ZeP^$Lv5m=Vu5PEXv-R zhNmori@d=L=_Ie2K2!E)QF^J(TATQBwXF-lK}IC7qc< zRT?ujseB+Cact6=X><5$9f^^NddR0PD(XmMu+e4e7h`q!kKYt@^hjEsgzsRHJnWn( z^Oo$wUU@78L(F=srwyku{u#cMe!Um?;TkyQ4H=pmZ<`*ss1zXHb(6OlMS_nc5-t>* z4vIhg*3>F6`MALBJ%2Jd^%MM~5>Nc&UypFjFer?}B1a~Bs)zYaS&qkOm0qDUAaZAv z1aESp`#eMXpQ@Mt&kjK{ZPS6H|4*|0-wX3g z#C|L>qk(vY9Jsp+f<22LlN=mjoST4i&*!iE0b+rBBtE(y@qWN-XnDZz*m?5$0r=yL zCl4Wc6mQDV9@KNcj>2#{r1waeJ?i0k6n3xo4}M24xB0XZzU@|y4LwJZ<`s{R61n4j zZ{+7=T(?Ep7py9djStW$m`aTwhW7clIi#|l>Ftks+zK;V>N+dZc=D&hJO2P*6 z(J;Ta=MOa~?iY+j(jDI2OXp+pG5BWZqI;u1?6@VafZcc9lG|NKc4@dT0=EZX?ZS2N z{u-Qz;P39?a~s6^QixYodPr%Har-&mM`5;am9=@UAE(W1UToWKo~P8ls5LlAqp(1G zl(QPdnSKHfcky8`jhzOfkEJYC6l#o|O*W?<7f%oIC@OeLxzBABAPNDu?ip!F;nS8e>3(YA7K@T9H&z@R*9Dh+P zPJSa38(%3l(xtqO0#|wrtM~QLzWeyTX>Rqkwul+;rpMYCM`33DNBPPy(}M{d!r-pw zeR?Q^J4#ZBjsmuVj7+RK-_aUw6oB~)9-c2?!3`(=@FoX4juyPSDTb!3nC@c=#G88a zoquwjvVYwgpHU#lDc(dAJm-DViQzpN5T6)-Go@!4KooYyNrImK*Df^4ixDYjOPst+ zd1n;Zxr{94KO;tz^>7@8EZJL&(&O_;a`hgr#%D~Hg@~;uA_`$%u!Z*e% zzQ!q2P#9?YE>BRTNRBc;21S&?EhKvkzB5&A%6|^<=hrWo!;A8gtj$!ko?`P?7)H4m zSuFR-ckvsDoctkEGd&VdW1SH(C)<;&;Zu1g--z=V*IU{UqXaV?j6yL4)m_S;G7(#5 zni!+bBJO2ulB*QujLnns{i&Ua;u*t00!hNiyK;thyASDQSGFfF%e(6gkad+Fn)=fT zGV7MY&Ds}rTqz7+B68>_BhMQZF>1BW+6X7x0hc$prCjVr(8Mn9#&}UihIbw}JXVfZ zH6WeH7;fiJ-UlyyogA1vR~D4FnR3OSU$+_xODXr(Ud)=9{7rkstCh>rT_tx6)o8-w z;YEBKBXu(>a$Z+2Q|{GS!6l#C0(mKuu$(bF29Er#4m+z;Wa@#&#p`2YBYKlg{3Jm3YX z2d;??23-_*%mE@a`5aUyFYq^KSuo?Bi>R z%abi12h8#NeQ~xaV58QteFLWm#g73 z)1Pu$Q0?U?n$rWVQ01oS(NK9uEgJv;KmbWZK~zj5M5(Dg(11{CJmo968o%j{EqQRb z`GL1vL85R_ZVvuircd+6opLY@dha20nVS=pEgqk=0-0_xyFbmLOp<`3Myc?FYYp9p z;=D_du~6JjLK@ff&MH+3NJ>RY8l}a^$fx)3X3zNP`5ih}Auj2R2g*2QE*>;R#VO&2 z{o8@H)0AziS>pM{m55&9EMw4zDo+1ht8#kE;3`dx{fzM7N4H!M-Sh%ak;I$rP4~FD z3%U0^0=xHKnu1~7!u}^+U??J&HSE)49=+(}cavv@l2D=L$)sC)c(~`sKJ6n=ObJQ&WR@RaVT z>N}s(41<9Ko!*AtF@h%sr^4WMJDu4DiPAaq!CS-(ZwsN}G5Lfy$qnceFMs&LbqtxD zDaFW^2YF7oF-+2&DQ3eU$>t}>C|8vi=`v>LjEUUW2t#nwl4r-KrtH`-!AL_4?wJ9@ z+OJGbnHtE8UbsS$+?3LkX-akQH^$1FPo$?rnU+YI+M`peT z;352EZr4NJ2e1OHpa-XiUheYi?)O9S{m(^TiIuV6;rk11(;#E!47zs;x zO=+mn&~UC(cGvf6*cWRD?O-xK0@Yo^o>IOmwepwBFmUF5$3FKOmS-tf&uXyj+(U4$ zo&OMidgBIWZbl@m%`g>8<)tuxD*W8yQ|LgtRCw~nVqasY3Qr&N9%rujp7FS<1 zxBb&~6T)ie&&@+GjCs>~pvUlmlijO=d(!C6`+D6zUS@z8DG3kL9frm@HPgO|&)^tE zZ1_;b{aH%@Ci?K$f?^{qLj+!#rW4FP*X_W&KQmqI0JRZyyPRbtlF>c@_1`w2) zUh#zyN0Fk$G2ABKC%?g8@#V1IZ2Hj{Sa6(aBheVZfedu?C4`%w=bH8g<|w3kQ{%(p zGv%oiD8d;yc2v@nY%PNYxid=EsEuAxYiFQ-nL=u}CB6D+LlnpK-ozcJ4F-to z8hP!Ll5NVOk(kvpAEexsjTr?KTz+kTc0;=AOq^w8%J)fi@pMbSkC9XS6?d=m!3(Lm zbzr=&L*Qu&?pb_0ZxqT%*V7IJynfe6REj!qQL;wEiub$i;vZpSIMf;FQb3tkeMo9@KCNOQe>1NnN``yo3ab- zXpL9>hj)fdI8~h#9`B;9IAmmC1Sj9VlV@e1NRvXH7ht>m2CAQ=AvbbnT?v^qN;@(n zZX;m~vnAKkV;>Z@dUPSZc&tt^N_r8Gb~)Lnnmwz`Ja44uL+elQXYE+E*3YT0rqc;F z_}23@!{V%|Pp?|X_g~LmJh`YGTsgJdYL`Y*Kg0|5leHBW(QjP^{w;#M99@XqiCv^G zPmKJNU3=c_XzjAQfB!8{b&fjVKd*l$98ivT8Q#kDW0aAt?~$jwviKP6Z}FoG{kyw{ zsmHa>R=}pt*(;sLsGflL1h`vJ?|vVrc~A7I@a}W}9=E~&i-ff^(`c-w*T?n1#n@O_#W?lFuy_y>z6Y!Mk}*4_VdF|DtGfgKy zN{0Aj=#nZt@>4kC40<&DGqMnFea`oqQj`LK{v7e5;FEvovRQd%^=X?Z1-H|7`KW3JM|4`pK(HWwf7R#{o0gq|%s!)G;2t8&ug zYLsd>gw|HWrJ1sBgod%>YP@DCnZagsKnHSg90rs={LfxEgCr%Y?~$3p@?TSNR&T5w zpH6j`^QyP=W4mkFnP-gEA_0x3jLD>>ukcAIj4tIf-S!4Di19*C8Sp-kf;C1Q@>-R^g0SSp478DJS4ltAHhrxPSF@XPVbgZfQEk* zKyWDAPHUDIc8KE2K-_zAXR)ri^<)l{l1aB|Jy*%3MgBpB$S9!{PI&B>*D-#^t@wri zG}FbzS@D*_ABPAKIOyq#4AJD3u$%YB%JieHYcE&hm1a^-xp8xQL5*i#bGs^XpDfEgD+=5R&3N$>MXWALCm)o!sQDMGJyICw+S?m``$j`gElgB znY_+f6`LH1iWlJH#>jN|F*vwcvm%Ti7!EAqzzc>t^YpY%ju!bCO|vk4*Zz?-JJZbz zaCnkzM;k*7%=75`Yvtzus4Sc`Z}$A<*^__C>z9nOOu{0WY8D>kslOY(1$!65;SnVN z&Mpi+zJ}4q4&V3wH8x0YlJIjk?e9zKcMg5P{444H35bff!{bmHZ01RBcaN`-aO|zz zjEo;UKKwpqxA4d9!NZ|{tk2(Q3g}V>W z``qrs<*RNbcpt0-9(x0IAD|UTh2zpFF($M(^|!T^Y>ik7*;OZ^KCAM6UT@Kxy2oDR z_pE3ANA=crTJh!k)o5yPfZXrxRU@d;rzmZ0NMUOFYIp=41u2*mj5Qa(Vn%5#@H)x6 zxHUK$oqY<>c}nYZca2V)QjOmBys03ca+`(H!O|PJ7GQS}ShP%|pMs%5w%0pjf^w|K z>!hAa=V@Fw#lg82C6*Dj(!EM?_)xF(`_>w~&;NyuJby3&u5)epg&~K@tI5l)^pu93Yu0*z z_!teQG#Hi9vsxQJh8_ihEX_G4(MwU1-=pNFh&YqM7QN_=z-3U>8<{py0x(Ht;TYe| z`PY-{o(i$Dd-W1MUS zgOWnIv_RQH{AExy?JYb(T?(fpDDcVH@G2VP#q?6AoZ*%;S&T?gcpQ9o)`I@i7Ewp} z;7AVOB`^9}X_ek=6Pqkukj-eE5)y$%xjyIisi}uXEIxf~r0_$F)$yWjKb21lSy3+z z1rKh+N4VxU`I6r#pQVepc*-5m<{e+aD2`DZ_%STN9ooZx$|>G)70$b$KBJf1@bW!$ zg3%vCYE4OEBb25vn>-0SBNp+w{^;&T5YF2K;dOG6Lix1mFY=k4c5Mfs_&uW`eWQ~c zM&jTK)-uGFjLB!yZKl47X0mbpzFzYvHRfh9_ngU5I3s2I=-%RuX_bq2(*GRatwA}l zD^$k9lm#BMSS;FwjfM(%QzK&p{g{79eeU#6X_G-B=pLf-xBC|^t+b8|@yU&F>`$Gg zgF$^Ns&Z1M48K8MMrY6b$CvlKLA?AOcescuFBVTOI=NbWXbO*RqtiuNsh1erf-#}o zp%0#r7#@Yg&>U{kAXki&t9UgdVU;CvKWr#*^?mJ(u^dT*~Pmas9pq#V)A7C#|LRMJ7sr$K{yo+#bVi&(PyI_q~4&&V6zIMz@DZ zx()VNm`B`)4H~_<5<-f|=WZ_7eV?afyeL$vYHehVCVr}g>RGaPKI33^W|_FbPt%xQ z#NyBNhMotO7KSoAyV>N*eKlq^KKplWkm5cedX7W9A7!aDuS0@TG1GnO>HgFd21<|Y z(MU_*!pN&e7-m%BQwGL$H04eSWkgXk_!+%OjZ8lXcRg+0qu8auoTdoBs9`hh0blwl z)^_(kMu9D3B;3Dy+U3Gfp5eiWushW35Y>}%F!2OOo0hxq6b0~y?*Xz+s0MPTgGqBs zWBA>O&Tvdrm$duA`=wlnw_wUMcucQgiosMgr8B*z(ub>F-SD&sp9>nNcR0E!v%4WQ zp7DK*5(}HR5d`pu|6xxFHB|>)(i+sZmP{`tcU!%ZpZ$Ql2~;|s6yq2)c|G}G6yFRF zu=44bTETZI5TgvoxX)>9qwK~j?84_!x&le=CV_svuO8MuKpYy|@dok9lF^C_JA0)V zQL6S{Z#G?Sq4Bjw5QlvjOdU9477!HKf5IgdLZt_)1@Zq*y2fmc}7!KvbjJ70q% zsu@x0+aDaobuAZizqz2PyqR67;(aTE^-3HJiaDUKd|HNlGT%C!XXRszTt;O4kF3ep z8L12xYq{_Ss$@YOG<7Gd36FbV8omzC*Jt!w?@*mEb(OMB`fqTa5vJz#Bp=zsP3c2B+S~z~sO2Z*q9z;Zsw*tXGK#;0}hpsFS9? zDF0U3;91NNTd2Z-yk$@}Rm`aP=QapAXd9T*bQo2#fSS@kVH$;G!;$P1WE78! z4i!Txa=cJ>8W%`eDzC=aX#P3XjI8x%v@5Nu@c4{oRCfn&zE|Ijcyxs@iq$)lGqUq1O5z5+N)!nrj{ zh*2>`NY>+=zZpSvrb6+Y>oJPJookhYfFs16c?YA%Aw}Vw{UhqIYbpDCEIvC8^1Wy2;ec{GvKF7N%PVotTf=4@+ZZJA5zg|$h99O` z&dyhxj82_U8ZgUxEY4*k!j0}_OnivOpR0dOJG9W-v?x0eZi%la!WMbk%i?VS|KnZ% z5ox|Jm;WSuP=+3s!-tUEBOQeLHiZhFLiXqd_CxURL#J$qj$9S}W3FAHdI;J9 zubp4_1>E`c6&ml0dh9k0*s(+J$I0%vOfvnz-8GfkydD4SNFBQ!y?+a?x5C`|I0E!7 zuMguwv09gEUPHBAJF)wB;WPqMDerEcn_!uC#Hg^wU>ZveKn+dJ_KZ|KuT_8EqJvR< zYl!lyA@7-zGWudI+B8`{x~Aa_2aTD=V|wL-uh&fzx1R9nbE4E}@b5#f+$gHS*2B93 zM43jmv_EL%n`1!9krASD14l?^#HQs8fT`MDue z{>(eWfFZV&05GPK!WW8e7|)_=u}Wqtn$lxjNYJzd3e3~Cn4QJ1Xzg!yeL~cvQ8@W9 zf59(7hDH&Z!b4doe0<0;el#5Ra*kHJ4&gDS!gPmGIP;_2;m=USzqjde4{!1` z3NC!Q2am$+ybj<}%}Qc(nn|a(3ql1 zfs@^EpEV$PjcnxP!eb7j$c6VzAxddC^~sJmD4+T2;kAs2@Cg2tJ3Z^g9YwHbpqG2N zhG7bxav5xF7`y~1N{`7er`ozNZUs{R=a$(PwmJ?V6Rm)T4jWG@-pdHU)?b z9Ign*-@z>Wu0Lc%y)^|U#gefU{>nL%@|-n+F8S2|QpST+n)_|48P6HjOJ2!xQ3pr) z4_7?E)XBqMSNa@-jYnjb!c5MUpNwemu@ZmfBZGDn;fc?qAOT(rxcf96DmQ5{l$h45 zUJdKP0aE!FVDgE)jYHon!-r?e7~0Wls^%E1WNmn`ruPjU;<&ebmt_M_8r_1sq=gB} zyIti*UULE?myx@flGdoEJQI5I6}|n5E}FC?$4y%@MsK_k7jEFMt+64pcsiSVARD8) zz#4ec$!)%e_p39+7T!Nq-~4k2-(6Rp@c-w2tTrm?g&!nf38?`)7y-Y^)V!?p#_{ki z-gZUX_gs=>xZhm&#Xt7H3Ax_x3x6lfByz{?_%rY*UDu8590$4YUCI+{kLv62zF0UM z+yX63kMKQuy$}A6cAM-Spi36FOunH3p5KJi5s^ER8;$$t-RB--+NnECI`E#*-g7On zTsSZB+M#XXrxNJ>mK+@ex*zT#1aOBSJM4q+otI<(L!`Tca1`e#%#o|tRe#)Zyz}|P z42o|{a3k&koD~h3F$ymN?(kxIVvgeO4b}dreWyiKv9a8uHZOlWlBy*N?$@Ug4V z%g&XU$|2l8f2e_Ok)>YGSr0&A$bDbGAZPPOOX&(2Q=QKU6x?8B(ZnTX>gJX^6MdHkCwwXmGk|2w2r) zE&L5`ASRAQq2}Jx5}#U!k%C7F5_siB@r4~lE`=?)daI2>IQd!6veSYsiiJ(VX1@6F zy>NQoXRQMG6iGN2hOz~x(?*bpDC44;StD;$jNye|?@cM2Udt4=+1-ee5q<~S0yu^s zMIMnDJ3qbili%V{Aj4C>j>1^jDX;O))G#u$!GlhJ5@ugKS zG+8=BmIby9gHim^C#MQiW`Z|=SPLr|HhH!b-!)aIwD2rE7_CE!aOg@onyFs|1D>Wj zvD|Vuw_N#Q_!MpNvJnb-Dt}USODaWmj9G?Uf#NIKmkEOx;<~YJ44B@>@Iynl_@)$* zgQXnjPN5qbf!p!`Z{>AQsDjo1z*sD0n&3)~;cJodCzh|Bu3&1r>~cG|f!&XOTeMt&Gn zbBcM8XB0C2%kz;f0>0B7&*$uu2l6bUaMmgu2oR;_zhZ#(0e;x3rWEGy7K5@4AM<9-&kALuYZ+=rIhxjj{aoOXGGvRmqb|8mn<#7Q9gD?EV&2tBKi1U3f zJ8u>b?vE=B6c1qwb{n1L&-JcO2;wc+WaKC|I79yW5&Xexg5-PP_RzjCx#5M9clUx< zv36P7cs7rICVbER`)=$V;G=RfK)y`*7OYACPMG9mMZM!b5eK8*w&!Cw-b(1^>r-Dg>w(}ea}7J?~8R4 zTKpZS8`s0z27W>nY|(r0-Ch)t1!DzYFcn~~bJvK>T8c6w-9KehgQ;QBgQPL*gjGsI z1y*nLNoy1+4~Iff%`{3@%E3TXzzSzXLT{7d_1ei`=>-K7PD?yAb<=YVhtdUeDV7v5 zjXotKrD1NcR?f_52juccgPv2mf@w##mwlcxY`Opi`b_KGHM=h5ZzgsTMyZ+xw#FKM z7Rw4cN~|zJra-x8k#`NHtzMtjg9>l@iFl*H;!A%sN-)%|{HTeHKFuO!4WGeHNgUia zE<`hFvlGzJLh0yR*t`O;Du$DgtH~b6QBD{W5zQdGwg+(VDRdNPJ&6=5ip@xJe$a|t z6Hfk=#Y@qp4e6mR{b#2yMxmJPTgzjL0wmTP|2PqD8wvyaB8B*rkvW*JUs3cj+qnt) zlkns#=0*z;l5ts6UxKNc%>)Yjh;nQJT2L!+=H><7S6Lv4Yd2C z(8)h|K;0#uChhp+Nnsm7WuQ@lCm_caff5A~O0MUOdL##-)>@I3xr+b+1k3~q+0v?mIln1)3rlhsi`3Wsk`;~$y74CaiSjX4g+ z#&_bGaLtGbd=?4|sY&`q$^TrZ$sAgkGCaF>Ay6I`&-SUN$H}KzJRHv4^}3&igYeIb zcYS5*&cY?E$4F&VPF}(ZO?VQ+4>?6va`Q88zVT^XVowo<$0AO;!Y;fx35QRfesE1X zyP^*oc^&!4f9lKpXSB4?49STbkl7I~KiAZcQ0sg0f_wBsZ^4`72CnaA=mbPL>faQx zF_!S5JT!ezUMWfom-4u>ufF)HcIIQe{JAv#62G1o&cUT*6^$cH0Uat5DsO)C0t}Mg zZmv6@<1gH=ywH3%iLZfrEY1xoH*fdC1EkCEkaSE}j`$&OCQRS+z6Bm`d4K2{zkzUz zw$0_CSU2t^yXC-*+jqa+Ah@A@2STp*c-+p50$_n~`?c|H91rii=h3rxtE6#Td_3~q zobGYo0<9!(626PZ1iOvwt(fcMVfb6%?|ba%JVy6jTE7#8-_M|c*f5Y-_PP^yhb4o5 z;TFxe1C5XtV7FZNsC&Vg?*|z$sTSlIW)N>>>gK1l+u*=Mx;~eH9mn4>_!B-u9H!_S zL*W*k$M_a%BWb9dPnA)PruZuT(R5a?z5PMnhK7n)!;;(TovQ&cC%bP#ONoDNkA6E2 z6&JR8>cFNe=$WK|*bDx1yW)8M<;|NXKNVhYv29B~rU*D|LKQ7WF`ftBnBU}?TQWsQalW24CN8NVvBDiAvgTU zohnDE)jPh=W7l}DU9ZIGkADUQ9MX)sVU}ZH^oU-xkhFf=@QNqp$=nmZp5L%o3aaT8 zVwKY&jn{Z`R?qCScEUPuKJ)q0dVx#ZPEC|E>CDbrVAi7_141PC!f=0o^jh}LU))_9Ln%#jifw#^XkdF zckiBje0SNdSmtV%KPifKr=l1owedFj#M^-YesW>`Pkf%nHQZw1%Dm zS@eyvgK6l@DLQ)$zx3qJnxN8IIS{YpZT{0UZNO;$7XHu>*Ntbhc4Y*&yzDgas}!$i zPhZUFk`W-rQX2Enwv0k~&e$qH0x|MJ3lFy$H7kFV9z35U`j)bPWn|G^((*kRlXq|m z7dIOEEIo$ujyayj&E#jEMdLraEv3v;42=ZfIOTfQ_XK+>>^;+b{mr=s@EJomm++p^ zq;P@ToDmYaVKca)zcHJ|OMHi$GE&;pkukE+1DoTvA}+tUXI-MP5m<9sL75BbC*=uDgN5JYw9_g+U)8U#3;1;;3W zi9pt5@Y7&&)9`2`HJ+M3y;~F$3;$+oS^#pN9f^wLkh+hhZ_7iY6Ao}nHF$Dr|NfLL zN*Tr1PEe*NQOxvwp4GiQ3h6+L=y0cSF(@by8ZCXX)2kS*OVJNw)4nEtRECRi6s>7g z!x+x4{i%_kEg{hdeu~($4tKJZB4Y=!p*4#BwBw^0lzz|E+~QH`6h^L0PEmN^7%a-d zOmB+z=5lTDsCra`_&trS3UdGqZu8Tp2LEG?JEdyo!c!V4M{sD`fn90F5J*|OYPts_ zWt40F;A6m~(<53Yt&~Y4HnX*E&s|AEdmn;p{}1=9@hH#8Ek%Y>O8E<=xhJV2E#U5WBeFHDcP8kBcb5IZ$R}riYSI}3Jd(m zru1i|V2dF9@M6L)e=yMuuakPwGZ9u#b@UC5DN)yDs;M;zRBI3lhwhBL(byCvk$KG(Kmc6dA-Ps@yH+kB57euGwnvWng%yA zR=$)8gFBv2zQRicm$+fT2%iy4*p$E=^0?73BU{x;+&4j*{K8{f-!dlTGo$~i^gvc8 zLSXnCOc|)k3`)NEyVp?*|KaP#%L&nsk;0jtS`J$zJ!KjVgJS_?P^2vvv;_s<+@Xpu z+{m-?BVXds@JJdH4sLyn0obehRQ-aE#5;cHIC*-LugW1l;MZw1o>k!L&Uo^seEv&b zf6eXZ()BFI?v0@Yu!w5csix-{SXhVv`Mzg7^VQ1VUcO zgJWIi@csjmc$9=ZCy58r`8p522L0>)H)%Y8#MeO-;^BPUqdycvsw?Fc!uyiSo0z+l z?k+dahoIhs`0lq5AQRt0(+>OBVDbAK6iAZWd!@T$fA?7s4TC&Y5RR`YD0_CPSXF+H zU3a~=KiXF) zgF`RBsW^HsYlI57TB{nuU@!!%#hAI~`HX^5YbIMpiBB<2b(#3*h5xCYU|zK@!Xn6t zPr0h0a(2Xr8vA!CTpx^-x1L-D&!6De9eDt+=AZnO0wHMMkx!xWJCdeS|W z7X_-&bRO)acFlLc43O#7HzHEHMXJZQ({saxqM{dhEnEp!O4O_?D4Y?g8Bqw2LJ*Pp zp{$`?XS1HkY|9kn47%PwUUZg8@nADWFW8gUa9fDwQ=U6#B##+UXa_IrSeziPUf}-m zZRdm}W73)}gd>{ljQk8=LS@SnFxYC;_!*Juo1ywS$5D#QFD93NO8e9)*y=A>WY#_v4-TlqnL!y}K3+w!&WFOy$#a@F|=dbsV3rihqnHVUV; z932$KkgG@qG1w`7)5{wV89rpbtSwSF6mIpn!zDM0_W#e`o36)=Bnh_SB2vn%uAb>{ zmhV2megB7=KXd1sUaGsaks^7|IR*p~!5~E{m6Ec$Kq3J6Vw;=8&3pqqjUhO+_uiFW z30Z%kW%IzThFm2BOi~hkg2&>YMr4Mhsgwh9Z_82YmvlEBiA>X(fPqVX*VG8p^f|c@ zrz|tn$?uwrrZI{Eek6WI!&E`ElZ@?*gtBXVw-yD6zB9zHy2O%fnVvK`6zaYsj!cP? zcJ<3ccw|fj>PDk5gbjxT`>H^8RNnBlEiCCob%M-qShMx+`aSjADUQIwvDV4dI2T@q zHHmdFs;G-Tu5z2NM@tMCAVx2j%i=JLmAIxw{ov&V+&AN$#GpX&>FP#5K zx%@X|?B_n-M+4!GOdw)<1}kwr?fN%XtiB2@5fMSF;5rROkw`}~uLaZA$fKH91qyP$_R)Nf_5&+Aq{ zfU>@r9_IdbAr(iIJb-yf+g=5U$)`&30XSOMA9hIX^NHPOdcu|#HW;U@!ai{&HkPGr?eyqr;34m&F%z#?HJTK@_v8$}2AQK0 zE<}7y1OHG~b*CSfjC?J>X^RNUS`OP~)IpRcKmwD{>kU7R_v*iD4zodh?ON7>d9FfCkkV zfEsgBtYO0Tr^ur%MBzhYN6|>%`fL3*yfQF`|BP^7QPAdgz&`5$t^UK?6NgN}a>-D_R-E6Y!D)&&yRh zMZtqhgFL#4@v0H(QTcM6Uh+g6FY;sggu{f=WI7^7d$=Z}iCFd5Dlgx&4$4jeWWCDU zijeG(_aImjbFr2XHh(;thw^M)7BX|KLeqE1@0Q8iL*qNWqCOg9-IE{xk}KtVijY1# zBB%9FAd(6r_-0yHGD|PR?9|8X&32!Sq*$EQX!~_n_4l?gL6aL%Wt2e^C@U6`A?;J zDh`2t5yT?jRo-6BQ)8CgeA#Cf5N;XF%b%tmV;aMP^fs6^4D?#LzT*4_1AzI%exU2r zxx(})-{NdIx7@kS7NSmrJy|;=n1*pRK5V$`QTF=;Z(qNidF9}B1meoI5jYXFS@p7g z!02>05gi^4c6)~1>eOjYSYZ|_*o4I+Y1|&w1}@{8Mk{@k9vaq+cIHa^{RZ!KAg~BJ zHJ~)+?M-YhzQziF8iXwz1<$qfwwp6>}k;BXvhJHwK4T)dtev6a!mh1YZTN_y$*m##l42AW(AmX>z zPb0~me))1op^uChkcmISDYuasJd;Ml?uOA49g6ni$AIc%ZyHC)#8a7Sz|5cRJhZv) z0mn}ry8EQ@BOMqmq^jpx!&}Rc(?;LF>l^|NRLTw7yJ9ft3^dA7a^*TQJ7-Ht>D9ot zEHU-qcXkeI{Q$U?|7tk(EeRH?Ta+1>;8g?3g#GS!RkY-cl`jqa;jsXI)_Sn=IVnX! zI?7FSujw&8mu4Lb8~_bjX&0918qvXdXmPxARygFfLRB6f1m7}3@!9$R!hjbgoSw~vh{SAKAEf#&y%We-jJ@(cibgB^t^agSVmoNuK@q~(Q3{CX4 zh0c^=qhO?U=cF5*SMU8(wu~bB?HTPyznDyc2UGf`!!K!@&K~`BErsc<7rl>&Z?p!! z(56o7%E_f^&_&9G%*kWbN3b*ss^j3C{)}L!`k^NlT@Kai2-;py-^a;;JbT}DIH1q9 zK-?@NFx+zQ`$BmtuVe-;^EM(PUC~Z{U#QBIWH}wk(f5zyjNkOso%YP@NP(zEXMFvX zQ54*2*qe9sfzc4;rE{*MpWG-gJB6CUBrTv$3zo85>zZ|}cZvlJuG)ccj!sV9rJfQ- z<=xRBtVUy?MV+fdhe!qbLEXGLw4ly81K^hV*2}4>+u!qJ4x0$Qzo!o-}o9Et4<}!T|aX`Yy+l zJdVzMYdS<3ci(`;fwSt*%PHOET;#nc_m#d!RN&><9?vmt*5mQtI)*pt4>}ZT8ooypHs4s2BtdEv?h!vjhM-9JdJw4>WgbsSmbJ~0`vr)ou=gU84Xg1vM?uaFoHBrn=~zdPVt(Zb}*>X zYw@e|pPe$qsD)n%7mj{RP7HA6OWmdWmvU7G#PJsznSt&&;657pnWVc=rBN!r!_2@%NVj%KR^}#`m1Xh2c!6LB<#mF{@YZl)stIj4X=YQ_`!P18PF3C(OtR&CmQUZVHXZSt&Xzv_BG%U8i5(>(_-gs|e@ z09b=oNb2bq%itOESmAC^tth&#@q2;m!v_A)W4S&CY0Y$h9X+^ze(Bwc^QHNIOZp$@ zP;99_CS*(Mf$RzN-|*t^tCEif&b5d2-3k~o@V};6V&}5_-V1+=bSn3na7DX&K1TN% zdE^@8O`ddqk76=y88`x?Xfhru=K6fk$C1p>2?Dk_w!AKFR4-~HOEJs@QJZ6xeMT)j zdc7tB^NkI6aN_K+)4j!`RdzEg_BVnh}~3o^3R1*l1vBF<5Br8VDM3 zj4>Occ9fzauNR(1N#0LrupB<`BW$#^8KnvurIBP$jgH!P;5$u5C&Whe+AScN=l=$S z_bt0TW%38po>3b^rx@A5+JH_knmuW@ImKXWTEo@HSHEb4)9Wc7gu)aqulCeQw_lN^rw>Emk}yXvTuA*| z{xUL%6E5_rC#`<~zK)a&t8eZ79SbUXH$|aFUS~z80lCq@%d^KR*dW`O+?^cNd<|IF{1i7j#LX0p*l0r*fF5UR+=(8%t0# z!xq<3knltMtSuN^=NKFWBPP|Ts zx(({mn}%E9D>L;=T?2v1pxcoJ7g3)uI^nl0GTzA0`W(YBgxrAOHCC+>xhA~}+XFh7 zqDceI-df9hUEptzdprZrZ8lxc)6T$e9aVw`jqs0*{&8yPoh`IS8npF}fM)(P-kq=B zh!tfaKbAv|0%;YQPIKi<25tYG3-fZSw~j1W9;+kKs2B;=D-G7E56DudUmh2D^*lqb z@LD%vxl$0)EUgMae$V%@{=ou8_NI0yL zGx5gt3*drAWf~3SNz%yw`V&(Rxk4I%lnL(vzRKPAC#(;uowO-m>Ve;WkraGr@KEkp z*LQsFxltb-lBFCp;2RlAwhDLX@14WDXFYOQK+-5Gb=s+&eZ141(irh|8|*iJC7k?D zEtE_hHsM(|YkhLmMWeiQ(CeR0fqH&R9fWe?e7EVuSbwHGWZXZmzH`-`aF9=utwT9C z$_U(+yQ8;$;80!>e)0f(9Swa!o_NdNcMrp($Q=1wkNLAcHZlrd!Us4%t|el66FPB< zv-u0+dQbRAqOPe=@1=p!nK#g6=YsFNJL;IU2rt6qSlZWTVSkfj12;tT{1oVDcqGA) zC5)9o30_z@lBcrSgs*nMCaBvr-0MB;!&J|IeiBAyAgrPNDAXfD*rt9IK4L*SKo*Jj z50CP0BDQc%ZT%F&@!SJ1N0~BM^ZLBrnfab+Fm6+h5mCO*Clr4APj)G#DE` zjjNHRhKdH5MqCvaaLU_}hxUl~nR8k=PyweNGJYjrH6M+Ye?PV0C zU1vz^?o0A#52TQqcE$AqJ}-m{4Dnvr@`KNdMg&QcU2@YI6Bnoa_i`bl*QID>XlaZM zC%v*Dt++KHGa@Zt%1nbmJn>4LaB`lYq*t;spll|w$%Y5#jfl@PQD89brj`*D0mzpW zM)N!6t+6S7Y0MZmiMk_0!sE8o6^t4reHuQBgoGs{oagkA2+Kgagx$x@geM?rjlgc_ zSz=VYi5}Y28H9n$8=O_H?LcHwoC$=2VI(gBfEGAXA27O-iQxm5>qh?OLBKnnaf+NK zmjO(;A768KHKZPnJ13s2mljG!qE|{nv>aaJHRlhRJ6Z+~;i;DjrqLe^chikrl|Fw& zceO6)IP#~?nl1hD#zR~>mBv~24h!%vZp*?`Sd9wyzHsD0-NzUfX20k;8N4@h<*>-v z!c-SQV9e-Ww3rS&i(F@f13UtOo_fh~%<(95(9I~tt6tB02@X{j2()a5uO*$NEEE~O zKIKrX=?z3SIxMcSI<=DU@95OJp@B3CKM7iA%o8CCw{sbXagnJ(Qc))XSM@PWdaHoxBaHAm6u^=0s28O2BJ@u0 z#ckOxag{$$!Vi+FVmT~j=X+Dshoz82yDw}qHK7PkOcB3FG} zuaANMV)%k~i^4opg5HVn3p|+YiQ}tsCx@*hjv&~Prf#M|kh);oWHo4sJp$xDXw9Nd z@8B%aYutV6&7F}OCVP)=qP_ji<#Yh=vB%`F%HT+%$KoabNgj{D`gt9SBgDQu$d~VZ zuKNmcAGUvI;!TGA$S0!?lOB7X!dZ&wu(XaSY%pG0qQ?+_A*{w=Nk(q~06+jqL_t(- zNn?ZG0X^Q1G>*%p6t&(YEZ@8YO?|UeW*02`(YFf17d;I`4Pq~TjGzoW4OV)HS#QDQ zX&elDN@-*mqjd9yY?ZJ`(rNU)LOw1M*MQ91~=CwCetq0FB~pXX{! zIFHxef-ddduZPTDZ5mu?kPg>GxUQj>0}ZDpoPB~h1lk|OpU^XAJgJD`kNl1nT(UEj z&HkAqB8170S7lYh&%H-I-tfa%0!X0)!^c}}zhrC>YvbTY&bG(etFQCW8iBmu!K;q+FOBj5&B9VQ)YUTtE&J+nrA555 zaovzkk5oE`+&%quxci8kM!W`d^^(k>a4MTJ8V6(HYsCkQ&rQQ49eJAO1=5UAMN7K% zn4W&iWY}-50%fn1JQ^`1PWnxAi^J##;gXHK0e9}Xs%+9mzScmX6K~(}-4l#(%VkE< zbikC-{3#RZQRaOYLY}Bw1Wp}>Pe&)6Mt9RxNF*dqaGS>ZeevttSEr0h+&FSTde;N# zs94|63A<)Z$YV%Rzxs6f%bOjKefX1M z3s-nSesZ=<`|3QSWzwnK9PylKf8$(HoJuOg-!jnwlO5MHI2x$~=KD*$l#J9g@?a4l z{TvFl$9I&Yoyxmje1Kdb^L1^LiiTu)&|n}T z4O`>B>Ghd1>wWke5Z7kxE8=f}_S>`m%{mm1%J`Tvrf(DRXg*|pua>_-@B%qTgCKnY zJVn57K>O^h(zY@RJyqc?z1`m@D(Ui5Wi7LO_)h~u!;?wiGw=0A9x%$T8Nzl;$=6J^ zx#l@Tn)${$Ag^>Ra6&XDT!<_|_Eg$FNRRM@J%$3|OAmQ3sfG3$ciSL(vlMAFdTjY= zTokjMX_#n~S_y1(bSB)#-d&Y!tjAGcj;@9T=U@dE4W2!n8MGLmrgQHZztQ1NQue-u zpJ$z?*IqGLG-Pjq%_H!blT98QU{8Dh4aa<`QI{9LOQB5r%g~^=6Bst)8W%GOs(sA0ISuT{n{> z;Din`m}U%2>5)QCVAi`m0D@8ZK&QKY<@i{pr51>A`bjp!DS)`~e*H-Yk+$Vl!@y1P zrU|jSxxi7N362yQJYxWAtg26@H?PUmnWl6hKY6K*kT^^w$B<)(Wyrs5c5 zr);x!i{qqYq!8j?M*}>p*&5p78-TKy1B_v6Sa6{Cgr0!bx)7L-0bBg?rtGTH0GCJgO&HP> zTwumS@l$7;4oMx99M^W}P=uU!h~HQVo+LVb$#SCiKbS-)Z;MmYm)l_Y19qO~syvm0 zv|L_Zw19inuQq_-MdWT)V}6e#oxv`Akpo$2Dlea5t5XTp5yP{NoauVcKvW~B2*s&p z=8=C#TCa4N71pGVPdf9|ouqNI23|$v zoA=R7vw|P#2A;Hv$@h@@rd%@grHL~*jM`a;9VxVI&EucEOOzK6rDCD`T_bmDJ0p+N z2AMbsA8gDZ12}mu+;4Qk(y_2QrAHYAMM#@t4O=m7qP}n|%HuG8uf6@T&(kWZ;VQh$3HYtT1gb zY5Zwq#qUVMTOA5o%Gc1bPKo+RkNYR*`Ip`vI_ai06~6hw?P9=FjFVFqQD+=Olsrm< zVdv~$Z?Btswr8}-lYb=2p&(t;iWXYVFl21Rr+1HrpPiU&nE&+4ufTajT8v6yXjJKV zT=3QK3%}q?&#db}G$?FbWwqXHd+>O+3MeNH3Mr`9m4@1nNNLx)Mr80}pkTC((}e*7 zeZtZ)(_k`xBSP{AOfFoN$6_3y2z?lj-r&;~z9L^7M%BhC8YeJ)!lL{#2um1Jb;0JlwyY2jWHBK0=8;D2w&v+~O^5X^O%?nK7f{cG~z^i4EGD#zH zl>&RphembHTj2UvUIHrpf!P!EN{sY*=wu~N@F;I#c%-`;!Qj!*loxezQURa*QlPWZ z4qjaET&yg;>KO)bh9zZj&39hha+re2;nZlproy>iK-yivT+egPEK(*|-s4|K0~%4% zdb_3YRy-Je=7j`8pb@zxI)5y1<%>b+VteD{w$Vm)OdSH|9rd-DPUZ#v$X;0~b8=W{ z9IbPLw)jbY#2ZJRj6%yd1kw)O&^F?gFC8-UijgHp!Q|Pze&0f2yC7e}O(V)r)I;lO z3&0JBa(nmvj*LwB{_)i0zhSLYJC8xiiEDF!;poq7Bw>0oASRFA2f(9$9GL*0D0}D~ z$#7J|ZJ~XCS-$d(G)f~sj;6Hc$TEQLi%UmYaNu2cf~;DAu3n3WU*+U9rBBGg5eqJ*bY$XP4h3{Ux4XW*W(|((mfA6ja!3a(&vaNFkZx>u z-aXbIS9(~^%GDo>OIl51TAg3l`JgEaV#1--H6S1Ot_&pyUgQa`bc1@RY;y>KFF^Ae zH&fvNjE+;n@hdQjy^bjgi#W;?dUVEbC@UApON+Ew9+Hu!7HGtfHFul92{`x_=Qe2X zVH@$y?tKTyKoaHJ^ApgMq4AP-gq>ZyN%omB*H3lqk*_kz)FUE)B=|T#fEo=w61@eq zN5GM^Ukno17T{rqr{YZerTBe#mhI0_rhhDlVqb>)PrC|&COladM~K8@B;PcAbKb4JcFF=rj$A zcwX-$1ZJo0s|^YU0M~O?GG6lbzoeDS$f7}_#iwy&N)!g@30HfZS}aVsd$2FyYS4W5 zh+1{XFkLFzyqpOvk_!pOD5Qxu?Gj~!=%L{zejDBoG-B^*q+QS8w4Zu~X#_LWfbR$F zuA$$aKLJhr^xQ=cuvjl21n`0}$vrHy9l2w8aPi&H0hZiLIQ%r4Wz+EYn#0eXyV1SQGxgQSy{YOmfl%7h`NJkz^D-yt9Y8OULV@=$IdT~8^NM(Gj0&V+H& z6;%p+h>wrLVNCtYFqInU%UJ=w)5Tt~jj>M5EILQ?#Agq;WH8MvUgOazkLUpKU4VXy z9!G14$D` zMhto8HlNa)-n?oWwG-z$dj+CH?PDZp1kf{TqYmC07GMfjLI&P_qm|JiV<5E=b|k`H zMSJI__kO0;*ud8-NSrStKVIiI2bz0tk0u66jj1?hrUxUG3 zQ>S+2Y-wTI>Ro`Vj2qW9VOtbPGK=ANP2L6>3v7AoJ@xz5{Pjz+I`l~Epy1Dy~gou|z-YVC2bce1xBG+0Y3QY&a`qyR@Cg&Vo z2Lk1;T*T|U!y{d#_?p^;OsxNZOSLY%S{EmztC}k@HcG$D%(qTp|dMKZuEQf)qJV*v@zVqRQ8vX`3{h5)Y zeyObaZ#jYL|L!o9V;eLfo8Qp^a&N-E@2&dh|LDb+>97Q@JneoQ0>Gm=|>*2>a6kkvCvlx4r=rJKKDR+u{K-f0hf!02y3=i=?9&&*3@r1>g z`moR!B7LbpOBs$}T){qtea*Jk;H_-dd=KEzyp)f`kG2BV7 zY&AD&cF9i|*Bk~6O6Sm?(P)_e%w2V8Bx%}%W24kJ8pyAKV6o2ChG7~{#bmk&0(R^W zU?ZwSVQ;UFiuvlb^Ga%RCte<7r3Yx##B?aRU*Mdy7xeQ9mz?M3yA+pgbGF3QJmX?S8uWQf)C2;J>q7I>0zMJ zFQ@SU#xfL~#zjVlWyXCY7(`f(YNaw!e6tIU<)s8Y<~Q!iXH4$_VHoWX05X^b#4$Oz zAKt%QI-Ho#bUZ}^>Bujw(Tf4P4d+ z;zWnkeAA-|82|F7Q-oY(#!i}~3UBg5df#`BT*wbW<4{N@=jiM>89Yw8PNiBH>mG6N5bnHb8eV@d#@Dv+T@#3;LAYD=maIX6z zTjRcz_e<12#A?WQbSQWk-1D+j@Z&^19=ZW=B+-|Y%a{M*vCT6>K1;!Cj z_ZgqM3*H{kK<;`upUO*Ic(+8C-iFM`XAl?aW7HG2N7iAQHIk;H+x7V&!4G3>6jb1W zsllm%GY4Tdc*ZXw8m(3~Cn3-e`0694joUP;4sSc>mxhT3X1tBI2FDv=K+9_y-3v~?a4cV|kuDDzNTk&u(V=Tv z24$z*M3XavabvG;bb@#E*Z%y0m7xa06Q^x}I~eZhgavep(feBK0bI!sI=IbfiC=jy z7lGVODz76epW8JGVw^hB_bh-*Uo^RdII3H{8e zi=>eWPm@p`Mo5ivC4bTwM}CcCd&|w+1_l7n5h0y;L?nM2_PECxt$ja(QM34gPicif z>cKedjee;s)qhi=+m7BbI`R4+etC6;LfOmij$wXpWoH=w+#gLmlV^(V@J z=jy)sF#4spKXrloStBz}x6X_m4}Oy)J}67;q9^~z6r9$5;J;xs>%YAD6AP=ImZ_70 z!@zs6@99W~fAC1p1?gl7Yu>Fhf|5b6=qzC5BMfgXzeZG|1sHV} zgoV_^lgJ&t#O%Aocce7?1@oB}rA|oy=$CLS9cV{!!6Ov?;n6i=cqpUMSFS@yGWOl+ z^fR4`3(EFSr2QW_I6iq{zfWJken= z>E=+5+)olN(2Fbp`^2$CE_og#d@S6Amc2N($C5reOcHqM8oh`X(zLmPX%#$){5wi# z@cP+ed3axT>i}uD$$MOQe3+{caqs9klI8)-gEX-A;3z1*?xWUpyW(1+q%QvNlODOd zM>2Q!&yVGf>jN4N0jozIYudwjpGVi8mf`Wj+d@OeTavd?%YAm%ku;-2Ya*_DX%6WB z5|Rzx@8?h`yA5GIZV37E?U#iAWeA5U4wZ1?HxrsVjQ4bLueLe*G0PE3Q_kqXr z7q6CVWPG1zd$(m`8}9v6amF9u-qT9sj~&3|e_3*hR${ z#~+Qp2Fevf8P1ud{lF-uQDiGZUo7p?LIYG2NrUAJSF^(g!0YVxv26^*%d1VpnFhzk z-iCP`2VIFdgl$7^BR37H_&B8zdCz(U8(m<*OS}?i{-$E-mgroF%`99s%B2f*lh3>a zWq5HT&H}V>^vij4F)n&OlZ>DCAl4^1swDPpt})(%Y=p!Rs%Slg%9VnwV7 zzl~u7uk+&}3=IR18h?yc8+3aQZOm%WxK6#{8M!4R@bAh}M^D+y9>&BS##aUuFx+ml zkAGQa#&^p1!aKM^zta!-9(q9Le@4&=yhC84J)fAGC68^J2~zD+b){UE5wM+Zq8emA z!7EhBZAJzFE2Ln`2Lu=^ZDP-mia(zWF9Kl7fxH?k2CdIam=`g6ED+6HSqn&GZqk&b zILmLG;i1Fy(PMf}Wg{y(LF%{*c@;{|tG(LfuP$Mj+I8LMC`e+%E-uRt5IdOSTMzU3 zbRr@Q-)NUHPvLT{_uuC&Unb!>{h&-V$Vm;2fYI4OA8#1-ldsVhA~?*Gg9Tng;D-7u zZPrze<;Sx0Ps4kaJ$L+>W=71$AT}O-w;o9A3WDoQU$l1~JUYQTImv`n8Jo~TP*4pb zEQ1z#Ib!0pKtC#}vuK6Z5nUu1mO2Kw6M}+H&Ny{W!*aTnJJ?kROaX1m$G_fBk$_nY z@6|IP>&RQ!in?;)CVq)SN;xT)ZfwBf?K4Jo-Z4e7dQKkKMo?R$!4cl@k>8OE9S`}o zQ$reDf1tBtx#V1UZyAOdVtG!IJdb0eY$+eoICawaIgFP%pGNk=$!Q0t4xjmuEVRqi z$j`d9mbcTjmTEfnist~D#yj$OdWhANBIDGdc=hU6LUI^bv-Os|Z&)g0$AvrZeFShF z5ax>Hexie{9Rqvdm&hbNdb6ZArbe;W{cw-5Lsc8g;t z*EQFodpSFEj6K3MAbj~~Jjs=}HKbm7(Ad$;@MCx$x-Cje!@`B+&P^A7 z^VDtJF{YRa4lRBynjU0j$5{_12EUHZDWf%pyW5SUFSDiXl!0@c?G1MRv(uTBqsD}1 z_cq?-Ic1)~-A4=!h#k35su;N@wAa=@dDKwhwj(ox`(9pz`=K?{L=SvA58f?k2~9_w z$Ni4E^0edZr zh0Js%=TX|1V~iuBGFxtoz*Ds zeXu6tnzO5X7Faqh?#d)@Q;!B_(dcA`u=NE;hXm9e4+%%SQ`3vvH{0uc85B7 zkM6Pl=azZ;pPAA`1#6_uUB*TqM&{O8&1dOK%=`#@^l@-n4_PcDX}xDM@}Z$W9KvyG zjGqxmajy%d>9qn@@d7SB?M?S5KZ_s5O9=Ea8 z3AL_^l~SWlb0yAv;z_$OCA-uV49fa?1Auj@?IO_E*bSg3LSYq)(Of z5+1=ax*n!8?!obB#H2i$=K+x46fnB^5X7R+N#tSd8uA?oTv7d?s~Rx{ew={hl!h(w zie%9XL)P0QW&K@}{cT*}ZpZHX*^Glfom}z7+pRwyzBCrMYU} zSHk$uoGsC*w+X?9XRWxs<_k?vruNqmID~i2vkmx-y@fV^G?s1?=vK3Sw_=P0;o88H z!p6vxcqaikrcKQKN9C-M6|X$=CrnSLXlM+! zxSAeF%S-uRV7HOyH7m_)2JkU6Pbv%Hi8m zL_%a!PDoW}P2C{A5fJl%$2=b8=m-HigG(Q*U6^bL*NSUxxu7RYBl4tevQkKb|L zeYoPia7lWc9m`jx2#+w}#ZGoWrCCN9FENxs^zoiqd+{eP=}Dtwq_ZxMw~RbVcY248 zdf&ojq^Uf4ld-)v^?~b+Lp-p*OP}nQGA0z(IxL$=qfu)QY%+5(kx5zi#TP9@Y@FM)(oexV~ z!MmSFBX%i%pPQAKq4FNbO1alH&3){5zgtQ8QDTbWm55{9OW3^(ecwGMwx^&xfV?JN zuMZOZECJ6b7Jb6hpd_3xWPgD6?*ZRj0@mGQ z$7+04Ruq=Wc4-&=_d@ePghsawD!t1z5+7}(ZOmyzQvrU)h_JE25GLG{CYpw8c8anQ zI-}e7H4P5m&ZW(vLF2sA0JahG$bZ#ULCb?@@JXkfGitmsA84nHOh}mV&>0MvYaPatMy>Bp8q2ukfu@Ym zde?Q8DMR&`ktPj1dHzJtx!8JHH2hQ!tf;#ZRu|rB8{v2)dYt|B`js}Zxr^3X81qokH z_0o|taCkAn=t}zKqX*ZuEE^>xU>yBf|C7x!I&=FUA8;ga zCfHHz?jyU+xt2*$Ltlb~-bRz;Ntrl$#MSqNx+QhdMmp2$l>4=79a(CC15KqdUHpU7 z7|TEzTc;3oVL(VWO27^fXJTD6YAemuKVUR{lXsc$UEfuQfG-#hb=g~Yxw=&5r1$+} zxTAAttgF%?A}HP9H#+Rhk-gCu!i*=c<)r+q|1J>sgL(k!UD)~&@`F{zdtjAa}5vw;fN+Q zU7|!zjrw;;dq=%)y$^82;h%^6$l*NoKzvdB4DWNbl#C$F_9*BeY#aa0@1b=^pTPGX zz8$tiu}J1QC`i-06bh1*LVQlXZ%6Srhg7MmFHbbp7=Ptftqs6zo9Wb;LHM01m2QD4Y^0PgRPKS}~qj=jt)ylt`aVxydOByJX? z%>C4D4NSVe_NCnXHux?;^s53o961&=IA<7<=NS2~Iql!;E3Bl?RHM;%I*oZX0#YgR z&a?y?FB)hKYIjq*%3x%!E{21RlM9t?M4ggi1C=2RTpL}dfY|8f)bOj}e&Lpnr1$IG z_QY#66a4BePKMjA+F+9fs}mYvPUjjXjq-vr8%#` zEuE(E3*b%bVw#ACkK64!ZN-oD!E8pV&A&z&S!u(kM^yvNm#1`S<7MoC(l%cSYV3{C z&+A13!C7NX{u-D?W?-50=KIOxQ8qx9q&COFsR*pDm zYzj*`dNi^?{;`e>Cl->Fm`+J^w+XO3bx_ay)&R`L%aB3D@=PunDH6(*Q^%6H3w&@@ zWTk}04D)gkm!&=V%m=|^kjGZNNy)O?B^-x1oj?4}~Ob!4OdPFw#s6*n^QN}{vIaLTlo|gXw z9y+n`oBkrS*PQaXj=oq>j>^QZW$1~*IhAD=X(JCt{&u@oMNHD&fR-JW0S< z4X?CAm%4Im9I(~foF901NlHn`lq1QAgz~=gI~LRz4R>{`o=sqsevyN6)S);-mvp9` zu4X-yChXnnoa-^f<$~qtfl2kodkyXQmSD2UQO+_Bg-~=fCKRUtWUrCO4f*B81icTf zu)uMIqYeZRCkg0K9qjn&I%M+)M#%Q=Z)lwKb zG=3n@wP`cTN&?fz!2*vo<~vg+T#XaG9X6kE+I;Z+gg}rDCsYb|rp=jr(g)3q%r~?g zeAoZ!gpL{wpUSYw`}A#4pHA{1c0ugrLG}j$2f2wa-42xJu&-ZC>W3_l>|=ucHCn7u3BlY?y6Vxf0eFv1ypxzg)-Sf*!h8 zHyD-7IlpD^c5GAM1{i45fZ0&aP9j6#>^5V=4Gj=|1@OOOFxYV0J8ProbgV`x#K$QO zjx_j<2YV%@)gC;JwZ0QUqwf509gx{I$=*tO)SM?zzNQS(sQTe8otF3X+Q<9L0(~~SWr>r=|;Ra(rBa%2@zVZ?#%1S3_;wT3U z5~rH2rym(~j=YY<2~%C{#Z-}ohv|OoW_VPD1%_5{6D@))hFY^mWeX-t|NBKDg>$=f692V+? zd8|Lur=!|v1}}qk+t+c-lz~eZsFyecejv}Dbl3T4sJHG4{rKp6guH&7&Yhuz?>Ztr zLfv_N`-yUa2I~hy9FPS2YQNfH9U~l>fC?Ver73#@ng#`pz9+2Xy{;UkgRyIzmQ!F_ zChiKh$|ngZFLfLkzJo51*&E&gmpatI@x^DoP|n74Q=RM`6IJUE*KU>Sa!8+HT#-fw zyL>4BXdFV4Z)-i&8RGpDwQQ#nJ^)l%TUNe5tXn2&GXTQZ@>TC=>Lv0)9wt(5WCR9M z;r(J~(J%1wPXNCrjde}k>U{_7PmGwkxrcnH6JomOX#xj3_eT%XlR^3-{Ail*A1F=3 z$c~!_M8ww+{vhs;A8^mN?}@d94*5#m?voOYMkc)dlzU0`qkiJ24b_%&kKd=j|E3&@ zFNtg?=ADp#Vx9O;Oj-@i@~Ym7!A7eWKNa7y?4`i9-bK4HX*>)o|5C;}CK)tb?M=+7 zAh%7)-7V_RE-CiNYdUE}*(mvE2oP&*xKt@MoSL&vtUHRd{VTn~0HQ_12;hoY2kbF4 z+eJmAfX18da4mv*D>GIja;6;wlg4ir2$P%tn;LeF28ln}5sM>)NYs4UpR$LgaP>9&zNPB0tkBdksg8@{|k!tcb|?cf>^#+kY#e z_=Tl|ZymL|IsI^Y?X7JRv6SsXZw`fdj3tlytB$Ilrcalxz&>(>3LbMDWrxm!zDc3O zDK7FUSHGZ+qNLv~lqaK3gVPsv)~_&V72{MWof9@}kZy3DTqy_XIqrh1`;C=xOSsbSDR3f@h{?A!*W&acx?%C{N`Z5d?IVbLvxMvE?idMa~2n#^3?|Ve(Q4~|=MjfMlljZj(@*df~c<#f$@trK) zqvG!Vf!iYtqifsZR(6{#UqRiPd%b=Ih;N!@OUDuZ4{;q$ay0NT=ic)l)}dJ1#XV;B zwCG4ojl1E>8d>@B*=mtJ72D%Dj%^BH2;v~$eu@`9ZMFP`Sxdg=r-D3o?BsAH!Tn3= zNaSw}67R0!K0#k-4rF@I&Ac8oShj^H?4}=-k2LogHm?(!9NHgyt276Nq}$+};d8q= zol-!Y)1U0+s$8YnKk49?i1&SPakkjrk7O%m8GR%$LZj~{p_{09MzZ}Qj96$oleAWu)+ge!=LZwSEGCCJ&K$?r;)5C<2hd32AxmnKWP|3wP#@6Wd z$XH_<4l8dJ>@#0r_KW6DbrM;$V7xo>qWOhDNsFE(Zvc`%M?t*>fjmmLa%B0qa1opW*zEOQ#w{Z3DT{_)}Aa&Of zpL9)K;80ici78C=QRm9hyqtG<(&5rLKc}wbP+De$JA&fahMf!_(O+@Nhf^d;$o+La z@gD&`J^ea6toMRG*G<^b;d{vSN3ztKC*pG^V6xqolt+#Y_(*S>il6lJzCl*dvC`b= zp?Nr6|0ONLw*1w{5AZL)^5jSDT)WgRTL873T+c-TByZn2t_xDlgl9hAi@sxeM?j+* zkORBu!U~%gGkB@D3YO6z#)w}16VAs4i}2rax~ai0d>`chp!@#}%6|v`JMkdrTXa!+ z*VFnKqJHE?$cAz6<3#SYH4|>!Z#lpd{HI}<=6(w1ns&)+1(be{+O9SF$nz$uTe&>S zN5M*9mCIqygXcswG#tbPKRgd240s0og_b3CP2MM4^Q8s^^aH0;6F7@(1wry6xOhXpp2P+2c%yfjul1^J1_vc;1a2cH=QXgS|?JPhYr(eaKH>Vlogqku`(0i4c5$S;+#t66tQ}}qeg~F%dh#?9_iEqysqug za52F+8e`Z>yY}fFhOT+cPi|-!1Leda9PpXHk+RB%3>rd!@QcG^_@F1kCvRNI+d@Z9 z#RL`~5s_)x60xR@e)+BF;+tggZ5}AiDA(X~mm{Y;)w90vhH09drCppF?edc|p}`zU zqf0^42t}TziH04G-mH2IE#j6a`7yD#TuhZn)rqCdCt{HWe3{OKr6sXOc%v5Jwrqoi zuIb#Yi5tlyt_DsRW?r60#6VR?CRFbvT~l{TYFgqjV_|Rf@YG$|ps|I%IPo3Iz4}GH zMLw&;qobceD?E@pm8;Q$HyEfG&4zt={~pJV5ku(EM?TZh;9c^OviXF=_vVrh;$b}B zGQBCs1B8}`#;Q)-Ovf5S+<2!@DG%>;6kOjRuYLzd*|+fo0oKzG)MeiTn9j(|H4(}m z-9UgE`#Kcrq)v&`q~4rUS1fBK0_^A!Cete!_NbG@H&_nM@}5wDmx~^mGp#1ijABTq zQ#j$3P7{)LS|aLW2lV$HttcufMNONgw}Yw8(|^=Eogpq(W0j*{N@o zfYk)}!_lCed%05~i1XGY-|~RI>e#bjnpS!b2oc62haG{3bRIr$@d@s+gSZ#3r8tBo z42Aa?9{I7dKSAR*zhL%~7O(}r7aKKGwugjmp3Slav59*0HhtN~9tZG6+zW{3rrToN z-uL#~>c&GcsPY>&sXOqn)4$Rm%e2L^fB%PbDAco;9_68I4-06klmqiCfG@4sB?$5wRU=f6 z(Sv%QOhKb&Q}~Jgc&pZ(J)}Aav?#NXd2L|E@T3q!XXB?SX=g&0`iYFwuGBL}Bx)L4T{8hh74qwvcQF6$_qVz@IcF2qrMr0;BIeDYert!5-P190Y&_|E;AQ%R6@Bexz zyZ(Sa0BN&9Pz*3v3#{=g88I&!92cNx;i6NH8^36PBpp>rEuk~l(%H%WK# z9!&F+)iNx~@&M)qyLshoX(SSHi=JtW$CrKS%0RjRCvN}j4OhOE5kO6${FEc9CXMoE zghgD_yH6_lhiCC9*V&*zdWTl&Hhi7x*Ayl4C_CZ1ixj!r+(4&PxE`Wa*1;$3g^nsZ z<2PLV!n9jA$ov^P_vY=Jc(I3EKJ1wIw5**NCrRU-UU-1&d`rXaDI*@_k7wwYUuimN zM8fxo4hzON^xWZm*g;@jvoxHZ*yx$Llq<9f>yvUtMvgox4|UD*`1O}x(A$gRKBCXz z0giIbVF9Q0PiICPUYmj?KZLhim(GZCA)h||jNTZcv%=LpoW3`Z48c<-(jgC@KfH@3 zWojL>e59?BK<+)(`qwtxj9^#;?f3{LFyEFxIpmIQ?G5`W_qvQnb_uu@30M7G&JtAC`+rzTW}Y zvMJ-+V<(S$xoo3<_`OBtJLrJym9Av?NZgucE${W&>wT8Af{^c58uPB(Qgi(Nx#^DQ z{`R5Ynw~$DLy^((wK7%PerNrvjy!?G7t*`{zLtq6@~wb->phX~Cx}u+Hu?{Q@r3Ml zWS4nf9sBxV*m_Rt`}hHz0b42?K@AhaIc>^5($F~Mt$B~>Un4|Q*wx{7=ge!a*}(4p zY^*TUT>yB7L4nB`$jks=>KL^Ry-SyksptrI&aSk5#-Oo6Po*9M!^XJx@4fus?n9wj#(xBn+&SS2Ch)+1o*yVy07d}nHzlM(njp0)U&;cyv ztU)((u$>m+PFI&KbaxI3^d=0f8-Z#ZA_pCcMiB_QW_01oosI+xkM_D^E@4Qzu7Dm` z4c!dLF%ovN*8zYh9T&H$)bWtV*EkbSsd6+$TBX?Q3B=}rfFc7KggF#A7}_z)z=if2 zmkOz{#n@H={&`GVY4KTLh6;bVdI_2-lp(SH0Mo06kQ)m)AASyWOBuS`4KU;wg9f^i2a79x5Qr^O~n3bvIMThAKKs%5Afa_b|C%Iu0VrD{8JDF1%_+ePo1+ps5*$?J;6 z`%c@rxV)@POw-r39d!ZD^-})wq*j{sR-xjhy0!Fr-12hp$#;*ZhQ8%2uXb`+KdnDf zW4%40?44XBZI-no5O3b#h?B=PK=R@aU^(!l^4j_)uIjS%td4=sgmutqfXdo(bLx>| z>iaw(QO4GfWG_7M+KJKkYQSw7`VAKsy{jK1^LaN_A4scSLNdAegGLILs+JTcytyr-|(xPe6f2t?+_HI-6kil6n-J8uG1m^`~+ue7`<*%2<+oVME)Fy4{U& zPr#8s(y9-;WQRA!uP`Rk@)8AYPCqsmG*KA%vz4HI)9l$)!%ge5G>GKTu%J;hz2zxZ zPic4ep4V*sddUZ_UNcJZ8UvpGNE%{O&{EmM%2gxHCR{7T+_xGU;F>iA15u-?9()Py z7`l715r*)3OKE`J5l3gC;s)XvlE9bTvf1D)@N8UZ_3KeJzDyWK_7ckp@fuohF`zHW zEB)?3bxF_v>{AbFaM*xnkkI(k_9g?vRvj0g$4qhJMqEAv%N}F%IMN{9t+U{{G^Qh~ zvb0aoj`MIa2c$a|002M$Nklsht!+37gCno}#AtU4FR7w&Y6P2yy+lUOH zJ0zYnea49bD26Ta&X9*pM~uK>ir{S0H!YF$rgfU#t&RmWYv3z8>6IrJ+WV)>Nu53z zpIHyRjUsA*%0KXPq$MtW3(OjHXDbj)_hG2dVR?JrCdA`l(y9RQsg{WrkBgAu1bxx>~i-QPN&^Ugqz9LY&P zNE2(rV|+#hf#`#EMWgnUFqI4N)%gpiQc15LfD^AJ57mu8Ia1?D)N8^|U*l9O8_pbJ zQe9CmtaF}?npq~wiu~pk=Gtj6kd^zu@V((TXLe=Doq5+YhXfeH5~5QvU5DW;L7g4b z=^UuHz6;V-g2TgAIvs)VkhXymHuz65inAV7w<$p3`HsjTwvMakq;kZrk*?|u)Bq21 zn99gI3(%J5ublr~M+~RW>1e-PpS=3t$mf4ke*XfDPx6+ILKB%NT~4W`e241jnV%`k zO~7}!1*go$@u0H~tVj3vk8AMXuRl-%+wyrC8DCqF=vdx>Wn$di+!l#na3v z*sm4t7V<`FF9f%BCWKg{@In|{N`ANdrLow-S5r1GoL%@2x=Cb^WCNk0ZR7Yrj0S9q z>H(?oq(<x&gmG2?b`4{p3YID8BABoA%IqoMpj5Cy&5l0hv~z4 z&@#P=lp*kZ8O@XzuF&n;fEx^frshC{(^E1yFuOPq?&A2gWYUW3kgTi}uo zZR>hw7o$$6u^lTOUNkdhG z6a%d-L6?`q^xjf#S}_Psozbz#DT1dQQ*c5aJevS3M_M(Ckh^7LR^tVrL8Xax4-0t8 zd`cGRrpI{06_Yn|Hj<;PoZhuM6eSEU#_8fHT{VY%jMLGRfjanwY~2!{^vVg)fkAM3 zDa+}n5u`!r#kGB~w3HU=tKU9MP|Ae0>4JNgD><#t^E30>bquUyt`$;;#G8@G^)q~n zPkx=pt^cAdT3hy#746NRm{!DSgvFPxDH8-|8QQzw7t^ILUZ9&eM{q0`9o+QX;xFDh znt19|UwpzgPXJ|nT_O)hBh(L+j`UNn9bM9qa1BG93`C#dP@Go>>EYM0BaeFRT8DNn zTadv~Won&t1V=^p{oq^3Q|DXye7AhQqb>qNeKc(9i1MLapm9b+rXG(&0aBDjr`HnE ziRgWT48&VGb_J~|fGMHY6XX3}jz{UhUo_9FUKlS8zH@xbO+B|PfJdBbzm&Pqa#SgA z%a0kOz3VP0+h0lS)U;o8Am1~>gaiHoz4}W82m{Kbp90}&bYGhI`;o^K-#rb=Xm@bi zqjIzo{Qdah64)!B7g1xmZp!vSUd#7b{8QzAEd2mhZ|d;b!}AoZy@WmdfgFm5#Q&C% z8pZpUf9r^?6<_MZ z_e(hqt1B=Q@cQ2XvoY`p-*Tfk%APTyfq(yO6PKf7!^Bx*MPoW(H2q0W?iI!u1vI=g zKrXn>I3z_Q6*a;dK<4L)^(j3x-xvqbg(K1yiEMLN!{rb?>1Yc}r%pn`JacbPsLW~b zpA+Hq5AnML)az$1U?Vqk#b+V+u8{{`%xUm0IA^Mg zd2mKBY$RP7af!|vZwwP!^MM=D#FJ1X%IROF<;N)>g4S3v)HI$MqQG<%#xM4An{l8a zCZCQDxSPzy`6VL;Yzm1%kg)?Gd*j7{fG~P+o?=`Yr(unE!ZbuK7SCu16M9o|!>jzU@f;>Fd-;Sk2T zz4pM?*^%1W*-AR3VLWO^m0XTAim5Vbm z{Q10dD1-uEpPk+&Zy=X$ry{EFGAEtE(r}kg3_cA;%Uyo$aXv*qHNKn6zc}zsbt2gf zTMwIF2LjUh2QF9f%1aaLxh6w&&@bG#?nYUVMckyyiQ$L4sZ)1)9nfSQyw=$y+|i|` zXF(|GXieMeN|YIAu+RPRXe|KrK9Jj7t}XMf(}=sNzP>mc0_OE@|X@>L@4|M@uXZ z!yMUAAo3}G>C&|`Z!%C|)YC@%$m45a>J0T1-0O&mG>8+>y_>8#yL&R}K)C2UJryQ+ z#1gFVORr&ug5B~W4hxcbza0rp zO$DC$gwPr=XeNaBh++MBGe_yxhwpQpI=SFdEZ)LX^m6^KcF01;b1!?eZ!$fX=3Rc} zzE>3AuON0bZ0KKa)x~|f)|j8?x}{$|S9M0;zmCTLln%wb42}!zfo>j8_To@0N%j22 zIlqwMDWDIu1MZ$;{tKvnm*|D040!0>doPI401M^GV`MuO0T=-}%(M@=STpdSp%)%Q zX)H8ekdt3|&B)S{&{&l|64y|giTu6%45u-67p2mW!l^k<`tU2=uCvhi&{42K&5A)(k@w;j7k?T%(xCySk(DzcSDz(TeKG^a5b=FmBw7elsGi1i=saoY z+GAZ0IT6>ashKqD#Tb1#>NqOuQBFmM7EjRK+6mxj&}x7wFUve42y1GYxRep;`3bjj zC_Pt$T({yv>g9t*({B%R$ebQ~`^yfYPzN8pet$6Lc(boFF=V_hdqDb*la#{sPF`oTE$ z05i0@1d!xod{d@$cC7c}ga1!_C*~tNs5J!&`YdC=Pocck4Yx}@W9rk$n{tL{<*6g! znkq-yK5_a1w%PX8Q8{#xjt6OMnj&%m6j}p~%8dM-i~K%d6zfn}w=F{*E%CK>0D7;K zF}foU)jLFB`SQ;*#y@4|=!6nUzr~O2oW^9`dacOR#q#T{Qik9$tqzCpM+sEVD@)Sq zJn2jkwBS;{j#SD8@cbj4WiEasTHTKp`6!MO3IK2yd8P*DCyg#e+7l0isnaAFhc?$S zhvEWPJZ_eg|+{&qp0659baDSaSWYd+caz1xjsSPe!?f7P|^(z);@*jG5R++ z_R~!KbAQVVn60v{6}va=Qt5-YV`-15Cs3JTmub?ypyHG>h9Ac_X&xuxSh+o(`gn}; z*a?1>KS`f-DppWrjYj3zu?F~T%)E%!Sd+~C+vhGK zrLm){Rw`&fZA@wU=wZe_p<(nJ4AV?*Bea(o^A*)L6Z);+YtzU-!R4L62aLE?X;;+7_u608ggxY z3yyl8lYulroxA|U@-S{^Oe!PkH;wstCI#s-@p`hHe8Sp$b^ZPm{t?f}<1@~iACwco z3cHW*C5eIAU<1045e5Ev@n}>kNDVCv!i<_R6jdyZ&klLlkd}ADp-frjKxBw(gj**5 zs$c4~d6phxcuv1G^nhXSyvE-ZQ*~}woZ8}P5N^R9BoSc!W`z&OX^pnX5t(@Dhu&C7XinDb&8Y@i__0OvF^gP4sDo# z6mkS`29&RPeG^nZq?cVkuG!iNo~_Fo#OZaXD=`eyy^o0Ll0&;hdH2U`fdKfA0 z!ezWes+MC7ism)&vFjjL4#OGg#J#{x2Na~o?y^HL;ZOXk4o@D%Zxan4D>usK*sYmNdr;XieybNSMjT3gJO+aaq?Wy zn)e>(OYVlgfuU|KKzAS}>@gf>kjBU2ht}kH4>1&F5qOG#6uUkSXP2Fudxv7xylw1y zKeX`_S8M2Rx>g~N&?xPXDWn4WEyp3;Z6SF-vj1&3qHia!p>`UXh4O7}4e85dIz0G- zKaj-X^8wgH-Vbs=`%yR#a6dcuBpg!VVG3ZEyKoDE@B{L9X^J4pz_<_IhCIyuFts^p z76Q=A!3MT4f0y*qXT#haC&!XZcmx7tod-xbd8YGxKGorkuhr@er50Yw={rG5Bfv{c|o|N z7K~BYxl0*^dDrmLa@SL854%o9AEL4_B^LZm@1e16aV9X&DdaaSD96gRg|{UKGU=tn zmOb7lfASL!qEZH}kHF$;VKi{2(Ra*4nPB9SR#Cc#zN0p+1EImzkdU64zA;XKxa-}- zXlpA^)=W4J%^jUSF`xbY`w#7^<8DV9LC)n?W|r-0L`o}=xr_l~QERYD>+r#yX^@Ay zUHM8Y@j6xri**_w$B1IOj*H6My~{k%?1ECA9`m(c0z*u#sh&W;Wi~H0s47BT;V>OC z*O)f1hQ8>`*Yt|u5e_99g11b+Ila=jB%O#+*E%-EqyxCeG^0D4jjQv&_G9xEc1~8vc}u8 zT3Pl^^J{bs`ZS>JftOzEg!F2t&OG^XDEfGyQj(C(k)wvKc-LZRWQvobeCgQtGQ3F} zd8E($%5HrJwJrl%8d<qIwG-eU%+RjyC92-s12J?Udf`*Ke%NNC(-ePm-oQ z@eZJWk&}VqB)Dn^E#}cNbyVVt^&?Jo`UKrhEpi7o7p5xRZO}$)q-x6-46<}RQM_M<9kE{<|6BQ+Bii>MeeJ_Ne%0*T!5w;{zZ!Eu-%jqnABTpy?jjB{ z+&^v{iu=GHeRoVDe>6=m#czc=(8rg8SkfO9;!ekQH(v?&2WNx)UWUDC4``wG*f<|> zevs(v9|x}TTV-fr4ZJnvN$91ud07r?J7*>WbQ``l&W8H0J~(G$b(gLPt zfJU(fhqzr->hu)1P`zbpkvq@$rSLNvaKGql_#NA1+PpjU;sQg$g^O4Zw$$;}%NQmB zhk?anOTHIjm_5xIuFT!mcjr=(;(6%};;j(}@G}`TL*19!Mv~pEW zW2y^>6TV&SeTz`}EndS{W3AqH=rG2AjVJFdr`9VdI}YWcL8zQGy3`lR@C3!+;W}oj zJ{+*YtD)s|7#%)GDYA<2Gh+c5;`AZ?$uU7DF4PA{bx7bOXe1??CoO?<5FhO@pW|kz za5*)=;2b!VOXX!=PpKR@%FHrcxv|GN*}%WkMO;wtob^)|VVes8$rO0XuAYCc_AEDT zP`P+YhIL`l4`rv`IKm|ERes)f09T_H8!$e!LNk_23|ey$*7po@YDq^%xi?DxD;)=S zBQ=CWIp6rWtiIh)N17rA9;g54Fe$Iu(F$J8m;RE=k-&>f=*0+yH+9?iwcbc?MmF@m zXO!)|^~I42WdID4f?J{%V;VWc24$*t>4-bB0pQ^1RLCm~;PkrI0T}2)JJ8XA@QZp5 zj5b9;kG9hzm9%nD2$qF-EFYia5gGVynEE&ImVxv;Rc_LZzUibl{Z9ITVLEB8ev#h# zuZ-_>P`H;SH+{%Kr}Lz#jtr07L8F^RI3iG|3vx!u;71uE17NujeVhuQDqD3>{J8yer>V zzknZHXo9$L;NejrT5#Kg$C21J@bCA3D-x)h?3k&B?&{7c#4hqb&CO5gP$>PsI~7Sm zNqFw!CQI9criotxx=J$78-6<-A&IXkREW@9M^ZM!|J(C}4SemuRXPit>A4h0SSn_GL$ zX+rIV*XWcj4eWTsaK>PH`|Dfs(@TrJ`+*UIf4%ybG5E_z!wYURYEbwRc8Z5R!OBSk zKu1DjS%XZt7r=BR#UAT=tubiqz1L83&h@(wA6~ux_~F&BZ{BkL62BS;eMF3O8XPwC z_9lC#N9vOBJt3!qGLxU?<&&O_8M&sfmz{)_DSWrq!CqR)$dqn5L>>VDX&i$F-|*c*DAu&6Y?oaz?M!K*aNHqs@bKH?AE6Vk#MZ2=vQtz z4P;ig#39f2W{X>6yn{FqXoxAxcoYt&_>CUD)!>3wiQzO{no1|nrsvt{^p!C4sbx(I z5}!J!QHRVm+#nEx8>f&dB+4pYoIau^lD|)g5lMAP+j3(U0D}qo20Tt9**kx{+X9g24F;#nv0weq&cfMe@WxGS@HawdEq z@Gc<{b;@@M9V*g7PDf@hDC0k~c>R*oI^+o6J4Q49?GrCHbnuGxG_KE4o(K-dh?Dx? z)KOp}hWmqi&@RV%vrVwZ-Cvcjhh_iwPn zfUPpmtDl?0_tgEHY{zOZt9#wwg}?ab5Z8+V9Ap5V4NSZo(#IRRUe<#wKk`vI`oiCm z+C4w=;s5T~BpUhK=-9|kqIQ9y!Lx7Ov$YgJt|6y;|D5kzoYT;0JWOx>^tyhm0mi^) zmBVKmWKv*M@T*adapU}Dr=S3uV~FTucr>Ur?&ycp3Et8${(|B6tA;NPq%EL3o7n59 zF{|-wQ5ojR1dPC#-#>U>>I?M<7)4};tBK@ zcwpJM~O&!va;=XAq&^XSjG=c{hw_1^& z=##qP^R2zYT>Y}S4#SCC)Gl(qV``66lRR>YNOwj$je7Gd+jFM$-7x9|R^;;kvv;n| zjVnodmZ%%0?%CPdSbOdL=>Pwt9O1Adc4lYi%;|1Pq$JAE^JWzYLL_xve>x2T#PFcAF7Y_H*d1;E(T_^h>B-(`>iFCNK;vXV&$`iJh6~Qk%RPoZbUZz` zzR%|LW{^;B9IoTNX0IgNV`G3@9Gb7#`7Lu`mU$ka2O1u-BANGGfOz#*1k00GrDeDl zG_TRSBfzxZ4DEu~JY(R^=YWp5y(-?X_9%3xNwDuTz-N!#=>R%pNL?wryxhZACQfth zJge9P@u_p=BP_$0&M&Z`vP*f)Fs)W^@|qRMkkz3@)}cc(ZJ@BXKqtpux~xV=T|zd` zmlFzvJbOEm&ijm?=(a*-RoyEzCW>9@++NXe;&ZiZ*(mFb9OOS@af1tV^{3hL;D3>4 zj#K%c4Ac87_t+(R{{~MB_`Ie*l{e2!$cHh@>6_>Bl#Po#0Ndr3gXRBLwo*&iO-a3R zwQ=!LwIY+n=v1Em?A^tA-aWe_hw!Nqrq@Hl$;n&W5l^NklKkDFm{i4wzZ@#IUWQYC z_Zsq$cbe-5U&EIVQ(iY4jD%e+nY(o}W+U0VU+jDC_m|icrJuc=0(ug8!^H@35q6dNY>f%&-_z9scfIYw~ zIXFBwKOoXcs08Uu*zzegU)q8c%k-@-$O&+y9GGr(Yg~#>d7K5zY0GK76xb3k2DK&A zRii+x$O6zn<`Y1fZK%Xz1a*qCx`OYtKLpxl` z2fK&f(y8^`x@l;nS3YO2gMV z0f0J7e#DPFcL4u8ddQ@GM@y^|;pNd*-IQg1(#4@*Sd$+b^xF+L0(oq(<^T|njx&i} z0NT%?C1A~}MUaV;U>&mSP@FhdhQ9#&#LEUJZpzK>mGz{9B+#{LbWoz)#3?H}#$oY0 zE6V1)0RrRDtnnS75T2FOo-slG-GaQ(R0lHv=CR*Afwx=iPRn*ebU72+GX=w&_Nqg% zq(|w54_zvo9C{DL*5uVRT=!jP$L}+kS6-cCb%e1}6X+0K(;|MtkV1za3ab6;wcpLr z2{=3B+bHnpaH)Kq8o4r*3L2`)@@=TNQrDn!?}=!PxEh{R4#hdo0DEEX$h5TX*d5;G zeRZZjuv>E)rb8b4CapTR$I$r)&f&75AiWUq;qc8o)5tf6{^yH7pckH73?b6Cb?(d2 zu8(LsOb6y3&e*;Zi>3+cos!& zOhbpldrX_KUS>YGd@e<2_KZ;1q&}w+<(OfYez5f4sDuB!n;rax{m(q~{(}^Mmoawr zOaBuVLH#8xrcmXnZv=CH&mgXeyVL{Ay0BCth`r-w=E$}`vc~gz~aN;H0KT-!0!l3{}m=}PPwHy=LfCzM5>S zIe;x2^dKC)<{{2yh6|wsfk=jl$Ol5nyXAr=;G@80vcrTevTla2oe9%gUzz|Q1X;{4 zpO)!~GMh)xXkGSR6YmXSOTZ`g;4$aqRR<0~vrOyK`~pEvqK^#av8*V>q6B4HnOv~J zLt5!6&kwJWkwoyp0p-FMpbWmC&N+DyBjppO?D9yJ7g!^c^CvRojC%3g4|gn$d~?Ob zTxmyG=!SpffCv8x$Sy6NsjvzyZ8oj9mSr02M!wuE-g-04Yvk&B^fC^GjsZIex9k%B zWA9B*Iww`X+7RXPCp*y}=Yr$g1$>gua~X54f=$!PB;vj0BaG@NAC&Ve+v?ABp)F6c zs`jjZfN1oMeg)&S%=fyqcR(GPw)j^U(B}G#`y)LY_T0dyiyx>x>k)yt&EXT>Y47Sl z7Hgi0y$DQn7J#E4zW{FYKb+(l;xoc~^A28n$=028b@coop3Z~43ie8PkJ=znc582n z&jM^5x_*a8Jv)EIo(m^mJ5Rzz49bz9;RD8WcCAk5Z5-#BQ~H)aSCU&{Z$4j;1}?ql zP@A@7Iq>EXOM4{m)dhNp?V<}^2YFF@=BX`L;rE(eop`e{em1B1{!@+QY#N~5^H61$o2a2!CA5QAo%xykF9~+ zqoZn;TkqrF^7gw!@msF_k0v`0-t<)D>Aq&p=W(9&+^iqvcHQ;hXzxbYg=?72%VjM} zymkcRVU|w`ImGbh(X%MwR*jW%ac`2(CUXBnsp>QX1 zAF|I#dn`CwT%~k}bNE7be77&;GluP&lfGfH3l9VlOqF z5=^5mtk<9s!4zSDotk_PC}en-W5vx7ovAnX_GeXC2g>7+5Qq8P(Unt96z~dusJfIP z0IVAIcG96JXRN|0IJ{_U4(j0=8_lpKu40vxOA_KO9ZJnkOez=Z$JSpbVcS!2Do@nQ zEsG4?0ut{Q0$~6!bRxf0;0XmqUxwwjAx)N&l?CGTq2)m3u7dVxon@f_(np6J)xGQ}vJQp2iykbC}1Nqa5%J_bCA+Vp#&I0%y!R7NuXE;v2y$pkjf}`d8?9i!}2W@x7^MruZwQ=?y+I{I937r`0+#Xbi4cbdc;?$?l zJ9`Omf5UI?V|1>jtH^wu>UJ6%QQ}5J`>#Bg4w;9co%<2R zm}ld?>e51b*zlN-j%Nu6vklZSUp;Q4De zA5)!7RX)U}-vSM@#bM_bhIYn2En+ORZ>_x=cu2B%d>C%XE|9xD_4d$GMN>#iQjhoT z>EAq*qPIB}DF=PY*(P^eI4~WG+EbHTGCeP-x6Y4qg|Gh8nB3rXxTup}Uu!;xR}p04 z-?4j_?+EqT1|=;{}^I9P=jFE95q zR)qS@Jc4tOy5E@)gr`LjFfs=e*mAhw#R&$(QL(ktR#gEHfG{m{w&YTJz!C7XweVMq ztN={_F4$oY_)s2p0Fz(A7L0lgIcQtwf{xlbB@O_DECmh(9jBu*|>hXMw9cZ|5h#MFzozAgRMty+~oL6bUgX*N+VUOH&$&)nzWo3{g6<4m(Sg(;p#ckVv~=5(KRGKc9jtqH-Wjd-K8rJ4&ic0()|&-Go3Q3H_8f+QuCDhjFUxp*(=3cfVKcBhe!EA zyE8y(<{EIno}XQ0K?K38tFm2w{fb@Kt2jUSr{nX3QqXTmri}) zPPwg@rl6Rp_b+8rZtTj!Q|HR+z2+TI_Mk1Qqs$qCQ=JGjfIQsS%FMYvNN(oS5zzTk zclJW$exZER!IGqq6=m=oP_J>?ObZWXR@kdp6Ts3O7|&@oin^`GO32=QmyDc?Ay+MO0Td0O<4_ z9-r|nJv;a#^!}Y*-79#~saR-pI#uPRrS6rcp5$uCx>oOOo@zrITgjfF%E;+7%|-?; z)_HOtOrxjQ>*N*l82M@bCtT;bVnwq(AW!fE7IF`C!s`0D8+k^$+#uIUJz%6qaJ0ZZ z@rlx)_9dEdEe}lvqk>*~x~Y+(yNBT|#dsf^W0TS-;oC7g5PfHd;-NyuA=_?_kE=l-I#jtb5Dp$8&oJ5@r%euI21~$-2Mrm1&)q;c8S&%K+D!s zTOK87eb|F=MsJ4z(aGHE>lFR4kQEz+OJlU@6bKezBu-b=so)0MIxD0P__csIPL?4J z>Lc;OFzwj7gmyd z;biBON?Gy=gK9@}i2T}+LtDZl{42*Ty-UiHN#@W_9g#vVwX?1kZ9zKDHxS^dONWdI zC?kgg+H%{j(Q@Cx8?9HgV2A(K2g46j;*$eem__+reMI{BrR5^QVLV{`rC)wzGpjAlF~Nd^`A+)uF!8L*m>bzkV%1SNHuR zm;z>$5W6EuhBxVa^m|pC(iH3;aS2#WHu^w5H+7Xp4bHv)(gTHzhGl*ane*{F>yKS} zu0ZAT(;0?^4)Q$?^K0+e$}zT@A(H6Tv`fLbx}r!MM4U?@-?`T)OEAx9GkOM?cY)5` z&pF3~L{0P`@GM*5lpVsnGFac*gZ1PVhYq{55hM2ySqa6tE!&7K*$ZU`ic&cB3UqmJs@(?oFMmbf|{eic3` z4QcrY35Ha40#ivXb8YK*AUf-TqhoTclUqXZF-r3mr$hNEs|xJA4dPLd>5?|OkULIB z@;rr?Ng&smm-Y=nddVtMzQhF%0;kJ1l)_d{-@5^m6yg$%ew6Cg7c<== zl)%JMiiW;w0r;Gx2agyg52163{udD*CWPvZ! zkN*l3H-Hz~fJmJeI7u&5F;lYP#0jzw1$@+5?gN!z#lowt$U1oH-D7w*za@qdv8|^|t=IB2(27_bf{9&XmKg zYIP?^1Ku2b`Sz8xRFd{WdEQ92=+Dnwmf86<)m!EV9_KiLE`fSvndssOQ0v#FJ->sN z@@Dy9Wnfbe+N4|TP@7N~whR>{<^zvGnkn>k>L?{poduRUo?Z8>YUoG0vU1ZLdKz zW0ICGyvZMR?`|IHYbOG7CxzP+YOk3+nV1s}1Uq%+^T{EfHn1FfeZ8R9fW{Bv%W<+C z=rlR4A2)5Aq8iWT_{e4KjCh|V>D45ic|%K?tQ(GM3<^9)m@Biq%(Lqg<^BtE*!~A| zW&Vz-{~37~@GQS+K#5I{>|YHuU6+EZ9^@~ZN|1Rs&T|Db1}TENR>Kbr5%Fpj&}u_TPGl7`BK~r!d#1g!55bohm3cQL%^hO0RK0Z_EdKQ z^EedH3NYsVcSae~xudCAAnJ=kz#uph%nJ@23Uf@FyhMmJE`JDaB9#CZDb1(60vLgbS>?fAmgo~+b#7b< zi<1mdvb8qDLu`eoW#3lRZZC)#oj4g@Fe-p|XhxSsa2Dl(n{>5u515CHy|uVNn>t1Z z@S+n42h>+NfC^~Np1=3H3_y=~S0S>;NvB7kCj$Yu@n(6TWkMW!urfd!gA_LN?H$v^jF)?AK z$x1J6mp`^QK-?$_)P7x}R_FShvH5d)0R)sa|G?s`TX=v!?Jf>6I%$2}kJY)2&AGM()Ca0dn);dYru##FOy@x_-=GU3Xgm;b(<@8=skM_Jc zS8Tzx^G31~7Y!q>M(0ql8R2|(kUEKLllqZk>r0!Kzrm)fu%wlj^i+{RyHO9ZIZeg# z?GBSC&k1qJDcyL;c9~wbPw4$mIur~c{R?tlF#PNe zEYBD=9&G86Pl>4xLw9V_Gff?LB>FhP)Uh%ayKA1C6crvNyqx7J?UeXRnlI<(zK*Jf01{`O#7r)#(Wd*7tiQGeKWzDGRlt-r{c z$M;%{H#!R|BR&SQYX#PeVu;v0@pU6OuC1Sxfc?riL}(AzxD`vID?6WuoN#gq4mM3;czb=>MVl?*t&=zGCqC3J{bD-MpxCXV3!b(zR)i=EW-@ zaAhf9wf@ZoV**)u&h}=LI&Vr zOuEaw>S$zm4|FZfU9hARAquWx6r7{CI9$qOIqU*yH?K`+8FCmNY&B&W;5_78x)4vi zd<%k=S;vd~=Jh%{lWSQkP_5I2@EPg>BDRnWRl3(HB)vOX141)&MSG9}H@~vkR|F*z z@K1RHy?j710R|huk-BrfK!(Yf)-ofY#YeIxJNjTVuH2iXl2G`tD4#nH8xmyK_%g(dt+^ zOS8p8oGWb5xd6_SaX6T?O{G(H!ji)d=R>=IU8t%9%Fi$`Q=wa(U>S6w0$+-+BlRGEhD8tI)e;SZJ(9-#EI7quCWm( zn7bD^hdw-M)9Tm1UT(-(K+5wfmUwWDO=k#{^{L|(9;jcAI!34H!Edyj@$7OKr*kN5 zWQbctS^d4HEa8E9H|gopB4Iu|rB(SQpSF_*0Cc4~RH&vH2b>AlG*M*13-4=}PM)#s z^y+$c@CQDA_wP6s*SIu(E99?a{x4Ghid}lmHqYhyTPuO`LJMp8oxgoukJ}?CFZ>_p6Iu?v%gcBlmP!dnI_LGAsG6 zGNxtLb$`olkA36NDQnGU-nf*flk*`r*7wtM{=k&$r{)F|J-7$<_jA7Ca2aL|G z6Adw2U2I;D(!SfN)r3HOPQ_E}P4@E^u zYe!le-MMD5jASjz#`3vZ(~@T5Oi(42W2@(&t8<1!9i6eV6OO{)`Fig!tax%vld=wl z@da)tYCAcbHdgimxN#`Zr9-DOJOBWoL&0l3FJQ;hyDb^lJ!7)!8D#~8 ziwqjb6-33M@M*qK0c>4{oRK%*7r9lb6|0ur;!wcr zF}lm}9m1p#rw>^aL;6ap{hG_X$}T_Fopq@_WPU=cKXcVJw1~_7Wd33=m@GPimUV-u zX=Sf4><7I$U&G{g>IE9wk^DMrMxFb$Xe@$oQo)$qmGy9ej$H=U`3-)5#GZ$Hdy}Zo z*#*O)SbBJIv!FKs$CZ6<5U;%vjk#E1-aYN6_g1HR$0Bgk0eW|S0b6*G`bxv8S zFUl*s&=x35m9u;AIafkC! z)gdw6U_+#n$2g;uSI-ve3CG*QyR#%;E9A7NQ~p*w8+CR*o&OVyTCkKX&&dDAH-Y{y z_u>Cz|KI5Rn-lG!~%o_o6b_#z|EGmj)`c`_nhe_*phtt#?_MvFgpM zu@un+ftg_6lfJ8v7CJ3>%wcCnJ2ze3OFgut*_M8t;<2-$yE~Pp{*cF>ezWY{k3Gs< zm3b86={A`sNgla;SBGNE%ci*FnD2BRUDZS6ft`G>BEN@_F``X|hlk`S*s$R_H41<9 zbi%U_{$bMyf7HVZzS4>*e-j=D{@RJ)pgSMaxQ}+NC|$>quQ8Y~>u`hNCioCIoJ1w- zE9)Mh#VeHQioPG&04;z?zaLSPiU9^J?|971)cu?kpCCVHh|U>37z_`lWfU+2pqv40 zctfW}RIug?R)C$KZVwy-iU=;d^Ceoqy|=Rah8JkbkT1cs0&*FQ3;>87^VZKqU&^5S zfFejsVF9o9UMLr!BTHr?TZTW$k01`Zt`V<+ga^Wihz@lY1T(TNKN-#f06RQ2O{LHH zd=m7QRg#iko{<9(0fK`Ufw&F``D8rGEnqUxrJOUDPsM={kcn%g>AkbUW0TK-eK^ao zEiE8*gl_{~!MOo>=qKDd^qRcrFvB<^m67s*Y~-;8T~O?BE{8c~2~tv|e8S^!!3LC~ z$2bAhN1QhD!(M20`d;Q{v(5sv>M~(O3c6Hij>;!H?O>r@PEoSGWoq9t_|K-yX7NX0 z9LFLLu1XV7PGlNDG7P11s#D;2qbF6!NbN?Zov(20N>a)U9asFBvD%W~GRf}HBYKCrU3Va!`3gED;S$h{ z4LK|+Lz*a$8V#T15%%IZAhT7X za^p-eJRaWh0W=t??M!&a70h(2>~RJy?f$34tr%5=rKv5p?$hCo4qe7lQa&caw5E<8CK4s+AR$y zE%cAv&9>ppMLGjNl%@3#VsK-6*qV)w84(5PLbqW{xTQL=PnoD;r_>@EzZ( z_!9-W3ZBm!Y5z(C&7XNb9Wtc!ra5q_n<_p$m~vwaucMGsz$jpS8k<&xD0ChEvz>MJ z<1j?o4<)b;(-4stL&f)e4^zJ~WLgJPa+4~XR^c@H+gxkM(}FiC@771p7h_2#?Nc$o zr|rC}L-AOhZK~?6ui8Vc>-mky`ykm?=K(ZtRK`9s+sf|gje89r8-|DFdYw9~r*$vp z{fK$|M@Bu&*=~fJJ zD&SVYLoUJzWf*RIs{aBsYoS`pc^M1N2&>j=0Rv^hWnW4)w#tt*(kcrR!K}~?$R*s8 z9E##fPA7sqS}p_jXbp4>x_dVHFrG40Q^t)GCa}o(Y`~a9J_Ib@z=E~DYEpo?O|9Xr zz=uO%f@#$%;3DJ7Rblj4^lNOmy&E%nd*<*)*=d;+@S__GM+br&kQ%1~q%apiBh9Rk z1&Fj~!Z|6{d;lW(1dIY9_Xve9sIusqYC~^=A%}bUjS`B2Pd830O+b@b*T7dN%2k0( zl%Y^@SRAs}TW!s(ibxRsdu6?%Uwd3ctpuY27?ZDd(0K zUIc%pQdK&n=#Go@gthX8xZ*mBjjfc;(F%?HHD^G*VB_$Nbm7}Nagwt0KcwwYrkWgX zTDX9=U-bTV^Q~0t4M0M)o%(c1SHC9hL~Fy(Xq}z`G?zFaOK4wTLytjF(orWmP$tyw z;=IZ`yH3IaC&Y8>OQ7z3mv7E+=XBXJr-I&*<6~Rbsa(@ppSeG3j)69rrCs4wJLt}c z%Rg7?rC}X#>l0TUT0RFfL`Y$OIyO2^u~W*A4eA7FD~7Y1HBVFdBwwk3p^fsxut`5= z=g0Z95r<*9)UQ2+?zK7_%#l~n?!AR(1Hx5__l0uVGvQo`g%wML;dAom`zqEU@j6-d zFlCiD=*UZk{!y;9;*29>)d7(NmIe4*Tb`?2mBS7Hs#K2P!F)4TkCMLUZqBdpdlfcl zsKZ+(gZnYVBPQRU(#t!;(Voxj`Eoeu!NFhP@3YTK>MZpO^}64!x;y|>CR^ud^K^(o zrd``wnq4VAdU(lJa-fXVU+H_wc~wKjsggJ#yH&H9{i*4;7d_B2I;5UTZ^-$&6J_sq zxQ)^VKHEqzV$=r%TNiP6o(%#oz8ERdNf}Sr}K}u-}O>wP8&7(8YTadjbI72&Jrc*ZDQ%=AM4hcX{ zpd!>c^jjM&?EbXM(G@AvmTefc#BzeB9NW3`Dguy|nSA81>=N zJ!>WV&5yLm(?ajJBpkjaG5OY#Gcny`-?bBTVHwI02VcMquMRWR{+yJb#R|w1o3c#e z-1$$v#QD*N%m-`7#$j{H5%58nEW=!ms>?|3LTuiK1Tw_H;Y~eoU5*O%fSg!MRGfU0 zfnV#$K%WD#X=Pv|J94x0^3!(RQBoU`!NjtOwBTf`?3FkWVMM&rTEFEDf z9T9(GUaoXdVk6P4I)Nu;hCm$klw4(-gPMqJzVGE%cI|EPIioWZJ8pS zwsz-k`5log4GT{^RCxBGBXqK2p$o3q?+*T%RrBr{ZuSK#-*^W81rPsk#C@aeE6UZ< zlq)t&xMgKaV85uNaa)3iL`YrC4k6>zo$@%0gkylxlMMO$$+n1XVW!^|Zj@#Bc=c}j z(PqV`E;;7kAHznQl{V5sE)AK|8fAIWsl`r;9*WI77JHNM^nJU*N2}YU?8JJ4e!apH1y;9Wy@j0XM$x=j*_ShPIBAgK)#oW@x9=@5^y4VQUfA3HP2=h6$Av z`fO4=%GpIHI!8&CoiyA98S*f?yEgfHSU_~RqX6RsmQ}Y8^FAenT5S5?&&duJQpB`Q zq`6tE@;Kq<0l{g4mY#IV=dQf!Z^;YrhVu?_Y?(jxW!tjoOej?*VS^Gr@%GQ`0P?uL zyPztVnwO!id%V*D)wV*GF0{;QP3Gkf$alM2*sDR>fM{RPb#IwBLnxpvzzJw2zs^L~ zl9zY>V(+}eZM~GfILM(x0T%!|djO7U8FfOeEtfOCvoX&KIq*oC#~?|+R#Ed007USc z7Hq)C4P)r@c5)IkJX9|VJkb2AeZ&!??0m}sHfN?0;0P+v+Yv3tab&1S?|oaq1)(}@ zrn48tq-pI`ckolX09X>Qoc53iU| Nl93m= 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�* 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�s31WUH~5WEdfF>5e=^^Myw|w2IIqEFUG2@cejEvS zO};C<8Yb6pn)E%Rb}Yp6D_Ba*m3drm0A(n8_dc zHa@|nME;P+eFIc1bz#!DisDCFNbVYxX(h9ghjcEN+NBq0JEm76JuUqah!p8rf8{q=%L+0@-zk~oiGOt@)n zCo41sEbWde*b+%%Iu76V?cL|QA^*yi?FJqg5SK*m;wCAtDaSb~eOD)ukGu(hQ=VHd z))(C6eIoVBoo$ylRY!Z;0th(w=8^WIF{hFIU+;9uyFt#78J2<_pD`EY{339bWzAv@ zfvi$xIkY!l0m_;kBe00_ltD%%SzZf-UTUaDQ-Np9MhU<%+w$-1|?P&)X2)XZ>$W|CF$N@YZlz=I15bUN6hA7rc=Z z`M`b5LS7Kxj|*zWg!a*I<*5)=gWyBW2UT_Bj*qf#Pxk!r)ka}+gaGA^8gnEeFQa_e z`Ka^Zb-xDv((ScY;ZkwCMd3@nF-jkCk1BsE?kHpSB5E+S-eeUHC-hEG!c+!TP61DT z@~A}QlP;D7b_#@OPxy$RPElmRPnVpeSKiFa)%K7P2w=>(x2Mxn1tH2WxT=t<*kmMt zeD>a7h#zikGeI@DbSs!sjk$ME=Vfs9x8Mv@LI($qb%@9KD9q;3qDZ~D0s4OvaF=R4wf=p=$ zny7lGl~?sme}Dr{F%Ez)A6538FCp(T(N?1eydI%TzJ+Ju8@vFqJ9w>IofDAdk`&fQ z*z$k{zm?-MOq3_u59u}PjPq9aAUA-#xpl=S@Iet@9-#T$L)gmS@~DEvpn_=Bt(~Wr zT&17#vhy`E>4@5o;P^8}scc~Loanj zrDom^B})<|^CN#MeT-6{Rr?+I{~pwtBE ztzwNrjcwaO+JdC}zTk9E7e^edrwR0(v&TsGsGvS>fW3JCE^?rYm95!Tp5F1kav9;c zDsZFQ9D;VDOZkce;j2oK}} zbz2PSQA;H3>7wzEQpG+&1}M3mrbLN>~g3{#fs_uZa%|Olv>?=}pKME-p zQnK1L=v}4kk=|Wd4u$)I=+S#9`Afu0?uQ=M$?--6uEG(2>WAAXC-x3Ey8M`ldz5)_%E~MBGOD0xgv8iD!En^UFelUcrBXR8r4faM zGBg$*Vh|C-Rb?Nog;e&iGVzv2@yimjD()yMrBL9DkJ9PNQ<)G9?NQEvS33*a%P$QY z430#ghyvWX2Qs=8HkD}jN;xV}@i)i7C<6stRd~TixEf}mm)yF2sbJ~6;$oTUDOM?@ z9F9=x6F^eA(`aDk#^?_BD3=(X;l84AntbwH z`e9qHz|)l_rk~8=^tpQ0rNt2x3|DA?`KkNs*)_|Cx|tcWj|9YR4jMoPxrZ0zw-;NJ zKwM&EQLj}~r8sGTh=j6)M8)8_b;;OUT>z0e{O*f)67|xDC5lZQ-f0ZwszjsApJ6ba zG3xXqb@>Zb_zPOaFBnumpUhbeiFpH@W8z_c>fZLPa<9y##-STl14|mA8D1etkvSWM z<@*<7!Yk>lLl0p&Ppgw0U?P?9OLwH2Kcl=-9(Aky%{v({gTnfiplX{uWf2J5YZ)K3 zhqOy&)(!&Y$I%63&=EvejXj}LgY$;fy?(p7u6Cr63s~i3MtM%S25^jUtKRC&XdmVI zX1jMTREAX49dm7-p?wCLs4bisBFk$U8}{*&Hv5?+y2-`uzI z4X*fQf}|O?s210u5T14SxeW2GI%*~K(;a`mGxrjesxOiE<9fqYWzYEwu2y63Vx~P# zyi>{0hxu;wj-@soiO>bb52}im_+|nuJ;)P2y7n&X_JKysYAh&VE+^x&mC~Jae70GT zF-p0;+;JUHVF8#5uS%*){{)5P3_kqTTE=l^W*9X0WomAq>$cQ)sLtN3c zV)VqdNI2pFG})oDl9Mov30+|{DCXn=Gb&hRO9RJ~l+cx4Z}TB*Q8CHmBvWa(?){yR zKT567!&ECDrinnw|8GY=bb`+AsME;yJ8Vk zl9rO?3-{&+rLf$&3mR}Ij8drR>7wS`l?Mzx=YFKkkYlsww5jazaN?AsZfEfjm zQsEw9{E{~5tp`q#Qn}3^_ie-=LINJrZoR8`npeYcg3z2&m@aJ6`}!Q0vIlDJo*r+~ zIr5=VtWtXppQJJG3G&-M(i6_Tu0c7hKQNHzkwHqmC7&Ci-J4grcXTCbhV5H^c0jso zyFkqHfadPei?sS*S2O3xnFANfREDSy_)I;h#Y2!w z6o(Wtd?A-N9V;V@<>qYkI&gOf?_F}zKMG1Ezw^duNSI7|Z?dElNxHjFNUSL?d3-)w0 zw>)riVz+JELtf>mM{X%A_Z40xSCWtY+hKCBm?f$QQ?4bjfUb}w-BpuG7()u+zJrpm zk5G4CyxGJ+Sqp6Is+X^K8yU5rdVlB6CvP}R36xeJ32Q&CPDrtg??Z0sHm|L$RX);4 zV^^+tw|jFB(rtq4LMXeTy)(^$i1vao*%7c-2F1R_#2rV#Zsh8-x>-o7XUY6w{y|mj zNHfTxkPHI$JeUxegEH2VR~)~&u|j=wDa4=fsFqO$ZbKG2LW)Ql-=~S^QvO#N>+WbS zZPdHy^if*pL{(F-yp4KmjjoTwD*ZY)`zW3&-cDdXr@K(a&@^bGR?O%|PiCIe!>yti;VsuAQH&yqa>v|J(yORY zo=x1soaD_la~xDG$(!DKuKr1z3gQDJ7>*KTZUyP}4Yx-*t}vvFjuY%rT7*HE*BBJg z=O|1RM(bCNNaco8e6racc~yMmli`jgoS~>@r)6+g!Bb%tCt=609G9TT3-FxN@PMDU z^ag+7gS>d&;Y#M77%b{aT#Ztok4K>r?-&ih&-@P3>%w7pt+oUo#hKI@Md8O00(o{v zomjpuYY)uxupRg(62(&{mZOlBKROfT!yh0KsVkbxvU--Ql89g+05gV`sp0z_^J^#& zKDx{+fuv7QKKyjjy{;=t<^%T{hKhvP>J}x#rC(7|CX@qiQ>Pjep%M*K!ytje_wXtp zcxZa*FPQ@t#)P9oP5{^6UKcxe@*dsQ=>&0o=bcldYn2MFinAaC3mn2f>eSIHiAozK zMK-jf2U}^H<3=|zW`>Gf-Q@=`u|SXT*y zWmRv|guKDPDYU<))Hj@e0iVCHG0fkvlK$b2z3qR$ll!tKAe30;e`rX_c0FVcvA7>-`Br< zTXI<58pYKfZ|g}{h7*-n?gJOyL#VYBrHMH^o;w;~52CmUS$BdcY+4e0{NvA0Okz`E z^-k}<|E#?zEx@T!fr2H>sP%-~vrPYga8P+w$#gesXN<&!0qqZ!D2g)$i=I#c03UdW zdj>RRSzFR-Y&fx8?ft}kHl&F&E*LRrP*y5CIF-?&K@hUSX7bA~C=oM)8}a2nhDX&;MmaD{X2{bm zG~TfZo2I5_NsUsOpF^4hD^I(BOd}Jz#2K0C^2PWhPBTV2H2W^NzvR3^fxn_ceb z>wdzu?k5bYzo4l90Poym;_RM1RFoCL!ynzk99i;D8MA6_B_0WL1d*~`1{P{b4^1Re z4g{h>DP4{l2~WP+))6qGkxdKYKZmyh;Z&9_Y>d@ydv{X5qZ;yDMrY&=`EioAvgu}v zmhCC+)D(Q>%N;Fz~g~Y zwFg#odKk0c1xwWC)Q}>bqZ2VExc7)LQMZwc?sntSe@|^hehmTe&Z;?lw1lhFwwK{y zJ+4Ap{Bb-|UQ%TN(DL+)=)*Qq+Ut5?azEoI^3p^886ZAKmZJ@deaOk|R$2Sf_2aCp zr{?MB|HIxRV>A z$VZ%Ll?X=sN3kCp@CG% z#Zg_x(&KJ~((Ne332sGh(ih`JKO9_P&|xqrP|mqFA8*T)M>U58cP&RGI%UkcBI%i> zFzHd5Qi;v7uUze+jZ%a%tI{8Z9bWTa{06dom+j&&h2jcv;f+1T?sXCVp(Gi8!sPC_ zIDwO+9i|bk@B9TL9Hu{Ilt2agEWS_d51}Cet{N38~QF3Lp&BSx}#SrNi@)J0?BHPLT4-}3w;=T8i0 z{h303WDdcP7@u!Yx!=HpQ*b=Rs3;inhTw&~y(K6e9R;{Ak zYGAQm?L=2IZfPf$5rAf>dmir`p@X@OcxeR3oyz4|EsrzvYLsE>M)|F| zGpI$vf>!5Y*fHVwh^Ox&R~utKJgcnDGvV50V{a)(>(%#|EvH69fdSl%8Ujyx!(s$6 z28DPa+xHWU3C=r=7_nYU_G}4h95YrfDTSSrFFRLcnbfQI0LL-XYKxpRlf_RPa6Ir289?urLs~Vy;^CE z+fz@+F$I`AVJH|optSJKye+0>Tz_uiFL2$5dmp?=2GP1Hq3mPczwc+Pd)SZ{^=8a4 zB)vX6K-FZhVfy2rv_KR=N;_YN>*O_jgO{~ zRb0mKRClK_N}7{*-8f7&Qw4U6JAle|CKU6*J|&Hc^#zK7?g%P}Zjv`c3wt15!@>`` z3P*Z2(IPT>V4d(`@Lrw7-dx{R{^f`gpsSS%D9W3P51``jtWrlJQ<^_F;A~!DS>NI! zJuz6gsgHqW5XPx8_NcPWRmJd%9?;h)fbOwiFSowiF37ad*9f5H;#K%6a`u+%YE*0J z!ynwiM9^~WIo29E!3_p1P%_ED5#FE#dE>pjkq#BRQlfk|hf3^8CL?FW1Ef`W<2FV< zX^~(0^v6Yujkn~%6h&DD&%H66s49GwZ+r8tFYD-DB^UU2Osa5FeEj1>AGqsE1l}Hn zvUqbw!P7j%AVht0Gdc|k=MOlU*`11uACCTrtL`w5EL)4h2R|N>7bFKVb%U~AkS1y8 z1hfQIxM@iV7O6Mib>d{t`{d2*7y|$C`|s>Y0T#*tw8@w7k*n`q#xNqc_1#l`FvJLt z(Z{_;gGSaAS3EZ-gjGpXh63`AFTc3Ajq-#k{4j)jYsXVrb4mb!gNO88!s9p4_Lg)D zaF>o5S;a|ZHkHJ$^4Aou1h4&s{)Bl~ym9VKWCeJ%n8c2u$KA>Qg3|sA=btF$N6xnh z?~lmsCG~I#ewT1ng+g9;_Gl2u=9Xz25piv>oGytxX4mLBhUo&=xJP~Wm=}@xL&(RY zu3Q*#5|L3Q@;P_eb|Q}D_6ILXcY?7RLzjq>Rric=<3VJDGovNYD38-oA)eAKjTD=C zIgETM@s_8tqJeh{Z1)to<^ALyDmrkTQK!Z^M}iCWUdA9v0#(VjY1$TIOz<3hNoTuL zR_`-!!lhv`PB4shb82%Y0*3s1E05@J>VP-lrVRCv{w+u3*|;uUF0_MBb68G0x0P6U z^bLh=slMf~qYaAsQ0``hOstpd{>n{t^aLR7h8KNu^}=_Tv^!>R$-?%7vMqZHC(R~| ztvR+qd48DX9z{F2tfyN?c>Q?;E9+?^a3i3K*#xFBaYz<6fPHfTTlfNvTSqFsIof*! zDMy>E=q2dgcInKL69LnWMrGyHlaId7>I?Sp#tnrH?p(#^_8KJ@W%3N)X_eEl$_8KE z>^H#Gy#rJ?yJj>`*Sj!@VpRX|i;(>6$GIUc4{iO;?Pq;3={NKJVteL_wzFRKmN+pHgdT-)Klb@a#v364WJxim}M ziYGJxMwLIKGk^%)ae=Ximw+s@>J^w1<_L_Z)E@a%>}R<9yqnE%2~qiCMI6%2QDkqR z8tR-Ezl!hQYRqLMkb_E1s@clQRV+^^!n;*ba8RPF6_6X_nkrEWbbBZ z=@zDZoKPm@1y;Qe;j6qPPnHs;&XwmM-n?PLGDQ^F^GMqOsTdT{tcw{!9%I4xi=$uHF(}HYkiS#f zuXTKa?1k^C*Ax+sxlc&m8OR~cEhku0wxbsq6Eu`N7M7?9*sSVAd$FC^9z$$lmft_b z4@{IlVdgOelT?}TSl62Zhj3-h-BQoqik^~Jj}x#FNaThP~Pz+nljj~P;8IK16k$m-EETnfdG53|0uWNn2hYn zbgQ00wVBX}KN5?jcS*B1^#RR13O?Yd%W6*fu-6Jae%v(>Pz>OwE)zN@VxJ0>DQBzU1A}m8g#!25QANDwB zRio4=3Ja;?lMif_iY)(0oIRgbqY8!!rSCs`C8Owbb+3dh%W8h(xJCh2N#x!`T!l@) zIDL*R2-iteig$kO73XCfrsfc?@*K)$Q=_^rQZbw$x#$=+Y-qZA4y4TgX{*(SR|2@fBFAvD2zZqppZQ-j8^7(OcG zg;eWoa@&u*v>|9qW=Vsi-ZAl(mX5>g3t`#CD1c`gjSxpFY$qC)((0TYq#zv#F6nF-KatfL2AEcm?}SI*TMrl$ z&CTha9kCr*%dXm_7e4P-(RIui~)k`13zU@a88CWj6&|bxaBGj=J@^AGW%0 z>Gobb9$HqPpVsZR^82t3#hW%V(z~|&%e<8HwNzun{lyIm0XIgqLK=g5^<9moUrR0V zC%m@Gs>YA#^%49Ocu?L`%S@AqfQ!8^#6on?D4&J9xI8Q4A2L&`w+&gB8yzE4HC9mm z>ze4iK#l!lFuZ*mq___6RD}4zqFgrW+8S*Xzgds8Ww)EX@+FqbH%Btx-b#T%3rkGLI?$3OGibB`_r z#?=$ABBbi2o@AI1#UZ_^K9k3ucPB;L3+rk`Drk-#XpCg?EBte!uyjP<3by=oyb;E! zy|EnfTYiO3cqz}tagKqYatqKXyy|Hh6clC%;mWTx69$YK%C{j?U7x5^d2qt$Nk%fH zmAt1K3Bc4hT?kUAtCWUU=p)a2=0iNP3vn3~s-a|oE-_JIRdd(s&Ogx= zD$+upQP}V-%x(sXSmn>?{{IF$cox?bSQKwsDS`3o;eypO^hx9@tPE` zq3@FU5O3!*Mq1dsj(UAVO}wTi#nJjp9(U8n-xjqLE-b10>3|27H}o zjt)U@WEEbZr4tV+0=rNS$yYK@Q=ulGB4LIsx~Nc@q!F{v-Lav7IdI9cz!vnD*^i z1`KZG`5@rSeSj^kO*SOKKD>*J=BLH%zi#rRGH-_4L^Kc%Gby-q#TJ|uLjC;fWvoB% z$9zYuZPMciJS*Xs@w+rA`V88N+5y6>o_&mLg3@5GgX5iE%xjEn3HMxA)w?IrAZnFk zb;rvjFVvQ>FKDa#gZydP4_zs1S@siX6>O5{r^7j6svaH8KI|QM>?*P!zFs#&Q2k~$ zj9ETy0nlXQ#rU`^Z1cu4T6vqX&kt!Zl?uyPNyiSDjSp0~zRCLXua2b@tb+P?)@94z zg)eijh4-^9@5S$cJT!O*Fj<0JzfoqQjPxQJk9tANTjMNCMad-=Z|IVgCvz1FdID?V zR@6p%LtUcr0+*1sGLG&&`ACz`55LX^j!?u^Nkx@sdj_3%aZk_Uy(|8p9NnXwv|fK} zEQ*hc823()*65&if}<`ePWY8Cx+m0fohW=nt1Q{l(hE(3D5xrgDuLkP2#AL}GYe5Q z*B)^vV++sso2NahZoQ^kL`E#oF(x1-1ry2~GXhf>*s9?TimxLL8c!;f4=7$IC?+o5 zs@s&xaV!SXDi(PcST4Dv{2OjQ%9aAMz*9;?sdB{|Q%Z}6^`cVell5xO8Vw5IxPd*u zS9xX~s1zD+M)PPeL~-IOH)4==d=a-f%Hrcm^`W2Pl9J8z$lvA}G`Ax85*!5z;^HM` z!c(!!a=nBEPkz(O4Ly-P@K!_>EJLA51zBZSm$pp4?hJxCa$%imU_2m?)`bR+w8(R1H_M7L13B}E zCk3V6Gtadhmj9t7(sXWTSte)SLn(B zpi*xJ*fxAux^$|T`7Cx(;%N(avszK>jCX;nplSS?5{j8;Ks^C(!l;C!NmhUvr}#TElbzimPPaLY z*V~6#Mt|J(J)}t|iPIjrxn#%sv`+2;L%nMVRVRZZsJc!q;PstyrK=vJ61jpy=KfG} z-VZ`2zkCvxJfy@tEPwWW-z@)2IONk_R7BK&>PX@vGtg?jEhHZ#sm~MdcOA>Nuq(kJ zJlJ$0b-$UvpT_1kd>(+?@nD{Y^D=*W8q-k$9BZwKkRhg4CoqEautgo*DxuipkW5d_Arw8C63M>vh`cI3GkDC?-mUJ>{sNHbg^E z)Y$Bg9%2=-QpPSaf?%Ah7&-ExLZ@Pzr8T96wB}ZU4aq!3nWpSaJXbMOp+Xt-eWHr5 z!j%*HRnWv&rB7wO3HAG!!#|tCW?zpsWEez3}kCI?8HHD&oQc7ki$?%%yP8 zPz>$OJ*U2O7ts)_eJkjRHa+Q7vK(#6To3ZJ5h<@K`XLT_t=Eh?nI7Epjs!h7=yT;I z4FXr^X`>s~DOzQ;Liyqbd2ur$!X2|OF-q-yejtq#>P_#mpfHAVts!uME|pk~2`AIq zlkcd^*#sVqF?W$)%XfbYjpuXA;|hv7r9oL6Q+F=@3dktHs@uw&19rEpAF45de++!( z-a1pdkV7TvLY|QI2E1H`_l$6>B}S7p@@#o9#UK92Cl17=4FFF_E{foaQ$JJauhi|o zvN6lQ(9`eyh$~Kwr76!>q+x+mWLo1&S)%S(&B~E1M-LsbnIO-p1FFYTm05Auc$CM= zzwJ%=ic1qbvfX4f3B+Phkk)qLg!6j{a#bY_3F#N_Ic{s&!7V5Fay3szG>|<4$DXKNSw2d5(X|OWve%G=4A{ou54_;Pdhm#>R%D+2+4pTSegEk5spad( z@4w%~zQJf$>#2XV@P62__gnJ<-d5X=t!Y~1N4lmihHTwi($b)y_Vy+`6lv~e{LEKCIkQL7Q3%7`Ak3a$Ki;NM;Z;#^gu)N}{lbqniWpz{e2*woGA-My3ZbhT ziAu;%A|6m0R9ZY#goLkqOOyqpNvD#m0&6~d>Qy3Dm;y}rCMH(cB`F#Lzz}Cn)Gl)- zHcQlkdv<#k2hJ!HW;QqF*z2mo9XBWy6BM#*+%g_eh`Lmyv|yenNZRz(mmd~oX@(UJ zDsLET=ICTe8Ss6i5mKiLEt!bd5R;O`S7DVe#Hm1o18MIVQF2nYilna=v5;>n^Klaq z9CX-=E@)j>oL3@^;$cs-3i>s!MelJl(Tyc@9!R0W??{nyAPr+jpimZT-Uqya&g%Ua zU)AhNr{ZcF4IJzJB;|oCz5d3za+b@1##rQDC0!%;o(Z_uC+wjBKK3-v!~tbi#V>s1 zIYuVsW|A#9IWOZJL*yh1s7fUH;O8ypL?xCyawYHm@L6{?j4N>f7Y(UL@Y8kAx{RSn zxcNy!I*mn*9QLJF33b%VwgO}~h=fR#TP`T)(r@*UDZJJQYKJkYI%2XA0u!OnDBu+e z`A<;zclP`E2dgFhj8^^A$s8jCLk0YqLX6BK_u#Anq_{`qxn}gw0^q#`TB>wul$ywN zhU%i^VSU?PGvY$J<{GB4p*%>HZQBt)M|Cws+z~q+3gorUY$M9IyJlM#!qj-MDC>5{ zD3fz1l(EPMe4VmLzzL&48mAhUO_7f)9dtTx!_DZN_t_Pg~liG;`X~plmsskr53Hh|H1DwTbfqL&Dv)-TYCbID4yzI5dS-;Q~K@ z;6q7iym%=#C?mGNc6}<`wB0U~Fe2a@V<-zNt$#ZCj7fSLc6y_AwZ~*s)*O6pwP1Xaq zHU8rT!aoF&&il9?+1shwbsq&m!vOzvl@WR;RVv~OjS_7SWL8H)af(3!f|);|(!r@4 zjRwWtoZfDfR(qaHpQ6$z&ri1HN_W&OVEeEXXX4_*Ls*pBD8{9j7O$#TSw$d|s44RT zmkO5!wWnI;>fOyXiiZn$3R@1AQds`-Doq}K*mUnG#Y%%hW5W{^>OIQU?Dn=MUc5=- zsLVC{5Y(I0QI1lmO&h;*bCXB)N@dP+G?bLzoH9iEgy1!2qp?c^Fx{Clv6ymABUqKT z^ppol>H_*~HUxufUuI_X1D` z#540jC{HC$G#uH`UtR-5rF4SgCp`W5#YZ1`jkhR&WYB#@W9F24k_P9=SeA7(Ly=Yi zR01;R1-xA%^pxGt)obMuckB;@V>H!&+cIQ&eG-a%3CmchM%PB9wZ_d1hxZZ)+gk?s@(<}H2ju>wm-|obH zM|%D5PeIQ43|Uc0z(SXQ-C1$~3*bRkQ=_iNz`1}|Z!s4B1qS|uk%@o57>|C$t?3QM z#sqk0j7B()<+#i}hNFtV^I$Z3-~#wXl43k?8ySp|2HbQGP&f6gF$%aEyC>hYHPpHn^)Xjtv*74=I!P#4$8<(w799JO-pSA@|K zJKAI|*Ic|VLjr>uT3n6nG_HM&t|-s!IpKV}$ZrHRQRr+vi}nk3Y|Ww5IyGYa`kSrGEfb9h3vx1@X7a#W(- zGz;60X`RTFc=8GqQm z0f=##ShS8(P(_SGWzu+bK#o$Zqx=gCjpPAErj$GsG&Lmuq22PVJC$8w*gGxNDy5R8 zGGtrySG;1h@N8JQdD(NT(NXkSdV2fGp$-%HmcgHFQ_=H%*l;LBNCk|@Kjav9hw^NF zsT`U+^D%Ih3F`c)K!%UT3Nv9S&w$Fj3XpH~M|td&Ir%MJnID4ED!jOAp~N~LMrGcz zT!NISD1w2fY(RkX0JJQm!E(i4SDZ%}Z!fp=GU8eToT_W^@SfUtPK|gvfge$d-03hE z-U3$8mMOhnW0-O$t=7kaiM;>BxKQC%vDGWAxr&*i)o)3JV63IoYT)Vqw4i6*$=z{X zL!otZLS1C$_HrvcE*ik~M%$BOG20Y1M&lkw?*XatllCOCLiOSSjU-MTD(7e5cZosa z?$(Y*{DR{CD+>3&F$v=rMsO}rqR%lXTtq-)KdwZ!5Cq@)QKnSi&P24svD%}#m08N-P9w=SVw`S-F(5BkDM`4LuR$UR z4Of6iwuGx;a7sSi!gN*A&Fq>wnh~x%)jSvYt|0;ljZ62NFy8~CR4VmMc?9qBF0ihid6a%w znb*Ns=c|MEOq(8tJ-^%)+^_5IJ3wC$;kkW3eiD8}5+RmxEWrPa{|ec4q^ zFL=Xe{|b;19}iX8<-x5=X3cXz`2&`2CE}@~Y+5I$X2gPf!yS20o?PNp7o_<1tH?tS zRH5LNq8*-S000!QD0SjY{Q)DcCeYe9C^A|gA5q>MiLmF`(FhGCM;uhJv%f$XC9ImT zu3O7FBT^5KH44#IUy_G+)HjU4*l^V;M^%t5<|Z^F#~x=DJVzihuYs~=lzVN@Gtwj&P8#v^z-%9wVIY-+^u58ssuaOD~oD0$K0Zd-~An~X-=zsJC_-Dyy` zL%HsD6wjyu9SO>uya$jjkhXYb%=W7xLS{k4SojUY?{^GhH!XCBYu(d=19&>Jr!jG> zVL|qsP#or+FV4-%?elwoY(M44x^GnUF==6z*}wl-I2?d`0EJ-QM}GjWB6dc9 z6bdcv0MY{-Ki`9jvEQ%t7mm-qT#9d{0DL|ypIh><*0;Uvl48pX_)v-A*`6wHd|kn* z#QvIBjwZyi`A8e+$2smUDk8*cROsHMa$~Z5zzH+l0F@V&mTQ(9bz?P`piz-kDIo!W zlz=kQ6m?yxEYr2^qfD#(kQTi%upJRGUd7X^N92NZ`cbQNJ~Gj>lwEpsfukXl5e4!# z1t}vCK(IGIa)g2tr3tiB9`MCGG!v#0t(=87?_19++R+LVR21X-p(6rAme9kdI zT^;C#!f$bTVmFM@O`bdDl=7pP$_((bC%@Vg_x#CAej_W&$Q0SSBH>$b|10oyary^y z3w~iCgg?PQ=Sxg*Ys${^8Y|?t^GW_eNa%1gIzW}oN-KPd9Hczk4zv+wxUACsOF7F( z70)Hxw#JenU4p_m(}1k}iyM{3GC1k_b;>Y|b=sCkZgSc|0iQBBH891^I*Bm>EamQj zIX5*4p3MY-drK9#KZvW#W$zC1XfA31+<`YaGVej7Kto+OMmNrMsbk+CarYvf?<#SY zblvPUaKbb4Az);8Vn21u)iX=PLPy>$=JVhx&UtKM74!Y~7!D|8PvD!f(>D}$79rec z9fgc_`gI@D@dUh|>*Qt}}l0 zEdyn%CR)?mNgf`f7zndgg@FeUA-uRLs1TG2n)VQ75&Y6Kivp^P)f``nTNK8uT14s# zl!e#0TDcB=++BdR$g;JPg#yWG&wP~PC?jP6*b^GX4d!{@o=F+w#jA(Px{8^wokL)c zuskw8b?5|LaU)DEMdd8Y6^f$0@UlO~1d5ty#3%rNdyeIj@xoG3*Tcq99qG;TnpB`* zJ<4?jrIETaCzjvx-7g#`sv90=D0wX)m`G>IlVEBgGMp^xUIdJGx`9eB7!u z5bRmjxPq3*7FX+C8l}yV2@MgIIrln0Itnne3~1*! zbuV{SyroT9)Zh_6WmUg=#wLJa54pYL?xEpm7ZOOi1?g^3NNv-M+w_Ok>t@ustf?@M1xKoBl}!6m>b-z3WX7wxlV*f9&8t;0bfU8 z9F5eNQ1*qJc4Z9^-(~8d=5=T(HdZJ(IB? zx;YdY6xNS?X@~dL;rHVi95}!{zt#P3oA<|jzgwDq-rd*$hR3kTbx2L9`{Dh2;0zxFv;T7-x}Wr@`(gceSq>F4Byv#BGq^X%zw=>B znM2$~n$vXMWxX~Mv9*9!dljh+q&m556uS{n<+UtZas;T@1#T5_#4oA)WpS_auoe_F zcL6i4<$6TntJ|HwOJ%1MLi5TQ-(4z|H7ZcOwm2`-XNclRCU@bD4>})W6$^Vot()XG zFA9N5Wzs-_3ZBYEmiRK(XmE6=VL5rG9DA#!TZF~i zd`^@#l@nw2g?EJ@l^+k?W*j9TGYU9LHcE<0s3RE!f`TIwDvv5`8XUwYPKYJ#xe}(r zY)Qsz4CrqU!hx;wnA1n&Nmqu6DsdQMjG`?q~W(?uuGhEtW6?$q8@wvsN#Fctd4$qnN z&SZO6*m9DrNNL1@eGDZhK6|nDEmloKUX z#gY5e0oURT_>;EPO9I6fa>A3)MNy>pPiE;a@0^CnJc(3bk!0#kV!;o*ZjhVP6Wqp7 zI`2`|Rdna@;TDVJ79-;nBf{`SJBhE!zC~jvb}7AKYR#w4WVQG}fRnsm5w0QeSK$B3 z^;cJNg4PQZb~b}R1{ohAo!K%cM%v*`WR38+v(eM9;hQwbYYa^)uG$|`1C7>Ilzs}1 zfgsJm^wikT1a|E#Ehd$E;HAw`mc9B>Euth zCYKo2IZngy-Vq5mu*;qkuIyBGX&uMlNG{81ha4*2wvhGf@O!i#+j|z&zN264zH~d{ z4uP+1dkO(SQQHbAx?wXM@Zfh@h#~EvG4TI!>&f~dl( zO|50}{UpxqXkyf!Klm!*y+ino6}x4jhfwma0qMcpdAkJh^t?-hLIk5&?<{3U1o_s9 zTYs*c!UxkOvfQRNsIrE)uyz!as)kDtpxFKO!~>TXFRKCALqcP(-F zGYIbC-V*J(cFkcaq%vawj=YT*VU4i51U?rn4NAYD#3Vq7zMJ!l7;Z?C^fbBv7a z%irj+4tE``5$}#CMp=5H!;eVE-QqD%LmK2coQ;fB(rn1HOf4ef)9Qiyb^O-ot&~#A zUCSmI;q>!bXeak28z$!5AirxHfwAr9I9VNlrN9Ad0Sg~YlyjRbuF7t*(&uIPXcB;g zpA=BW1RrJEs78Q0%4$g1fry?E1^t8`?ex%tQP^Yo@&zC&sO~Uq54TFT3Uww{q6Mgc zMbRUzN&y-Hr!=^HsLCxgpeW`204#B}`4rB^ac}x$R;et-QJAOnR-%1$c%ZnGPlH1K zOz>-$eihjCoYV7b&vkH>c1jVJijGToI;!D(hvF-R);|FTm4a(t@giG#NnH);L@kTS zwU%WMxQF!X@(~4`XZhyHKnx;aIjQy><~l(+$`f%Emvo^$%d!>^G@xXNd}xMBNd^4J zz8C+T@Wq~ z5_e1dZ@8J9GoRq{oK<=-CNAg=|Bc;?uV>dJWKM)58C;_fDmN&fE;p=umc7z5U}TO8 zAXV;+Te^I!4NK}~NO z@RET2^s;LJnQ_c!4ZC@=;1C4T1Vn87<5# z2jDqcjnq>N?k-%J8&glOsndU;#Q$&3zY+LnsJX&8JJpz2%&0zAbkeBBAaIv(M-(36 zq3y~e?ZW!>FZHQGp(~uUX|!S(g5Q*$cnuNL`|R8y+nBQR!2E+b%d$F=TyyY|5ts++ z!TNGy^$A8!3r+ybM7Yk0QKbh7lkGyretjrP`N^D2Hi>eL`3r;O^+f_n($M8u?D63bT zN&9Kmq5`QO-vhn6ZJCnLhYG0nvP!nRBi#^Yuv+F@rt=0+#RGD5<#d;2vVyfLGtV85 zy%&#qb1t)N+%yb~@SR`Z_*Jsu2tP1^uMDi%z5cw)yX|hH-nS(pEL8cEf}{f6_-k^p z$_9~rhPMywD#4TQ)@eQjU};bsO1LXN6-Q(vu3dMf-waQ6Zw7A(i9kd!wnXj;ilC%I zO5nC7ZFDGhI}a+fl+Q|0y^KAWz1wXtN~rsZykC_!d{GPuZMoWY8~lW=!0k-3FXC|h zS%Bw3Otuu$A-8IQThe^`psIykG}(B!9WAtSZ%eTmwpIp@%NJJzmrVVK?!F(i3HXzR zyj0cYU56Y+`QgoK53Vi>clHXx@dfv`7hmeOGu;sAJBDGjK^2xxY0((Si&hw#c|B}8Si z+$NZETP`pf04PK%7AcGPjI5AP4>9@tamwI424isk_h}6RlI9^j=%GxSycB&*{Z(BTUpPcrcO$ z?Q?h&S1RDBxyN8kAr{#%s&e}wCW&5w0zO4vUNa*16P5U{h{azqbbrFd={4sBKAmvJ z|6iQN7b-FmBW{$bdr!E*voeuI4B(k^7Q?ZGvSdS);B#b@tC-nIKsJJrZ=TPfT_)W* zmq_LykjkcRdSfh&8dW14Ty$sC_>C(f@G{{$u;8sOZeZqyl75r3het+7AQHM=u)tla zt?z3_!kqN(XvV3=FUFllh7+=#KjSEdttxdV^SD=r(-A;iMrA0Yt>%^$+e}3U=g5d_ zDPCrVKDR2IuxALT`%c_DI?)-283Bo;kc=b6)$M2dg{2?m=P6ZE*3gGTYdZ?6-9e>!^d>RIgD~?cD&Za(DbO!nIw(@5%Byu=t`-%h zfBpmo1-)7oEOe-_Pgy<5vZbYs5GWujU>a2_+3BrKX_l?>4K)~My1KZwzV0kh63M3_ zQ;MlDi$01h*uo@F6!E|lP7_BJDtfRv9Xas0rcRub;NA~$pGr?I5rnH`>B5z=Qk5w6 zD6bj0ppND$cH)Xc?XslqK(3qG0(|B36>}hrZ#9A8X1c&phnKHj*9euej~vafZ*Z%dkAA;h z#Hc7^vEv^U$Iw?6kfFFufkm+sY{09GQSc(I+}7aJxY0m%6x4WKlc5$@=cOnZOSyw9p5&VrE%HIbaEx*DUU<4QzVeRho&;q@-BZ=C> zH*r-qzXqz721Q!&Q&}&S)e4`QbD2IL^ySmXz1c*yFNE95-WK1hRsco`X<2#Z)zh9f zu6}BE9!8PX{82D@32&y~lYb}RmyakchPbSFI}9I|zAtW=@^d^{bA6s~ugUG9$Kkt; ze&7*oomcG(sb9vnJcRkx-4=BmB2P~Ba>j(T72^IzQHB;j$bP<~d~vTrtU_YXpKIK! zh<9pKa90_!t@vvXIhP7gXen_~z-^OVyF@>Ul5KCVz2AvPq40<+gFH=siYD0dRCd}s z%4_CE=n_Pk8VxE}=rA2cUQvF`jKU$fxCNyM6&1@#X;HA`sgJ%x%%eZQuo7mTgmWch za3zlaqL4W6O{TI|2!Jt4k0S{&ib8}h5{)eQWG}zUpY#U`u*9i@RWK;OJp)!oM4=NF z2~>Cuvxhng7Vu0jGHE;JB~C@!=Q7TSBYuK0aES}dB?itF%Hs+2-m){c;g}UnG)KWh z8Fb=(+_{9s>861ho!~mfn1~So4fnXMX-K?h1)kqgMBSIb0V_8myTOQyYYh1{q8u&A z4#wc&f~fMESsEyl@Q}>*Q+ZanuNe zMjrJRTniT!Q01cGR5$e$PIKFfB^vBV9~`0WjPnX(;ZIPOITIKYZ{gPkyq|J)=WFXk z-ZaW$1ObWaTgrsSb0$Y?OjwF#s9aNz57d{2zhy>dxh^qmH^dugy(oiORgHAHCzCWg zx|eoO8P{wcr~GE5jW}^B0Q}P6G7^{qF$9@Vu6vOi3OX`aO1`5H7>|^hiS_`H$Jys2 z26Ok$0c(;`Zk?iOIUNUyvmFyeS>mEG?PUKDYaU=~q}(;vCJZCzPB?etf%`?=ofwt! zJp&!l6QrNBfTTd~zr3R(dx_Z5m>!*Q33|^>1ID%8Mi%nZ%eVe)lo_^#_p%+heYx-5 zfr7rV=#@e7RKk2=<|9M(b=RkYsK)iwT+d72P#of_;5BJ2xVz)q%V1T0ayGyQ`?Bai zuafrey7Gp_CO$7SUphQhuXQC_CH3yZ8cGk5XWy=Pw8BhalAibFvmt-(jP-HckHv@b zzvEfJ@Y7>qL}&TI5sUVL>m}-5mX&=sE~`4)Pt7s0FA1y4>r|l*eLv>;u=A0&_feM* zKH-qh$C#@IgUf89H$=hEzgk5{WkW?qg*k2sBv28vjWideC<-uEqv8xB#UdTSu=f*9 z2_@4WQ4rwK_mP{`MG8o(*^mvz2#IWS%_d(e3EaD?4vXagk9d%Y3kUF3Y*0tI;}A4( z<)KwuihMnbo5~qKF(|SEPDfJ=0DCt9VQ;D&6F*@|VU#ZJrBnBrs-yDd9up?L@(Hbv zljT6^sdt`6+@pwNKp={<%D-Vgh`;=?oL1)=GNA|UOP45*>BL1&T^);jDwf8<3+a$i zDyqK4bhR>XashM7e27;ajjt|o61hz8w4)T~^x#k7u_H6~2w&pf z#^~Du%)|CWLCK!b<&u z^OSl$vtDr(a%5n^XomZ|xH6WmX4&YCd- z7%z}T%e!}Eg1is7@3};4mWieAV>ohk6GPiM?4k^e1L|4#$QYftNV!6mE=$(o9dk6? z??LxAjS6?7b{`R9vMQQ;Pt<%4XhyC)V?=>dqg`%T4~`yY-wWGE_`#?cqiIg|&;BTK z68_yV@p^W8f#Kks2}g6RF{&Yk1uJ3&PR9rCJ?b~NU+j-GJn49HhJDbLMgekqvHt64 zm}yIy)iKwSeHf?PJFr3PUzcsQANbARZ(;Zv&CfO{8t8pYUn}d2f80+CA`a1e1t}lX zi2hDm8{bT@UEC{$as9N_zzXd4d=>ZcfBRUiN|QIs*1rngyjv%1GsPzg>2tA9Q~$o7 zrhorZD7LcdBP7(4u?FAp)hEA&uK2tgC%;|$<#`2d-`z{V*ag2)?^VSrlVPJQsH{sj zF=`_m`HiB?y-E`VR*!1&Ks=L&gr-#q5hf{%55iOFv8z;NRb?1uCB5k~OE8@FsA~>n zjz*Q5(u0PTBOKD(J6}q*3b{%MQNYwKWH~aDaMMv%2VXTc?x~0~k1I`@phJYBISa2TCWrBrQ=rbVzTVw0y*HYt>;i!1utGN5~9D zfFn?GbuZbAFN=^&rzua)fpwP{U zc;6wuV;o6qBTaIuN-C-7icQ(ye-3a!fosf5QXdTbetc;hc(y_Dr4jO}@X1TIE6f*C z|A>h5Lh-FRjHy&DzTXu3FnATM@&Q07{qp){ea`#7@2BK?_8a&bTZX9GgY((n2lWAO zh*e!l1ZStfCN6Xt+tMeXWqaXkl_OB=d?go_ZMo}A^P^apZ$soIJpWDA#bWp7X|o+Qi0Y(Tqy_TCP5k$-qfP; zC<~@YJGG}$@chVUl~3m<#6)WNwZ8I3j@zK=1qphor~L zJi{h%&=@=!U0z&{?kWF<{Ua=Vf^nitoW0_%9OW*^Dub>9rLm}N)CAk=32zEv6jS(< zrG>*S2!@s-n(Gq}Y0i9+sJdZmcoQB1^bQ^@=te)mAUa(*Ih(qgB6GeB^Fs6@0=F6%8J7EcD;TdK0i`jRrx5%Kp8gE&|6tj$ztd>`^e`L!fT4BC2#!nmYGle!+k{Yb z!%`kPu#p30I7TDzotUkQ6F2abb_INm%4XQhGi6#M!(G~ONYOY6!f+rQynvm-cgG67%g#hda^HKLKR1$4Rzotr1l zG~CE<%eOLg`6Fx2TB6!;$^$k4EIA{MF{|K_a1+MWxg8m?p}dFAn0T06#-MQ1!MjYp zX6^(u$)6Z3@HMam6CAt-X!q-LV(RAmZ;u1ig>p^3{ZWth{r#GF@HB(Mm)Y7Ov5jz} z)}IG0XD#nj9)0m0YI-Gm3Lt6uZ=zUv3EDt^7;s2-H}mhHz=R#JVF{JK;nmVCp{ylt zcrVkFuz$bI*T13MxI6U2*6xL|R@7RGLyvtd8l+X&K|ZxChl<$|e@GTqm~02IUcAp+ z^B72EOFyKmg>Ek+nL41Wd|OM|3Sj@swBYpH-Buu9NZ`gh0rZEQP#vPjxWl(bDo{LO z+ymP21hLZU9zUAb2_(sSKiOMxhf(L_*5P+>>QC>=sY0uZPH z$)}QIers0+)@E!;&8Sd`Pq!=O>%!5Lz^FU`SMfJYT+Ez5fh0`j7G($}O0N(n2HRHS zA%X(u)&5@%2iJ;`4=O&VD0D*1A*}95ncOP}F$hTFN?F1Yk0>?Z+4!OYmURL9QX}UO_QC3DUpwIFbD0&x! zYs@?>m=D36h$)8089nwVCoG|g57~R%nC46zc86{GJ;f(oWl%-4>Xs|v(s$0vNn;GE zjO2h*3_oA@7y z`56KF6@LB-FMpxZuHgAO?oJa&u#7;v=SEg)kNcb(M%LQNG-HzS>`$y{E@~y`SLlutFS!ega(*U_+ zgi0CK*o>jv;g>ltq)l~^Up|Ys?blJNJA_{uG2C`5E?ym-%Ulc6XcU{q(TZh<0r*O@ zbs)XgXGw>33xKpEVc^-!4V5Z=GS9|_3pjx z$E`&Pb10K*3BHj>s(_>8d)@lD_b}RQve>r1akK;*5naF@zVFOZi0+DhvGCUJa~0|{ zaD6^9Pb=(rg97I566SiD7RuYw6eDc-PeX3V1SFz0$YDgDZ1hV!lqdzLJFNGH*GdL9 zaVZ$<;XObB+J9~(Y`+GQeCwi<(-+P5FHn(aaxvK&`rCiF8i>DIX}+R3Ku{2Qo|LJ8i(x3)1c7hN8fgP*)PHW zLce6rDIf6(3MLQvP^%DHDdrC+yLM%W%0&zV6->_XiA3%!EFRLnp!d?P^QJ5>WRIc> zY0D!#6tU+ZAshHX(>5&B)m7@g;noN-E zW85>Q^y;ffW~D0V5j&Mz6}Nz<9E~1bk204FSn|8xD@9}YsJ28U#&t@U74jS8h=qK= ze04Rtykun~6*K_5YSrEC48L|-7?#A5g~MKU(-SWoLi|-+CR${7 z7!>cBk3gJ}YdAyC4Zg6fZRAa9#KZlJA(rLx=Zzc-rkP>WA@wV&oblk6-E^Y=~2bu4Rr`i=a#(3 z`1vQRbXf=IoqJSUZR(aXtT#tZY+L?;evqb}=DU3jz@D93X1kRP5<~+|ZCT=ly%b2kKAR3sq(ZWf*x~i0E z;wk?`Y};YnfkV0a7LG&TpCYrPbqmRjRsAUM!`{Z@KCcKHJSq%p$2v~W<#o%q4sWfv zCq0U8=Ile1QnEeLgDXnSanXkbnbzk46ZRhX6Nh&+!>tgc;X5*Lh#>sukBvA zQN{{>sdQagWYDOvTo2zArPyhBpbT`FsF0{&#gG8k+@o9w_YuX)bn+*?oG2oe(bl6^ z0U>GNnX=lTX;kJ^v`SgeC;(y7kRRfNsXw@JaU;5;=N5P>HfT9fdfOa}ltUc4BOAv7 zyTeH%LVdJwtTF){CCgC>&lca@z}(DBnpeHlU@JeuRQM3(4EiMkSXm{?IPNJnN|!Lp zkhiS57w=kbxAIkb^9UdHnfxlm)`Lckb1Tj<9Nd)d9jpDEV_@jwbVj(iINET7QtAju z`QY1QT=gU@%T>{gVoH(sSX)laHR6%*M@Kn$R)*xc?l{7V@uVWz{SldC)y@FS(MXnP z?<7DXX> z7X%%CNP~o7Jkkz1m3!wxXe>*Hj8V>YNy_L1c-7LZwr|t2sUHpfcZ@*ia%9wz^b_-e zpRP{Vw6Whb62Zj{BG1kkrGh^`yD=WgV@$Tu1!Xt%2p?W(*p4aZF`Ee*V*7x0aFLd{ zG!htBDv_sNT$N0kr7ki83;R=nEQe;&h8zf8B(h;F>_@y(qu$6Wy=8T8bIyn zZo5}f$_N21{`+-12duQlM(@{;F07wyJ;}HBtlZ0zw8!q+6#oyQRd_D}M;wkeC_V(? zPm*^jVBHOc%Ba=TC&40xq)co7GaeB zlc8S0VAoz6^=&e4g>mARU#M+#d{|g3dl!@zzrtvH%9d_xEF>-Sb06vbSyKnCz*J=z>~amX|A8VM>u_TJ|XWu+Mo zs1Z@@Z99Unx6)-xgB!oq3rYm>-U}znG|EMkf1aKE>k2seGab*K=^Z6c85AhNDre#g zTsP^n3>BWahKr*il$)h$2~!DI!Evd~Z0?3aH^riG?}Zwj5S|LY^iwkBNUu2A!+XvO zJsJa#D4D^VG(Nj&oN3G(8VOhV(vXk=8J!@)(GHKe!jLZ`7|^C-C(lbK119yRKBkf< zL`NoEDM&>$u2#Ugr`P*|x{M-w4^Et}Ec6DUMukpEO zl_2-207vVO+)+rKhoO(Xa#3|vz1SKQu1uuMlS*zTMRUyrb8rivWLcL>8gpMje0;`H zwEHVqSz$d}!}9U&_C51Na6@wL2{eqa-i#(!)FZfOghUMBZHV_LGNMW0eZg!uE;cYh zHqL>2$t3Ix>y$K(rOkk&q3GNeWq6`{8CUB%JDe-ODF5=n;v~71k@+&paN>wb^;6#f zw@rFzjJfKOlg>3H+_-OaQc8at`AaK;0T--r^`jjE$nCos1_i@p3{D{}v~Oh}af6iF z)tqv5eLBJD%E%p7m;A_R2xXd3Hptf+sdAz>qj`*)D6gRqUO4g)Ltf(Gkuc;hU}o9dHM4{jP}GrsWmwA{BK#H6F#KcsE3gPeIdRNgiy9SXxY(~g9zV2jJk?Z}3?%6aJS7#en^8F1uKK_48S z+LQi#ke>(+es8|g>O;02QlI7nbS7z~$!#GD*wk7FzFvx=E*|;NC*}a`?Z|zhp?zA4 ze_8sE+gd^vWfBII>w*5%DlGOetHj#tTO6|&wjgy}B9G6fF8}IF*M9;W+wd?>`@(#_ z1ch&psrxjjZ1oNCf}0X4A6!Ub8kIH`nyMdloO;OzuC+ykN|j2a@)tDtQK2!eRA2Fw zK6`hV=nTLq=L8@XR^t4k+(K@n_Jy}}dSmZGTg zjH36TQK6y;UMjp-&c8rGls7ZnpRSo#al@V!8W0z_HR%dtPyd;UH2A%8qdSZacjJ~a zmBEY}!PC?`MeDW`WgQx#Xi}cN-b*f-M;z-PT*bE?V#4817cb2|n=1LZ<|%0m^`;Kf z<|L(~Zl~bw2*Kn0eT>g6-;2>RhBi086X$|!e(|b0Ff0+mMrI>x&}@siAjz4EIc`q> z#5L%5V4pE(;o@;I`T^KKW30VZX(p>Gvq$OF-1lTf*(6ETlM1 zI`TlN%#(1Z>pQO)WjO4yRIKl$S~fQGoMeg&d&Xh?eVd1bJ(DR18PeeHX5L23M!>;B zzSsm`ni0`w)XJc+aoRAxfkTG(f^RfLr1%?)|2JArRO2H{Y1lJTgnP8c$+9zsw&QpGsTAayWtK?`BI<2UlKxI(HM%t z0G?5hjI&TPjjoBD)%U+zKnrs`gy0peLMN$C+cy-G4y4TWHxx-u3R-b)0B7u{j1 z=U;kJqQwEgujpaDLK)K)B<>*gxTEAO$W**gr!U1g3N^S);YC(r0&e0cp~2Ts$Wpet zpfIwNIUg!^l%;YfCu$Qo-kH!UkFyVfiXP?0MT&VQruQ(-J#HuW>`@Ss_|dJ&hg)2g z7VKPXZ?F0AR^dd^Bi_*wcSp|r3QaiZv8IZ*h2xxEjc4y~(EM?KLg^FloA>WW|NZ;# zqyPHnKZB2}H#uTs@3v!0u3B_8os53Gx*FYLbo_q9WNyOUky;lT=>ugHON|zAw_6&1 z*SlGY5cGW1hM9(Ie4$NUjPYFzJ`?>XORJ70G}<@(mhL_U~?f zi|bY<;A=>6wh82>R=JgqRzmhVumEJH5TRW_D~mdDWh4jJ!2h}aee{3-^Z#Q-uIteo zEZ@Jqz8d{M%y-bO%%x=;#Na6*-61K;fNdiNSSSBR%cpX6>i9*Oaj^s50|rdy^MI)G zctM>^$vdSEbvHvOMrWpB^ul_*W<&$4kE&)wL4L_t;7Rw4Q5z>$w|NeJ^E3>?W^gc# zM>DXk6n9>CPZ&EN&S)R9UfHU7OByG%WjJ^S4_;%8p4{GyPUcO9Wn*fR8(M#7Jj^j5 zZk;E=GqX@w_LsR$z`uhz8WJ&Dxt1(ZVEq>@!H^%rI?yd>bzO@fZH}eftWtjRyM~Je zuc2vBKicQP0pEx7jRvttJ!~nm%V)`)EdjUIU3)wV`1eH5MNvh&J|U=%_A=(^V6>0183M|*_0ezgA0^f@Q0Sse!ccDM=^l?> zp~z}bh=ZG~*&AvJf>Wu^sD$_38D)Yp#YfkNz*hYOrWob)-bw>zdZHOMsd)+XfMxCji&rl(=9DDjv?Ya>ba7vlZ5x|Hct)n@aBS2n9HJpQB zudKMJpi0Gpo^pGPv(zmx?OoQ*>Jhi9bF_8YDGhSbyE0g$mS=G=)cWA&L8TpjiHBPJ zBXC{T(@Eu5OwN{xkMn{Q1>fA#1PndA^pC&3p2d*VKw6OBf{vHw#WJP=>EoD{c;7v+AGCbWgMA2!No>r zvKSH6Tj4|PgSYZ(JJ5yc2G_Ei`OWC}>vyC7bA1i}Zbz>bZj97_gO~q8c^AzPhi-8x zS+dHkn}Y0WSjCc}N94V;{*@#A*a)F6lzpG!vE-Xu*E0>u6Gj|#kJGSoUP8G?)kvUo zCNvmgu(L6UavgUg@QfirdO$AQl+8RCDD##hevlQ1HxQMz8qd1W%}HY|N{y&xPLj`* zsS#~QgKbINLYR#RDadz{1*TN4Ri6ps2jqec z7mu~a3jF@Np93<@^U$HR?MSy4?4#B8)gImZ=}X6dX;6F$hCi>2v|Oa&usHZ)>>umT z{kZ4d^9t!+z&piL9D2A02cCod5WVN2@XTB(zlYZ|!H|t6yd?2667+lm$Z0+D8+kb_ zS07Z=&djac;$gl+VwM}i8f#lJCCD)1!~c))dOXx#4#off?7iof9XXP289Jykv#M_Q z^twHB*UZmZ^Zw6td$p>{BpF)G-k$-kjtmCLBs1v|?hXeGrU3V22Dub<8@ys^gbm^) zvjTR(3G&0AAvw;Z=5RBqdzvA&1L6VD5__1F_bX-DR1|29M2u+1VPiaKlw0T;V0B<= zV03DlVVWdfL+A}HxDI>D@EZWHXmyvmt@V!a*ANn3dde3g1_LH09%(uiDWFEDw_Cuh6Fa(wL5Pmdz@8H{(U|atEa`?@$W!@f?8|D$*JTdShDuGz&NFM`< z$h07v4+BUbdsK1~R&5&2IsiHv_!4m@E-*SZ62(~#1w%rVNkxkbp&qgFoC~2|9Ecwr$+YgRORgLV1llzA6CU!cD@ou~&*maNi?Ghz06|24v&bSkkB z<;$bjj(U38H9iFh!5&1AO(?W@P+z9NGGTgmu0G&ZT~q1UMcO*Zd4dyl!o+lk;b`nK zfgyF#9o*&BdU%Y3;Cz$|=4D*d+i~^r*Yp5f(h~o4{OaJ6w2zeGrOp|>MDNODt@4Ef zd*U9^kNQr%SO4hQVPRVB;U7lRBS2lv%3Qu)3;TF4+eWWyo2B4lPzfwc&+CT?go46s; z7cAvR`cy}=D&a#*tl%0x*OqYofQR&6%xwdzPsuij4I&QF>$n~g*YZC}RR#UAG4ZLq z6dvD+5krr|Qs`9XccTHSpR9qCIm}mm+Q8?)!}|0lMuSq0NequAS$!`w%K7!rcx#6p zU>9&|9AIZ*NH}Kv34=)^SG9HHM&!xrozwKRE>d{|$Fm=3;l=6vg;yHC8V?vAcNjid z!WEpE(2C(9jJRTyYqVepX?JO~gj?y0w_SZ*i6XszBs0{Av|u4Yvrs3;)BGAxSIF|@ z#sUnvaAhFR6X#0+kzNvvpuQ2D@+pIdt@>r;VWDyuE4+?|@(F4yv8TpjttN#7gE47K zvA9I#cy;ld5clBl6M7Z0B&SXXI9_ASInN`sL#OE5;;RD@gPr(N46*^3B}l>PWM20R zuxCU=*0T(HhNFPy1ck9xUCO|T*!EIbJ`UA6!{AKIx2Vxmc1Z>&tFAKKhgFU!yLa?f zTp+{+GG)IJa9P&!mKNzq(B3$O@raO4$_4B|r(AmP1gY%@e~rsa3BC&W^$% zo^}j@BAZeI=f7Uhd;GxW7d0EpbPh&crP` zc3If|4U)4s>!7MbAtz-!#>zcdD~KoD=;7~groXbVe(-WZVl}+R(qcHMHeA966gv2E-u4!V)8IQrqA^uny33z zI0wwrEE_)vekz6>BT8#AN54)XM%IX(CX5-9ZzzHpA3@7ynX$)@_f;K?X+1PYJ>r!1 zXpB)#jp>nh(tQY%e2{}^j!hm189KqqeM}qaPLc^We4CO@=NE2c@*LUPCx2i%nK?kw z4sI`!ngj6E<(?+2LXD}N(>ctjhiGgBCp19ztjp8@)Q_a)wLI#58?Y>shv#Wt%X<1e z0JXqMdJ2CVjV)=Dr2Ob2LXRqGxF(J|r~!fLU@M~gR1C&~>5M@uBCtIO z>5&Ku3{wmnf@GvO0N4;RjbQ3B2Aqbty#cic1g)Qd-(l3-Q}O2PRmNd!fW?U+4sIap zRl`pc4>JZl9`X>lq8f63@k~}_w%(d9BRVCv;vQ=3YJG9sYJB0$+*8M0bKtKADGWbPX`XE-`?PajFUc*Rz0Por7p!jas5^Kx8 zdk0)GC*p!h(K-O97+B{RsBVyEPex5pCp&rM-u(=$CuvcJe&$icsw7UD&{GdC*Qx_^ zLzy|;$`Y3DYg*%9qYG@sz^V&Z50dYq3YE={ z1UO<+@2mq=Pr?VZjn4{PX3E5Bb-aYv8D6%GYjBd*>7-)hUKFp?h;EcPl$ZVB_ea#-TZ`-~&Vie7S=UHm(amTeBT z;45{tL9F}Euj6zhX%Z~+;g|#~PRT7to@QypwP)))+AHwkIs+~p4{1%;JVzF?7LE~M ziY=HH=tjs2)o6egy90Kacc163=c(?e`8LIOn8?!=HbgF@93IyR(7ro8@5-G#Lw*zc z1Mv-AkEyKdXv~q04u$bc=I5|mpOSS8J(XJuoU=F}UDl2vp$E)2&AWwI&yxETj*31- zF@xh_3c5^NdEN}XN}|L1nr)_2`BrnUklqo|sqFyUnB2=sUCpWl5B~7aIh;SOBBfGK zLGqQEMl5rXmM`QkDYoHQ;(YFN`yrCVjE!E0WwFx-U?$+6v?keRB+zchJQ8p9Wc+z zVpi+r2Ru8;*&6S^#yb~eVmOq&6Bu%r zPQum-!ysh_3q}?75gIWr!Qn6$|I|R&frfg9q!43kvSmqB@N2tTF7|%hkR~n1%|FuO zow*K#Ri`}}%4hG8GRtrDs!loWr4UYoSLf)I#8<#Nq1#RK&Uw}_Mah|rd&J#(p`0=s z92l6{mjGNEoB54uX@+w)$&_w+6wH7!kX;u=rb=J9dN+*?`S4QsE591F$4Wz31Kz)5 ztntG;4Rt2B^J{Gnj&(sXPH8>2C+&ub*N>csI1s5PwEnyEv>PtIp)7wnKRx)%EB5p- zo|nSBa%Jz34GI9$3$ycc_;v9fyTGw_5*Td|Y9>CTGT zjtceXmfjOT<=#N}5;K{v%oO`8MQZTpx5{Qj z9Wo!`LF3cWqjeWtHkuNT1P^h6SM*96URL+4z$u zTk2`$_s0tZp(Z#pF;^pn4C=5Pziy~$qi6tQC}?pXKhdI1cg>IW-Uo zV?3g$;8t!oq&uW=H1lqVKctsJJvt1_3D{5Wm`s^GVf>pf6aQ7f4@Oki=cxii@W_eZ~;ZuVs6YGZc1=+1T_C8!P?1|ohQ#|DpmX$rh zF;E^#38(M+;D!~Q9@#-$mpc2BU=*_zV0zkq!3(j6;wSWXZXM9T2Cs8ybfi!b&rpOH z9fz(P-#CqbE}1*ykT-es&_Q*Fa%IS$y5i5eV{e;z#!nYA`_8F<-#g%{C$M@14b%68 zGl^qOCOR|HYjwl2vNcgV?o-M#&LA{&p4E}u=zLg4%28!jX1{gj1U*0;D4;E0fU*Y& zF**|&-gKff!7l7=&cq$~AAH}eADq4u)}c5Rpz(VmZPm8^Fx8{q>uIlRl(rf3UO1LO z9i8`2U}?LoOJbk#xxGUjqmRBTKaOu(17Fpl*rp0A?zZ~A@4Lpg%x`0`RZGt{s^3;x ze_gieVH?Li|2CNQX_K5$o=Tj5H1i`!n);oW)FkhEBjWvh+G~+7(Ag(T!vCuKLXGoB&+VBsXo)99zg_ZdXN$SS(&Ui;k(7DQtOYB`)56_e7Qvj)}u4zILDEV0S}x#SJJaQ<)a)0 zDR4*{{JE3n-Lk|_pk5RYz5{t5fHUkNeV3Vj%sZxE;ZoE(6wH;tDZ166VADERbh@+0 zg1nh8p#!8m;%vxdVZUR4$W?siZOpGGep<{6(R~4qo+U@hz{`*0o7ccM<50X*Q~B0- z;iwnD3Ruti5lPCoe|ZV7pW~Ga4qo1MxcnjMI{jTW2^;J9`?@^+{v3Q=dA|fTbXc!w zA)l(W{eW2KQt#TkEr=_wJYapeX3VX1ftGFTm+Yu}Oe?j^V!px%c#ToukPp|Vj}b(z ziGhL9W^aaug@%hQ%2j#HumhhyVvTd!~m&M?|yumh{H?=YNGwo7Jk*1$%9VfIhro%*Z~(3cdUuFZf3(W$VA$3ypY~$d(BuFz zt5jCIvTRhCIN?jaW6T-`XTHfK3nP91`_aFYVK1P)#|dr7 zM#Z~??Tm0R?{Tq5Mwd2r6iIY?aj%G0{) zW_rRZLgs9M&HAX^aUx*CH2Kv@iQZ+UB8e?n>!k02aQ)8+T^1nXjKV7UsI%5pWYUSr z2|mk2J)E;yNvEOX0mV4DuNk71y(2y!)iI@5Aq==;siY|KIcYz3K0g{rBfj4qo;#Tahs+zX0A9Li32<^&=M* zt|`qP#mk$w+B;|Qs;N~!>b5$%HjKO0I*HkZkvuglU3&Ei16Bh!<`cho4vo?{C4v@9 zjR)Z#8DgQ4$vgq#96ICpbI0V{4(xDn$Eu&uf{7)8;niBg3k?p5#&_YRu{Co7G>{;b zR&di{14ByVv2^dZNSN#k0S``q_5)?BwBx@u^ul;B11nMa=G1_4=}(QRv;hMP3Fu*3 zbC$6UPZ*RAWzvy|GZE4lT|7I?N#pAQd2}vxD6&x(d}(y6XZhCPa|lbwlOe;%AAUqGf6euM4DCJ0s$3(FcyJ+c|E(XKwzs}TWJkVdZt zE+=>O&`(o6^7KgnW2$4uxly&;{;+9vI)3zI1YiKLIL5kJMQ%U1nv~q0HO}IR|gK zI_2P)i{cQTubu@UEj!MxS3FCU002M$Nkl3Gqr6zYpv~F$NeOx`{hjD}`m^=tCC9G(rgvH| zq4Q_U`_&wZ6#uSDz=vT|J>?U$vut`L$xtVuHzC`J>CXgE#!tSX-4(Feua0mi!&^6r@$S*rnf9v;ChZm-xYCgFI&oUV&a!d8341TZ z`@{xw_wH|j^P_X7Y-kG{AVMtpQI9$VF=u%uQgP8)8Hpc}Q~2}fAAZz1C(2hD)E8t# zW*r#WbH0WSf>``vOV3NpSF09(@Sv3`ne_SqlVyLwh18tj2;LSrX;^9HLt)Z_3z032xx6&quWCtBZ5a z4D~}P%6Gx;;q1kI@QM|%jwmB1{5xU&6}r{Qe$4!t;!{0(h*zA!Yn=ktI+I>C^4ojh zAz%I7bfnr5y@S?M;j(07?#OjCy9@ef|1EYsx}C+y-0x;XWXpml-gwiGPA6?eR!8RCRoeVCJY>aVdJ{Ddb* z)uBm*L6z_=AFAhD=W(e&b?7#^rN|`=;()j((Rp!@byhn94Z?FwN0@>n*eITzxd)1HY} zIA@+Z2b!T8f;tUkg-*3ZYxa>fIu@rgKIxnR^On4xN9tCGp*f8B67c4vb{szRaYmZX zl|$TI?a7`FTkRiFX2#HiOPy-)_LlG(f}@dJ4uu-`P*)zk29}f+Cy37;fiu`oWl#`~ zw63cYa2aE~;na~t6dq{=zcec=&kYB844JMmjVBZxIQOO|Iu{*r>qwsB9Apj=@b<1L z?{6epkmAcGmEiBgv(%6A zVYKnD1L2@N9nB|));Y|{)!(?gDPT6Q(~;oJCYi|JdnO8>y68x~hk^l)Bn-ET`wG`a zcE-xSWY^^FQQJ@mGnITB?8daujKDhfXFvM)<6G9l=ul8zezZ0nesKCbwH~Hk#-TD& z0XjA-gUXm5Nt;xX4m*WehS$IBg}1JL+{m>+Rs{k3a~789^SrI%E@fDY;0s6Y;-Sl^ z@iSAyq&!~AV(D{+ebC)5{`R6B-dFKg-d>2C()XbNj*eyxcrb6!SLB=2+cnwuikjEu zs+*x}f>r>>tS(ZZ<8%MvD^kn%Yx+FqDcFv8TRCkj-;Skm*dN#4mo%ol_&r%E!AY5P z`~wVuYKbJLkpR?i2#jINqn{*c9y=!g63fLN2uuoEY#-T8xeSO`G^J)}6C9+cLIV}J zGB&|W_>tCejh6=uS&bl#BMmOBDlh?Wd64cf9fy=SA3!57yKH03*6K6GsKZp0U85z# zhQdBi#Mwez!+yx0bYU>!V#L$)fD$|kCzRg<*iN2kboQtI}Ns`uUb zKyet@46-(>W5;Wjfpz!mdmU?Jje|kngoOteE}ATX*!R(UJ?1KM<9bCfxbv`FcLHq& z2ov*Uv^is8T2JPX?Mc2Thx*LXZ{e?)^g7_T+<30!O0SHoS8;CSgRHeM!TNlwv1?*F zFHMQ{Gk?Hzp^&0a4oiSmZNEnQvljQ+3!xV;R4~k_d?$WRVA-;m7-~z-IxR%e`_>D9Hcma()vTo-=1lu8&GOawL zzbP9Uvw0RRfzoYs;h`S#3m)Vb?%``+i0FLHr&_+ekG;-Xqt zjQ|ZA0Y~7NEf@?s1UIC+o3>=p!*;yKz;?Svx zguw&tLaD9t@|JP|?iBv)52z`;&;mht;G*=IjI6=NX&fu(Gn zT&xpQ!)a{6u2yV&E6P}OQZ@Pn-w`eD(wCo%{Rf8=t92@lPVO1r<8rD@ItD*LbrPqG zbjc*;L+C|c%8g;Ez7#;2D-?;MxyT0(k*_XFTl!H)oEwjhCIB6FgiiL|1R*ET0dGr8d;H`@_Op9Si$V6n~YqB*p82)t(b@=S%awlpX$UBVpTNI&we*wqe z;N=>azk&BP`g&tM0A8m!j+S`k2L1aU-2!tB4xN)%;Gp3@bzI!NjwzfQJ?e;9lQSF+ znt7%RO8v^8L**{P`5TVse=!{E0vJjv%i%hS-0~LK;b*>+I?}bVox=fZ_?2?2tME#w zR&jEela2(=BNMH?>rCX-c~B?Oi*iXry^5tDhGeqGaF>_<*ui$*pPgaEXdUxq{me&n zKgBsEp~xJ$Mc!#*rA@D0L%rTk(}wVN6a(0%K=D$ks$|`0GmFdoAQ4l$vy*GbP}~p zb)$Ny>li0^0MvV|Y@bn6KIVRSFf=`?WfY?YBjQ>ZdM-549Y^kv8YixnfvlmS>tQQC zh8z1ZJYqz-T<76=8O5jcSTMLL#z{AP{K#o^sc(&+-lLHo4&v+;kaG=Yzl{#jaRnaM zP)e(}!-I^|*wLW#ZX2yew8Kj@z*InXASUe$qe_F?;Ya|=qhuoBY?mDRb>nM111X_5Ygm7!cZ*j2imgK>^r7jDc){yX_Z z=Ik*5cI!#K3w2NV7{{O5ijcV}ZL3%C^B|p#w_S)4>(>i^Jf$;Zt zY?A$3k)+q{{#(|cpTl3z+w=JRDR_GRANS1~`1}rqw5X-)Uejg4Zf5J-O!*cn;`CFt zq9tAwKlc51DX_$C%@ZWc&&uu`E42Sq5noC_({fl(W7mi9Td1RZR|Q3!io7-B8bIqi z25-6v;!u?76SNu(X5oBfzJ;Jph1H?ZaB-aWEig@2aiF8DRhF- z^aex7UJ7iY7(AKqi=nJ@5(h#f7#!)DXikO0o*ar~Plv2HVRbNCfz2F;<``IR^67Uo zy#vrvHirm#rnO%lX>mQFHU0)G?2gvr7Ngx(?6cEX2dBip zdi4gUgB^(JCAh|s_;7I%hvMhA=ouK$Q*@flb?Rij2L1v(CnpX$!_Xw%Az#-j9y-o# zL7f=DNM?Q~$z!zQN5rvl&c`FeY%J@a!S@Skw>T$`(a*|GWOm4lW@s6g;6$!tj8<)4 z=LvXBf4}^Ks^@+f&hr>0gzSVT^)n>(fO(>K>q0b`YvRPMcms_}4@Q}+N3c>NfEI01 z&1Nze$ym><*A6LjF2V!DoE|8T^iYtd1L3&6%NrbPaB0L_x9q8Sq+Y#Z`Cj*~@F-p+ zMg+Ro$agOgYF}tpFA3!aJ*P9-;xDKrX?4-rP|}Ly4t>KeZ~Pwqe#ObVkWXmYbC{k3 z^2Dj7YsI=5XV<u{Tcyx&K6IpaL%c+PXfivMg6Aw5bkJbtDsp||? zjD+o?;%3K6M5RJ+wNPgn|FjRP=1U%ywFlMX*+<@$Nv{6veb;a4B-@YRo*Eb(iXDa3 z3t|`Ed@R3o4co=U7fj!#hi|EZra1FaAC>Wkd5NfBJF4p_^qSCTsh+*rkRP+>9nXa? z?8()?tUCzqD(7u=cn9hiCHMDZps!GCekHOzW2a<64=Ni1X3U@Y)0)a1lcDFTd+I-N z-0i_AgI{9@1BqzX5Mul|4g+YNA904Ql5ym~yD^^gA+%%NOX7@PiZcw8wE7e0L}lgB z*v+00u5JUP4l~iPuZg9Q#`uw#Mx716>Lq$ZKKG$;$du#z-IoFlMUU?<8DD>S#T*ERR-srIN74Y!*m`v2 zr1WzN?g%I9O!?85dO5^UJwXS5MV9~P=bzXm`t0Dp;PV5P?iG2i;P(=z!+sWx**GLr z0((kq%~$`!a4huK>#dc_G9T)%)lGU{Qq7D=btBTSnja4xS=}`2h=*kWx&$nx4jud^ z*8dP+d;kf5Ww2YHG_b{KZ<{@2$iy(E)OVgOJx^Qc?R`7MadPR@kLcp@l3t^myMqtt z=?cA{vI>;L*WPK$%Om+^LtVJynNGtYxa}EpehQ4m$y5Z(<%YU@gI=YfPD@uVrEJ}{ zC&H7VXym`(*`5RIitnvGhMALra&%&)t)84{t*7VPt@bEkc%vTr{-EO{XbP`O?KrFl zdMdJllXE(SrQeJSEnqNXKu zNeDen#ZT4$9I`gtqU!J9@b2w_e+j$md5W^ro5n4}OMJ`pmp(`5%Q`qkx-6t=+V2z| z9g2MzSk|gFd29j52X;-`A3e$nwogU;(t79>aavqoy7GT%nMVBn^uF+T>5G`JDO}`( z_Z(i#*oi+wie%~e_M`W$)Wxmb=3}`=4~g0&ukkGpH_b2&;5w(c3=2@^hH%(g7%t>D zno~@gDmoK>2wiT|bPbsp*4*tyIHmd9&BJW9cZ|3{m|58gL)IJ_D^C70fGWREMZSa@ zVGwiDcMMjB7iFBf@zfuUuOk?^W9*d^ULBgEq3-5=?iuie5#|y35Wv-{49mMc85;NU z=W0rsU=57-tds=QInBq}c$y44P6}TRg?iJ7!$5C3>fbKogtN8SdyF?^xAosvUgs?6 z{A9xHqs!#NFL@k_a*o4buZ43!?ikW?P4C1<9D_@Sxae$TBDKR);4RC}(zD@kmFz{K zZgDm~U=G`JV=s{WIQ%NB1;OGOOK#oaU}^B4;owj#=m(vF^O*A;{G2lE z>RkLs*9WJ!_XqFMk3ASV6)B+@$<_jOUHZ^5>ADC~@TRPU=@GLD zdX{ujQn$dDrcI9gU>jQ8j<@=5O01K_QX$Y8l-h)`rOmyWG<5r=})80S{l z)1^a!h&X%b7kGPr9&srCLi{fn>N=`AqGT%v&Aa6f4mZ@xkSNL``%{2Vy7t6fp!3U= zCx$*7!o)Zy?F#3^m8ML;u#SVr-VvRJlQSI;ok8Ci^uyKnw7Ids;1mFtUPfJN!s)Gp zAK#;6>VR`=+*5_O1H8_YsbNm`M8z{weuaVV_QQ0!@Wy=|__{dZlXa5cxbN&x@=fBc z6Q#pOx9Y1MIv0K;Uv#9r<`{a^gwz~h%Ts^|{edZNdO3Un@**I6FAvqQ34Xnbe38bKD)LFhnDje@-~++> zPwbKb>)rQzbmpfehcrZ+l2tRhs0dGu;Q0|a^+$5ajG@xAVmyg2hAJ?c&M{^%jvadAa-@ek60ev$aaOCu zTmi4qUz^@x5K|7GHU7Jd(Yq%NTbvXPeVh>unuvbG_G82ZkcD5DJX3Rv;jitBQ$DO+1<;niV48uYdjYYbyCr}f{KVJFbKgsQzO?xmrY zi1^;eaTk+3m#uI^~X2fgazmBGe@t!d+lQyDFDM$E0!o?k5}?jO=R$ z1fjdPuiwUa24x(WD~4*_;uz^*DuDadbgqy|Zq+hlL9~d1lxYK-ZjCoDVK&U=IfFx=v=wi}%J} ziI3EqKKv-}C%k2G0cbdk%^^xv&N@T9Kg@@Ca^)r+i@5*P7x|}BD!2272xU3vBb{g9 zbjH&oqqVreE;T0JX0kB;@KQ@3*UMfF|y~kpE z-jU3v(9X&(z)qk|*gseNmuF!4a!fhzFUnNc+u)~pd$=SRF{BK8;`F|Jp<9;q8ZdUm zIYqO77#yF=V~~~gjPA!yMEMj1T?hN;4P?I3J&z^w3~gFYYd)UO!l71{<-MP#_JD$u z72Fd&b+HFb%2WKLZfjJLUxT~GeNT!OIE@y;lZ7kLTuq2M6Ve?6w6E<+RnidQ$9pp%(=l*ut47paZ0CGTh9fhOc9WRcU4);xs^#wrrfD*RKxV{`7MU za5%O=aD3jxVRAX(YaF6$dREkV4)FG)e`|e)dx|L1^yJ(jle8Y0XMqzdWBjXg?n88H zhcMO>>JE5wc(a}WT(lg*ix=ae@-4Gx7Ln(((3NiTqscq}YGGX3Q(m_Ve& zefAWF51Ul@50sf2T{+ATq=5}b@|bz;VQN8CGL!<^;x=WQ;tI?*KyYnMUZk%)`ojxB za4gZNOXWAYfToPK@Sx8%X)P-Go4y6lb0@}wCD4+SqnF2k(F`5FL6jm3bHVZD4onBE zd*gooLbNh&oDBJ@YzC@hAUsNIO0OjoRbyN`ICMJ;<{Jd=>D*^dNW-}X^(04vW8Ge+ zOgQVb1(}AISyt%DcfD@~D!}yFA6nv)PgtKC623O2J7P8}al$}QZ)2{(24oH=&5EgO z|Inqbb`p)P{@Cwb?LAMA@Ap9-DdeRHqdhry?2*|a7aRKoG%8jCUA(TOni zEzyu_lq6HRgC%?c7}80>V1gINp=%sH&{Tc}?!U8Akn<^yFp^G5b7d&!S-2Ci_j3&C z?7mIBExPBXP0Zu>ON$arbfO7n61CA_M=f~OZ6EB*tx@m(5>nP47;y-0313Z zC)XI47wmHV_;`_4{J*_>8zb9E*@wvB(5F*&O*_X)k(RvaP!NE(qOZYtj1hREK6FIj z)fIsRNUsRISdVN)XZlIv<;PQpB`5iQrpMp|6L@bK>t6<~Kn%aZ*{k0ZjYxH-!Ap-3 zcZa{2rUQ4w=_KI)1jn!F`j+_=$H#A&SAl^F9lQzje|Yfj?K@ZmFL62$clWitt=iYQ z(-HJ2o~=yKfNnpAZ+DO2UO8F>pj9))A%CX(M=S<;o{SWy`XH!WQ@rwpz043jYDGvl z3WO~O_XCMTXl4L(2yD&Q3RlnJIa$QZiA+Z86za5v4Rr1hv_n_J0!N$)5-Qw!6DY)c zWN^9HOPmV#r*I;@?~cxZ_2=pi*M{CY>w{%)g>!?+?5eJ%Pl`LVTQ|}(!TlDxPNcqp zZ~BCIUr1y4lD!U@O98wU#372h7dnjRIGsAa&Kt?%0i@~hq#_BUe&xYX(hL(*kv`0h z)!&dcfby|&fINq~T}fPtkQaHHAMJS=JqKEOTC%h5o4bN?RK|eMGS0z$2oI@?z)Z%j zV_=L2jWzpoA9ES%9okG|vkbN5cVl!jg4CBy$(C`IbJeRk9GuRXP4a5FtO1%MT8n1@ zk%uiPER|lQ#lVnr3~Z^a`92Nl>*O5K^w8i?O!-=06?$wzj*R;3Sp_`CH(fNu;Y$?l zSqAcG0+|eZZa*fOw*UsO>3~;`!n{rSg>DD_ByZu;^q~NX{!%ClDIb8TqKbH3$-kMx zAlWp>ES%hci9XO%k-}e#?**~K$2#f_iHxhnj&qTBD*C`wVCOiueyoIFi>NS~G&mK( z-Iz%}VcK(obGi+~9Ht_lbq%TIS9}|Wfj5DQzq#rrJa;?;>qDSY2GAkUbF9B_16!b; ze|2qUaGt}!m?f#u&kw%_7RIt`@N0+) z8Uu}cjOsAbcx))9Z&!a;A_Ryn6B|0Ou(EEz`5q&Q<#4dHa9l9DbSBzs=*TQ|&Sx_(Jd(C`|YtmdsHa!%gMsA0BSqGG*TBC7ThzEm8jIrt7 z2F{gu58l5!oCoLO34AB?dYrJDl)pM|!l%ApF|oCY?r*YUm8(_><2)J*(LV{~ zeE=^{^$rAsShgL#W;U2)Cd^%YzDqhZg0j*+)3VYXK zECR(*d3imF7k!1%9>Hg_BpTCd{e;Twg>5;bAO9l5^QqNO0OzSKk z6#g-~a?%Eh;iD;822H?xby!t=(zGrbRxeFkUoV9j9%} zb%tDE=*L(m#~Cg1Ho)4ttns8162l+k=aHsWSkCuQZk1IN-LN|fJMLd2&@&DZcdMGl zx5hJ_14Rcz&JVXM@0gZ!@M}$$*=wkGP3}!kGjpmxCQ1Zo~ z#IQTWaJM(War2ge#;1zWS$K7>p&b_n9vE)K@F1O=tlk748hkoc3gHsBHEc?<(nbI- z;`CkfgmZYuDPi)o!)XrX2|09bYS@fDNDhDUuERlzqoaHHdt|>0hs;<9G>mVN?IUu& zhwgjw+|!bMgfnr(Tn+?64!@N2wh)%K_2ugN?%?CckKC`A*zPj3@P-Wb3}xavyvcJD zDfyMcV^%*aYJOGZCaVdNIS^G3tXxrv5NYg2qxLB14B6Z8MBRF#Mgk=K!}RFLl4H$!6g)}6ZV)~bN2U^;E&@w)Bx2aM~ZJ+hK5_( zv~2rNMN6VK{5W2s0d?DT+V$gTTdN=q4VIzU``A^(&*>cQCG(y8MYET*CNga##gv)Ea@m{NV~d| z#;P1?BxZ+z|}FBaLnhdskVyXZVo1)H$elctjX?uhwXE?0hx_ zB&tMode0Cl9UGUcRp0jTTwYxt{QBDm zHt4$|UVY$9*s~-Z^ydmkDpSr=7hC!HwCfOF`3kmVPZ=kMXA6uoa8Sq}e0H66heaF} z))BMla={2tf6|~%Xxzhd?Gxfo<;U6o;{s>t-kyXr99PQ^+ByODQt7bTEBBG!hWFIF zQ|P=x$JS}TWWFSS1f@Tx{V!DE~XXzA2Dyh?|Hg`V=Ry0479 zxe}XY`s4T>HQ*aihws2pj4jf-@Z;E11L~?P(=2=HP96ISB`fb-Wn3Z?;p(yCPz)d- z+TK$!Kz=iUp(=JI@`3R~*&ja(qf=zd0^&Kz%XkT|i~B4LJrhav;g8X`!q6)J^@F(@ zUorBHmZRuNVGQCB7@~*B{3!K=F?KzTq;JvBP@@Jq;Ms+AJ*j!@6vs5&pr#+w{ASK` z|2|J^_}rJbQlHnUBJ0T?lN#Cv0qbl7QTL=IkFBxQVy=1NBy4*p&M`o3mDQQBmG>tyz1ASru=Z=KEEs$` z4;u6*7*OKX!DtpD#DUl8z|f!LtsSW~}#&-&Yr$IyuUE2XE5K0k8I1cKep{1Vnb)gFi;GEy0b9BobnQMkU zU0u=A&I(ZK^TeJEXoW}c0}eB|TF_Jf(&5Upfjq#c{Ceft+sZ+_zMJt}vJ9)k#+1#% zkGiehWBytJYaj0>mi3pq3a)G5 z+(*UoR9EJ6)iv#w=&>u}d%L68ZHMI^fwuvD?`aAdLFa-jKHu|1p0;al1^nBOSfhi^ zbY$I<9%XDx?}#S%xqjPQw4**wvgapm`aFcgtcZ9ypUKmJQ5_GrV^uzD5$zfQiXbYxqH3}v1&-umdl^<8bey0_JCk$lUIl0f*p@Fs2RheO&Vj(bR7zHlS!z= z>qKZ!YDAW<3h&9OR7vA>$dh=pj|M|b%AwFfsU8wrlQk@bakvsBXkErhu|*#PF+*zN z(6ADZMkVxIiuDSk+|BKDTIAmr@b+^QJ!S|D+&dB17V*rlfcXq1B9n5|IQ`PEMq^$s z77sq>QzGIQJvNo zS91FJ@$%sP$BXo=oU^>FJCR!!mPzy&B`3QmntiJW0Kjkv&5_$Ip+%E`EWrzs%tOIw zk3)?7x?vd#7U)7Pt;#Gfl~;ZSo=D6vqX1f8+WSBq>iX1iu*c{YhtGNvy;HVNOqjMu z%eg+Ua5!~GC(U1 zB)ttTvFv$GoGU;*9^*)GKAg}?bovH|poT1Ebtm48I0De}UGu-R;8XpTR;yM?E0gev zOe#8vv)7fjS_Dz$cX9cid4GX|t+Sq0_Afw0)<1;``}g5xs@k4A1+pDvn!34%qC(6jqZ>DY^Jgz1T0uCI0Pvh7K)41x8)U8eP^^H}lB zoQlQ=ziClLr!$2y+~eoiemrf`fInjDbf2R;1%bCb_RO~r?mrC74=$DBF| zu7GokA@xB=0~puLcRAF)oa~Wf{~@3O?A{1jWyyIF7|@Z;K=4; z7}5@FIb~%W9f=$Er?6H21Oqy&B%RV4jBY-#FGQRfaLIRE8H`VtZv`F3BytfiP1Cs{ ziM+Fd4>M_hy_DX0=34+5hvgO-W6X26wK^@s@S>fr0qQ+NtTZ&Gg|T{yk?NcU9RdRM z2wbzoEY4DB+uPtuSj=yT?C^j?#>9}|b|}leIz~QM-*T*f4WCh8$n=Uex4_fqpk&iD zXdI$r_bkX5e)x#PMQ_WsWB+lIZVBJvFlk(8r*NH?Qb5WTHE>u1j8;$HR8ajUCO%1} zLt*Ri-ou0_2T$j@xEhml8{C!J&HHqU`_b#UB;=#$nZF?FF0RIhP_n~aJl?Y+6_M)P zxX4IZTNkpTmvs$2xJzG)5gdi_l^`DbIUy+7kOY5H=lSH@09*uzd zT6%*~9;fNgKs$nVoW^w7yA}5(zAl}{$iWv5siE81eUP{l+A(}PIH$%EgS}Qj&b%H z1NWR$r@~=U8dSnzve`z?xt}_=Lo#=ZIDm!$h$o;)jL8+x%kugcEzh-FKmFmKX}W^ zNG|i~GNCsy6m^D>0prnuHnx6eC=W1>l)1mvt+>UoWhfP=c++zse)!N4`AE-#WA1ex z9PV=G(xK{;oW?uM%Y8E*==Cv9$HHZBKWd1Re#9hRyeCfPd7#&F40H}!zYnr02a`Pb zr}drl>hkK~!}||$C@ecCqaR~jpK$m4N|qcJcj+kwL<+?Y@BCLiAi9F}O|EaPF&-kZ z1nbBU9vyM0ORi-#kwU>sy zH1-~7`J2y4`>!0blto(6uI1uM+!OljLx?gDhIj_vrH7)1J?WGOcWq1)#QL;|I2+fboOAUO6V(i};QBT85QvG?SL(u_WdanErqm z7-=MZp{Fsm)Hu`g7TBII^izMvGK{{ajCEk{;bB8sz<2xjLo&W3C~RS z8G_vpn{X!Q8d;_o2ky{!c0$&8k9CYmL)>6ifTz`I)C3 zlX9!ryiF-2dD7f>?}?+eV7le-;zYZe~1JZ%W5Fkhy=hCGo z7=-?LJkXNuW?vfL4lzlbdhwG?{ zjQ_{TJ>h)!_U*wd;xuH3$@6)xxC|Y_fv{)fLB|IN=pM(#9mbU@6O%0m9g-lIQx52P zOzTqIMG8|nU@xVj&ib&cG>j!v0a)Lv&S_rPH&uQzZ$#yA=-_zDi}&8MPy`C5I6)o) zmU*q-#J%$d(4(Z%I;jQY#SUWA_WI=N}9v93zc|mNA9U&&x$=g=ai*Rz#Vk#^|?c*4t?^}EpoM`2iBssPTU`{%el+* z+EYf4#2pUI4RH79=pLQw9O{rqU%oILbt@f2e?|`Pqz@d*-W8OH{xIeXm~a*vN8Jo} zm_$!5D%!_Q=@Zar2Q4=AQ0Iomr|^7W?;SJ?;pzKB>j- zhFE5|9<;cf^p|;8pTmF0x0*~$FO#*2J0tT>wlWg9zn9aDD|($IE?FBOn?!vK8 z`Y!xQ-%?Igke%hQNl)wf+fgtkx4PeXmjml-*V%f!TVngWlox1(+aI42PLxD&{v$o& z{9K{^d0SBIg&~ie4(!OpQdfDxu&MnE0P;H`Y=T?@&!x$kZ_N1R7E9B=nLLCY58ICt*AHTy+)nC83(l4E3QtlDdFnFv~!F|dDOQtVrd`xuGP z7sfdV@_Iz8adwo3-s1y?-w8up7?$+@mSt3#fPRI1w*22P@m7aIgVNziItg*-a5(Js za2U-S&Q}b@vPb4DCoT6xRhhi=pB>}w9kMQy6@eT-uWjT9aC18twZ*X*=OV& z-P-%)@9GT`)OEfbl4q}vSnbDf`CuorTlUB3@s{~RH|YM5UC3qq4gWMIkPyMVs9qzd*8*pu6Y8fwqMt7OC z>G`WV6q}fMZhRCutuaL8v-DgIKbPdyt=zU44KqWb-Ln{6ZNYn@8g_rhd5*M%$`B99VdnM?stpf%_*MGuGtD zUIPr#GoDWklXgVw{4GY`6$GnS1H(*H59dOZegnmC>#swQ>>0V??yxB=-g0a(upcik z4&GrvzGYKBjZeqLJ5k*6^8O%*O9MHr&%)fQFN$?V-7WH~GIJ--D;l5>CW}!9wROTFS6A$NaY65lj>J8LoNKK4#nPjbSWy#x-4Qa}xV z@BFvJ^5GA7e|YVo(cvI7^oUcjDlr<)L*)yC>gh2et3#1rh}2zaNUI&L92LAg7jM*M z@E67ruEY0x*d@8}_Sm8!9vu_!9@6c9VoqLt9B4x=y$U)8|HnW7%fT<`_=!4kXuZ(+ zLYLOHI9rs*qbKz%%e0c7o+ZjvXAd6}CxJTP&QT{X-87vvZSRAFFDhuTFaSBt(i#*@oV;5;!Z@Ls~zlS~X$Njt3z`FAO z-URaZUhTnb4<5evNtzYgZ0>z%bOvyoJmy#v@T!bGG0!|AE$L z9T&&SE6#;Z0LdEn4wv$Ksv)XF;c}}#|Bt^N{Pfqq9{lu|Uk+ZsdrL1y4Lx%8q*Kzf zAB9cd80`-%PkO_ONmuVb9{l>>|9$Y`w_h`lnEEg(Y&~&OroGkcp zF2mC`D@HMC`t{F09sB~#pMU18M@Q*NP+^?C{7UcS zwVb8J$$uO*G5RNTKXhu!p|Gc-oSoF?fRJ&^(SPTvSF8ZdD{uXjc;VAgDYpU^!k_iV z;ZgS5oYO<|&;Rl-2mkU<|8(&FzyE%4@hjz|Q$a7sneaMODW5ing)+LKTwGdLXTqK@ z>*AgDkBRg;6z+6=#}cr2aVY4uBHq)vE)U>x5`UHmmdEy9tQS`qmb$3t?o603@9+|A zJ;LuNHq~paFW(R2KREsD8t_B%lEds@xhj2ChoV{>Rwe8o%5A!fYL^NoG9Prmm^oH) zZ^QZQG{}?;TXKel?R;!X-A4~wC=W^gpsYQ*n${+MPmx`|QJ{*cA9H`~E2YCBTOuaU zli+8O9Q-d*`zXq1Vdr;8()2quroz)wPL<|+Ju8m} zyGwCeq5*c;h%lL7`^&+*?nnUdxOxruY>)?9hjY2tz}+oICI;vA zCCjjW_;_%^q~{MGJ{(*!0XoCHbT;7k-U;R8bF4j9drqAj=Sv`9oF41Usm3gLujoyA zWQf((x=uC9V&O1T{>7GnD5v<+^H9J-a8xa|+RCx{bt;O!=|pTe zq!DK{G{qy|U||TE!?<)PQgdJ;zavdVorq(~)E+OFHhz3y7#+{nwvRYu$4CD-_=r<> z`QiP+BhH#bnOr68#JWKpvAkU-_JI|#9=JPC!#<1$dLtMVMQ@W1h5Jgpp2!EW3)& z_jQxa*1rh-9$dYSaNnsT0Cv`;8S*8!V`BScE&*oGU(cZkUn6rfE_m3fm?ezLjD+n2 znh&g4Hq%(reC~5FZ(~$|9i_K4N~Szmsb1<-Y^s={BY)fYpEC1JhY@5bYF@^PO!?XI z1sz1?hqtBI3qeYcc!`XiW+Rkh?{N#fBQJ}D*&~_x@8!4h@^;)J`__-fW0$4Zxn8$R z{Q#-7-c_(pVDYGy;L9a>f>*1|(~{=idkHN6WXolfq6$i*Otm)5b6}aQ{{dzd))?t| z4|wj=OHb=GbOfw_S@ma(0K*U+}Q;WRD!BWyj>__n+YuC!;_R2*r|Q%D|Tab|QVoD8m0 z;^cGlT4n335*6N%j-rPSn@7PGJ;Qwhb;=$P%cX`X70%=drevR8iblzmmmwmRb7;Nq zy-{ZB@<&48tOwZ*9OufqVo#8BApku1kl|uX+JFBmy-FVs4(S0>oA207{Fr$v>QE(K z-CWT##8O}AD6-QNVcof9^7l10=;?@kC63=5T;V`m;Z&qE4E)r%CO1ft8C2Di!@WP( zw_tpSOqw3`?)MmVE0#a@ks9=gVn#zj@crv(U1=}X@&^$$?`+T(kHnyyaWC1j}khvC5E1^JvX?aZMU!dV3?E6(xc1PQeNluHmF}$*>XtJ{rxrd zh&shEHr6G>J8|+od2uKnIB)5hcx00Q{rOvlG`-HG>)NEwvgH7`^;NR5O9;qQ*f5== z{~j7wawhu6<%b4l8kp9ZX~L#@V_n*mXPW<83iGP8V+iz!4fhVW{>@n*y8+c_iv9$L zLdyHF+F`oT^)cyLjrF7W?1Lfh_g_aaZ{ zdk=m!s$x7`f8Xo7gR;o@)K+*(oQQ&K#HC8dCmEe9S%;(OnEskb95%kksX``bS4_cfE6;YA!elX%He5j zkVt-D0}Y(~SdJd)B}r(*g-q(M>n}skaJJNsWvq~LG2i}o#D0KRm!C-#qxx$sY z`qlX-#Gj$pSI!whw?|B*e#Ei3p$F)mWriOp3w2=4paSM}4~Yl%lDK2H>&Mf#3}bu6 zlCbPAfsk1WR#_Aws^g-Z#`U{N0T8IdJ_g3ipZHKm(UbLpvmd=q^|T)Uif}=WiGeYfql5<+XGzBvrmpM4YRjHQB`}Llw+lr*}Md6!RoUVWeFExFC6RO zjqgC-2bfWbbEOwhT8swR$~HcZA(941^$SQ$yK0iI{Is+C$6 z@jeD+ntawI8Wr>t!W+PLN6W<&Pw`zJK;n0cF)7d8)K(!NP{LNyz)GXt-m~>=lYrrUR5bAy8R~c*H4q;IxOt&HFk+VKuxQ#+Du* zoXX>@)Wm!n>dPIyTStzKI&{tq&LD9vFZ%$@14EkbsV_Pd_v|f^P3p++(y}$3J>oVk zHj;^|(lj{Lf0DWaOye)2tc4TW)RMCskH#9MuKIhDxW#2#+6XG{!e4Qnn-O9)G=(>H zeIDtj9!wD|K!YiT4i*Y($+OSXxD|ZjZuti?3mO$a@~ps?&MJOHc&_I4;_WJElM3ghB=@n{Lu zi%>rT!zV*Hl(Dutn`WiyFOYEB4DC?yt49%Dn=}A#OC|rdLQXYKcZt-=<+7&qeLv{hB}7HgBR26466 zVr7!vhrTq5<{_ATMm1V>gR_*I5CxOK;!>$*_50PCEufyZjGse^yF;3<8wl-tNKDd! ziE{+UmO}%71{)J8DemeNeFKmqGL|^E^Nl0pN zSBrTW-H*LOa<^pUy&MIG-snKk3(|)&xle?{ncNrQ8u}%ho2ap)G!uk%PL4EY;X5ty z`5izO<>B1th@J%me9S>8D&%5Nc@oqyDq#0Z@KCBq7P*os@%^%7BM`ujw1D&nEM?Mi zwek~2J<4OrLyVDur?){J%U2^}l0%rvSx^TJ-{j`IGECM+E_|}&7u2$nw7Qk94j&rk zY7ZEzF*#h08Pq2@6i4ha;hJMk+`qw*xOKP_j)eP47Z$&2) zbiK?c(4lAfMdj;Y6E{gvss5)d;Fio&9aYgS7##_22u<+=@|^5sozh=NU_d9Vyf>f{ zp`Lc(=;hM$&gh7DR&JdD_a<8OW#*>0A%C99?GMunj?RBCmrkZXPx+gMLsHT)h-Gjy zAFC+mnl-|_so@23IljvvoW(5ChJwFzcjJmo0Ps*;2zb*q0Q)@A!$ z;|7L*S1#tn{Z-7-@AG8UDoCl92R@*O&6&s;cR#4DEao|PKgB@Vk(Xo`&=?AtD)il` zp9Nv<)G_EQHdPM{#w)Vf+TWc9>y>=eSv;wjUf)a&gaG|eWeFF&N#b*yJ#%#PLrnzZ z;N7!=9kJOU&sCY6WPL{uflG(F>7GN3p2*<*2vvTAGvP#E(;Ql3Az4NldSlN5;k4-M z0CGym@3LncneBwF&i(18D zhN=g>j?~-=oG*tt;TdHJ6y>EeX5KhX8bjfax`3G3>4e?~_mpsTrtCdI+1fktU=IY& zLzacj{0W9U0h?Y6IDJg{`fe(7{wI7B*N&w3hsE7Av#&d5YF`JCoLv{*|HwxvIaOey zv8odbxuerjvHe?7P@A;9!0~%MPT1?ges48w;B1U1g@@hsWyrc3=+$VNGJ6l9;q#AU ztp>iDL*Was(wbLqMHsVEMhRQ#yFeJrNMGKE^IcezX;&2ZTD2gs1z5T;zYSzd?wv_N50q`g+4&j+t{e$uY{P+i?}W&@!KkrW z?t}U;9>aTah&u;@YP1KATJ56ctOGQhpU4!hAYk+(CK zrfr9Dv-c_)O(cMT$|#01MhA&o?tO3M16`bl-18`V3AW+|BB!l zCAHtNy5VT8ya+)eg2@`+gLhxpfrdC~$W#3H9$VGLJJ>%u1mF zr+-&YU=3voPI%7FCpZhN8B3IDtg@y4IqijTzX|u4u!rK&-Xe!WfeT-RyY81YlB{9L zr_P%k?01-dnQQqi*$>kn9cr$nW!>!3=k1z<_9V(|L&5;@dj}eS-l!P$rKoUKl6ni) zNwM;pJy(=zMeJc;;;GJx{Btq?;o-lULs4Ivu@t5iI+dao));QBP}ZhoBgOl=8q|uZ zKDU4PGW!Mu9LuqoSrm%D0yB^?y`pD{pCHeO&&>J3p8fJH@B`irfJ&L?7s0c7DnL@T zbBagI)8`V)m<2bL@U^e2tSvZO$LZQktDH}=CdVS%BzaKL0;J(w7t33nZv$zzuujkE z2Y!{S?6p*uWyJd5gU8 zj_i5Bm2vT2oe3S0^ibGKVH$ULcDGn`BfNX03@iA_*M{no^Z!{gS}(i4`@1rgy~+e_ zc7<9`mPb!BeqH(!{`Yv6$9255xTy$Vg}u;i#MkllRhan7MDnrTpXS$dDCEgPpcYJD z0xQMzS+LZjycJ|XAdR;=Na?{AGu*_>-=<{Y>eD{t_!0Od4WQwf@ot$|V*T*PSD60n z$8UI8Qt@A&WCtAI5ykkh09{^%7!_=cpx@0=7K-3ti1-dmBh{m{9-rb)w6>Vu+sG zcQ6TFE)&P+Ubx~M%5?}38Db;+kI?t5foZ`i$MSi-Y*sa$8~@hk;DeDN3+=i*}c>M-55|%<8quRiC9_oew8UyJ_7= z_Mo_CzJydm1>-a;MPWH+$W*H*ad0|qdL(lA%sEXnUTR@IK!Qx4Oc$ajwsb&xJub&V zeu0^1&Eq6@$MURuu`?pZ)DEfOO|+LWz3Z})ysAe*I*j)oF1Awy#Cjx!2=5lR*_`j? zP_j5+81?oT2}!Kj^JiWHb(p6G#qChD;Nih|9Y*7QFuo@9Q=c5d#wtxmtk~sw$da#5 z4rPk7f&;sarZD83u>+=>|qex9Sf1}n(AGqIBJBLWRr5a0RH z>g*te^_RaIGFb8n@=1~|tLMIm8nNNK5GQ&Ld@g6C^y3hi=@Hl>6WTgx_t15Pr3;*i-`=yj6PuZxvoYO? zL!THr^MtN-P-vv)x#)#QjLklwS{eht@~=Va(5KFuJPX6UABNRHm%(`B5>Gz!5Af=z z!47f214gDKn*9?F=@o7>H!ckrSx0y-UR#8WCfIo`91XrC?GH_74Zg*OSwUWi6lMrUH!bkJwZBhEbJ2fAR z`%+3>`@4`kdQw%EPmiC%CM?Xh^py<1Lqz0I66;n~>UuAI59;vV>qD<5Eop%1&!6Mo z_31tD)#pI^t>fs*-jmP$9SSPo%8EJDQhX+1`7`^bY>9{F?66`@j`3#$>@G#qxwQHbMNhiv(Q?IYsgW{K;e`ZP8za6}N`wP7kmrUx_ z#5~O8Yx%gpcaI2k4<8P95|4*C%GlJTEZR~J2f|2$TcGn8>d9ZwK{LB7>r`loqgk3O z>7CvT%YF|L1B19GR2OeyHUi`VBDt3V1u*FI>fPAN(P4e^)H(F7Q_yG>V4+Sq7(qVt zd&F+wC+tG~z+MyX&*4G@=F{=a_eTR>@6NMLnvZo)b~-AE=Mokye`s?GdjzbT*Bv_f zn)8Wy5ib84N1_xFhr(?rRJFYo^6a&7O$bz^+ zC&;so!RMh_eN(z_8lI3SI$h>n6!vx~3OCnQ5UI$mtR)iWiuNv=Nl(`HqA!{4&r@`v z*9uYu)BK%aDoA}9Qq0A3OHJOPdiE^OzIVBECwIS#$S&v3dq+G=mj{?!$3^m$P(AC~ z`%>;Dy|tOXsYq)IQcTKn$zIplHrckN75ZuInNtw|*8Fqu)hEkvXhO5@b0E)ViX#eP z`mm~$rCD3tH2*ICHrAn$)W(pw>ot*sDb;zFZ9Mcc>i22RZTY5f&k4(ET1Od{qy8LU z?!9Q0NwLHi$$(jRgzo}am;BzJ|5_85T+lQ+368%vnmdITWgJ?o7y=(Cw7h@KOxfC?$`c6$9Yns4^WR2VIz9k*Q!S zVJh>OyFwkOxIFs3Qbh}2No$;Y3#j~dvPEYqkNHPXV2x<`5}8LmY|4luEM)K! zDcR_d-;dfDkg}$i!u>z4S;qJ7`Xj$B4m$&uyc)bZ6V7LFQuPr%4u>bKwnaGl)uRCE zkvnD+f5My?C)sl$o;=Kz(D}%cu-z+=Zw~oazLK#S)$d#Fmg~8BRO^GMS^^A@$$OyVrvTFu4h9)_MMprvnzA5Nc7<>hwC) z_Iu|gP|5nd{N|hCn2{4#$vs39MQs}%)zeG&P#BSYo>2IkvRD;sK;Fx(>g5ogB_e@+7@dE0Jd+l>g4lr}MB* z!cWKcedb&$eqQ49r!L_#c8R0I?QvgI_Dk&Bup~Qmw+xsOvUAkYZ^!B9q;k}C1N0)g z*T2Q9Gcxgv(DZ$LMz*~{m8-L#c@r2_PcB)*kAMR#2Dv-X-k5)XKy@eoB}0A2>POD- zXb^NA&*GX^H20=BW>PJ6B616Tdh|yO&=VYlckFC^_WBLjkFufN#}6M4u51}MYileK zMV-{Y_8^)H*WH>q{7q`lXJOPpWwNFzbyQ>&d;-K)0AgK7O3 z;f8m4NG5>JBR*D84J7hz&E+p>B?hkEAWm3axC8d_F~iN6-*EB@hv5Hj@7$W?#*r+Y zC6!9*-g)hPoVES`KWXN@ZEei9FIzoTrR$#WI2?38Y+sUQ7oHzsMNptXU1m`>k+c&){UzZbzG!=CUUUpndcBYAnWFN+CYvOxzx_rpM?cduvaHyDObezFti8p~K$*G3Ker_?rFan^{n7b)xZX8GEX@dBWJT zdIe36+m!9{3XN0b!4b%VL+%A04Le@oRetL3h(7_@(M)5vMpgM+;Y2n%NU9R`JOLP` ztDTe^C0=k#fEW{S(u-Sj_|h`BfAG|yxJBg!$A3#`%w3+pmR|A%Zn91c#mlEOVHPQ{ zLFRCx2R9V|?G? zK-Er_e~vn1s>fFX$gx&PXZ0l`z!$Sstqt<5vMDE_7~b24w#LquohPSx@_0h8 zf`|S38cZ{)7qOs-&b?+ZY!3h@GPE6WEVK3wE0 zuQw9rOywB@!kPpl&zL(eUw^SbBqh;=9*05aj;0^nlLt;*_I}Y{we1T69>a@ zm|#~itOzB7eO?@VhYX8eRQI)4qF+alBjU-c6r70>8N2*9zo<|W9Kf89bD~Xd?WE0R zv;i>>cAOr@)Pv?%Y;>92qNt3S#9`#=7v+n)Y$_m6-4qJ$z zQSn7#-%X>1fxWV*Q+(X66MxGt5Mu*sqj^k|82z}sQuiw|cmUOQqOI_jF`W%jl;c9L z?iOlf3eU(?A=Qz?4p)09_41C}WL5aP5u$@H3omYc@^|U=orl+NwRq5v(|ysE3Vtcx zSLb|%Lbp2c{R!Qs##JRlOavK%D>e>Q{9wohEzdWELTnC)Y7k6IGmzP$9pf_zRwp+$ z1X|VYTi+&!SDBK~mRue~z$C7uOvZ1G?I!s-qUw9*-DLRX2+wJ}kQ52aq3|}xIG`t{ z_lHU7qTXQS`)?Q~j<>ag_tSpT1x1_B98Jz!(fNAM1I}KoC|GzJ098J7MzlGI38k68 z5|nE4unySAqjsfUF_@Wze<{U>PGOGWay$DWB^7Z^O3lPRBsh>!b7s*IZm0fsnFj>8 z)W>aZkKA>u`Cc>bMZr7A>K;W_ZgG=3Edn>EJULlg=e`cP&x@&FZP%D;ospaJYm;Qy zUYktkKA4-u_F_P;DW>~FJGP54#j6u7UMwQO-{sN^mVEBFJmJ484kdwne>AMyF}9M9 z9ouZOobb7=PUoc1VAlO_a%>6VRl8#lkzIY{efQ5_f4%$XfBwhaZ@>M1_kaKP_q#vz zDLJ>x@VU7lmoFY^%5N9Qt5!3<+CU#jpK%mDq+Sv&ebK*gk{A81n|6@*t!u&aS@aOp zGc~|M(eh5v0c+5l1avc-0L8Fn=3OYbK6Ys_!LyU-KV1QcCot*OFAVapM>M?>{j;2c z=O=;A6`|MqvJeY~SA6f`PQPUB?@-`}-q)9@b(<3%0>$4kQq5`j&0;O|h>bpJheqi& z{4-pYT=^rOCM^TnqCt@QXDO=<8PS`CB$@8USH7jo!A$yFF~LHcV)6$JEq8FF%0lYt z78Ueu4G`Z7qHH6-Fus*4{ZMlR_b1A6M3V8h-a2g-ZlZnsPue+`F^(oyXztj{2x7iq z3?}7)%8K;^nY_si{jH=fq;Hc?x}c~@0Dc8tyPf**peIP`fIm(ci=CKIXkP+?a_5?NsvQeIAh}|{0pJ58!nn$vd)su4XItVX>a8hFi zj)C??$R*^CE5fR>&!?(S8`_sr!wIr4cgy*Jxh*%>mu8Zcdm~c#745W7yPM>&p?GKh6Pz##cIVVQk z2-IzsnfX=r8S3DITTdb_Hu5#q6&ht*#^^#sj~6!*EjJ=@oC^HtN1ob68Mm{ssNj1X zKkr7uSB^MrW0PTQOcothq_~-Wg2zWnuj;?6qq9ZWJF!Q_MSjlmf<0;#t)bq76 zEy|u!uWZBxFO^nonC)eQA?$sdNwEED%n*rpWK3>6;j=#{R>iG)oHlaX(a$7xm zCj|ZEPr}1jM2T4R6P8==H7B%0Ykk*<-%JtFE8K+N1ib;gb4ms&K@VO~5$2^uSYQ0| z*j4>CJYsCnk36M`#RLlrZX;uC;}%|Abx3QR5OZ4-0`|ijC&?1Pc8rPOvkXb-gD%;& zMUSiDTp-Gj4PpboBDEZCS4?8)a^k~w6mlLs3$$38tYW)mi z$&ZNF+*$f-+Vpeo|6gP0CF?#%j(fcZy^h1L#f{N3j_hVJo$LhSq4l-StG@lE)0weF zuQKU8<+2^oj6X!hHs zik_<3?}aK!Hc=v-Xs+HlHg71(-i8)40X-7?Jpvm}gJp^3uU+%!`(l|GkRPJ3GWFoefk z`&etb=Bx`_Ur^MYY^}o%PvFh8C&xMbOFIwz)K3p>ifH!4E*nWLV40=nkrzvMl|*VW z=^O_i3(qy_cJ+ys{Glu|d7|K%Ht8GovI9dz!IT}>z9kR`gfx<6i_Ar&P zG3=`Qdd0+H)%Xt>%I46{J|2jpO+Y|xLnKL#G{;5L&fH>H6iH*ak()$3dHJpKQ+EvO zQp;Kj+GQ~pv4-|MS?-2b^!NR?I3wb)vl-uh6h=PeOg2o(+iO(ND=!?N0^rRa-HkSL%9kj-p)MVzPKf`XT&Y44Gr z=?lk17QlYBXJOes`YaMzROk6+%UiKIt9RL~%w+{lykcsRtVU~nkr-;&Sj6au z9BYG^`m0GT!lOX8D!&E@eRO6GP^}wdVLP#q>Ty)1R$q-l`)m_3V^)9OH;b;lm$3}% z*oVSn4w7P)AoJfo8M(x7 zaZIUHE$aPBSYs^VuOzplPlYVErLLmdqXv2PTop~9@~Ql zv8B7DWC@*ltM7)k@c3`ei`+60Wx_2oNsn7#;I{+f6yVa#%&v$TXS^0=Ri&?2l=No! zjD96JUigSt@Ef_Y9U~-6sboWr-suF>c#C{c9kx^)i0g*?oS0<*AKp@TWpu5-OWCqv zA5A0qYL==aSlo)kKVww~VQxF(iA?TOFMqir!2ub=j9Dy&HQsq7aL8gY$20~*4txVu z+P0$isGDGJ)UusYy=_}n=9+rTa7nZ)LFy3@*VIc6MLa_&q^XMU1OKoNjaXo`Ih%94#8;|ToG^hsn+UmZGl`2h z8w|Opc+c#67f(+63HGfa&LGU~$Ym|5pw2|Pwfcn<%o3y6G5$0eU{e&PB z`Eza=Q^t`K(NQWs`1GLj0MIZxh9I=|;OsUpSB#pl+e6PMQ#-L_Zkg+4Z`VttZ8Ub= z55@+06s}PkEIf7tgb6Cjz+G)kYM)t9aNCnV`PHYjzE7N~4)L*PmJ=3qV`0MBi``4K zCZAqt=GesCLvA_Nos#^FqlgH2<%U2zv20~>_R7es+E^sv8J~r;T??4Ri+K1HJuyOo z9C{wMFvfTbc1z!cU7Py`-arN{87pkP9Zg@&;f>!(`K;UWUTbILX-?$JVu9a*;K@$b zWHQjd`^Ht_sjCwF;NNFILW@W7N<_9^ad78l$FjH6qs?T#m)IekBE!ihTNcGkl&e_N!5%wEiu z2|ldjILo{fABxzt_s#gA<0!``T~O3OVyCN=AGN+U7;>OYBf#WJOSuKR`2<6UD$Uc9 zTZ=AAFRWHWt@Q{K3K*<8$7vMY(!{ZXxz^IbJhi)Oai5cGl2Y~x^A9J|55|fj1KG9i zQE^#pS6_@RAA5;I-;%feR7!zG*e6d+6uv^CNshBD#cn!8XyJO2n0yZ)ohw(C&a7L3-|j}(o)6MAc1m}t?>$Bp95 zx8$@~2qwpN3j~3PUnM8Np|c^^71kB<--~%I{gjji=Vi()G(A{Q%-tZ0mvx3$7)Zs3 z3N!6p;rd=8EzX?E*mce=5x4+;PEZo}u_Dz<8FMi+Jqrr1uEwoSvA7UT=N6u)R^z-F zY1L<0P-Frb4($jyDL+c7!H_$LPYBzdGo+sa1M#pi9IU0zy|&-NqM~QdfwX3*9BB7_ zBWIQ>GuH>$nt_xVcu8EB7SrsN;*P1tR)Qqr(p0di6?S{7MShS2;#MIrh;+EdE<=cd^+bn{JL`82X?oK+9L!$TH=#gkEKF z-~ExAUOBR%CqL?m-!TU1yO!wJ7%K1S>j&|R<#E_@56M7;?2U&@u+eXIywR82wLtKd z3dXI6Z?jL^3TSE^>$fF-daVVBe(xj3x{iaaM*!XZz=Gr+Tkij}Dq-yLy6n9?cJ1e_ ztnpe=gh7ty0N0?Du-SL^F`$pfO&(0bjS*-Z2=VRLmt3kqHh zbjd2SFWj!lG52_TvIRw^HFSbv%QoeDXFU%7o8=}LJ%L8>305brD~tv2XvnXOtmTu! zIA>9Di%#l3P?`OFjk!6qxqZ<_+h_LWE(*lFz>ZXn2>Xm>o`92%IQ2oV+IXV+rJ)oN z)~FvKuxpdHTL};HG?sXR#p!@(y7j}ieMo{&(DgZP%oSS)e(xU=r<`5%{%dnhmwkZT zH%!#g!`$Zit>p}lYSLY=HcG6OysD$Pz~;PZl7H@V_Dilk-$el#ex#0j|6_~D&|$QD z#4q9!A&-bV<(uNog?+S`ZdQH*1)v37(vSL5n$@rekJq}oz>m;zdlN6~F>ISY1|Y-x z>{Wvf&_BI_ppx66z@LM;Hm+Ep;0AAcZH;wgZ`y2dM+2UGepegw2k7nOm2lL_ylEW6 zu-Kzdb3e0=9WMN}opie9JQrn1eD@lt3e0vwWQuE2gYQofW zN`0~bwj3=%^?ou55K|s(^=fla9BY}2g3e-s52U+zs%?}{wxGcGu;XpCH{$!gNc5RI zZYM4En0M~Yy`^X7x5P!e2wL&FH*Dblv9^ryA$+he<$1jkaM%(1&p*Gu z`{n1K_2Yma?>_2DWc*OzXT3;`mv1H0)d>Iggs!rE(QQ#*C`nvzeu9&3>FZZ868K!DA$p(&u!_gCBIKf zpVI*0nY(&*wap!qL1{kEwho?rcY?)4mP_m@f4RS&bU|@BoKYeU1}&NEa~h3g>m`hE z#SjaI3@XbKT&a$u5diK9!adb8x>{bGDu(#0X4EgRw}s~TWhCv)thL8RNrhd3HKW_s z%-QQ}F;g&qNoGg&e&oqn_n&#T5;0d(z8wWFXS9Sh9w4Qewib~k`Sf3Tn{^@>M^iVe zO4O0i$2?4Ox=P_i2Eq8BHzvfcC7sABPmsfUv*e(gL{nKpU22=5?h+T@n*m%!oz%j7{0k=3RL6S3J(m|N%I`a*Pz!6GPAj&Z>lJMkBI zh8jL|bCo8#I^(_+Z|Xg4NfJv;)pp0G68Gu_ix63|HmmXdy%YLJE?;xolIr;3iDWD$ z^7}prM4$5`c9Qdxo+$Nd@w%VAQUSY=$9Ld}L#VvBH>bIgD*|PIKzzNm1Xhd~UW z-)?a%op6Oo1;cnx)gcFn-ZNCj)zK)qwK(WLwi@G+Y!E9^_6s%A`y zVzy)8DpDzOkcRF@*RtsOLLt z8lfu^&WS@dxyAQ_(2p46Iq&}U3JcJme7QRUigN=R8yj}($-{=oF$sq|wvQDDZpU(< zE{(l@uwHcHB78$F?UKPbbNA71YcZP1H8x)n>W!o={A9Uoy--UyPsj&qxwd_@!Y`C(Fog70cj z5x10+x)pQs)}=;Ku{W985SKsXE!d=oPFSm4Lm6TwAxxLJF4>@`Jul3HKEQ$zHsh*9 zJ^;ezd-C)=GCEH2#E1*qlPxF`YX)2eX>QkedrlC^DUDR27geXXFKo)e9oEHaD-JZB z^#GL^3=d!k6E)NwlZae_!j5(!r>~t(&#`fpue4RnUsJux_LCYa&Ss!nj^HxHJv35( zlbFn2vY##ohy?LE-EQQDO1JC^Z+bD2v7q3^$v0HR^Qp#Ky~a#^ zko91&6=M`NMO+SaRo@uOH~0Db$MuY7gFi4;yz{n2n`L&}m|L6N6|W5Z zj`>yYQn%dFH0A)t-?GJRWLza99Al)##2bE9T(>(hbMuG4S6VQ>E(?l$WGp{g=OseV zNfrBPqbTd@ALJPGufY@fVXJW^qZ>`ajpdfj8%+#&-Kr~j<#r5D5+m{I*Y>$S zUSEFaJm);;+~?fSeY1^*re$n-8G2^~Sh;01*nb5cl7=PXnF^pmVZe*rC55yLBS{oj zq38=1S{uMk94h?r?!ihLlYh;zuwGt*Y;k`q{aFh!Pg3x#ijWV%OFmdU|NF73X#XOv zu<}IbzDs7;65DIa->G`9>HHp`;4IBZPvY~YmU(-Sr-KEtNfU9TFEM57t}~ zb-K8r{KL=T7p35wKji@l|8cam^|20V@|oM&C9^YA`mh8ul!O4*DOt&=xewOQ6TLwt0p)ScyoB`G{8gGKHD`cOQ-S|n$<l-838{GriHf=##%eyCyM52gX`@Uic6(!QEq^F1T76zk!!`e(%qp)n z5nxukgn1QiFxAyGzFp1UA^h0)jddh-Y(PRZ?YWblt8X%MS5ED1y7f1%lEW=l58}M< zC+HnE-uY?5rFRJlKt>O`OP7@^Y-j#{-g4M6@MkV-^)Vnw;BCs3<(iy3t>3x~DGMiE zx?6JwOq%>xQRZ>y)qCf7*X_vQl+*POkQTA~cD#{m-VP+vI{>)_VhfDGyM$V>$&k3Y zIDXmrgoh+|7)eDern(C^ZM%!v8Xfl!IiGHCSL%R1Lj=Pd5a}rGlaZR3>7p`_A?~^{4F3% zh#pbpb{`?ust*48(Aj+98OQ#JjXJxET*cO-(g8h@`36(G$m_qk=GtB%D*U-xuJ8CqTF4NQGAg)&Ghj-Dn{XURlty)*qWvf`NP*^)1L$hT4w_wOeG)Spc^J0+D?ZZpgm6K{fXhsVrvLAUSEy zH~<99Jh>@Dm=cPmw#aQLcodIJ^D8i6P(zi!$}z1rkc*JHV;0D>eR#+G{2M;iPSpDo zCU=;y1C!h|^z1X{zrNZ5R>ymWE}169u)LFBEiB0x>X-JYgcb3CLf0sZ8}5^Q<=Mxl zcHto|Dp^P0JWpK}sjYxcwqJfw(m)KhI(vRUh#>YhsI#-+IG!V0up2N z+cVBSzSW<2Zn&gh@3v39^eoiu`Dvi*48vgVPOl0eTFtu`_5koMA0E*U`1;u0{ z1n_;c(aq)>2OSh1!v{vChblsY_ggf}ZPij~L6@OX9$-;tX`o9hdgr`F#UB|K))`NT zC#r$@_s>(Jhks)4|E^u7QvwB6?8||8;AYJ=v1Omy%!aV@xOM{@yIi=Id+?oa*UkK1R$z1>8@90D_`m)S z*HxO&;Z_BmOVKgNSPv!lzYT(~P1!`@&kstZW6@G?he@tCnrj%o$)XjSu2HI(8TsPo zWz?A9gY$G)kA`7O`Cgu%?ieF-5twBhG?NN^@wLH?`$lp3yVQOB0|_&_~xjw;_)+6J5_7IuGvGXqVC0qoT~+SyY_`&RhZoz(Drzsy!{ZEtwz)V)ZfQ-y~Fz$2nQ? zJNQXAN8W&d;Zk{ropy;0IWT9qBVU14J5xIWPzvI{r{fXJGl;wM~Y^P_@%ZQBV^E zYLj08nQm+Z{_L+Y)4}-(Ozw6H7Nk6iwlfUwl>$EvE@o+_JZu?T+f&%_ijOPCrMPnS zdtsx8iVR}3FBPJW1@wy|o(*01>%_mm#a~z}-XU!&^&2TL7)7nU2-*0O(PxW|7=D!^ zuZS0LO-1z}Z9X|F^O7n4-15slm_#rWlQqu-O;BLQlS3->S67{1o?!a&&?}uG@Q9~? zdzZ!Fkv9e$r@JZLQRsYDp@7;1UJd9S0qu;RL1caTr8irdK5$x;O?&TE1$qRrq$<89 z8%Nv5S!|4~6Im`1E6aVIPOn|a8 zv8yUjJCU3u2ybup9gt*J3{MMG8fjR& z<%wauq=Zm9o#nZsSMRSEV0bml5XHFB3|Q%fPe!v{wYl@smrY8wlRA+l!9HEO5yh=<+p8w92I{~WwJGk z^h}?n4-q$u259>mB$13Igym_PT-{|aMXU4vYl?YA{o71-*$l5Fhqx{xu+(=Khs7M; zO|9_j9=VbLP5I_02A&l1M>J|4o;!_TtWEg{7hPAr*lqu-qy3Ppnvkvwqz!?u(&oeI z((?6uhO4%VkS;>GKFXJUhCAd3{(P@%UvWoEeQ_&%@vJM$n-D&i7~Tba0Vl zGShImfM*ITm07;q37l>~57qmt0^f1G@SAewN%qngj-OU)xfj}gw$*5m=6BNf@r4ca zgJ2X{lGSrx4~;23&v4V^v$LzLWF{vds%X}RUQ>PaI+S^|Xk!~H%H4rjOLxJHY9m%C z79puX_57N~`nyTDO{YDlEWhWi@*L|lnA1m!b;N{fR>&Sai8nLRVGtdI_s91NGoDGA z&nHfP_Sc$65XM{qb==`ouE_}g$`Z#6omY>aeAR+@q^5L0V!@&wANP9|4geuDv@xWs zNhmvoFg6mamPwn&3TwNMZ7*axMuEjkl@gJ5pS0=vDw|VtVzz%xkBo%T0Xir0S>JIs#+;gbn5IM^tM@Og<8gtx}e|OS%v-lcBuy9LUE8cc+~uyRieDyMC~k zGh6uKcQrb-u$(c7DK9NO2NXd6cOPR`1BGBEGHa`%=G%FFg5mo0kb!>yso9>h?t?}T zb@u+1s%!tdBgev+K)mO2{I4B)vS#`Gk`*817{KTG7YD+(vZ-R8g`P+S{$)J*4!}H~ z4}^nbgB2U(>E!+b!bmzsHURGqysPk+k)y*&{7Ivvu9Wv8_g3~_$Wsz;hpqq5Rw3?R zcggxE4L3Y*9H39C_ZM7bq29_E;o4mFe_inHKWP#s$DPuIi2o)bth+TI!f2)s|Jw)= pE8YB)W@u;o5t1SFZ=NZyU6JTg7Pxdl(d|UnM^jBtwOYkC?Ef5zT?POE literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 634ed9936a..9673c7aee9 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -20,8 +20,10 @@ /*all page body styling*/ body,html { height: 100%; + background-color: #f384aa; } +#C36891 body { /*font-family: 'Raleway', sans-serif;*/ /*font-family: 'Dosis', sans-serif;*/ @@ -35,13 +37,15 @@ body { .nav { width: 100%; position: fixed; - background-color: #FFFFFF; + background-color: #; } .top-bar-left { list-style-type: none; font-size: 40px; } - +top-bar { + border-bottom: $primary; +} /*form styling*/ form { @@ -85,11 +89,23 @@ i { display: flex; } -.description { +.thumbnail .description { display:flex; flex-direction: column; + word-wrap: break-word; +} +/*merchant grid*/ +.merchant-grid-x { + display: flex; + /*grid-template-rows: 1fr 1fr 1fr 1fr;*/ +} +.merchant-grid-x ul{ + list-style-type: none; } +.image { + padding: 30px; +} /*cart item styling*/ .quantity { width: 3em; diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 066889f64a..05fa9c07ba 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,33 +1,33 @@

    All products by category

    - - <% @products_by_category.each do | c, prods | %> -

    <%= " #{c.name.capitalize}" %>

    - -
      - <% prods.each do |p| %> -
    • -
      - -
      - -
      -
      <%=link_to p.name, product_path(p) %>
      -
      <%= number_to_currency(p.price) %>
      -

      <%= p.description %>

      -

      <%= p.available%> Available

      -
      - -
      -

      Ratings!

      -

      Reviews

      -
      +

      <%= link_to c.name.capitalize, category_path(c) %>

      +
      +
        + <% prods.each do |p| %> +
      • +
        + product photo +
        + +
        +
        <%=link_to p.name, product_path(p) %>
        +

        <%= p.description %>

        +

        <%= p.available%> Available

        +

        <%= number_to_currency(p.price) %>

        +
        + +
        +

        Average Rating <%=average_rating(p)%>

        +

        Reviews

        +
        + +
      • + <% end %> +
      +
      -
    • - <% end %> -
    <% end %> diff --git a/app/views/merchants/index.html.erb b/app/views/merchants/index.html.erb index 9615554f54..69b4fed15f 100644 --- a/app/views/merchants/index.html.erb +++ b/app/views/merchants/index.html.erb @@ -14,32 +14,32 @@
    -
    +
    <% @merchants.each do |merchant| %>
    • - -

      -
      +
      +

      <%= link_to merchant.username.capitalize, merchant_products_path(merchant.id) %> -

      -

      + +
  • Next
  • + + <% merchant.products.each do |product| %>
    -

    Best-Seller:

    + placeholder photo
    <%end%> -

    -

    - <% cat = merchant.product_categories.uniq%> - <% cat.each do |category| %> - <%= link_to category.name, category_path(category) %> - - <% end %> -
    -

    From 394fac54b6d88aef061a8e40a6887d8593797456 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 08:29:52 -0700 Subject: [PATCH 168/236] Add favicon to site --- app/assets/images/favicon.png | Bin 0 -> 25636 bytes app/views/layouts/application.html.erb | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 app/assets/images/favicon.png diff --git a/app/assets/images/favicon.png b/app/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d3d64bada5d543977a87727b6492a939b8f4b15 GIT binary patch literal 25636 zcmZ^K1CXrEvf$XZ?KxxHwr$(?8QU{wY}?iu+qP|c=fC&udv{}ZJEEiOt5hYvjH=A) zaCuoVSSTzg0001332|Y?pWjyi06=F5u%FQ`S`HBa01TCdkdVBDkPv~qqn)XRwFv-# zczCiJxVq9PTDDd~T-*#0VjPkua-mvTo(Mu59IGIbI0XY42qIT|>5is+oxX^g2#R(x zQ6#LF1`4z*enct7xnW<(SO$rIweNM;b=GwT*Ef&TQRa8%MAigAE?z%kq?0@>fTM^< z!b&ZHsiP!S;sb*Cs`;M##8>#7 z(|%r#%n5_a2@yi7KEX2fP^SIwU&G%i8#t@-Fib0@Koahi+-4q|^(CSs45)if`46S$ zVNC?xvp zQ8t_jr}m^0i9_A*Uit{fI%|o#DGcKHRLQ2GBXAqH38%s_8;8?hISd@TC;9V@7p!uJcziG6dWKP0MtLm!Yo)XZiIA=P(S+6Bz4Y(Rt#d{y)wWr zxjpXp@$QL9Su?mIa7AYIP8m(A1M3?O*NR>sxeCXGE)N+Eu3LvNLNcI)GX}Yfdk6>bABj3 z?D$1u)`nnm0K4q~1Mx#(K<5i^ivuPaWP#deN%lI^Lr;JY=Au*rSoMO{f?9)j^zqsQ zF#DU@17!lD_o3PYZvAp`}@AaLe~Vi2Q+;qFDb6ZwimAcYSQQHoJsP3!xZJOl@eNp$B6RG@-qWP zi;?H0oiH~d=!DSH<|H^Kw|p&IIyruUjaHZqu1r%DNssO3vh|Ie4+fn`a-xK>_IXI z0sf8Km(fc`g3Jgx4>=g*_*YgCcbECYwH@L*OqeLpT;#!jTNjEUl0C6CsWn_(id)v2 z*cItroFoBnH0D4mg3LkOqtI~9b53`TVNOL6{WLJ5Jfbe5L9$e`JVLxkyhz(5c1$6; zf=W*1Z4}EGx}J?AeS&zJfR6l{fGwUbv18;DMJ57uFcnE|G=HL`vS2}8R_RJ%tF*j4 zz1*`bMh&%mN=c`rUGFjTOlUDynWmg3StLt5Ss_)yO(9mvPHB6_oLNc}fF?ObOiQ#P zKdX=@*GImff}^x<(cRK%k!s;=vAVoVnY==)6uewcl}?#Xjjz;Kqf0EX(x9wwZpVCL zwseNQ(m|;}F0uNw5VI<+qD|Q;_Q+$>Op}C0stSQ7dr7eBQj@%i^Auwpzedoq(SRbG(9CGIv@|uyG-&IsYrRd2tOlE@8q1s8&14#$ zTCz=bEPOUY%=ax4Z5l?8B4{knO{r_EYP+mM*V@)0FIiWcqKTsJut>2~IL?ZB7I|lQ zx4YNA@__pZ=kiAK`gRY^?`O*j)M9wK-YN<*jAHiThC5_6WsR~TGSf44xz;(IvZym_ zI%c#5b&lGZ+dCbboDMr|UAqoN-LQ|FN2&%dBRfJn2D*m2*84YzCyfe*W#nw8F{X>M zk2@iB1$3Rd(z|#)JG_oP@Nd4>hquVr&0?n;7*vg3j9jBmA6Om_Uu^F$Z;alGUTq%F zZ`f{+U)0|Cpy;7@Krdk2vCNVGptiEzn8X>yk(AP&@Qi1$WVmo+K*K@PLfXR4LPI*$|V) z%k0lM7!6lpxzUXgNun$wz~-;cR^(p~s}D*?z8Y~mcu%}U+{zhd8JZ1dNB^i4zK;A% z%S++w@v#YV4x%9_mG8MXFi<}5EYT-nB7r+vkZ4A(Cp{~NSj=3UpopyGR{SIbkydLe zxGdZfK8UmYMfthiKeSDNFGsJN8mdg4!1+7rb3Anc%;`o9g$#$D4fQ(MVAafwMv z85Ic`DPHP@q+@7V>6Xk*`j#0hvf96{{v7exOg8FD1R0m0#LFhI9$EAYJ&~q0U7)Y_ zd-r@qe8A5mm*D@J`GtV0oo>KoG#XVBoEO|PIbh~!);z(O#^SfszZ%fcGAVFWIBk(; z#p<@ZQSD)H?>b#FF`fNw7H_1WF}n^b0iBM9MVr}Dd!JgXS01?-K|08W{`zaJ9z*Y! z_D1`F$>03p#ddXC{gHQ@)oV&qQd4~s?m5viOEsHbkKyMr>~B~$s^3(WY*^OX z^|zm7Tg4R_z^u#G3>%8=hx4ktOIquHn-|qIRa5N9ZKt=tjK%h18hSjwRGXCi%uc81 zI)pnoU5BrDRSp$YnuhhK?<^ZNRX4lb_O__se?PMo7LAsaUBQR)xw2$1tKrOY)PGPM zp8PEU9)^m2#6`!y=7{&mZ!nP@-%K1OugSskD}QtzICU};oX+INc7Iyo*mjyc?wZE$ z-toxW&3_+!ld?@c`*MD7s9x-9`l=s39HQ1$OJ5sm#O*rsdmL!mu`;V}sL|_0bSbFf z$@^TI3}@rAy|v}($Z~pL%=+N^bUWT8-k@%)ap?I7=nEY4Tm7hL?(fE8)W#T(>l zUmv~nzEyvFaa#UM-bj8Z7oDTZn;=cgWi$2=R z|6LpqK*vR}x(CgKaeS$^Y?tUwR{LGTTBz2dN0cjLtNb9jKX7uRqC06-)C z=L;yINOA)J00d&8tnREXBh6`KXG3dXY-eaf>uzKJgAD+{?aui#v@vluAaJ*_wsqok z=OOwR2ItTCpJ_TGf`6enTk#O7%g7T5**TgJu+TEo(i8DQ5fBh?I~tpEDhiAK7x~W< z50SaEvppvrotv8*ts4`qoue5Y0|y5O9X%r*BO}cZ291-4t+RnUjja>$znT1RKEftW zMvfNt&K7pI1pn|gFtl@V<{={bN6>$N{=H5UcZ>g#Wb5=_YW*lk_YZ`QftH@`|3&6( zVfz0e`v>xGvVZCIZ*koJFyoZBa5u5m5Vo)}v32@c8ZQ$EJNLiD{9lm&S?GUIs{aQi z54WIcF`}Stoq@qJup%INNW2j= z{rUY72oS^}Xb>b}ir4*5{~X0YW1z1(#z&G=Jk#o|XI*!(Ai2#+v~yi}2_lrYsJs^1|> z(KM}oQA6&{+3n+^i?CvSHDxok`MKY25c2QjsXS78$UH5B2(&^~;HxN3+d=_iwpS%E zwb^#iGD7I34_8`MOne)_Oo4)tS-J!UMu$Z$QO`?G9gOXaNGU)D$hC0bBd6I15cscm zP?3}=>!_ohgK4Wb$FfNdLu}kd@4Kl~&B@phw`wW<`raJM-|)Skw?){I-hyTSP(49# zzcoAl$TGP=EbKiCh7yXLXV@5b@g0Q*${g+T|4SE)7H}Qg2=_*!<{bbibs3THo6Nvg z?fJz;4un0?Yp>5Q7$X2@Xky$EW}1!5K-sMj$3~yr#Vu$19TjlupvSOpn%Td13}5>h zx6H(hkW$d?V4<;h_kw%38ZJ&0hSe<$4bk$YYxDA>Cs;M8G3 z_V(ILk^a=OBM~7!{wQ%?D$CXo&1$um-!GGrU0?T>^BcHH1WBz)CQj{rzAl2^v<+yA z55*gV75R}V?KZu3NmSc4;xX32G1ny+vd(vNg{5_se1G zz+iiD%~IclY24d~&a1jSn3RG)El%s`PX#}Rfewh-UG0^w4GY}z?vR_pu8CM0vnJ)( z-TBI?WHM^?p*qFD`{TXP-m7>z-}~-nb78B-pA8!@-$bjrBh>I%w zDPMB2H>ryIKhWewmNt&!fyq?V+T**#9<5K6A!~~x>O&bE7aq*;DqA**1SGV>CjKGm z6&#A}iB{E8eNO9$_;tywe%|1TqsF9!-FuE8*R^mYidipHZ`&`3U4Oea-@k5PrIdP~Zl<~ys_r2@ z(Gu)QZ-LT()cZli`Mi|(?=@J(P?e-!!GnsOVY(5_g6e0Eb^wIvJ;4Xy$4I)-Y?IT% zEOB-cy97Vd*Y2}?y<_~mYp)qIRv>q0t7&!@h}UIJk88Z#`kEub${LvWqghV9$tMp2 zQwN-v>{W4_V=HlNZd^I*dNh;<_;~gW813kE0DsWz0S!I~%f6B?kh}~RQ2jbmGPzy5EnPcSY1CAPWukM2IsW}*5I$h-}+tV9bLT|gTU(yRzlGh#7|xcD zykJFO6^UpGe|7UAVsiZ0OO%g#X-slxuZP|6173EK1zn|a5Ohe0rJ6E=g;g4APa2O5 z7qimTnvaP0YnImmZ7tM_5tSKZBos%^7Q&v)4LC5zHI`o%wBu-!XRj$5u6XtNNI%-y z@wqCjvm^boa^xJ!rlqxV%VF-kBP$kt!OCmWt2HKihBcwDB!Gi%S8!zQ8<=Ph?l(fCe%>6>ds#_Hf8q2 zj(|QnF5(-fGUw$Cj%sM@>K%6f6X^gyHF1L08cofMZKd6;3?>ivXS*6rHT7w<&N{8m zl1j=_I08=*CLZtHbm;93fdlEQ7%)CNvD~epke)WpeAyu4Pp*w2gHm%U|=>b$-Rm9}(yY#PXQeU)lqpVWag?d{JJsK<)?BC+l5 z^Ym+!$2z!c2tgNWCRNtHaNHWPGrJ$Zt=;Q1a+QoduCuvz*j6^2vtf`yZabbALU))O z4(J?7<2mSTxdcXv@0yf62PaLqN^b*VL6 zR>>lsILrxai0tpc#a@L@Pj>~N zDWN7snC7M&B$LxNn5hHLt1bYG?=lQqFRPaGdQ&rZzk}HeWeN)vbPx!o74D%lZtM2B zmXMvV+tr#&*RP^V%zSSz!Janp7uQ^@sYN^Jq`XX~Hb(Zd{Ga^>QJ<`hz&1ZwEDkW%gB;)rb}!Y5M9pyDtnMh3*q7Xl;P z`m+;KJtf+&`+eXONeyDc=-;5CzQB=|j=g{M7fS{`f6{E78cMN+Qr*LF%Tt(|{!KvG z`L!xJgxFbOBua>~+MtMb$$7aO3c(XUESJ?O?J{sO%|s=?L;Eiv6NHk}1pDByBk5{{ zIL%+htpU-VMydC0z>B{OL2S0(2umWOpImtqs~yPT=d-KJ48niXN>^i@I2Km1%tM>T zJ0f(FR8Y}bH64LH*)u3<)*+$5x|_)!AKy5t*}iUFF4G+mB8Kkl*w5Z3wN|G(G&A3zBr%{c+)}0X zg%s>c&kv;W&hSn|K35N?PNf=jzAMdxS9DR38Dg($Oh@BOQTo%gOKRLDV6j`RTOQ{6 zu)^G*MY~-MRG^vg%A&d1CNoEUe1w>jYAT}!yIp#NXJuDFVB?EC6lWA*F3QkoXSwsB zkVn$A4fq#n;Yu?8s+sH|SHy&w>FXfY)SuC9b&L&$DMjo`UtMbvh8Q zLtzU^N6=PmD^Z%vhAO5GfQvJm-2ntZ4;o=Zt+b81cHmh$(o0dC!H05=XY^?=ff)7Y z(R4Ql{8&>wn0-6jk@dD|GscWMT|+TUV%FucP|Dx)0O|QY_Of#QY!Og1DU^F}grjP9xjuUPe8ZsyRVwcJT?X6Y!-#Z#oFBI*yMHgjaz zCgB?|PPMgY-X~ocOW!*#;O@wQ*kK&`bL`*d%Ue8tkvYmTXH#lv;eHl)3Z9o9r`DIoeV}6><-goeE0ba)kw_HCF`0L{mfISiXw&+fEF};6EX?tV;O{@W#h&3vf zP5ZY4?DC;PlZm||{TY-A?hm6dUsueGTIZSvK^3M4NJ30RoyTUwW7J(Z0JA%U$D3Kn zl-E1jV`>i1HEMsaqnJG6-jj4opYH}smeFb(YAw4}(2PI0R6_*_C$%DWUSgK}Pua}w2%gEH zR`K50mzzL{ZSJb-35>3rI5Q{7KPQ-Bz|RW|vEfwd>IHe=wkGG+~Xxb1q%FK5hXWV#0j8RZ4%Om(c^6;~1~H zqmWT*SCU2SOIO>o?U?I-o`$`AaBC?GJ(pawr3mRLj(1c&YZlbuI)LVQ%_jHKMcm(kclT4);u<1DH% z9xB+9-V~gI9usnFt>o!$Azp6t$=r9Mt#7}dRHQa;g?cGMo&?bS57)ifX&aR(^tj9% zLFub3P_I4AV$Y{02a%rRs{yhJsedmWl2+F?&>c%}jkA>xj$VD7_&*%0gbu1Njn}{I z=ZO(?XhU_laG2fccB;w7Z{8jf-qKM&h2PSap@ZIvu>=B??Mo1xMC42;_GP= zlQwstTEOo76G!Y%XY&9ax*7%@3JESG8zl(xQdL@KI+@OeMyu`aW@JQcgNR66&MoOBztB{bEronEr)@bQ1>UN5Ldj83mD&h9^ zE~dtliqGv6Z*;jv?;G6s#@SA0;GBPWwm|HZwd-?_ zE)-bI2iq4w)4tG7T1u*7c($9Bho=iJmWrF|Hv0px7hZ(W7vYXvHgiQf*qo9uFj4;! zk(u=s*EV_35o}rUnnFxU7WG%}98u~hH8r(QQ*piqkdN?5t#|^8o{kQzb1SLlXnT}s z0Wjuz$i&t{iChlY2g1U~ZLD8q-#yg_!3aLUhgKB+Z=g)b16VBP(xs}X+)SdtM6pG3 z`$^Z+`b}CXS5UnmaL^Y7WyQt6LqWNki{%eq?Y^rfsS?+n_p-6mgiL};O31C+%o*?$ zqfCI>=UnltHa_o9HdjA7^Wd?#%UXR?X+tURcrf@9m_N|<#`YQ{fl}}S^MmmLYuT%H z;U4|kJY=kzKm{buxo!i~L6(r_tYfBq^i+dv_0E79nWA5oehR3eH&A7>h=U==#9Iv=3 zkPm41&G?}eg#X*y`-mPd_zMC!z7F{Yb4@mH#keG&_)7r)IO4AvI7c8c-flL``dFr! z5%D)V9PDGpsFhVm4rMGpA0D3HhXV$?Jwan*qksRd|M%B(kE9VP0WKNm)5R)sbnrYl z!MI^vuRkC#23~b#d}9@|Bep$q6}Fi{3!veP&uEj&S#x zMsDa>LiecL?N%PsH!``P=jVu>g9hgyl8^ZStY!=?%rxm3Vh#r3)B=v^oq?SsLqkLT zsZ0(_`ZjIf;qMDqE*xHO^siFesGJxWz9{p*O`YuSH~Q!?UvS2*;Ea5eAi_A0 zfMOnRJF`qA+6_Ciw)*vD;=fHgM9dv;I5_u^5X<`Tcz1syWmLj&>(I&T`3jU%G!_q* zqA<|qd@1;$h+v4%`6SMpfN-EyGzncj1O^kx2Aq+Xpke+OKd*f{d@DA=ybMrt(JF1J z`4J4>Tnvooq2Svb%Y^46cOTkAIcjz7IAU9cXQirD!KCRqBRf9BFlnkbkWz_k@ZO%G zdb=~_1M}c@d9}Vyi3KmiN3B7>{>#noogU67AuSIyFYR>D#Zi)e{NM9g1fYWXl?^pC z;ZWBkMF9AoG@SE78GFr!5F1OQx56*tyb(s6{C5~&sW<)FVpt$4O*9N?=8R*?4a8cE z-N9?xmM`7w%L~V~O__eE8(noK4w>8M>uva#9GJjaEO>@bF(K(A^RO#6s7g#B0xWo| zA$t13xXPFkdtrb;{Y)IVOQ@hxzk!hHyCwGpolr<*vJs?5oetMgzplgib(YzXbnj5V z1b6}Z9dlj?L-45JKb4RO^L8Za?=T|8_+ScAMVqDe`921z9CdU9rqQ7*0sDlez3w=t zVuI4!i24ylIy~9VF#y;Jzf5Sj*oxJsFCl_PB?LDkz-`!?$P>ipQBs*VDQ3laEfV~u z=uU+QBS<=jc{sD^+oUh(zC{L0gf`+v5!lR;VjlMGBltwKx3KeHu(oi?d9tuUUpCjM zt0Jg9L68Iai_eL!{Lu6B$K~AwWyqA?n~`Y4yGC7*;oyB}v1JJGFG zKzFPwhu|?~1MI2jFo1sRno$G+xBWUg857G{a*_f{s}>Rv=#y`xI!`MBJo<8|3I96Eo3UHLqQU@~a&5gx~E%S!^ohq!z@d|%b7A8>8Q z!w$ClVD%9~{mbjqN16H+IGd^a^J#rh&-e9^w5X_P_<^r!jtF>(2eAQOeAqmRQR%QDVg8(DT8GLSS< z-tCMk#m9pK#mh~N{N3aIjJ-WHJ%c{>hpfvDbe9-_$lrS}J;@VE2={hbl7ftq?ShPA z^v3E8JWlt|3JrQufxSPgajcKr;#gep`3^l<E?FQj2O2|nd{K7SVa7q{;&9Yon zAInuLxIydzXZr9RgnCgDK`51`0veI0Qq!`ak2iWDC(E4rlg$SUmEZ>e<(46>lA_pt zsn_O`Ft>)@9n`o3NcMO^YC3FADM272^fJHWzTY4y&Qz3p4IU`pZ?rkJ z%&}s~jSAt)s%GaIp=+p9s-+?lL-eD+e z;ufG%ke`UWJgGkNqqVaht()`cFWlQG#-n*Z;U8O82N&dg;8OX00Fab)9q)O-fg$Tnp=CCZ!C{ko5*M1jFGKu*_qpt0nS4?CC6BubvERZc=c&7KX!?|(WUP^KtdZH2E6=-g5s8}?+n`srlVX7|LG zUj_L*!{=X~!<)i~z(`E&1byN|P4V5F@8=;U>6a7izqz=7i8l&Au;fVq-`Yr$mjNZvAc-OX-qoOZ!=H^J z+#B+CCSi2^Hh9pjDmSsH=_<~PA;&` zQC76dj%9gY0hacpOX-48)RuG9EJIBvcRYzlZJbIG16Hg)|8@X{S)2(f`+6>BXy*sN z-pc{}HcBGFck;Bw&~M)xnZ{pzJ)+JHCV#D71|b?Dv!^90d+&eq`cnQqIAPBZh}|1= zWry6wflaCy?#JZET)5sQh>bgNPvBk}fKU4^&8O$sZN#H{w^ zzd{wmZ}n$ynU z7Q8J1po8^B{Uf0idBBvdDdKZUbD}9sH~Eh zL?-Xl<+8da&vx1}Z4_B-QV@N9-&jqBWC1z8E%OnTF^~;s14hP!Z-0v4-24#?q3XVC zl=8>-QiutBe1G^+Pzy@c-Nr@BAc;#IHnCx&}Jko`Jjgmi9(ZnV+kP zuxuL$k9XsARwZUl5v~BvqgFDRwsYC7sz?m}q%Qv4ho}xZG;)LI(K-rwA`Gd}b(nj|&W{adCUF8Doj54V-QA^Lx1(Nl!Li1m>!xDiWmx`M($& zwqa3gl^C3>Awa*f1!DmysT3%zHe8KoeL|M?*!)hi(~KHe;jx%c&hvyqtNV2TCn1lM zj2-VxbEQlIW_ma`mH4$p@3uUiS6?;}2;%-Mp_9enTHtdy8Z+Q^#ILr%Vlo;(LXv0J zf@13Wloi0+s3weB)O@Hn3gJ^7X|MzBhWPjC>yI4J6o|#r4iST=`Kqa^E_oWi;m_1b zju@*-GIB_SxC{5#dpRXr!l%s|0)#_I!mtR0?~V_};Cks#{9*V<%)|Mz-DRi8{n_vE zzyxX8S=d;3vfEDDOJaU4`NG!_-nqD8;)u~rE^yp&2v?lN3VUI`D3~7fG(YU>-Q{f0 zvof&_rgDdBl0-T&AUefBab43Lh&V=ws#D7NK*-f6ZgFDEjHZl(gDG;Zhg@VDw)0sV zO+dy^UvAetw<3Ics@YifF>2aYrG(Mz{t)iDJcbW52!!0)k-E|}v_uX`)hhyICCNfZ zs=PrgixLh6lN9fv)$$m;c}%qgSw>pIKqT%3c_WnsW!NNAgVt-Z^d-4J^n}l?`!VZ* z#2>N1U@+>Th`+6pa^)Dv*wUn#v}u>&B@qV4A#eZ{vn99;5DW4A@GMJZ1gdBr_`;-@ zQ^X^uH1yz}(hWImJ(=EI?Re8+WnQ^vI0})ZL=5c{as0AkcWg@EKT`8Dz z@99A>WzJjnDSCX*7RugzXp4k~^t^idVg3Bz@VHmfb8_UCz$03d?pl1a@sm+z_R6<6 ztn$7!{F21%_2>!5YlevVezsgq7`+BG3-~X2YQ$X8JFWD+j3_xSZ*!ToV?th6tuZw@ z%od7-F*on=yA5Jd7`? zZbvi|l0j6SV&@J_)$;3k^i#QnQ~ozC^a^{R+i%eTXhl;~Q)ou-(}U4O6AKZ#6 z)aAXX}Ljh0S(=apOCm+^9#SMHuAl&`2ZT7 zQxfyrkI=R41)N-6pOAiO%*GDWHQw>*B7|WxLx$)+fpEIYPm!{7=o744GvXdfyhAXv zvZgyaIVJuan)$GNxF*=`cX}n%v>ilt&lW38=0!x(946CQikYU^3r2VC?Qx$7IH&e}I%2@f-X*?sul zOLBZU^H0RThOq6#$+Mj2UW0>!(*oFn`A(sMNX)TocUVujjx9MT0_mn-5<@r0R6cHE z1lKLU7AEdpgL|8nb)j1}9HBEE$0+$>dOYrrsxwRGcCu6z6$O=^79(N~gg1W9+kRfJ zhpFGwr_NNmtjW{!3?PiAx?ue^-kPr3rD$Yrbb8>2*xQN~?z+|Z5E!#oG`0%BRHGwu zi%UyDwpv0$LM_?LONK`t5!V)a&a)!d(mA|Y&2#RGkO41wN`zLsJmrk+@!9mADUvih zgJ8b_;4&{`S1(;X*0y~6#vx;#>W4D-q+_fAhjrXGA4$)SJj+t_&S-#85Da$ydJz_H zk8GhW?%zZ9%U&?RPb1)f2rC4YWP3t&e}8$Ycev7U-%l`YR*jnEn@(lE(qxq~7K!$) zH=ft@_%c<`s!;N=*IL$~&5@03zK|=sx5;fKs%8i(N^N?M%R7^mg+Vo~9fbJ2nl@m{ z{{drm5evZ5?+m0}kNV5uFc^WV(Ymivj)i=++AtiVz^WIJpw0#2)xCW2!(NA3u z@9>=s!|nD|P?BGMKGX}nBNqY!s2sx)re$&GEO&eAsTFCj)O|a}bq&I6V<%MT=0}+{ z+k1ZnOBIMbSQkk46l4F@NCYv{oHn?3KgHZ}Q9u5*s#<3$9fK;aj`+_(iw6o~Eo|4X ziZl|~U;~_egG9so(v8)D!k8C#)Npv(WJuk`Qour@0&R!&4h#0<) zayIJqS`+ls&jC9W-tDwYO?Vg?erK&q2c>3AJjP*GFfTxA{b3?K2Pej9bGoQYd}C^(F+{=r%Qw}$_5;9dfozX$yXZ| z#FyPr{M@oKiE1F11wuNynu;^5nWGPQT)T1>ot^+HDm&8~(PjwHN0|PbsYFmQQ2b9= zo&@`Fui==J2kc2PCR1&&(|Ot}XX;Y)nf6~;&j+|JqykkbYERTat*Ee#J}D_FU|KD< z!L+WGBLfd*nVFecJ-i+l(h8d{R7fRfpSRNmRkZZoS;T+YJm%`sZ@&Lb%sRSjK$)EL zqYHDpMDyRhC>cPkh8m4*%9jiYY0dI1Jjo{_);%VkQEC3^bKCX-UvIH{F0PRUqqK4u ze*=TzT^rp}i;n*=Wu|8J%c1*Q(w1Km&JY82O0E-iTT>J=@Satqo`W|4usU+K&G-36OLjua!##TqVsrGQRC`}A@GW7;)pY7LHtwB zrh?pBqXCLJ%0g!3nhdEbR3mUZmFT2rzbnwdfBwR(;K zX!rTeG|k=cRM{}qZg9IdD5A@>`;*pi#yc8|lZ$AD!00T_n5}Md2|fN=u)D|wBoy+> zH(e?rXmvCd-@3DE`>D@?<>g+&HNxu^mXT@Bhnh#=$-?wDTFi@s7ro9&(RJZ3pVh~B zs?G|3qP`C%(ZNfc)HECm-)4{IM`(j3k|U`(rHbD0pcmicFl(B|`@Cp3 z!i(i)q$Kni2jtgeA6;cJ&rr5Lh0M!x!Cti;<8e`C@Pq?mW?zK=A{Dy>U6(8(#J^1C zzYFg7%ZtMBAxM|eoCp88_)eYY`|TNZH`}!5BL_RT|G83m8|Sfhoi}|^!92VZR61+Q&hmw$rd}ogo zs=!CZ+6B$hp(hlCO$~X>A|&V{C74m$&lg&AI% zmEjyejgk=+FFTd0!(N2r7D7dvnFNx5dn4zKEhEAI`3su3;BTTF?kJkP7_?%k$(6}d%=hK)nQpCU@D*as-$L@$m5|ag+Vm$YJwO)6D)nzql}Gzf$G%VwEn72kD2*4vSvo{FesGiO31u>BFnir zDdx66k`4ZJCdffTCvpbkO5`NH2G>{&H()OkNWf}^Bk!EpN;o{OCEr&p7X7A3mi=@8 z30A)=DI5k?P0xoVmubkb(?=#3MpguzJE4Zwe#+appmmAz=}Ks~$j4XDkyS+qdT6!S zhK`-a!I zMd%!Ur6T6<^mC5C`;t|b^5(pl>;BJXr49G9QZE4JOTZ2bu@0taVV04GU5IEvFqmDcaPRwn z<3|=1!C`9V7j*vyw%JF>N!v2+i`(!%p(i`%%LCa8;(8fgm98k`bj?06O{BGTz*W6j zkY0FwIbOW!$%J)`PhY>r0#x_yM$&at@ROG!$B%mP*g%<+e7_)g3Dd#IA|zT+mrVlU zaz8=^95~z)qP4JOL^^t^!1=9k0Uacx1}3t{_1P)??khvPY4f06?9WqK|5h7@y{8D!R>jC1G6 zhA7N(2OQYB0{p4M`KOq;oSdDil1e>Aj^=C_@>NffO{gRQ=%#!jDkv ztAEZfC|Ffd(|JUR*%OgWIY&>d83kvyF)}5E+%Y*t{;3n97l3Vh`ykaQlq>AGI{%dS zZ6jP3Sb5&t`Pdjz|IWGQ2jd zYj`F?3tj+hKtFycjv$_JJ!6UI_=c15tOeoV;6w5sqMsIL*tSm(U-+8chmZE~9kgQl zP!GTAaQYEkAm-9E1wda1AMDG*zc-gJ@-N6ue{Np;KF4bwK93woEz?^?M{gFQ0d{JC z67!!`2cms~79310`WgM+08;jh|9U9ldp)S2k)QK4zNRwjGq~vm zh8Hg#dh=dxOKO{^NyINr5#L+3;_ukcGkRNE$mp!XMuMZS00hLLj zYyG1A!)B+;6tgF`P~9p;_Pt#Eh7t;*ZCvgOA7t@L5{2D*!t2c8!!-cUg^2F0(`{)G z;s0zJFKPeHWEUJ?Vn6^Z03m6vm*}Plu!OFaveR`^eRY416OfHSKS&~QbjmhPSV7I& z1K!lp6MX^zi{=c!1fLxGmgPu%QJq3QA`lL}M4G79@`jg}S2A_Df3B`czpLOW}pWEi;&l>XG*K_EINqw+-?7S`lL7zyP`9 z#s>g!wBgt<;WLojJD0wl62qj|p`}AV3kQW_B8kqOWbt0+Kk0;;f(LG3pg`Bwk)?~EyX9I(M3#fO=og4rBun)+}1O z(TS7h6N>Xbr5azdZowVgO@t|YRtU<^`n<`p6vhO7(I0$N`3EDf6&9N1%Qe0Fy21bj zDVeDi%lw|Pi%4I%W%+=O7I)J`?dv5E2e$-M$be;+kmFJ}XLd~lsz;{%oy2M6j|az$ zuDe{>XkXBV=&AL@v!k4cms1ZiQ_hE|6{zh_9>^*d&6*(5)_vJvT)2HXi^aP%??={%^NVG>S z{P<2fv@g(T19dC_=okT+9d|vfkb#NOMu#>x-0!Yxl0q0cKz8#&SsWL}kV`Bu6y69R zC$NN=YigA5cjw6R+X|lI^A4$?Z6eRiKHyWDuc$qUxcEpMIXI)SaEii$k!I%L5`t9L z2(RaH0Rg53SuiIUM%Q8-t!%?h5n?B$sMpe9%x_}7|23M-5i0QaD@(Po%x$1&l*gW)|IJ)f9}k0 zjn%>L6S0BHABvPl09Zr~!eNl(E63x2L6_VN?`;`ea2Yytkf`#AKbaao9X+|b4I6HU zQ#`VcIb4gs$%G<`Swa~~7}Q6hoYS&GPMj1ny7sE$G=&yWtQnb9n7_NKK^$nx_>gTY z>~kWj?H$pt7ArR*yBn;D^1}rN7gVCcKM# zpjk9Fbz9q*epVK5*zlwF+2T#WFGHgf15>+pDq=qDcX4{hy(`(U$gqC$`kvZt!u*k%Z+04St{RB_ z^R|6ZfFJgSFSDxY9oG{5f|A+VOIj66(b!3OAY#r^iTX=iUOxqBqQ5FB zla6jEnHiP)hFR(C>hXcUQsc$hL`yW)o!t8g_V>|rqxIc8fH(*GHl zUvL>;rVH$Rz7G65o$bHIvn^ngNGwE?Z#;|;h`#+zuZl27FJ62Cl9rY+vw?63e0kZV zay0s$7EWwB;+1j9_5vx!Ujngktp)CJ{i(4uN35bVH)_@!#lqF&DI85UO3XnEE7%<` z4h0K5)h6_Wvo|Z>$W5j5$*63jb?T7zy#sNA2NU9s=K#tR^>;pv z?D4>xG-q><6AWSh=>Rftw>7uL4#NifVx(8#H2$vukRos0;8*1f5(tgS<4;AmwZ8)z z+1*o1$pJX}spl8a{XReE2xuJva$rfqwvKl3iKAzulgnG7*kzfhMjH$gNK@4)IN&nT z5Fm5@4Ujf;!H;{1Ct(o8=n zsTaq&-&5+`Ab>Dlslt>hhhko5ExZTfhkAa0$l!pOyb`~N?!q~x>gDBd1k^ylQCB9< zLR(P4=AOuWwm$}+AmjCnj^09NeD1aPCQ7pMUZ=-#>Q; zg`aB{0aDK{{r+XB-T74~8q-c#jPc^G!Nu~i)v{9(R0$ksKzW`ji~UY53gANWq_ZIN zR9c^VMr&#N703EegLKNM>qn(L!j!Xk8$?-AD~&Nd!kwDfOG$ZHtfIdTr(!A zvR7`v9jX-f%C&S(rh>%e^u_Ba8?4>)J#ITZgI+-DwL~(fg(J|8K;z+`xNL#a|WWNU~hA68XGKprX9TS>ps1h~_m0>hueb%wXZoi}Zj(|ZJ2G^QC z*zGF0{b_}wFaHVEUe-Gv8Tk*6KoAii33~B2FF@_CRh?>0n|eNEVq{aArFKe8ohZUs zlb{Jjm`)Aua3N{jd^xT&g~N4EvgC5*qtKYg6=mFU;pZVj0QJ%iiMF}JYj_WgLiR^gKoxtX!yHF7K7z*O@+%NNU zjzG{6sLfdog`Yp!c|Sa504_WKEXQi^hN!4+?ge~{rtA7(a%>_=*#|7R9a1q;WXD8` zGDTnh8(d8_9dGg99D$%9&|H)Q1-R=&`swb8B5>+p@YfIfHOdF&F@1AnpoTQnTDIcYTgJ=3U0ShF$(g9|ayLdi zo#uP>s*U9OWN{fd3YXI#P4v>IU4&9O*~v{ipiQ`?R`Bs7(1OA7c;X1Cfj~p zh#ZT}y?lzJmU;RgAnn8p+%NZhuG&bh^Qb9NvB~n*M9OiecLK3C`y2TyOWH>~aRih^ zprv>pGWg%*(8})RQe3q@v#x-CsE$oSH$RgqLvByvK0j#;O?DE%4O;XUNEmjaCjlsN zuSCTJbgd)%)AGE@e{lo?Lx4OBlO(+^XHBO9XnQy7oV$Dzv~_w~_|>^#r+a~42n!~s z=En`0fX4mHppR?P zD`qZ-$36aoBhV89lG6_58{U)$i;l`xG^mgyJ!$ORo{H(|zDi6URxFPDfhg=C?IIF< zkd)IsIWagr?V*!Hy^ddE_k8@EBjAnz?S)rvc^}u|PXG-T?uiBy8dTCwywLq}py!?& z?SYok;W?VFhZ&pWZW`L`4mk4`c^|!_*H?RWp}g%;z5O$6xhfyd4iNL7x<&xsk?Nm6 zkv$QS#iM&7o%DXE+;~i7)qhF4dr@uYoXOje@a3-&BeIY>A?XbZMo(+n*0MvWEb}m6 z#0q5eu=~dO0uRsQ69Nosa2vMZqrahrV}ZvL29pK)oV)}FlUwCM#p7ncKNx3nf3Y(s zWXOByX(ul3v}f5;v{z>I+TGv!TP)8XAqdo=*(ePL9lg52p2#ead6$>-35-Tf9cVH_&z#5(jB#}h}u9fA7&8zBF~hoLENyZdGN z9ZEfZp{$cm7Lm#(!LDq1$4aBOUX>|=8pH-#W^|unFzA8@AVs$4^;9Y%r}z0E{*^O& zpx}n#a}5VK%OC&7Lt8twjx;N2(6FWt>2yzl3(X3Y(WwaBLR07K(W#~oUx-DEph1ft zgyadQcA}*5@Q-ec&e!Oj0E(as4QLNeYj7ILJ0{v98?^WVRJa<`@s=XLF@$)7A_a9Q z1V?hF%GaYqJ(~C#H+T|`=nq2DxOtuEX=C)-Y+R#rVO%GCBH@C};HZyIYw?bWwAqNk zNwZR|gyD-leK#vq5&2zLezM$S;R4XD*xp+*HJv~EMEXpuEVO&CF)_Mj|8>G;)_O;mA>4(Q9BgmolI zUH8dVQtPWg!KO~Kr)9Iel7tlRafzoACdH4pa^Yu`JSS8C$ z7&%@3IwPm!^vqMb-h4D0@;`V8MD*)U+i$cd%2PNZzC-O>&~#7- zAVesMq}E)U{WXr@fA{J^h&;NGA3-vD3RaR##yx7(WkL(q13Gm8r3fC>nS(EQ2uEx4 zu}Ca#)sU!J4AGAt`-(b>jVQzZE+*nH92OvA(K{%otqoSem#}7Sxx4W8aq3DZ$0Y#_mcgpn`jndOGg<`$I3sMyUCwlU& z*!T_;oXWXOy){iKU!%OhIP^Q0dH$ojB!?f; zT6N1zj(g=ecVT_hszh()MkS=fz;iMBWOO3F82{^JW=IMX&iZm>_DV=QVG%~DOw?Nw zBZFSF1+T+B@Y3&JL7VW8QPkq;KY;APGp1h(1J1caEnRefaNg%nW`FX^K4UTV_dHyZ z_rf`qKUL}@FMZ+Thn|32XK_GNJtvOd?umYr;tZe(FuDIRp=)TKw1a?XZ-MGbH<5+&&u`Fa2@*yN{}(yDl^N@Qd!Nl$dZUHkQAk9eNxs zgK&FojQnB{Q&R{gCb`;kk^irzf}QdQfJT37`XG7Fy*&dz2`U0j`8#A6+{Is`uYFun zbxd)Cr=U-^|C3!d87(m#Z-?r)>*I@~?@+69c}>3h^5_DTu#>?$7ru3YbRt?InG^fS zqk1JqucVQ^J>gW4*6Fs2BN&^yKvsoS$=`Q zjhm0meIv%VU!b)am)pza*)Ao1$s;)xG-&bt*We$%uf5SbrO>@fa`fLiG7} z*D*sA?JcRc9$op!n*lbz$H&^49HWoS!MVCR*6=-&p`Q#!a|}kRJP}M7GFfb?JGM@D zd#M;&uQlcGgx2!IKtXRvn~q*G*e-FE000$)NklD#M}F)?yh0b+nSAgC_r+nT^79lbH>`^xRBglUF${j- znFKj(FbUW)QKz9}9DC2aA^pWB_p{vi!yA89&96hdpl$Jo&HXByO}HV?_?zfQpWADT zp=|9^sKRx6N3Wi8F*r3$95oB~V=qCArZapGNbd&?k(8CWoIpO)@Eg= z=F|Q+DJu1ycQquBJ5_7z?+)||bsLsgR9z;wGdb0a!na!dlhlC<{<8-JB(!R(#;7c$ z3R}N-U8hl<9yj57J{_ZMq@d6zarDXDbhQUez1=3kChd7wZdn2Kxt-VE^o%uQ7~;GL z_rR|PE6%jEo{#}ouU}$4MNK-}r|VS7phfrNXAg#|Sz$Pq-8Oxvtv1160tas0bPT6M zcIl)%(^|4mHeEGZq9F?X!lO5kaD+tBHjzM+n7e%a>rnFDOVC={*&xyt-u=)KGUCKk>qje9CfH-Te#5scabKyu8te2J;Z>#~EQ@bIp<5-|E!XZ^B}>}9 zHIk)*>`mLH$ggdW(Q)Ys3*~B}#ukk^Oj!t=e|J2Cm3H|=joj4e^Hj)*U+8DHG0tslx7Srm51+o(h!(Uu(f z6iYy-1>`!~nm#xpup@U&gb{h*A{4o!p7ZFaN|j^Ju-e0W0owPi!&!5VpdTUu{;Za-rN&h`*+$oSa zVg|$xo`?}UMx(RI@UvSdryOMK-G~B7a*JGtQA;`sEZZ=lsX1vIQUsjT6BeUl%gDA{ zI{nLPHY|w_igk=vM#il)^u^9qT-A7coajo5)|uofv;o(e_Kt3d+$yE0tO>Zso-hiT zeZT}f#-c<%-7SX>Pf8j|o49^M>fZw`xaV7& zy$YwR8*tjX4IK=Yc3XfsITPZM;bYOxou={88AD{RCM2oXR6^#Z4;Lx0w3Z)|w+)-} zx64!Wj=u9e=tjK(`iPM*jbhd%p_X7&xH;rtI90zYI8$}P)+>|KjgyzPqQ0PzM&~@K zk3b8KaI|Kp5sucVwu*eL^j8NJohZPO&Wcj`*#6@n2B+~fvYXNBjl9&5o_r`qc~?^n z*y~ErXs1Y?l9PMu7Mhk9WP=MmrFNGDqgh^#P(VQnNtA?ZZ%sIK=#J9?0f zUlZWtem~YFlb`vX?UiN+T<3R*{DEE}Kmi>nCRfA3t+-cAiZgprP1aMP##;p>b&l>k zTvn_hbxsS8_+TrkEtz*e7oAWO?14IC{1o_q*Mj)YG{*xsNdE*)uGvL`(5jd6!In_qX;5 zn@Sm}+v#7*;jQHwzve^+YC!#L3a3jFXkvC6A$?88=yqZO^LH6#3C@UDyLe7AadpWRUn?Q@!$>;=;bn?j{gtYb~3`#(L(`fIX{LniatI?4q zIe{aZKlIN$pWjE(u49S+0n6NPvyw>af(k7U?|*^%;?q_G=q&pW;e@Q zbTXr3Mhu|~fQl(HbK@+6^zKQK$Aw#7u9n(P{^)(H+aN3X(AHNp$`aZHiLy#B(iJHw zEn2u|2)Ni+kC+!IFjokLk;pLcTE312VF(y%WHQUNxM?8 z2_;^%w@oqvD+vd22|@A$nwG~7oFLC4LP=YQ>TX>;!IF8~WI+{&ja{{=TjqUe4KsaT z=s;h@OjUc=u88B;yGDSf^E8F0Z7ABBvegvg)VUb!=&XX)$f00*vIL`LfhDP*Y&2p) zjlCEY2*zO00@~v@pjVwpPG%!~{Qc$DMZw0PTP7!B7B06vS8IctgH0H(&vyjKJ54J} z<82j(!G><9Z0M=RQI9_8kl88z7YWGdpkRNBB%EH;be{xyBms|#Pe%b?8Zvl4Sryls zF&G7aBjji_+?2K*akMxSPkR3B*lq1sf^^a&lRv((b>J6Ago8+rIY>0|YI=zPc`9|( zm&$@V+2JJaSJR$#+j^SzsYP68OHLaw`is8O$nvXg^d~pes8%Mg)5&S2fYWYrVI>Re zP+(_@K?aXYlU*tiW6P5K6qM#Cpbd8ft*`y*CiMK3v+fG(cz>QzDsPWWP8FT`uI=k) zC!DTSrM#TbAV7>v>v}rKhdhn!BsG^%g3cs7kl888OpcOvntmIR!3C7Uo1){63G3t$ zJSi+xOM}=8(!gZlvbWE*ydT6m+pF@4$?sd^n7Y1D+JsMqpOr*A6#RrEpc(>2>#wv7 z#E)k;+D)p}?VH-_qw~z$qN5CCnZ^@GfFs}^0xTmAo(vU(6RAGyrXSx2{*3v5jSu8s zLwRnFK%^p2e#t1yOQCGM&rJUJ`R1)LQ9wp3JaGg#0=^-@Qe)upi^mBL-?FQd%V#F1 z>Sy*h-iv?uXs%9Q@KVDJ0Tg(ZoHf|;pHMf;FD8FrcGM4v7FZu@qIvxs0j(oIiotzi z4G-TqRd9xyR==2>h@Cgsa6A6#!i`6$o5Snp2xtQV9L4u9UmW#{7O3%?$?uqE-qkl& zSb^H?A=wVl0%)8DjzA9xxCSK}?+B$t-JL$anVcS8IL3UpK@cdU5>Fffjz9+lj0X7r zt@EN*b+{a|p8+xXm1Bj{F=+-emy<$9Ij@)_piKlC$0dX6zSR9`dO%E06gl9tyGIi?>Giipi17Fq47(Z^h#1)mm(CubKSfVM6^$eT6^bSl+WsQ7t0CY2pa<5&@jX z9+;D8`BN{8QSEV`Oig{M{nC}TSBo3r8qBL$nZDG^^Kb-0j6hS8m7Vk1#nJ0ROh=d1 z_j)96EBQBL8gGj>2?yGK^S>N{2tYuL64*br%;3}qiZS_lqthGb4>eqm!+2u^bS`fq zM}QnxuTQmnra5VP$F5O)YJKBZ_WSo%u?KODZt7SW|IHByBLoW4W7(XKE{HDBdYcqy za&*iuEc(FyMRhBjiH%phe60h@>5BvegvJ;XyZGzNteR0>?GAOtrt58$kW&7_VV0|+ zj6fbGRmyp3fUcbch zh@Kjx3X>B6kIstPI6B2}Kb~^6S3SKEoYt-oUzo_1^uEt{3Bg66-XO4BR$m^y zKDgB?SDWfgPNd#GBe7;qf4CG+k0?hvFNq_dIsz@I@$%sMD`S?cUXzLy1ck|o{)gsS z4^8fGT!InqOH^zRFPbBu3<9#jmGI2QtE|r`Q()*y3A(b%4Xa#d@2haWj(Rd_p=&m; znIq6G0uBt$`s(^Ct$*k?mria5Z6t5Qy*)NXK9(qHssOJxJ1e8UjodHViOdi+{sLNE{L-r+!(! z*!n_R4Ez;GbZ)h#?2F1v3j_f{4*&IeUyJ$jwYVb`ND*3nCS*)bfULaG`mf|@>F=D; zwfcHQ2wj5A)L#x0OMkQC;?M>sR0Hv#3*Njn;=JYddum$QpV4M5-rIeCjU%8M0yu)> z#Qdv1R?8*G;H|3F6T*Tu!Q|BbMJsG~R@sF6af>Z6gn00(BMSi+s%L%KH`;P(xH33( zXGo{(?(fsei>yzjTF}`92sQ54`8h{GB?K_qsPM@!sWfay@HX5uGm^IvwCID@YpPlV zT&F`u+co}|BcLz>4wRmMIA)Cbs+TnoT3F$>bt+CXBY7KTD=&=xUsjxOGk$%FdF0eK zRQO*75wICRc;}P><|UE9;DnpzM)J1Ky!Nx!Q*vvCm+<#6Ez{XXFaN6p1Q@iS$D-H1 zzua=GR>BGg12xT!ZfnVf)rVq<0e z>cWKATAb`${Ampr@Oe8_MnJ#~G6u!NQ-wb*J=^lG%C%{>cwI0#p|^ZFGcGqepDJ%= zzeV2@Nt#8J6Q&geBy?1gdwd_`O;4Q`wN@)cg@O*1X@8Y;AFk6g@tW@F zZ)*qtt11GnWUKJwoI&jBJEmE4Rjo+}h3k?@{=C*XZ%dK%tW$z9II0_UfHNmCcnCBP zO%}eIJKlW#)kC;BGr_J)CMUw5-rPEPeUb2TRSV3z2u>QOk3fdHqr6)4QwLZzPE&ch^vUFRT#|GvkFrCuhRFH&3&y4C|H# z&^TQ)d0Tt`zS(u%=0ewfwKf=t*EGBL-$pP0s~iGRMxl9P25gu=l-+XfFe?wuHUqb^~*Q?_2P>K9>AlE{tX)@ zr}k~!Um3ryI`P?UrR@Bw7QW5aMW5^ba&(l?GNq5OV`i3c|G6U~dwa~6&I~IiZ)@-e z2VB>0DHQL{E@wkpMLvCR!$t3Z4FZV6Q-q=uGfi)wo@DsjkRbw(v*$ynh9#3zyK_qI z<2IBUp8lysnt7;}#YniZ&XaBtV143*n&bNzw#*)6x_{;XVW)0e5(2`*mdOcA#+Yei zq4W?QSM4g7GK-rS7s`d;CF@0%EZ!_MO~?>-Pw!`V;rubCcY0A)#6B9ZHL;qJDaJkH(~T=; zPcbYVCxoAC zTlRA<)ThTn{)lA5>QTw!D_2kEnrdqHNW?RF8@R~q6Iz|pbvaeS>|GV&z(chVpI;|M zl{PWp+iz_s1^k!XceR=fta4zYVaJGM_%PjSUVdW)cuEZzF$EvwOx^)ZWOl14!i9xR z(t^E}(!|_a=u=S3;`17%sG63@UEXwn$(NrD-5%Qn#%fZd;n0vIVePP3_SPR}SP%K~ zFwdhL0-VXa!4erhw$%X(57$fc_f<&~P^l)fumKWF8(DOqwpY?ReHdl zrr*faWC+5VFfc()dW=wjapiL|qK)gASor-z^M-IE5d=xgNe?fYmhtP6wr$&3)J_wO zuV{8oYP7S_b#}v$2D{Y1*2YqsoDhra{%B+(a$gmNf+{0UdohZSfX<9qaQcR7LdV5e z8I91maVXgFN=uXp8j{RVjt&uz;xv43qQ$UzbgF6d#pAe=N{^kcu?)d^ku=t5Es(Q( z6N|1e!lk-xg6wYH_ec{2gm|fff1Bg1*B|$oM4aGvZ%^{2@3t z6QKTUJMau6ZDVFR9s5K7(`elGS7u~s$)&8BEbs9@lirvoLSgq z2Gfq)XKU2ShU1CW%?N4-w5aW=*EJ{pX z_e*$=G63AI0%kCPgq=#}b`s79Y(|67g3R0+WfGcEK+s?kSVgp1D2+9;(ipL|@VXg^ vJXEws-vLe*M}Q;15#R`L1ULd50f7Gp=C+I{t~dr800000NkvXXu0mjfB^hew literal 0 HcmV?d00001 diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 37b0cc93e0..d01592e0a3 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -7,7 +7,7 @@ <%= "Sweatsy" %> - + <%= favicon_link_tag asset_path('favicon.png'), :rel => 'icon', :type => 'image/png' %> <%= stylesheet_link_tag "application" %> <%= javascript_include_tag "application", 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> From 8e296d6fc4eddb40540b96c62edb1b9241fa0e45 Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 26 Apr 2018 09:05:20 -0700 Subject: [PATCH 169/236] remove background color and change font --- app/assets/stylesheets/application.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 9673c7aee9..c9f6efb6ce 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -20,17 +20,17 @@ /*all page body styling*/ body,html { height: 100%; - background-color: #f384aa; + /*background-color: #f384aa;*/ } -#C36891 + body { /*font-family: 'Raleway', sans-serif;*/ /*font-family: 'Dosis', sans-serif;*/ - /*font-family: 'Shadows Into Light', cursive;*/ + font-family: 'Shadows Into Light', cursive; /*font-family: 'Handlee', cursive;*/ /*font-family: 'Arsenal', sans-serif;*/ - font-family: 'Neucha', cursive; + /*font-family: 'Neucha', cursive;*/ } /*Navbar styling*/ From b1f0366044b98320780ce5d164c0f722323ff4ee Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 09:36:37 -0700 Subject: [PATCH 170/236] Add footer to all pages --- app/assets/stylesheets/application.css | 102 +++++++++++++++++++------ app/views/layouts/application.html.erb | 51 ++++++++++++- app/views/products/root.html.erb | 4 - 3 files changed, 128 insertions(+), 29 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 3e49d0188d..593e218ac3 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -99,31 +99,31 @@ ul.merchants li { } .size1, .size2, .size3, .size4 { - font-size: 2em; + font-size: 2em; } .size1 :hover { - color: purple; - font-weight: bold; - font-size: 2em; - } + color: purple; + font-weight: bold; + font-size: 2em; +} .size2 :hover { - color: #cc3500; - font-weight: bold; - font-size: 2em; - } + color: #cc3500; + font-weight: bold; + font-size: 2em; +} .size3 :hover { - color: #d8c100; - font-weight: bold; - font-size: 2em; + color: #d8c100; + font-weight: bold; + font-size: 2em; } .size4 :hover { - color: #2daf00; - font-weight: bold; - font-size: 2em; - } + color: #2daf00; + font-weight: bold; + font-size: 2em; +} i { color: #1779ba; @@ -148,15 +148,69 @@ input[type=number]::-webkit-outer-spin-button { font-size: 1.25em; } -#footer { - background: #cccccc; - height: 5em; - position: fixed bottom; +/** FOOTER **/ + +.site-footer { + background: #2c3840; + color: #8aa0ae; + padding: 2rem; +} + +.site-footer .column-block { + margin-bottom: 30px; +} + +.site-footer > .row { + margin-bottom: 1rem; +} + +.site-footer-name { + color: #fefefe; + margin-bottom: 1rem; + font-size: 2rem; +} + +.site-footer-title { + color: #fefefe; + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.site-footer-block { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + margin-bottom: 1rem; +} + +.site-footer-block .fa { + font-size: 2rem; + color: #020304; +} + +.y-grid p { margin: 0; - padding: 0; } -#footer p { - padding: 2em .5em 0 .5em; - float: left; +.site-footer-block p { + margin-left: 1rem; + line-height: 1.125rem; +} + +.site-footer-bottom { + background: #020304; + padding: 1rem 0; +} + +.site-footer-bottom p, +.site-footer-bottom .menu { + margin-bottom: 0; +} + +.site-footer-bottom .site-footer-bottom-links { + float: right; +} + +.site-footer-bottom .site-footer-bottom-links a { + color: #8aa0ae; } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d01592e0a3..b87d6adfc6 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -52,6 +52,55 @@ <%= yield %>
    - +
    +
    +
    + +

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Expedita dolorem accusantium architecto id quidem, itaque nesciunt quam ducimus atque.

    +
    +
    + + + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index 878a622d97..b68ad67951 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -96,7 +96,3 @@
    - - From 172732b22a628b90cea3dbeb1b34e98332e10392 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 10:02:21 -0700 Subject: [PATCH 171/236] fixed NaN printing when 0 reviews --- app/helpers/products_helper.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb index 6b08c5324c..569b255219 100644 --- a/app/helpers/products_helper.rb +++ b/app/helpers/products_helper.rb @@ -7,6 +7,7 @@ def average_rating(product) ratings = reviews.map { |review| review.rating} ratings_sum = ratings.inject { |sum, rating| sum + rating } - return (ratings_sum.to_f / review_count.to_f).round(2) + + return (ratings_sum.to_f / review_count.to_f).round(2) if !ratings_sum.nil? end end From e19440dde7f7b8c76dfdd4a61d44cd4e0969b8b9 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 10:19:46 -0700 Subject: [PATCH 172/236] guest cannot create new merchant; merchant cant sign in or sign up when already logged in --- app/controllers/merchants_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index 136b80d8e2..c82134ce98 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -1,12 +1,13 @@ class MerchantsController < ApplicationController - before_action :require_login, only: [:show] + before_action :require_login, only: [:show, :new] def index @merchants = Merchant.all end def new - @merchant = Merchant.new + @merchant = @current_user + redirect_to merchant_path(@merchant) end def create From 08d2dfb1369a3cb5c9072f1e9d9f66d9d75b8c41 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 13:23:35 -0700 Subject: [PATCH 173/236] Fix bug photos now show from url when merchant adds a new product --- 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 d05e61b82a..c189d93ddf 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -12,7 +12,7 @@

    <%= @product.name %>

    - placeholder image + placeholder image
    <%=number_to_currency(@product.price)%>

    From 154e52d9370fe130faf0b5407fbb32472d338cc1 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 26 Apr 2018 13:56:51 -0700 Subject: [PATCH 174/236] Unknown? --- app/controllers/application_controller.rb | 2 +- app/controllers/carts_controller.rb | 25 ++++--- app/controllers/order_products_controller.rb | 5 +- app/helpers/orders_helper.rb | 12 ++-- app/models/order.rb | 47 +++++-------- app/models/order_product.rb | 4 ++ app/views/carts/confirmation.html.erb | 61 ++++++++++++++++- app/views/carts/edit.html.erb | 68 ++++++++++--------- app/views/carts/show.html.erb | 6 +- config/routes.rb | 2 +- ...0180426150803_add_total_to_orders_table.rb | 5 ++ db/schema.rb | 3 +- db/seed_data/orders.csv | 10 +-- db/seeds.rb | 1 + 14 files changed, 157 insertions(+), 94 deletions(-) create mode 100644 db/migrate/20180426150803_add_total_to_orders_table.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ab930f978c..1f1c181b7f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,6 +1,6 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception - helper_method :current_order + helper_method :current_order, :previous_order before_action :current_user before_action :current_order diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index 5f2d3a7e35..d454df0d95 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -1,6 +1,7 @@ class CartsController < ApplicationController - before_action :find_order_products - skip_before_action :require_login + before_action :find_order_products + skip_before_action :require_login + before_action :previous_order, only: [:confirmation] def show; end @@ -10,12 +11,16 @@ def confirmation; end def update @current_order.assign_attributes(cart_params) - + @current_order.get_expiry(params) + @current_order.ready_to_save? if @current_order.save - @current_order.checkout - previous_order = @current_order - - redirect_to confirmation_path(previous_order.id) + @current_order.status = "paid" + if @current_order.save + # empty cart by setting session[:order_id] to nil + session[:order_id] = nil + session[:prev_order_id] = @current_order.id # here + redirect_to confirmation_path + end else render :edit, status: :bad_request end @@ -28,7 +33,11 @@ def find_order_products end def cart_params - params.require(:order).permit(:name, :email, :address, :cc_num, :expiry_date, :cc_cvv, :zip) + params.require(:order).permit(:name, :email, :cc_num, :cc_cvv, :zip, expiry_date: {}) + end + + def previous_order + @previous_order ||= Order.find_by(id: session[:prev_order_id]) end end diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index de0272fa1f..d4897a0962 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -6,8 +6,7 @@ def create @order = current_order product = Product.find_by(id: params[:order_product][:product_id]) - # Maybe: make an instance method on Order to do this work and return - # the item + # Maybe: make an instance method on Order to do this work and return the item @item = @order.order_products.find_by(product: product) if @item @item.quantity += (params[:order_product][:quantity]).to_i @@ -22,6 +21,8 @@ def create end if @item.save + @current_order.total = @current_order.order_total + @current_order.save name = Product.find_by(id: @item.product_id).name.titleize session[:order_id] = @order.id flash[:success] = "You added #{@item.quantity} #{@item.quantity > 1 ? name.pluralize : name}!" diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb index c13e09a66e..3622e17dbf 100644 --- a/app/helpers/orders_helper.rb +++ b/app/helpers/orders_helper.rb @@ -1,15 +1,11 @@ module OrdersHelper - def last_four - @order.cc_num.last(4) + def last_four(order) + order.cc_num.last(4) end - def format_expiry - @order.expiry_date.first(2) + "/" + @order.expiry_date.last(2) - end - - def date_placed - @order.updated_at.strftime("%B %d, %Y") + " at " + @order.updated_at.strftime("%I: %M %p") + def date_placed(order) + order.updated_at.strftime("%B %-d, %Y at %l:%M%P") end end diff --git a/app/models/order.rb b/app/models/order.rb index 9b6b50cf33..60b31db8ff 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -5,41 +5,33 @@ class Order < ApplicationRecord before_save :update_status before_save :order_total - # validates :name, presence: true + # validates :name, presence: true,if: :ready_to_save? # - # validates :email, presence: true, format: {with: /@/, message: "Must include @"} + # validates :email, presence: true, if: :ready_to_save?, format: {with: /@/, message: "Must include @"} # - # validates :address, presence: true, format: { with: /\A[\d]+/, + # validates :address, presence: true, if: :ready_to_save?, format: { with: /\A[\d]+/, # message: "Must start with digits" } - # - # validates :cc_num, presence: true, format: { with: /\A[\d]{16}\z/, + + # validates :cc_num, presence: true, if: :ready_to_save?, format: { with: /\A[\d]{16}\z/, # message: "Digits only" } # - # validates :expiry_date, presence: true, format: { with: /\A[\d]{4}\z/, - # message: "Digits only" } + # # validates :expiry_date, presence: true, if: :ready_to_save?, format: { with: /\A[\d]{4}\z/, + # # message: "Digits only" } # - # validates :cc_cvv, presence: true, format: { with: /\A[\d]{3}\z/, + # validates :cc_cvv, presence: true, if: :ready_to_save?, format: { with: /\A[\d]{3}\z/, # message: "Digits only" } # - # validates :zip, presence: true, format: { with: /\A[\d]+\z/, + # validates :zip, presence: true, if: :ready_to_save?, format: { with: /\A[\d]+\z/, # message: "Digits only" } - def quantity_in_order(product) - self.order_products.find_by(product_id: product.id).quantity - end - - # can i use a price function in product? - def product_subtotal(product) - quant = quantity_in_order(product) - price = product.price - return quant * price + def ready_to_save? + self.status == "pending" end def order_total total = 0 self.order_products.each do |order_product| - product = order_product.product - total += product_subtotal(product) + total += order_product.subtotal end return total end @@ -57,16 +49,11 @@ def update_status end end - def checkout - if self.status == "pending" - self.status = "paid" - @current_order.save - end + def get_expiry(params) + date = Date.new(params[:order]["expiry_date(1i)"].to_i, + params[:order]["expiry_date(2i)"].to_i, + params[:order]["expiry_date(3i)"].to_i) + self.expiry_date = "#{date.month}/#{date.year}" end - # def empty_cart - # @current_order = Order.create(status: 'pending') - # session[:order_id] = @current_order.id - # end - end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 3ff23fb742..4c27c0e3b5 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -1,4 +1,8 @@ class OrderProduct < ApplicationRecord belongs_to :product belongs_to :order + + def subtotal + subtotal = (self.product.price * self.quantity) + end end diff --git a/app/views/carts/confirmation.html.erb b/app/views/carts/confirmation.html.erb index 30fb2f432d..bd9a9af1e0 100644 --- a/app/views/carts/confirmation.html.erb +++ b/app/views/carts/confirmation.html.erb @@ -1,4 +1,59 @@ -

    Header

    +

    + <%= "Confirmation for order #{@previous_order.id}" %> +

    -<%= "Current Order: #{@current_order.inspect}" %> -<%= "Previous Order: #{@previous_order.inspect}" %> +
    + +

    Summary

    +
      +
    • Placed: <%= date_placed(@previous_order) %>
    • +
    • Status: <%= @previous_order.status.titleize %>
    • +
    + +
    + +
    + +

    Contact

    +
      +
    • Name: <%= @previous_order.name %>
    • +
    • Email: <%= @previous_order.email %>
    • +
    • Address: <%= @previous_order.address %>
    • +
    + +
    + +
    + +

    Billing

    +
      +
    • Credit Card: <%= last_four(@previous_order) %>
    • +
    • Expiration: <%= @previous_order.expiry_date %>
    • +
    • CCV Number: <%= @previous_order.cc_cvv %>
    • +
    • Billing Zip: <%= @previous_order.zip %>
    • +
    + +
    + +
    + +

    Products

    + + <% @previous_order.order_products.each do |i| %> + +
    + + + <%= link_to i.product.name, product_path(i.product.id) %> + <%= "x #{i.quantity}" %> + + + <%= "Sub Total: #{number_to_currency(i.subtotal)}" %> + +
    + + <% end %> + +

    Order Total: <%= number_to_currency(@previous_order.total) %>

    + +
    diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index 7554eeceff..7a622dbb34 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -1,55 +1,57 @@ -

    <%= "Checkout #{@current_order.id} #{@current_order.status}" %>

    +

    <%= "Checkout for order #{@current_order.id}" %>

    -
    +
    + <% @order_products.each do |i| %> -
    - <%= form_for @current_order, url: cart_path do |f| %> +
    - <%= f.label :name, "Name: " %> - <%= f.text_field :name, placeholder: "Dwayne Johnson" %> + + <%= link_to i.product.name, product_path(i.product.id) %> + <%= "x #{i.quantity}" %> + - <%= f.label :email, "Email: " %> - <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> + <%= "Sub Total: #{number_to_currency(i.product.price * i.quantity)}" %> - <%= f.label :cc_num, "Credit Card: " %> - <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> +
    - <%= f.label :cc_cvv, "CVV: " %> - <%= f.number_field :cc_cvv, placeholder: "XXX" %> + <% end %> - <%= f.label :expiry_date, "Expiration: " %> +

    Order Total: <%= number_to_currency current_order.order_total %>

    - ### THIS IS MAKING TEST FAIL - <%= f.date_select :expiry_date, :discard_day => true, :start_year => Date.today.year, :end_year => (Date.today.year+10), :use_month_numbers => true, :order => [:month, :year] %> +
    - <%= f.label :zip, "Billing Zip: " %> - <%= f.number_field :zip, placeholder: "XXXXX" %> +
    - <%= f.submit "Place Order", class: 'button' %> +
    + <%= form_for @current_order, url: cart_path do |f| %> - <%= link_to "Back to Cart", cart_path, class: "button" %> + <%= f.label :name, "Name: " %> + <%= f.text_field :name, placeholder: "Dwayne Johnson" %> - <% end %> -
    + <%= f.label :email, "Email: " %> + <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> -
    - <% @order_products.each do |i| %> + <%= f.label :address, "Address: " %> + <%= f.text_field :address, placeholder: "1234 Main Street Los Angeles, CA 90001" %> -
    + <%= f.label :cc_num, "Credit Card: " %> + <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> - - <%= link_to i.product.name, product_path(i.product.id) %> - <%= "x #{i.quantity}" %> - + <%= f.label :cc_cvv, "CVV: " %> + <%= f.number_field :cc_cvv, placeholder: "XXX" %> - <%= "Sub Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <%= f.label :expiry_date, "Expiration: " %> -
    + <%= f.date_select :expiry_date, {order: [:month, :year], prompt: { month: 'Select month', year: 'Select year' }, start_year: Date.today.year, end_year: Date.today.year + 10}, {required: true} %> - <% end %> + <%= f.label :zip, "Billing Zip: " %> + <%= f.number_field :zip, placeholder: "XXXXX" %> -

    Order Total: <%= number_to_currency current_order.order_total %>

    + <%= f.submit "Place Order", class: 'button' %> -
    + <%= link_to "Back to Cart", cart_path, class: "button" %> + <% end %>
    + +
    diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index a831980ec7..08dc9f2343 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -18,7 +18,7 @@ - <%= "Sub Total: #{number_to_currency(i.product.price * i.quantity)}" %> + <%= "Sub Total: #{number_to_currency(i.subtotal)}" %> <%= f.submit "Update", class: "button" %> @@ -31,10 +31,12 @@ <% end %> -

    Order Total: <%= number_to_currency current_order.order_total %>

    +

    Order Total: <%= number_to_currency(current_order.order_total) %>

    <%= link_to "Proceed to Checkout", checkout_path, class: "button" %> + <%= link_to "Contine Shopping", products_path, class: "button" %> + <% else %>

    Your shopping cart is empty.

    diff --git a/config/routes.rb b/config/routes.rb index a1343672e8..9fba9bd58b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,7 +18,7 @@ resources :orders, only: [:show, :new, :create, :update] get '/checkout', to: 'carts#edit', as: :checkout - get '/order_confirmation/:id', to: 'carts#confirmation', as: :confirmation + get '/order_confirmation', to: 'carts#confirmation', as: :confirmation # may not need all routes for order_products resources :order_products diff --git a/db/migrate/20180426150803_add_total_to_orders_table.rb b/db/migrate/20180426150803_add_total_to_orders_table.rb new file mode 100644 index 0000000000..fec35a9dfc --- /dev/null +++ b/db/migrate/20180426150803_add_total_to_orders_table.rb @@ -0,0 +1,5 @@ +class AddTotalToOrdersTable < ActiveRecord::Migration[5.1] + def change + add_column :orders, :total, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index c3e275acc1..cb2585884a 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: 20180424175628) do +ActiveRecord::Schema.define(version: 20180426150803) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -56,6 +56,7 @@ t.string "expiry_date" t.string "cc_cvv" t.string "zip" + t.integer "total" end create_table "products", force: :cascade do |t| diff --git a/db/seed_data/orders.csv b/db/seed_data/orders.csv index 182e105dd1..2f133e44d9 100644 --- a/db/seed_data/orders.csv +++ b/db/seed_data/orders.csv @@ -1,5 +1,5 @@ -status,name,email,address,cc_num,expiry_date,cc_cvv,zip -pending,Danny Green,danny@nba.com,"1234 5th Street Seattle, WA 98125",1234567888888888,1020,100,98312 -paid,Lebron James,lebron@nba.com,"6789 10th Street Seattle, WA 98125",1234512345123456,1118,200,98004 -complete,Harrison Barnes,harrison@nba.com,"1112 13th Street Seattle, WA 98125",3334445556667778,1119,300,98111 -cancelled,Kyrie Irving,kyrie@nba.com,"1415 16th Street Seattle, WA 98125",1010101111223345,1220,400,98332 +status,name,email,address,cc_num,expiry_date,cc_cvv,zip, order +pending,Danny Green,danny@nba.com,"1234 5th Street Seattle, WA 98125",1234567888888888,1020,100,98312, +paid,Lebron James,lebron@nba.com,"6789 10th Street Seattle, WA 98125",1234512345123456,1118,200,98004, +complete,Harrison Barnes,harrison@nba.com,"1112 13th Street Seattle, WA 98125",3334445556667778,1119,300,98111, +cancelled,Kyrie Irving,kyrie@nba.com,"1415 16th Street Seattle, WA 98125",1010101111223345,1220,400,98332, diff --git a/db/seeds.rb b/db/seeds.rb index 77c59d6ba5..b44c5d9e4e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -59,6 +59,7 @@ order.expiry_date = row['expiry_date'] order.cc_cvv = row['cc_cvv'] order.zip = row['zip'] + order.total = row['total'] successful = order.save if !successful order_failures << order From db49c7bbb085b83cdc569622deea6be67a192989 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 14:06:20 -0700 Subject: [PATCH 175/236] Fix photo display again and change color of cart icon --- app/assets/stylesheets/application.css | 3 +-- app/views/products/index.html.erb | 4 ++-- app/views/products/show.html.erb | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 73d1e553e0..39c2c1402f 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -154,7 +154,7 @@ ul.merchants li { } i { - color: #1779ba; + color: #C36891; cursor: pointer; } /*product grid styling*/ @@ -281,4 +281,3 @@ input[type=number]::-webkit-outer-spin-button { .site-footer-bottom .site-footer-bottom-links a { color: #8aa0ae; } - diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index db3675c996..35ee6649e5 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -22,7 +22,7 @@
  • - placeholder photo + placeholder photo
    @@ -31,7 +31,7 @@

    <%= product.description %>

    <%= product.available%> Available

    - +

    <%= number_to_currency(product.price) %>

    <% if session[:merchant_id] == product.merchant_id%> diff --git a/app/views/products/show.html.erb b/app/views/products/show.html.erb index c189d93ddf..f5081fc0aa 100644 --- a/app/views/products/show.html.erb +++ b/app/views/products/show.html.erb @@ -10,9 +10,9 @@
  • -

    <%= @product.name %>

    +

    <%= @product.name.titleize %>

    - placeholder image + placeholder image
    <%=number_to_currency(@product.price)%>

    From 0c8a91236ad3a94355111dc850938d607326f41b Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 14:14:49 -0700 Subject: [PATCH 176/236] More styles --- app/views/layouts/application.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index ef4c9d9dde..a961a8108e 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -43,7 +43,7 @@ <%= link_to " #{@current_user.username}'s Dashboard ",merchant_path(@current_user), class: 'hollow button'%> <%= link_to "Logout", logout_path, method: :delete, class: 'button' %> <%else%> - <%= link_to "Login/Become a Merchant", '/auth/github', class: "button" %> + <%= link_to "Login/Become a Merchant", '/auth/github', class: "button" %> <%end%> @@ -90,10 +90,10 @@

    - + instagram photo
    - + instagram photo
    From 1680d8c6e07958b627cc36ae6299059be064c4a3 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 14:29:27 -0700 Subject: [PATCH 177/236] more styles --- app/assets/stylesheets/application.css | 5 +++++ app/views/layouts/application.html.erb | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 39c2c1402f..a4db4d453b 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -255,6 +255,11 @@ input[type=number]::-webkit-outer-spin-button { color: #020304; } +.instagram { + height: 75px; + width: 75px; +} + .y-grid p { margin: 0; } diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a961a8108e..f780449375 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -89,8 +89,8 @@
    -
    - instagram photo +
    + instagram photo
    instagram photo From cefa50fce6f5ce8becfcde5fcac9152e64ac034d Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 14:39:42 -0700 Subject: [PATCH 178/236] made secret files secret --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9b351fa781..9bc153a6b6 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ /yarn-error.log .byebug_history - +.env .DS_Store From 6b02cfe6c3e4cae3d1f0439652192d758a5040bd Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 14:49:00 -0700 Subject: [PATCH 179/236] Fix css error so can deploy --- app/assets/stylesheets/application.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index a4db4d453b..738275ee5e 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -21,7 +21,6 @@ /*all page body styling*/ body,html { height: 100%; - /*background-color: #f384aa;*/ } body { @@ -37,12 +36,12 @@ body { .nav { width: 100%; position: fixed; - background-color: #; } .top-bar-left { list-style-type: none; font-size: 40px; } + top-bar { border-bottom: $primary; } From fa6d4e3c5d404fe5f3bdf2cb08d14fe0bf3f57e5 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 14:57:43 -0700 Subject: [PATCH 180/236] remove border from navbar --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 738275ee5e..09b9f6a381 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -43,7 +43,7 @@ body { } top-bar { - border-bottom: $primary; + border-bottom: primary; } /*form styling*/ From 57c6c1c502dabf47881b1b631c1d107cdbf1a6d6 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 15:25:08 -0700 Subject: [PATCH 181/236] over 90 percent sessions controller test passing --- test/controllers/sessions_controller_test.rb | 32 ++++++++++++++++++-- test/test_helper.rb | 5 +++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index c0a903cc88..5d4f9f038f 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -1,7 +1,7 @@ require "test_helper" describe SessionsController do - describe 'auth_callback' do + describe 'create action via auth_callback_path' do it "creates a new DB entry for a new user" do merchant = Merchant.new( provider: 'github', @@ -18,6 +18,20 @@ Merchant.count.must_equal old_merchant_count + 1 session[:merchant_id].must_equal Merchant.last.id end + it "cannot create new user due to invalid data" do + merchant = Merchant.new( + provider: 'github', + uid: 0000, + username: 'testuser' + ) + + merchant.wont_be :valid? + old_merchant_count = Merchant.count + + login(merchant) + + Merchant.count.must_equal old_merchant_count + end it "logs in existing merchant" do merchant = Merchant.first @@ -25,8 +39,22 @@ login(merchant) - Merchant.count.must_equal old_merchant_count session[:merchant_id].must_equal Merchant.first.id end + + it "flashes error for invalid info in callback path" do + OmniAuth.config.mock_auth[:github] = nil + end + end + + describe 'destroy action' do + it "logs user out" do + merchant = Merchant.first + + login(merchant) + logout(merchant) + + session[:merchant_id].must_equal nil + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 85f6111a74..2999b0cf38 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -45,4 +45,9 @@ def login(user) OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) get auth_callback_path(:github) end + + def logout(user) + OmniAuth.config.mock_auth[:github] = nil + delete logout_path + end end From b0dc08051f949c6fa5a32c7e9c9271b1141ab574 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 15:27:57 -0700 Subject: [PATCH 182/236] Add test fixtures for categories --- app/assets/stylesheets/application.css | 4 +--- test/fixtures/categories.yml | 13 ++++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 09b9f6a381..381cdee0a2 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -42,9 +42,7 @@ body { font-size: 40px; } -top-bar { - border-bottom: primary; -} + /*form styling*/ form { diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index dc3ee79b5d..c830cfb429 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -4,8 +4,11 @@ # 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 +shirts: + name: Shirts + +pants: + name: Pants + +accessories: + name: Accessories From 401dc11df1370912e6a131a8dd2c5862c2874e9e Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 15:45:59 -0700 Subject: [PATCH 183/236] sessions controller tests passing --- test/controllers/sessions_controller_test.rb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index 5d4f9f038f..0a68cade44 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -40,10 +40,21 @@ login(merchant) session[:merchant_id].must_equal Merchant.first.id + must_redirect_to merchant_path(Merchant.first.id) + Merchant.count.must_equal old_merchant_count end - + it "flashes error for invalid info in callback path" do - OmniAuth.config.mock_auth[:github] = nil + merchant = Merchant.new( + provider: 'github', + email: 'test@test.org', + username: 'testuser' + ) + + login(merchant) + + flash[:error].must_equal "Could not authenticate user via Github" + must_redirect_to root_path end end @@ -54,7 +65,7 @@ login(merchant) logout(merchant) - session[:merchant_id].must_equal nil + session[:merchant_id].must_be_nil end end end From 38f2a166ed42e14e54672685d2cdaf07a9050fa2 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 15:58:40 -0700 Subject: [PATCH 184/236] changes --- .env | 2 ++ .gitignore | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000000..b44e881b20 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +GITHUB_CLIENT_ID: 909eae782360615a1a5b +GITHUB_CLIENT_SECRET: afa44dedcc50742e510ad19a1c22e9458c2d5d02 diff --git a/.gitignore b/.gitignore index 9bc153a6b6..9b351fa781 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ /yarn-error.log .byebug_history -.env + .DS_Store From b845740caf6c41ac774916dc8bf18964197532e7 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 16:19:35 -0700 Subject: [PATCH 185/236] changes --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d2f22b37aa..ee91c2309d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,7 @@ /yarn-error.log .byebug_history - +.env .DS_Store .env From 12126cf2a87ebbac66f78371a4b3796069d56403 Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 26 Apr 2018 16:24:16 -0700 Subject: [PATCH 186/236] added logout to test-helper,updated create method to require login. --- test/controllers/products_controller_test.rb | 26 +++++++++++++++++--- test/test_helper.rb | 5 ++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 9ff5d94a50..7931dd4e42 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -4,6 +4,7 @@ describe 'index' do it "sends a success response where there are products" do + Product.count.must_be :>,0 get products_path @@ -23,20 +24,29 @@ end describe 'new' do - it "sends a success response" do + it "sends a success response when merchant adds a new product" do + login(Merchant.first) get new_product_path must_respond_with :success end + + # it "sends bad request when a guest tries to add a new product" do + # get new_product_path + # must_respond_with :bad_request + # end end describe 'create' do it "can add a product with valid data" do + @current_user = Merchant.first + login(@current_user) + product_data = { name: 'random', price: 3, available: 4, - merchant_id: Merchant.first.id + merchant_id: @current_user.id } old_product_count = Product.count @@ -47,7 +57,7 @@ post products_path, params: { product: product_data} must_respond_with :redirect - must_redirect_to merchant_products_path + must_redirect_to merchant_products_path(@current_user) Product.count.must_equal old_product_count + 1 @@ -55,6 +65,7 @@ end it "renders error for invalid data" do + product_data = { merchant_id: Merchant.first.id } @@ -74,11 +85,13 @@ describe 'edit' do it "send success if the product saves" do + get edit_product_path(Product.first) must_respond_with :success end it "sends not_found if product does not exist" do + product_id = Product.last.id + 1 get edit_product_path(product_id) @@ -89,11 +102,13 @@ describe 'show' do it "send success if the product exists" do + get product_path(Product.first) must_respond_with :success end it "sends not_found if product does not exist" do + product_id = Product.last.id + 1 get product_path(product_id) @@ -104,6 +119,7 @@ describe 'update' do it "updates existing product with valid data" do + # product = Product.first # product_data = product.attributes # @@ -122,6 +138,7 @@ end it "sends bad_request when data is invalid" do + product = Product.first product_data = product.attributes @@ -140,6 +157,7 @@ end it "sends not_found for a product that does not exist" do + product_id = Product.last.id + 1 patch product_path(product_id) @@ -151,6 +169,7 @@ describe 'destroy' do it "can destroy a product" do + product_id = Product.first.id old_product_count = Product.count @@ -163,6 +182,7 @@ end it "sends not_found when product does not exist" do + product_id = Product.first.id + 1 old_product_count = Product.count diff --git a/test/test_helper.rb b/test/test_helper.rb index 85f6111a74..2999b0cf38 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -45,4 +45,9 @@ def login(user) OmniAuth.config.mock_auth[:github] = OmniAuth::AuthHash.new(mock_auth_hash(user)) get auth_callback_path(:github) end + + def logout(user) + OmniAuth.config.mock_auth[:github] = nil + delete logout_path + end end From 390be3c796aaed6625cad0c2057fc6f2b3aa3e78 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Thu, 26 Apr 2018 16:58:15 -0700 Subject: [PATCH 187/236] working on merchant controller tests --- test/controllers/merchants_controller_test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 46f5754161..4b5fef43cf 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -66,7 +66,7 @@ get merchant_path(merchant) - must_respond_with :success + must_respond_with :found end it "sends not_found if the merchant does not exist in the database" do From 83c70d19d5c7b808cdf0bfaf06cf96520efd7d3b Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 26 Apr 2018 18:01:10 -0700 Subject: [PATCH 188/236] Working on tests --- app/views/orders/show.html.erb | 63 +--------------------------------- 1 file changed, 1 insertion(+), 62 deletions(-) diff --git a/app/views/orders/show.html.erb b/app/views/orders/show.html.erb index a8e52654fe..3e5ee74e63 100644 --- a/app/views/orders/show.html.erb +++ b/app/views/orders/show.html.erb @@ -1,64 +1,3 @@

    - <%= "Details for order #{@order.id}" %> + <%= "Placeholder" %>

    - -
    - -

    Summary

    -
      -
    • Placed: <%= date_placed %>
    • -
    • Status: <%= @order.status %>
    • -
    - -
    - -
    - -

    Items

    - <% @order.products.each do |p| %> -
      -
    • <%= p.name %>
    • -
    • <%= @order.quantity_in_order(p) %>
    • -
    • <%= number_to_currency @order.product_subtotal(p) %>
    • -
    - <% end %> - -

    <%= "Total: INSERT TOTAL#{}" %>

    - -
    - - -
    - -### DETAILS BELOW ONLY AVAILABLE IF ORDER IS NO LONGER PENDING...IF ORDER IS PENDING, NEED BUTTON GOING TO CHECKOUT - -

    Contact

    -
      -
    • Name: <%= @order.name %>
    • -
    • Email: <%= @order.email %>
    • -
    - -
    - - -
    - -

    Billing

    -
      -
    • Credit Card: <%= last_four %>
    • -
    • Expiration: <%= format_expiry %>
    • -
    • CCV Number: <%= @order.cc_cvv %>
    • -
    • Billing Zip: <%= @order.zip %>
    • -
    - -
    - - -
    - -

    Shipping

    -
      -
    • Address: <%= @order.address %>
    • -
    - -
    From 7bddc0c9ac12b3b826528449b35f5f426e47563f Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 26 Apr 2018 18:31:26 -0700 Subject: [PATCH 189/236] made changes to fix errors --- db/seed_data/categories-products.csv | 3 +- db/seed_data/products.csv | 42 ++++++++++++++-------------- db/seeds.rb | 4 +-- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv index 011b15047d..4a97c9bcf5 100644 --- a/db/seed_data/categories-products.csv +++ b/db/seed_data/categories-products.csv @@ -22,11 +22,12 @@ Tights,Green Spandex Accessories,Neon Head Band Tights,Leggings Pants,Leggings -Tights,Nude Tights +Tights,Touquoise Tights Shirts,Dry fit Shirt Dry fit,Dry fit Shirt Shoes,Purple Sneakers Shoes,Neon Sneakers Dry fit,Silk Leotard +Accessories,Silk Leotard Accessories,Jazz legs Legwarmers,Jazz legs diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index 985fc0ddac..c3169c061d 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,22 +1,22 @@ name,price,available,description,photo,merchant_username -Track Pants,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Pink Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg -Orange Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg -Rain Jacket,3545,20,It will fight off the rain,http://via.placeholder.com/200x250,tyronn -White Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky -Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://via.placeholder.com/200x250,mark -Purple Leotard,100,20,Move around easier,http://via.placeholder.com/200x250,tyronn -Red Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn -Black Tights,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg -Track Jacket,2700,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Neon Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg -Green Spandex,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Leggings,5000,20,Run faster sweat less, http://via.placeholder.com/200x250,gregg -Nude Tights,90,10,Release the sweat,http://via.placeholder.com/200x250,tyronn -Dry fit Shirt,90,10,Release the sweat,http://via.placeholder.com/200x250,gregg -Neon Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky -Purple Sneakers,6405,20,Protection for all the sweat, http://via.placeholder.com/200x250,becky -Silk Leotard,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn -Head Band,699,20,No more sweat on your brows,http://via.placeholder.com/200x250,gregg -Jazz legs,200,20,Let it shine,http://via.placeholder.com/200x250,tyronn +Track Pants,5000,20,Run faster sweat less,https://img.etsystatic.com/il/557be1/1397617100/il_570xN.1397617100_hbfj.jpg?version=2,gregg +Pink Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7hS4Q98DdAFHMLc0KiU70V1w9_-Vj63hfb4HAbSeAF7EhrMO4Og,gregg +Orange Head Band,699,20,No more sweat on your brows,https://images-na.ssl-images-amazon.com/images/I/2105qPRuO3L.jpg,gregg +Rain Jacket,3545,20,It will fight off the rain,https://img.etsystatic.com/il/bc058f/1469960898/il_570xN.1469960898_1l2g.jpg?version=0,tyronn +White Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSi0uC5YCQw4wPrSqbF4f_Vy6bj7of4xU2UfcWaFgaBJENIGUSswg,becky +Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://d3eum8lucccgeh.cloudfront.net/designs/32518/DontSweat_grn.jpg,mark +Purple Leotard,100,20,Move around easier,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2pcWWgkfWtT9sCk7uJLoiSJXxVNZFZ-BUUGfSkIl75eHj0IFKfA,tyronn +Red Leotard,200,20,Let it shine,https://img.etsystatic.com/il/ba4e45/1088013044/il_570xN.1088013044_iqj2.jpg?version=1,tyronn +Black Tights,90,10,Release the sweat,https://rlv.zcache.co.uk/black_and_white_80s_style_leggings-rfc5f404502bc4d8e96e0024d6923df38_6ftq3_260.jpg?rlvnet=1,gregg +Track Jacket,2700,20,Run faster sweat less, https://www.etsy.com/listing/586314321/vtg-80s-crinkle-nylon-track-jacket-bold?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=80s%20track%20jacket&ref=sr_gallery-1-1,gregg +Spandex,5000,20,Run faster sweat less, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjePGQzichk23U5SuvA3lfx6bs5Kk1gDIPd0uf_vNRmtrMUnjFvA,gregg +Neon Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTja6mFBrA_bETAZxt7VFuhLQJ6cxblasq5UZikxycFH6hdI3vp,steve +Green Spandex,5000,20,Run faster sweat less, https://images-na.ssl-images-amazon.com/images/I/41oVO%2BPcNuL.jpg,gregg +Leggings,5000,20,Run faster sweat less,https://ih0.redbubble.net/image.413146829.8415/leggings,m,x875,front-bg,f3f3f3.2u3.jpg,gregg +Touquoise Tights,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzwAoa1ivQNHyTTkcQpxAdx6kKfDwouri_Dhx9mIfhZdD77nkT,tyronn +Dry fit Shirt,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQEwKyPTI4qtkNvqj5V4i5fjDTTJ0WpErK6AFZp0Jf9MgBlRKwMg,gregg +Neon Sneakers,6405,20,Protection for all the sweat, https://c2.staticflickr.com/4/3259/2786550775_62cc73ca14_z.jpg?zz=1,becky +Purple Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQVlQpQlULhphplRcysE375sKUo8Z6mwCiCeFYYrZ-jmBbrA10QaA,becky +Silk Leotard,200,20,Let it shine,https://cdn-img-1.wanelo.com/p/d32/571/6b5/5e4564e57ff129f747ad555/x354-q80.jpg,tyronn +Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIO2Fgsx7PxowCtLuzPtRLIR7yIam8ayH97oBYStJBSBbsqNVs,steve +Jazz legs,200,20,Let it shine,https://i.pinimg.com/originals/23/de/e8/23dee8bb0263a8507325f0cdbd8b37f9.jpg,tyronn diff --git a/db/seeds.rb b/db/seeds.rb index b44c5d9e4e..bdf6222d05 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -85,7 +85,7 @@ product.available = row['available'] product.description = row['description'] product.photo = row['photo'] - product.merchant_id = Merchant.find_by(username: row['merchant_username']).id + product.merchant_id = row['merchant_username'] successful = product.save if !successful product_failures << product @@ -109,7 +109,7 @@ review = Review.new review.rating = row['rating'] review.description = row['description'] - review.product_id = Product.find_by(name: row['product_name']).id + review.product_id = row['product_name'] successful = review.save if !successful review_failures << review From 850313da5cbb0193cd1702cdb5a7c4c38c5a9ee0 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 19:10:02 -0700 Subject: [PATCH 190/236] Making progress on order page for merchant --- app/controllers/orders_controller.rb | 20 ++++++++++++++++++ app/models/order.rb | 10 +++++++++ app/models/order_product.rb | 5 +++++ app/views/orders/index.html.erb | 31 ++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 app/views/orders/index.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e16dffcfe1..54d3c9dbdb 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -2,6 +2,26 @@ class OrdersController < ApplicationController skip_before_action :require_login before_action :find_order, only: [:show] + def index + @merchant = Merchant.find(params[:merchant_id]) + orders = [] + OrderProduct.all.each do |order_product| + product = Product.find(order_product.product_id) + if product.merchant_id == @merchant.id + orders << order_product + end + end + @orders = orders + + products = [] + orders.each do |order| + product = Product.find(order.product_id) + products << product + end + @products = products + + end + def show; end def new diff --git a/app/models/order.rb b/app/models/order.rb index 60b31db8ff..2c55e3650d 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -56,4 +56,14 @@ def get_expiry(params) self.expiry_date = "#{date.month}/#{date.year}" end + + def find_order_merchants + merchants = [] + self.order_products.each do |product| + merchant = Merchant.find_by(product.merchant_id) + merchants << merchant + end + return merchants + end + end diff --git a/app/models/order_product.rb b/app/models/order_product.rb index 4c27c0e3b5..c808f81087 100644 --- a/app/models/order_product.rb +++ b/app/models/order_product.rb @@ -5,4 +5,9 @@ class OrderProduct < ApplicationRecord def subtotal subtotal = (self.product.price * self.quantity) end + + def find_order_product(merchant_id) + product = Product.find(self.product_id) + end + end diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 0000000000..c6558a9740 --- /dev/null +++ b/app/views/orders/index.html.erb @@ -0,0 +1,31 @@ +

    <%= @merchant.username.capitalize %>'s Order Summary Page

    + +
    + + + + + + + + + + + + + + <% @orders.each do |order| %> + + + + + + + + + + + + <% end %> + +
    ProductQuantitySubtotalStatusDateBuyerEmail
    <%= Product.find(order.id).name %><%= order.quantity %><%= number_to_currency(order.subtotal) %><%= order.order.status %><%= order.order.created_at.strftime("%B %d, %Y") %><%= order.order.name %><%= order.order.email %><%= order.order.address %>
    From 5201562b979fa89ebef60f118e30614811b6e6db Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 19:15:35 -0700 Subject: [PATCH 191/236] Finish chart for order summary --- app/views/orders/index.html.erb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index c6558a9740..66030def50 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -10,13 +10,15 @@ Date Buyer Email + Address + Ship <% @orders.each do |order| %> - <%= Product.find(order.id).name %> + <%= link_to Product.find(order.id).name, product_path(Product.find(order.id)) %> <%= order.quantity %> <%= number_to_currency(order.subtotal) %> <%= order.order.status %> @@ -24,7 +26,7 @@ <%= order.order.name %> <%= order.order.email %> <%= order.order.address %> - + <%= link_to "Ship Order", product_path(Product.find(order.id)) %> <% end %> From 77a54ea0c250aa348394f0758cade6ce9bd730ad Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 19:21:41 -0700 Subject: [PATCH 192/236] Add instagram photos --- app/views/layouts/application.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index f780449375..a3096d04ba 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -93,13 +93,13 @@ instagram photo
    - instagram photo + instagram photo
    - +
    - +
    From 901737c65d280b8164b4cdcfdfaa9e8544e1cae6 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 19:30:22 -0700 Subject: [PATCH 193/236] Fix footer --- app/assets/stylesheets/application.css | 13 ++++++++++--- app/views/layouts/application.html.erb | 6 +++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 09b9f6a381..bc5042066f 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -254,9 +254,16 @@ input[type=number]::-webkit-outer-spin-button { color: #020304; } -.instagram { - height: 75px; - width: 75px; +div.column.medium-3 img { + padding: .5em; +} + +.contact { + padding-left: 3em; +} + +div.site-footer-block i.fa { + color: #fff; } .y-grid p { diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a3096d04ba..33706c59e4 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -68,7 +68,7 @@

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Expedita dolorem accusantium architecto id quidem, itaque nesciunt quam ducimus atque.

    -
    +
    -
    -
    +
    +
    instagram photo
    From e6c8a2608d19c019cc7cfee3af798a226a262ff0 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 26 Apr 2018 19:43:12 -0700 Subject: [PATCH 194/236] Fixed validations for cart checkout and solved example.com error in one place --- app/controllers/application_controller.rb | 3 +- app/controllers/carts_controller.rb | 2 +- app/models/order.rb | 39 +++++++++----------- app/views/carts/edit.html.erb | 5 +++ test/controllers/products_controller_test.rb | 6 ++- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 1f1c181b7f..c8abd109d5 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -7,7 +7,7 @@ class ApplicationController < ActionController::Base before_action :require_login def current_user - @current_user ||= Merchant.find(session[:merchant_id]) if session[:merchant_id] + @current_user ||= Merchant.first # Merchant.find(session[:merchant_id]) if session[:merchant_id] end # flashes message if current_user can't find a logged-in merchant @@ -25,6 +25,7 @@ def current_order @current_order = Order.create(status: 'pending') session[:order_id] = @current_order.id end + return @current_order end end diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index d454df0d95..59f84d7d33 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -12,7 +12,7 @@ def confirmation; end def update @current_order.assign_attributes(cart_params) @current_order.get_expiry(params) - @current_order.ready_to_save? + @current_order.status = "in progress" if @current_order.save @current_order.status = "paid" if @current_order.save diff --git a/app/models/order.rb b/app/models/order.rb index 60b31db8ff..a03a3de5ba 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -5,27 +5,24 @@ class Order < ApplicationRecord before_save :update_status before_save :order_total - # validates :name, presence: true,if: :ready_to_save? - # - # validates :email, presence: true, if: :ready_to_save?, format: {with: /@/, message: "Must include @"} - # - # validates :address, presence: true, if: :ready_to_save?, format: { with: /\A[\d]+/, - # message: "Must start with digits" } - - # validates :cc_num, presence: true, if: :ready_to_save?, format: { with: /\A[\d]{16}\z/, - # message: "Digits only" } - # - # # validates :expiry_date, presence: true, if: :ready_to_save?, format: { with: /\A[\d]{4}\z/, - # # message: "Digits only" } - # - # validates :cc_cvv, presence: true, if: :ready_to_save?, format: { with: /\A[\d]{3}\z/, - # message: "Digits only" } - # - # validates :zip, presence: true, if: :ready_to_save?, format: { with: /\A[\d]+\z/, - # message: "Digits only" } - - def ready_to_save? - self.status == "pending" + validates :name, presence: true, if: :ready_to_process? + + validates :email, presence: true, if: :ready_to_process?, format: {with: /@/, message: "Must include @"} + + validates :address, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+/, + message: "Must start with digits" } + + validates :cc_num, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{16}\z/, + message: "Digits only" } + + validates :cc_cvv, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{3}\z/, + message: "Digits only" } + + validates :zip, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+\z/, + message: "Digits only" } + + def ready_to_process? + self.status == "in progress" end def order_total diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index 7a622dbb34..b79b93563e 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -1,5 +1,7 @@

    <%= "Checkout for order #{@current_order.id}" %>

    +<%= render partial: "layouts/error_messages", locals: { model: @current_order } %> +
    <% @order_products.each do |i| %> @@ -23,6 +25,9 @@
    + + <% @current_order.expiry_date = nil %> + <%= form_for @current_order, url: cart_path do |f| %> <%= f.label :name, "Name: " %> diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 9ff5d94a50..158bd45aa0 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -73,8 +73,10 @@ end describe 'edit' do - it "send success if the product saves" do - get edit_product_path(Product.first) + it "send success if form loads" do + merchant = Merchant.first + login(merchant) + get edit_product_path(Product.find_by(merchant: merchant)) must_respond_with :success end From 5176a7758d39c6d22125c9025806fcdc3ef732fb Mon Sep 17 00:00:00 2001 From: Kiera Date: Thu, 26 Apr 2018 19:53:30 -0700 Subject: [PATCH 195/236] made changes to seed file to remove activerecord association errors. --- app/assets/stylesheets/_settings.scss | 2 +- db/seed_data/products.csv | 24 ++---------------------- db/seed_data/products2.csv | 22 ++++++++++++++++++++++ db/seeds.rb | 7 ++++--- 4 files changed, 29 insertions(+), 26 deletions(-) create mode 100644 db/seed_data/products2.csv diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 572d087bcf..7d3eadad83 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -70,7 +70,7 @@ $global-width: rem-calc(1200); $global-lineheight: 1.5; $foundation-palette: ( primary: #C36891, - secondary: #403F63, + secondary: #66fcf1, success: #74b9e8, warning: #f384aa, alert: #ffffff, diff --git a/db/seed_data/products.csv b/db/seed_data/products.csv index c3169c061d..5aee46a96b 100644 --- a/db/seed_data/products.csv +++ b/db/seed_data/products.csv @@ -1,22 +1,2 @@ -name,price,available,description,photo,merchant_username -Track Pants,5000,20,Run faster sweat less,https://img.etsystatic.com/il/557be1/1397617100/il_570xN.1397617100_hbfj.jpg?version=2,gregg -Pink Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7hS4Q98DdAFHMLc0KiU70V1w9_-Vj63hfb4HAbSeAF7EhrMO4Og,gregg -Orange Head Band,699,20,No more sweat on your brows,https://images-na.ssl-images-amazon.com/images/I/2105qPRuO3L.jpg,gregg -Rain Jacket,3545,20,It will fight off the rain,https://img.etsystatic.com/il/bc058f/1469960898/il_570xN.1469960898_1l2g.jpg?version=0,tyronn -White Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSi0uC5YCQw4wPrSqbF4f_Vy6bj7of4xU2UfcWaFgaBJENIGUSswg,becky -Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://d3eum8lucccgeh.cloudfront.net/designs/32518/DontSweat_grn.jpg,mark -Purple Leotard,100,20,Move around easier,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2pcWWgkfWtT9sCk7uJLoiSJXxVNZFZ-BUUGfSkIl75eHj0IFKfA,tyronn -Red Leotard,200,20,Let it shine,https://img.etsystatic.com/il/ba4e45/1088013044/il_570xN.1088013044_iqj2.jpg?version=1,tyronn -Black Tights,90,10,Release the sweat,https://rlv.zcache.co.uk/black_and_white_80s_style_leggings-rfc5f404502bc4d8e96e0024d6923df38_6ftq3_260.jpg?rlvnet=1,gregg -Track Jacket,2700,20,Run faster sweat less, https://www.etsy.com/listing/586314321/vtg-80s-crinkle-nylon-track-jacket-bold?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=80s%20track%20jacket&ref=sr_gallery-1-1,gregg -Spandex,5000,20,Run faster sweat less, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjePGQzichk23U5SuvA3lfx6bs5Kk1gDIPd0uf_vNRmtrMUnjFvA,gregg -Neon Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTja6mFBrA_bETAZxt7VFuhLQJ6cxblasq5UZikxycFH6hdI3vp,steve -Green Spandex,5000,20,Run faster sweat less, https://images-na.ssl-images-amazon.com/images/I/41oVO%2BPcNuL.jpg,gregg -Leggings,5000,20,Run faster sweat less,https://ih0.redbubble.net/image.413146829.8415/leggings,m,x875,front-bg,f3f3f3.2u3.jpg,gregg -Touquoise Tights,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzwAoa1ivQNHyTTkcQpxAdx6kKfDwouri_Dhx9mIfhZdD77nkT,tyronn -Dry fit Shirt,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQEwKyPTI4qtkNvqj5V4i5fjDTTJ0WpErK6AFZp0Jf9MgBlRKwMg,gregg -Neon Sneakers,6405,20,Protection for all the sweat, https://c2.staticflickr.com/4/3259/2786550775_62cc73ca14_z.jpg?zz=1,becky -Purple Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQVlQpQlULhphplRcysE375sKUo8Z6mwCiCeFYYrZ-jmBbrA10QaA,becky -Silk Leotard,200,20,Let it shine,https://cdn-img-1.wanelo.com/p/d32/571/6b5/5e4564e57ff129f747ad555/x354-q80.jpg,tyronn -Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIO2Fgsx7PxowCtLuzPtRLIR7yIam8ayH97oBYStJBSBbsqNVs,steve -Jazz legs,200,20,Let it shine,https://i.pinimg.com/originals/23/de/e8/23dee8bb0263a8507325f0cdbd8b37f9.jpg,tyronn +name,price,available,description,photo,merchant +Track Pants,5000,20,Run faster sweat less,https://img.etsystatic.com/il/557be1/1397617100/il_570xN.1397617100_hbfj.jpg?version=2,1 diff --git a/db/seed_data/products2.csv b/db/seed_data/products2.csv new file mode 100644 index 0000000000..93c99693fa --- /dev/null +++ b/db/seed_data/products2.csv @@ -0,0 +1,22 @@ +name,price,available,description,photo,merchant +Track Pants,5000,20,Run faster sweat less,http://via.placeholder.com/200x250,1 +Pink Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7hS4Q98DdAFHMLc0KiU70V1w9_-Vj63hfb4HAbSeAF7EhrMO4Og,1 +Orange Head Band,699,20,No more sweat on your brows,https://images-na.ssl-images-amazon.com/images/I/2105qPRuO3L.jpg,1 +Rain Jacket,3545,20,It will fight off the rain,https://img.etsystatic.com/il/bc058f/1469960898/il_570xN.1469960898_1l2g.jpg?version=0,2 +White Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSi0uC5YCQw4wPrSqbF4f_Vy6bj7of4xU2UfcWaFgaBJENIGUSswg,4 +Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://d3eum8lucccgeh.cloudfront.net/designs/32518/DontSweat_grn.jpg,5 +Purple Leotard,100,20,Move around easier,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2pcWWgkfWtT9sCk7uJLoiSJXxVNZFZ-BUUGfSkIl75eHj0IFKfA,2 +Red Leotard,200,20,Let it shine,https://img.etsystatic.com/il/ba4e45/1088013044/il_570xN.1088013044_iqj2.jpg?version=1,2 +Black Tights,90,10,Release the sweat,https://rlv.zcache.co.uk/black_and_white_80s_style_leggings-rfc5f404502bc4d8e96e0024d6923df38_6ftq3_260.jpg?rlvnet=1,1 +Track Jacket,2700,20,Run faster sweat less, https://www.etsy.com/listing/586314321/vtg-80s-crinkle-nylon-track-jacket-bold?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=80s%20track%20jacket&ref=sr_gallery-1-1,1 +Spandex,5000,20,Run faster sweat less, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjePGQzichk23U5SuvA3lfx6bs5Kk1gDIPd0uf_vNRmtrMUnjFvA,1 +Neon Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTja6mFBrA_bETAZxt7VFuhLQJ6cxblasq5UZikxycFH6hdI3vp,3 +Green Spandex,5000,20,Run faster sweat less, https://images-na.ssl-images-amazon.com/images/I/41oVO%2BPcNuL.jpg,1 +Leggings,5000,20,Run faster sweat less,https://ih0.redbubble.net/image.413146829.8415/leggings,m,x875,front-bg,f3f3f3.2u3.jpg,1 +Touquoise Tights,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzwAoa1ivQNHyTTkcQpxAdx6kKfDwouri_Dhx9mIfhZdD77nkT,2 +Dry fit Shirt,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQEwKyPTI4qtkNvqj5V4i5fjDTTJ0WpErK6AFZp0Jf9MgBlRKwMg,1 +Neon Sneakers,6405,20,Protection for all the sweat, https://c2.staticflickr.com/4/3259/2786550775_62cc73ca14_z.jpg?zz=1,becky +Purple Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQVlQpQlULhphplRcysE375sKUo8Z6mwCiCeFYYrZ-jmBbrA10QaA,4 +Silk Leotard,200,20,Let it shine,https://cdn-img-1.wanelo.com/p/d32/571/6b5/5e4564e57ff129f747ad555/x354-q80.jpg,2 +Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIO2Fgsx7PxowCtLuzPtRLIR7yIam8ayH97oBYStJBSBbsqNVs,3 +Jazz legs,200,20,Let it shine,https://i.pinimg.com/originals/23/de/e8/23dee8bb0263a8507325f0cdbd8b37f9.jpg,2 diff --git a/db/seeds.rb b/db/seeds.rb index bdf6222d05..03c559e07a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -74,7 +74,7 @@ -PRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'products.csv') +PRODUCTS_FILE = Rails.root.join('db', 'seed_data', 'products2.csv') puts "Loading raw category data from #{PRODUCTS_FILE}" product_failures = [] @@ -85,7 +85,7 @@ product.available = row['available'] product.description = row['description'] product.photo = row['photo'] - product.merchant_id = row['merchant_username'] + product.merchant_id = row['merchant'] successful = product.save if !successful product_failures << product @@ -109,7 +109,8 @@ review = Review.new review.rating = row['rating'] review.description = row['description'] - review.product_id = row['product_name'] + product = Product.find_by(name: row['product_name']) + review.product_id = product.id successful = review.save if !successful review_failures << review From 768d0e60203b8965f74f6bc8ffc922197dba2b3c Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 26 Apr 2018 20:01:50 -0700 Subject: [PATCH 196/236] Order validations tests working --- test/models/order_test.rb | 156 +++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 10931c67df..42bd4e68c3 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -5,7 +5,7 @@ describe "validations" do before do @order = orders(:basic_order) - @blank_order = Order.new() + @progress_order = Order.new(status: "in progress") end it 'can be created with all required fields' do @@ -13,137 +13,137 @@ result.must_equal true end - # name + # WHEN IN PROGRESS IT.... it "requires a name" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :name + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :name end # email it "requires an email" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :email + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :email end - it "requires an @ sign in the email" do - @order.email = "emailnoatsign" - @order.valid?.must_equal false - @order.errors.messages.must_include :email + it "requires an @ sign in the email when in progress" do + @progress_order.email = "emailnoatsign" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :email end # address it "requires an address" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :address + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :address end it "requires a number at beginning of address" do - @order.address = "not starting w/ numbers" - @order.valid?.must_equal false - @order.errors.messages.must_include :address + @progress_order.address = "not starting w/ numbers" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :address end # cc_num it "requires a cc_num" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :cc_num + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_num end it "requires 16 digits" do - @order.cc_num = "111222" - @order.valid?.must_equal false - @order.errors.messages.must_include :cc_num + @progress_order.cc_num = "111222" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_num end it "requires digits only - test with letters only" do - @order.cc_num = "no numbersssssss" - @order.valid?.must_equal false - @order.errors.messages.must_include :cc_num + @progress_order.cc_num = "no numbersssssss" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_num end it "requires digits only - test with some letters" do - @order.cc_num = "1letters23456789" - @order.valid?.must_equal false - @order.errors.messages.must_include :cc_num + @progress_order.cc_num = "1letters23456789" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_num end # expiry_date - it "requires a expiry_date" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :expiry_date - end - - it "requires 4 digits" do - @order.expiry_date = "113" - @order.valid?.must_equal false - @order.errors.messages.must_include :expiry_date - end - - it "requires digits only - test with letters only" do - @order.expiry_date = "xxxx" - @order.valid?.must_equal false - @order.errors.messages.must_include :expiry_date - end - - it "requires digits only - test with some letters" do - @order.expiry_date = "1x2x" - @order.valid?.must_equal false - @order.errors.messages.must_include :expiry_date - end + # it "requires a expiry_date" do + # @blank_order.valid?.must_equal false + # @blank_order.errors.messages.must_include :expiry_date + # end + # + # it "requires 4 digits" do + # @order.expiry_date = "113" + # @order.valid?.must_equal false + # @order.errors.messages.must_include :expiry_date + # end + # + # it "requires digits only - test with letters only" do + # @order.expiry_date = "xxxx" + # @order.valid?.must_equal false + # @order.errors.messages.must_include :expiry_date + # end + # + # it "requires digits only - test with some letters" do + # @order.expiry_date = "1x2x" + # @order.valid?.must_equal false + # @order.errors.messages.must_include :expiry_date + # end # cc_cvv it "requires a cc_cvv" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :cc_cvv + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_cvv end it "requires 3 digits" do - @order.cc_cvv = "1234" - @order.valid?.must_equal false - @order.errors.messages.must_include :cc_cvv + @progress_order.cc_cvv = "1234" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_cvv end it "requires digits only - test with letters only" do - @order.cc_cvv = "xxx" - @order.valid?.must_equal false - @order.errors.messages.must_include :cc_cvv + @progress_order.cc_cvv = "xxx" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_cvv end it "requires digits only - test with some letters" do - @order.cc_cvv = "1x2" - @order.valid?.must_equal false - @order.errors.messages.must_include :cc_cvv + @progress_order.cc_cvv = "1x2" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :cc_cvv end # zip it "requires a zip" do - @blank_order.valid?.must_equal false - @blank_order.errors.messages.must_include :zip + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :zip end it "requires digits only - test with letters only" do - @order.zip = "xxxxx" - @order.valid?.must_equal false - @order.errors.messages.must_include :zip + @progress_order.zip = "xxxxx" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :zip end it "requires digits only - test with some letters" do - @order.zip = "1x3x5" - @order.valid?.must_equal false - @order.errors.messages.must_include :zip + @progress_order.zip = "1x3x5" + @progress_order.valid?.must_equal false + @progress_order.errors.messages.must_include :zip end end - describe "relations" do - it "has a merchant" do - end - - it "has a list of products" do - # order = orders(:order_one) - # order.must_respond_to :products - # order.products.each do |product| - # product.must_be_kind_of Product - end - end + # describe "relations" do + # it "has a merchant" do + # end + # + # it "has a list of products" do + # # order = orders(:order_one) + # # order.must_respond_to :products + # # order.products.each do |product| + # # product.must_be_kind_of Product + # end + # end end From 188e614801e04dc322a436807505bfde21fd3405 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 20:06:59 -0700 Subject: [PATCH 197/236] Change intro on homepage --- app/assets/stylesheets/application.css | 4 ++++ app/views/products/root.html.erb | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index bc5042066f..3a2cbcfa5d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -30,8 +30,12 @@ body { /*font-family: 'Handlee', cursive;*/ /*font-family: 'Arsenal', sans-serif;*/ /*font-family: 'Neucha', cursive;*/ +} +h2, h3, h4, h5 { + font-family: 'Shadows Into Light', cursive; } + /*Navbar styling*/ .nav { width: 100%; diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index b68ad67951..17677b56ff 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -9,7 +9,8 @@

    Our Story


    -

    Storify Dan Fleckner Robin Sloan hashtag future of context The Work of Art in the Age of Mechanical Reproduction fourth estate semipermeable newspaper strike fair use hyperlocal West Seattle Blog process vs. product, startups discuss production of innocence commons-based peer production hashtag paidContent Ushahidi I saw it on Mediagazer trolls dingbat David Foster Wallace crowdsourcing, net neutrality Neil Postman analytics Walter Cronkite died for your sins Gutenberg afternoon paper TechCrunch NPR fair use Innovator's Dilemma +1.

    +

    Are you ready to get sweaty? Sweatsy is the brainchild of Ludwig Von Swetson and Lucretia Sweatovsky, two exercise enterpreneur enthusiasts. Their vision was to start business to offer people of all walks of life high-end couture active wear. From leggings to spandex, to leotards and scrunchies, our apparel is guaranteed to make you sweat in as fabulous a way possible. We source from the most elite factories of the Lithuanian countryside and use the most sweatastic and semipermeable textiles. We hope you enjoy perusing our stock of sweaty accessories and consider buying something to help you reach sweat success! Don't sweat the small stuff! Start your day with sweatsy and love your life bigly. Hashtag live life to the sweatiest. Hashtag life is sweet and sweaty. Don't forget to follow us on Instagram puh-lease! Thank you for visiting our beautiful website! It is the best website, trust us no bugs just sweat. +

    @@ -91,8 +92,6 @@
  • <%= link_to Merchant.find(4).username, merchants_path %>
  • <%= link_to "See More", merchants_path, class:'button' %> -
    - <%= link_to "Sign Up to Sell", new_merchant_path, class:'button' %>
    From b05146d20c9ff6320593712d397ca79f53a19e1a Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Thu, 26 Apr 2018 20:26:59 -0700 Subject: [PATCH 198/236] Seeds working due to removal of leggings --- db/seed_data/categories-products.csv | 2 -- db/seed_data/products2.csv | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/db/seed_data/categories-products.csv b/db/seed_data/categories-products.csv index 4a97c9bcf5..97fc2a98ef 100644 --- a/db/seed_data/categories-products.csv +++ b/db/seed_data/categories-products.csv @@ -20,8 +20,6 @@ Shirts,Track Jacket Tights,Spandex Tights,Green Spandex Accessories,Neon Head Band -Tights,Leggings -Pants,Leggings Tights,Touquoise Tights Shirts,Dry fit Shirt Dry fit,Dry fit Shirt diff --git a/db/seed_data/products2.csv b/db/seed_data/products2.csv index 93c99693fa..6d3c5424f6 100644 --- a/db/seed_data/products2.csv +++ b/db/seed_data/products2.csv @@ -12,10 +12,9 @@ Track Jacket,2700,20,Run faster sweat less, https://www.etsy.com/listing/5863143 Spandex,5000,20,Run faster sweat less, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjePGQzichk23U5SuvA3lfx6bs5Kk1gDIPd0uf_vNRmtrMUnjFvA,1 Neon Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTja6mFBrA_bETAZxt7VFuhLQJ6cxblasq5UZikxycFH6hdI3vp,3 Green Spandex,5000,20,Run faster sweat less, https://images-na.ssl-images-amazon.com/images/I/41oVO%2BPcNuL.jpg,1 -Leggings,5000,20,Run faster sweat less,https://ih0.redbubble.net/image.413146829.8415/leggings,m,x875,front-bg,f3f3f3.2u3.jpg,1 Touquoise Tights,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQzwAoa1ivQNHyTTkcQpxAdx6kKfDwouri_Dhx9mIfhZdD77nkT,2 Dry fit Shirt,90,10,Release the sweat,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSQEwKyPTI4qtkNvqj5V4i5fjDTTJ0WpErK6AFZp0Jf9MgBlRKwMg,1 -Neon Sneakers,6405,20,Protection for all the sweat, https://c2.staticflickr.com/4/3259/2786550775_62cc73ca14_z.jpg?zz=1,becky +Neon Sneakers,6405,20,Protection for all the sweat, https://c2.staticflickr.com/4/3259/2786550775_62cc73ca14_z.jpg?zz=1,3 Purple Sneakers,6405,20,Protection for all the sweat, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQVlQpQlULhphplRcysE375sKUo8Z6mwCiCeFYYrZ-jmBbrA10QaA,4 Silk Leotard,200,20,Let it shine,https://cdn-img-1.wanelo.com/p/d32/571/6b5/5e4564e57ff129f747ad555/x354-q80.jpg,2 Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQIO2Fgsx7PxowCtLuzPtRLIR7yIam8ayH97oBYStJBSBbsqNVs,3 From 4ab399c949621cf0f663a2bf8960fca1a4923463 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Thu, 26 Apr 2018 22:17:56 -0700 Subject: [PATCH 199/236] Update env --- .env | 4 ++-- app/controllers/order_products_controller.rb | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.env b/.env index b44e881b20..3dd2a4bc84 100644 --- a/.env +++ b/.env @@ -1,2 +1,2 @@ -GITHUB_CLIENT_ID: 909eae782360615a1a5b -GITHUB_CLIENT_SECRET: afa44dedcc50742e510ad19a1c22e9458c2d5d02 +GITHUB_CLIENT_ID: 8cb4e4eceaecd5333c10 +GITHUB_CLIENT_SECRET: ed249395bdf7bf5c4a36ca8c1a71631dcb557265 diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index d4897a0962..449c91bd3e 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -33,9 +33,6 @@ def create end end - def order_num_valid?(quantity, availability) - - end # def create # @order = current_order From d69c861e6877dee485cf4cb3e9b9107b5b6f6787 Mon Sep 17 00:00:00 2001 From: samanthaberk <15961601+samanthaberk@users.noreply.github.com> Date: Thu, 26 Apr 2018 22:19:10 -0700 Subject: [PATCH 200/236] Delete .env --- .env | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index b44e881b20..0000000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -GITHUB_CLIENT_ID: 909eae782360615a1a5b -GITHUB_CLIENT_SECRET: afa44dedcc50742e510ad19a1c22e9458c2d5d02 From fb96156a6a9909129e9782a098c979541ab839d6 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 00:09:06 -0700 Subject: [PATCH 201/236] Reducted failures and errors for tests --- app/controllers/orders_controller.rb | 4 - app/models/order.rb | 2 +- config/routes.rb | 2 +- .../controllers/categories_controller_test.rb | 21 ++++- test/controllers/merchants_controller_test.rb | 2 + .../order_products_controller_test.rb | 4 +- test/controllers/orders_controller_test.rb | 29 ++++--- test/controllers/products_controller_test.rb | 15 +++- test/fixtures/categories.yml | 12 +-- test/fixtures/orders.yml | 12 ++- test/fixtures/reviews.yml | 4 +- test/models/category_test.rb | 8 +- test/models/order_test.rb | 79 +++++++++++++------ test/models/review_test.rb | 13 ++- 14 files changed, 142 insertions(+), 65 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index e16dffcfe1..c0448e54f0 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,10 +4,6 @@ class OrdersController < ApplicationController def show; end - def new - @order = Order.new() - end - def create @order = Order.new(order_params) @order.status = 'pending' diff --git a/app/models/order.rb b/app/models/order.rb index a03a3de5ba..d763f6c922 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -41,7 +41,7 @@ def decrement(order) end def update_status - if self.status == nil? + if self.status == nil self.status = "pending" end end diff --git a/config/routes.rb b/config/routes.rb index 5d9bdf50ee..f533bfdad2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -17,7 +17,7 @@ resources :reviews, only: [:new, :show, :create] end - resources :orders, only: [:show, :new, :create, :update] + resources :orders, only: [:show, :create, :update] get '/checkout', to: 'carts#edit', as: :checkout get '/order_confirmation', to: 'carts#confirmation', as: :confirmation diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index 125dd4c91d..cdeb253492 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -1,7 +1,22 @@ require "test_helper" describe CategoriesController do - # it "must be a real test" do - # flunk "Need real tests" - # end + + describe "index" do + it "sends a success reponse when there are many categories" do + Category.count.must_be :>, 0 + get categories_path + must_respond_with :success + end + + it "sends a success response when there are no categories" do + # destroy all products before destroying all categories + Product.destroy_all + Category.destroy_all + Category.count.must_equal 0 + get merchants_path + must_respond_with :success + end + end + end diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 46f5754161..90a5525db9 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -10,6 +10,8 @@ end it "sends a success response when there are no merchants" do + # destroy all products before destroying all merchants due to foreign key constraint + Product.destroy_all Merchant.destroy_all Merchant.count.must_equal 0 get merchants_path diff --git a/test/controllers/order_products_controller_test.rb b/test/controllers/order_products_controller_test.rb index b0754fde7a..b4e157b21c 100644 --- a/test/controllers/order_products_controller_test.rb +++ b/test/controllers/order_products_controller_test.rb @@ -12,6 +12,7 @@ quantity: 10, product_id: Product.first.id } + # equals 0 old_count = order.order_products.count @@ -19,6 +20,7 @@ must_respond_with :redirect must_redirect_to products_path + # still equals 0, not saving order.order_products.count.must_equal old_count + 1 end @@ -50,8 +52,6 @@ item_data = order_product.attributes item_data[:quantity] = 2 - order_product.assign_attributes(item_data) - patch order_product_path(order_product), params: { order_product: item_data } end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index a09f54b368..2491ec73e0 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -18,20 +18,11 @@ end - describe 'new' do - - it 'responds with success' do - get new_order_path - must_respond_with :success - end - - end - describe 'create' do it "can add a valid order" do order_data = { - status: nil, + status: "in progress", name: "Max", email: "max@adaacademy.com", # address zip @@ -51,11 +42,15 @@ must_respond_with :redirect must_redirect_to order_path(Order.last.id) - Order.count.must_equal old_order_count + 1 + # 2 bc a new cart is created when order_path is run + # after it's complete there's an empty cart in addition to the order added + Order.count.must_equal old_order_count + 2 Order.last.name.must_equal order_data[:name] end - it "won't add an invalid order" do + # cart is created with only some of the payment validation errors + # this can't actually occur on the website bc validations are ran when payment details are processed + it "accepts invalid order bc it will hit validations at payment" do order_data = { name: "Max", email: "max@adaacademy.com", @@ -69,12 +64,16 @@ } old_order_count = Order.count - Order.new(order_data).wont_be :valid? + Order.new(order_data).must_be :valid? post orders_path, params: { order: order_data } - must_respond_with :bad_request - Order.count.must_equal old_order_count + must_respond_with :redirect + must_redirect_to order_path(Order.last.id) + + # 2 bc a new cart is created when order_path is run + # after it's complete there's an empty cart in addition to the order added + Order.count.must_equal old_order_count + 2 end end diff --git a/test/controllers/products_controller_test.rb b/test/controllers/products_controller_test.rb index 158bd45aa0..196303efdb 100644 --- a/test/controllers/products_controller_test.rb +++ b/test/controllers/products_controller_test.rb @@ -32,11 +32,12 @@ describe 'create' do it "can add a product with valid data" do + merchant = Merchant.first product_data = { name: 'random', price: 3, available: 4, - merchant_id: Merchant.first.id + merchant_id: merchant.id } old_product_count = Product.count @@ -47,7 +48,7 @@ post products_path, params: { product: product_data} must_respond_with :redirect - must_redirect_to merchant_products_path + must_redirect_to merchant_products_path(merchant.id) Product.count.must_equal old_product_count + 1 @@ -124,7 +125,10 @@ end it "sends bad_request when data is invalid" do - product = Product.first + merchant = Merchant.first + login(merchant) + + product = Product.find_by(merchant: merchant) product_data = product.attributes product_data[:name] = "" @@ -153,7 +157,10 @@ describe 'destroy' do it "can destroy a product" do - product_id = Product.first.id + merchant = Merchant.first + login(merchant) + + product_id = Product.find_by(merchant: merchant).id old_product_count = Product.count delete product_path(product_id) diff --git a/test/fixtures/categories.yml b/test/fixtures/categories.yml index dc3ee79b5d..b347670566 100644 --- a/test/fixtures/categories.yml +++ b/test/fixtures/categories.yml @@ -3,9 +3,9 @@ # 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 + +shorts: + name: shorts + +pants: + name: pants diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml index 5a24eb4125..de6207ff56 100644 --- a/test/fixtures/orders.yml +++ b/test/fixtures/orders.yml @@ -5,7 +5,7 @@ # below each fixture, per the syntax in the comments below basic_order: - status: pending + status: in progress name: Dan email: dan@adaacademy.org address: 1215 4th Ave, Seattle, WA 98161 @@ -13,3 +13,13 @@ basic_order: expiry_date: 1020 cc_cvv: 111 zip: 98161 + +paid_order: + status: in progress + name: Kari + email: kari@adaacademy.org + address: 3333 8th Ave, Seattle, WA 98161 + cc_num: 1234567892323232 + expiry_date: 0120 + cc_cvv: 101 + zip: 98111 diff --git a/test/fixtures/reviews.yml b/test/fixtures/reviews.yml index 224e299f8e..de9a25ae04 100644 --- a/test/fixtures/reviews.yml +++ b/test/fixtures/reviews.yml @@ -7,9 +7,9 @@ one: rating: 1 description: This review is for product 1 - product_id: hb + product: hb two: rating: 2 description: This is review is for product 2 - product_id: water + product: water diff --git a/test/models/category_test.rb b/test/models/category_test.rb index 781320ad8e..04adf4721a 100644 --- a/test/models/category_test.rb +++ b/test/models/category_test.rb @@ -1,9 +1,15 @@ require "test_helper" describe Category do - let(:category) { Category.new } + let(:category) { Category.new(name: "accessories") } it "must be valid" do value(category).must_be :valid? end + + it "must be invalid without a name" do + category = Category.new(name: nil) + category.wont_be :valid? + end + end diff --git a/test/models/order_test.rb b/test/models/order_test.rb index 42bd4e68c3..c5b14b12cb 100644 --- a/test/models/order_test.rb +++ b/test/models/order_test.rb @@ -67,30 +67,6 @@ @progress_order.errors.messages.must_include :cc_num end - # expiry_date - # it "requires a expiry_date" do - # @blank_order.valid?.must_equal false - # @blank_order.errors.messages.must_include :expiry_date - # end - # - # it "requires 4 digits" do - # @order.expiry_date = "113" - # @order.valid?.must_equal false - # @order.errors.messages.must_include :expiry_date - # end - # - # it "requires digits only - test with letters only" do - # @order.expiry_date = "xxxx" - # @order.valid?.must_equal false - # @order.errors.messages.must_include :expiry_date - # end - # - # it "requires digits only - test with some letters" do - # @order.expiry_date = "1x2x" - # @order.valid?.must_equal false - # @order.errors.messages.must_include :expiry_date - # end - # cc_cvv it "requires a cc_cvv" do @progress_order.valid?.must_equal false @@ -146,4 +122,59 @@ # end # end + describe 'order_total' do + before do + @paid_order = orders(:paid_order) + @p_one = products(:hb) + @p_two = products(:water) + @p_three = products(:pants) + end + + it "returns zero with no products" do + @paid_order.order_total.must_equal 0 + end + + it "calculates total with one of one product" do + OrderProduct.create(order: @paid_order, product: @p_one, quantity: 1) + @paid_order.order_total.must_equal 10 + end + + it "calculates total with many of one product" do + OrderProduct.create(order: @paid_order, product: @p_one, quantity: 4) + @paid_order.order_total.must_equal 40 + end + + it "calculates total with many products" do + OrderProduct.create(order: @paid_order, product: @p_one, quantity: 1) + OrderProduct.create(order: @paid_order, product: @p_two, quantity: 3) + OrderProduct.create(order: @paid_order, product: @p_three, quantity: 5) + + @paid_order.order_total.must_equal 113 + end + end + + describe 'update_status' do + + it "updates status when nil" do + new_order = Order.new() + new_order.save + + new_order.status == nil + + new_order.update_status + + new_order.status.must_equal "pending" + end + + it "doesn't update status when not nil" do + order = Order.create(status: 'notnil') + order.status.must_equal 'notnil' + + order.update_status + + order.status.must_equal 'notnil' + end + + end + end diff --git a/test/models/review_test.rb b/test/models/review_test.rb index 09b8b33835..a94442361d 100644 --- a/test/models/review_test.rb +++ b/test/models/review_test.rb @@ -70,8 +70,19 @@ end end + + it "connects merchant and merchant_id" do + merchant = Merchant.first + product = Product.find_by(merchant_id: Merchant.first.id) + + product.must_respond_to :merchant + product.merchant_id.must_equal merchant.id + product.merchant.must_be_kind_of Merchant + end + + describe 'relations' do - it "must respond to products" do + it "must respond to product" do review = Review.first review.must_respond_to :product From 17ee92654e18ae545096a6e7bdf27666cd98e188 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 00:13:38 -0700 Subject: [PATCH 202/236] Confirmed site works after testing --- app/models/order.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/order.rb b/app/models/order.rb index d763f6c922..92ea26ffd3 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -7,19 +7,19 @@ class Order < ApplicationRecord validates :name, presence: true, if: :ready_to_process? - validates :email, presence: true, if: :ready_to_process?, format: {with: /@/, message: "Must include @"} + validates :email, presence: true, if: :ready_to_process?, format: {with: /@/, message: "must include @"} validates :address, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+/, - message: "Must start with digits" } + message: "must start with digits" } validates :cc_num, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{16}\z/, - message: "Digits only" } + message: "digits only" } validates :cc_cvv, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{3}\z/, - message: "Digits only" } + message: "digits only" } validates :zip, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+\z/, - message: "Digits only" } + message: "digits only" } def ready_to_process? self.status == "in progress" From 9b0971f490832a6fa60535948ccfe42cfac224d1 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 08:48:48 -0700 Subject: [PATCH 203/236] Add text to footer --- app/views/layouts/application.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 33706c59e4..b5d7c19c9b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -66,7 +66,8 @@
    -

    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Expedita dolorem accusantium architecto id quidem, itaque nesciunt quam ducimus atque.

    +

    Sweatsy is a proud member of the Sweatastic Society and promotes healthy living and perspiration. Sweat constantly and awesomely, but don't sweat the little things!

    +
    From 430c53273cce431c33f57bc480dcf316482933d3 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 08:52:03 -0700 Subject: [PATCH 204/236] Move new category label to button on merchant dashboard --- app/views/merchants/show.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/merchants/show.html.erb b/app/views/merchants/show.html.erb index cb2310337a..04e8a742d6 100644 --- a/app/views/merchants/show.html.erb +++ b/app/views/merchants/show.html.erb @@ -9,16 +9,16 @@
    <%= link_to "Manage your orders", merchant_orders_path(@merchant.id) %>
    -
    Create a new category
    + <%= form_for :category, url: categories_path do |f|%> <%= f.label :name %> <%= f.text_field :name %> - <%= f.submit %> + <%= f.submit "Add a new category" %> <% end %>
    From d9c43a5fc54dcea633f28a741e534b28aebb2e0b Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 27 Apr 2018 09:20:49 -0700 Subject: [PATCH 205/236] updated track pants picture. --- db/seed_data/products2.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/seed_data/products2.csv b/db/seed_data/products2.csv index 6d3c5424f6..94bac4720a 100644 --- a/db/seed_data/products2.csv +++ b/db/seed_data/products2.csv @@ -1,5 +1,5 @@ name,price,available,description,photo,merchant -Track Pants,5000,20,Run faster sweat less,http://via.placeholder.com/200x250,1 +Track Pants,5000,20,Run faster sweat less,https://img.etsystatic.com/il/557be1/1397617100/il_570xN.1397617100_hbfj.jpg?version=2,1 Pink Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ7hS4Q98DdAFHMLc0KiU70V1w9_-Vj63hfb4HAbSeAF7EhrMO4Og,1 Orange Head Band,699,20,No more sweat on your brows,https://images-na.ssl-images-amazon.com/images/I/2105qPRuO3L.jpg,1 Rain Jacket,3545,20,It will fight off the rain,https://img.etsystatic.com/il/bc058f/1469960898/il_570xN.1469960898_1l2g.jpg?version=0,2 From 4a4db99db0c0e7542a422a516b0dc34ca4598b00 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 09:23:12 -0700 Subject: [PATCH 206/236] Add sweatsy definition to homepage --- app/assets/stylesheets/orders.scss | 4 ++ app/views/orders/index.html.erb | 76 ++++++++++++++++++------------ app/views/products/root.html.erb | 7 ++- 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 741506954d..828637ad2c 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -1,3 +1,7 @@ // 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/ + +.order-summary { + padding: 2em 4em; +} diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 66030def50..63183f7881 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -1,33 +1,47 @@ -

    <%= @merchant.username.capitalize %>'s Order Summary Page

    +

    <%= @merchant.username.capitalize %>'s Order Summary Page

    - - - - - - - - - - - - +
    +

    Order Details

    +
    ProductQuantitySubtotalStatusDateBuyerEmailAddressShip
    + + + + + + + + + + + + + + + <% @orders.each do |order| %> + + + + + + + + + + + + <% end %> + +
    ProductQuantitySubtotalStatusDateBuyerEmailAddressShip
    <%= link_to Product.find(order.id).name, product_path(Product.find(order.id)) %><%= order.quantity %><%= number_to_currency(order.subtotal) %><%= order.order.status %><%= order.order.created_at.strftime("%B %d, %Y") %><%= order.order.name %><%= order.order.email %><%= order.order.address %><%= link_to "Ship Order", product_path(Product.find(order.id)) %>
    - - - - <% @orders.each do |order| %> - - <%= link_to Product.find(order.id).name, product_path(Product.find(order.id)) %> - <%= order.quantity %> - <%= number_to_currency(order.subtotal) %> - <%= order.order.status %> - <%= order.order.created_at.strftime("%B %d, %Y") %> - <%= order.order.name %> - <%= order.order.email %> - <%= order.order.address %> - <%= link_to "Ship Order", product_path(Product.find(order.id)) %> - - <% end %> - - +

    Revenue

    + + + + + + + + + +
    Revenue from Paid Orders (not shipped)Revenue from Shipped OrdersTotal Revenue
    +
    diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index 17677b56ff..9a63d7a2fa 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -9,6 +9,11 @@

    Our Story


    + +
    +
    Sweatsy, adj.: being both sweaty and sexy.
    +
    +

    Are you ready to get sweaty? Sweatsy is the brainchild of Ludwig Von Swetson and Lucretia Sweatovsky, two exercise enterpreneur enthusiasts. Their vision was to start business to offer people of all walks of life high-end couture active wear. From leggings to spandex, to leotards and scrunchies, our apparel is guaranteed to make you sweat in as fabulous a way possible. We source from the most elite factories of the Lithuanian countryside and use the most sweatastic and semipermeable textiles. We hope you enjoy perusing our stock of sweaty accessories and consider buying something to help you reach sweat success! Don't sweat the small stuff! Start your day with sweatsy and love your life bigly. Hashtag live life to the sweatiest. Hashtag life is sweet and sweaty. Don't forget to follow us on Instagram puh-lease! Thank you for visiting our beautiful website! It is the best website, trust us no bugs just sweat.

    @@ -86,7 +91,7 @@

    See Top Sellers


      -
    • <%= link_to Merchant.find(1).username, merchants_path %>
    • +
    • <%= link_to Merchant.find(1).username, merchants_path %>
    • <%= link_to Merchant.find(2).username, merchants_path %>
    • <%= link_to Merchant.find(3).username, merchants_path %>
    • <%= link_to Merchant.find(4).username, merchants_path %>
    • From 5691f6191f960a555d4568394c167467b98ff4fc Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 09:35:15 -0700 Subject: [PATCH 207/236] more changes to order --- app/controllers/order_products_controller.rb | 17 ----------------- app/models/order.rb | 4 ++++ app/views/orders/index.html.erb | 6 +++++- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/app/controllers/order_products_controller.rb b/app/controllers/order_products_controller.rb index 449c91bd3e..146a4789a7 100644 --- a/app/controllers/order_products_controller.rb +++ b/app/controllers/order_products_controller.rb @@ -33,23 +33,6 @@ def create end end - - # def create - # @order = current_order - # @item = OrderProduct.new(item_params) - # @item.order = @order - # if @order.save && @item.save - # name = Product.find_by(id: @item.product_id).name.titleize - # quant = @item.quantity - # session[:order_id] = @order.id - # flash[:success] = "You added #{quant} #{quant > 1 ? name.pluralize : name}!" - # redirect_to products_path - # else - # # FLASH MESSAGE - # @order.errors.messages - # end - # end - def update # FLASH MESSAGE @item.assign_attributes({quantity: item_params[:quantity]}) diff --git a/app/models/order.rb b/app/models/order.rb index 2c55e3650d..e64669087c 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -36,6 +36,10 @@ def order_total return total end + def find_revenue_paid_orders(merchant) + + end + # reduce the total num of products available when user pays for an order def decrement(order) order.order_products.each do |order_product| diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 63183f7881..1805c49cdf 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -42,6 +42,10 @@ Total Revenue - + + + + + From 8859b87fde71d0bfefd7345f11482ae7b928c1b1 Mon Sep 17 00:00:00 2001 From: samanthaberk <15961601+samanthaberk@users.noreply.github.com> Date: Fri, 27 Apr 2018 09:37:29 -0700 Subject: [PATCH 208/236] Delete .env --- .env | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 3dd2a4bc84..0000000000 --- a/.env +++ /dev/null @@ -1,2 +0,0 @@ -GITHUB_CLIENT_ID: 8cb4e4eceaecd5333c10 -GITHUB_CLIENT_SECRET: ed249395bdf7bf5c4a36ca8c1a71631dcb557265 From 61697f5a4759d944fc2bf777aae658df60b5769b Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 10:04:51 -0700 Subject: [PATCH 209/236] model --- app/controllers/orders_controller.rb | 2 ++ app/models/order.rb | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index fb8f8f77ac..d13faa40eb 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -20,6 +20,8 @@ def index end @products = products + @paid_order_revenues + end def show; end diff --git a/app/models/order.rb b/app/models/order.rb index 83da8a8c53..f3829ee807 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -33,8 +33,8 @@ def order_total return total end - def find_revenue_paid_orders(merchant) - + def find_revenue_paid_orders(orders) + return orders.sum end # reduce the total num of products available when user pays for an order From 28405303473e1e7e64f784846c8ecf0093a1e153 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 10:14:01 -0700 Subject: [PATCH 210/236] merchant controller tests passing --- app/controllers/merchants_controller.rb | 13 ----- test/controllers/merchants_controller_test.rb | 47 ++----------------- 2 files changed, 3 insertions(+), 57 deletions(-) diff --git a/app/controllers/merchants_controller.rb b/app/controllers/merchants_controller.rb index c82134ce98..9fe9a00d4f 100644 --- a/app/controllers/merchants_controller.rb +++ b/app/controllers/merchants_controller.rb @@ -10,19 +10,6 @@ def new redirect_to merchant_path(@merchant) end - def create - @merchant = Merchant.new(merchant_params) - - if @merchant.save - flash[:success] = "Welcome to Sweatsy. Get ready to get sweaty!" - redirect_to merchant_path(@merchant) - else - flash[:error] = "Something went wrong!" - render :new, status: :bad_request - end - - end - def show @merchant = @current_user redirect_to root_path unless @merchant diff --git a/test/controllers/merchants_controller_test.rb b/test/controllers/merchants_controller_test.rb index 4b5fef43cf..36a058b81a 100644 --- a/test/controllers/merchants_controller_test.rb +++ b/test/controllers/merchants_controller_test.rb @@ -1,5 +1,5 @@ require "test_helper" - +require 'pry' describe MerchantsController do describe "index" do @@ -8,53 +8,12 @@ get merchants_path must_respond_with :success end - - it "sends a success response when there are no merchants" do - Merchant.destroy_all - Merchant.count.must_equal 0 - get merchants_path - must_respond_with :success - end end describe "new" do it "sends a success response" do get new_merchant_path - must_respond_with :success - end - end - - describe "create" do - it "creates a merchant with valid data" do - old_merchant_count = Merchant.count - - merchant_data = { - username: "test user", - email: 'email@gmail.com' - } - - merchant = Merchant.new(merchant_data) - - post merchants_path, params: { merchant: merchant_data} - - must_respond_with :redirect - must_redirect_to merchant_path(Merchant.last.id) - - Merchant.count.must_equal old_merchant_count + 1 - end - - it "renders error for missing data" do - old_merchant_count = Merchant.count - - merchant_data = {email: 'email@gmail.com'} - - merchant = Merchant.new(merchant_data) - Merchant.new(merchant_data).wont_be :valid? - - post merchants_path, params: { merchant: merchant_data} - - must_respond_with :bad_request - Merchant.all.count.must_equal old_merchant_count + must_respond_with :found end end @@ -74,7 +33,7 @@ get merchant_path(merchant) - must_respond_with :not_found + must_redirect_to root_path end end From 4a982d43f02f8c52926a46ccffdee3e192885e4e Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 27 Apr 2018 10:26:37 -0700 Subject: [PATCH 211/236] Updated application controller to find @current_user to fix log in bug. --- 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 c8abd109d5..c27719daf3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -7,7 +7,7 @@ class ApplicationController < ActionController::Base before_action :require_login def current_user - @current_user ||= Merchant.first # Merchant.find(session[:merchant_id]) if session[:merchant_id] + @current_user ||= Merchant.find(session[:merchant_id]) if session[:merchant_id] end # flashes message if current_user can't find a logged-in merchant From bb260d68b65cdb3f717e7ec90780dcb2ab337895 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 10:43:04 -0700 Subject: [PATCH 212/236] merchants can only view own orders --- app/controllers/orders_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index fb8f8f77ac..c2b2bc3862 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,9 +1,9 @@ class OrdersController < ApplicationController - skip_before_action :require_login + before_action :require_login, only: [:show, :index] before_action :find_order, only: [:show] def index - @merchant = Merchant.find(params[:merchant_id]) + @merchant = Merchant.find(session[:merchant_id]) orders = [] OrderProduct.all.each do |order_product| product = Product.find(order_product.product_id) From c8c563964d5a2f94c69295b497e262aa7892840e Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 10:52:05 -0700 Subject: [PATCH 213/236] no longer including test files in simplecov --- test/test_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 2999b0cf38..a6aeed6e36 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,5 @@ require "simplecov" -SimpleCov.start +SimpleCov.start :rails ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) From 9f9aeef221a2f3342ab0259d1d8773e3ef3ff4da Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 10:52:16 -0700 Subject: [PATCH 214/236] Add total revenue from paid not shipped orders to merchant order summary page --- app/controllers/orders_controller.rb | 9 +++++++++ app/models/order.rb | 4 ---- app/views/orders/index.html.erb | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index fb8f8f77ac..9baf53ae97 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -20,6 +20,15 @@ def index end @products = products + unshipped_orders = [] + @orders.each do |order_product| + if order_product.order.status == 'paid' + unshipped_orders << order_product.product.price + end + end + + @unshipped_orders = unshipped_orders.sum + end def show; end diff --git a/app/models/order.rb b/app/models/order.rb index 83da8a8c53..16e4123c65 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -33,10 +33,6 @@ def order_total return total end - def find_revenue_paid_orders(merchant) - - end - # reduce the total num of products available when user pays for an order def decrement(order) order.order_products.each do |order_product| diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 1805c49cdf..2b492e6df6 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -44,7 +44,7 @@ - + <%= number_to_currency(@unshipped_orders) %> From 73a6c4709eac654caabb164e085803ff32418813 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 10:57:16 -0700 Subject: [PATCH 215/236] Add total revenue for shipped orders to merchant order summary --- app/controllers/orders_controller.rb | 5 ++++- app/views/orders/index.html.erb | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 7b648a40a3..ad1891fe20 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -21,14 +21,17 @@ def index @products = products unshipped_orders = [] + shipped_orders = [] @orders.each do |order_product| if order_product.order.status == 'paid' unshipped_orders << order_product.product.price + elsif order_product.order.status == 'shipped' + shipped_orders << order_product.product.price end end @unshipped_orders = unshipped_orders.sum - + @shipped_orders = shipped_orders.sum end def show; end diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 2b492e6df6..5be36eaa4a 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -45,6 +45,7 @@ <%= number_to_currency(@unshipped_orders) %> + <%= number_to_currency(@shipped_orders) %> From 26a9b26e1207316f0978198e62efbf623642a5e5 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 11:00:28 -0700 Subject: [PATCH 216/236] filtered out some simplecove test files --- test/test_helper.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index a6aeed6e36..0bf1f053e3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,5 +1,9 @@ require "simplecov" -SimpleCov.start :rails +SimpleCov.start :rails do + add_filter "/channels/" + add_filter "/jobs/" + add_filter "/mailers/" +end ENV["RAILS_ENV"] = "test" require File.expand_path("../../config/environment", __FILE__) From f1cf0a37bd9e354374190e7c80cc858cbfab2480 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 11:03:57 -0700 Subject: [PATCH 217/236] Add total revenue to merchant order summary page --- app/controllers/orders_controller.rb | 2 ++ app/views/orders/index.html.erb | 1 + 2 files changed, 3 insertions(+) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index ad1891fe20..ade9ccbc06 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -32,6 +32,8 @@ def index @unshipped_orders = unshipped_orders.sum @shipped_orders = shipped_orders.sum + + @total = @unshipped_orders + @shipped_orders end def show; end diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 5be36eaa4a..7b708376ce 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -46,6 +46,7 @@ <%= number_to_currency(@unshipped_orders) %> <%= number_to_currency(@shipped_orders) %> + <%= number_to_currency(@total) %> From 4fa03500330c6688f068cd1bf5ae7d304938e066 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 11:38:09 -0700 Subject: [PATCH 218/236] Add ship order method, route, and button --- app/controllers/orders_controller.rb | 6 +++++- app/models/order.rb | 7 +++++++ app/views/orders/index.html.erb | 2 +- app/views/orders/ship_order.html.erb | 1 + config/routes.rb | 2 ++ 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 app/views/orders/ship_order.html.erb diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index ade9ccbc06..264473e683 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,6 +1,6 @@ class OrdersController < ApplicationController before_action :require_login, only: [:show, :index] - before_action :find_order, only: [:show] + before_action :find_order, only: [:show, :ship_order] def index @merchant = Merchant.find(session[:merchant_id]) @@ -36,6 +36,10 @@ def index @total = @unshipped_orders + @shipped_orders end + def ship_order + @order.ship_order + end + def show; end def create diff --git a/app/models/order.rb b/app/models/order.rb index 16e4123c65..1f9459ea0e 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -46,6 +46,13 @@ def update_status end end + def ship_order + if self.status == "paid" + self.status = "shipped" + self.save + end + end + def get_expiry(params) date = Date.new(params[:order]["expiry_date(1i)"].to_i, params[:order]["expiry_date(2i)"].to_i, diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 7b708376ce..0413228a79 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -27,7 +27,7 @@ <%= order.order.name %> <%= order.order.email %> <%= order.order.address %> - <%= link_to "Ship Order", product_path(Product.find(order.id)) %> + <%= link_to "Ship Order", :controller => "orders", :action => "ship_order", :id => order.order.id%> <% end %> diff --git a/app/views/orders/ship_order.html.erb b/app/views/orders/ship_order.html.erb new file mode 100644 index 0000000000..31eead0d1b --- /dev/null +++ b/app/views/orders/ship_order.html.erb @@ -0,0 +1 @@ +

      Order Shipped!

      diff --git a/config/routes.rb b/config/routes.rb index f533bfdad2..6e20d5dada 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -5,6 +5,8 @@ patch '/products/:id/retire', to: 'products#retire', as: 'retire' + get '/:id/ship_order', to: 'orders#ship_order', as: 'ship_order' + post '/products/:id/add_review', to: 'products#create_review', as: :create_review get '/auth/github', as: 'github_login' From 83d30c8446c588e6b422178e024459887af3e37d Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 11:38:41 -0700 Subject: [PATCH 219/236] Fixed address issue w cart --- app/assets/stylesheets/application.css | 10 +--- app/controllers/carts_controller.rb | 2 +- app/models/order.rb | 16 +++--- app/views/carts/edit.html.erb | 61 ++++++++++++----------- app/views/carts/show.html.erb | 67 ++++++++++++++++---------- 5 files changed, 84 insertions(+), 72 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 014ab9d22e..5ad5636ba8 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -186,11 +186,11 @@ i { display: inline; } -.cart-items { +/*.cart-items { display:grid; grid-template-columns: 1fr 5em repeat(2, 1fr) repeat(2, 100px); font-size: 1.25em; -} +}*/ .checkout-items { display:grid; @@ -210,12 +210,6 @@ input[type=number]::-webkit-outer-spin-button { } -/* .cart-items { - display:grid; - grid-template-columns: 1fr 5em repeat(4, 1fr); - font-size: 1.25em; -} */ - /** FOOTER **/ .site-footer { diff --git a/app/controllers/carts_controller.rb b/app/controllers/carts_controller.rb index 59f84d7d33..189197ef84 100644 --- a/app/controllers/carts_controller.rb +++ b/app/controllers/carts_controller.rb @@ -33,7 +33,7 @@ def find_order_products end def cart_params - params.require(:order).permit(:name, :email, :cc_num, :cc_cvv, :zip, expiry_date: {}) + params.require(:order).permit(:name, :email, :cc_num, :cc_cvv, :zip, :address, expiry_date: {}) end def previous_order diff --git a/app/models/order.rb b/app/models/order.rb index 83da8a8c53..948aa1cf9e 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -7,19 +7,15 @@ class Order < ApplicationRecord validates :name, presence: true, if: :ready_to_process? - validates :email, presence: true, if: :ready_to_process?, format: {with: /@/, message: "must include @"} + validates :email, presence: true, if: :ready_to_process?, format: { with: /@/, message: "must include @" } - validates :address, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+/, - message: "must start with digits" } + validates :address, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+/, message: "must start with digits" } - validates :cc_num, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{16}\z/, - message: "digits only" } + validates :cc_num, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{16}\z/, message: "16 digits only" } - validates :cc_cvv, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{3}\z/, - message: "digits only" } + validates :cc_cvv, presence: true, if: :ready_to_process?, format: { with: /\A[\d]{3}\z/, message: "3 digits only" } - validates :zip, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+\z/, - message: "digits only" } + validates :zip, presence: true, if: :ready_to_process?, format: { with: /\A[\d]+\z/, message: "digits only" } def ready_to_process? self.status == "in progress" @@ -34,7 +30,7 @@ def order_total end def find_revenue_paid_orders(merchant) - + end # reduce the total num of products available when user pays for an order diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index b79b93563e..ac3bed465d 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -2,25 +2,32 @@ <%= render partial: "layouts/error_messages", locals: { model: @current_order } %> -
      - <% @order_products.each do |i| %> + + + + + + + + -
      + <% @order_products.each do |i| %> - - <%= link_to i.product.name, product_path(i.product.id) %> - <%= "x #{i.quantity}" %> - +
      - <%= "Sub Total: #{number_to_currency(i.product.price * i.quantity)}" %> + + + + + - + <% end %> -

      Order Total: <%= number_to_currency current_order.order_total %>

      +
      ProductQuantitySubtotal
      <%= link_to i.product.name, product_path(i.product.id) %><%= "x #{i.quantity}" %><%= "#{number_to_currency(i.subtotal)}" %>
      -
      +

      Order Total: <%= number_to_currency current_order.order_total %>

      @@ -30,31 +37,31 @@ <%= form_for @current_order, url: cart_path do |f| %> - <%= f.label :name, "Name: " %> - <%= f.text_field :name, placeholder: "Dwayne Johnson" %> + <%= f.label :name, "Name: " %> + <%= f.text_field :name, placeholder: "Dwayne Johnson" %> - <%= f.label :email, "Email: " %> - <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> + <%= f.label :email, "Email: " %> + <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> - <%= f.label :address, "Address: " %> - <%= f.text_field :address, placeholder: "1234 Main Street Los Angeles, CA 90001" %> + <%= f.label :address, "Address: " %> + <%= f.text_field :address, placeholder: "1234 Main Street Los Angeles, CA 90001" %> - <%= f.label :cc_num, "Credit Card: " %> - <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> + <%= f.label :cc_num, "Credit Card: " %> + <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> - <%= f.label :cc_cvv, "CVV: " %> - <%= f.number_field :cc_cvv, placeholder: "XXX" %> + <%= f.label :cc_cvv, "CVV: " %> + <%= f.number_field :cc_cvv, placeholder: "XXX" %> - <%= f.label :expiry_date, "Expiration: " %> + <%= f.label :expiry_date, "Expiration: " %> - <%= f.date_select :expiry_date, {order: [:month, :year], prompt: { month: 'Select month', year: 'Select year' }, start_year: Date.today.year, end_year: Date.today.year + 10}, {required: true} %> + <%= f.date_select :expiry_date, {order: [:month, :year], prompt: { month: 'Select month', year: 'Select year' }, start_year: Date.today.year, end_year: Date.today.year + 10}, {required: true} %> - <%= f.label :zip, "Billing Zip: " %> - <%= f.number_field :zip, placeholder: "XXXXX" %> + <%= f.label :zip, "Billing Zip: " %> + <%= f.number_field :zip, placeholder: "XXXXX" %> - <%= f.submit "Place Order", class: 'button' %> + <%= f.submit "Place Order", class: 'button' %> - <%= link_to "Back to Cart", cart_path, class: "button" %> + <%= link_to "Back to Cart", cart_path, class: "button" %> <% end %>
      diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 08dc9f2343..42929588a9 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,35 +1,50 @@ <% if @order_products.any? %> - <% @order_products.each do |i| %> - - <%= form_for i do |f| %> - -
      - - - <%= link_to i.product.name, product_path(i.product.id) %> - - <% max = i.product.available %> - <%= f.hidden_field :product_id, value: i.product.id %> - <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> - - - <%= "Unit Price: #{number_to_currency(i.product.price)}" %> - - - - <%= "Sub Total: #{number_to_currency(i.subtotal)}" %> - - - <%= f.submit "Update", class: "button" %> - - <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> - -
      + + + + + + + + + + + + + + + <% @order_products.each do |i| %> + + <%= form_for i do |f| %> + + + + + + + + + <% end %> <% end %> +
      ProductsQuantityUnit PriceSubtotal:UpdateDelete
      + <%= link_to i.product.name, product_path(i.product.id) %> + + <% max = i.product.available %> + <%= f.hidden_field :product_id, value: i.product.id %> + <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + + <%= number_to_currency(i.product.price) %> + + <%= number_to_currency(i.subtotal) %> + + <%= f.submit "Update", class: "button" %> + + <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> +

      Order Total: <%= number_to_currency(current_order.order_total) %>

      From 23b76a7d7c6fe186230ed73f155a3776e30a58d6 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 11:44:49 -0700 Subject: [PATCH 220/236] No more cat photos on categories page --- app/views/categories/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/categories/show.html.erb b/app/views/categories/show.html.erb index bd04340f6f..cb3a97dcdd 100644 --- a/app/views/categories/show.html.erb +++ b/app/views/categories/show.html.erb @@ -4,7 +4,7 @@ <% @category.products.each do |p| %>
    • - +
      From 456e30923afb0260a773df22e2696033220886f7 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 11:46:15 -0700 Subject: [PATCH 221/236] category controller tests passing; minor change to category save redirect --- app/controllers/categories_controller.rb | 6 ++---- test/controllers/categories_controller_test.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/controllers/categories_controller.rb b/app/controllers/categories_controller.rb index f8b4f4ac86..0dfa186ba4 100644 --- a/app/controllers/categories_controller.rb +++ b/app/controllers/categories_controller.rb @@ -5,16 +5,14 @@ def index @products_by_category = Category.products_by_category end - def new - @category = Category.new(name: params[:name]) - end + def new; end def create @category = Category.new(name: params[:category][:name]) if @category.save flash[:success] = "Category added successfully" - redirect_to products_path + redirect_to merchant_path(id: @current_user.id) else flash.now[:failure] = "Validations Failed" render :new, status: :bad_request diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index cdeb253492..d57d338ee5 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -19,4 +19,21 @@ end end + describe "create" do + it "saves a valid category" do + category_data = {name: 'new category'} + merchant = Merchant.first + old_category_count = Category.count + + Category.new(category_data).must_be :valid? + login(merchant) + + post categories_path, params: {category: category_data} + + must_respond_with :redirect + must_redirect_to merchant_path(id: merchant.id) + Category.count.must_equal old_category_count + 1 + end + end + end From b914d112af320dd0508cf6cdb7ca9af79c993023 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 11:59:25 -0700 Subject: [PATCH 222/236] Ship order button changes status to shipped --- app/controllers/orders_controller.rb | 1 + app/views/orders/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 264473e683..b4948d0406 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,6 +4,7 @@ class OrdersController < ApplicationController def index @merchant = Merchant.find(session[:merchant_id]) + orders = [] OrderProduct.all.each do |order_product| product = Product.find(order_product.product_id) diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 0413228a79..8b9ba67b2d 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -19,7 +19,7 @@ <% @orders.each do |order| %> - <%= link_to Product.find(order.id).name, product_path(Product.find(order.id)) %> + <%= link_to Product.find(order.order.id).name, product_path(Product.find(order.id)) %> <%= order.quantity %> <%= number_to_currency(order.subtotal) %> <%= order.order.status %> From 3669b3b9e9ec505f4ef1448448fa9f2abf859a13 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 12:04:47 -0700 Subject: [PATCH 223/236] fix product name on merchant order summary --- app/views/orders/index.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index 8b9ba67b2d..f64643041e 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -19,7 +19,7 @@ <% @orders.each do |order| %> - <%= link_to Product.find(order.order.id).name, product_path(Product.find(order.id)) %> + <%= link_to Product.find(order.product_id).name, product_path(Product.find(order.id)) %> <%= order.quantity %> <%= number_to_currency(order.subtotal) %> <%= order.order.status %> From ae07b4151cf219c52c40de2e3e393d780ee2b621 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 12:12:25 -0700 Subject: [PATCH 224/236] controller testing --- test/controllers/categories_controller_test.rb | 6 ++++++ test/controllers/orders_controller_test.rb | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/test/controllers/categories_controller_test.rb b/test/controllers/categories_controller_test.rb index cdeb253492..5d0fd74b7c 100644 --- a/test/controllers/categories_controller_test.rb +++ b/test/controllers/categories_controller_test.rb @@ -19,4 +19,10 @@ end end + describe "create" do + it "creates new category with valid data" do + + end + end + end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb index 2491ec73e0..eb3408d086 100644 --- a/test/controllers/orders_controller_test.rb +++ b/test/controllers/orders_controller_test.rb @@ -6,11 +6,14 @@ it "succeeds if order exists" do get order_path(Order.first) - must_respond_with :success + must_respond_with :found end it "sends not_found if order doesn't exit" do - order_id = Order.last.id + 1 + merchant = Merchant.first + login(merchant) + order_id = Order.last.id + 5 + get order_path(order_id) must_respond_with :not_found @@ -78,4 +81,15 @@ end + describe "index" do + it "finds merchants orders" do + merchant = Merchant.first + login(merchant) + order_id = Order.last + + get merchant_orders_path(merchant) + must_respond_with :success + end + end + end From 4e4d577ebf31ad2eeb94cd4dbd92abd942281f9c Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 12:14:12 -0700 Subject: [PATCH 225/236] Styled order pages --- app/assets/stylesheets/application.css | 10 +-- app/assets/stylesheets/orders.scss | 4 + app/views/carts/confirmation.html.erb | 119 +++++++++++++++++-------- app/views/carts/edit.html.erb | 75 ++++++++-------- app/views/carts/show.html.erb | 94 +++++++++---------- 5 files changed, 173 insertions(+), 129 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 5ad5636ba8..0e9811ae30 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -192,17 +192,11 @@ i { font-size: 1.25em; }*/ -.checkout-items { - display:grid; - grid-template-columns: repeat(4, 250px); +.prod_table { + padding: 2em 4em; font-size: 1.25em; } -.checkout { - display:grid; - grid-template-columns: repeat(2, 1fr); -} - input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 828637ad2c..028605f55e 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -5,3 +5,7 @@ .order-summary { padding: 2em 4em; } + +.small-summary { + width: auto; +} diff --git a/app/views/carts/confirmation.html.erb b/app/views/carts/confirmation.html.erb index bd9a9af1e0..72d7b4c359 100644 --- a/app/views/carts/confirmation.html.erb +++ b/app/views/carts/confirmation.html.erb @@ -1,59 +1,100 @@ -

      - <%= "Confirmation for order #{@previous_order.id}" %> -

      +
      -
      +

      + <%= "Confirmation for order #{@previous_order.id}" %> +

      -

      Summary

      -
        -
      • Placed: <%= date_placed(@previous_order) %>
      • -
      • Status: <%= @previous_order.status.titleize %>
      • -
      + + + + + + + + - + <% @previous_order.order_products.each do |i| %> -
      +
      -

      Contact

      -
        -
      • Name: <%= @previous_order.name %>
      • -
      • Email: <%= @previous_order.email %>
      • -
      • Address: <%= @previous_order.address %>
      • -
      + + + + + - + -
      + <% end %> -

      Billing

      -
        -
      • Credit Card: <%= last_four(@previous_order) %>
      • -
      • Expiration: <%= @previous_order.expiry_date %>
      • -
      • CCV Number: <%= @previous_order.cc_cvv %>
      • -
      • Billing Zip: <%= @previous_order.zip %>
      • -
      +
      ProductQuantitySubtotal
      <%= link_to i.product.name, product_path(i.product.id) %><%= "x #{i.quantity}" %><%= "#{number_to_currency(i.subtotal)}" %>
      -
      +

      Order Total: <%= number_to_currency(@previous_order.order_total) %>

      -

      Products

      +

      Summary

      + + + + + + + + + + + +
      Placed: <%= date_placed(@previous_order) %>
      Status: <%= @previous_order.status.titleize %>
      - <% @previous_order.order_products.each do |i| %> - -
      +
      - - <%= link_to i.product.name, product_path(i.product.id) %> - <%= "x #{i.quantity}" %> - +
      - <%= "Sub Total: #{number_to_currency(i.subtotal)}" %> +

      Contact

      + + + + + + + + + + + + + + + +
      Name: <%= @previous_order.name %>
      Email: <%= @previous_order.email %>
      Address: <%= @previous_order.address %>
      -
      + - <% end %> +
      -

      Order Total: <%= number_to_currency(@previous_order.total) %>

      +

      Billing

      + + + + + + + + + + + + + + + + + + + + +
      Credit Cart: <%= last_four(@previous_order) %>
      Expiration: <%= @previous_order.expiry_date %>
      CCV Number: <%= @previous_order.cc_cvv %>
      Billing Zip: <%= @previous_order.zip %>
      +
      diff --git a/app/views/carts/edit.html.erb b/app/views/carts/edit.html.erb index ac3bed465d..79cb9fecb7 100644 --- a/app/views/carts/edit.html.erb +++ b/app/views/carts/edit.html.erb @@ -1,33 +1,34 @@ -

      <%= "Checkout for order #{@current_order.id}" %>

      +
      +

      <%= "Checkout for order #{@current_order.id}" %>

      -<%= render partial: "layouts/error_messages", locals: { model: @current_order } %> + <%= render partial: "layouts/error_messages", locals: { model: @current_order } %> - - - - - - - - +
      ProductQuantitySubtotal
      + + + + + + + - <% @order_products.each do |i| %> + <% @order_products.each do |i| %> - + - - - - - + + + + + - + - <% end %> - -
      ProductQuantitySubtotal
      <%= link_to i.product.name, product_path(i.product.id) %><%= "x #{i.quantity}" %><%= "#{number_to_currency(i.subtotal)}" %>
      <%= link_to i.product.name, product_path(i.product.id) %><%= "x #{i.quantity}" %><%= "#{number_to_currency(i.subtotal)}" %>
      + <% end %> +

      Order Total: <%= number_to_currency current_order.order_total %>

      +
      @@ -37,31 +38,31 @@ <%= form_for @current_order, url: cart_path do |f| %> - <%= f.label :name, "Name: " %> - <%= f.text_field :name, placeholder: "Dwayne Johnson" %> + <%= f.label :name, "Name: " %> + <%= f.text_field :name, placeholder: "Dwayne Johnson" %> - <%= f.label :email, "Email: " %> - <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> + <%= f.label :email, "Email: " %> + <%= f.email_field :email, placeholder: "dwayne.johnson@sweatsy.com" %> - <%= f.label :address, "Address: " %> - <%= f.text_field :address, placeholder: "1234 Main Street Los Angeles, CA 90001" %> + <%= f.label :address, "Address: " %> + <%= f.text_field :address, placeholder: "1234 Main Street Los Angeles, CA 90001" %> - <%= f.label :cc_num, "Credit Card: " %> - <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> + <%= f.label :cc_num, "Credit Card: " %> + <%= f.number_field :cc_num, placeholder: "XXXXXXXXXXXX" %> - <%= f.label :cc_cvv, "CVV: " %> - <%= f.number_field :cc_cvv, placeholder: "XXX" %> + <%= f.label :cc_cvv, "CVV: " %> + <%= f.number_field :cc_cvv, placeholder: "XXX" %> - <%= f.label :expiry_date, "Expiration: " %> + <%= f.label :expiry_date, "Expiration: " %> - <%= f.date_select :expiry_date, {order: [:month, :year], prompt: { month: 'Select month', year: 'Select year' }, start_year: Date.today.year, end_year: Date.today.year + 10}, {required: true} %> + <%= f.date_select :expiry_date, {order: [:month, :year], prompt: { month: 'Select month', year: 'Select year' }, start_year: Date.today.year, end_year: Date.today.year + 10}, {required: true} %> - <%= f.label :zip, "Billing Zip: " %> - <%= f.number_field :zip, placeholder: "XXXXX" %> + <%= f.label :zip, "Billing Zip: " %> + <%= f.number_field :zip, placeholder: "XXXXX" %> - <%= f.submit "Place Order", class: 'button' %> + <%= f.submit "Place Order", class: 'button' %> - <%= link_to "Back to Cart", cart_path, class: "button" %> + <%= link_to "Back to Cart", cart_path, class: "button" %> <% end %>
      diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 42929588a9..7e9f319c08 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,50 +1,52 @@ <% if @order_products.any? %> - - - - - - - - - - - - - - - <% @order_products.each do |i| %> - - <%= form_for i do |f| %> - - - - - - - - - +
      +

      <%= "Cart for order #{@current_order.id}"

      +
      ProductsQuantityUnit PriceSubtotal:UpdateDelete
      - <%= link_to i.product.name, product_path(i.product.id) %> - - <% max = i.product.available %> - <%= f.hidden_field :product_id, value: i.product.id %> - <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> - - <%= number_to_currency(i.product.price) %> - - <%= number_to_currency(i.subtotal) %> - - <%= f.submit "Update", class: "button" %> - - <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> -
      + + + + + + + + + + + + + + <% @order_products.each do |i| %> + + <%= form_for i do |f| %> + + + + + + + + + <% end %> - <% end %> -
      ProductsQuantityUnit PriceSubtotal:UpdateDelete
      + <%= link_to i.product.name, product_path(i.product.id) %> + + <% max = i.product.available %> + <%= f.hidden_field :product_id, value: i.product.id %> + <%= f.number_field :quantity, value: i.quantity, min: 1, max: max, class: "quantity" %> + + <%= number_to_currency(i.product.price) %> + + <%= number_to_currency(i.subtotal) %> + + <%= f.submit "Update", class: "button" %> + + <%= link_to "Delete", order_product_path(i), :data => {:confirm => "You sure you want to remove #{i.product.name} from your cart?", :method => "delete"}, class: "button" %> +
      + <% end %> +

      Order Total: <%= number_to_currency(current_order.order_total) %>

      @@ -52,7 +54,9 @@ <%= link_to "Contine Shopping", products_path, class: "button" %> -<% else %> -

      Your shopping cart is empty.

      + <% else %> +

      Your shopping cart is empty.

      + + <% end %> -<% end %> + From 9cd6e486af42adae481bcf8d7e55273ad14bd245 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 12:22:14 -0700 Subject: [PATCH 226/236] order revenues working --- app/controllers/orders_controller.rb | 10 +++++++--- app/views/orders/index.html.erb | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index b4948d0406..33ab54bdac 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -4,7 +4,7 @@ class OrdersController < ApplicationController def index @merchant = Merchant.find(session[:merchant_id]) - + orders = [] OrderProduct.all.each do |order_product| product = Product.find(order_product.product_id) @@ -22,11 +22,15 @@ def index @products = products unshipped_orders = [] - shipped_orders = [] @orders.each do |order_product| if order_product.order.status == 'paid' unshipped_orders << order_product.product.price - elsif order_product.order.status == 'shipped' + end + end + + shipped_orders = [] + @orders.each do |order_product| + if order_product.order.status == 'shipped' shipped_orders << order_product.product.price end end diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb index f64643041e..d9f7194f96 100644 --- a/app/views/orders/index.html.erb +++ b/app/views/orders/index.html.erb @@ -19,7 +19,7 @@ <% @orders.each do |order| %> - <%= link_to Product.find(order.product_id).name, product_path(Product.find(order.id)) %> + <%= link_to Product.find(order.product_id).name, product_path(Product.find(order.product_id)) %> <%= order.quantity %> <%= number_to_currency(order.subtotal) %> <%= order.order.status %> From 40b9cde6bb37f5a916249d51bcc56519864e8180 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 12:24:32 -0700 Subject: [PATCH 227/236] Finished styling cart --- app/assets/stylesheets/orders.scss | 4 ++++ app/views/carts/confirmation.html.erb | 2 +- app/views/carts/show.html.erb | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/orders.scss b/app/assets/stylesheets/orders.scss index 028605f55e..9b6c6cd422 100644 --- a/app/assets/stylesheets/orders.scss +++ b/app/assets/stylesheets/orders.scss @@ -9,3 +9,7 @@ .small-summary { width: auto; } + +.confirm-info { + margin-top: 3em; +} diff --git a/app/views/carts/confirmation.html.erb b/app/views/carts/confirmation.html.erb index 72d7b4c359..06d5481dc5 100644 --- a/app/views/carts/confirmation.html.erb +++ b/app/views/carts/confirmation.html.erb @@ -31,7 +31,7 @@

      Order Total: <%= number_to_currency(@previous_order.order_total) %>

      -
      +

      Summary

      diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 7e9f319c08..7e314418e7 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,7 +1,7 @@ <% if @order_products.any? %>
      -

      <%= "Cart for order #{@current_order.id}"

      +

      <%= "Cart for order #{@current_order.id}" %>

      From ea68ccc59e311b4a0ece410c0c446aa587c3b78a Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 12:27:42 -0700 Subject: [PATCH 228/236] Styled alert/success boxes --- app/assets/stylesheets/_settings.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 7d3eadad83..b751de052d 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -71,9 +71,9 @@ $global-lineheight: 1.5; $foundation-palette: ( primary: #C36891, secondary: #66fcf1, - success: #74b9e8, + success: #f384aa, warning: #f384aa, - alert: #ffffff, + alert: #f384aa, ); $light-gray: #e6e6e6; $medium-gray: #cacaca; From aa68deb2c1cff3c601d1d882e912286118da3bfe Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 12:34:13 -0700 Subject: [PATCH 229/236] cannot ship unpaid orders; changed redirect to dash --- app/controllers/orders_controller.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index 33ab54bdac..8f19e16685 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -42,7 +42,15 @@ def index end def ship_order - @order.ship_order + if @order.status == "paid" + @order.ship_order + flash[:success] = "Order Shipped!" + redirect_to merchant_orders_path(merchant_id: @current_user.id) + else + flash[:error] = "Cannot ship an unpaid order" + redirect_to merchant_orders_path(merchant_id: @current_user.id) + + end end def show; end From 33a1cddbacc78bb65aff640e19d6cea851021093 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 12:36:39 -0700 Subject: [PATCH 230/236] Add photos to categories on homepage --- app/views/products/root.html.erb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index 9a63d7a2fa..bf41e964e1 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -49,7 +49,7 @@
      <%= link_to 'Shirts', categories_path %>
      - placeholder photo + placeholder photo
      @@ -58,7 +58,7 @@
      <%= link_to 'Shoes', categories_path %>
      - placeholder photo + placeholder photo
      @@ -67,16 +67,16 @@
      <%= link_to 'Accessories', categories_path %>
      - placeholder photo + placeholder photo
    • -
      <%= link_to 'Legwarmers', categories_path %>
      +
      <%= link_to 'Tights', categories_path %>
      - placeholder photo + placeholder photo
    • From f77b1347ad22dbe23b6fe21dfd5c320c26565f15 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 12:46:44 -0700 Subject: [PATCH 231/236] Add styling to homepage --- app/assets/stylesheets/application.css | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 5ad5636ba8..a235d45e2d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -34,6 +34,7 @@ body { h2, h3, h4, h5 { font-family: 'Shadows Into Light', cursive; + font-weight: bold; } /*Navbar styling*/ @@ -77,21 +78,21 @@ form { color: #fff; font-weight: bold; font-size: 2.75em; - text-shadow: 0px 4px 3px rgba(0,0,0,0.8), - 0px 8px 13px rgba(0,0,0,0.4), - 0px 18px 23px rgba(0,0,0,0.4); + text-shadow: 0px 4px 3px rgba(64,224,208,0.4), + 0px 8px 13px rgba(64,224,208,0.4), + 0px 18px 23px rgba(64,224,208,0.4); } .home-header { text-align: center; padding: 1em; - font-weight: 400; } hr { width: 20%; padding: 0; - border-color: #000; + margin-top: 0; + border: 1px solid rgb(64,224,208); } .homepage p { @@ -213,7 +214,7 @@ input[type=number]::-webkit-outer-spin-button { /** FOOTER **/ .site-footer { - background: #2c3840; + background: linear-gradient(to top, rgba(180,195,203,0.2), rgba(64,224,208,0.8)); color: #8aa0ae; padding: 2rem; } From a54fd46c87e81c04511c284c782167ce5fdd2c99 Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 13:04:38 -0700 Subject: [PATCH 232/236] Change top products to 3 products --- app/views/products/root.html.erb | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/views/products/root.html.erb b/app/views/products/root.html.erb index bf41e964e1..e4aa29ffe9 100644 --- a/app/views/products/root.html.erb +++ b/app/views/products/root.html.erb @@ -23,16 +23,34 @@

      Browse Top Products


        - <% @products.each do |product|%>
      • -
        <%=link_to product.name, product_path(product) %>
        +
        Red Leotard
        - alt='placeholder photo' /> + placeholder photo
      • - <% end %> + +
      • +
        +
        Jazz Legs
        +
        +
        + placeholder photo +
        +
      • + + +
      • +
        +
        Dry-Fit Shirt
        +
        +
        + placeholder photo +
        +
      • +
      <%= link_to "See More", products_path, class:'button' %> From b929a647de9d1c60d6dc3df04df2cb68941f6260 Mon Sep 17 00:00:00 2001 From: Kiera Date: Fri, 27 Apr 2018 13:09:06 -0700 Subject: [PATCH 233/236] update ig link --- 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 b5d7c19c9b..fd6f1d4c43 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -88,7 +88,7 @@
      - +
      instagram photo From 07a3d9180b0627060fb5996edb16fb3eb5c8c629 Mon Sep 17 00:00:00 2001 From: Brandy Austin Date: Fri, 27 Apr 2018 13:24:11 -0700 Subject: [PATCH 234/236] Updated development --- app/views/carts/show.html.erb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/carts/show.html.erb b/app/views/carts/show.html.erb index 7e314418e7..ebdaa31151 100644 --- a/app/views/carts/show.html.erb +++ b/app/views/carts/show.html.erb @@ -1,6 +1,7 @@ +
      + <% if @order_products.any? %> -

      <%= "Cart for order #{@current_order.id}" %>

      @@ -55,7 +56,7 @@ <%= link_to "Contine Shopping", products_path, class: "button" %> <% else %> -

      Your shopping cart is empty.

      +

      Your shopping cart is empty.

      <% end %> From e10f71f92d460a1410d5cc94799399fbfe307d12 Mon Sep 17 00:00:00 2001 From: Maja Graonic Date: Fri, 27 Apr 2018 13:30:54 -0700 Subject: [PATCH 235/236] fixed categories tiles --- app/views/categories/index.html.erb | 9 +++++---- app/views/products/index.html.erb | 1 - db/seed_data/products2.csv | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/views/categories/index.html.erb b/app/views/categories/index.html.erb index 05fa9c07ba..95e7b265c1 100644 --- a/app/views/categories/index.html.erb +++ b/app/views/categories/index.html.erb @@ -1,15 +1,16 @@

      All products by category

      +
      <% @products_by_category.each do | c, prods | %>

      <%= link_to c.name.capitalize, category_path(c) %>

      -
      -
        +
        +
          <% prods.each do |p| %>
        • - product photo + product photo
          @@ -28,6 +29,6 @@ <% end %>
        - +
      <% end %> diff --git a/app/views/products/index.html.erb b/app/views/products/index.html.erb index 35ee6649e5..9aef3d9473 100644 --- a/app/views/products/index.html.erb +++ b/app/views/products/index.html.erb @@ -20,7 +20,6 @@ <% @products.each do |product| %>
      • -
        placeholder photo
        diff --git a/db/seed_data/products2.csv b/db/seed_data/products2.csv index 94bac4720a..d492592adf 100644 --- a/db/seed_data/products2.csv +++ b/db/seed_data/products2.csv @@ -8,7 +8,6 @@ Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://d3eum8l Purple Leotard,100,20,Move around easier,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2pcWWgkfWtT9sCk7uJLoiSJXxVNZFZ-BUUGfSkIl75eHj0IFKfA,2 Red Leotard,200,20,Let it shine,https://img.etsystatic.com/il/ba4e45/1088013044/il_570xN.1088013044_iqj2.jpg?version=1,2 Black Tights,90,10,Release the sweat,https://rlv.zcache.co.uk/black_and_white_80s_style_leggings-rfc5f404502bc4d8e96e0024d6923df38_6ftq3_260.jpg?rlvnet=1,1 -Track Jacket,2700,20,Run faster sweat less, https://www.etsy.com/listing/586314321/vtg-80s-crinkle-nylon-track-jacket-bold?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=80s%20track%20jacket&ref=sr_gallery-1-1,1 Spandex,5000,20,Run faster sweat less, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjePGQzichk23U5SuvA3lfx6bs5Kk1gDIPd0uf_vNRmtrMUnjFvA,1 Neon Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTja6mFBrA_bETAZxt7VFuhLQJ6cxblasq5UZikxycFH6hdI3vp,3 Green Spandex,5000,20,Run faster sweat less, https://images-na.ssl-images-amazon.com/images/I/41oVO%2BPcNuL.jpg,1 From a9cc7683434d86b9b7e9e4395688e138a1337e3f Mon Sep 17 00:00:00 2001 From: Samantha Berk Date: Fri, 27 Apr 2018 14:01:57 -0700 Subject: [PATCH 236/236] fixed categories alignment --- db/seed_data/products2.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/db/seed_data/products2.csv b/db/seed_data/products2.csv index d492592adf..7a8ef418db 100644 --- a/db/seed_data/products2.csv +++ b/db/seed_data/products2.csv @@ -8,6 +8,7 @@ Sweaty Accessory,225,20, reduces sweat from everywhere you put it,http://d3eum8l Purple Leotard,100,20,Move around easier,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcR2pcWWgkfWtT9sCk7uJLoiSJXxVNZFZ-BUUGfSkIl75eHj0IFKfA,2 Red Leotard,200,20,Let it shine,https://img.etsystatic.com/il/ba4e45/1088013044/il_570xN.1088013044_iqj2.jpg?version=1,2 Black Tights,90,10,Release the sweat,https://rlv.zcache.co.uk/black_and_white_80s_style_leggings-rfc5f404502bc4d8e96e0024d6923df38_6ftq3_260.jpg?rlvnet=1,1 +Track Jacket,2700,20,Run faster sweat less,http://picture-cdn.wheretoget.it/yu7qzh-l.jpg,1 Spandex,5000,20,Run faster sweat less, https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRjePGQzichk23U5SuvA3lfx6bs5Kk1gDIPd0uf_vNRmtrMUnjFvA,1 Neon Head Band,699,20,No more sweat on your brows,https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTja6mFBrA_bETAZxt7VFuhLQJ6cxblasq5UZikxycFH6hdI3vp,3 Green Spandex,5000,20,Run faster sweat less, https://images-na.ssl-images-amazon.com/images/I/41oVO%2BPcNuL.jpg,1